84

Pretend I branched from my master branch to a topic branch, and then I did a few commits on my topic branch. Is there a command that tells me the commit hash on the master branch that my topic branch originated from?

Ideally, I wouldn't have to know how many commits I've made ( trying to avoid HEAD^5 ).

I've googled and SO'd around and can't seem to land on the answer. Thanks!

4

4 に答える 4

81

を使用できますgit reflog show --no-abbrev <branch name>。たとえば、ブランチの作成を含め、ブランチに加えられたすべての変更が出力されます(ブランチxxxからmasterブランチを作成しました)。

bdbf21b087de5aa2e78a7d793e035d8bd9ec9629 xxx@{0}: branch: Created from master

reflogレコードは期限切れになる可能性があるため(デフォルトでは90日)、これはあまり信頼できないことに注意してください。これを行うための100%信頼できる方法はないようです。

于 2010-10-22T16:45:33.207 に答える
70

git merge-base master your-branch2つのブランチ(通常はブランチポイント)間で最も共通の祖先を見つけるために使用します。

于 2010-10-22T16:50:40.890 に答える
6

これを行う100%信頼できる唯一の方法は、ブランチを作成するときにブランチの先頭にタグを付けることです。新しいブランチを作成したブランチにコミットをマージして戻すと、受け入れられた回答は機能しません。これは、たとえば、安定化リリースブランチを作成していて、リリーステスト中に見つけた修正をマスターにマージして戻す場合に行われることがあります。よくあること。新しいブランチから元のブランチにコミットをマージしないことがわかっている場合は、受け入れられた回答が機能します。

于 2018-10-30T20:26:11.270 に答える
0

誰もが言うように、関心のあるブランチがまだマージされていない場合:

  • git merge-base branch1 branch2

ブランチをマージした場合(たとえばtopic、およびmaster、いずれかの方法でマージした場合):

  • 最後のマージが発生した場所を見つけます(これが現在のすべての回答が示唆していることです)
    • git merge-base topic master
    • あなたにあげるsha-of-last-merge
  • マージに使用された2つの(理論的には、おそらくそれ以上の)コミットを見つけます。
    • git rev-list --parents -n 1 sha1-of-last-merge
    • あなたにあげるsha-of-last-merge sha-of-parent-1 sha-of-parent-2
    • 最後の2つに興味があります
  • 親のこれら2つのSHA1を取得し、プロセスを繰り返します。
    • git merge-base sha-of-parent-1 sha-of-parent-2
    • 中間マージがなかった場合、これにより、ブランチが最初に作成された場所にコミットが与えられます
    • そうでなければ、繰り返し続ける必要があります
      • ここでの最悪の部分は、コミットメッセージを確認するか、他のヒューリスティックを適用する以外に、いつ停止するかを知る方法がないことです。運が良ければ、親が1人だけの場合よりも、最終的にマスターのコミットに到達します。これは自然な停止点です。ただし、複数の親を持つコミット(つまり、マージコミット)topicからブランチを開始した場合は、運がありません。masterヒューリスティック/常識/その他の知識が必要です。
于 2021-10-08T21:40:02.087 に答える