关于github:如何停止在git中合并?

How to stop merging in git?

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

1
2
3
4
5
6
7
8
git checkout master
git merge BranchA

>> Fast-forward merge

git merge BranchB

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

我的问题有两个:

  • 如何中止合并?通过三种方式的合并,我向编辑器展示了在哪里编写合并提交消息。但是如果我不保存就退出,Git将继续进行合并(只是合并提交消息将是默认消息,而不是我本来可以编写但中止的消息)

    1
    2
    commit 11111233
        Merge 'BranchB' into master

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

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

编辑

为了更好地解释第二个问题,我做了一个测试:2个分支(A和B),从主分支开始。我在B上做了承诺,然后在A上做了承诺,然后在B上做了承诺,最后在A上做了承诺。然后我把brancha合并成master。然后分支成为主。

但当我向师父问话时,这就是我所说的,也是我问第二个问题的原因:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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所写)我应该首先(按时间顺序)从合并的分支A提交所有的提交,然后按照合并的顺序从合并的分支B提交所有的提交……但有趣的是,git log是如何按时间顺序显示的,而提交并不是按分支分组显示的!


BranchB合并是非常普通的,请求一个普通的提交消息。有一个默认值,如果不更改就退出,合并将完成。由于合并本身已经成功,现在停止它的唯一方法是提供一个错误的合并消息(空的合并消息将在没有钩子的情况下进行)。

当合并停止时,可以使用

1
2
3
git merge --abort
# or
git reset --merge

你刚才犯的错误是

1
git reset --hard @{1}

在Git中没有分支"所有权"的概念,所有引用提交的方法都是对等的。

您可以更好地了解Git日志向您显示的结构

1
git log --graph --decorate --oneline

--date-order--topo-order--all试试。


关于您的编辑,git log对其输出进行排序。即使在线性历史中,这也会令人惊讶。有更改排序方法的标志,添加--graph将默认排序更改为--topo-order

另一项需要注意的是,当Git快速转发分支时,不存在合并提交:

1
2
3
      C---D   <-- branch
     /
A---B         <-- mainline

允许mainline通过快进获得branch,在简单图中得到:

1
2
3
      C---D   <-- mainline, branch
     /
A---B

它被简单地画成一条直线,但是强制合并提交(与git merge --no-ff一起)会产生实际的双亲合并提交:

1
2
3
      C---D   <-- branch
     /     \
A---B-------M <-- mainline

对于提交排序过程,它(一旦被概括为具有更多提交)提供了更有趣的选项。


完成并使用后,可以"中止"合并。

1
git reflog

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