2013-03-04 1 views
2

리베이스를했고 100 개의 파일에 충돌이 있다고 가정합니다. 나는 그들을 하나씩 해결해야한다. 우리는 (N-1) 개의 파일을 해결했고 N. 파일을 작업하고 있다고합시다. 얼마 동안 작업 한 후에 파일을 엉망으로 만듭니다. 그래서 다시 처음부터 다시 해결하고 싶습니다. 그러나 (N-1) 파일을 다시 해결하고 싶지 않기 때문에 rebase를 중단하고 rebase를 다시하고 싶지는 않습니다.파일을 올바르게 해결하지 못한 후 충돌을 복구 할 수 있습니까?

처음부터 다시 해결할 수 있도록 파일 N의 병합 충돌 만 복구 할 수 있습니까?

+0

당신은'git mergetool'을 사용하고 있거나 손으로 해결하고 있습니까? – asm

+0

무엇을 사용하든 파일을 망칠 수 있습니다. 일반적으로 나는 그것을 수동으로한다. –

답변

1

test.txt라는 및 파일이 병합 시도로 인한 충돌 마커 왼쪽되었다는 것을, 당신은 어떻게 든 그 갈등의 수동 해상도를하고있는 것이지 한, 당신은 다시 수 - 몇 가지 명령으로 충돌 마커로 파일을 만듭니다.

배경으로 병합시 파일에 수동 충돌 해결이 필요할 경우 git 색인에 해당 파일의 세 가지 다른 복사본 ("단계"라고 함)이 있음을 알 수 있습니다. 1 단계는 병합중인 두 버전의 파일의 공통 조상이며 2 단계와 3 단계는 병합하려는 두 가지 분기의 두 버전입니다. git 유틸리티 중 일부는 전부는 아니지만이 항목을 참조하는 :<stage>:<filename> 구문을 알고 있습니다.

그래서, 당신이 먼저해야 할 일을 곳이 세 파일의 임시 복사본을 다시 만드는 것입니다 - 내가 여기 /tmp를 사용합니다,하지만 필수 아니에요 : 다음

git cat-file -p :1:test.txt > /tmp/test.txt.1 
git cat-file -p :2:test.txt > /tmp/test.txt.2 
git cat-file -p :3:test.txt > /tmp/test.txt.3 

git 배관을 사용 git merge-file 명령을 사용하여 적절한 충돌 표식이있는 파일을 다시 작성하십시오. 여기서 인수의 순서가 중요하며 병합을 다시 수행 할 때이를 참조하려는 경우에 대비하여 이미 수행 한 작업을이 파일에 저장하는 것이 좋습니다.

mv test.txt test.txt.broken 
git merge-file -p /tmp/test.txt.2 /tmp/test.txt.1 /tmp/test.txt.3 > test.txt 

이 충돌 마커 test.txt을 (다시 만듭니다하지만 일반적으로 포함되어있는 지점 이름 코멘트를하지 않고 - 당신이 정말로 사람을 원한다면, 당신은 몇 가지 -L <branchname> 인수를 추가해야합니다 - 당신이 git help merge-file를 입력 할 수 있습니다 자세한 정보를 얻으십시오).

그 시점에서 임시 파일을 정리하고 해당 파일의 충돌을 해결할 수 있습니다. 완료되면 git add에 기억하고 나머지 파일을 계속 진행하십시오.

+0

자세한 답변을 주셔서 감사합니다. N 개의 파일이 있으면 3N 파일을 저장해야합니다. 너무 비싸요. –

+0

하지만 솔루션에 기반을 둔 아이디어가 있습니다. –

+0

엉망이 된 파일에 대해서만 수행하십시오 : git show : 1 : test.txt> /tmp/test.txt.1 git show : 2 : test.txt> /tmp/test.txt.2 git show : 3 : test.txt> /tmp/test.txt.3 git merge-file -p /tmp/test.txt.2 /tmp/test.txt.1/tmp/test.txt.3> test. txt –

0

어쩌면 그렇게 잘하지 않는 솔루션 (그래서 git'ish하지 모양),하지만 여기에 하나의 가능한 방법입니다

  1. 는 (N - 1) 복사 한 임시 디렉토리
  2. 자식 REBASE 파일을 --abort
  3. N 번째 파일에서 (N - 1) 개의 파일을 복사하여
  4. 번째 파일에 복사하십시오. 작업중인 파일을 가정
+0

O (N) 걸립니다.너무 비싸 보인다 :) –

1

나는 당신을 찾고 있다고 믿는다 git checkout --merge --path/to/file.

+0

아니. 힘내 체크 아웃 - 머지는 로컬 변경을 위해 3 가지 방법으로 병합을 수행한다. 그건 내가 찾는 것이 아니다. 감사. –

+0

"인덱스에서 경로를 체크 아웃 할 때이 옵션을 사용하면 지정된 경로에서 충돌하는 병합을 다시 만들 수 있습니다." – jthill

+0

@LiboYu - 내가 이런 식으로 넣어 보자 : 시도해 봤어? – jthill

관련 문제