我对代码文件进行了一些更改,并在我暂存之前执行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();
- };
显然,如果空白线的数量正确等会产生错误的风险很大,但我的问题不仅在于难以确定这一切是正确的 - 我也很难弄清楚我犯了什么错误
答案 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时重写的内容。