在我的公司工作流程中,我们经常需要在多个维护分支中应用类似的提交。因为我们正处于升沉重构的时期,所以我们使用独立提交(尽可能采摘樱桃,但通常不可能),而不是合并。有关于更改为更多git-flow工作流程并且总是向上合并的讨论,但不同的原因目前不是这种情况。
我经常发现自己想要知道 - 我是否已将特定提交应用于所有需要它的分支?我可以参与其中:
git log --all --grep "Issue_number"
这给了我一个包含相关消息号的所有提交的列表,与分支无关。如果我只能让它列出这些提交所适用的所有分支,我会满意(现在)。
我已尝试使用How to know which branch a "git log" commit belongs to?中的一些建议,但这些似乎没有帮助。
有人可以告诉我如何做到这一点吗?
答案 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-dev
和2.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
。
可能有更好的方法来实现这一目标,但我认为一般原则是你需要向分支机构询问他们的提交,而不是找到提交然后再向分支机构工作。