有没有办法通过给定的SHA-1哈希值找出提交来自哪个分支?
如果您能告诉我如何使用Ruby Grit完成此操作,将获得额外的奖励。
有没有办法通过给定的SHA-1哈希值找出提交来自哪个分支?
如果您能告诉我如何使用Ruby Grit完成此操作,将获得额外的奖励。
rm -rf /tmp/r1 /tmp/r2; mkdir /tmp/r1; cd /tmp/r1
git init; git config user.name n; git config user.email e@x.io
git commit -m"empty" --allow-empty; git branch -m b1; git branch b2
git checkout b1; touch f1; git add f1; git commit -m"Add f1"
git checkout b2; touch f2; git add f2; git commit -m"Add f2"
git merge -m"merge branches" b1; git checkout b1; git merge b2
git clone /tmp/r1 /tmp/r2; cd /tmp/r2; git fetch origin b2:b2
set -x;
cd /tmp/r1; git log --oneline --graph --decorate; git reflog b1; git reflog b2;
cd /tmp/r2; git log --oneline --graph --decorate; git reflog b1; git reflog b2;
+ cd /tmp/r1
+ git log --oneline --graph --decorate
* f0c707d (HEAD, b2, b1) merge branches
|\
| * 086c9ce Add f1
* | 80c10e5 Add f2
|/
* 18feb84 empty
+ git reflog b1
f0c707d b1@{0}: merge b2: Fast-forward
086c9ce b1@{1}: commit: Add f1
18feb84 b1@{2}: Branch: renamed refs/heads/master to refs/heads/b1
18feb84 b1@{3}: commit (initial): empty
+ git reflog b2
f0c707d b2@{0}: merge b1: Merge made by the 'recursive' strategy.
80c10e5 b2@{1}: commit: Add f2
18feb84 b2@{2}: branch: Created from b1
+ cd /tmp/r2
+ git log --oneline --graph --decorate
* f0c707d (HEAD, origin/b2, origin/b1, origin/HEAD, b2, b1) merge branches
|\
| * 086c9ce Add f1
* | 80c10e5 Add f2
|/
* 18feb84 empty
+ git reflog b1
f0c707d b1@{0}: clone: from /tmp/r1
+ git reflog b2
f0c707d b2@{0}: fetch origin b2:b2: storing head
git log 80c10e5..HEAD --ancestry-path --merges --oneline --color | tail -n 1
和 git log 086c9ce..HEAD --ancestry-path --merges --oneline --color | tail -n 1
命令的输出是什么? - Eugen Konkov$ git log HEAD^1..HEAD --ancestry-path --merges --oneline --color | tail -n 1
,它产生了376142d merge branches
,以及$ git log HEAD^2..HEAD --ancestry-path --merges --oneline --color | tail -n 1
,它产生了376142d merge branches
。这显示了合并提交摘要,这可以在创建合并时被覆盖,可能混淆合并的分支历史。 - qneill如果你关心Shell退出状态,请使用以下内容:
branch-current
- 当前分支的名称branch-names
- 干净的分支名称(每行一个)branch-name
- 确保只返回branch-names
中的一个分支branch-name
和branch-names
都可以接受提交作为参数,并且如果没有给出,则默认为HEAD
。
branch-current = "symbolic-ref --short HEAD" # https://dev59.com/Hm025IYBdhLWcg3wCxZN#19585361
branch-names = !"[ -z \"$1\" ] && git branch-current 2>/dev/null || git branch --format='%(refname:short)' --contains \"${1:-HEAD}\" #" # https://dev59.com/Hm025IYBdhLWcg3wCxZN#19585361
branch-name = !"br=$(git branch-names \"$1\") && case \"$br\" in *$'\\n'*) printf \"Multiple branches:\\n%s\" \"$br\">&2; exit 1;; esac; echo \"$br\" #"
% git branch-name eae13ea
master
% echo $?
0
0
。
保留HTML。
% git branch-name 4bc6188
Multiple branches:
attempt-extract
master%
% echo $?
1
1
。remote-fetch = !"branch=$(git branch-name \"$1\") && git config branch.\"$branch\".remote || echo origin #"
git checkout <SHA>
-> 会使你进入分离 HEAD 状态。
git rev-parse --abbrev-ref HEAD
-> 将打印出 HEAD
,因此此命令在此状态下不起作用。
现在我们处于分离的 HEAD 状态,我们可以使用以下命令来获取分支名称。
PS:如果您不处于分离的 HEAD 状态,则此命令将无法正常工作!
git branch -a --contains HEAD | sed -n 2p | awk '{ printf $1 }'
完成了!现在你有分支名称了。
我认为有些人可能会遇到同样的问题,即无法找到分支,尽管它实际上存在于一个分支中。
最好先全部拉取:
git pull --all
然后进行分支搜索:
git name-rev <SHA>
或者:
git branch --contains <SHA>
查找本地分支:
grep -lR YOUR_COMMIT .git/refs/heads | sed 's/.git\/refs\/heads\///g'
查找远程分支:
grep -lR $commit .git/refs/remotes | sed 's/.git\/refs\/remotes\///g'
除了在整个树中搜索匹配的哈希值,没有其他方法。