Git 가이드
명령줄 및 3방향 편집기에서 Git 병합 충돌을 해결하는 방법
Git에서 병합 충돌을 해결하는 방법: 충돌 마커를 읽고, 일반 Git 명령이나 시각적인 3방향 편집기를 사용하여 수정하고, 병합하기 전에 발생하는 충돌을 확인하세요. 게다가 안전하게 중단하고 병합을 실행 취소하는 경우도 있습니다.

Git에서 병합 충돌을 해결하려면 Git이 충돌한 것으로 보고하는 각 파일을 열고, <<<<<<<, ======= 및 >>>>>>> 마커 사이에 어떤 코드가 있어야 하는지 결정하고, 마커를 삭제하고, git add로 파일을 준비하고, git commit(또는 git merge --continue)로 마무리합니다. 대신 취소하려면 git merge --abort을 실행하세요. 이 가이드는 명령줄과 시각적 3방향 편집기에서 해당 루프를 살펴보고 충돌을 더 드물게 만들고 실행 취소하기 쉽게 만드는 습관으로 끝납니다. 일시 중지된 병합, 리베이스 또는 체리 선택이 제공하는 선택 사항을 연습하려면 활성 작업 계속, 건너뛰기 또는 중단 무료 강의를 들어보세요.
시각적 예시에서는 macOS, Windows 및 Linux용으로 만든 Git 클라이언트인 GitTree를 사용합니다. 컴퓨터에 설치된 Git을 실행하므로 클릭하고 입력해도 동일한 결과가 나타납니다. GitTree 기능 목록에 더 넓은 그림이 있습니다.
Git의 병합 충돌은 실제로 무엇입니까?
Git은 각 파일의 세 가지 버전, 즉 기본(두 브랜치가 공유하는 마지막 커밋), 우리(현재 브랜치, HEAD) 및 그들의 것(수신 브랜치, MERGE_HEAD)을 사용하여 한 줄씩 병합합니다. 한쪽에서만 지역을 변경한 경우 Git이 해당 변경 사항을 적용합니다. 양측이 동일한 줄을 다르게 변경한 경우 Git은 중지하고 두 버전을 모두 파일에 기록한 후 결정을 사용자에게 맡깁니다.
git pull, git rebase, git cherry-pick, git revert 및 git stash pop에서도 동일한 일이 발생할 수 있습니다. 수정 사항은 동일합니다. 최종 명령만 다릅니다. git status는 충돌하는 각 경로에 라벨을 붙입니다.
- 둘 다 수정됨: 두 가지 모두 동일한 줄을 변경했습니다. 이것이 일반적인 경우입니다.
- 당사가 삭제함 / 그들에 의해 삭제됨: 한 쪽에서는 파일을 삭제하고 다른 쪽에서는 변경했으므로 변경된 파일을 유지하거나 삭제를 확인하세요.
- 둘 다 추가됨: 각 분기가 동일한 경로에 다른 파일을 생성했습니다.
명령줄에서 병합 충돌을 해결하는 방법
1. 충돌하는 파일 찾기
Git은 병합이 중지되는 순간 충돌을 나열하고 git status는 완료될 때까지 목록을 유지합니다. git diff --name-only --diff-filter=U은 병합되지 않은 경로만 인쇄합니다.
$ git merge feature/login
Auto-merging src/auth.ts
CONFLICT (content): Merge conflict in src/auth.ts
Automatic merge failed; fix conflicts and then commit the result.
$ git status
On branch main
You have unmerged paths.
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: src/auth.ts2. 충돌 마커 읽기
마커 외부의 모든 것이 깔끔하게 병합되었습니다. <<<<<<< HEAD 뒤의 블록은 현재 분기이고, >>>>>>> feature/login 앞의 블록은 들어오는 블록이며, ======= 줄로 이들을 구분합니다.
export const retries = 3;
<<<<<<< HEAD
export const timeout = 45;
=======
export const timeout = 60;
>>>>>>> feature/login
export const debug = false;두 가지 버전만으로는 결정하기에 충분하지 않은 경우가 많습니다. Git의 zdiff3 충돌 스타일을 한 번 설정하면 모든 충돌에도 ||||||| 줄 뒤에 기본이 표시됩니다.
$ git config --global merge.conflictStyle zdiff3
<<<<<<< HEAD
export const timeout = 45;
||||||| 556e564
export const timeout = 30;
=======
export const timeout = 60;
>>>>>>> feature/login이제 main이 시간 초과를 30에서 45로, 기능 분기를 60으로 늘린 것을 볼 수 있습니다. 어떤 분기가 승리하는지가 아니라 제품에 필요한 값을 결정합니다.
3. 파일을 편집하고 해결됨으로 표시
원하는 코드(한쪽, 다른쪽, 혼합 또는 새로운 것)를 작성하고 모든 마커 라인을 삭제하십시오. 실수로 커밋된 길 잃은 =======은 전형적인 깨진 빌드이기 때문에 스테이지하기 전에 Git이 남은 부분을 확인하도록 하세요.
$ git diff --check # lists any leftover conflict markers
$ git add src/auth.ts
$ git commit # or: git merge --continue전체 파일 중 한쪽 버전이 맞다면 직접 가져가세요. Git이 병합하는 동안 충돌하는 모든 덩어리에 대해 한쪽을 선호하도록 하려면 대신 git merge -X ours 또는 git merge -X theirs를 사용하여 병합을 시작하세요. 충돌하지 않는 변경 사항은 여전히 두 가지 모두에서 발생합니다.
$ git checkout --ours -- src/auth.ts # keep the current branch's version
$ git checkout --theirs -- src/auth.ts # keep the incoming version
$ git add src/auth.ts4. 작업을 완료하세요
모든 파일이 준비되면 중지된 파일(git commit(또는 git merge --continue), git rebase --continue, git cherry-pick --continue 또는 git revert --continue))을 계속합니다. 리베이스는 나중에 커밋할 때 다시 중지될 수 있습니다. 루프를 반복하십시오.
| 명령 | 그것이 보여주는 것 |
|---|---|
git diff | 양쪽에 대해 충돌하는 각 파일의 결합된 차이점 |
git log --merge -p <path> | 파일을 건드린 각 측의 커밋과 차이점 |
git show :1:<path> | 파일의 기본 버전 |
git show :2:<path>, git show :3:<path> | 귀하의 버전(HEAD) 및 향후 버전(MERGE_HEAD) |
git mergetool | 한 번에 하나의 충돌된 파일씩 Git에 구성된 병합 도구를 엽니다. |

