我有一个带有master和a分支的存储库,在这两个分支之间有很多合并活动。当分支A基于master创建时,我如何在我的存储库中找到提交?
我的存储库基本上是这样的:
-- X -- A -- B -- C -- D -- F (master)
\ / \ /
\ / \ /
G -- H -- I -- J (branch A)
我正在寻找修订A,这不是git merge-base(——all)找到的。
一个简单的方法是使用选项——first-parent来更容易地看到git log -graph中的分支点。
例如,从已接受的答案中取repo:
$ git log --all --oneline --decorate --graph
* a9546a2 (HEAD -> master, origin/master, origin/HEAD) merge from topic back to master
|\
| * 648ca35 (origin/topic) merging master onto topic
| |\
| * | 132ee2a first commit on topic branch
* | | e7c863d commit on master after master was merged to topic
| |/
|/|
* | 37ad159 post-branch commit on master
|/
* 6aafd7f second commit on master before branching
* 4112403 initial commit on master
现在添加——first-parent:
$ git log --all --oneline --decorate --graph --first-parent
* a9546a2 (HEAD -> master, origin/master, origin/HEAD) merge from topic back to master
| * 648ca35 (origin/topic) merging master onto topic
| * 132ee2a first commit on topic branch
* | e7c863d commit on master after master was merged to topic
* | 37ad159 post-branch commit on master
|/
* 6aafd7f second commit on master before branching
* 4112403 initial commit on master
这样就简单多了!
注意,如果repo有很多分支,你会想要指定两个分支进行比较,而不是使用——all:
$ git log --decorate --oneline --graph --first-parent master origin/topic
下面实现了等价于svn log——stop-on-copy的git,也可以用来查找分支的起源。
方法
前往所有分支
收集目标分支和其他分支的mergeBase
log和迭代
在mergeBase列表中出现的第一次提交时停止
就像所有的河流都流向大海,所有的分支都流向主人,因此我们在看似不相关的分支之间找到了合并基地。当我们从分支头通过祖先返回时,我们可以在第一个潜在的合并基点上停下来,因为理论上它应该是这个分支的原点。
笔记
我还没有尝试过这种兄弟分支和兄弟分支相互合并的方法。
我知道肯定有更好的解决办法。
详细信息:https://stackoverflow.com/a/35353202/9950。