V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
snachx
V2EX  ›  问与答

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

  •  
  •   snachx · 2014-08-20 13:52:43 +08:00 · 3869 次点击
    这是一个创建于 3560 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如一个文件内容为如下形式,每行一个字母:
    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 条回复    2014-08-21 11:30:55 +08:00
    liwei
        1
    liwei  
       2014-08-20 15:37:31 +08:00
    1. git format-patch -1 commit2
    2. patch -R < commit2.patch
    nicai000
        2
    nicai000  
       2014-08-20 15:44:58 +08:00   ❤️ 1
    @liwei 另外还修改了一下commit message并commit :)
    liwei
        3
    liwei  
       2014-08-20 17:33:40 +08:00
    @nicai000 是的 :)
    snachx
        4
    snachx  
    OP
       2014-08-20 21:50:57 +08:00
    @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
       2014-08-20 21:52:07 +08:00
    @nicai000 请看上一楼回复,忘了@ 了, 谢谢
    julyclyde
        6
    julyclyde  
       2014-08-21 10:31:28 +08:00   ❤️ 1
    @snachx 一处改了两遍,然后revert较早的那个commit
    snachx
        7
    snachx  
    OP
       2014-08-21 10:51:38 +08:00
    @julyclyde 可以用主贴中的例子详细说明么?非常感谢。
    julyclyde
        8
    julyclyde  
       2014-08-21 10:54:31 +08:00
    @snachx 你按@liwei 的命令执行一下就明白了。看看补丁的内容和要补的文件的内容
    liwei
        9
    liwei  
       2014-08-21 10:58:24 +08:00   ❤️ 1
    我觉得首先你得搞明白两种reject文件格式,然后自己做实验来验证,这些都要靠自己,别人一般没有时间来一步步的给你验证。
    snachx
        10
    snachx  
    OP
       2014-08-21 11:03:23 +08:00
    @julyclyde
    @liwei

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

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

    只是因为git和patch采用了不同的方式来表达reject而已,你可以继续研究。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1296 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 17:21 · PVG 01:21 · LAX 10:21 · JFK 13:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.