0

我不确定这是否是重复的,因为它是一种一次性的场景:

我有一个“beta”分支,并开始了一个新的“重构”分支。

  1. 我在“重构”分支中做了一堆代码。
  2. 我将最新的更改从 beta 提取到重构 ( git checkout refactor && git pull origin beta)
  3. 我的更改已经准备好,所以我检查了 beta 版,并将更改从重构拉到了 beta 版。( git checkout beta && git pull origin refactor)
  4. 意识到我的 beta 分支不是最新的,所以不得不做一个git pull把最新的拉到 beta 中。
  5. 现在 beta 分支是最新的,做另一个git pull origin refactor以确保最新版本在那里(收到一条自动提交消息,表明重构正在合并到 beta 中)。
  6. 我推了我的代码:(

所以现在我意识到我做错了两件事:

  1. 在第 3 步中,我应该先执行 git pull,以便拥有最新的 beta 变更集
  2. 在第 3 步中,我意识到我应该打电话git merge refactor而不是git pull origin refactor(不要问我为什么这样做,现在是星期一,我只是想将我很棒的重构代码放入 beta 版开始测试)。我现在意识到,如果我已经完成了这两件事,则不需要后面的任何步骤。

所以我的问题是:从技术上讲,所有代码都在那里并且看起来不错,但是 github 上的网络图看起来超级时髦,而且我没有一个干净的“合并”提交,如果我的合并分支我可以轻松回滚需要还原,而 beta 版现在拥有我所有来自重构分支的个人提交。有没有一种简单的方法可以回滚我的愚蠢合并并以更清洁的方式进行?

我已经尝试过这样做git checkout beta && git reset --hard beta@{"1 hour ago"},但问题是这让我进入了过时的本地 beta 版本,而不是在我应该先完成 git pull 时发布合并之前的最新版本。我觉得应该有一种方法可以在 1 小时前git reset --hard origin/beta@{"1 hour ago"}重置到远程beta 分支,然后执行git merge refactor? 我是否能够推送这些更改并确保远程提交被覆盖?

提前感谢您的帮助!我对使用“git reset”做任何事情犹豫不决,因为重构非常重要,并且在 beta 中有很多我没有做的待定更改,所以我更担心搞砸重置并丢失代码比我担心必须从拉入的重构分支手动恢复提交。

4

1 回答 1

0

您是否对 beta 分支进行了强制推送?

如果是这样,我假设您不需要与其他开发人员同步这个,所以可以再次强制推送。在这种情况下,我建议:

  • 例如,为最后 10 次提交“git rebase -i HEAD~10”做一个交互式变基
  • 删除从重构分支合并的提交,并确保测试版是干净的并且更新了分支的最新版本
  • 强推
  • 转到重构分支并将其重新设置为 beta (git checkout refactor && git rebase beta)
  • 转到 beta 并在没有 ff 的情况下合并重构(git checkout beta && git merge --no-ff refactor)
  • 这将为您提供漂亮且可读的历史图表

如果你不能强制推动,那么你可以使图表更加复杂。您可以对从重构中退出的每个 beta 提交进行还原提交。这样,您将让 beta 分支进入干净和更新的状态。之后,只需重复上层配方的最后 3 个步骤。你会从中得到很好的图表,但在此之前的历史仍然存在。

于 2013-08-12T22:06:45.093 回答