簡體   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