56

병합이 중단되었다는 오류 메시지가 나타날 때 Git을 사용하여 명령 행에서 파일을 병합하려고했다.힘내는 나의 파일에 HEAD 표시를 병합한다.

나는 그게 끝이라고 생각했지만, 내 파일에는 gitmarks가 있다는 것을 깨달았다. 그래서 같이 :

start = 
    expression 

validchar = 
    [0-9a-zA-Z_?!+\[email protected]#$%^&*/.] 

integer = 
<<<<<<< HEAD 
    digits:[0-9]+ 
     { return digits.join(""); } 
======= 
    sign:"-"* digits:[0-9]+ 
     { return sign + digits.join(""); } 
>>>>>>> gh-pages 

파일은 내 옆에없는 편집 한 및 쇼 라인은 삽입 : 후

  • HEAD 기호 (<<<<<<< HEAD) 변경된 코드의
  • 라인
  • 문자열보다 등호 (=======)
  • 코드의 새 버전
  • 다른 줄 (>>>>>>> gh-pages)

더 나쁜 것은 파일 내용이 더 이상 순서가 없다는 것입니다. 누구든지 정상적으로 파일을 다시 얻는 방법을 알고 있으며, gh 분기에서 변경 한 사항을 마스터 분기에 병합 했습니까?

답변

66

이들은 conflict markers입니다. 아직 병합 중입니다.하지만 Git이 자동으로 병합 할 수없는 부분이 있습니다. 자신이 원하는 것을 need to hand-edit those parts으로하고 결과를 커밋하십시오.


예를 들어, 특정 경우에, 당신은 아마 이런 식으로 해결하려는 것입니다 (참고 - 화살표/오른쪽에 텍스트 내 노트는 파일에 입력하는 것 아니 뭔가, 단지입니다) :

integer = 
<<<<<<< HEAD         <-+ remove the bits here 
    digits:[0-9]+        | 
     { return digits.join(""); }    | 
=======          <-+ 
    sign:"-"* digits:[0-9]+ 
     { return sign + digits.join(""); } 
>>>>>>> gh-pages        <-- and this 

따라서이 같은 파일을 저장할 것 ...

integer = 
    sign:"-"* digits:[0-9]+ 
     { return sign + digits.join(""); } 
+0

편집이 완료되면 파일은 어떻게 표시되어야합니까? – lowerkey

+3

@lowerkey 끝내기 병합 결과를 정확히 보는 방법. 내 생각 엔''gh-pages' 버전의 일부만을 원한다는 것입니다. 따라서'<<<<<<'에서'======'로 삭제하고 '>>>>>>''행을 사용하여 실제 코드의 두 행을'======='과'>>>>>>'사이에 둡니다. – Amber

+0

고마워, 나는 그것의 교수형을 얻고 있다고 생각. 머리부터 ======까지 모두 삭제 한 다음 나머지 머리말을 제거하십시오. – lowerkey

19

은 절대적으로 당신이있어 무엇을보고 '자식 상태'로 시작합니다. 병합을 중단하거나 병합을 중단 한 경우 작업 디렉토리에 충돌 파일이있는 경우 문제가 발생합니다. 힘내 상태는 현재 위치를 알려줍니다. 그 다음에는 여러 가지 옵션이 있습니다. 당신은 병합 커밋 해결해야 하나 도전, 또는 같은 도구를 사용 할 수-손으로 :

git mergetool 

파일이 병합을 필요로 표시하는 경우 병합 도구가 작동합니다. 1 : 파일 이름 구문 당신은을 사용하여 다른 버전을 볼 수 있습니다

git checkout --ours -- /path/to/conflicted-file  # this is probably the one you want 
git checkout --theirs -- /path/to/conflicted-file 

:

또한 중 하나를 수행 할 수 있습니다. 자세한 설명은 here을 참조하십시오. 그러나 위의 모든 내용은 '자식 상태'가 파일을 병합을 필요로하는 것으로 가정합니다.

마지막으로, 당신은 항상 수있는 옵션이 있습니다 :

git reset --hard # sounds like --hard is what you need but check other options 
+4

나는''git status'로 시작해서 절대적으로 충고하는 것을보고 싶다. Git을 상상의 복잡성 때문에 탓하는 것이 몇몇 서클에서 fasionable하지만 사실은'git status '는 가장 일반적인 상황에서 다음에해야 할 일을 이해하기에 충분합니다. 그러므로, 정말로 : 만약 무언가가 잘못되면, 멈추고'git status'를 읽으십시오. – kostix

1

답변의 모든 잘하지만 모든 충돌 표시를 Autoremove하려면 & 다음 당신은 만들 수 있습니다, 머리를 유지하기 위해 파일을 자동 절체하려는 자신의 bash는 스크립트와 같은 : -

예 스크립트 :

# vim /usr/sbin/solve.git

(다음 추가)

#!/bin/bash 
for f in $(grep -Rl '^>>>>>>> ' --include="*.php" --include="*.css" --include="*.js" --include="*.html" --include="*.svg" --include="*.txt" .) 
do 
sed -i -e '/^=======/,/^>>>>>>> /d' -e '/^<<<<<<< /d' $f 
sed -i -e '/^>>>>>>> /d' $f 
echo "$f Fixed" 
done 
git add . ; git commit -am "[+] Resolved on `date` from `hostname` by `whoami`" --no-verify 

# chmod 755 /usr/sbin/solve.git

& 그냥 해결하려면 GIT의 REPO/경로에서 실행 :

$ cd <path_to_repo>
$ solve.git

공지 사항 : - 위 파일 확장명을 언급 php, css, js, html, svg & txt입니다.