git log - 显示提交适用于

时间:2015-07-28 12:02:13

标签: git

在我的公司工作流程中,我们经常需要在多个维护分支中应用类似的提交。因为我们正处于升沉重构的时期,所以我们使用独立提交(尽可能采摘樱桃,但通常不可能),而不是合并。有关于更改为更多git-flow工作流程并且总是向上合并的讨论,但不同的原因目前不是这种情况。

我经常发现自己想要知道 - 我是否已将特定提交应用于所有需要它的分支?我可以参与其中:

 git log --all --grep "Issue_number"

这给了我一个包含相关消息号的所有提交的列表,与分支无关。如果我只能让它列出这些提交所适用的所有分支,我会满意(现在)。

我已尝试使用How to know which branch a "git log" commit belongs to?中的一些建议,但这些似乎没有帮助。

有人可以告诉我如何做到这一点吗?

4 个答案:

答案 0 :(得分:1)

也许--decorate可能就是你要找的东西?

git log --decorate --all --grep "Issue_number"

这将在日志中每个条目的提交哈希之后立即添加分支名称。

答案 1 :(得分:1)

根据奥拉曼的答案和手册页,我做了一些试验和错误,发现

git log --decorate=full --source --all --grep "commit#"

做了这个伎俩。

除非我搞砸了测试,否则它似乎都是" =完全"和" - 来源"需要显示任何分支信息,但我无法解释为什么会出现这种情况。

答案 2 :(得分:0)

挑战在于您的提交有不同的哈希值,因为它们已被cherry-pick编辑。如果您正在搜索包含一个提交的分支,则可以使用git branch --contains

git branch --contains abcd123
# * master
#   develop

有几种方法可以继续。您可以将git log找到的提交直接导入git branch --contains

git log --all --grep "Issue_number" | git branch --contains
# * master

这只显示找到的分支。如果你想看到提交哈希值,你可以使用一个循环,例如

之类的东西
for COMMIT in $(git log --all --grep "Issue_number" --pretty=format:%H); do
    echo "$COMMIT" 
    git branch --contains "$COMMIT"
done
# abcd123
# * master
#   develop
# deadbeef
#   feature1

当然,这些解决方案中的任何一个都可能会混淆更短的东西。

答案 3 :(得分:0)

提交者总能找到自己的祖先,但不能找到他们的父母,所以一旦找到了提交,就不能通过提交树来查找可以访问的分支提示。

您可以向每个分支机构询问与您的问题编号匹配的提交,然后以友好的方式打印这些提交,而不是先找到提交然后再找到这些提交的分支。

这是一个提交树,我认为,它显示了您正在使用的工作流程:

$ git log --graph --decorate --pretty=oneline --abbrev-commit --all
* c332e51 (HEAD -> 1.x-dev) [Issue_4] Fix a problem with bar.
* a5a1c89 Add some copy to foo.
* b2e21e4 [Issue_3] Get baz some copy.
* 62df79a [Issue_2] Tweak bar a bit.
* 0c10193 [Issue_1] Adjust foo.
| * ab3f45f (2.x-dev) [Issue_3] Get baz some copy.
| * db14d19 [Issue_2] Tweak bar a bit.
| * 8722417 [Issue_1] Adjust foo.
| * 091fd82 Tweak baz.
|/
* eb9dace (master) This is bar
* 26d9260 Adjust foo.
* 15cd4ef Added some files.
* d73dbe7 Initial commit

我有两个开发分支(1.x-dev2.x-dev)。我已经在提交消息的开头用字符串[Issue_NN]表示了问题修复提交(主要是为了让它很容易从树中看到)。我已经选择了从分支到分支的问题提交。您可以看到问题1-3适用于两个分支,但问题4仅适用于1.x-dev

所以现在,假设与您的练习相匹配,您可以通过列出所有分支并在该分支上运行[Issue_1]命令来查找包含git log的所有分支的名称,然后重新排列输出有条件地显示。例如:

# grab branch names from refs/heads
for branch in $(git for-each-ref --format='%(refname:short)' refs/heads/); \
  # set a var to the log line of the matching commit, if any
  do commit=$(git log --pretty=oneline --abbrev-commit --grep "Issue_3" $branch); \
  # list the branch and commit info if it matches
  [[ $commit != "" ]] && echo "$branch: $commit"; \
  done

此代码查找Issue_3,如果您运行它,则输出如下:

1.x-dev: b2e21e4 [Issue_3] Get baz some copy.
2.x-dev: ab3f45f [Issue_3] Get baz some copy.

但是,如果您为Issue_4运行它,那么:

1.x-dev: c332e51 [Issue_4] Fix a problem with bar.

您可以看到Issue_4提交仅适用于1.x-dev

可能有更好的方法来实现这一目标,但我认为一般原则是你需要向分支机构询问他们的提交,而不是找到提交然后再向分支机构工作。