我能创建一个用来反转改动的提交分支吗?
就让我们设想我在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的内容。
我尝试过的是这样的:
- 删除这些行并提交。
- 新建一个分支,在这个分支上创建上述提交的反向提交。
- 现在在原分支上,如果想要这些行重新出现,可以cherry-pick上述反向提交。
这在一定程度上可行,但往往会产生大量冲突,而且随着原分支的后续开发,冲突可能会越来越多……有没有更干净的办法?
解决方案
你已经尝试的模式,如果正确执行,应该完全没有问题。这样做不会“产生大量冲突”,也不会“很可能更多”。
请注意,如果你把代码放在一个提交中保留、在另一个提交中移除,其实你甚至不需要单独的分支。只有当你决定把移除代码的操作当成从未发生过来处理时,才需要另建一个分支,并在旁边把这几行新增的内容保存到另一个分支中。
假设你现在在分支 feature 上。
简单做法:把代码放到一个新的、可还原的提交中:
- 删除这些行,然后:
git commit -m "Remove logging"- 如果你想把日志再放回去,只需
git revert那个提交。
稍微困难一点的做法:移除代码及历史,并把改动保存到一边:
- 新建一个用于未来用途的分支:
git branch my-cool-ideas/add-logging feature - 将
feature检出,在添加日志的提交上进行修改。 (可以用--amend,或用带修复的交互式rebase。) 现在feature看起来就好像从来没有包含日志代码。 - 切换到新分支:
git switch my-cool-ideas/add-logging - 将它重置为指向feature分支:
git reset --soft feature - 现在
git status和git diff --staged会向你展示,所有修改其实都是在“添加”日志。你可以按需要现在git stash,并删除临时分支,或者, - 提交:
git commit -m "Add logging" - 切回到你的特性分支:
git switch feature - 现在你可以通过stash pop或 cherry-pick,将这段代码保存到stash或分支中,供未来使用。
备注:
- 如果你在本来要提交的PR中已经添加了新的日志代码,那么我更倾向于选项2(稍微难一些的做法)。如果你没有在这个PR中添加那段日志代码(也许它已经在
main上),那么无论如何你都必须选择选项1,也最简单。 - 选项2 和你已经尝试的差不多。无论是还原(revert)还是stash pop/cherry-pick,都没有什么特别之处会导致比通常情况更多的冲突。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。