Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
git-如何在合并到master之前清理复杂的分支?_Git_Merge - Fatal编程技术网

git-如何在合并到master之前清理复杂的分支?

git-如何在合并到master之前清理复杂的分支?,git,merge,Git,Merge,通常情况下,在将分支合并到主分支以压缩或修复小提交(例如,提交消息只是“重构”)之前,Igit rebase-I master,但是对于在不同阶段合并了主分支和子分支的更大、更复杂的分支,我该怎么办?我相信rebase适用于这个简单的场景(基于谷歌搜索): 但是这个呢 * (newest commits) |\ * | /| * grandchild * * | | |/ | * child * | |/ | * master (oldest commit) 有没有一种方法可

通常情况下,在将分支合并到主分支以压缩或修复小提交(例如,提交消息只是“重构”)之前,I
git rebase-I master
,但是对于在不同阶段合并了主分支和子分支的更大、更复杂的分支,我该怎么办?我相信rebase适用于这个简单的场景(基于谷歌搜索):

但是这个呢

  *  (newest commits)
  |\
  * |
 /| * grandchild
* * |
| |/
| * child
* |
|/ 
|
* master (oldest commit)
有没有一种方法可以不费吹灰之力就简化这段历史?我只尝试了
git-rebase-I master
,但有很多冲突(我认为,由于
rere
的缘故,其中一些冲突是空白的,但有些冲突很难解决)。明确地说,这是我想要的结果(显然,我们可以在master中运行追赶合并,我们将有一个线性历史记录;子分支中的最终提交数是任意的):


如果这是一个重复的问题,我深表歉意,因为它可能是(但我找不到一个专门解决我的问题的问题)。

有几个选择

首先,
rebase-i
可能会起作用。值得一试——这是git,所以如果需要的话,您可以返回到以前的状态。(如果您在启动rebase时处于
branch-X
状态,并且一切都出错,那么您知道(a)rebase只会更改
branch-X
ref,并且(b)可以使用reflog将其向后移动,因此

git reset --hard branch-X@{1}
而且没有造成任何伤害。)

现在,如果这在某种特定的方面失败了,或者看起来很难做到正确,那么这就是一个更明智的(而且在我看来更好)问题的起点

这就是说,我认为在这种特殊情况下,立即行动可能更容易

git checkout child
git merge --squash branch-X
git commit
git branch -f branch-X
因为“挤压合并”就是用一次提交来替换合并中涉及的任何拓扑


请注意,无论采用哪种方式(事实上,无论您采用哪种方式),如果要替换的提交已推送到远程,那么最佳实践都会说不要这样做。这通常是关于重定基址的警告,但它适用于任何修改历史记录的操作。

在这种情况下,您是否尝试过
重定基址-i
?您需要使用
重定基址-i
并删除无用的提交(在解决冲突时保留修改)@JoshLee是的——即使与ReRereRei也有很多冲突。我反复讨论了是将merge命令表述为
git merge--squash branch-X
还是
git merge--squash newst commit
;应该是相同的结果,我当前在
child
上,并且从git获得“(无需压缩)已更新的结果。”。但我认为这一定是正确的方向。我确实在master的基础上创建了一个新分支,并且
git merge--squash child
确实有效。美好的基于此,我怀疑问题在于我们在merge/squash命令中识别要签出的提交与要命名的提交的“不精确”方式。不管怎么说,听起来你已经成功了
git reset --hard branch-X@{1}
git checkout child
git merge --squash branch-X
git commit
git branch -f branch-X