因为九心同窗以前一直担任独立开发的职位,因此对于协做开发这块儿的技能有所欠缺,对Git命令的使用还停留在独立开发上,日常用的最多的三个命令也就:git
git clone
git commit
git push origin master
这不,在进入新的公司之后,狂补了一波Git命令,今天咱们就来聊一聊工做中的经常使用的Git命令。 web
在阅读下文以前,推荐一个练习Git命令的网站(强力推荐):c#
以及一些学习网站:分布式
《Git文档》 《廖雪峰的Git教程》post
对于这个问题,咱们能够看一下官方文档:学习
Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency. Git是一个免费和开源的分布式版本控制系统,致力于高效和快速的处理任何小或者大的项目。flex
了解Git中的工做区和版本库很重要:动画
.git
,这即是咱们所说的版本库,其中,版本库又分为暂存区和分支。
git add
命令将文件从工做目录提交到暂存区,
git commit
命令将文件从暂存区提交到git仓库。
若是咱们想看一下工做区和暂存区文件的状态,可使用命令 git status
,好比我最近学习的Flutter项目:网站
wangjiedeMacBook-Pro:flu_pro wangjie$ git status
warning: unable to access '/Users/wangjie/.config/git/attributes': Permission denied On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: lib/main.dart Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: lib/HelloWorld.dart Untracked files: (use "git add <file>..." to include in what will be committed) .metadata //... 省略 复制代码
其中:
Changes to be committed
:暂存区的文件。
Changes not staged for commit
:工做区的文件,还未保存到暂存区。
Untracked files
:指那些第一次建立,尚未加入版本更新的文件。
在 Android Studio(下称AS)中,更加方便: 里面有不少颜色:
白色
:已commit,可是没有发生变化的文件。
蓝色
:commit以后发生了变化
原谅绿
:暂存区的文件。
黄色
:不须要进行版本控制的文件。
分支是多人协做开发中必不可少的角色,由于在咱们的开发过程当中,至少会有两个分支:
除了这些分支,还可能有修复Bug的分支等。
具体命令: 添加所有文件
git add .
复制代码
若是是添加某个文件
git add <文件路径>
复制代码
命令解释: 将工做区的文件添加进暂存区。
IDEA或AS: 在IDEA或者AS中,在你进行Git初始化以后,当你添加新的文件时,会有这样的提示: 也能够这样,右击文件 > 选择「Git」> 选择「Add」和「Add to .gitignore」,分别对应着添加到暂存区和配置忽略文件:
加入到暂存区意味着该文件加入到版本控制中。配置到忽略文件则意味着不会加入到版本控制。
这种状况可能会常常出现,你修改了某个文件的不少处代码,可是却不想挨个删除,如上代码就起做用了。
命令解释 撤销工做区的代码修改。
具体命令
git checkout -- file
复制代码
注意必定要加上--
,否则就会变成切换分支(下面会讲)。
IDEA或者AS AS能够很方便的查看某个文件修改了哪些代码。步骤是:选择下方「Version Control」> 选择具体的文件 > 点击 diff 有哪些差异一目了然,而且你能够点击对应的按钮撤销更改的代码
一不当心把
git diff
要进行的操做给讲了...
另一种状况是改完代码之后,若是使用了 git add
,将代码提交到了暂存区,以前的命令就无论用了。
命令解释 撤销暂存区的代码修改。
具体命令
git reset HEAD file
复制代码
这个命令在AS或者IDEA下使用的场景很少
命令解释 将暂存区的文件添加进版本库
具体命令
git commit -m <提交描述信息>
复制代码
动画模型 输入git commit以后,沙盒模型中发生了什么?其实就是生成了一个新的版本记录:
IDEA或者AS 我通常针对对应的需求,新建一个Change List,具体过程以下是:
选中「Version Control」 > 选择某个 Change List > 右击弹出选择框 > 选择「New Changelist」 如需 commit,选择上图「Commit」,输入 Commit Message 便可
常见场景是你使用了 git commit
提交了代码,可是还没提交到远程分支,随后你很快发现了此次提交会带来重大问题,因而你想撤销此次提交。
命令解释 在没有上传到远程分支时,进行版本库的撤销。
具体命令
git reset HEAD~1
复制代码
HEAD
表明当前的头结点,HEAD~1
表明当前节点的前一个节点,后面解释。
动画模型
IDEA或者AS 在 AS 中,先打开到版本提交历史 好比我想回退到
first commit
的那个版本 > 选中右击 > 选择【Reset Current Branch to Here...】,以后弹出一个弹出框 四个选项的区别:
git diff
查到文件发生了哪些变化),暂存区的提交记录也会被保留。
人又不是机器,忘记本身改了哪些东西也是常有的事儿。
命令介绍 比较当前工做区和上一个版本的差别
在不输入文件路径的状况下,默认比较的是当前工做区和上一个版本的区别,而且命令行会告诉你什么类的变化是什么样的。内容我就不罗列了。
IDEA或者AS 已介绍,再也不赘述~
具体命令
git branch
复制代码
命令介绍 查看本地分支
命令结果
IDEA或者AS 点击右下角红色部分便可展现本地分支和远程分支,而且能够切换分支。
命令介绍 建立一个分支。
具体命令
git branch <name>
复制代码
必须加上分支名。
动画效果
IDEA或者AS 跟分支查看的按钮在同一处,点击「New Branch」完成。
命令介绍 切换分支
具体命令
git checkout <name> git checkout -b <name> 复制代码
第一个命令是切换分支,第二个命令是建立并切换分支,git checkout
也能够用来撤回工做区的修改,你们注意区分。
动画效果 图片中不只仅是切换分支,切换完之后,还进行了一次提交,至此,两个分支就不在同一个版本了。
IDEA或者AS 同查看分支同样 若是想查看当前各个分支所对应的版本,点击「Version Control」> 再点击「log」。
下一个版本的代码迭代完毕,准备上线,这时你就能够合并分支。
命令介绍 合并分支。
具体命令
git merge <name>
复制代码
动画效果 能够看到,在
C2
和 C3
的版本下面,合并生成了一个新的版本 C4
,master
分支直接指向了 C4
。
除了 git merge
外,还有一个合并分支的命令,咱们看看这二者有什么区别。
具体命令
git rebase <分支名>
复制代码
动画效果 能够看到,当前分支
bugFix
指向的版本 C3
失踪了,而在 master
分支下面生成了一个 C3'
,虽然看不出 C3'
是由原来的 C2
和 C3
合并的,但新的提交记录更加线性和简洁。
从 git merge
和 git rebase
两种动画效果能够得出:
Merge
:保留以前的提交顺序。
Rebase
:获得的提交历史更加线性,看着更加简洁。大部分团队的选择。
IDEA或者AS 选中右下角「git:分支名」> 选中具体分支 > 选择Rebase或者Merge
团队协做时每次要上传代码以前记得拉取最新代码。
命令介绍 拉取最新代码
具体命令
git pull <origin> <local分支名>
复制代码
这里的 origin
是咱们远程分支的别名,是能够本身定义的,一般咱们使用 git remote add <origin> <远程仓库地址>
来添加。
动画效果 能够看到,远程的代码被拉下来之后,若是你的代码已经提交过,它会先
merge
代码,以后再将当前分支切换到最新的版本。
IDEA或者AS 这是 「VCS」>「Git」>「Remotes」下远程仓库的记录: 你能够选择左下角的添加按钮手动添加。
下拉代码就更加简单了,点击右上角的按钮,第一次下拉的时候会生成一个弹窗 左边的
Update Type
就很少介绍,右边的 Clean working tree before update
有两个选项,第二个并非 Git 中的,而且 IDEA 也说了之后会去除,咱们就无需了解了,选择 Using Stash
就对了。
Using Stash
对应着 Git 命令中的 git stash
,由于合并两个分支前须要提交改动的代码,但咱们当前的开发尚未完毕,不想平白无故的进行一次提交从而脏了咱们的提交记录,这时就可使用git stash
,它会先将工做区的代码暂存好,以后清空工做区的代码,合并远程分支的代码,最后再将工做区的代码恢复。
处理冲突 但凡是协做开发,在工做合理分配的状况下偶尔也会出现冲突,选用《关于Android Studio使用Git的总结》中的图片,当出现冲突时,会出现以下弹框 除非明确的知道使用谁的代码,通常咱们会点「Merge...」,以后会出现另一个弹框
从图中能够很清晰的看出,弹框分为左中有三块:
若是想选择左边的代码,点击左边「>>」按钮,不想选择点「x」按钮,肯定好代码之后点击右下角的「Apply」按钮。
除了下载最新的代码,咱们还须要将本身改动的代码上传。
命令介绍 上传最新的代码。
具体命令
git push <origin> <本地分支名>
复制代码
动画效果 左边是本地分支,右边是远程分支。
IDEA或者AS 正常咱们在 commit 代码的时候,能够选择 Commit and Push
,也就是提交代码的时候附带 Push
。 若是你不想在
Commit
的时候进行 Push
,也能够选择在菜单栏中的「VCS」选择单独 Push
。
在上面的推送命令中,默认了远程仓库的分支和当前的分支名一致,好比 git push origin master
,本地分支名和远程分支的名称都为 master
,那若是不一致呢?
具体命令
git push <origin> <本地分支:远程分支>
复制代码
更新的命令也是如此
git push <origin> <远程分支:本地分支>
复制代码
直接看可能有点抽象,咱们直接看图。
动画效果 此次试用了相对引用,即
foo^
指向 foo
分支指向的版本的上一个版本,因此远程仓库 master
分支也只更新到了 foo
分支指向版本的上一个版本。
使用 Hash 值指定版本并不老是很方便,好比你想将版本 revert
到上个版本,你得先查一下版本的 Hash 值,以后再去使用这个 Hash 值去 revert
,显然这样的方式并不优雅。
命令介绍 指定当前版本的上一个版本。
具体命令
HEAD^ 分支^ Hash值^ 复制代码
这里使用 HEAD
、分支和 Hash
值均可以,只要能肯定版本库便可。
好比上一个版本的代码代码出现 bug 了,我想在 master
分支上一个版本的基础上对代码进行修改,我能够输入 git checkout -b bugfix master^
。
动画效果 这是一个分离
HEAD
的命令,将 HEAD
分离到当前 master
分支指向版本的上一个版本。
命令介绍 回退到指定版本的前N个版本。
具体命令
HEAD~2 分支~n Hash值~n 复制代码
其余和上一个命令类似,再也不赘述。
你刚提交了一笔代码,忽然发现了一个错误,这时你确定不想为此再建立一个提交。
命令介绍 更新上次 commit 的代码,避免再次生成一个 commit 记录。
具体命令
git commit --amend
复制代码
动画效果 能够从动图中看到,原先的版本库
C2
消失了,取而代之的是 C2'
,它们两个实际上是一个版本,对应的 id 是同一个。
IDEA或者AS 选中「Amend commit」,至于「Sign-off commit」,日常基本用不着。
以上的命令已经能够胜任平时的开发,而对于一些复杂的命令,使用的时候再查。若是你有一些常用的命令,也欢迎在评论区补充。
进入新公司已经一个月了,终于恢复到了本身的节奏,之后就能够正常输出文章啦。
我是九心,新晋互联网码农,若是想要进阶和了解更多的干货,欢迎关注个人公众号接收到的个人最新文章。
引用文章: