あるコミットが別のコミットの祖先であるかどうか(あるいはその逆かどうか)を見分けるにはどうしたらよいですか?
質問
Git は DAG であり、グラフ上の各ノードがコミットを表します。各コミットは「n」個の親コミットを持つことができます。
任意の 2 つのコミットがある場合、DAG 内のこれら 2 つの "order"を識別するための単一の簡潔な方法はありますか。
git rev-list
が最も有望であると思われますが、正しい呪文を見つけることができないようです。
理想を言えば、次のようなものです。
$ git related hash1 hash2
hash1 is ancestor of hash2
または
hash2 is ancestor of hash1
または
hash1 unrelated to hash2
または
hash1 is equal to hash2
どのように解決するのですか?
使用方法
git merge-base --is-ancestor <commit1> <commit2>
これに対する答えを見つける方法は1つだけではありません。最もシンプルなのは
git merge-base --is-ancestor <possible-ancestor-commit> <commit>
のドキュメントから
git merge-base
:
--is-ancestor
最初の
<commit>
の祖先であるかどうかを調べます。<commit>
であり、真の場合はステータス 0 で、真の場合はステータス 1 で終了する。エラーは1でない0でないステータスで通知されます。
その他のオプション
トリプルドット付きの git ログ
...
という表記があります。
もう一つの選択肢は
git log
で、トリプルドット記法を使用する
...
で、子コミットの集合和から集合和を引いたものを出力するように Git に指示します。基本的に、これはコミットの集合が互いにどのように分岐したかを示すものです。
$ git log --oneline --graph --left-right \
--first-parent --decorate <commit1>...<commit2>
上記のコマンドは、以下の場所から到達可能なコミットを表示します。
commit1
または
commit2
というように、セット操作の観点から、C1 UNION C2 - C1 INTERSECTION C2というように、両方ではありません。
どちらのコミットも他方の親でない場合は、両方の子コミットが表示されますが、一方が他方の祖先である場合は、祖先が子孫のパスに含まれているため、子孫コミットの出力だけが表示され、出力から除外されます。
についてもっと読むことができます。
git log
とトリプルドット記法については、以下の資料を参照してください。
git branch --contains オプション
git-rev-list(1)
は、この答えに使えそうな気がします。もうひとつの方法は、テストしたいコミットに一時的なブランチラベルをつけるだけで、そのコミットに対して
--contains
オプションで
git branch
:
git branch --contains <commit-to-test>
出力されるのは、コミットツリーのどこかにそのコミットを含むすべてのブランチです。そのため、他のコミットで一時ブランチを使用することで、テストしているコミットが先祖に当たるかどうかを確認することができます。
ドキュメントより。
--contains [<commit>]
指定したコミットを含むブランチのみをリストアップします(指定しない場合はHEAD)。
関連
-
Git: bash: cd: 引数が多すぎる
-
[解決済み] コミット前に 'git add' を取り消すにはどうすればよいですか?
-
[解決済み] 既存の、プッシュされていないコミットメッセージを修正するには?
-
[解決済み] Git リポジトリを以前のコミットに戻すにはどうすればよいですか?
-
[解決済み] Git が追跡したファイルを .gitignore に登録したまま「忘れる」ようにするにはどうしたらいいですか?
-
[解決済み] ファイルをリセットしたり、特定のリビジョンに戻したりするにはどうすればよいですか?
-
[解決済み] ローカルの Git リポジトリが元々クローンされた URL を特定するにはどうすればよいですか。
-
[解決済み] コミットに含まれるすべてのファイルを一覧表示するにはどうすればよいですか?
-
[解決済み] ある特定のコミットのコミット作者を変更する方法は?
-
[解決済み】Git リポジトリに空のディレクトリを追加するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
コミットメッセージが空だったため、コミットを中止する git commit
-
なぜこのマージが必要なのかを説明するコミットメッセージを git に入力してください。
-
git push please tell me who you are or git fatal: empty ident name (for <>) not llowed.
-
[解決済み] あるコミットが他のコミットの子孫であるかどうかを判断するにはどうすればよいですか?
-
[解決済み] Gitの本番環境へのプッシュ(FTP)
-
[解決済み] シングルブランチクローンを「元に戻す」方法は?
-
[解決済み] GitHubのウェブサイト上でディレクトリやフォルダの名前を変更するには?
-
[解決済み] GitとSSH、どちらのキーを使うか?
-
[解決済み] Git のプッシュが "non-fast-forward" で拒否されました。
-
[解決済み] どのブランチとマージしたいかを言わずにpullするように言われました。