Gitブランチの最も近い親を見つける方法は?


419

次のようなローカルリポジトリに、次のようなコミットツリーがあるとします。

master --> a
            \
             \
      develop c --> d
               \
                \
         feature f --> g --> h

master私です、これは最新の安定版のコードでdevelop私がされ、これは「次へ」リリースコードで、そしてfeatureあるために準備されている新機能develop

フックを使用してリモートリポジトリで実行できるfeatureことfは、コミットがdevelopHEADの直接の子孫でない限り、プッシュが拒否されるようにすることです。つまり、機能がgit rebaseオンになっているため、コミットツリーは次のようになりdます。

master --> a
            \
             \
      develop c --> d
                     \
                      \
               feature f --> g --> h

だからそれは可能です:

  • の親ブランチを特定しfeatureますか?
  • f子孫である親ブランチのコミットを特定しますか?

そこから、親ブランチのHEADが何であるかをチェックし、f先行が親ブランチのHEADと一致するかどうかを確認して、機能をリベースする必要があるかどうかを判断します。


この質問は、親の親を見つけるために言い換える必要があります。
Tim Boland

回答:


348

リモートリポジトリに開発ブランチのコピーがあると仮定すると(最初の説明ではローカルリポジトリに記述されていますが、リモートにも存在するようです)、私が望むことを実現できるはずですが、アプローチあなたが想像していたものとは少し異なります。

Gitの履歴は、コミットのDAGに基づいています。ブランチ(および一般に「参照」)は、継続的に成長するコミットDAGの特定のコミットを指す一時的なラベルにすぎません。そのため、ブランチ間の関係は時間とともに変化する可能性がありますが、コミット間の関係は変化しません。

    ---o---1                foo
            \
             2---3---o      bar
                  \
                   4
                    \
                     5---6  baz

baz(の古いバージョン)に基づいているように見えbarますか?しかし、削除するとbarどうなるでしょうか。

    ---o---1                foo
            \
             2---3
                  \
                   4
                    \
                     5---6  baz

今でbazはに基づいてfooいるように見えます。しかし、の祖先はbaz変更されず、ラベル(および結果のぶら下がりコミット)を削除しただけです。そして、新しいラベルをに追加するとどうなり4ますか?

    ---o---1                foo
            \
             2---3
                  \
                   4        quux
                    \
                     5---6  baz

今でbazはに基づいてquuxいるように見えます。それでも、祖先は変更されず、ラベルのみが変更されました。

しかし、「コミットはコミット6の子孫3ですか?」(3および6が完全なSHA-1コミット名であると想定)、barおよびquuxラベルが存在するかどうかに関係なく、答えは「はい」になります。

したがって、「プッシュされたコミットは開発ブランチの現在の先端の子孫ですか?」のような質問をすることができますが、「プッシュされたコミットの親ブランチは何ですか?」

あなたが望むものに近づくように思われる最も信頼できる質問は:

プッシュされたコミットのすべての祖先(開発の現在のヒントとその祖先を除く)について、現在の開発のヒントを親として持っています。

  • そのようなコミットが少なくとも1つ存在しますか?
  • そのようなコミットはすべて単一親コミットですか?

これは次のように実装できます。

pushedrev=...
basename=develop
if ! baserev="$(git rev-parse --verify refs/heads/"$basename" 2>/dev/null)"; then
    echo "'$basename' is missing, call for help!"
    exit 1
fi
parents_of_children_of_base="$(
  git rev-list --pretty=tformat:%P "$pushedrev" --not "$baserev" |
  grep -F "$baserev"
)"
case ",$parents_of_children_of_base" in
    ,)     echo "must descend from tip of '$basename'"
           exit 1 ;;
    ,*\ *) echo "must not merge tip of '$basename' (rebase instead)"
           exit 1 ;;
    ,*)    exit 0 ;;
esac

これは、制限したいものの一部をカバーしますが、すべてではありません。

参考までに、ここに拡張された例の履歴を示します。

    A                                   master
     \
      \                    o-----J
       \                  /       \
        \                | o---K---L
         \               |/
          C--------------D              develop
           \             |\
            F---G---H    | F'--G'--H'
                    |    |\
                    |    | o---o---o---N
                     \   \      \       \
                      \   \      o---o---P
                       \   \   
                        R---S

上記のコードは拒絶するために使用することができHかつS受け入れながらH'JK、またはN、それはまた、受け入れるだろうLP(彼らはマージを伴うが、彼らはの先端マージしていない開発を)。

