说,我在'掌握'并且有一个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归还原始价值。
如何自动将某些行返回原始值的过程?或者至少将它缩短为一个命令。
也许,一些临时提交,藏匿或其他技术?
答案 0 :(得分:7)
Cameron对短期调试更改有一些好主意。我想添加一个常用的工具,即使对于更大或更永久的本地调试更改也是如此,例如,如果每次添加功能时通常都会进行相同的“不要忘记”更改。我听说它叫织机,被子,堆叠的树枝和管道。你可以找到带有这些名称的插件来帮助维护这种工作流程,但是它们之间存在着微妙的差异,我从来没有真正掌握过,而且这种技术并不难以手动完成。
基本思路是在主和功能之间添加另一个分支,我们称之为 debug 。您在该分支中进行所有“不要忘记”更改,然后再从 debug 分支以创建功能,其中包含将作为生产的所有更改正常。然后,要删除功能中的所有“请勿忘记”更改,请执行以下操作:
git rebase --onto master debug feature
这使得它看起来像你直接从 master 分支,并且从未在 debug 分支中添加更改。然后你像正常一样合并到 master 。下次要添加功能时,只需将主合并到 debug 中,您的“不要忘记”更改会自动重新应用到最新的上游代码。然后,只需从 debug 创建一个新的功能分支,然后重新开始循环。
显然,在合并到 master 之前,你仍然需要记住进行rebase。如果你忘了,Cameron的钩子想法可以用来防止合并。
答案 1 :(得分:3)
可能无法自动回滚特定行(因为Git并不真正了解文件内容的语义),但是有很多方法可以在将来再次阻止这种情况发生。
git diff /path/to/file
会向您显示更改,您可以查找“别忘了......”。git diff | grep "Don't forget"
选项2可能是最简单的。它仍需要一些纪律 - 你需要确保你总是在评论中加上“别忘了”(或“TODO”或“FIXME”或其他),你需要运行git diff | grep
,但是这不是很多开销。
选项3将使长期更容易防止此问题,特别是如果您是团队的一员。当然,任何人都可以将评论更改为“不要忘记”(或者只是删除评论)并绕过检查,但它总比没有好。
答案 2 :(得分:1)
有些用户会避开Git的索引(例如总是使用git commit -a
而只使用git add
来引入新文件),但我发现索引对于这样的情况非常有用。
我们的想法是永远不要在第一时间提交“调试”更改。
我运行git diff
来查看我可以进行的更改(即索引和工作树之间的差异)。
对于没有任何“调试”更改的文件,我使用
git add <pathspec> …
暂存对这些文件的更改。
如果某些文件同时具有“调试”和预期的更改,那么我使用
git add -p <pathspec> …
在这些文件上跳过所有“调试”黑客。
如果一个hunk同时具有“debug”和预期的更改,那么我使用git add -p
中的split和/或edit命令来仅进行预期的更改。
在提交之前,我使用git diff --cached
仔细检查分阶段的更改(即HEAD和索引之间的差异)。
如果“调试”更改进入最终索引,那么我使用
git reset -p <pathspec> …
(可能使用其拆分或编辑命令)从索引中丢弃“调试”更改。
注意:如果直接从“调试”工作树进行测试,您应该知道您始终在测试“调试”更改。在某些代码库中,某些“调试”更改的存在可以显着改变被测系统的行为。如果对您的团队来说重要的是没有发布的提交未通过测试,那么您应该花时间测试您提交的内容(没有调试更改)。
每次提交后都可以使用git stash
来隐藏“调试”更改,重建并准确测试您提交的内容。测试完成后,您可以git stash pop
恢复对工作树的“调试”更改。
git reset -p
首次出现在Git 1.6.5中(也是git checkout -p
和git stash -p
)。 git add -p
首先在Git 1.5.4中提供。