显示提交的原始分支

时间:2010-12-26 20:18:11

标签: git branch git-branch

我使用git-blame来查找特定的提交。现在我想找到它最初来自的分支。 (从那里,我将使用分支名称来查找特定的票证)

让我们将“原始分支”定义为“在将分支合并到任何其他分支之前进行提交的分支”。

9 个答案:

答案 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

相关问题