2014-10-19 6 views
1

일부 브랜치에서 편집중인 파일이 있고 다른 브랜치에서 내 브랜치의 이름을 바꿉니다. 자식은 두 파일 모두에 병합 충돌을보고하고 잘못된 결과를 만듭니다. diff.힘내, 파일 이름을 잘못 바꾼다. 자동으로 병합하는 방법?

내가 병합 할 때마다 이름 변경을 취소하지 않고 아래의 결과를 피할 수 있습니까?

$ git diff master 
diff --git a/old.txt b/old.txt 
index 7b4dc35..e73e0b4 100644 
--- a/old.txt 
+++ b/old.txt 
@@ -1,4 +1,2 @@ 
-This is an old file. 
-A Corrected Text again. 
-More Text. 
+This is a second file. 
+Do not confuse with original. 
diff --git a/old2.txt b/old2.txt 
index e73e0b4..8f51c7b 100644 
--- a/old2.txt 
+++ b/old2.txt 
@@ -1,2 +1,4 @@ 
-This is a second file. 
-Do not confuse with original. 
+This is an old file. 
+A Corrected Text. 
+More Text. 

답변

2

짧은 대답은 "no"입니다. 이름 바꾸기 감지 알고리즘 git가 사용 되었기 때문입니다. 일반적으로

, 하나가 다른에 대해 커밋 비교할 때, DIFF이 작업을 수행합니다

  • 누구의 이름을 모두 커밋에 표시되는 모든 파일 찾기 :이 파일은 수정 (또는 변경되지 물론).
  • 이름이 두 번째 커밋에 있지만 첫 번째 커밋에 나타나지 않고 이름이 첫 번째 커밋에는 있지만 두 번째 커밋에는 나타나지 않는 파일을 찾습니다. 이름 바꾸기를위한 후보입니다.
  • "사본 찾기"옵션이 주어지면 두 번째 커밋에 이름이 있지만 첫 번째 커밋에없는 파일을 찾습니다. 이들은 do이 첫 번째 커밋에 존재하는 파일에서 "복사 된"후보입니다. 직접 git diff를 사용하는 경우 말하자면

, 당신은, 구성 항목 및 적용 탐지의 양을 제어 플래그의 무리가 있습니다 diff.renameLimit, -M, -C, 특히 --find-copies-harder.

git merge을 기본 (재귀 적) 전략과 함께 사용하면 git이 기본값으로 설정하여 보통 상당히 잘 작동합니다. 조정할 수있는 몇 가지 (적은) 컨트롤이 있습니다 : merge.renameLimit-X rename-threshold=.... Git은 병합을 설정하기 위해 내부적으로 실행되는 두 개의 파일에이 파일을 적용합니다.

물론 문제는 첫 번째 글 머리 기호 (이름이 같은 파일은 이름 바꾸기 후보로 간주되지 않고 때로는 복사본 후보로 간주 됨)가 모든 경우에 적용된다는 것입니다. 힘내는 그러므로 이것을 이름 바꾸기로 보지 않을 것이다.


1

심지어 이러한 옵션은 다소 새로운 : 병합 그냥이 하드 코딩 할 때 내가 기억. 아마도 diff와 merge를 가르쳐 파일 이름이 두 커밋 모두에 존재하는 경우 이름 바꾸기 검색을 허용 할 수 있습니다. (두 가지 모두 git 내부에 동일한 기본 diff 코드를 사용하며 다양한 옵션을 제어하는 ​​데이터 구조를 사용합니다.)