2014-03-31 1 views
1

코드 파일을 여러 번 변경 했으므로 diff를 검사하기 전에 git add -p path/to/file.hpp을 검사하십시오.git add -p에서 덩어리를 편집 할 때 "패치 적용되지 않음"수정 -p

변경 사항 요약 : 일반 클래스 선언을 템플릿 클래스 정의로 변환했습니다. 그렇게함으로써 파일의 맨 아래에서 많은 양의 코드를 가져 와서 맨 위로 옮겼습니다. (이제는 클래스 앞에 정의해야하는 예외 클래스입니다.) 그런 다음 하나의 클래스를 대체했습니다. - 몇 줄의 코드를 가진 라이너 (메소드 선언) (메소드 구현).

힘내 나의 변화의 문맥을 정확하게 감지 할 수 없었고, 근본적으로 서로를 가로 질러 두 줄 사이에 전혀 연결이 없었던 큰 벌레에 줄을 추가하고 추가했다. diff. 변경 사항을 나중에 쉽게 검사 할 수 있도록 여러 변경 사항을 컨텍스트에서 가져 오려고했지만 추가 된 모든 행과 삭제 된 행을 동일한 순서로 유지하고 추가 된 행 수 및 변경되지 않은 행을 유지하는 데주의를 기울였습니다. . 나는이 완료되었을 때

, 나는 오류 메시지

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(); 
- }; 

,이 등 정확한 공 i 행의 수를 갖는 실수의 큰 위험하지만 내 문제는 그것이 모두 맞습니다 있는지 확인하기 어려운 것이 아니라 - 그것은 알아 내기도 어렵다 내가 뭘 잘못했는지.

+0

이 질문이 도움이됩니까? http://stackoverflow.com/questions/3268596/git-add-interactive-your-edited-hunk-does-not-apply? – LeGEC

+0

@LeGEC :이 질문은 문제 해결에 유용한 정보를 제공하지만 실제로 현재 가지고있는 것보다 더 많은 것을 할 수는 없습니다. 그 정보는 전혀 새로운 것이 아니며 현재 패치가 무엇이든 상관없이 현재 패치에만 해당되는 정보는 없습니다. 이 질문은'git' 자체에서보다 유익한 오류 메시지를 뽑아 낼 수있는 방법이라면 말입니다. –

+0

나는 당신이 달성하고자하는 것을 완전히 이해했는지 확신 할 수 없습니다. git이 "line 1"이 실제로 "line 13"을 대체하고 "line 2"가 실제로 "line 26"등을 대체한다는 것을 기억하도록 패치를 편집하려고합니까? – LeGEC

답변

2

당신은 자식에게 "이 파일의 두 버전 사이의 차이점에 대한 추적으로이 패치를 유지"하는 git add -p을 사용할 수 없습니다 : 자식이 하지 저장 차이점 또는 패치를하지, 그것은 실제 내용를 저장합니다.

git (git add myfile)에 파일을 추가하면이 특정 버전의 파일은 콘텐츠을 기반으로 해시를 받게됩니다. 힘은 이 버전 n-1에서 버전 n으로 어떻게 바뀌 었는지에 대한 추적은입니다.

git diff을 실행하면 git은 실제로 두 버전의 파일 내용을 검색하고 diff 알고리즘을 다시 실행합니다. 편집하려는 패치는 메모리에 저장되지 않습니다.난 당신이 찾고있는 것을 달성하기 위해 생각할 수있는


가장 가까운 방법은 diff 알고리즘 자체에 대한 "동기화 점"을 추가하는 것입니다

1 파일의 첫 번째 버전에서 시작, 커밋 각각의 "마이그레이션 블록"을 통해 의견을 가진 최초의 중간 버전 :

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

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

//etc ... 
:이 후

// migrating method1 : 
void medthod1() const; 

//migrating calculation : 
void calculation() const; 

//etc ... 

2 - 먼저 커밋 코멘트를 유지, 실제 마이그레이션을 쓰기

이 버전을 커밋하십시오.

3 마지막으로 불필요하고 노이즈가 많은 주석을 제거하고 마지막 버전을 커밋하십시오.

git 히스토리를 탐색 할 때 마이그레이션이 3 개의 커밋으로 표시되므로 차이점을 검사 할 때 다시 작성된 내용을 커밋 2-으로 명확하게 파악해야합니다.

+1

확인. 그래서 내가 성취하려고했던 것은 기본적으로 무의미했습니다. 왜 그런지에 대한 좋은 설명에 감사드립니다! –

+0

예를 들어 git의 diff 알고리즘을 변경할 수도 있습니다. '--patience'는 이런 경우에 종종 더 나은 결과를줍니다. – cincodenada