また、拒否することLP、あなたが質問を変更して求めることができます

プッシュされたコミットのすべての祖先(開発の現在のヒントとその祖先を除く):

  • 2人の親とのコミットはありますか?
  • そうでない場合、少なくとも1つのそのようなコミットには、その(唯一の)親を開発するという現在のヒントがありますか?
pushedrev=...
basename=develop
if ! baserev="$(git rev-parse --verify refs/heads/"$basename" 2>/dev/null)"; then
    echo "'$basename' is missing, call for help!"
    exit 1
fi
parents_of_commits_beyond_base="$(
  git rev-list --pretty=tformat:%P "$pushedrev" --not "$baserev" |
  grep -v '^commit '
)"
case "$parents_of_commits_beyond_base" in
    *\ *)          echo "must not push merge commits (rebase instead)"
                   exit 1 ;;
    *"$baserev"*)  exit 0 ;;
    *)             echo "must descend from tip of '$basename'"
                   exit 1 ;;
esac

私はこれを得ます:git:fatal:あいまいな引数 '...':リビジョンとファイル名の両方。トリプルドットの意図は何ですか?
Jack Ukleja、2015年

1
@Schneider「...」がこの例のプレースホルダーになることを確信しています:コミットのSHAで置き換える場合、このチェックを実行しようとしています(たとえば、ブランチのHEAD)あなたは現在オンです)、すべてがうまくいきます。
Daniel Brady

この手の込んだ答えをありがとう!超便利です。同様のフックを作成したいのですが、開発ブランチの名前をハードコーディングしたくありません。つまり、親ブランチ以外のブランチへのリベースを防止するためのフックが必要です。私があなたの答えをよく理解している場合(私はbashなどについては初めてです)、これはあなたの答えには含まれていません。これを行う方法はありますか?
ケメイア2017

関連する質問に答えてもいいですか?REMOTEリポジトリでコードを機能させることができませんでした。ここではリモートリポジトリとの仕事にあなたのアプローチを適応させる方法についてのフォローアップの質問へのリンクは次のとおりです。 stackoverflow.com/questions/49619492/...
CodeMed

私が持っていたとき、これは私にとってはうまくいきませんでしたdevelop > release > feature、私は元に戻るでしょう、そしてそれは親を知ることを必要とします。私の問題の解決策は、stackoverflow.com
a / 56673640/2366390

241

言い換え

質問の別の言い方は、「現在のブランチ以外のブランチにある最も近いコミットとは何ですか?それはどのブランチですか?」です。

解決策

コマンドラインのちょっとした魔法でそれを見つけることができます

git show-branch \
| sed "s/].*//" \
| grep "\*" \
| grep -v "$(git rev-parse --abbrev-ref HEAD)" \
| head -n1 \
| sed "s/^.*\[//" 

AWK

git show-branch -a \
| grep '\*' \
| grep -v `git rev-parse --abbrev-ref HEAD` \
| head -n1 \
| sed 's/[^\[]*//' \
| awk 'match($0, /\[[a-zA-Z0-9\/-]+\]/) { print substr( $0, RSTART+1, RLENGTH-2 )}'

仕組みは次のとおりです。

  1. リモートブランチを含むすべてのコミットのテキスト履歴を表示します。
  2. 現在のコミットの祖先は星印で示されます。他のすべてを除外します。
  3. 現在のブランチのすべてのコミットを無視します。
  4. 最初の結果は、最も近い祖先ブランチになります。他の結果は無視してください。
  5. ブランチ名は[括弧内]に表示されます。大括弧の外のすべて、および大括弧を無視します。
  6. ブランチ名に〜#または^#が含まれる場合があり、参照されたコミットとブランチチップの間のコミット数を示します。気にしません。それらを無視してください。

そして結果

上記のコードを実行する

 A---B---D <-master
      \
       \
        C---E---I <-develop
             \
              \
               F---G---H <-topic

あなたを与えるdevelopあなたはHからそれを実行した場合と、masterあなたはI.からそれを実行した場合

コードは要旨として利用可能です


24
エラーの原因となった末尾のバックティックを削除しました。しかし、このコマンドを実行すると、大量の警告が表示され、各ブランチについて次のように文句を言っていますcannot handle more than 25 refs
Jon L.