GUI에서 병합 충돌 해결: 3방향 Git 충돌 해결 프로그램
마커는 두 줄 충돌에 적합합니다. 긴 파일에 12개의 충돌이 있으면 GUI 충돌 해결 프로그램이 더 빠르고 잘못되기가 훨씬 더 어렵습니다. 좋은 Git 병합 충돌 도구는 세 가지 버전을 모두 함께 표시하므로 충돌별로 충돌을 결정할 수 있으며 마커가 남아 있는 동안 저장을 거부합니다.
GitTree에서 병합이 중지되면 충돌 횟수와 충돌한 파일 목록이 포함된 배너가 표시됩니다. 하나를 열면 편집기가 전체 창을 가져옵니다. 현재 및 들어오는 분기가 상단에 나란히 표시되고 각 분기에는 분기 이름이 표시되며 그 아래에는 저장될 파일인 출력이 표시됩니다.
- 충돌당: 현재 쪽, 들어오는 쪽, 둘 다 또는 둘 다 선택하지 않거나 각각에서 한 줄을 선택합니다.
- 버튼으로 다루지 않는 내용은 출력 편집을 직접 수행하세요.
- Show Base 공통 조상을 보려면 Git이
merge.conflictStyle가diff3또는zdiff3일 때 작성합니다). - 선택 취소를 통해 결정을 취소할 수 있습니다.
- 삭제된 파일: 한쪽에서 변경한 파일을 삭제한 경우 상대방의 파일을 유지하거나 삭제를 확인하세요.
GitTree는 여전히 마커 라인을 포함하는 결과를 저장하지 않습니다. VS Code, Cursor, JetBrains IDE, Beyond Compare, Meld, KDiff3, P4Merge, WinMerge, 사용자 정의 프로그램 또는 Git의 자체 merge.tool 등 외부 병합 도구에서 파일을 열 수도 있습니다. 파일을 해결하지 않고 도구를 닫으면 파일이 충돌된 상태로 유지됩니다.
GitTree의 병합 충돌을 단계별로 해결하는 방법
병합 시작
가져오려는 브랜치에서 브랜치 메뉴를 열고 현재 브랜치에 병합하거나 한 브랜치를 다른 브랜치로 드래그하세요. 메뉴에는 두 지점의 이름이 모두 지정되므로 방향을 추측할 수 없습니다.
충돌 미리보기 읽기
변경되기 전에 병합 대화 상자에는 분기가 충돌 없이 병합된다는 메시지가 표시되거나 중단될 파일이 나열됩니다. 병합 기록 방법을 선택한 후 확인하세요.
충돌하는 파일 열기
병합이 중지되면 배너는 충돌 횟수를 계산하고 파일 목록에는 충돌한 각 파일이 표시됩니다. 3방향 편집기에서 첫 번째 항목을 엽니다.
각각의 갈등을 결정
현재 측면, 들어오는 측면(둘 다 또는 둘 다 사용하지 않음)을 선택하고 단일 라인을 선택하거나 출력을 편집합니다. Show Base를 사용하여 두 분기 중 하나가 코드를 변경하기 전의 코드를 확인하세요.
파일을 저장하고 해결됨으로 표시
저장을 선택하고 해결됨으로 표시합니다. GitTree가 파일을 작성하고 준비한 후 다음 파일로 이동합니다. 충돌 표시 선이 남아 있는 동안에는 거부합니다.
병합 커밋
모든 파일이 확인되면 커밋 및 병합(리베이스를 위해 계속 리베이스)을 선택합니다. 나중에 마음이 바뀌었나요? 커밋 메뉴에서 병합 전의 커밋으로 분기를 재설정합니다. GitTree는 먼저 재설정의 스냅샷을 찍으므로 실행 취소가 되돌릴 수 있습니다.

