我有一个带有master和a分支的存储库,在这两个分支之间有很多合并活动。当分支A基于master创建时,我如何在我的存储库中找到提交?
我的存储库基本上是这样的:
-- X -- A -- B -- C -- D -- F (master)
\ / \ /
\ / \ /
G -- H -- I -- J (branch A)
我正在寻找修订A,这不是git merge-base(——all)找到的。
我似乎得到了一些快乐
git rev-list branch...master
你得到的最后一行是分支上的第一个提交,所以接下来的问题是获取它的父节点。所以
git rev-list -1 `git rev-list branch...master | tail -1`^
似乎为我工作,不需要差异等(这是有帮助的,因为我们没有那个版本的差异)
更正:如果你在主分支上,这是行不通的,但我在一个脚本中这样做,所以这不是一个问题
为什么不使用
git log master..enter_your_branch_here --oneline | tail -1
它提供了分支A拥有而master没有的所有提交(..的函数),并且tail -1返回输出的最后一行,这将为您找到指定分支(分支A)的第一次提交。
然后,使用那个提交的SHA
git log enter_the_sha_here^1 --oneline | head -1
它提供了指定提交(^1函数)之前的所有提交,并返回head -1输出的第一行,这是在分支A(又名“分支点”)最早提交之前的“一次提交”。
作为一个单独的可执行命令:
for COMMIT in $(git log --format=format:%H master..HEAD | tail -1) ; do
git log $COMMIT^1 --oneline | head -1
done
在分支A (HEAD的功能)中运行上述操作
当然我遗漏了一些东西,但在我看来,以上所有的问题都是因为我们总是试图找到历史上的分支点,这导致了各种各样的问题,因为可用的合并组合。
相反,我采用了一种不同的方法,基于两个分支共享很多历史,分支之前的所有历史都是100%相同的,所以我的建议是向前(从第一次提交开始),寻找两个分支的第一个差异。简单地说,分支点就是找到的第一个差值的父点。
在实践中:
#!/bin/bash
diff <( git rev-list "${1:-master}" --reverse --topo-order ) \
<( git rev-list "${2:-HEAD}" --reverse --topo-order) \
--unified=1 | sed -ne 's/^ //p' | head -1
它解决了我所有的常规案件。当然,有些边境地区没有被覆盖,但是…你好:-)
我似乎得到了一些快乐
git rev-list branch...master
你得到的最后一行是分支上的第一个提交,所以接下来的问题是获取它的父节点。所以
git rev-list -1 `git rev-list branch...master | tail -1`^
似乎为我工作,不需要差异等(这是有帮助的,因为我们没有那个版本的差异)
更正:如果你在主分支上,这是行不通的,但我在一个脚本中这样做,所以这不是一个问题