1
@JoeChryslerは、2行ではなく1行にすることができると思いますackか。Macでは利用できないため、Macでも機能する可能性があります(誰かがで置き換えることを提案してackいますgrep
非極性14

53
申し訳ありませんが、それは間違っています。これは私のために働いた正しいものです:git show-branch | grep '*' | grep -v "$(git rev-parse --abbrev-ref HEAD)" | head -n1 | sed 's/.*\[\(.*\)\].*/\1/' | sed 's/[\^~].*//'
droidbot 2014

15
@droidbotいいですが、grep -v catch commitメッセージまたはブランチ名が別のブランチ名の一部である場合、refが削除されないように、パイプの並べ替えが必要です。git show-branch | sed "s/].*//" | grep "\*" | grep -v "$(git rev-parse --abbrev-ref HEAD)" | head -n1 | sed "s/^.*\[//"
gaal

3
@OlegAbrazhaevあなたの質問に答えてもらえたかどうかはわかりません。のgitエイリアスを使用:parent = "!git show-branch | grep '*' | grep -v \"$(git rev-parse --abbrev-ref HEAD)\" | head -n1 | sed 's/.*\\[\\(.*\\)\\].*/\\1/' | sed 's/[\\^~].*//' #"私のために働く
mduttondev

111

あなたも試すことができます:

git log --graph --decorate

5
git log --graph --decorate --simplify-by-decorationどこ--graphオプションです。
Na13-c

1
git log --graph --decorate --simplify-by-decoration --oneline
anishtain4

106

git parent

コマンドを実行するだけです

git parent

@Joe Chryslerの回答をgitエイリアスとして追加すると、ブランチの親を見つけることができます。使い方が簡単になります。

"~/.gitconfig"任意のテキストエディタを使用して、にあるgitconfigファイルを開きます。(Linuxの場合)。Windowsの場合、「。gitconfig」パスは通常、次の場所にありますc:\users\your-user\.gitconfig

vim  ~/.gitconfig

ファイルに次のエイリアスコマンドを追加します。

[alias]
            parent = "!git show-branch | grep '*' | grep -v \"$(git rev-parse --abbrev-ref HEAD)\" | head -n1 | sed 's/.*\\[\\(.*\\)\\].*/\\1/' | sed 's/[\\^~].*//' #"

保存してエディターを終了します。

コマンドを実行する git parent

それでおしまい!


5
これは素晴らしいソリューションです。期待される結果を保証するために、サンプル出力を追加することも役立ちます。実行すると、最後の行の前にいくつかの警告が表示されました。これは親ブランチの名前だと思います。
-ttemple

4
魅力的な作品!Windowsユーザーの場合、.gitconfigは通常c:\ users \ your-user \ .gitconfigにあります
zion

12
cannot handle more than 25 refs例外を取得します。
shajin

誰かがこれを編集して警告を処理できますか?@ttemple、できますか?
NIKHIL CM

@NIKHILCMはチャンピオンのように機能します。しかし、私はここで、親がブランチが作成した場所から何かを示しているのか、それとも他に何かを質問していますか?
Hariprasath

52

私はあなたの全体的な問題の解決策を持っています(featureがの先端から派生しているかどうかを判断しますdevelop)が、概説した方法を使用しても機能しません。

を使用git branch --containsして、の先端から派生したすべてのブランチをリストしdevelop、次にを使用grepしてfeatureそれらがブランチ内にあることを確認できます。

git branch --contains develop | grep "^ *feature$"

それらの中にある場合は、" feature"標準出力に出力され、戻りコードは0になります。そうでない場合は、何も出力されず、戻りコードが1になります。


1
これは機能しますが、参照が多いリポジトリでは時間がかかる可能性があることに注意してください。そのため、たとえばpre-receiveフックでの実行には、少し理想的ではありません。
ebneter 2016年

私はブランチを探していました、私たちはそれを呼び出します<branch>、私が実行した場所: git checkout -b <branch-2>から...これが答えです!本当にgrepは必要ありません。 git branch --contains <branch>
Poopy McFartnoise

44

これは私にとってはうまくいきます。

git show-branch | grep '*' | grep -v "$(git rev-parse --abbrev-ref HEAD)" | head -n1 | sed 's/.*\[\(.*\)\].*/\1/' | sed 's/[\^~].*//'

礼儀回答:@droidbotおよび@Jistanidiot


ええ、でも時々それはあなたをgrepから「壊れたパイプ」にしてしまいます。
Vladislav Rastrusny 2017年

1
*grepに渡す適切な正規表現ではありません。grep -F '*'またはgrep '\*'代わりに使用する必要があります。そうでなければ良い解決策。
arielf

出力がありませんでした。
Sandip Subedi 2018年

私のために働く....
roottraveller

11

上記の回答のいずれもリポジトリで機能しなかったため、次のように最新のマージを使用して、私自身の方法を共有したいと思いますgit log

#!/bin/bash
git log --oneline --merges "$@" | grep into | sed 's/.* into //g' | uniq --count | head -n 10

というスクリプトに入れます。これは、git-last-merges(現在のブランチではなく)ブランチ名を引数として、他のgit log引数も受け入れます。

出力から、独自の分岐規則と各ブランチからのマージの数に基づいて、親ブランチを手動で検出できます。

編集:git rebase子ブランチで頻繁に 使用する場合(およびマージが頻繁に早送りされるため、マージコミットが多すぎない場合)、この回答はうまく機能しないため、先のコミット(通常およびマージ)をカウントするスクリプトを書きました、および現在のブランチと比較して、すべてのブランチでのコミットの背後(親ブランチでのマージの背後にあるべきではない)。このスクリプトを実行して、うまくいくかどうかを教えてください

#!/bin/bash
HEAD="`git rev-parse --abbrev-ref HEAD`"
echo "Comparing to $HEAD"
printf "%12s  %12s   %10s     %s\n" "Behind" "BehindMerge" "Ahead" "Branch"
git branch | grep -v '^*' | sed 's/^\* //g' | while read branch ; do
    ahead_merge_count=`git log --oneline --merges $branch ^$HEAD | wc -l`
    if [[ $ahead_merge_count != 0 ]] ; then
        continue
    fi
    ahead_count=`git log --oneline --no-merges $branch ^$HEAD | wc -l`
    behind_count=`git log --oneline --no-merges ^$branch $HEAD | wc -l`
    behind_merge_count=`git log --oneline --merges ^$branch $HEAD | wc -l`
    behind="-$behind_count"
    behind_merge="-M$behind_merge_count"
    ahead="+$ahead_count"
    printf "%12s  %12s   %10s     %s\n" "$behind" "$behind_merge" "$ahead" "$branch"
done | sort -n

ありがとう。rebase頻繁に使用する場合(およびマージがfast-forward頻繁に編集される場合)、これはうまく機能しない場合があります。より良い解決策が見つかった場合は、回答を編集します。
saeedgnu 2016

1
唯一の?これまでの答えは、現在のブランチがマスターである場合、私にとってはうまくいった。他のほとんどのソリューションは、実際の親ブランチがないこの確かなエッジケースでランダムな(そして明らかに不正確な)結果を与えました。
arielf

これが私にとってうまくいった唯一の答えです。:代わりに、最初の10のリストの最初の親を取得するには、この使用することができます git log --oneline --merges "$@" | grep into | sed 's/.* into //g' | uniq --count | head -n 1 | cut -d ' ' -f 8
lots0logs

10

解決策

ソリューションのベースには、git show-branch私は1つでそれを組み合わせてきたので、私にとってはかなりの作業(下記参照)しませんでしたに基づくgit logと、これで終わりました。

git log --decorate --simplify-by-decoration --oneline \ # selects only commits with a branch or tag
      | grep -v "(HEAD" \                               # removes current head (and branch)
      | head -n1 \                                      # selects only the closest decoration
      | sed 's/.* (\(.*\)) .*/\1/' \                    # filters out everything but decorations
      | sed 's/\(.*\), .*/\1/' \                        # picks only the first decoration
      | sed 's/origin\///'                              # strips "origin/" from the decoration

制限と警告

  • HEADは切り離すことができます(多くのCIツールは、特定のブランチで正しいコミットを構築するためにそうします)が、オリジンブランチとローカルブランチは両方とも現在のHEAD と同じか「上」にある必要があります。
  • 途中にタグがあってはなりません(おそらく、子ブランチと親ブランチの間にタグがあるコミットでスクリプトをテストしていません)。
  • スクリプトは、「HEAD」が常に最初の装飾としてリストされているという事実に依存していますlogコマンド
  • スクリプトmasterdevelop実行結果を(主に)に<SHA> Initial commit

結果

 A---B---D---E---F <-origin/master, master
      \      \
       \      \
        \      G---H---I <- origin/hotfix, hotfix
         \
          \
           J---K---L <-origin/develop, develop
                \
                 \
                  M---N---O <-origin/feature/a, feature/a
                       \   \
                        \   \
                         \   P---Q---R <-origin/feature/b, feature/b
                          \
                           \
                            S---T---U <-origin/feature/c, feature/c

ローカルブランチの存在にもかかわらず(例えばorigin/topic、コミット以降にのみ存在します)OがSHAによって直接チェックアウトされた)、スクリプトは次のように出力されます。

  • コミットするためにGHI(分岐hotfix)→master
  • コミットするためにMNO(分岐feature/a)→develop
  • コミットするためにSTU(分岐feature/c)→develop
  • コミットするためにPQR(分岐feature/b)→feature/a
  • コミットするためにJKL(支店develop)→ <sha> Initial commit*
  • コミットするためにBDEF(分岐master)→<sha> Initial commit

