前几天做了一次git分支合并操作,昨天同事发现有几次提交没有合并上,今天上班发现真的是合并掉了。由于没在旧分支上提交过代码,当时合并好后让同事确认有没有漏掉的提交,他说没法一一检查,后来想想,其实有办法可以确认提交的代码,在此记录下以示警示。
分支合并的基本操作是,假如要把develop分支的代码合并到master上,先切换到master:
git checkout master
然后开始merge:
git merge origin/develop
解决冲突,再git add,git commit,git push。但当时操作的时候忘了一件事,merge前,要先把最新代码拉下来,保证两个分支的代码都是最新的。
每次进行分支操作后,借助gitk可以很方便的查看合并情况:
gitk
先上个图:
这是在1.7.8.5分支上,同步到最新代码的情况:下面蓝色背景那次提交是当时我合并的提交,上面的那次merge是昨天晚上发现合掉了后的第二次合并;再对比web端的分支提交情况就知道,旧分支上的代码是否有漏掉的。(其实不会漏掉,只要确认旧分支的代码是最新的就行了)
顺便附上使用git的一些基本命令:
git commit --amend:修改上次commit
git cherry-pick Patchset :把某次提交,可以是任意分支,提交到当前分支,patchset可以从web端查看:
git fetch:如果有新增的分支,同步服务器端新分支到本地。
git checkout xxx(branch):分支切换,如果当前修改没有commit需要先commit。
git checkout xxx(file):取消xxx文件的改动,使其回到上一次commit时状态。
git checkout .:取消代码改动,回到上次commit时的状态,无法取消新增的文件。
git clean -f:如果添加了一些文件,提交的时候删除这些新增的文件。
git diff origin/master HEAD:已经commit后,查看当前代码和commit之前的改动。
git log -n 1 --stat:显示最近一次提交改动的文件。
git log -n 1 -p:查看最近一次提交改动的文件内容。
git merge origin/xxx(branch):合并xxx分支代码到当前分支,切记先把两边代码pull到本地啊!!!
另外,解决冲突的时候,git会提示,解决完了用:
git rebase --continue
如果不想合并了,退出使用:
git rebase --abort
有时push的时候会提示push失败,也看不出原因,尝试:
git commit --amend
然后删除change id那一行,保存退出,git会重新生成一个change id,再次push就可以了。
2017.11.8补充:
一次误操作,提交代码的时候使用了git commit –amend,这样changeID就和上一次提交是一样的,然后又commit了一次,导致本地有两个commit,并且第一个commit和服务器已经合并的commitID是一样的:
commit 1(第一次commit,通过commit –amend生成的,和服务器上的changeID一样)
commit2 (第二次commit,通过commit生成的,新的changeID)
这样在push的时候会报错:
解决办法是合并这两个commit:
git rebase -i HEAD~2
会列出最近两次commit:
上面的是第一次commit,把它删了,只留下第二个,然后ecs + : + wq 保存退出,会只有一个commit,此时可以修改commit信息:
再次保存退出,就可以提交了。