【问题标题】:Git - rolling back to a previous commit without losing workGit - 回滚到之前的提交而不丢失工作
【发布时间】:2013-07-08 15:36:41
【问题描述】:

我之前一直在研究功能并将它们合并到一个主分支中。现在,我需要将 master 维护为仅具有稳定功能的分支,然后在 dev 分支上工作以构建新功能。

问题是我领先于我在 master 上的目标稳定提交。

我想设置 master 说,5 次提交前,向上推该分支,然后将其作为一个稳定的分支来部署到我的生产服务器。

这是我到目前为止所做的: 在最新提交(在我的稳定提交之前),我创建了一个新分支“dev” 现在 dev 将是我不稳定的新功能构建。

现在我在同一个(不稳定的)提交中与 master 和 dev 坐在一起。

我希望主人现在坐在我之前的稳定提交(5 次之前)。

额外的问题 - 如果我想添加来自 dev 的功能(这将是 x 提交在 master 之前),但只有在它们稳定之后,这可能吗? 假设我正在开发,我已经构建了一个活动提要和一个电子邮件系统,我只想包含电子邮件系统。

如何在不引入所有其他更改的情况下将我的电子邮件系统功能分支合并到 master(dev 后面的 5 个提交,这是电子邮件系统分支的基础)而不引入我的所有其他更改(在这 5 个提交中 dev 在 master 之前所做的更改) ?

如果我能澄清任何事情,请告诉我。

【问题讨论】:

  • 你已经推送了什么?将本地 master 移回您想要的位置非常容易(git checkout master; git reset --hard )。

标签: git merge branch


【解决方案1】:

撤消提交:

git reset HEAD~5 --hard # 5 being number of commits, --hard to not keep around changed files

由于您从 master 分支,提交历史仍然存在于 dev 中。准备好后重新合并到 master 中。

至于你的额外问题,这通常是通过功能分支来完成的。例如,我通常有几个我正在研究的分支:master(这里只有稳定代码)、1.x(这里只有发布代码)、feature-X、feature-Y 等。

每个功能都是沙盒化的,所以当它准备好时,我只是将它合并到 master 中。如果一个特征 Y 依赖于 X,我将 X 合并到 Y 中并继续工作。完成后,合并到master,测试和推送。

关于这种开发风格有一篇很好的文章:http://nvie.com/posts/a-successful-git-branching-model/。这篇文章介绍了git-flow,它很受欢迎。我没有完全按照书面使用它,但我从中得到了一些建议。

您也可以针对 master 进行 rebase,排除您不想保留的提交。为此,我会使用git rebase -i master(-i 是交互式的)。这将让您在合并到 master 之前查看和操作提交。我建议您在执行此操作之前进行分支,以防止破坏您的分支。

【讨论】:

  • 为了更加清楚(因为通过硬重置丢失这 5 个提交会非常糟糕),master 上的硬重置不会对我的 dev 分支做任何事情?
  • 没错。如果您偏执,请先在测试分支上进行。除非您推送,否则它不会弄乱您的远程分支。
  • 另外,感谢您添加到 git-flow 的链接。我第一次开始使用 git 时读过它,但现在我已经使用了一段时间,我相信我实际上已经准备好开始使用它了。
【解决方案2】:

这样做是为了维护一个指向你当前主人的指针

git branch -m master old_master

然后

git checkout -b master HEAD~5

要在 5 次提交前移动 tour master(或指定一个 sha),然后您可以删除 old_master

git branch -d old_master

对于额外的问题,您可以开发功能分支并将它们与开发分支中的 --no-ff 合并,然后坐在 master 上执行 git merge --no-ff devcommit ,其中 devcommit 表示该功能的合并开发中的分支。

您可以在this 中看到有关如何执行此操作的示例。

【讨论】:

    【解决方案3】:

    在您的分支主机上:

    • git checkout -b dev :你现在有一个 dev 分支指向与 master 相同的哈希(不稳定)
    • git reset --hard HEAD~5 : master 现在是 5 次之前的提交(您的不稳定提交仍在您的分支上)

    奖金:

    • 寻找git cherry-pick
    • 在 dev 的分支上构建您的“电子邮件”功能,然后在 masterrebase 您的分支电子邮件(在电子邮件分支上:git rebase master

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-21
      • 2015-12-12
      • 1970-01-01
      • 2021-07-19
      • 1970-01-01
      • 1970-01-01
      • 2010-09-29
      • 1970-01-01
      相关资源
      最近更新 更多