git rebase
🌰场景一:本地与远端同一分支提交历史不一致
1 # 修复了一个bug以后准备提交 2 git add models/paper.go 3 git commit -m 'fix a bug' 4 # 现在准备推送到远端 5 git push origin master 6 # push失败了,说明A在我之前已经提交了,我本地master分支的提交历史已经落后远端了,需要先pull一下,与远端同步后才能push 7 git pull 8 # 现在使用git log看下一提交历史: 9 git log --oneline --graph 10 * f63ecbf (HEAD -> master) Merge branch 'master' of https://gitee.com/greenhn/ganlin 11 |\ 12 | * b91f711 (origin/master, origin/HEAD) 修正bug,优化内置通道配置 13 * | 8b76654 fix a bug 14 |/ 15 * a1bc60a 完善日报接口 16 * 9f73b5e 增加内置通道设置功能 17 * a0d464e ... 18 # 竟然分叉了!由于我本地master的提交历史和远端的master分支的提交历史不一致,所以git为我进行了自动合并,然后生成了一个新的提交历史(f63ecbf Merge branch 'master' of) 19 #这个时候用git rebase就可以解决 20 git rebase 21 git log --oneline --graph 22 * 2e2b995 (HEAD -> master) fix a bug 23 * b91f711 (origin/master, origin/HEAD) 修正bug,优化内置通道配置 24 * a1bc60a 完善日报接口 25 * 9f73b5e 增加内置通道设置功能 26 * a0d464e ... 27 git push
简单操作: git pull --rebase 效果与上面是一致
🌰
1 git checkout -b feature 2 vim newFunc.go 3 git add newFunc.go 4 git commit -m 'add new func' 5 git log --oneline --graph 6 * 4f58ab8 (HEAD -> feature) add new func 7 * 94c134b (master) init base 8 # 先尝试通过merge合并: 9 git checkout master 10 git merge feature 11 CONFLICT (content): Merge conflict in newFunc.go 12 Automatic merge failed; fix conflicts and then commit the result. 13 说明我两个分支之前的版本已经不同步了,需要手动合并冲突,再提交 14 git add newFunc.go 15 git commit -m 'merge master and feature' 16 git log --oneline --graph 17 * 562ec58 (HEAD -> master) merge master and feature 18 |\ 19 | * 4f58ab8 (feature) add new func 20 * | 0e80f97 do something 21 |/ 22 * 94c134b init base 23 24 解决: 回到合并前,再回到feature分支 25 在feature分支上执行: git rebase master 26 以master为基础,将feature分支上的修改增加到master分支上,并生成新的版本。 27 # 然后解决冲突 28 git add newFunc.go 29 # 现在是重点,之前的rebase其实只是完成了一半,由于出现冲突而终止,现在冲突解决,可以通过git rebase —continue继续完成之前的rebase操作。 30 git rebase --continue 31 git log --oneline --graph 32 * b2593e6 (HEAD -> feature) add new func 33 * 0e80f97 (master) do something 34 * 94c134b init base 35 # 提交记录已经是一条完美的直线。现在切换到主分支master,将feather分支上的提交合并过来。 36 git checkout master 37 git merge feature 38 # 再次查看一下提交历史: 39 git log --oneline --graph 40 * b2593e6 (HEAD -> master, feature) add new func 41 * 0e80f97 do something 42 * 94c134b init base
# 开始新的功能分支 git checkout -b new-feature master # 编辑文件 git commit -a -m "start developing a feature" # 编辑更多文件 git commit -a -m "fix someting" # 直接在master 上添加文件 git checkout master # 编辑文件 git commit -a -m "fix security hole" # 开始交互式 rebase git checkout new-feature git rebase -i master
最后的那个命令会打开一个编辑器,包含new-feature的两个,和一些指示:
pick 32618c4 Start developing a feature
pick 62eed47 Fix something from the previous commit
里面的提示有:
pick:保留该commit(缩写:p)
reword:保留该commit,但我需要修改该commit的注释(缩写:r)
edit:保留该commit, 但我要停下来修改该提交(不仅仅修改注释)(缩写:e)
squash:将该commit和前一个commit合并(缩写:s)
fixup:将该commit和前一个commit合并,但我不要保留该提交的注释信息(缩写:f)
exec:执行shell命令(缩写:x)
drop:我要丢弃该commit(缩写:d)
你可以更改每个提交前的pick命令来决定在rebase时提交移动的方式,在我们的例子中,我们只需要用squash命令把两个提交并在一起就可以了:
pick 32618c4 Start developing a feature
squash 62eed47 Fix something from the previous commit
git checkout master
git merge new-feature