2017-04-13 93 views

回答

2

那么,超短回答是,它总是-m 1。 :-)但是,这需要解释一下:

  • 父母是有序的,而像git loggit show命令显示的顺序为:

    commit c13c783c9d3d7d3eff937b7bf3642d2a7fe32644 
    Merge: 3f7ebc6ec 39ee4c6c2 
    

    所以这里3f7ebc6ec被父#1和39ee4c6c2是父母#2。

  • 后缀^操作需要这些相同的值:

    $ git rev-parse c13c783c9d3d7d3eff937b7bf3642d2a7fe32644^1 
    3f7ebc6ece46f1c23480d094688b8b5f24eb345c 
    

    (当然...^2的将是另一个)。

  • 绘制图形的程序(包括git log --graph)将向您显示这些图形如何连接。

  • 但最重要的是,第一个任何合并的父级是您进行合并时的当前提交。

特别地,这意味着,如果你在分支main和运行git merge sidebranch,提交你现在做(如果一切顺利的话)或最终(如果必须通过手动来解决合并)由作为其第一个父母,main分支的前一个技巧。它的第二个父母因此是sidebranch的小费。

假设,那么,我们有这个入手:

...--o--*--A--B------C <-- main 
     \ 
      D--E--F--G--H <-- sidebranch 

当我们运行git merge。在共同的基础提交是*,和Git进行新的合并提交M分别做,本质:

  1. git diff * C(什么?我们什么改变)
  2. git diff * H(他们怎么改变?)

,然后结合这两套变化,并运用那些*,给我们这个最终结果:

...--o--*--A--B------C--M <-- main 
     \   /
      D--E--F--G--H <-- sidebranch 

现在,如果在D-E-F-G-H改变了一切,在A-B-C改变是完全独立的一切,如何 Git做了回复,只要它保持A-B-C更改,同时开沟D-E-F-G-H更改也没关系。

但是,如果BF大体相同,即BF修复了一个错误呢?在这种情况下,我们不要想撤销BF的共享更改,即Git拿了一份副本。 这就是-m 1部分来自于。

git revert去撤消一些变化,它运行其自己的git diff。它运行的git diff将要恢复的提交与其父项进行比较。对于任何普通的非合并提交,这很容易:比较BAE vs D或其他什么,以查看发生了什么,并将其退出。但是,对于合并提交,并不清楚要比较哪个父级(除非它是:-))。这里的第一C,所以让我们看看我们得到什么,如果我们运行:

git diff C M 

CM之间的变化是那些我们拾起加入的变化从D-E-F-G-H的变化,我们已经有A-B-C,如果我们比较M*。换句话说:

  • 如果BF重叠100%,在C航班吗M变化是D-E-G-H:家居除了的重叠。所以我们结束了这些。

  • 如果F中有变化比B,在C航班吗M的变化是D-E-(some-of-F)-G-H:我们拉闸复原这些修改,但不是那些在B

  • 如果F中有较少变化比B的变化C航班吗M只是D-E-G-H再次,我们拉闸恢复只是那些。

因为第一父C,我们要回退D-E-F-G-H的变化(不包括任何通过A-B-C我们已经有了),我们想在这个复归-m 1

相关问题