Git的分配修正承诺原来承诺

问题描述:

具有以下琐碎的承诺Git的分配修正承诺原来承诺

# define function in one file 
echo "function foo() {}" > a 
git add a 
git commit -m "1st commit" 

# call the function in different file 
echo "foo()" > b 
git add b 
git commit -m "2nd commit" 

# rename foo to bar in both files 
echo "function bar() {}" > a 
echo "bar()" > b 
git commit -am "fixup" 

是可以自动分割修正提交更新两个先前提交?

我在想,如果修正提交唯一改变了是在原提交更改的行,应该确实有可能精确算法拆分修正提交。是这样吗?如果是这样,git是否支持它?

我知道这可以与多个底垫和手动分裂修正提交来完成,但是这不是我后。

澄清:想象一下,在一个特性分支工作。你有许多提交。在代码审查发现,例如方法foo而应被命名的方法bar。现在,在推向上游之前,我宁愿不只是更改它的所有实例,而是添加一个新的提交,但拆分最后一个提交并将其部分应用到适当的提交。

+0

为什么不使用'git mv'来重命名一个文件,然后提交,然后'git mv'重命名另一个,并提交? – VonC 2014-10-07 11:21:26

+0

我不重命名文件,我正在重命名一个函数,这只是一个简单的例子(它可能是任意文本)。 – 2014-10-07 11:24:36

如果我将您的问题解释为“我如何在所有提交中显示的函数中重命名函数”,则以下工作(针对您提供的两个示例提交进行测试,但不打算完全实用)。

在功能分支上工作时,您需要通过它来限制filter-branch尝试处理的提交数量。

git filter-branch --tree-filter 'git grep --name-only foo | xargs sed -i "s/foo/bar/g"' 
+0

谢谢,这实际上适用于这个简化的例子,但想象一下现实世界的例子:有一个修复提交可能会改变不止一个sed的意愿。我无法正确表达这个问题(这是这里最大的问题)。 – 2014-10-07 15:23:08

+0

我只能猜测没有具体细节。一般来说,我不会说(如果你不能描述补丁应该如何拆分以及如何应用它,那么就没有办法编程),尽管你可以通过使用'git commit --fixup'来简化很多事情和'rebase.autosquash true' – 2014-10-07 15:27:27

+0

对,我想我会想出一个反例,它不能自动工作证明自己错了。 – 2014-10-07 16:51:29