我的场景,使用git:
依旧......
一切都是掌握的。
我现在已经决定我不想在此时实现功能3和4(将来可能需要它们)。所以我想"回去" (关于“" revert"所以我将避免使用它”这个词有很多争论,只是在功能2的提交之后继续进行。
我觉得分支在某种程度上在这里,但我不知道该怎么做。我想首先理解逻辑场景,然后理解让我到那里的命令。
答案 0 :(得分:1)
根据您是否已将这些更改推送到远程服务器,有几个选项。
如果你还没有推到远程,我会创建一个指向功能4的功能分支,并将主设备重置回功能2.
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>
答案 1 :(得分:0)
所以你现在拥有的是一个分支上的一系列提交:
--(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中并继续在那里进行开发(虽然我建议你为每个功能启动一个新的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
,具体取决于您团队的工作流程