以以下案例为例:
我在一个主题分支中有一些工作,现在我准备合并回master:
* eb3b733 3 [master] [origin/master]
| * b62cae6 2 [topic]
|/
* 38abeae 1
我从master执行合并,解决冲突,现在我有:
* 8101fe3 Merge branch 'topic' [master]
|\
| * b62cae6 2 [topic]
* | eb3b733 3 [origin/master]
|/
* 38abeae 1
现在,合并花了我一些时间,所以我又执行了一次抓取,并注意到远程主分支有了新的更改:
* 8101fe3 Merge branch 'topic' [master]
|\
| * b62cae6 2 [topic]
| | * e7affba 4 [origin/master]
| |/
|/|
* | eb3b733 3
|/
* 38abeae 1
如果我尝试从master执行git rebase origin/master
,我将被迫再次解决所有冲突,并且还会丢失合并提交:
* d4de423 2 [master]
* e7affba 4 [origin/master]
* eb3b733 3
| * b62cae6 2 [topic]
|/
* 38abeae 1
有没有一种干净的方法来改变合并提交的基数,这样我就可以得到像下面这样的历史记录了?
* 51984c7 Merge branch 'topic' [master]
|\
| * b62cae6 2 [topic]
* | e7affba 4 [origin/master]
* | eb3b733 3
|/
* 38abeae 1
发布于 2011-01-25 00:01:03
这里有两个选项。
一种是进行交互式的rebase并编辑合并提交,手动重做合并并继续rebase。
另一种是在git rebase
上使用--rebase-merges
选项,手册中对此进行了如下描述:
默认情况下,rebase将简单地将合并提交从待办事项列表中删除,并将重新建立基础的提交放入单个线性分支中。使用-- rebase -merges,rebase将通过重新创建合并提交来尝试保留要重新建立基础的提交中的分支结构。这些合并提交中任何已解决的合并冲突或手动修改都必须手动解决/重新应用。“
发布于 2017-12-15 01:13:54
好吧,这是一个古老的问题,@siride
已经有了一个公认的答案,但在我的例子中,这个答案还不够,因为--preserve-merges
迫使你再次解决所有冲突。我的解决方案基于@Tobi B
的想法,但使用了精确的分步命令
我们将从原始问题中的相同状态开始:
* 8101fe3 Merge branch 'topic' [HEAD -> master]
|\
| * b62cae6 2 [topic]
| |
| | * f5a7ca8 5 [origin/master]
| | * e7affba 4
| |/
|/|
* | eb3b733 3
|/
* 38abeae 1
请注意,我们在master之前有2个提交,所以挑剔不会起作用。
git checkout策略正确- -b #创建新的分支以保存master以备将来使用git rebase -b=ours-preserve合并原始/主
我们使用--preserve-merges
将合并提交保存在历史记录中。我们使用--strategy=ours
来忽略所有的合并冲突,因为我们不关心合并的提交中会有什么内容,我们只需要一个好的历史记录。
历史将如下所示(忽略master):
* 51984c7合并分支' topic‘HEAD ->正确-历史|\ |* b62cae6 2 topic*| f5a7ca8 5源/主站*| e7affba 4**| eb3b733 3 |/ * 38abeae 1
现在让我们得到正确的索引。,,
git checkout master #返回到我们的主分支git merge return / master #在我们的master上合并return/master
我们在这里可能会得到一些额外的合并冲突,但这只是来自8101fe3
和f5a7ca8
之间更改的文件的冲突,不包括来自topic
的已经解决的冲突
历史将如下所示(忽略正确的历史):
* 94f1484合并分支‘原始/母机’HEAD -> master |\ *| f5a7ca8 5原始/母机*| e7affba 4|* 8101fe3合并分支' topic‘| |\ ||* b62cae6 2 topic |/ /*/ eb3b733 3 |/ * 38abeae 1
git重置--软更正-历史git提交--修改
我们使用reset --soft
重置分支(和历史记录)以更正历史记录,但保持索引和工作树不变。然后,我们使用commit --amend
来重写我们的合并提交,它曾经有不正确的索引,以及来自主服务器的良好索引。
最后,我们将拥有这个状态(注意top commit的另一个id ):
* 13e6d03合并分支' topic‘HEAD -> master |\ |* b62cae6 2 topic*| f5a7ca8 5 origin/master *| e7affba 4*| eb3b733 3 |/ * 38abeae 1
发布于 2017-12-15 00:47:32
考虑到我刚刚花了一天的时间试图解决这个问题,实际上在同事的帮助下找到了一个解决方案,我想我应该加入进来。
我们有一个很大的代码库,我们必须同时处理2个严重修改的分支。有一个主分支和一个辅助分支,如果你是哪个分支。
虽然我将辅助分支合并到主分支中,但主分支中的工作仍在继续,当我完成时,我无法推送我的更改,因为它们是不兼容的。
因此,我需要“改变”我的“合并”的基础。
这是我们最终是如何做到的:
1)记录SHA。示例: c4a924d458ea0629c0d694f1b9e9576a3ecf506b
git log -1
2)创建正确的历史记录,但这会破坏合并。
git rebase -s ours --preserve-merges origin/master
3)记下SHA。示例: 29dd8101d78
git log -1
4)现在重置到您之前所在的位置
git reset c4a924d458ea0629c0d694f1b9e9576a3ecf506b --hard
5)现在将当前的master合并到您的工作分支中
git merge origin/master
git mergetool
git commit -m"correct files
6)现在你有了正确的文件,但是错误的历史记录,使用以下命令在您的更改之上获得正确的历史记录:
git reset 29dd8101d78 --soft
7)然后--修改原始合并提交中的结果
git commit --amend
瞧!
https://stackoverflow.com/questions/4783599
复制相似问题