代码之家  ›  专栏  ›  技术社区  ›  jma

使用分支在git中还原还原,并且可读

  •  2
  • jma  · 技术社区  · 8 年前

    我的git存储库有一段时间(在master上)指向一个非常好的提交:

    HEAD
       |
       G
    

    然后在分支上进行了一些开发,这些提交看起来很好,所以它们被合并到了master中。

                   HEAD
                      |
    G -- C1 -- ... -- Ck
    

    但是我们在这些提交中发现了一个微妙的错误。很明显,我们可以回到G,然后花一些时间来考虑这个问题。所以我们做到了。Commit R是通过键入以下内容实现的恢复:

    $ git checkout -b B
    $ git checkout master
    $ git revert --no-commit G..HEAD
    

    这使我的存储库处于这样一种状态,除了历史记录之外,R和G看起来是一样的:

                         HEAD
                            |
    G -- C1 -- ... -- Ck -- R
                      |
                      B
    

    然后,又发生了一些新的发展:在主设备(E1,E2)上的一些紧急任务,在B(D1,…,Dj)上进行了一些额外的开发,纠正了我们在Ck的问题,并继续了一些其他重要的工作。现在存储库看起来像这样:

                                    HEAD
                                       |
    G -- C1 -- ... -- Ck -- R -- E1 -- E2
                      |
                       \ -- D1 -- ... -- Dj
                                         |
                                         B
    

    很好,这只是一天,但现在是时候把事情整理好了。我想要的是一个类似这样的存储库:

                                                               HEAD
                                                                  |
    G -- C1 -- ... -- Ck -- R -- E1 -- E2 -- (-R) -- D1 -- ... -- Dj
    

    其中(-R)是一个撤销R的提交,我希望以某种合理的方式这样做,以便将来的读者清楚发生了什么。

    我想到的最好的方法是:

    $ git checkout B
    $ git rebase master
    $ git revert R
    # Use the rebase -i to change ordering so that R happens before D1:
    $ git rebase -i master
    $ git checkout master
    $ git merge --ff-only B
    $ git push
    

    我有理由相信这会奏效,但我觉得我遗漏了一些东西。有什么建议可以帮助我提高git-fu吗?

    2 回复  |  直到 8 年前
        1
  •  1
  •   Marina Liu    8 年前

    此外,还有两种方法,步骤很少。

    1:

    git checkout B
    git rebase -i master
    git branch -D master
    git branch -m B master
    

    2:

    git rebase --onto Ck R E2
    git rebase --onto <current SHA-1> Ck Dj
    git checkout -b temp
    git branch -D master
    git branch -m temp master
    

    因此,主分支将如下所示:

    G -- C1 -- ... -- Ck -- E1 -- E2 -- D1 -- ... -- Dj     master
    
        2
  •  1
  •   Sajib Khan    8 年前

    择优挑选 E1 & E2 之前 D1 使用 rebase -i .

                                       HEAD
                                       |
    G -- C1 -- ... -- Ck -- R -- E1 -- E2
                      |
                       \ -- E1 -- E2 -- D1 -- ... -- Dj
                                                     |
                                                     B
    

    然后替换 master B 树枝

    $ git checkout B
    $ git branch -D master                   # delete master
    $ git checkout -b master                 # create master from B
    $ git push -f origin master              # force(-f) push and replace remote master's history by local master