*-またはmasterdevelopコミットがマスターのヘッド上にある場合(〜マスターは開発を早送りできます)


なぜ私のためにショーブランチの仕事をしなかったのですか

基づくgit show-branchソリューションは、次の状況では私にとって信頼できないことが判明しました。

  • 取り外されたヘッド –取り外されたヘッドケースを含むとはgrep '\*' \、 `grep '!\ –そして、それはすべてのトラブルの始まりにすぎません
  • スクリプトmasterdevelop実行結果はdevelopそれぞれと ``
  • ブランチmasterhotfix/branchs)上のブランチは、理由としてではなくdevelop、最も近いmasterブランチの親にマークが付けられているため、親としてになります。!*

2
うまくいった答えだけ-gitエイリアスとして:"!git log --decorate --simplify-by-decoration --oneline | grep -v '(HEAD' | head -n1 | sed 's/.* (\\(.*\\)) .*/\\1/' | sed 's/\\(.*\\), .*/\\1/' | sed 's/origin\\///'"
Ian Kemp

8

「Git:コミット元のブランチを見つける」で説明されているように、たとえそれgit branch --contains <commit>が始まったとしても、そのコミットが行われたブランチを簡単に特定することはできません(ブランチの名前を変更、移動、削除できます...)。

  • ブランチとリストブランチがリストされgit branch --contains <commit>なくなるまで、コミットからコミットに戻ることができます。featuredevelop
  • そのコミットSHA1を比較する /refs/heads/develop

2つのコミットIDが一致する場合は、問題ありません(つまり、featureブランチの起源はのHEADにありますdevelop)。


6

JoeChryslerのコマンドラインマジックは簡略化できます。これがJoeのロジックです。簡潔にするためcur_branchに、コマンド置換の代わり`git rev-parse --abbrev-ref HEAD`に名前が付けられたパラメーターを両方のバージョンに導入しました。そのように初期化することができます:

cur_branch=$(git rev-parse --abbrev-ref HEAD)

次に、Joeのパイプラインを示します。

git show-branch -a           |
  grep '\*'                  | # we want only lines that contain an asterisk
  grep -v "$cur_branch"      | # but also don't contain the current branch
  head -n1                   | # and only the first such line
  sed 's/.*\[\(.*\)\].*/\1/' | # really, just the part of the line between []
  sed 's/[\^~].*//'            # and with any relative refs (^, ~n) removed

比較的単純なawkコマンドで、これらの5つのコマンドフィルターすべてと同じことを実行できます。

git show-branch -a |
  awk -F'[]^~[]' '/\*/ && !/'"$cur_branch"'/ {print $2;exit}'  

それはこのように分解します:

-F'[]^~[]' 

でフィールドに行を分割し]^~、および[文字。

/\*/                      

アスタリスクを含む行を検索する

&& !/'"$cur_branch"'/

...しかし、現在のブランチ名ではありません

{ print $2;               

そのような行を見つけたら、その2番目のフィールド(つまり、フィールド区切り文字の最初と2番目の出現の間の部分)を印刷します。単純なブランチ名の場合、それは大括弧の間にあるものになります。相対ジャンプのある参照の場合、修飾子のない名前になります。したがって、フィールドセパレーターのセットは、両方のsedコマンドの意図を処理します。

  exit }

その後、すぐに終了します。つまり、一致する最初の行のみが処理されるため、出力をにパイプする必要はありませんhead -n 1


3
参照が多すぎるために、一部のブランチが出力から欠落する可能性があることに注意してください。代わりにstderrに警告として表示されます。
Zitrax 2016年

5

以下は、Mark ReedのソリューションのPowerShell実装です。

git show-branch -a | where-object { $_.Contains('*') -eq $true} | Where-object {$_.Contains($branchName) -ne $true } | select -first 1 | % {$_ -replace('.*\[(.*)\].*','$1')} | % { $_ -replace('[\^~].*','') }

5

これがこの問題を解決する良い方法であると言っているわけではありませんが、これは私のために働くようです。

git branch --contains $(cat .git/ORIG_HEAD) 問題は、ファイルのcatingがgitの内部動作を覗き見しているため、必ずしも前方互換性(または後方互換性)があるとは限らないことです。


3

Antによるクロスプラットフォーム実装

    <exec executable="git" outputproperty="currentBranch">
        <arg value="rev-parse" />  
        <arg value="--abbrev-ref" />  
        <arg value="HEAD" />  
    </exec>

    <exec executable="git" outputproperty="showBranchOutput">
        <arg value="show-branch" />  
        <arg value="-a" />  
    </exec>

    <loadresource property="baseBranch">
      <propertyresource name="showBranchOutput"/>
          <filterchain>
            <linecontains>
              <contains value="*"/>
            </linecontains>
            <linecontains negate="true">
              <contains value="${currentBranch}"/>
            </linecontains>
            <headfilter lines="1"/>
            <tokenfilter>
                <replaceregex pattern=".*\[(.*)\].*" replace="\1"/>
                <replaceregex pattern="[\^~].*" replace=""/>
            </tokenfilter>
          </filterchain>
    </loadresource>

    <echo message="${currentBranch} ${baseBranch}" />

2

@Mark Reed:コミット行にアスタリスクを含めるだけでなく、アスタリスクで始める必要があることを追加する必要があります。それ以外の場合、アスタリスクを含むコミットメッセージも一致した行に含まれます。だからそれはする必要があります:

git show-branch -a | awk -F'[]^~[]' '/^\*/ && !/'"$current_branch"'/ {print $2;exit}'

または長いバージョン:

git show-branch -a           |
  awk '^\*'                  | # we want only lines that contain an asterisk
  awk -v "$current_branch"   | # but also don't contain the current branch
  head -n1                   | # and only the first such line
  sed 's/.*\[\(.*\)\].*/\1/' | # really, just the part of the line between []
  sed 's/[\^~].*//'            # and with any relative refs (^, ~n) removed`

