3

アップストリームに存在しない git-graph で最長のパスを見つけられるようにしたいと思います。そのパスの一端は明らかに HEAD であるため、簡単です。もう一方の端は、上流に存在しない私の最も古いコミットです。これを見つける方法がわかりません。

ダイアグラム

[otherguy]   H--I--J   
            /       \
[master]   A--B--C--M1--D--E--M2--F--G
              \      \             \
[mine]         H---I--M3---J---K---M4--M--HEAD

HEADおよびを指定して、H (または B) を指すコマンドが必要ですmastergit merge-base master HEAD単純に F が得られることに注意してください。

4

2 に答える 2

6

これは合理的に機能するはずです:

git rev-list --topo-order --reverse mine ^master | head -1

セットアップのレプリカでテストすると、「H」とマークしたコミットが出力されます。考えられるすべてのケースで「最も遠い」パスが見つかる、またはそのような概念が明確に定義されていると100%確信しているわけではないので、信頼する前に、重要なケースでテストすることをお勧めします。

(出力-1を制限するために通常指定するオプションはgit rev-list、とうまく組み合わされない--reverseため、head -1必要であることに注意してください。)


アップデート:

いくつかの説明:

  • git rev-list mine ^masterから到達可能なコミットを要求しますが、からは到達mineできませんmasterHEADあなたの場合、から到達可能なコミットを除いて、で始まるすべてのコミットを要求していますG。これにより、コミットのリストが表示され(M, M4, K, J, M3, I, H)、最後のコミットが選択されます。

  • --topo-orderデフォルトである時系列の順序ではなく、コミットのトポロジカル順序(コミットは常にその親の前に表示される)を保証するために必要です。--reverse最後のものが必要なので、指定します。

  • commit1 ^commit2をつづることもできます。これは、がの子孫であるcommit2..commit1場合に推奨される構文です。この場合、分岐しているので、私たちが欲しいものを詳しく説明する方が明確です。などの複数の除外も許可されます。これは、範囲を取得するすべてのgitコマンドに適用され、マニュアルに記載されています。commit1commit2minemastergit log branch1 ^branch2 ^branch3git rev-parse

于 2012-09-20T17:05:29.150 に答える
1

これは、「(私の) HEAD から到達可能で、master から到達できないコミットはどれですか?」という質問とほとんど同じです。この質問に答えるには、 commit range を使用しますmaster..HEAD。このリストから最も古いコミットが必要なので、出力を tail: にパイプしますgit rev-list master..HEAD|tail -n1

コミットのタイムスタンプが時系列順に並んでいない場合は、--topo-orderrev-list のオプションを指定する必要がある場合があります。

于 2012-09-20T17:06:08.420 に答える