使用Git撤销临时更改

6

假设我现在在'master'分支上,并且有一个blob:

DEBUG = FALSE
CACHE_SIZE = 100
code
code
code

现在我要在一个新的分支中进行调试...
DEBUG = TRUE # Don't forget to turn off!
CACHE_SIZE = 0 # Don't forget to set back to 100!

我需要修复一些错误,改变一些代码...并将我的修复合并回“主分支”。但不幸的是,我忘记了将这些“不要忘记”的值返回到原始值。

我如何自动化将某些行返回到原始值的过程?或者至少缩短到一个命令。

也许,一些临时提交、存储或其他技术可以帮助解决这个问题?

3个回答

7

卡梅隆有一些关于短期调试更改的好想法。我想添加一个通用的,即使对于更大或更永久的本地调试更改集,也可以使用的常见方法,就像您每次添加功能时经常进行相同的“不要忘记”更改一样。我听说过它被称为织布机、拼布、堆叠分支和管道。您可以找到这些名称的插件来帮助维护这种工作流程,但是它们之间存在微妙的差异,我从未真正掌握过这种技术,而手动操作也不太困难。

基本思路是在masterfeature之间添加另一个分支,我们称之为debug。您在该分支中进行所有“不要忘记”的更改,然后再从debug再次分支出去,以创建包含将正常进入生产的所有更改的feature。然后,要删除feature中的所有“不要忘记”的更改,请执行以下操作:

git rebase --onto master debug feature

这样看起来你好像是直接从master分支创建了一个新的分支,然后没有将debug分支中的更改合并进去。然后像平常一样合并到master分支。下次想要添加一个新功能时,只需将master分支合并到debug分支,你的“不要忘记”更改会自动应用到最新的上游代码中。然后只需从debug分支创建一个新的功能分支,循环开始。
显然,在合并到master之前,你仍然需要记得进行变基操作。如果你忘记了,可以使用Cameron的钩子想法来防止合并。

完美,正是我所寻找的! - jake_hetfield

3

可能没有办法自动回滚特定行(因为Git实际上没有任何关于文件内容语义的知识),但是有许多方法可以防止这种情况再次发生。

  1. 确保您在提交之前始终检查差异。 git diff /path/to/file 将显示更改,您可以查找“别忘了...”。
  2. 您可以使用grep自动化一些操作:git diff | grep "Don't forget"
  3. 您甚至可以有一个钩子来检查正则表达式(例如“Don't forget”)并禁止匹配的提交。这可以在本地存储库或要推送到的存储库中进行。

选项2可能是最简单的。它仍然需要一些纪律性-您需要确保始终在注释中放置“Don't forget”(或“TODO”,或“FIXME”或其他内容),并且您需要运行git diff | grep,但这并不需要太多额外的工作量。

选项3将使长期防止此问题变得更加容易,特别是如果您是团队的一部分。当然,任何人都可以将注释更改为“Do not forget”(或完全删除注释)并绕过检查,但这总比没有好。


1

一些用户避免使用Git的索引(例如,始终使用git commit -a并仅使用git add引入新文件),但我发现索引在这种情况下非常有用。

关键是不要在第一时间提交您的“调试”更改。

  1. 我运行 git diff 来查看可以暂存的更改(即索引和工作树之间的差异)。

    1. 对于没有任何“debug”更改的文件,我使用

      git add <pathspec> …
      

      将这些文件的更改暂存。

    2. 如果某些文件既有“debug”更改又有预期更改,则我在这些文件上使用

      git add -p <pathspec> …
      

      跳过所有“debug”块。

      如果一个块既有“debug”更改又有预期更改,则我使用 git add -p 中的分割和/或编辑命令只暂存预期更改。

  2. 提交之前,我使用 git diff --cached 仔细检查已暂存的更改(即 HEAD 和索引之间的差异)。

    • 如果“debug”更改进入了最终索引,则我使用

      git reset -p <pathspec> …
      

      (可能使用其分割或编辑命令)从索引中丢弃“debug”更改。


注意:如果您直接从“调试”工作树进行测试,则应该知道您始终在使用您的“调试”更改进行测试。在某些代码库中,某些“调试”更改的存在可能会显着改变测试系统的行为。如果对于您的团队来说,任何发布的提交都不能失败测试,则应花时间测试您提交的内容(不包括调试更改)。
您可以在每次提交后使用git stash将您的“调试”更改存储起来,重新构建并测试您提交的内容。测试完成后,您可以使用git stash pop将您的“调试”更改恢复到您的工作树中。

git reset -p 最早出现在 Git 1.6.5 中(还有 git checkout -pgit stash -p)。git add -p 最早出现在 Git 1.5.4 中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接