我需要使用这样的单个提交来恢复整个分支:
[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的回购。
[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
,因为更多“正确”的解决方案已经落在这里但不能应用于{ {1}}因某种原因而分支。所以,我必须做以下事情......
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
(点M),然后执行“revert-all-this-shit”提交(点X)并将其合并为release-3
(点D)所以这段代码永远不会到达,即使这样,整个development
分支也会合并到release-3
,然后释放完成。
这就是我需要恢复整个分支的原因......
问题
虽然根本问题已经解决,但如果development
已合并到topic
release
将失败,那么获取分支的叉点仍然存在问题。
答案 0 :(得分: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 documentation:
我们
这解决了任意数量的头,但是合并的结果树始终是当前分支头的树,实际上忽略了来自所有其他分支的所有更改。它旨在用于取代侧枝的旧发展历史。请注意,这与递归合并策略的-Xours选项不同。
例如:
git checkout master
git merge -s ours topic
答案 1 :(得分:2)
您可以将提交的树信息读入索引,然后提交索引。这样,您的新提交将具有与旧提交完全相同的树状态。
git checkout topic
git read-tree master~2
git commit -m 'revert complete branch'
我可以问你为什么这样做?你想解决什么问题?有一个分支然后完全恢复的目的是什么?
答案 2 :(得分: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
与其他解决方案相比,此解决方案更好,因为它创建了合并提交,明确显示指向您要恢复的提交的确切历史记录。
答案 3 :(得分:-1)
我不知道,如果我做对了,但不应该只是那个吗?
git checkout topic
git reset --hard master~2