6

私の知る限り、コミットオブジェクトには親に関する情報のみが含まれているため、次のような状況がある場合:

 *  branch-1
 |
 o
 |
 o  master
 |
 o 

これはある種の等価物です

   *  branch-1
   |
   o
  /
 o  master
 |
 o 

しかし、私のマスターが前進する場合はどうなりますか?

 o master
 |
 o *  branch-1
 | |
 o o
 |/
 o
 |
 o 

ブランチ1にいると、git log --graph --decorate私だけが表示されます:

 *  branch-1
 |
 o
 |
 o
 |
 o 

どのブランチから開始されたかがわかれば を呼び出すことができますgit merge-base master branch-1が、どのブランチから開始されたかわからない場合はどうすればよいでしょうか?


PS。私はまだ英語を学んでいますが、時々ばかげた間違いを犯します。質問と回答を英語で書くように最善を尽くしていますが、間違いがあれば投稿を編集していただければ幸いです。あなたの努力は無駄にはなりません。

4

3 に答える 3

12

git がこの情報を永続的に保存するわけではないのは事実ですが、とにかく調べることができます。Git には reflog があります。

git reflog show <branch>

ブランチが過去 90 日以内に作成された場合 (デフォルトでは、 を使用gc.reflogExpireしてこれを変更します)、その reflog の最後の行がブランチの作成になります。

ここで知りたいのは、分岐元のブランチではなく、ブランチが作成されたコミットであると想定しています。それを見つけるのははるかに難しいでしょう-私の最善の推測は、各ブランチについて、ターゲットブランチが作成された時点でその位置を取り、ターゲットブランチの開始点が含まれているかどうかを確認することです.

ここでの話の教訓は、どのブランチから分岐したかがわかるワークフローを採​​用する必要があるということです。新しい機能とバグ修正は、マスター ブランチの安定した時点で開始される可能性が高く、サブトピック ブランチに<topic>-<subtopic>はリマインダーとして名前を付けることができます。

編集:

さて、コミットと時間 (この場合は、ブランチが作成されたコミットと時間) を知っているとしましょう。そのコミットがその時点でどのブランチにあったかを調べようとしています。

git for-each-ref --format='%(refname)' refs/heads/* | while read b; do
    if [ "$(git rev-parse $b@{$date_time})" = "$target_commit" ]; then
        echo "branch $b contained commit $target_commit at $date_time"
    fi
done

それはbashスクリプト/ワンライナーとして機能するはずだと思います。アイデア: すべてのブランチについて、指定された日時にその位置を取り、それがターゲット コミットであるかどうかを確認します。さらに柔軟にしたい場合$(git merge-base $(git-rev-parse $b@{$date_time}))は、ターゲットコミットであるかどうかをテストできます。つまり、ターゲットコミットがその時点で特定のブランチの祖先であったかどうか。

そしてもちろん、履歴が比較的きれいな場合は、いつでもgitk --branchesorgit log --graph --branches [--oneline]を使用して素敵な写真を見ることができます。

于 2010-12-19T01:23:18.720 に答える
1

私はあなたが探していると思います

git log --graph --oneline --all

詳細な説明については、このスレッドを参照してください。 スタックオーバーフローの答え

于 2014-10-14T14:07:35.417 に答える
1

Git にはこの概念が実際にはありません。これを追加したい場合は、ヒューリスティックを追加する必要があります。これは、git が本当に気にかけているのは、ツリー内の特定のコミットにラベルを付けることだけだからです。

于 2010-12-18T14:47:38.487 に答える