병합하기 전에 병합 충돌 예측
Git 2.38부터 git merge-tree --write-tree는 작업 트리나 인덱스를 읽거나 쓰거나 커밋하지 않고 메모리에서 병합을 수행합니다. --name-only을 사용하면 충돌할 수 있는 파일이 나열됩니다. 충돌이 있으면 종료 상태는 1이고 병합이 깨끗하면 0입니다.
$ git fetch
$ git merge-tree --write-tree --name-only HEAD origin/main
0d708adc4a836d088802870278cb1f3daf06355f
src/auth.ts
Auto-merging src/auth.ts
CONFLICT (content): Merge conflict in src/auth.tsGitTree는 이 미리보기를 실행합니다. 병합 대화상자는 사용자가 확인하기 전에 예상 결과를 표시합니다. 각 가져오기 후에는 브랜치를 업스트림 및 기본 브랜치(다른 브랜치를 설정하지 않는 한 기본 또는 마스터)와 비교하여 확인하고 브랜치 이름 옆에 "2개 파일의 기본 브랜치와 충돌할 것입니다"와 같은 경고를 표시합니다. 두 번째 힌트는 가져온 파일과 병합되지 않은 다른 분기도 변경된다는 것을 표시합니다.
두 검사 모두 이미 가져온 내용만 사용합니다. 계산을 위해 가져오거나 병합하거나 변경하는 것이 없으며 컴퓨터에 아무것도 남지 않습니다. 둘 중 하나는 기본 설정에서 끌 수 있습니다.
git rerere를 사용하여 충돌 해결 재사용
Rerere는 "기록된 해상도 재사용"을 의미합니다. 이 기능을 켜면 Git은 각 충돌과 이를 해결한 방법을 기록합니다. 동일한 충돌이 다시 발생하면(예: 수명이 긴 브랜치를 반복적으로 리베이스하거나 병합을 다시 실행하는 경우) Git은 이전 해결 방법을 파일에 기록합니다.
$ git config --global rerere.enabled true
$ git rerere forget src/auth.ts # drop a recorded resolution that was wrongGit은 rerere.autoUpdate이 설정되지 않은 한 재사용된 결과를 검토를 위해 준비되지 않은 상태로 둡니다. GitTree에서 저장소 설정에는 해당 Git 옵션에 대한 기록된 해상도 재사용(rerere) 및 스테이지 재사용 해상도 스위치가 있습니다. 충돌 보기는 재사용된 해결 방법으로 레이블을 지정하고 해결 방법 잊어버리기는 잘못된 해결 방법을 삭제합니다.
Git에서 병합을 중단하거나 취소하는 방법
충돌로 인해 중지된 병합을 취소하려면 git merge --abort을 실행하세요. 리베이스, 체리 선택 또는 되돌리기에는 자체 중단이 있습니다.
$ git merge --abort
$ git rebase --abort
$ git cherry-pick --abort
$ git revert --abortGit의 자체 문서에서는 git merge --abort이 병합이 시작될 때 커밋되지 않은 변경 사항을 항상 다시 빌드할 수는 없다고 경고합니다. 병합하기 전에 커밋하거나 숨기면 중단 시 복원할 작업만 커밋됩니다.
GitTree에서 Abort Merge(또는 Abort Rebase, Cherry-Pick, Revert)에서는 Git이 작업 이전의 브랜치, 인덱스 및 작업 복사본을 복원하고 지금까지 이루어진 해결 방법을 삭제한다고 먼저 설명합니다. GitTree는 중단이 중단된 모든 내용을 단계적이든 아니든 복구 스냅샷에 저장하므로 Undo가 다시 가져올 수 있습니다.
커밋한 후 병합을 실행 취소하는 방법
수행할 작업은 병합을 푸시했는지 여부에 따라 다릅니다.
# Not pushed yet, right after the merge:
$ git reset --hard ORIG_HEAD # also discards uncommitted changes
$ git reset --merge ORIG_HEAD # keeps uncommitted changes
# Already pushed:
$ git revert -m 1 <merge-commit> # a new commit that reverses it병합은 분기의 이전 팁을 ORIG_HEAD에 저장하므로 이를 재설정하면 나중에 재설정 또는 리베이스가 ORIG_HEAD 이동되지 않는 한 병합이 제거됩니다. 다른 사람들이 병합한 후에는 대신 되돌리세요. 병합을 되돌리면 Git은 해당 변경 사항을 절대 원하지 않습니다. 해당 브랜치를 다시 병합하면 되돌리기를 되돌리지 않는 한 해당 브랜치를 다시 가져오지 않습니다.
GitTree의 그래프에서 병합의 첫 번째 상위 항목(이전에 브랜치가 있었던 커밋)을 선택하고 커밋 메뉴에서 소프트, 혼합 또는 하드 재설정을 선택합니다. 각 항목에는 유지되는 항목이 표시됩니다. GitTree는 19가지 작업을 실행하기 전에 재설정을 포함하여 스냅샷을 찍습니다. 따라서 Undo는 재설정을 되돌릴 수 있고 참조 로그 보기는 이전 상태를 복구합니다. 재설정, 리베이스 또는 커밋 실행 취소 가이드에서 복구에 대해 자세히 다루고 있습니다.
대부분의 병합 충돌을 방지하는 방법
- 가지를 작고 짧게 유지하세요. 두 가지가 길어질수록 서로 닿는 선이 많아집니다.
- 기본 분기를 자주 가져오되 마지막에 한 번 가져오지 마세요.
- 로직에서 형식을 분리합니다. 하나의 형식 지정자에 동의하고 자체적으로 전체 파일 형식을 다시 지정합니다.
- 손으로 병합하는 대신 잠금 파일을 재생성하세요. 어느 쪽이든 선택하고 패키지 관리자를 다시 실행하세요.
- zdiff3을 켜고 한 번 다시 실행하세요. 두 가지 명령으로 지속적인 이점을 얻을 수 있습니다.
- 통합하기 전에 커밋하거나 숨김하므로 모든 중단 및 실행 취소가 정확합니다.
먼저 안전한 저장소에서 연습하고 싶으신가요? Git 튜토리얼의 무료 강의 분기된 브랜치를 병합하고 두 상위 항목 모두 확인에서는 실제 병합을 안내합니다. 아직도 GUI와 터미널을 비교하고 계십니까? Git GUI와 명령줄은 두 가지를 솔직하게 비교합니다.
GitTree에는 개인 저장소가 포함된 모든 Git 기능을 포함하는 무료 요금제가 있으며, AI 도우미인 Nour에는 GitTree Pro(가격 참조)가 함께 제공됩니다. 로그인하려면 Git 2.39 이상 및 GitTree 계정이 필요합니다. macOS, Windows 또는 Linux용으로 다운로드하거나 GitTree 다운로드 페이지에서 모든 설치 프로그램을 확인하세요. Ubuntu 22.04에 Git를 먼저 업그레이드하세요. 완고한 갈등에 갇혀 있습니까? GitTree 지원을 요청하세요.
자주 묻는 질문
Git에서 병합 충돌이 발생하는 이유는 무엇입니까?
병합 충돌은 두 분기가 파일의 동일한 행을 다른 방식으로 변경하거나 한 분기가 다른 분기가 수정한 파일을 삭제할 때 발생합니다. Git은 파일의 다른 부분에 대한 변경 사항을 자동으로 결합하지만 동일한 줄에 대한 두 가지 편집 중에서 선택할 수 없으므로 중지하고 결정하도록 요청합니다.
Git에서 병합을 어떻게 취소하나요?
충돌로 인해 병합이 중지되는 동안 git merge --abort을 실행하세요. Git은 브랜치, 인덱스, 작업 트리를 병합이 시작되기 전 상태로 되돌립니다. 리베이스, 체리 선택 또는 되돌리기의 경우 git rebase --abort, git cherry-pick --abort 또는 git revert --abort를 사용하세요. 병합이 이미 커밋으로 완료된 경우 중단은 더 이상 적용되지 않습니다. 대신 재설정이나 되돌리기를 사용하여 실행 취소합니다.
"모든 병합 충돌을 편집한 다음 git add를 사용하여 해결된 것으로 표시해야 합니다"는 무슨 뜻인가요?
Git은 계속하려고 하면 일반적으로 git rebase --continue을 사용하여 이를 인쇄하지만 파일은 여전히 충돌된 것으로 간주됩니다. 병합되지 않은 경로 아래의 각 파일 git status 목록을 열고 충돌 마커를 제거한 후 파일에서 git add을 실행하고 다시 계속하세요. 먼저 git diff --check을 실행하면 놓친 마커가 표시됩니다.
충돌이 발생하면 병합을 중단해도 안전합니까?
예, 자신의 작업을 먼저 커밋하거나 숨겼다면 가능합니다. git merge --abort는 병합 전의 분기, 색인 및 작업 트리를 복원하고 해결 방법을 삭제합니다. 병합 전에 커밋되지 않은 편집 내용이 정확하게 반환되지 않을 수 있으므로 먼저 커밋하거나 숨기는 것이 중요합니다. GitTree는 중단이 삭제된 모든 것을 스냅샷하므로 Undo가 이를 복구할 수 있습니다.
Git 충돌에서 우리와 그들의 것은 무엇을 의미합니까?
병합에서 "ours"는 현재 있는 브랜치(HEAD)이고 "theirs"는 병합되는 브랜치입니다. 리베이스에서는 서로 교체됩니다. "ours"는 리베이스하는 브랜치이고 "theirs"는 재생되는 자신의 커밋입니다. 이것이 git checkout --ours가 리베이스 중간에 사람들을 놀라게 하는 이유입니다. GitTree 각 측면에 지점 이름과 역할 레이블을 지정합니다.
이미 커밋한 병합을 어떻게 취소하나요?
푸시하지 않은 경우 병합 직후에 git reset --hard ORIG_HEAD를 실행하거나 커밋되지 않은 변경 사항을 유지하려면 git reset --merge ORIG_HEAD를 실행하세요. 병합이 이미 공유 분기에 있는 경우 git revert -m 1 <merge-commit>를 실행하여 기록을 다시 쓰지 않고 되돌립니다. GitTree의 커밋 메뉴에서 병합의 첫 번째 상위 항목으로 분기를 재설정합니다. 재설정은 먼저 스냅샷을 찍으므로 마음이 바뀌면 실행 취소를 취소할 수 있습니다.
Git 병합 충돌을 해결하는 가장 좋은 도구는 무엇입니까?
한 번에 세 가지 버전(사용자 측, 수신 측 및 공통 베이스)을 표시하고 충돌별로 충돌을 결정할 수 있으며 마커가 남아 있는 파일을 저장하지 않는 병합 충돌 도구를 찾으십시오. GitTree에는 이와 같은 3방향 편집기가 포함되어 있으며 이미 사용하고 있는 병합 도구에 파일을 전달할 수도 있습니다. 어느 쪽이든 zdiff3을 켜십시오.
Git이 다음번에도 동일한 충돌을 자동으로 해결할 수 있나요?
네, rerere와 함께요. git config --global rerere.enabled true를 실행하면 Git이 각 충돌을 해결하는 방법을 기록합니다. 예를 들어 반복적인 리베이스 중에 정확히 동일한 충돌이 다시 나타나면 Git은 이전 해결 방법을 파일에 기록합니다. rerere.autoUpdate이 켜져 있지 않으면 계속 검토하고 준비합니다. GitTree는 해상도가 재사용된 시기를 표시합니다.
출처
다른 제품에 대한 주장은 2026년 10월 28일의 공식 페이지에서 확인되었습니다. 가격과 기능은 변경됩니다. 공급업체 페이지가 진실의 원천입니다.
- Git 문서: git merge(충돌 표시 및 해결 방법, --abort, ORIG_HEAD)
- Git 문서: git merge-tree(--write-tree, --name-only, 종료 상태)
- Git 2.38 릴리스 정보(새로운 git 병합 트리 모드)
- Git 문서: git config(merge.conflectStyle, rerere.enabled, rerere.autoUpdate)
- Git 문서: git rerere
- Git 문서: git checkout(--ours 및 --theirs)
- Git 문서: git diff(--check)
- Git 문서: git mergetool
- Git 문서: git Reset(ORIG_HEAD와의 병합 실행 취소)
- Git 문서: git revert(병합 커밋의 경우 -m)