5

我需要用这样的一次提交来恢复整个分支:

          [topic]
     o---o---o-------X
    /
   |      [master]
---o---o---o

提交X必须具有像master~2(主题分支的起点)这样的状态

我的解决方案是:

git rev-list --reverse master..topic | while read SHA; do
   git revert -n ${SHA}
done
git commit -m "Reverted topic branch"

有没有更好(更短)的解决方案?

目的

想象一下,我有一种几乎基于 git-flow 的 repo。

              [release-3]
       o---o---o---o
      /         \       [fix-for-rc-3]
     /           o---o---o
    /
   |      [development]
---o---o---o

我有一个development分支,即将到来release-3的分支和一个所谓的hot-fix-feature-for-rc-3分支。在这个分支中,我正在做一些丑陋的黑客来完成我的发布,但我根本不想要它,development因为更多“正确”的解决方案已经在这里登陆,但由于某种原因不能应用于release-3分支。所以,我必须做以下事情......

                                    [release-3]
       o---o---o---o--------------------M
      /         \       [fix-for-rc-3] /
     /           o---o---o----------------X
    /                                      \
   |                                        \[development]
---o---o---o---------------------------------D

我必须合并fix-for-rc-3到一个release-3(点 M),然后做一个“revert-all-this-shit”提交(点 X)并合并它development(点 D)所以这段代码永远不会到达这里,即使整个release-3分支被合并development然后释放完成。

这就是为什么我需要恢复整个分支......

问题

虽然解决了根本问题,但如果topic已经合并到分支,则仍然存在获取分支点的问题release merge-base

4

4 回答 4

5

您可以像这样创建一个恢复到分支基础的提交:

# on "topic" branch
git read-tree $(git merge-base topic master)
git commit -m "Reverted topic branch"
git checkout -- . # update working copy to match the committed tree

在您的示例使用中,您希望恢复更改,以便您可以将分支合并回master(或development在您的示例中调用),而无需实际合并来自topic分支的任何更改。但这可以通过使用“我们的”合并策略在不添加还原提交的情况下完成。从git-merge 文档

我们的

这解决了任意数量的头,但合并的结果树始终是当前分支头的树,有效地忽略了所有其他分支的所有更改。它旨在用于取代分支的旧开发历史。请注意,这与递归合并策略的 -Xours 选项不同。

例如:

git checkout master
git merge -s ours topic
于 2013-10-14T17:57:39.827 回答
2

您可以将提交的树信息读入索引,然后提交索引。这样,您的新提交将具有与旧提交完全相同的树状态。

git checkout topic
git read-tree master~2
git commit -m 'revert complete branch'

我可以问你为什么这样做吗?你想解决什么问题?拥有一个然后完全还原的分支的目的是什么?

于 2013-10-14T18:16:43.503 回答
1

什么是“合并”与“我们的”战略?

$ git checkout master~2
......
HEAD is now at 06a96da... c2
$ git merge -s ours topic 
Merge made by the 'ours' strategy.
kan@altegol:/tmp/g$ git checkout topic 
Warning: you are leaving 1 commit behind, not connected to
any of your branches:

  cdaad73 Merge branch 'topic' into HEAD
....
Switched to branch 'topic'
$ git merge cdaad73
Updating 0b980be..cdaad73
Fast-forward

与其他解决方案相比,此解决方案更好,因为它创建了合并提交,该提交明确显示了指向您要恢复到的提交的确切历史记录。

于 2013-10-14T18:16:55.670 回答
-1

我不知道,如果我做对了,但不应该只是这样吗?

git checkout topic
git reset --hard master~2
于 2013-10-14T18:26:57.267 回答