Git rebase补丁文件在错误的地方

时间:2016-09-28 12:41:13

标签: git branch rebase git-rebase

我不确定这是否是git rebase的预期和已知操作,或者我是否发现了问题。我使用lorem ipsum将其复制到公共存储库中。 (https://github.com/drewclauson/git-rebase-example

如果我有两段代码对于多行(see lorem ipsum.txt)完全相同,则会出现此问题。理想情况下,代码会被重构以保持DRY,但我不知道同一文件中存在重复代码。

branch1master没有的提交,反之亦然,因此我将branch1重新定位到master

branch1's change is adding a line between lines 23 and 24。 (“测试添加一行代码”)

master's change is editing line 23。 (在第23行插入“NEW TEXT”)

当我将branch1重新定位到master时,branch1's提交的更改将获得patched in between lines 8-9,而不是第24-25行。

我不太了解git的操作,但我认为它与提交的上下文有关,应该在24到25之间添加一行?基本上,它想要根据之前和之后的行进行修补,并且由于文件中前面有相同的代码,它只是抛出补丁而不考虑行号?或者有什么我想念的东西?

谢谢,我仍然是git的相对新手,所以我可能只是对它不了解。

1 个答案:

答案 0 :(得分:2)

正如您所怀疑的那样,Git会找到匹配的上下文并将更改应用于它。通常如果rebase成功而没有冲突,一切都很好,但有时候不是。始终根据需要验证结果和fixup

理想情况下,你不会有这种重复行为来绊倒Git,但是还有其他方法可以在“成功”之后最终破坏提交。变质难以避免。例如,我们假设我们有一个分支,它在一些函数x中添加了一个使用变量foo()的代码块。现在想象某人决定x不是描述性名称,并将其重命名为master上的foo_counter。如果我们将我们的分支重新命名为master,那么即使生成的提交将无法编译,我们的代码的文本合并也很有可能成功(因为我们指的是一个从未声明的变量。)在这种情况下我们需要修复重新定位的提交以使用foo_counter而不是x。再次,始终验证rebase的reslt。

这暗示了与较新的Git用户经常丢失的合并相比,变基的一个缺点。合并会保留原始分支上的提交,因此只需要验证最终的合并提交。但是,对于rebase,必须测试每个重新提交的提交以避免降低存储库的完整性。通常情况下,一个重新分支的分支将被修复,并在顶部进行额外的提交,使中间提交处于不可测试的状态。即使最终结果看起来不错,也会发生这种情况。这看起来似乎并不重要,但如果你曾经使用过Git' bisect,你会很感激拥有可测试的历史。并不是说这不能通过变基来实现,它只需要更多的工作。