从git add -p编辑块时修复“补丁不适用”

时间:2014-03-31 08:56:47

标签: git patch

我对代码文件进行了一些更改,并在我暂存之前执行git add -p path/to/file.hpp检查差异。

总结我的更改:我已将常规类声明转换为模板类定义。在这样做的过程中,我从文件底部获取了大量代码并将其移至顶部(现在需要在类之前定义的异常类),然后我替换了一堆代码-liners(方法声明),每行代码几行(方法实现)。

Git无法正确检测到我的更改的上下文,并且基本上已删除并添加了一个大的混搭中的行,其中在两个彼此相邻的行之间根本没有任何连接。差异。为了使更改更容易在以后检查,我转移了一堆更改以使它们在上下文中,但是小心地保持所有添加和删除的行以相同的顺序,保持添加和删除的行数保持不变等等

当我完成后,我收到了错误消息

error: patch failed: include/aof/physics/magnetic-field.hpp:143
error: include/aof/physics/magnetic-field.hpp: patch does not apply
Your edited hunk does not apply. Edit again (saying "no" discards!) [y/n]? 
好的,所以我在某处弄错了。好的,我会再试一次。同样的消息。

如果我回答上面的y,我可以回到我编辑的补丁,但由于我不知道它有什么问题,这对我没什么帮助。在尝试不成功地编辑补丁几次后,我不禁想知道:有没有办法在这里得到更好的错误信息?我如何找出为什么补丁不适用,所以我可以解决它?

简化示例以澄清我正在努力实现的目标

原始补丁。不容易看到这里发生了什么......

-        ClassConstructor(const OtherClass& other, double d);
+        ClassConstructor(const TOtherClass& other, double d) : _other(other), _d(d) {

-        void method1() const;
-        double calculation() const;
-        double otherCalculation() const;
+            _a = 1 / d;
+        }

-        ~ClassDestructor() { }; // Yes, of course it's more sensibly named
-     };
+        void method1() const {
+             // this method does nifty stuff.

-    struct my_exception_type : public std::runtime_error {
-        my_execption_type() : runtime_error("oops!") {
         }

-        virtual const char* what() const throw() {
-            std::ostringstream cnvt;
-            cnvt << runtime_error::what() ": Sorry, I shouldn't have done this...";
+        double calculation() const {
+            return _a + _d;
+        }

-            return cnvt.str().c_str();
+        double otherCalculation() const {
+            return 0.; // I'm lazy
         }

+        ~ClassDestructor() { }; // Yes, of course it's more sensibly named
     };

我尝试将其编辑为。 (这个编辑在这里完成,所以不确定这个特定的是否有问题,但你知道我正在做什么样的编辑对大块头)。更容易理解这些变化,你不觉得吗?

-        ClassConstructor(const OtherClass& other, double d);
+        ClassConstructor(const TOtherClass& other, double d) : _other(other), _d(d) {
+            _a = 1 / d;
+        }

-        void method1() const;
+        void method1() const {
+             // this method does nifty stuff.
+        }

-        double calculation() const;
+        double calculation() const {
+            return _a + _d;
+        }

-        double otherCalculation() const;
+        double otherCalculation() const {
+            return 0.; // I'm lazy
+        }
     };
-    struct my_exception_type : public std::runtime_error {
-        my_execption_type() : runtime_error("oops!") {
-        }
-        virtual const char* what() const throw() {
-            std::ostringstream cnvt;
-            cnvt << runtime_error::what() ": Sorry, I shouldn't have done this...";
-            return cnvt.str().c_str();
-    };

显然,如果空白线的数量正确等会产生错误的风险很大,但我的问题不仅在于难以确定这一切是正确的 - 我也很难弄清楚我犯了什么错误

1 个答案:

答案 0 :(得分:2)

您无法使用git add -p告诉git“将此修补程序保存为此文件的两个版本之间差异的跟踪”:git 存储差异或补丁,它存储实际的内容

在git(git add myfile)中添加文件时,该文件的特定版本将根据其唯一的内容接收哈希值。 Git将保持无跟踪它从版本n-1到版本n的方式。

当您运行git diff时,git将实际检索文件的两个版本的内容,并再次运行diff算法。您尝试编辑的补丁不会保留在内存中。


我能想到达到你想要的最接近的方法是为diff算法本身添加“同步点”:

1-从文件的第一个版本开始,提交第一个中间版本,其中包含对每个“迁移块”的评论:

// migrating method1 :
void medthod1() const;

//migrating calculation :
void calculation() const;

//etc ...

2-在第一次提交之后,编写实际的迁移,保留注释:

// migrating method1 :
void method1() const {
    //this method does nifty stuff
}

// migrating calculation :
void calculation() const {
    return _a + _d;
}

//etc ...

并提交此版本。

3-最后,删除不需要的嘈杂评论,并提交最后一个版本。

在探索git历史记录时,迁移将显示为3次提交,您应该清楚地了解在通过提交2-检查差异intoduces时重写的内容。