Git 실전 · 같은 충돌을 네 번째 풀고 있다 · 실습
같은 충돌을 네 번째 풀고 있다
목표
충돌 표시에서 공통 조상을 보고, 한 번 푼 해결을 git 이 기억하게 만들고, -X ours 와-s ours 가 결과 파일을 어떻게 다르게 만드는지 내용으로 확인합니다.
왜 중요한가
충돌 해결은 기술이 아니라 판단입니다. 그런데 기본 충돌 표시는 판단에 필요한 정보 하나를
빠뜨립니다 — 원래 무엇이었는지입니다. 그것을 모르면 "한쪽이 지운 것" 과 "양쪽이 다르게
고친 것" 을 구별할 수 없고, 잘못 고르면 남의 수정이 조용히 사라집니다. zdiff3 는
그 칸을 채워 줍니다. 그리고 같은 판단을 반복해야 하는 상황 — 오래 사는 브랜치를 계속
리베이스하거나 릴리스를 정기적으로 되돌려 합치는 상황 — 에서는 rerere 가 그 판단을
한 번만 하게 해 줍니다. 마지막 두 단계는 이름이 닮아 자주 뒤바뀌는 두 손잡이를 갈라
놓습니다. -s ours 를 내용을 가져오려는 의도로 쓰면 이력에는 합쳐졌다고 적히고 코드에는
아무것도 안 들어오는 상태가 됩니다.
단계
1. /root/gitx8/repo 에 같은 줄을 서로 다르게 고친 브랜치들을 만듭니다.
2. 기본 충돌 표시와 zdiff3 표시를 나란히 notes/zdiff3.txt 에 남깁니다.
3. rerere 를 켜고 충돌을 한 번 풀어 병합을 마칩니다.
4. 그 병합을 되돌리고 다시 병합해, git 이 같은 해결을 스스로 적용하는 것을notes/replay.txt 에 남깁니다.
5. sidefix 를 -X ours 로 병합하고 결과를 notes/xours.txt 에 남깁니다.
6. legacy 를 -s ours 로 병합하고 결과를 notes/sours.txt 에 남깁니다.
7. 두 손잡이의 차이를 notes/strategies.txt 에 정리합니다.
8. notes/report.md 에 반복 충돌을 줄이는 방법을 정리합니다.
참고
- 저장소마다
git config user.email과user.name을 지정해야 커밋이 됩니다. - 충돌을 본 뒤에는
git merge --abort로 깨끗이 물러설 수 있습니다. - 흔한 실수: 4단계에서 rerere 가 파일을 고쳐 놓은 것을 보고 커밋까지 됐다고 여기는
- 흔한 실수: 6단계 뒤에
legacy.txt가 없다고 실패로 보는 것입니다. 그것이-s ours
커밋 시각은 GIT_AUTHOR_DATE 와 GIT_COMMITTER_DATE 로 고정하세요.
것입니다. rerere 는 적용만 하고 스테이징은 하지 않습니다.
가 하는 일이고, 이 단계의 요점입니다.
단계 8개
- 같은 줄을 서로 다르게 고친 브랜치들
- 원래 무엇이었는지 보여 주는 칸
- 해결을 한 번 기록시킨다
- 두 번째부터는 git 이 대신 푼다
- 충돌한 자리만 우리 것으로
- 합쳤다고만 적고 아무것도 가져오지 않기
- 이름만 닮은 두 손잡이
- 반복 충돌을 줄이는 방법