[英]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-dev
和2.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.