用分支恢复git中的reversion,并且可读

时间:2016-12-02 15:03:14

标签: git version-control

这个问题是关于如何在git中恢复还原,并以对未来读者有意义的方式进行,并且永远不会将存储库置于不良状态。

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

HEAD
   |
   G

然后在分支机构上发生了一些开发,那些提交看起来很好,所以它们被合并为主。

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

但后来我们在这些提交中找到了一个微妙的错误。很明显,我们可以回滚到G然后花一些时间来思考这个问题。所以我们这样做了。提交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吗?

1 个答案:

答案 0 :(得分:1)

我也很确定它会起作用。其他方式 -

使用E1 & E2 D1 rebase -i之前挑选 HEAD | G -- C1 -- ... -- Ck -- R -- E1 -- E2 | \ -- E1 -- E2 -- D1 -- ... -- Dj | B 。{/ p>

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 分支。

if