25

私のgitログを見るのが好きな方法は

git log --graph --oneline --all --decorate

私がその出力を役に立つと思った他のものの中には、ブランチ名があります。ただし、ブランチを削除すると、上記ではそれらが表示されなくなります。つまり、次のようなものがたくさん表示されます。

* 87c3294 (QueueExample) blah blah

よりもはるかに表現力があります (特にリストが長くなった場合)。

* 87c3294 blah blah

この質問への回答、特にこのコメントは、ブランチ名がまだ「どこかに」あることを暗示しているようです。

git log出力に、または少なくとも他の方法でそれらを印刷するにはどうすればよいですか?

または、git branch の出力からブランチを削除しながら、目的のためにブランチを保持するにはどうすればよいgit logですか?

4

4 に答える 4

37

Git では、ブランチはコミットへの単なるポインターであり、そのブランチに新しいコミットが追加されると移動します。つまり、ポインターが移動すると、以前のコミットがそのブランチにあったという記憶はありません。これは、最初は頭に浮かぶのが難しい概念でした。「ブランチ」という名前は、エッジで接続された複数のノードを思い浮かべますが、Git では、ブランチは実際にはノードへの移動ポインターにすぎません。

git logそれらを指しているブランチでコミットに忠実に注釈を付けます。たとえば、ブランチ マスターにコミット "one"、"two"、"three" を、ブランチ フィーチャーに "uno"、"dos"、"tres" をコミットしてリポジトリを作成し、フィーチャーをマスターにマージし直しました。ブランチを削除する前に、次のことgit logがわかります。

*   9eb6e93 (HEAD, master) Merge branch 'feature'
|\
| * 523e2ac (feature) tres
| * 6d3cc0f dos
| * 1bc0b2e uno
* | d39734b three
* | 779d37b two
* | facbcbf one
|/
* 58848f4 Initial commit.

"(feature)" アノテーションが何らかの形で右側のブランチを参照していると思い込んでしまうのは簡単ですが、そうではありません。単に commit を参照しているだけ523e2acです。

デフォルトでは、Git がマージ コミットを作成すると (9eb6e93この場合)、ブランチの「機能」をマージしていることを示すコメントが自動的に追加されるため、そこにブランチがあったという記録がいくつかあることに注意してください。ただし、それは単なるコメントです。 、 これ以上何もない。

ブランチ「機能」を削除すると、コミット523e2acに「(機能)」というラベルが付けられなくなったこと以外は何も変わりません。

*   9eb6e93 (HEAD, master) Merge branch 'feature'
|\
| * 523e2ac tres
| * 6d3cc0f dos
| * 1bc0b2e uno
* | d39734b three
* | 779d37b two
* | facbcbf one
|/
* 58848f4 Initial commit.

したがって、あなたの質問に答えるには、いいえ、ブランチを削除するgit logと、そのブランチ名でコミットに注釈を付けることはできません (もう存在しないため)。ただし、いくつかの代替手段があります。

  • ブランチを削除しないでください。ブランチを残しても害はありませんが、タイプすると画面が乱雑になりますgit branch。また、ブランチ名を再利用することもできます。ブランチを削除しないと、後で問題が発生する可能性があります。

  • ブランチを削除する前にコミットにタグを付けます。タグは、実際には動かない枝です。タグ名をブランチ名と同じにすることもできます。

  • マージ コミットの自動コメント機能に満足してください。前述のように、Git がマージを行うとき、デフォルトでは、コミット コメントでマージされるブランチの名前を参照し、ブランチが存在したという記録を作成します。私にとって、これは Git でのブランチの動作に基づいた最もクリーンなソリューションです。ブランチは実際には一連のコミットを参照するわけではないため、ブランチが存在したのは歴史的な結果にすぎません。

ブランチの履歴が残る可能性があるもう 1 つの場所は、reflog です。これは、どのブランチに切り替えているか、またはどのブランチから切り替えているかを単に記録するだけです。ほとんどの場合、災害復旧のためにあります (おっと、そのブランチを削除するつもりはありませんでした!)、あなたが話している種類のブランチ履歴にはあまり役に立ちません。

于 2012-08-24T18:40:43.283 に答える
3

コメントは、マージコミットメッセージについて話していますMerge QueueExample into master。ブランチを削除すると、ブランチはなくなります。でログのトピック ビューを維持したい場合は、--decorate代わりにタグを使用してみてください (またはブランチを削除しないでください)。

于 2012-08-24T18:25:22.537 に答える
0

ローカル リポジトリでブランチを削除しても、そのリポジトリの他のクローンにはまだ存在します。その削除を他のリポジトリにプッシュすると、ブランチ自体 (特定のコミットへの便利な名前のポインター) が存在しなくなる可能性があります。ただし、それが指し示すコミットは、たとえ何も指していなくても、しばらくの間は存在し続けます。そのコミットが他のブランチの祖先の一部を形成するように他のブランチにマージされている場合、既存のブランチから到達できる限り、コミットは残ります。ただし、それを追跡するのは少し面倒です。早い段階で、しばらくの間 HEAD reflog に残りますが、最終的にはそこから消える可能性があります。

それらを常に出力に表示したい場合は、それらをgit log削除しないでください。または、ブランチ ポインターをタグに置き換えて、削除する前にブランチがあった場所を指します。

于 2012-08-24T18:58:06.180 に答える