使用Git撤消临时更改

时间:2011-03-27 01:25:47

标签: git debugging

说,我在'掌握'并且有一个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!

...修复一些错误,更改一些代码......并将我的修复程序合并回“master”。但不幸的是,我忘记了将这些“别忘了”-s归还原始价值。

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

也许,一些临时提交,藏匿或其他技术?

3 个答案:

答案 0 :(得分:7)

Cameron对短期调试更改有一些好主意。我想添加一个常用的工具,即使对于更大或更永久的本地调试更改也是如此,例如,如果每次添加功能时通常都会进行相同的“不要忘记”更改。我听说它叫织机,被子,堆叠的树枝和管道。你可以找到带有这些名称的插件来帮助维护这种工作流程,但是它们之间存在着微妙的差异,我从来没有真正掌握过,而且这种技术并不难以手动完成。

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

git rebase --onto master debug feature

这使得它看起来像你直接从 master 分支,并且从未在 debug 分支中添加更改。然后你像正常一样合并到 master 。下次要添加功能时,只需将合并到 debug 中,您的“不要忘记”更改会自动重新应用到最新的上游代码。然后,只需从 debug 创建一个新的功能分支,然后重新开始循环。

显然,在合并到 master 之前,你仍然需要记住进行rebase。如果你忘了,Cameron的钩子想法可以用来防止合并。

答案 1 :(得分:3)

可能无法自动回滚特定行(因为Git并不真正了解文件内容的语义),但是有很多方法可以在将来再次阻止这种情况发生。

  1. 确保在提交前始终检查差异。 git diff /path/to/file会向您显示更改,您可以查找“别忘了......”。
  2. 您可以使用grep git diff | grep "Don't forget"
  3. 自动执行此操作
  4. 您甚至可以使用钩子来检查正则表达式(例如“不要忘记”)并禁止匹配的提交。这可以在您的本地存储库中或您正在推送的存储库中。
  5. 选项2可能是最简单的。它仍需要一些纪律 - 你需要确保你总是在评论中加上“别忘了”(或“TODO”或“FIXME”或其他),你需要运行git diff | grep,但是这不是很多开销。

    选项3将使长期更容易防止此问题,特别是如果您是团队的一员。当然,任何人都可以将评论更改为“不要忘记”(或者只是删除评论)并绕过检查,但它总比没有好。

答案 2 :(得分:1)

有些用户会避开Git的索引(例如总是使用git commit -a而只使用git add来引入新文件),但我发现索引对于这样的情况非常有用。

我们的想法是永远不要在第一时间提交“调试”更改。

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

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

      git add <pathspec> …
      

      暂存对这些文件的更改。

    2. 如果某些文件同时具有“调试”和预期的更改,那么我使用

      git add -p <pathspec> …
      

      在这些文件上跳过所有“调试”黑客。

      如果一个hunk同时具有“debug”和预期的更改,那么我使用git add -p中的split和/或edit命令来仅进行预期的更改。

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

    • 如果“调试”更改进入最终索引,那么我使用

      git reset -p <pathspec> …
      

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


  3. 注意:如果直接从“调试”工作树进行测试,您应该知道您始终在测试“调试”更改。在某些代码库中,某些“调试”更改的存在可以显着改变被测系统的行为。如果对您的团队来说重要的是没有发布的提交未通过测试,那么您应该花时间测试您提交的内容(没有调试更改)。

    每次提交后都可以使用git stash来隐藏“调试”更改,重建并准确测试您提交的内容。测试完成后,您可以git stash pop恢复对工作树的“调试”更改。


    git reset -p首次出现在Git 1.6.5中(也是git checkout -pgit stash -p)。 git add -p首先在Git 1.5.4中提供。