寻找一个git提交来自哪个分支

有没有什么办法可以find它的sha1提交来自哪个分支?

如果你可以告诉我如何使用Ruby Grit来完成这一点,奖金点。

虽然Dav是正确的,信息不是直接存储的,但这并不意味着你永远不能发现。 这里有一些你可以做的事情。

find提交的分支

git branch --contains <commit> 

这将告诉你所有在他们的历史上有特定承诺的分支机构。 如果提交已经被合并,显然这是不太有用的。

searchreflogs

如果您在提交的存储库中工作,则可以在reflog中search该提交的行。 超过90天的Reflog被git-gc修剪掉了,所以如果commit太老了,你不会find它。 这就是说,你可以这样做:

 git reflog show --all | grep a871742 

find提交a871742。 输出应该是这样的:

 a871742 refs/heads/completion@{0}: commit (amend): mpc-completion: total rewrite 

表明提交是在分支“完成”上进行的。 默认输出显示缩写提交哈希,所以一定不要search完整的散列或你不会find任何东西。

git reflog show实际上只是git log -g --abbrev-commit --pretty=oneline一个别名git log -g --abbrev-commit --pretty=oneline ,所以如果你想摆弄输出格式来让不同的东西可用于grep,那就是你的出发点!

如果你没有在提交的仓库中工作,那么在这种情况下你可以做的最好的事情是检查推荐日志,并find提交首次被引入到你的仓库的时间; 如果运气好的话,你会find它所致力的分支。 这有点复杂,因为你不能同时走提交树和reflog。 你需要parsingreflog输出,检查每个散列是否包含所需的提交。

find后续的合并提交

这是依赖于工作stream程的,但是具有良好的工作stream程,提交是在开发分支上进行的,然后合并进来。你可以这样做:

 git log --merges <commit>.. 

看到具有给定提交作为祖先的合并提交。 (如果提交只合并一次,第一个应该是你之后的合并,否则你将必须检查一些,我想。)合并提交消息应该包含合并的分支名称。

如果你希望能够做到这一点,你可能想使用--no-ff选项来混合git merge来强制合并提交创build,即使在快进的情况下。 (不要太热心,如果过度使用,可能会变得模糊。)VonC 对相关问题的回答有助于阐述这个话题。

2013年12月更新:

sschuberth 评论

git-what-branch (Perl脚本,见下文)似乎不再被维护。
git-when-merged是用Python编写的替代scheme,对我来说工作得非常好。

它基于“ 查找包含特定提交的合并提交 ”。

 git when-merged [OPTIONS] COMMIT [BRANCH...] 

查找何时将提交合并到一个或多个分支中。
find将COMMIT带入指定BRANCH的合并提交。

具体来说,查找包含COMMIT作为祖先的BRANCH的第一个父历史logging中最早的提交。


原始答案2010年9月:

Sebastien Douche只是在这个答案前16分钟:

git-what-branch :发现一个提交是什么分支,或者它是如何到达一个命名分支的

这是Seth Robertson的Perl脚本 ,看起来很有趣:

概要

 git-what-branch [--allref] [--all] [--topo-order | --date-order ] [--quiet] [--reference-branch=branchname] [--reference=reference] <commit-hash/tag>... 

概述

告诉我们(默认情况下)提交和合并的最早的因果path,导致所请求的提交到一个命名的分支。
如果直接在命名分支上进行提交,那显然是最早的path。

通过最早的因果path,我们指的是通过提交时间(除非指定--topo-order )最早合并到一个命名分支的path。

性能

如果许多分支(例如数百个)包含提交,则系统可能需要很长时间(对于Linux树中的特定提交,花了8秒钟来探索分支,但是有超过200个候选分支)来追踪path到每个提交。
select一个特定的--reference-branch --reference tag来检查会快上百倍(如果你有数百个候选分支)。

例子

  # git-what-branch --all 1f9c381fa3e0b9b9042e310c69df87eaf9b46ea4 1f9c381fa3e0b9b9042e310c69df87eaf9b46ea4 first merged onto master using the following minimal temporal path: v2.6.12-rc3-450-g1f9c381 merged up at v2.6.12-rc3-590-gbfd4bda (Thu May 5 08:59:37 2005) v2.6.12-rc3-590-gbfd4bda merged up at v2.6.12-rc3-461-g84e48b6 (Tue May 3 18:27:24 2005) v2.6.12-rc3-461-g84e48b6 is on master v2.6.12-rc3-461-g84e48b6 is on v2.6.12-n [...] 

这个程序没有考虑挑选利益的影响,只是合并操作。

例如,发现c0118fa提交来自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 

UPD
或者只是一个命令:

 git log 56a44a5..HEAD --ancestry-path --merges --oneline --color | tail -n 1 

git branch --contains <ref>是最明显的“瓷器”命令来做到这一点。 如果你想只用“pipe道”命令做类似的事情:

 COMMIT=$(git rev-parse <ref>) # expands hash if needed for BRANCH in $(git for-each-ref --format "%(refname)" refs/heads); do if $(git rev-list $BRANCH | fgrep -q $COMMIT); then echo $BRANCH fi done 

(从这个SO答案的 crosspost)

可怜的人的select是在HEAD上使用工具tig 1 ,search提交,然后直观地跟随提交的行,直到看到合并提交。 默认的合并消息应该指定哪个分支被合并到哪里:)

1 Tig是一个基于ncurses的git文本模式界面。 它主要作为一个Git仓库浏览器,但也可以帮助分阶段提交更改,并充当各种Git命令输出的传呼机。

作为一个实验,我做了一个提交后的钩子,在提交元数据中存储关于当前检出的分支的信息。 我也稍微修改了gitk来显示这些信息。

你可以在这里查看: https : //github.com/pajp/branch-info-commits

find当地的分支

 grep -lR YOUR_COMMIT .git/refs/heads | sed 's/.git\/refs\/heads\///g' 

find远程分支

 grep -lR $commit .git/refs/remotes | sed 's/.git\/refs\/remotes\///g' 

除了search所有的树,直到你find一个匹配的散列,没有。