Git:试图跟踪哪些远程分支引入了文件

时间:2014-06-05 15:36:16

标签: git

在当前项目中,我们维护多个远程分支。例如:

[me@server]$ git branch -a
  master
* featureX
  remotes/origin/HEAD -> origin/master
  remotes/origin/featureX
  remotes/origin/featureY

现在让我们说以下事件发生:

  1. 我将“myfile.php”添加到featureX并将其推送到遥控器/ origin / featureX
  2. 功能X已完成,因此我将其合并回主人。
  3. 我们启动了一个名为Feature Z(remotes / origin / featureZ)的新项目,它是一个来自master的新分支,所以它中有myfile.php。
  4. 功能Z上的开发人员对该文件进行了更改并提交,但尚未将其合并。
  5. 此时,是否可以显示myfile.php的日志,该日志显示文件被主动更改或引入的远程分支?例如:

    myfile.php Changelog:
    2014-06-05 :: DeveloperZ  :: remotes/origin/featureZ  (updated)
    2014-06-04 :: DeveloperMe :: remotes/origin/master    (merged)
    2014-06-03 :: DeveloperMe :: remotes/origin/featureX  (created)
    

    我一直在努力阅读类似的请求,但我有点失落。听起来像快进(在我们的项目中使用)会导致一些问题。

2 个答案:

答案 0 :(得分:2)

您当然可以找到引入该文件的提交,但提交和分支之间没有永久关系。如果你单独留下功能分支,那么你可以找出关系:

                                                            master
*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*
    \               /               \               /
     X---*---*---*--                 *---*---*---*--
                 featureX                         featureZ

假设提交'X'引入了有问题的文件。提交'X'将被列为分支主机,featureX和featureZ。提交结构很明显,该文件是在featureX中引入的。你可以写一个脚本来弄清楚提交'X'的分支是哪个'最接近'。

如果您删除了分支,那么您仍然可以看到与其相关的功能分支提交结构,但git中没有任何关于功能分支的指示。大概提交消息或源代码注释会告诉您正在处理的功能是什么。


要使用git branch --contains计算出来,您可以执行以下操作:

> git branch --contains X
master
featureZ
featureX
> git branch --contains master
master
> git branch --contains featureZ
master
featureZ
> git branch --contains featureX
master
featureZ
featureX

由于分支featureX由提交X包含在同一组分支中,因此这是引入X的功能分支。

答案 1 :(得分:1)

编辑: @Cupcake促使我提供了一个更完整的答案,一个处理你提到的快进 1 的答案。

对文件历史的一个非常好的整体调查是

git log --graph --decorate --oneline \2
        --branches \
        --simplify-by-decoration -- path/to/file

要查找内容的介绍提交,

 git blame file

查找引入路径的最旧提交:

  

git log --oneline -- file | tail -n1

要查找从提交到当前结帐的合并历史记录,无论您是否仍在跟踪该分支:

 git log --ancestry-path --merges --oneline commit..@
但这会错过快进。您可以添加--simplify-by-decoration以查看其中的任何仍然有效的引用。


...取决于您的项目如何使用标签,其中一些可能产生足够的噪音令人讨厌。您可以使用这个小怪物删除单标记提交:

# eliminate single-tag-commit clutter from the above output:

git log --color=always --rest-of-args \
| grep -v '([^:,]*tag:[^,]*)' \
| less -r

1 快速前进建立干净的可发布树枝,但是你发现并没有那么多地整合那些树枝的拉力。
2 我发现git alias lgdo '!git log --graph --decorate --oneline ${@---all}'非常有用。