snachx
V2EX  ›  问与答

使用 git revert <commit-id>的时候,git 具体做了什么操作呢?

  •  
  •   snachx · Aug 20, 2014 · 4344 views
    This topic created in 4293 days ago, the information mentioned may be changed or developed.
    比如一个文件内容为如下形式,每行一个字母:
    a
    b
    c
    d
    e

    commit流程如下:

    commit5 abcze -> qxcze
    commit4 amcze -> abcze
    commit3 axcde -> amcze
    commit2 abcde -> axcde
    commit1 null -> abcde

    revert commit2

    这时候,结果会是冲突,内容变成如下:
    <<<<<<< HEAD
    q
    x
    ===========
    a
    b
    >>>>>>> parent of commit2
    c
    z
    e

    请问这个revert过程,git到底怎么处理的呢?不知道如何得到最终冲突结果的。
    11 replies    2014-08-21 11:30:55 +08:00
    liwei
        1
    liwei  
       Aug 20, 2014
    1. git format-patch -1 commit2
    2. patch -R < commit2.patch
    nicai000
        2
    nicai000  
       Aug 20, 2014   ❤️ 1
    @liwei 另外还修改了一下commit message并commit :)
    liwei
        3
    liwei  
       Aug 20, 2014
    @nicai000 是的 :)
    snachx
        4
    snachx  
    OP
       Aug 20, 2014
    @liwei 我试了一下,对于我举的例子,步骤2提示:

    Hunk #1 FAILED at 1.
    1 out of 1 hunk FAILED -- saving rejects to file test.rej

    test.rej的内容是:
    ***************
    *** 1,5 ****
    a
    - x
    c
    d
    e
    --- 1,5 ----
    a
    + b
    c
    d
    e

    这个怎么和例子中的revert冲突联系起来呢?其实我就想知道,git是怎么得出a,b和q,x两行冲突的。

    谢谢!
    snachx
        5
    snachx  
    OP
       Aug 20, 2014
    @nicai000 请看上一楼回复,忘了@ 了, 谢谢
    julyclyde
        6
    julyclyde  
       Aug 21, 2014   ❤️ 1
    @snachx 一处改了两遍,然后revert较早的那个commit
    snachx
        7
    snachx  
    OP
       Aug 21, 2014
    @julyclyde 可以用主贴中的例子详细说明么?非常感谢。
    julyclyde
        8
    julyclyde  
       Aug 21, 2014
    @snachx 你按@liwei 的命令执行一下就明白了。看看补丁的内容和要补的文件的内容
    liwei
        9
    liwei  
       Aug 21, 2014   ❤️ 1
    我觉得首先你得搞明白两种reject文件格式,然后自己做实验来验证,这些都要靠自己,别人一般没有时间来一步步的给你验证。
    snachx
        10
    snachx  
    OP
       Aug 21, 2014
    @julyclyde
    @liwei

    OK,tks,本来没问之前我就是@liwei 在一楼说的想法,自己实验了挺多次,换了几种不同的流程,发现和预期结果不一样。

    来问了发现你们也是这种想法,但是解释不了疑问,抱歉,我再去试试。
    liwei
        11
    liwei  
       Aug 21, 2014
    1. git format-patch -1 commit2
    2. patch -p1 -R --merge < 0001-commit-2.patch

    只是因为git和patch采用了不同的方式来表达reject而已,你可以继续研究。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5337 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 48ms · UTC 07:37 · PVG 15:37 · LAX 00:37 · JFK 03:37
    ♥ Do have faith in what you're doing.