为什么两个分支的提交差异在合并时只是堆积起来?怎么解决?

问题描述 投票:0回答:1

我们的团队有针对特定项目的临时分支和主分支。我们正在使用 GitHub。现在,每次我们必须将来自暂存分支的更改合并到主分支时,当我们比较两个分支时,提交差异就会堆积起来,而不是只显示最近的提交和最近的文件更改。发生的情况是,在我们下一个暂存到主分支的拉取请求中,在合并最近的更改后,在比较两个分支时,之前的更改和提交仍然与我们最近的更改堆积在一起。看起来之前的更改没有合并。但它是。事实上,合并提交现在正在主分支上进行。即使您手动查看主分支中的代码,您也可以看到更改已合并。

每次我们需要合并拉取请求时都会看到两个分支之间的比较或差异,这让我们感到困惑,从而导致合并新更改时产生疑问和不确定性。有什么办法可以解决这个问题吗?

请容忍我的英语,因为它不是我的母语。我不确定在这种情况下使用的确切术语,所以我可能会互换这些术语的使用。但我希望我至少已经传达了这个信息。如果没有,请随时询问您需要的更多详细信息。

我们尝试使用不同的合并,例如

squash and merge
create a merge commit

git github git-merge git-commit
1个回答
0
投票

所以......问题是你正在挤压合并。如果您要合并长时间运行的分支,则必须避免挤压合并......如果您要合并功能分支,则挤压合并是可以的,因为分支会在那里死亡,所以不会有太大问题。

假设你有这样的事情:

* JJJ (branch1)
* III
* HHH Merge of branch2 up to DDD
| * GGG (branch2)
| * FFF
| * EEE
| * DDD
| * CCC
|/
* BBB
* AAA

为了解释南瓜的问题......考虑一下

branch1
branch2
之间的最后一个共同祖先是什么?这就是
BBB
,这就是为什么每次你尝试合并时,你都会得到所有 big 的差异,而你每次都已经克服了多个冲突。

那么....现在,如何才能轻松地摆脱下一次合并的情况,而不必重做之前的所有工作,对吗?好吧...那我们试试这个:

git checkout -b temp HHH # create branch temp over the last squashed merge commit in branch1
git merge --no-commit DDD -m "Merging DDD again"
# if you got conflicts, it doesn't matter.... continue with the recipe
# we know the content of the merge is what HEAD has at the moment so...
git restore --worktree --staged --source HEAD -- . 
git merge --continue

完成后,现在

temp
就是上次将branch2合并到
branch1
时分支
应该
的样子。

* JJJ (branch1)
* III
| * ZZZ (temp) merging DDD again
|/|
* | HHH Merge of branch2 up to DDD
| | * GGG (branch2)
| | * FFF
| | * EEE
| |/
| * DDD
| * CCC
|/
* BBB
* AAA

现在,如果您选中了

temp
,您将看到它在图表中包含
HHH
DDD
作为父级,只是希望我们想要......现在按照您的正常工作流程将其合并到
branch1 
这样你就得到这个:

* KKK (branch1) merge of temp into branch1
|\
* | JJJ
* | III
| * ZZZ (temp) merging DDD again
|/|
* | HHH Merge of branch2 up to DDD
| | * GGG (branch2)
| | * FFF
| | * EEE
| |/
| * DDD
| * CCC
|/
* BBB
* AAA

而且,现在...

branch1
branch2
之间最新的共同祖先是什么?这里有一个提示:它不是
BBB
。是
DDD

从现在开始,在

branch1
branch2
之间进行真正的合并,您将不会再遇到这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.