git这货共有几个git 合并策略略

posts - 5,&
comments - 0,&
trackbacks - 0
原文地址:http://platinhom.github.io//git-combine_commit/
有时commit多了看着会不爽.所以想合并掉一些commit. 这里是最简单的情况, 一条线下来N个commit, 合并掉末端的(没有branch出去的).
假设有a,b,c,d四个commit, 从新到旧是a, b, c, d (也就是先d-&c-&b-&a). 四个commit的SHA-1分别是a1,b1,c1,d1.
合并commit只能倒退, 就是说把a合到b(老的),顺序是abc可以合并起来成k, 最后成k, d这样.
# git log |head
git rebase -i d1
# if fail, use git rebase --abort
git push --force
git log可以查看commit的情况, 配着head命令可以查看前几个.&git log --pretty=oneline一行一个commit更好了
rebase前需要把状态push掉. 就是说不能有unstaged的修改.
-i&是选择不动的commit, 比他新的commit都有被修改的可能.
执行rebase后如果出错或者merge冲突什么退出来, rebase会被锁定, 再次执行时, 提示有三个选项:
git rebase --abort来忽略之前的rebase尝试,并恢复HEAD到开始的分支.
git rebase --continue就继续上次修改, 一般是rebase中间处理merge冲突后使用.
git rebase --skip是重新开始rebase并跳过现在所进行的处理.
执行rebase后会像commit一样进入编辑状态, 在开始会是几个commit的SHA值, 从上到下是越来越新的commit. 如果没有比-i指定的心的话会出现noop.
开始状态所有出现的commit前面都是pick. 这个pick是对该commit进行的操作, 有:
pick就是说保留该commit, 也可以用缩写p. (黄色)
squash, 使用该commit但合并到前一个老的commit去(常用). 可以用缩写s代替 (绿色).
reword, 和pick类似, 但可以修改commit时的提交信息(中间会弹出来让你修改commit).可以用缩写r代替 (紫红色).
edit, 使用commit, 但停下来进行修改, 可能用于merge冲突.可以用缩写e代替.
fixup, 和squash类似, 但会舍弃commit信息. 可以用缩写f&(红色)
exec, 执行shell命令.可以用缩写x
如果该commit是空commit, 前面会被注释掉#. 会被自动删除.
执行完修改后,:wq退出vi, 这时开始进行rebase操作(1/10 这样倒数). 中间会再次弹出修改文件, 此时是修改commit信息, 可以修改每次commit的信息(如果是fixup会忽略掉commit提交信息). 最后这个合并后的新commit显示的信息可能是多个commit的集合(多行).不想修改或改完后直接:wq退出vi即可.
所以都完成后需要一次强制的push, 要加入--force覆盖掉github上的commit.git push --force
例如我上面-i d1会修改3个commit, 保留最老最上最靠近d1的c (用reword或者pick都可以),其余a1和b1合并掉(squash或者fixup).最后生成一个新commit叫c2(就是3个合在一起了).所以从新到旧有c2, d1.
阅读(...) 评论()在 git 中重新合并一个分支 - 推酷
在 git 中重新合并一个分支
在使用 git 管理代码的过程中,有时候一不小心合并错了分支,或者对之前的合并不满意,想重新合并一次,这时候要怎么办呢?
分两种情况
代码还没有被推送到远程仓库
这种情况最简单,直接硬重置到合并前,然后重新 merge 需要合并的提交就好。
$ git reset --hard ba45ae7ef2993c4adf66b3b531f2ec1cdb54bde3
HEAD 现在位于 ba45ae7 课前提醒 50%
$ git merge 41f6e855a87bd892e081adb6d9dbfcfa
自动合并 gradle.properties
冲突(内容):合并冲突于 gradle.properties
自动合并 app/src/main/res/values/dimens.xml
自动合并 app/src/main/AndroidManifest.xml
冲突(内容):合并冲突于 app/src/main/AndroidManifest.xml
自动合并失败,修正冲突然后提交修正的结果。
然后就可以重新进行 merge 了。
代码已经被推送到远程仓库
这种情况下,使用硬重置似乎就不是很厚道了,毕竟强制推送常常会引发一堆意想不到的事情。
git revert
是不能直接 revert 一个合并提交的,会产生以下错误:
$ git revert e3694bec325a084b64dee
error: 提交 e3694bec325a084b64dee 是一个合并提交但未提供 选项。
fatal: 还原失败
要想 revert 一个合并提交,必须指明想要 revert 到哪里,
上给出了解决方案,需要 revert 两次,但是试了试似乎并没有什么效果(貌似只支持 revert 在
过程中产生的合并)。
最终还是用
搞定,首先 checkout 到一个临时分支,然后做与第一种情况相同的事情
$ git checkout -b re-merge
切换到一个新分支 're-merge'
$ git reset --hard ba45ae7ef2993c4adf66b3b531f2ec1cdb54bde3
HEAD 现在位于 ba45ae7 课前提醒 50%
$ git merge 41f6e855a87bd892e081adb6d9dbfcfa
自动合并 gradle.properties
冲突(内容):合并冲突于 gradle.properties
自动合并 app/src/main/res/values/dimens.xml
自动合并 app/src/main/AndroidManifest.xml
冲突(内容):合并冲突于 app/src/main/AndroidManifest.xml
自动合并失败,修正冲突然后提交修正的结果。
然后重新进行合并并提交,回到刚才的分支
# 重新进行合并
$ git commit -m &re-merge&
[re-merge ec7afc5] re-merge
$ git checkout develop
切换到分支 'develop'
然后将当前分支与刚才的临时分支合并
$ git merge re-merge
自动合并 gradle.properties
自动合并 app/src/main/AndroidManifest.xml
冲突(内容):合并冲突于 app/src/main/AndroidManifest.xml
自动合并失败,修正冲突然后提交修正的结果。
刚解决的冲突看起来又出现了,由于我们已经在临时分支里解决了所有冲突,这次直接把冲突的文件从刚才的临时分支里 checkout 出来就好了
$ git checkout re-merge app/src/main/AndroidManifest.xml
$ git commit -m &re-merge&
[develop 4f373a7] re-merge
到此,之前那次不令人满意的 merge 就已经被成功地重写了。
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致

我要回帖

更多关于 git 策略 的文章

 

随机推荐