显示提交的原始分支

Cra*_*ker 36 git branch git-branch

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

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

hui*_*ker 41

就像其他人所说的那样,如果您要查找的分支不是您要归咎于此提交的存储库的本地(例如,仅在远程开发人员的个人存储库中的分支),您就会被搞砸.

但是假设你可以看到那些抢手的分支,当然你有提交的哈希,比方说d590f2...,部分答案就是你能做到:

$ git branch --contains d590f2
  tests
* master
Run Code Online (Sandbox Code Playgroud)

然后,只是为了确认你有罪魁祸首:

$ git rev-list tests | grep d590f2
Run Code Online (Sandbox Code Playgroud)

当然,如果d590f2已合并到多个分支中,则必须比此更精细.

  • 如果3个月后,一个提交现在属于多个分支,那么您的策略将如何给我原始的分支名称?注意,可以有快速前进/非快速前进合并。 (2认同)

ara*_*nid 10

这在git中并不适用.分支是每个存储库的本地概念:一个人的"本地东西"分支可以与另一个人的"本地东西"分支完全分开.如果您执行某些操作,例如查看主集成分支和查询提交,以及删除两者之间的所有合并基础,您应该能够获得提交历史记录的子树,这可能会产生一些启发...或者可能不会.例如,如果你追踪从查询提交到"master"的链接,你应该希望找到合并提交和有用的注释,说明合并的来源......但是这些信息只是提供信息,而不是以某种方式记录,以便自动检索.

例如gitk some-commit...master(几乎是短暂的gitk some-commit master --not $(git merge-base some-commit master))


Mot*_*Mot 8

Git分支只不过是"指向提交的命名指针"(这是一个与其他众所周知的VCS不同的基本概念).

这种情况很明显,提交A打开branch-1,提交B branch-2:

  o A [branch-1]
  |
o | B [branch-2]
| |
Run Code Online (Sandbox Code Playgroud)

合并后不清楚A(或B)最初是否打开branch-1branch-2:

o [branch-1] [branch-2]
|
o merged 
|\
| o A
| |
o | B
| |
Run Code Online (Sandbox Code Playgroud)

如果你有标记的A的父提交,也许你可以猜测提交A是什么Git分支,例如release-1,你知道这个标记仅用于提交branch-1.

o [branch-1] [branch-2]
|
o merged 
|\
| o A
| |
o | B
| |
| o <release-1]
| |
Run Code Online (Sandbox Code Playgroud)

  • 一般来说,在Git中,提交不在分支上,分支在提交中. (5认同)

Cha*_*esB 6

我试试,请评论,因为不完全确定,但我相信它做的工作.

仅当分支仍然指向合并到master之前的尖端时,以下内容才有效,如果分支在同一个repo上,则会出现这种情况:

o [master]
|
o merged branch "great-feature" into master
|\
| o A [great-feature]
| |
o | B
| |
Run Code Online (Sandbox Code Playgroud)

如果不是这种情况(例如,如果您从另一个回购中提取),您仍然可以手动重新创建它们.

首先获取您的提交所在的分支:

$ git branch -a --contains=<sha-of-B>
*master
great-feature
Run Code Online (Sandbox Code Playgroud)

然后为每个分支获取将其头部与提交分开的提交数:这是输出指定范围的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
Run Code Online (Sandbox Code Playgroud)

所以B离大特征最近,这意味着它是在它中创建的.

这可以做成一个很好的脚本,随意添加到答案中(我不擅长这个)


小智 5

首先确保您从远程获取了更改

$ git fetch --all
Run Code Online (Sandbox Code Playgroud)

和,

$ git branch -a --contains d590f2
Run Code Online (Sandbox Code Playgroud)

没有-a选项,您将找不到仅存在于远程分支上的提交


Eug*_*kov 5

当您在分支上时,“原始分支”被合并到。你可以运行:

git log <SHA>..HEAD --ancestry-path --merges
Run Code Online (Sandbox Code Playgroud)

此命令将显示merge之间的所有提交<SHA>..HEAD。你需要最后一个。

例如,对于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
Run Code Online (Sandbox Code Playgroud)

你应该运行:

git log c0118fa..HEAD --ancestry-path --merges
Run Code Online (Sandbox Code Playgroud)

向下滚动找到最后一次提交。这是:

commit a435005445a6752dfe788b8d994e155b3cd9778f
Merge: 0953cac a06cc29
Author: Eugen Konkov
Date:   Sat Oct 1 00:54:18 2016 +0300

    Merge branch 'redesign_interactions' into clean_api
Run Code Online (Sandbox Code Playgroud)