我不知道我是否需要rebase
或merge
策略或这里的任何东西。
场景
dev---*
\A------*------
\A2---------
最后,我可以将A2
合并到dev
中。这是最终结果,但是,有没有办法将A2
合并回A
并基本上替换或覆盖A2
分支之后的所有提交?
为什么?作为教学时刻。我真的很希望能够通过查看合并或将A
转换为A2
来显示A2
与A
的“头”之间的差异(所有合并均以--no-ff
)
说明: 很高兴看到我的git历史记录
dev---* /---
\A------*------ -*
\A2---------/
因此,以类似gitlab的方式查看A
上的“合并”提交将向我显示差异。
我只是对GitLab存储库“图形”的外观以及各个提交视图保持谨慎。更改。
也许我会做一些合并实验。
更多说明新问题。 考虑这个git历史
dev---*
\A------*++++++
\A2---------
我可以将A2
合并到A
中以完全覆盖所有+
的提交,但保留在历史记录中吗?
答案 0 :(得分:1)
正如@ChrisMaes在comment中指出的那样,您可以通过简单地运行{{1}来比较A
和A2
分支之间发生的更改总数。 } 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
这将列出A
和A2
的最后一次相互提交与分支A2
的尖端之间的所有差异。
编辑:
我只是learned认为git diff A...A2
是git diff $(git merge-base A A2) A2
的语法糖,即。它提供了分支A2
中引入的所有更改,因为它与A
不同。
答案 2 :(得分:0)
首先,找到A2
从A
分支的提交:
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