1

私はいくつかの些細な変更を加えてからそれらをgitにコミットするスクリプトを書いています。これらは些細な変更なので、それを回避できるときはgit commit --amendいつでも、具体的には、修正によって他のブランチの履歴が「混乱」しないときに実行したいと思います。修正によって別のブランチが台無しになる場合は、git commit代わりに標準を実行したいと思います。

たとえば、私のブランチが次のようになっている場合(Git GUIの「すべてのブランチ履歴を視覚化する」):

* [experimental branch] Added feature.
* [master branch] Trivial change from script
* ...

このスクリプトをマスターブランチで実行している場合、実験ブランチの履歴の一部を置き換えるため、修正は行いません。技術的には、これは実際には何も壊しません-元のコミットはまだ実験の歴史の一部であり、ガベージコレクションされないように参照されます-しかし、ほぼ同一ではありませんが、 2つの異なるブランチは、後でリベースまたはマージしたいときに生活を困難にするので、避けたい状況です。

コミットに何かが分岐しているかどうかをスクリプトに自動的に検出させるにはどうすればよいですか?

仮定を単純化することが役立つ場合、私は常にマスターのヘッドでこのスクリプトを実行し、ローカルリポジトリとしてgitのみを使用します-変更をどこにもプッシュまたはプルしません。

このスクリプトはRubyであるため、gitコマンドラインにシェルアウトするか、gitにRubyバインディングを使用することができます。どちらでもこのタスクが簡単になります。

4

2 に答える 2

12

git branch --contains HEADこのコミットを「含む」ブランチのリストを取得するために実行するだけです。リストが空の場合、そのコミットは修正しても安全です。-aローカルおよびリモートのブランチを一覧表示するフラグを含めることもできます。

git rev-parse HEADまたは、 の出力をと比較することもできますgit merge-base HEAD other-branch。これらのコミット ID が同一の場合、現在のコミットは other-branch のコミット履歴にあります。

于 2010-08-08T17:46:43.710 に答える
3

コミット グラフは一方向です。コミットが与えられると、その祖先はすべてわかりますが、その子はわかりません。必要なコミットに到達するまで、エンドポイントから開始してバックトラックする必要があります。

使用git rev-list [some commit] --children(HEAD がデフォルト):

$ git rev-list HEAD --children
6edbee61c87fb063700751815f0ad53907d0b7a4
aee452860ecd772b8bdcd27227e6a72e6f4435fd 6edbee61c87fb063700751815f0ad53907d0b7a4
ef8a1487b03256a489d135e76d1f0b01872f2349 aee452860ecd772b8bdcd27227e6a72e6f4435fd
6910dc5833f6cd26133e32bef40ed54cf9337017 ef8a1487b03256a489d135e76d1f0b01872f2349
bbef0da56efe048f70293bd20bad0cb37b5e84f0 6910dc5833f6cd26133e32bef40ed54cf9337017
[...]

左側の列は、コミット SHA-1 のリストを時系列の逆順で示しています。そのコミットの右側にあるものはすべて、そのコミットの子 ( --children) です。最上位のコミットは HEAD であるため、子はありません。

したがって、このリストで SHA-1 を grep し、その右側に何かがある場合、少なくとも 1 つの子があります。

$ git rev-list --children | grep '^6910'
6910dc5833f6cd26133e32bef40ed54cf9337017 ef8a1487b03256a489d135e76d1f0b01872f2349

上記の例では、commit6910...に子ef8a....

于 2010-08-08T16:23:45.970 に答える