如何停止在git中合并?

时间:2015-02-09 18:11:44

标签: git github merge git-commit abort

我有一个三向合并分支合并:

git checkout master
git merge BranchA

>> Fast-forward merge

git merge BranchB

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

我的问题是两个:

  • 如何中止合并?通过三向合并,我向编辑器显示了编写合并提交消息的位置。 但是如果我在没有保存的情况下退出,那么 git 将继续进行合并(只是合并提交消息将是默认的,而不是我可以编写但已中止的消息)

    commit 11111233
        Merge 'BranchB' into master
    

    虽然,显然没有确认提交消息,我希望合并不会发生(与我确认正常提交消息时的行为相同)

  • 两个合并分支的提交是否按时间顺序排序? 或者首先(在git log中)我会看到来自 BranchA 的提交,然后是来自 BranchB的提交的提交?

修改

为了更好地解释我做的第二个问题: 从分支开始的2个分支(A和B)。我在B上提交,然后在A上,然后再在B上,最后再在A上。 然后我将 BranchA 合并到 master 中。然后 BranchB 进入 master

但是当我在主人git log时,就会出现这个问题,为什么我问第二个问题:

commit 730fdd4d328999c86fa4d3b6120ac856ecaccab1
Merge: 7eb581b cc1085a
Author: Arthur Conandoyle <Arthur.Conandoyle@live.com>
Date:   Mon Feb 9 21:24:27 2015 +0100

    Merge branch 'BranchB' into master_COPY

commit 7eb581b39a8402e1694cc4bf4eab4a3feb1143f8
Author: Arthur Conandoyle <Arthur.Conandoyle@live.com>
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 <Arthur.Conandoyle@live.com>
Date:   Mon Feb 9 21:20:29 2015 +0100

    (BranchB) - Add settings to the last new features

commit 5f5b846a2f89886d01244ba77af941f554233b51
Author: Arthur Conandoyle <Arthur.Conandoyle@live.com>
Date:   Mon Feb 9 21:18:54 2015 +0100

    (BranchA) - Add some changes

commit 92a57a56b6b7c9694fbedda71b8070fc58683dde
Author: Arthur Conandoyle <Arthur.Conandoyle@live.com>
Date:   Mon Feb 9 21:18:17 2015 +0100

    (BranchB) - Some changes

commit 221765476e348833cf8da73b1bf5239f3d4240e8
Author: Arthur Conandoyle <Arthur.Conandoyle@live.com>
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如何按时间顺序显示它们,并且提交不会在分支中显示为分组!

3 个答案:

答案 0 :(得分:18)

branchB merge非常普通,需要普通的提交消息。有一个默认值,如果你退出而没有改变它,合并将完成。由于合并本身已成功,现在停止它的唯一方法是提供一个错误的合并消息(一个空的合并消息将在没有挂钩的情况下执行)。

当合并停止时,您可以使用

中止它
git merge --abort
# or
git reset --merge

您刚才提交的任何错误的退出

git reset --hard @{1}

git中没有分支“所有权”的概念,all the ways you can refer to a commit是同行。

您可以更好地了解git log向您展示的结构

git log --graph --decorate --oneline

--date-order以及--topo-order--all一起使用。

答案 1 :(得分:2)

关于您的修改,git log 排序其输出。即使在线性历史中,这也是令人惊讶的。有flags to change the sorting method,添加--graph会将默认排序更改为--topo-order

另一个注意事项是,当git执行分支的快进时,没有合并提交:

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

允许mainline通过简单图表中的快进结果获取branch

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

简单地绘制为一条简单的直线,但强制合并提交(使用git merge --no-ff)会产生实际的双父合并提交:

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

(一旦被推广为具有更多提交)为提交排序过程提供了更有趣的选项。

答案 2 :(得分:0)

你可以&#34;中止&#34;完成并使用后合并

git reflog

返回到您之前的树状态。通常,合并不按时间顺序排序,而是按分支提交顺序排序,然后单独排序。这意味着您将看到您的合并提交,然后是所有源分支提交(按时间顺序),然​​后是主分支提交(按时间顺序)。