我认为我正在寻找的是两个分支中最古老的共享祖先,或类似的东西,这个问题似乎触及它:Finding a branch point with Git?
但是,而不是OP中的图表,这是我正在看的更多:
-- I -- I -- I -- I -- I -- I -- I (integration branch)
\ \ /
\ \ /
F -- F -- F -- F (feature branch)
我的问题是 - 如果我们从集成中检出一个功能分支并进行一些更改和一些提交,然后我们就会多次更新/合并集成。 Aka,提交提交,与集成合并,提交提交,与集成合并等。如果我们然后执行git reset --soft <integration>
,那么当使用git checkout
时,是否会将其重置为集成提交,或者只是将其重置为点哪个最后的git merge
发生了整合?
我的目标是让我的功能成为一个大提交。如果git reset --soft
只返回到最后一个git与集成合并,那么我的功能可能有100个提交,这不是bueno,我将需要另一种技术。
每次你将功能合并回integration
时,你正在移动integration
HEAD(现在引用新的合并提交)
你需要在做integration
分支和你的合并之前标记feature
以便回到它。
一个可能的标记是origin/integration
:上次你拿integration
)。
另一个是git merge-base --fork-point
(基于reflog
,因此不可靠)或两个分支的git rev-list --first-parent
之间的一些差异。
无论如何,你的git reset --soft
必须使用那个标记,而不是本地集成分支。
你可以使用git reset --soft
,但是你必须做的其他事情 - 或者更确切地说,不是先做。
我的目标是让我的功能成为一个大提交。
在这种情况下,请确保您不要以:
-- o -- A -- B -- C -- D -- E -- IM <-- integration
\ \ /
\ \ /
F1 -- F2 - FM - F4 <-- feature
请注意,我已经替换了这里的单个字母,以便我可以谈论特定的提交。就Git本身而言,两个最有趣的提交是F4
,它是名为feature
的分支的提示,以及IM
,它是名为integration
的分支的提示。
标记为FM
的提交不是问题,即使它是合并提交。标记为IM
的提交是一个问题。那是因为这个提交可以从integration
的提示到达。对于(更多)关于可达性概念的更多信息,请参阅Think Like (a) Git。每当提交IM
本身都可以通过从integration
指向的提交开始到达并向后工作(向左),所有提交IM
本身的提交也是如此。提交IM
导致回到提交E
(不是问题)和F4
(问题!)。
如果你删除提交IM
,那么你有:
-- o -- A -- B -- C -- D -- E <-- integration
\ \
\ \
F1 -- F2 - FM - F4 <-- feature
你现在可以git checkout feature
并运行git reset --soft integration
,结果如下:
-- o -- A -- B -- C -- D -- E <-- feature (HEAD), integration
\ \
\ \
F1 -- F2 - FM - F4 [abandoned, but remembered as feature@{1}]
但是,当您提交F4
时,您的索引和工作树没有变化,因此您现在可以运行git commit
将当前索引转换为新提交。名称feature
现在将指向新提交:
F <-- feature (HEAD)
/
-- o -- A -- B -- C -- D -- E <-- integration
\ \
\ \
F1 -- F2 - FM - F4 [feature@{1}]
新提交F
的快照将与提交F4
的快照匹配:
git diff feature@{1} feature
什么都不打印。但新提交F
的父级是现有的提交E
。 (提交F
也有一个新的作者和提交者和相应的“现在”时间戳,这也区别于F4
。)