2009-12-08 2 views
8

난 후, 내 REPO에서 파일을 변경할 파일이 병합이라고 생각하고 그래서 같이 git status에 표시하는 자식을 강제 할 :어떻게 강제로 파일이 병합되지 않는다고 생각합니까?

내 질문의 전체의
# Unmerged paths: 
# (use "git reset HEAD <file>..." to unstage) 
# (use "git add <file>..." to mark resolution) 
# 
#  both modified:  lib/delayed/recipes.rb 
# 

. 이유에 대한 설명을 읽으십시오. 그 질문은 내가 먼저 물어볼 것입니다.

여기서의 목적은 Piston의 버그 수정으로, 현재 쉽게 간과 될 수있는 색인에서 병합 충돌이 발생합니다.

방법 힘내의 repo에 piston update 작품은 다음과 같습니다

  • 복제 새 임시 자식의 repo 마지막에 임시의 repo는 우리가 본 커밋
  • 체크 아웃에 원격 REPO (.piston.yml에 저장) .piston.yml는
  • 은 임시의 repo에 우리 지역의 repo의 파일을 복사 마지막으로 업데이트 된에 새로운 지점에서 우리 지역의 repo가 ​​() 커밋
  • 체크 아웃은
  • 임시의 모든 변경 사항을 커밋
  • 충돌을 (!) MERGE 무시하고 모든 복사
  • 원격 REPO의 변화와 우리의 로컬 변경 사항을 병합 임시의 repo에
  • 실행 git merge master을 REPO (이 vendored 프로젝트를 마지막으로 업데이트의 이러한 우리의 로컬 변경 사항입니다) 우리 지역의 repo
  • 에 임시의 repo에서 파일
  • 지역의 repo에
  • 병합 임시 분기 (모든 추가 다시 우리의 원래의 출발점에 우리 지역의 repo에
  • 체크 아웃 지역의 repo를 (우리의 새로운 임시 분기) 해당 파일을 커밋 추가 변경)

병합 충돌이있는 파일이 임시 분기에 커밋되도록 허용하여이 문제를 해결할 것으로 예상되지만 맨 마지막에 (git merge --squash 실행 후) 병합 충돌이 발생한 파일에 대해 알려야합니다. 임시 레포.

+0

"병합 상태를 선택적으로 다시 만드는 방법"을 참조하십시오. Git 메일 목록의 스레드 : http://thread.gmane.org/gmane.comp.version-control.git/135059 –

답변

12

병합 충돌이있는 힘내 파일에는 색인에 보통 세 가지 버전이 있고 작업 영역에는 diff3 -E/rcsmerge 충돌 표시가있는 버전이 있습니다. 색인의 버전은 공통 조상의 1 단계, "우리"버전의 2 단계 및 "3 버전"의 3 단계입니다. 병합되지 않은 파일의 경우 스테이지 0에 버전이 없습니다 (git update-index --unresolve을 사용하여 스테이지 0을 삭제하여 병합되지 않은 상태를 복원 할 수 있음).

당신은 당신이 인덱스에 넣어 원하는 모양 (파일 버전)의 SHA-1 식별자를 얻을 수 git ls-files --stage 또는 git ls-tree <commit>를 사용해야합니다, 당신이 지역 버전을 작동 스크래치 /에서 파일의 버전을 생성하려는 경우 또는 git hash-object -w <file>. 그런 다음 git update-index --index-info을 사용하여 상위 순서 스테이지를 인덱스 파일에 넣습니다 (이 후에는 git update-index --unresolve 또는 색인에서 스테이지 0을 제거하기 위해 상위 스테이지를 채우기 전에 git update-index --force-remove). git checkout --conflict=merge -- <file>을 사용하여 작업 영역에 병합 마커가있는 파일을 다시 생성 할 수 있습니다. (도움이되기를 바랍니다)

HTH


은 참조 : 망할 놈의 메일 링리스트에 "How to selectively recreate merge state?"스레드.

+0

병합 충돌이 발생한 두 파일 버전은 다른 repo에 있으며 세 번째 버전이 병합되었을 수 있습니다 지금까지. 그게 문제가 아닌가? (비록 내가 당신의 응답을 완전히 이해하지 못한다고 고백하지만.) – ScottJ

+0

나는 더 잘 이해하기 시작했습니다. 문어 병합으로 보이도록 설정해야한다고 생각합니다. 공통 조상 및 공급 업체 변경 사항과 로컬 변경 사항을 병합합니다. 이것은 내가 예상했던 것보다 더 복잡한 방식이며, 나는 이제 더 이상 그것을 생각하지 않는다. 답변을 주셔서 감사합니다. – ScottJ

+0

문어 없음 : 병합은 Git에서 3 방향 병합이므로 3 가지 버전이 필요합니다. 나중에 예를 생각해 보겠습니다. –

관련 문제