web-dev-qa-db-ja.com

切り離されたHEAD状態で現在のgitブランチを見つける方法

次のいずれかを実行することで、現在のgitブランチ名を見つけることができます。

git branch | awk '/^\*/ { print $2 }'
git describe --contains --all HEAD

しかし、デタッチされたHEAD状態、たとえば Jenkins mavenビルドのポストビルドフェーズ(またはTravis git fetch)の場合、これらのコマンドは作業。

私の現在の作業解決策はこれです:

git show-ref | grep $(git log --pretty=%h -1) | sed 's|.*/\(.*\)|\1|' | sort -u | grep -v HEAD

HEAD tipに最後のコミットがあるブランチ名を表示します。これは正常に動作しますが、git-fuがより強力な誰かがより良い解決策を持っていると思いますか?

46
neu242

より磁器的な方法:

git log -n 1 --pretty=%d HEAD

# or equivalently:
git show -s --pretty=%d HEAD

参照は(HEAD, master)の形式でリストされます。これを人間が使用するのではなくスクリプトで使用する場合は、少し解析する必要があります。

自分でもう少しきれいに実装することもできます:

git for-each-ref --format='%(objectname) %(refname:short)' refs/heads | awk "/^$(git rev-parse HEAD)/ {print \$2}"

候補の参照を別の行で取得するという利点があり、余分な文字はありません。

36
Cascabel

Jenkinsにはブランチのローカルコピーがないため、少し異なるソリューションが必要でした。したがって、現在のコミットはリモートブランチと照合する必要があります。

git ls-remote --heads Origin | grep $(git rev-parse HEAD) | cut -d / -f 3

またはネットワークなし:

git branch --remote --verbose --no-abbrev --contains | sed -rne 's/^[^\/]*\/([^\ ]+).*$/\1/p'

同じコミットで複数のブランチヘッドがある場合、複数のブランチ名が返される可能性があることにも注意してください。

更新:

JenkinsがGIT_BRANCHのような値を含むOrigin/master環境変数を設定することに気づきました。これはJenksinでgitブランチを取得するためにも使用できます。

echo $GIT_BRANCH | cut -d / -f 2
26
Epeli
git branch --contains HEAD

明らかに破棄(ブランチなし)。もちろん、現在のHEAD(もちろん、no-branchに入った方法によっては何もない)を表す)を記述できる任意の数のブランチを取得する可能性があります。ローカルブランチ(常にgit merge --no-ffを使用する必要がある多くの理由の1つ)。

9
Seth Robertson

git symbolic-ref HEAD 戻り値 refs/heads/branchnameブランチにいる場合、ブランチにいない場合はエラー。

1
Gaelan

git nthlastcheckout、最後のn回目のチェックアウトに使用した正確な文字列をreflogから取得します。

git config --global alias.nthlastcheckout '!nthlastcheckout'"() {
        git reflog |
        awk '\$3==\"checkout:\" {++n}
             n=='\${1-1}' {print \$NF; exit}
             END {exit n!='\${1-1}'}'
}; nthlastcheckout \"\$@\""

例:

$ git nthlastcheckout
master
$ git nthlastcheckout 2
v1.3.0^2
1
jthill