2
vbc=$(git rev-parse --abbrev-ref HEAD)
vbc_col=$(( $(git show-branch | grep '^[^\[]*\*' | head -1 | cut -d* -f1 | wc -c) - 1 )) 
swimming_lane_start_row=$(( $(git show-branch | grep -n "^[\-]*$" | cut -d: -f1) + 1 )) 
git show-branch | tail -n +$swimming_lane_start_row | grep -v "^[^\[]*\[$vbc" | grep "^.\{$vbc_col\}[^ ]" | head -n1 | sed 's/.*\[\(.*\)\].*/\1/' | sed 's/[\^~].*//'

Mark Reedの回答と同じ目的を達成しますが、多くのシナリオで誤動作しない、はるかに安全なアプローチを使用します。

  1. 親ブランチの最後のコミットはマージであり、列が表示されます - ません*
  2. コミットメッセージにブランチ名が含まれています
  3. コミットメッセージには *

0

最近これを実行したい人-AtlassianのSourceTreeアプリケーションは、ブランチが相互にどのように関係しているか、つまりブランチがどこから始まったか、現在コミット順でどこに座っているか(たとえば、HEADまたは4つのコミットなど)の優れた視覚的表現を示します。 。


0

ソースツリーを使用している場合は、コミットの詳細>親>を確認すると、下線が引かれたコミット番号が表示されます(リンク)


0

代替: git rev-list master | grep "$(git rev-list HEAD)" | head -1

それが私のブランチであるmasterか、または指定したいブランチであるという最後のコミットを取得します


0

これは私が次のようなことをしたとき私にとってはうまくいきませんでした develop > release-v1.0.0 > feature-foo、それは開発にずっと戻って、リベースが関与していたことに注意してください、それが私の問題を悪化させているかどうかはわかりません...

以下は私に正しいコミットハッシュを与えました

git log --decorate \
  | grep 'commit' \
  | grep 'origin/' \
  | head -n 2 \
  | tail -n 1 \
  | awk '{ print $2 }' \
  | tr -d "\n"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.