我使用git-blame来查找特定的提交。现在我想找到它最初来自的分支。 (从那里,我将使用分支名称来查找特定的票证)
让我们将“原始分支”定义为“在将分支合并到任何其他分支之前进行提交的分支”。
答案 0 :(得分:42)
就像其他人所说的那样,如果您要查找的分支不是您要归咎于此提交的存储库的本地分支(例如,仅在远程开发人员的个人存储库中的分支),则会被搞砸。
但是假设你可以看到那些抢手的分支,当然你有提交的哈希,比如d590f2...
,你可以做的部分答案是:
$ git branch --contains d590f2
tests
* master
然后,只是为了确认你有罪魁祸首:
$ git rev-list tests | grep d590f2
当然,如果d590f2
已合并到多个分支中,则必须比此更精细。
答案 1 :(得分:9)
这在git中并不适用。分支是每个存储库的本地概念:一个人的“本地东西”分支可以与另一个人的“本地东西”分支完全分开。如果您执行某些操作,例如查看主集成分支和查询提交,以及删除两者之间的所有合并基础,您应该能够获得提交历史记录的子树,这可能会产生一些启发...或者可能不会。例如如果你追踪从查询提交到“master”的链接,你应该希望找到合并提交和有用的注释,说明合并来自哪里......但是这些信息只是信息性的,不是以某种方式自动检索的。
e.g。 gitk some-commit...master
(这几乎是gitk some-commit master --not $(git merge-base some-commit master)
的缩写)
答案 2 :(得分:7)
Git分支只不过是“指向提交的命名指针”(这是一个与其他众所周知的VCS不同的基本概念)。
这种情况很明显,提交A在branch-1
上,在branch-2
提交B:
o A [branch-1]
|
o | B [branch-2]
| |
合并后不清楚A(或B)原来是branch-1
还是branch-2
:
o [branch-1] [branch-2]
|
o merged
|\
| o A
| |
o | B
| |
如果您标记了A的父提交,也许您可以猜测提交A的Git分支是什么,例如release-1
并且您知道此标记仅用于branch-1
中的提交。
o [branch-1] [branch-2]
|
o merged
|\
| o A
| |
o | B
| |
| o <release-1]
| |
答案 3 :(得分:6)
我试一试,请评论,因为不完全确定,但我相信它能完成这项工作。
以下内容只有在分支仍然指向合并到master之前的尖端时才有效,如果分支在同一个repo上就是这种情况:
o [master]
|
o merged branch "great-feature" into master
|\
| o A [great-feature]
| |
o | B
| |
如果不是这种情况(例如,如果你从另一个仓库撤出),你仍然可以手工重建它们。
首先获取您的提交所在的分支:
$ git branch -a --contains=<sha-of-B>
*master
great-feature
然后为每个分支获取将其头部与提交分开的提交数:这是输出指定范围的git log的行数:
$ git log --pretty=oneline <sha-of-B>..great-feature | wc -l
1
$ git log --pretty=oneline <sha-of-B>..master | wc -l
4
所以B离大特征最近,这意味着它是在它中创建的。
这可以成为一个很好的脚本,随意添加到答案中(我不擅长这个)
答案 4 :(得分:4)
首先确保您从遥控器中获取了更改
$ git fetch --all
和
$ git branch -a --contains d590f2
如果没有 -a 选项,则无法找到仅在远程分支上存在的提交
答案 5 :(得分:2)
我找到了一种更简单的方法:它出现在git log <sha>..HEAD --merges
的最后一次提交的消息中!
此命令显示master和commit之间发生的合并;此命令的最后一次提交输出是包含它的第一次合并提交。它通常包含分支名称,因此即使分支被删除,您也可以找到它的名称。
要仅获取分支的名称,只需键入git log <sha>..HEAD --merges --oneline |tail -1
答案 6 :(得分:2)
当你在分支上时,&#34;原始分支&#34; 被合并到。你可以运行:
git log <SHA>..HEAD --ancestry-path --merges
此命令将显示merge
之间的所有<SHA>..HEAD
次提交。你需要最后一个。
例如,对于c0118fa
提交(最后一个),&#34;原始分支&#34; 为redesign_interactions
* ccfd449 (HEAD -> develop) Require to return undef if no digits found
* 93dd5ff Merge pull request #4 from KES777/clean_api
|\
| * 39d82d1 Fix tc0118faests for debugging debugger internals
| * ed67179 Move &push_frame out of core
| * 2fd84b5 Do not lose info about call point
| * 3ab09a2 Improve debugger output: Show info about emitted events
| * a435005 Merge branch 'redesign_interactions' into clean_api
| |\
| | * a06cc29 Code comments
| | * d5d6266 Remove copy/paste code
| | * c0118fa Allow command to choose how continue interaction
| | * 19cb534 Emit &interact event
你应该跑:
git log c0118fa..HEAD --ancestry-path --merges
向下滚动以查找上次提交。这是:
commit a435005445a6752dfe788b8d994e155b3cd9778f
Merge: 0953cac a06cc29
Author: Eugen Konkov
Date: Sat Oct 1 00:54:18 2016 +0300
Merge branch 'redesign_interactions' into clean_api
答案 7 :(得分:1)
似乎这不是一个可以通过git 100%精确回答的问题。
git branch --contains --merge <sha1>
返回提交合并到的所有分支的列表和原始分支。 - no-merged 返回包含提交的所有后续分支,因为它们在合并点之后分支。
因此,您可以获取每个合并但不是原始分支的列表,并且在命令执行之前删除的任何分支都会丢失(或者您正在查看reflog)
<强>结果
git branch --contains <sha1 for "added feature/inital 1">
* develop
feature/inital
feature/subsequent1
git branch --contains <sha1 for "added feature/inital 1"> --merged
* develop
feature/inital
git branch --contains <sha1 for "added feature/inital 1"> --no-merged
feature/inital
测试脚本
function mkbranch {
git checkout -b $1
git push --set-upstream origin $1
}
# Develop
mkbranch develop
for f in 1 2 3; do date > file${f}.txt; git add file${f}.txt; git commit -m "added develop $f"; done
git push
# Initial Feature Branch
mkbranch feature/inital
for f in 1 3; do date > file${f}.txt; git add file${f}.txt; git commit -m "modified feature/inital $f"; done
git push
# Merge
git checkout -b develop
git merge feature/inital
git push
# Next Feature Branch
mkbranch feature/subsequent1
for f in 1 3; do date > file${f}.txt; git add file${f}.txt; git commit -m "modified feature/subsequent1 $f"; done
git push
答案 8 :(得分:-1)
这对我来说非常合适,可以从Jenkins工作区的分离头中获取分支名称:
git show -s --pretty=%d