首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >重新设置Git合并提交的基础

重新设置Git合并提交的基础
EN

Stack Overflow用户
提问于 2011-01-24 23:15:12
回答 5查看 126.2K关注 0票数 221

以以下案例为例:

我在一个主题分支中有一些工作,现在我准备合并回master:

代码语言:javascript
运行
复制
* eb3b733 3     [master] [origin/master]
| * b62cae6 2   [topic]
|/  
* 38abeae 1

我从master执行合并,解决冲突,现在我有:

代码语言:javascript
运行
复制
*   8101fe3 Merge branch 'topic'  [master]
|\  
| * b62cae6 2                     [topic]
* | eb3b733 3                     [origin/master]
|/  
* 38abeae 1

现在,合并花了我一些时间,所以我又执行了一次抓取,并注意到远程主分支有了新的更改:

代码语言:javascript
运行
复制
*   8101fe3 Merge branch 'topic'  [master]
|\  
| * b62cae6 2                     [topic]
| | * e7affba 4                   [origin/master]
| |/  
|/|   
* | eb3b733 3
|/  
* 38abeae 1

如果我尝试从master执行git rebase origin/master,我将被迫再次解决所有冲突,并且还会丢失合并提交:

代码语言:javascript
运行
复制
* d4de423 2       [master]
* e7affba 4       [origin/master]
* eb3b733 3
| * b62cae6 2     [topic]
|/  
* 38abeae 1

有没有一种干净的方法来改变合并提交的基数,这样我就可以得到像下面这样的历史记录了?

代码语言:javascript
运行
复制
*   51984c7 Merge branch 'topic'  [master]
|\  
| * b62cae6 2                     [topic]
* | e7affba 4                     [origin/master]
* | eb3b733 3
|/  
* 38abeae 1
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-01-25 00:01:03

这里有两个选项。

一种是进行交互式的rebase并编辑合并提交,手动重做合并并继续rebase。

另一种是在git rebase上使用--rebase-merges选项,手册中对此进行了如下描述:

默认情况下,rebase将简单地将合并提交从待办事项列表中删除,并将重新建立基础的提交放入单个线性分支中。使用-- rebase -merges,rebase将通过重新创建合并提交来尝试保留要重新建立基础的提交中的分支结构。这些合并提交中任何已解决的合并冲突或手动修改都必须手动解决/重新应用。

票数 163
EN

Stack Overflow用户

发布于 2017-12-15 01:13:54

好吧,这是一个古老的问题,@siride已经有了一个公认的答案,但在我的例子中,这个答案还不够,因为--preserve-merges迫使你再次解决所有冲突。我的解决方案基于@Tobi B的想法,但使用了精确的分步命令

我们将从原始问题中的相同状态开始:

代码语言:javascript
运行
复制
*   8101fe3 Merge branch 'topic'  [HEAD -> master]
|\  
| * b62cae6 2                     [topic]
| |
| | * f5a7ca8 5                   [origin/master]
| | * e7affba 4
| |/  
|/|   
* | eb3b733 3
|/  
* 38abeae 1

请注意,我们在master之前有2个提交,所以挑剔不会起作用。

  1. 首先,让我们创建正确的历史记录:

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

我们在这里可能会得到一些额外的合并冲突,但这只是来自8101fe3f5a7ca8之间更改的文件的冲突,不包括来自topic的已经解决的冲突

历史将如下所示(忽略正确的历史):

* 94f1484合并分支‘原始/母机’HEAD -> master |\ *| f5a7ca8 5原始/母机*| e7affba 4|* 8101fe3合并分支' topic‘| |\ ||* b62cae6 2 topic |/ /*/ eb3b733 3 |/ * 38abeae 1

  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

票数 42
EN

Stack Overflow用户

发布于 2017-12-15 00:47:32

考虑到我刚刚花了一天的时间试图解决这个问题,实际上在同事的帮助下找到了一个解决方案,我想我应该加入进来。

我们有一个很大的代码库,我们必须同时处理2个严重修改的分支。有一个主分支和一个辅助分支,如果你是哪个分支。

虽然我将辅助分支合并到主分支中,但主分支中的工作仍在继续,当我完成时,我无法推送我的更改,因为它们是不兼容的。

因此,我需要“改变”我的“合并”的基础。

这是我们最终是如何做到的:

1)记录SHA。示例: c4a924d458ea0629c0d694f1b9e9576a3ecf506b

代码语言:javascript
运行
复制
git log -1

2)创建正确的历史记录,但这会破坏合并。

代码语言:javascript
运行
复制
git rebase -s ours --preserve-merges origin/master

3)记下SHA。示例: 29dd8101d78

代码语言:javascript
运行
复制
git log -1

4)现在重置到您之前所在的位置

代码语言:javascript
运行
复制
git reset c4a924d458ea0629c0d694f1b9e9576a3ecf506b --hard

5)现在将当前的master合并到您的工作分支中

代码语言:javascript
运行
复制
git merge origin/master
git mergetool
git commit -m"correct files

6)现在你有了正确的文件,但是错误的历史记录,使用以下命令在您的更改之上获得正确的历史记录:

代码语言:javascript
运行
复制
git reset 29dd8101d78 --soft

7)然后--修改原始合并提交中的结果

代码语言:javascript
运行
复制
git commit --amend

瞧!

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4783599

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档