我能创建一个用来反转改动的提交分支吗?

编程语言 2026-07-12

就让我们设想我在Git上有一段代码,想在合并到master之前删除它,但未来某个时刻可能还会再用到它(例如用于调试之类的)。

例如

public class MyClass {
  private bool _myProperty;
  public MyClass(bool myProperty) {
    _myProperty = myProperty;
    Console.WriteLine("MyClass has been created");
  }
}

现在我要把这段代码合并到master分支,但我不想让 Console.WriteLine() 那一行被包含进去。

不过,未来某个时点,我也可能想把它再找回。

如果我的文件原本没有它,那就很简单——我可以添加这行,然后把改动stash起来,或创建一个新分支来保存这行新增的内容,等需要时再应用/合并。

但我想做的恰恰是相反的——因为stash里没有这行的新增,我没法按那种方式来做——没有可stash的内容。

我尝试过的是这样的:

  1. 删除这些行并提交。
  2. 新建一个分支,在这个分支上创建上述提交的反向提交。
  3. 现在在原分支上,如果想要这些行重新出现,可以cherry-pick上述反向提交。

这在一定程度上可行,但往往会产生大量冲突,而且随着原分支的后续开发,冲突可能会越来越多……有没有更干净的办法?

解决方案

你已经尝试的模式,如果正确执行,应该完全没有问题。这样做不会“产生大量冲突”,也不会“很可能更多”。

请注意,如果你把代码放在一个提交中保留、在另一个提交中移除,其实你甚至不需要单独的分支。只有当你决定把移除代码的操作当成从未发生过来处理时,才需要另建一个分支,并在旁边把这几行新增的内容保存到另一个分支中。

假设你现在在分支 feature 上。

简单做法:把代码放到一个新的、可还原的提交中:

  1. 删除这些行,然后:
  2. git commit -m "Remove logging"
  3. 如果你想把日志再放回去,只需 git revert 那个提交。

稍微困难一点的做法:移除代码及历史,并把改动保存到一边:

  1. 新建一个用于未来用途的分支:git branch my-cool-ideas/add-logging feature
  2. feature 检出,在添加日志的提交上进行修改。 (可以用 --amend,或用带修复的交互式rebase。) 现在 feature 看起来就好像从来没有包含日志代码。
  3. 切换到新分支:git switch my-cool-ideas/add-logging
  4. 将它重置为指向feature分支:git reset --soft feature
  5. 现在 git statusgit diff --staged 会向你展示,所有修改其实都是在“添加”日志。你可以按需要现在 git stash,并删除临时分支,或者,
  6. 提交:git commit -m "Add logging"
  7. 切回到你的特性分支:git switch feature
  8. 现在你可以通过stash pop或 cherry-pick,将这段代码保存到stash或分支中,供未来使用。

备注:

  • 如果你在本来要提交的PR中已经添加了新的日志代码,那么我更倾向于选项2(稍微难一些的做法)。如果你没有在这个PR中添加那段日志代码(也许它已经在 main 上),那么无论如何你都必须选择选项1,也最简单。
  • 选项2 和你已经尝试的差不多。无论是还原(revert)还是stash pop/cherry-pick,都没有什么特别之处会导致比通常情况更多的冲突。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章