繁体   English   中英

git log —显示提交适用于哪些分支

[英]git log — show which branches a commit applies to

在我的公司工作流程中,我们经常必须在多个维护分支之间应用类似的提交。 因为我们处于重塑重构的阶段,所以我们使用独立的提交(在可能的情况下进行樱桃采摘,但是通常是不可能的)而不是通过合并来实现。 有关于更改为更多git-flow工作流并始终向上合并的讨论,但是出于多种原因,当前并非如此。

我经常发现自己想知道-我是否对所有需要提交的分支都应用了特定的提交? 我可以通过以下方式达成目标:

 git log --all --grep "Issue_number"

这给了我一个带有相关消息号的所有提交的列表,与分支无关。 如果我只能列出所有提交适用的分支,那么我将很满意(目前)。

我已经尝试使用“ 如何知道” git log”提交属于哪个分支中的一些建议 ”,但这些似乎无济于事。

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

也许--decorate可能就是您想要的东西?

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

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

根据orahman的回答和手册页,我进行了一些反复试验,发现

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

做到了。

除非我搞砸了测试,否则似乎需要同时使用“ = full”和“ --source”才能显示任何分支信息,但是我无法解释为什么atm是这种情况。

挑战在于您的提交具有不同的哈希值,因为它们是经过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

当然,这些解决方案中的任何一个都可以别名为更短的名称。

提交总能找到他们自己的祖先,但找不到他们的父母,因此一旦找到提交,就无法再到提交树中查找可到达的分支提示。

您可以先向每个分支询问与您的问题编号匹配的提交,然后以友好的方式打印它们,而不是先查找提交然后从中查找分支。

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

$ 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

因此,现在,假设符合您的实际情况,您可以列出所有分支并在该分支上运行git log命令,然后查找该输出以有条件地显示,从而找到包含[Issue_1]的所有分支的名称。 例如:

# 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

可能有更漂亮的方法来完成此操作,但我认为一般原则是,您需要向分支机构询问其提交,而不是查找提交然后向后工作到分支。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM