这个问题是关于如何在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吗?
答案 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