git merge替换或覆盖分支

时间:2019-08-13 11:10:10

标签: git

我不知道我是否需要rebasemerge策略或这里的任何东西。

场景

dev---*
       \A------*------
                \A2---------

最后,我可以将A2合并到dev中。这是最终结果,但是,有没有办法将A2合并回A并基本上替换或覆盖A2分支之后的所有提交?

为什么?作为教学时刻。我真的很希望能够通过查看合并或将A转换为A2来显示A2A的“头”之间的差异(所有合并均以--no-ff

说明: 很高兴看到我的git历史记录

dev---*                        /---
       \A------*------       -*
                \A2---------/

因此,以类似gitlab的方式查看A上的“合并”提交将向我显示差异。

我只是对GitLab存储库“图形”的外观以及各个提交视图保持谨慎。更改。

也许我会做一些合并实验。

更多说明新问题。 考虑这个git历史

dev---*
       \A------*++++++
                \A2---------

我可以将A2合并到A中以完全覆盖所有+的提交,但保留在历史记录中吗?

3 个答案:

答案 0 :(得分:1)

正如@ChrisMaescomment中指出的那样,您可以通过简单地运行{{1}来比较AA2分支之间发生的更改总数。 } heads之间。

例如:

git diff

git diff A A2 相比,将为您提供A2分支在A2中所做的更改,而

A

将会给您相反的意思,即与git diff A2 A 相比A中所做的更改。

之所以可以这样做,是因为在Git中,每次提交都指向项目中所有文件的快照,就像提交时一样。

"Snapshots, Not Differences"documentation部分中:

  

Git认为其数据更像是一个小型文件系统的快照集。每次提交或将项目状态保存在Git中时,它基本上都会拍下当时所有文件的样子,并存储对该快照的引用。

这意味着分支的最新提交(也称为tip)引用的快照包含该分支中发生的累积更改集,而不仅是该提交和上一个提交。

答案 1 :(得分:1)

如果执行此合并的唯一原因是能够查看上一段中说明的差异,那么我建议:

git diff $(git merge-base A A2) A2

这将列出AA2的最后一次相互提交与分支A2的尖端之间的所有差异。

编辑: 我只是learned认为git diff A...A2git diff $(git merge-base A A2) A2的语法糖,即。它提供了分支A2中引入的所有更改,因为它与A不同。

答案 2 :(得分:0)

首先,找到A2A分支的提交:

git merge-base A A2

这将为您提供提交ID。然后,如果您不介意丢失对A的额外提交,请将A重置为该提交:

git checkout A
git reset --hard <commit id>

然后将A2合并到A中:

git checkout A
git merge A2

然后将A合并到dev中:

git checkout dev
git merge A


注意:您可以执行A或将差异保存到补丁文件中来代替对git stash进行硬重置:

git diff <commit id> > patchfile.diff