2016-07-13 16 views
2

私はそれに2つの枝、devmasterを持つ線形履歴を持っています。 masterは常にdevに早送り可能で、他のブランチはありません。 devmasterの間のすべてのコミットをgit rev-parseから取得したいと思います。git rev-parseを使って同じブランチ内のコミットの範囲を取得します

例えば、私の歴史は、この(git log --graph --decorate --oneline --branchesから)のようになります。私は現在、

git rev-parse master..dev 

693dc30... 
d650d35... 
1c4e641... 

のような何かを得ることを期待を呼び出すようにしようとしています

* 693dc30 (HEAD, dev) E 
* d650d35 D 
* 1c4e641 C 
* b27ea83 (master) B 
* 95fe748 A 
... 

代わりに私は

693dc30... 
b27ea83... 
^b27ea83... 

指定した選択肢の間で完全なコミットの一覧を取得するにはどうすればよいですか。また、私が得ているgit rev-parseの結果を正しく解釈するにはどうすればよいですか?

私はGitバージョン1.7.1を使用しています。私はlogのような磁器のものよりも、このアプリケーションのために低レベルのコマンド、例えばrev-parseを使うのが好きですが、私はうまく動作するどんなソリューションにもオープンしています。

+2

私の印象は、 'git rev-parse'と' git rev-list'を混同していることです。 'git rev-list master..dev'はあなたが望むものを正確に行います。 – Leon

+0

@リオンもしあなたが答えに入れたら、私はupvoteすることをうれしく思います。それはまさに私が必要としていたものです。それでは 'rev-parse'とは​​何ですか?範囲がどんなものになるのかを私に教えてください。 –

答えて

4

Leon noted in a commentと答えた場合、答えはgit rev-listです。

Gitの改訂コードが複雑です。しかし、あなたが使用することができます良いメンタルモデルがあります:

  • the gitrevisions documentationに記載されていリビジョン指定子があります。範囲表記法(X..YX...Y、および<rev>^@のようなより難解な指定子のうちのいくつかを除く)は、特定のオブジェクトの1つを指定します。通常はコミットします。しかし注釈付きタグを指すタグ名は、となります。スタイル接尾辞gitrevisions10を使用しないと、Gitはそれらをコミットやツリーやブロブに「払い落とす」ように強制します。

    rev-parseコマンドは、リビジョン指定子(シェルスクリプトの引数の解析、最上位ディレクトリの場所の表示、--bareリポジトリのテストなど)にも使用できます。

  • しかし、私はそれを呼び出すので、これらの "祖先で"のいずれかを選択することができます。これは、コミットやGitがコミットを解決できるタグオブジェクトでのみ意味があります。祖先を持つコミットを選択すると、そのコミットが得られ、その親はコミットします(通常はコミットは1つだけですが、それがマージの場合はそれ以上です)。その親のコミットの両親 - コミットの祖父母 - そして親のルートコミット(親を持たないコミット)で行き止まりに遭遇するまで実行してください。

    rev-listコマンドは、祖先での選択とは何ですか。実際には、は常にです。引数に--no-walkを追加しない限り、これは実行されます。

必要な場合は、X..YまたはX...Yのような範囲指定子を使用する場合、git rev-parseは大体相当個別にこれらを回すために最善をつくしますプレフィックス^をコミットします。これは実際には少しの情報を失います。X...YX Y ^$(git merge-base X Y)から、例えばと言うことはできません。つまり、左側のリビジョン指定子がわからないことを意味します。しかし、一般的には、rev-list形式の解析が必要なものを実行している場合は、とにかくgit rev-listを使用するだけで、それを心配する必要はありません。 git rev-listは、--boundaryのプレフィックス-など、さらに多くのマーカーを持っています。

rev-listコマンドは、ツリーIDとオブジェクトIDを公開することもできますが、そのようにするには余分なフラグを与えなければなりません。非常に多くのGitコマンドで使用されます。git rev-list's documentationは非常に長く、しかしgit loggit rev-listはほとんど同じコマンドであり、デフォルトの出力形式が異なりますが、それ以外の微妙な違いがいくつかありますが、同じソースコードを使ってほとんど同じことができます。 2つのフロントエンドは単一のbuiltin/log.cファイルから構築されています)。


ほとんどのコマンドはにはを必要としませんが、git rev-listはそれ自身であり、git diffがあります。複数のマージベースが存在する場合にも、X...Yは(X(なし帽子プレフィックス)のIDを加えたY(なし帽子プレフィックス)のIDを加えたすべてマージ拠点のIDにREV-解析しますここでの考え方は、XまたはYのいずれかから到達可能なすべてのコミットを選択することであるため、両方からのコミットをすべて選択しないため、すべてのコミットベースとすべての以前のコミットは除外されます。

関連する問題