4

gitの^and構文は、左の親コミット (右の親がマージされるコミット) にのみ移動するようです。~私の特定のケースでは、次のようなツリーがあります。

$ git log --pretty=format:"%h" --graph
*   f5712e3
|\  
| * d0f8257
* | e1fe071
|/  
* e0fff07

私は両方git log HEAD^ -1を見つけgit log HEAD~1 -1て、左の親を教えてくれますe1fe071。正しい親を取得するための従来の構文は何ですか?

4

1 に答える 1

8
$ git log HEAD^2

git rev-parseドキュメントで説明されているように、キャレットを使用すると、コミットの直接の親の中から選択できます。

<rev>^例えば、、HEAD^_v1.5.1^0

リビジョン パラメータのサフィックス^は、そのコミット オブジェクトの最初の親を意味します。^<n>n番目の親を意味します (つまり<rev>^は と同等です<rev>^1)。特別な規則として、<rev>^0コミット自体を意味<rev>し、コミット オブジェクトを参照するタグ オブジェクトのオブジェクト名である場合に使用されます。

どれがどれであるかを判断するために、 *の出力git showは親を順番にリストします。たとえば、libgit2のマスター ブランチのヘッドは、マージ コミットa3ef70bです。

$ git ショー マスター
コミット a3ef70bb405a05c16fb533d828da2510ff751224
マージ: c4c47fc 8aba3d4
著者: エドワード・トムソン <ethomson@edwardthomson.com>
日付: 2014 年 12 月 30 日火曜日 11:53:55 -0600

    libgit2/cmn/fetch-prune からプルリクエスト #2761 をマージします

    遠隔追跡枝剪定

Merge:出力の 2 行目begin に、親が順番にリストされていることに注意してください。git rev-parseas を使用して、このプロパティを確認できます。

$ git rev-parse master^1
c4c47fc2861935d8e373319c0734ea7b2ce34a73

$ git rev-parse master^2
8aba3d47cf96e24e02601175f900f0e851077c1a

ソースを調べると確認されます。

strbuf_addstr(sb, "Merge:");

while (parent) {
    struct commit *p = parent->item;
    const char *hex = NULL;
    if (pp->abbrev)
        hex = find_unique_abbrev(p->object.sha1, pp->abbrev);
    if (!hex)
        hex = sha1_to_hex(p->object.sha1);
    parent = parent->next;

    strbuf_addf(sb, " %s", hex);
}

関連する回答: git でマージ コミットの親を取得する


* のドキュメントにgit showは、コミットの血統に関する注意事項があります。

コミットがマージで、pretty-format がonelineemailまたはrawでない場合、追加の行がAuthor:行の前に挿入されます。この行は「Merge:」で始まり、祖先のコミットの sha1 がスペースで区切られて出力されます。リストされたコミットは、履歴の表示を制限している場合、必ずしも直接の親コミットのリストではないことに注意してください。たとえば、特定のディレクトリまたはファイルに関連する変更のみに関心がある場合です。

于 2013-11-08T01:57:58.243 に答える