注:https://github.com/nvbn/thefuck
修正命令行小工具
git checkout 版本号 --回滚至该版本,并需要创建一个新的分支
checkout_idea.jpg
与reset --hard的区别
1.reset会把working directory里的所有内容都更新掉
2.checkout不会去修改你在Working Directory里修改过的文件
3.reset把branch移动到HEAD指向的地方
4.checkout则把HEAD移动到另一个分支
区别.jpg
建议:
reset会修改版本历史的,因为他会丢弃掉一些版本历史。所以不建议使用
合并分支:
merge直接将两个状态合并,并产生一个新的合并提交
优点:
- 简单易于理解
- 记录了完整的历史过程
- 冲突解决简单
缺点: - 历史杂乱
-
对bisect不友好(bisect二分查找)
使用:
分支A的新代码,合并到master中
1.git checkout master
2.git merge(若有同一行的冲突,手动解决冲突,省略add命令)
3.git commit
4.git push
过程如下图:
merge.png
rebase:将某个状态的commit的挨个重演
优点:
- 分支历史是一条线;
- 对bisect友好
缺点: - 使用复杂;
-
如果存在冲突,可能要重复解决(如文件A,commit了N次)或squash(问题,压缩commit会丢失历史版本)
场景:定期和主干同步
使用:
分支A的新代码,合并到master中
1.git checkout A
2.git rebase master(若有同一行的冲突,手动解决冲突,省略add和continue命令)
3.git commit
4.git push -f (切记:只能在不和他人合作的分支使用)
过程如下图
rebase.png
git merge --squash
将分支A的commit合并提交到master
优点:
- 把所有变更合在一起,可读性强,bisect友好
- 回滚和revert方便
缺点: -
丢失了所有的历史记录
使用:
分支A的新代码,合并到master中
1.git checkout master
2.git merge 分支A --squash (解决冲突)
3.git commit
4.git push
squash.png
结论
1.在自己独占的分支上尽量使用rebase
2.和其他人公用的分支不要用push -f
网友评论