git clone url

从远端拉取仓库

git add file

添加某个文件

git commit -m ‘name’

进行一次提交

git push

将本地的提交上传到远端

git pull

拉取远端的提交到本地,本地当前的分支会更新

git fetch

将所有远端分支的提交拉取到本地(远端分支是指origin/分支名这种,可以通过git branch -a查看到)

git log

查看当前本地分支的提交记录(其中commit后面的长串哈希值在一些命令中会用到)

git checkout name

切换到name分支

git checkout -b name

切换到name分支,不存在的时候会新建该分支(常用于新建新的分支)

git merge name

将name分支的提交合并到本地当前分支


以上是基础的一些常用命令,使用的时候基本上可以应付大部分场景。在添加文件、提交修改的时候,推荐实用ide,可以方便查看文件修改的内容(虽然git diff也可以,但是相对比较麻烦),每次提交前进行code review是好习惯。还有就是在切换分支准备进行开发新功能前,建议先git pull拉取最新的提交。


接下来,可能在上述使用过程中,会遇到一些不可预测的问题:

情况:git rebase name

可能原因:git merge采用的是合并两个分支,然后在当前分支A顶端创建一个合并的节点。git rebase与其不同的合并方式,会找到两个分支的最近公共节点P,然后把当前分支A这个节点P以上的所有提交节点都依次打到另一个分支B上,然后当前分支A指向最后生成的分支上。(注意此处分支B没有改变)(插图后续补上)

Tip:git rebase –abort退出当前rebase过程。

冲突解决方法:在rebase依次打节点的过程中可能会遇到冲突,需要先解决冲突文件,然后git add这个文件。解决完所有冲突,运行git rebase –continue。可能一次rebase会有多次冲突。

情况:git pull的时候冲突。

可能原因:其他人在该分支上进行了提交,我们也在本地的分支上进行了提交;本地分支不是最新的,但是我们进行了提交(总结起来,就是本地分支和远端分支走远了)

解决方式一:因为git pull在这种情况下默认会按merge处理远端和本地分支,但是本地有文件可能会在merge过程过冲突或者被修改,所以可能会报错。这里先实用git stash暂存本地所有未提交文件,然后实用git pull -r,这样会采用rebase处理远端和本地分支的合并,解决冲突方法和rebase一致。最后合并完成,使用git stash apply或者git stash pop,不同处是stash list里面后者会删除这次的stash。

精简步骤:git stash; git pull -r; git stash apply;

解决方式二:因为一般情况单一功能应该一个人在一个分支上完成,所以这里应该从分支A切出一个新的分支git checkout -b 分支B,然后用新的分支B去merge或者rebase远端的分支。然后把本地异常的分支A删除,git branch -D 分支A。

精简步骤:git checkout -b 分支B; git merge orgin/分支A; git branch -D 分支A

情况:git merge/rebase的时候,发现想要合并的本地分支并不是最新的,但是本地有未提交的文件,不能够切换分支。

可能原因:在开发过程中,需要使用一些其他分支上的功能,但是并没有及时更新过本地的该分支。

解决方式:因为一般使用merge和rebase都是处理本地分支间的合并,这里改成和远端分支间的合并。先git fetch拉取远端分支更新,git stash暂存本地修改,然后git merge origin/分支名;或者git rebase origin/分支名,最后git stash apply。(这样省去了切换分支,然后git pull,然后再切换分支的过程)

精简步骤:git fetch; git stash; git merge origin/分支; git stash apply

情况:git cherry-pick 哈希值。

可能原因:在提交完某次提交后,发现自己并不在正确的分支上开发。

解决方式:git log查看该次提交的哈希值K。然后切换到正确的分支运行git cherry-pick K,可能会遇到冲突,解决后,进行add,然后运行git cherry-pick –continue。如果本地有修改,最好git stash一下。

精简步骤:git log; git cherry-pick 哈希值;

情况:git reset 分支名

可能原因:在提交完一系列的所有提交后,发现自己并不在正确的分支上开发。

解决方法:因为如果提交数量非常巨大,但是一次次cherry-pick冲突很多而且并不能保证自己正确解决冲突,而且本地分支A自己开发的功能已经基本正确无误。接下来万不得已使用以下方式:首先git reset –hard是会清空本地工作区的所有修改,但是git reset 分支名B,并不会去改变文件,只是会把当前本地分支A的最新节点指向分支B(当然分支B也可以是远端分支或者某个哈希值)。所以首先使用git reset 正确的分支B,这样所有相对于正确分支B的文件,如果与正确分支B不同或者未跟踪,都会出现在本地工作区的修改或者未跟踪区域。然后一个个add修改或者新增的文件(注意只添加自己开发功能的文件),注意这里使用IDE一个个检查过去比较好。然后git commit这次修改。如果本地分支A已经push到远端,那么切换新的分支C提push,否则可以直接push。(尽量不要采用push -f,曾经遇到过push -f后,远端仓库检测修改记录出现异常),然后删除本地异常分支A。

精简步骤:git reset origin/分支B; git add 文件; git commit -m ‘提交’; git checkout -b 分支C; git push; git branch -D 分支A。

最后建议,尽量不要使用push -f、reset –hard、git clean -xdf之类的。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