web-dev-qa-db-ja.com

gitでのマージを停止する方法は?

私は3ウェイマージブランチマージを行いました。

git checkout master
git merge BranchA

>> Fast-forward merge

git merge BranchB

>> Three-way-merge (prompts for a merge commit message)

私の質問は2つです。

  • マージを中止するにはどうすればよいですか?スリーウェイマージでは、マージコミットメッセージを書き込む場所をエディターに示しました。しかし、保存せずに終了すると、gitはとにかくマージを続行します(merge-commitメッセージがデフォルトのメッセージになり、書いた可能性がありますが中止されます)

    commit 11111233
        Merge 'BranchB' into master
    

    コミットメッセージを確認していないのは明らかですが、マージが発生しないことを期待します(通常のコミットメッセージを確認しない場合と同じ動作です)。

  • 2つのマージされたブランチからのコミットは時系列でソートされますか?または最初に(git logBranchAからのコミット、その後BranchBのコミットからのコミットが表示されますか?

編集

2番目の質問をよりよく説明するために、私はテストを行いました。masterブランチから始まる2つのブランチ(AおよびB)。私はBにコミットし、次にAにコミットし、次にBにコミットし、最後に再びAにコミットしました。次にBranchAmasterにマージしました。次にBranchBmasterに変換します。

しかし、私がgit log on master、これが出てきたものであり、なぜ私が2番目の質問をしたのか:

commit 730fdd4d328999c86fa4d3b6120ac856ecaccab1
Merge: 7eb581b cc1085a
Author: Arthur Conandoyle <[email protected]>
Date:   Mon Feb 9 21:24:27 2015 +0100

    Merge branch 'BranchB' into master_COPY

commit 7eb581b39a8402e1694cc4bf4eab4a3feb1143f8
Author: Arthur Conandoyle <[email protected]>
Date:   Mon Feb 9 21:23:18 2015 +0100

    BranchA) - This should be the (second) last change of the branch, and be the
    most recent into the git log, even if I merge another branch into master,
    AFTER the one where we are committing this.

commit cc1085a6aaa2ee4b26d3c3fbb93bee863d9e7c28
Author: Arthur Conandoyle <[email protected]>
Date:   Mon Feb 9 21:20:29 2015 +0100

    (BranchB) - Add settings to the last new features

commit 5f5b846a2f89886d01244ba77af941f554233b51
Author: Arthur Conandoyle <[email protected]>
Date:   Mon Feb 9 21:18:54 2015 +0100

    (BranchA) - Add some changes

commit 92a57a56b6b7c9694fbedda71b8070fc58683dde
Author: Arthur Conandoyle <[email protected]>
Date:   Mon Feb 9 21:18:17 2015 +0100

    (BranchB) - Some changes

commit 221765476e348833cf8da73b1bf5239f3d4240e8
Author: Arthur Conandoyle <[email protected]>
Date:   Tue Feb 3 12:12:19 2015 +0100

    Change (this is the last commit of the parent 'master' branch)

Srdjan Gruborが書いたように)マージされたBranchA[〜#〜]、その後[〜# 〜]マージされたすべてのコミットBranchB、マージの順序に従って... ..しかしgit log代わりにそれらを時系列で表示し、コミットはブランチにグループ化されて表示されません!

11
Kamafeather

BranchBマージは完全に通常であり、通常のコミットメッセージを要求します。デフォルトがあります。変更せずに終了すると、マージが完了します。マージ自体が成功したので、それを停止する唯一の方法は、悪いマージメッセージを提供することです(空のメッセージはフックなしでそれを行います)。

マージが停止したら、次のコマンドで中止できます

git merge --abort
# or
git reset --merge

誤ってコミットしたもののバックアウトは

git reset --hard @{1}

Gitにはブランチの「所有権」という概念はありません。 コミットを参照するすべての方法 は同等です。

あなたは構造のより良いアイデアを得ることができます git log はあなたに

git log --graph --decorate --oneline

--date-order--topo-order--allで試してください。

19
jthill

あなたの編集に関して、その出力をgit logsortsします。これは、線形の歴史の中でも驚くべきことです。 ソート方法を変更するためのフラグ があり、--graphを追加すると、デフォルトのソートが--topo-orderに変更されます。

もう1つの注意点は、gitがブランチを早送りすると、マージコミットが行われないことです。

      C---D   <-- branch
     /
A---B         <-- mainline

単純なグラフの早送りの結果を介してmainlinebranchを取得できるようにします。

      C---D   <-- mainline, branch
     /
A---B

単純な直線として簡単に描かれますが、(git merge --no-ffを使用して)マージコミットを強制すると、実際には2つの親を持つマージコミットが生成されます。

      C---D   <-- branch
     /     \
A---B-------M <-- mainline

これは(より多くのコミットを持つように一般化された後)コミットソートプロセスのためのより興味深いオプションを提示します。

2
torek

終了して使用した後、マージを「中止」できます

git reflog

以前のツリー状態に戻ります。通常、マージは発生順に並べ替えられるのではなく、ブランチコミット順に並べ替えられます。つまり、マージコミットの後にすべてのソースブランチコミット(発生順)が表示され、その後にメインブランチコミット(発生順)が表示されます。

0
Srdjan Grubor