在git中,如何找到创建分支的修订版?

bas*_*ero 17 tags git methodology branch release-management

更新:示例存储库,https://github.com/so-gitdemo/so-gitdemorepo

在github repo的上下文中.如何轻松找到rev"b0430cee"?我知道我可以看一下,但这个存储库模仿的真实例子有十几个提交者和多个其他分支.不太容易使用检查.

当分支多次合并时,如何找到分支创建修订?

我知道这个问题:如何确定何时创建Git分支?

该解决方案似乎不适用于已多次合并的分支.我们通常将错误修复从发布分支合并到主分支.也许我们甚至把这部分做错了......对git来说还是新手.

想象一下以下简单.真实的东西在多个人的主/分支上有更多的提交.还有几个发布分支(想想1.0,1.1,1.2,1.3)

        Future dev  ?
                    |
                    |
   Merge 1.0 back   *  ? Potential future fixes
                    |\ |
                    | \|  
                    |  \
           New work *  |
                    |  * Emergency bug fix
                    |  |
   Merge 1.0 back   *  |
                    |\ |
                    | \|
                    |  * Another bug fix
                    |  |
                    |  |
        New feature *  * First bugfix on branch 1.0
                    |  /
                    | /
                    |/
                    * Feature
                    |
                    |
                    |
                    * Some  feature
                    |
                    |
                    |
                    * The past (master)
Run Code Online (Sandbox Code Playgroud)

我们仍然是git的新手,并且正在制定管理版本和分支的最佳方法,我们已经决定我们需要追溯性地向repo添加一些标签.例如1.0分支用于1.0分支的开始,后来1.0.1标记用于修复版本.

后续奖金问题:添加我想要的标签的最佳方法是什么?我应该在哪个版本上标记?首先提交新分支?或分支提交前的第一个常见提交?

seh*_*ehe 6

在阅读这个问题时,我会对你所提出的问题进行一些反复的讨论.

如果你真的只想要一个分支的根,我想你想要的东西就像

git rev-list --merges --boundary branch1 branch2 | tail -1
Run Code Online (Sandbox Code Playgroud)

如果您想验证分支实际上是相关的

git rev-list --left-right --merges --boundary branch1 branch2 | 
    grep '^-' | 
    tail -1 |
    cut -c2-
Run Code Online (Sandbox Code Playgroud)

但是,机会是相当高,你想

git merge-base branch1 branch2
Run Code Online (Sandbox Code Playgroud)

此外,下次您需要漂亮的燕尾图时,以下内容将证明是有用的:

git show-branch # [--mergebase] branch1 branch2
Run Code Online (Sandbox Code Playgroud)

您可以使用git log获得更多控制:

 git log --graph --left-right --merges --boundary HEAD MP26/MP26

>   commit 0118d9979d1d27f08fa14cddfffa3e9c2cd5fe9c
|\  Merge: 8958c53 e1cd319
| | Author: Seth Heeren <seth.heeren@xxxx>
| | Date:   Fri Feb 18 12:05:49 2011 +0100
| |
| |     Merge branch 'MP26' into tmp
| |
| o commit e1cd31926d01c08092a95226ac7b49bbea19ac92
|   Author: Seth Heeren <seth.heeren@xxxx>
|   Date:   Thu Feb 17 16:39:17 2011 +0100
|
|       xxxxx
|
o commit 8958c534b034cbb28bf1e853de0bfec0a9b0ddbb
  Author: Seth Heeren <seth.heeren@ocwduo.nl>
  Date:   Fri Feb 18 12:05:30 2011 +0100

      fixup
Run Code Online (Sandbox Code Playgroud)

--decorate如果您喜欢显示分支名称,Git日志也支持该选项git show-branch

  • 'git merge-base' 查找从分支到 master 的最近一次合并。我想找到 master 和 branch FIRST 何时发生分歧 (2认同)

seh*_*ehe 6

既然你添加了一个git repo ...我远程工作以测试内容.

如何轻松找到rev"b0430cee"?

在那种情况下,这个漂亮的oneliner为我做了这个工作:

git rev-list --reverse --topo-order --left-right --boundary 1.0...master | 
    grep "^>" -B1 |
    head -1 |
    cut -c2-
Run Code Online (Sandbox Code Playgroud)

如果你想获得469c14a1fa8a40237700(New feature work),这对我有用:

git rev-list --reverse --topo-order --left-right --boundary 1.0...master | 
    grep "^>" |
    head -1 |
    cut -c2-
Run Code Online (Sandbox Code Playgroud)

HTH


Mar*_*air 5

也许我误解了这个问题,但分支是由其尖端的提交定义的,并且该提交的每个祖先都包含在分支中。例如,假设emergency-bug-fix有一个分支,其尖端位于Emergency bug fix您的图中 - 该分支上最旧的提交将是The past (master)。如果您只查看提交图,“创建分支的修订版”并不是一个明确定义的概念。

如果您只关心何时在特定存储库中创建分支,则可以使用“reflog” - 例如,查看以下输出中的最后一行:

git reflog show emergency-bug-fix
Run Code Online (Sandbox Code Playgroud)

但是,该命令的结果因存储库而异,具体取决于引用的创建时间(例如通过获取或推送)。此外,默认情况下,reflog 条目会在 90 天后过期,它可能不再包含该信息。如果您有一个受祝福的中央存储库,您可以在那里进行相同的尝试,这可能会为您提供在中央存储库中首次创建该引用的提交。但是,我认为这不是您想要的解决方案。

正如您已经正确计算出的那样,最好只在提交图中标记您感兴趣的点。Magnus Skog 的答案告诉您如何做到这一点。