如何獲取對某個檔案進行更改的所有分支的串列?
背景關系:當開始編輯某個檔案時,查看同一檔案上存在哪些未合并的更改可能會很有趣。
我們可以假設所有已經合并的分支也都被洗掉了。但是,如果我們可以過濾 [main] 之前的分支,那將是一個加分項。
uj5u.com熱心網友回復:
我不知道有一種純粹的 git 方式來做到這一點。但是,您可以通過 Bash one-liner 來實作這一點:
$ git branch --no-merged | xargs -I branch bash -c "git diff --stat master...branch | grep -q rails/apps/main/Gemfile.lock && echo branch"
git branch -a --no-merged會給你所有未合并的分支;本地和遠程 ( -a) 通過管道將其傳輸到 xargs 以對每一行輸出運行以下命令并替換branch為實際的分支名稱 ( -I branch):
bash -c "..."在新 Bash 中運行帶引號的引數,以便我們可以在下一個命令的輸出上使用|和&&xargs 的輸出。
git diff --stat master...branch列出該分支更改的所有檔案。grep -q path/to/Gemfile.lock將成功或失敗退出的管道( -q)。成功時 ( &&) 回顯分支名稱。
uj5u.com熱心網友回復:
更新所有遠程跟蹤分支,
git fetch origin refs/heads/*:refs/remotes/origin/*
列出所有遠程跟蹤分支,
git for-each-ref refs/remotes/origin --format='%(refname:short)'
檢查每個遠程跟蹤分支,如果它有一些新的提交,無法從main,觸及某個檔案foo.bar。如果有,列印分支名稱并提交。結合git for-each-ref,
git for-each-ref refs/remotes/origin --format='%(refname:short)' | while read ref;do
commits=$(git log --pretty=%H main..${ref} --follow -- foo.bar)
if [[ "$commits" != "" ]];then
echo $ref $commits
fi
done
uj5u.com熱心網友回復:
您可以使用 bash 函式來執行此操作,您可以選擇將其設為 Git 別名。
function git_where_changed {
for commit in $(git rev-list --all -- $1); do
if ! git merge-base --is-ancestor $commit main; then
git branch -a --contains $commit
fi
done | sort -u | sed -E 's/^ //';
}
重新加載后.bashrc,您將作為git_where_changed path/to/file.
git rev-list --all列出屬于任何分支或標簽的每個提交。將結果限制為更改了與函式 ( )-- $1的第一個引數匹配的檔案的提交。path/to/file
git merge-base --is-ancestor $commit main檢查第一個提交($commit,取自rev-list輸出)是否是第二個提交(main分支的頭部)的祖先。如果是這樣,則該提交已經合并,我們可以忽略它。
git branch -a --contains $commit生成$commit屬于其中一部分的分支串列。-a包括跟蹤的遠程分支;沒有這個,將只包括本地分支機構。
在for回圈結束時,可能會有很多重復的分支名稱,例如,如果有一個未合并的分支多次更改了檔案。sort -u按字母順序對分支名稱進行排序并洗掉重復項。最后,sed -E 's/^ //'洗掉git branch通常位于其輸出前面的空格(-E啟用擴展的正則運算式語法)。
作為別名,它看起來像這樣([alias]在您的標題下.gitconfig):
where-changed = "!f() { for commit in $(git rev-list --all -- $1); do if ! git merge-base --is-ancestor $commit main; then git branch -a --contains $commit; fi; done | sort -u | sed -E 's/^ //'; };f"
這將允許您運行git where-changed path/to/file,如果您在 Windows 上使用 Git 而不是使用 Git Bash,這可能會更方便。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/521424.html
標籤:混帐分支
上一篇:無法決議androidx.appcompat:appcompat:1.5.1-AndroidStudio中的Gradle出錯
