基本的git进程 - 我编码错误的方向,现在我想备份

时间:2014-08-20 21:21:26

标签: git version-control workflow branch revert

我的场景,使用git:

  • 写了一些代码并提交了
  • 添加了功能1并已提交
  • 添加了功能2并已提交
  • 添加了功能3并提交了
  • 添加了功能4并提交了

依旧......

一切都是掌握的。

我现在已经决定我不想在此时实现功能3和4(将来可能需要它们)。所以我想"回去" (关于“" revert"所以我将避免使用它”这个词有很多争论,只是在功能2的提交之后继续进行。

我觉得分支在某种程度上在这里,但我不知道该怎么做。我想首先理解逻辑场景,然后理解让我到那里的命令。

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,具体取决于您团队的工作流程