[git] conflict, 충돌 해결하기

younoah·2021년 2월 6일
2

[Git]

목록 보기
5/14

conflict

서로 다른 2가지 이상의 브랜치에서 동일한 파일의 내용을 수정하고 merge를 하면 충동이 발생한다.

충돌 해결 방법

  • 수동으로 해결
  • vscode 활용

0. 충돌 상황

<<<<<<< HEAD
Oh.. Here!! From master branch!
=======
Oh.. Here!! From feature branch!
>>>>>>> another-branch

merge를 하고 출동이 발생하면 해당 파일에 이러한 표시가 보인다.

HEAD는 현재 브랜치의 내용을 표시하고 another-branch는 HEAD가 아닌 다른 브랜치를 말한다.

1. 수동으로 해결하기

직접 해당 파일로 들어가서 충돌 부분에서 둘중 1개를 선택하든지 둘다 선택하든 하여 수정해주고 저장한다.

이후에 git status를 확인하면 아래와 같은 순서대로 진행하게 되어있다.

git add 충돌파일
git merge --contine

이렇게 되면 no-fast-forward merge가 진행되면서 완료된다.

2. vscode로 해결하기

2-1. mergetool 설정하기

  • git 환경설정 파일 열기
git config --global -e
  • merge, mergetool 설정하기
[merge]
	tool = vscode
[mergetool "vscode"]
	cmd = code --wait $MERGED

2-2. merge하기

  • merge하기
git merge 브랜치
  • conflict 알림

Auto-merging main.txt
CONFLICT (content): Merge conflict in main.txt
Automatic merge failed; fix conflicts and then commit the result.

  • mergetool(vscode) 실행하기
git mergetool
  • vscode에서 conflict 해결하기

3가지 옵션중 한가지를 클릭하고 저장한다.

  • Current Change : 현재 HEAD의 내용
  • Incoming Change : merge되는 다른 브랜치의 내용

Compare Change는 2개의 파일을 각각 열어서 비교해준다.

  • ❗️merge의 부산물

vscode로 merge를 하고 나면 파일명.확장자.orig 파일이 생긴것을 확인할 수 있다.

이 파일은 conflict가 발생했을 때의 내용을 그대로 담고 있는 파일이다.

하지만 이런 파일이 생기는것은 번거롭기 때문에 아래와 같은 명령어를 이용하여 설정을 끄도록 하자.

mergetool의 백업파일(.orig 파일)을 유지하는 옵션을 끈다.

git config --global mergetool.keepBackup false

혹은 git config 파일을 열어서 아래와 같이 옵션을 추가한다.

[merge]
	tool = vscode
[mergetool "vscode"]
	cmd = code --wait $MERGED
	trustExitCode = true
	keepBackup = false # 백업파일 생성하지 않도록 옵션 추가.

부산물 (.orig 파일) 삭제하기

이미 생성되어있는 부산물 파일을 git clean 명령어를 이용하여 삭제할 수 있다.

(물론 GUI에서 편하게 삭제할 수 도 있다.)

git clean 명령어는 추적이 되고 있는 않는 (untracked) 파일들을 삭제하는 명령어이다.

간단하게 git clean -f 이용해서 삭제하자.

옵션) -f : 강제 삭제 , -d : 디렉토리 삭제

  • merge 완료하기
git merge --continue

위 명령어를 통해 merge를 마무리한다.

profile
console.log(noah(🍕 , 🍺)); // true

0개의 댓글