我的场景,使用git:
等等..。
当然,一切都在师父的掌握之中。
我现在决定现在不想实现特性3和4(将来可能需要它们)。因此,我想“回去”(关于“还原”这个词有很多争论,所以我将避免使用它),就在功能2的提交和继续之后。
我觉得分叉在这里的方程式里,但我不知道该怎么做。我想先了解逻辑场景,然后再理解将我送到那里的命令。
发布于 2014-08-20 21:48:37
有几个选项取决于您是否将这些更改推送到远程服务器。
如果您还没有升级到remote,我将创建一个针对Feature4的特性分支,并将master重新设置为Feature2。
git checkout -b <feature-branch> master
git checkout master
git reset --hard HEAD^^如果您已经将更改推送到远程,我将选择另一条路线,因为更改公开的提交通常是个坏主意。
git checkout master
git revert <feature 3 sha>
git revert <feature 4 sha>
git checkout -b <feature-branch> master
git cherry-pick <feature 3 sha>
git cherry-pick <feature 4 sha>发布于 2014-08-20 21:51:57
所以你现在拥有的是一条在一个分支上的提交链:
--(1)--(2)--(3)--(4) master从这里你可以做很多事情。这是我会采取的方法。首先创建一些分支来跟踪您已经完成的工作:
git branch features/3_and_4
git branch features/1_and_2 commit_2
------------ features/1_and_2
|
--(1)--(2)--(3)--(4) master
features/3_and_4在您继续之前,检查这些分支并验证它们包含您想要的历史记录,我们即将做一些可能具有破坏性的事情。
git checkout master
git reset --hard commit_2现在我们应该:
--(1)--(2) master
| features/1_and_2
|
--(3)--(4) features/3_and_4现在你处于向前迈进的有利位置。如果完成了特性1和2,您可以将它们的分支合并为master并在那里继续开发(尽管我建议您为每个特性启动一个新的分支,并在功能完成后将其合并。
最后,在做了一些其他更改之后,您可能会返回到特性3和4。然后,您将看到如下内容:
--(1)--(2)--(5)--(6) master
|
--(3)--(4) features/3_and_4这就是您可能希望rebase更新旧功能的地方:
git checkout features/3_and_4
git rebase master
--(1)--(2)--(5)--(6) master
|
--(3)--(4) features/3_and_4以上所有的假设都假设您处于重写历史的好位置,没有其他人看到这些更改,因此重新排序是很好的。如果不是这样的话,您仍然可以从相同的分支开始,但是您希望避免使用reset,也可以根据团队的工作流程避免rebase。
https://stackoverflow.com/questions/25414647
复制相似问题