Git 저장소에서 충돌을 해결하는 방법
질문
내 Git 저장소에서 병합 충돌을 해결하고 싶습니다.
어떻게해야합니까?
답변
시도해보십시오 : Git MergeTool.
각 충돌을 통해 여러분을 만드는 GUI가 열리고 병합하는 방법을 선택하게됩니다.때로는 그 후에 약간의 손 편집이 필요하지만 일반적으로 그 자체로 충분합니다.그것은 확실히 손으로 모든 것을하는 것보다 훨씬 낫습니다.
Josh Glover의 의견에 따라 :
명령
하나를 설치하지 않는 한 반드시 GUI를 열지는 않습니다.나를 위해 Git Mergeool을 실행하면 비 핌프가 사용되었습니다.설치할 수 있습니다 대신 사용할 다음 도구 중 하나 : Meld, Opendiff, KDIFF3, TKDIFF, XXDIFF, 거북이, gvimdiff, 확산, ecmerge, p4merge, araxis, vimdiff, 등장.
다음은 Merge 충돌을 해결하기 위해 Vimdiff를 사용하는 샘플 절차입니다.이 링크를 기반으로합니다
1 단계 : 터미널에서 다음 명령을 실행합니다
git config merge.tool vimdiff
git config merge.conflictstyle diff3
git config mergetool.prompt false
그러면 기본 병합 도구로 Vimdiff가 설정됩니다.
2 단계 : 터미널에서 다음 명령을 실행합니다
git mergetool
3 단계 : 다음 형식으로 VIMDIFF 디스플레이가 표시됩니다.
╔═══════╦══════╦════════╗
║ ║ ║ ║
║ LOCAL ║ BASE ║ REMOTE ║
║ ║ ║ ║
╠═══════╩══════╩════════╣
║ ║
║ MERGED ║
║ ║
╚═══════════════════════╝
이 4 가지 의견은
로컬 - 이는 현재 지점의 파일입니다
기본 - 일반 조상, 두 가지 변경 전에 파일이 보이는 방법
원격 - 파일을 병합하고 있습니다
병합 - 병합 결과, 이것은 repo에 저장됩니다.
Ctrl + W를 사용하여 이러한 뷰 중에서 탐색 할 수 있습니다.Ctrl + W를 사용하여 병합 된보기에 직접 도달 할 수 있습니다.
vimdiff 네비게이션에 대한 자세한 내용은 여기에 있습니다.
단계 4. 병합 된 뷰를 다음과 같은 방법으로 편집 할 수 있습니다.
원격에서 변경 사항을 얻으려면
:diffg RE
Base에서 변경 사항을 얻고 싶다면
:diffg BA
로컬에서 변경 사항을 변경하려면
:diffg LO
5 단계. 저장, 종료, 커밋 및 정리
: Vi에서 저장하고 종료하십시오
git commit -m "메시지"
git clean diff 도구로 작성한 추가 파일 (예 : * .ORIG)을 제거하십시오.
답변
상단에서 예상 가능한 유스 케이스가 있습니다.
당신은 몇 가지 변화를 가져올 것입니다. 그러나 죄송합니다. 당신은 최신 상태가 아닙니다.
git fetch origin
git pull origin master
From ssh://gitosis@example.com:22/projectname
* branch master -> FETCH_HEAD
Updating a030c3a..ee25213
error: Entry 'filename.c' not uptodate. Cannot merge.
그래서 당신은 최신 정보를 얻고 다시 시도하지만 충돌이 있습니다.
git add filename.c
git commit -m "made some wild and crazy changes"
git pull origin master
From ssh://gitosis@example.com:22/projectname
* branch master -> FETCH_HEAD
Auto-merging filename.c
CONFLICT (content): Merge conflict in filename.c
Automatic merge failed; fix conflicts and then commit the result.
그래서 당신은 변경 사항을 살펴 봅니다.
git mergetool
오, 오, 내, 상류가 바뀌었지만, 내 변화를 사용하기 위해서만 ... 아니오 ... 그들의 변화 ...
git checkout --ours filename.c
git checkout --theirs filename.c
git add filename.c
git commit -m "using theirs"
그리고 나서 우리는 마지막 시간을 시도합니다
git pull origin master
From ssh://gitosis@example.com:22/projectname
* branch master -> FETCH_HEAD
Already up-to-date.
타다!
답변
병합 도구는 분쟁이나 해결을 이해하는 데 드물게 도움이되지 않습니다.나는 일반적으로 텍스트 편집기에서 충돌 마커를보고 Git Log를 보완으로 사용하는 것입니다.
다음은 몇 가지 팁이 있습니다.
팁 하나
내가 발견 한 가장 좋은 것은 "diff3"병합 충돌 스타일을 사용하는 것입니다.
git config merge.conflictstyle diff3.
이것은 다음과 같이 충돌 마커를 생성합니다.
<<<<<<<
Changes made on the branch that is being merged into. In most cases,
this is the branch that I have currently checked out (i.e. HEAD).
|||||||
The common ancestor version.
=======
Changes made on the branch that is being merged in. This is often a
feature/topic branch.
>>>>>>>
중간 섹션은 일반적인 조상이 보이는 것입니다.이것은 각 변화의 목적이 무엇인지에 대한 더 나은 아이디어를 제공하기 위해 더 나은 아이디어를 제공하기 위해 상단 및 하단 버전과 비교할 수 있기 때문에 유용합니다.
갈등이 단지 몇 줄 일 경우, 이것은 일반적으로 충돌을 매우 분명하게 만듭니다.(갈등을 해결하는 방법을 아는 방법은 매우 다릅니다. 다른 사람들이 일하는 것에 대해 알아야합니다. 당신이 혼란스러워한다면, 그 사람을 당신의 방으로 부르면 당신이 찾고있는 것을 볼 수 있도록 그 사람을 방으로 전화하는 것이 가장 좋습니다.에.)
충돌이 길어지면 세 섹션을 "광산", "공통"및 "그들의"과 같이 세 개의 별도의 파일로 자르고 붙여 넣을 것입니다.
그런 다음 다음 명령을 실행하여 충돌을 일으킨 두 개의 Diff Hunks를보아야합니다.
diff common mine
diff common theirs
병합 도구는 병합 도구를 사용하여 병합 도구를 사용하는 것과 동일하지 않습니다.나는 그것을 산만하게하는 것을 발견합니다.
팁 2.
누군가 이미 이것을 언급했지만, 각 diff 덩어리의 뒤에있는 의도를 이해하는 것은 일반적으로 충돌이 어디에서 왔는지와 그것을 처리하는 방법을 이해하는 데 매우 도움이됩니다.
git log --merge -p <name of file>
이것은 공통 조상과 병합하는 두 개의 머리 사이의 파일을 만진 모든 커밋을 보여줍니다.(그래서 그것은 병합 전에 두 가지 모두에 이미 존재하는 커밋을 포함하지 않습니다.) 이것은 귀하의 현재 충돌의 요인이 아닌 diff Hunks를 무시하는 데 도움이됩니다.
팁 3.
자동화 된 도구로 변경 사항을 확인하십시오.
자동 테스트가있는 경우, 실행하십시오.린트가있는 경우 실행하십시오.그것이 제작 가능한 프로젝트 인 경우, 당신이 커밋하기 전에 그것을 빌드하십시오. 모든 경우에 변경 사항이 변경되지 않은지 확인하려면 약간의 테스트를 수행해야합니다.(갈등없이 병합조차도 작업 코드가 부러 질 수 있습니다.)
팁 4.
앞서 계획;동료와 의사 소통을하십시오.
미리 계획하고 다른 사람들이 작업하는 것이 병합 충돌을 방지하고 이전에 해결하는 데 도움을 줄 수 있습니다. 세부 사항은 여전히 신선합니다.
예를 들어, 귀하와 다른 사람이 동일한 파일 세트에 영향을 미치는 다른 리팩토링을 통해 여러분과 다른 사람이 모두 일하기를 알고 있다는 것을 알고 있다는 것을 알고 있다면, 당신은 당신이 각각의 변화의 유형에 대해 어떤 유형의 변화에 대해 더 나은 감각을 얻어야합니다.만들기.병렬로 계획된 변경 사항을 연속적으로 수행하면 상당한 시간과 노력을 저장할 수 있습니다.
코드의 큰 스위트를 가로 지르는 주요 리팩토링의 경우, 일련의 작업을 강력하게 고려해야합니다. 한 사람이 완전한 리팩토링을 수행하는 동안 모든 사람이 코드의 해당 영역에서 작업을 중단해야합니다.
직렬로 일할 수없는 경우 (시간 압력, 어쩌면) 일체로 일한 다음 예상 병합 충돌에 대해 통신하는 것은 적어도 세부 사항이 여전히 신선한 경우 문제를 빨리 해결하는 데 도움이됩니다.예를 들어 동료가 1 주일 동안의 과정에서 파괴적인 일련의 커밋을하고 있으면 해당 주 동안 매일 동료의 공동 작업자가 1 회 또는 두 번 분류 할 수 있습니다.그런 식으로, 병합 / 리베이스 충돌을 찾으면 몇 주를 기다리면 모든 것을 하나의 큰 덩어리로 병합하는 것보다 더 빨리 해결할 수 있습니다.
팁 5.
병합을 확신 할 수없는 경우 강제로하지 마십시오.
병합은 특히 충돌하는 파일이 많고 충돌 마커가 수백 줄을 커버 할 때 압도적으로 느낄 수 있습니다.종종 소프트웨어 프로젝트를 추정 할 때 우리는 gnarly 병합을 처리하는 것과 같은 오버 헤드 항목에 충분한 시간을 포함하지 않으므로 각 충돌을 해부하는 몇 시간을 보내는 실제 드래그처럼 느껴집니다.
장기적으로 미리 계획하고 다른 사람들이 작업하고 있는지 알고 있으면 병합 충돌을 예상하는 가장 좋은 도구가 있으며 적은 시간에 정확하게 해결할 수 있도록 준비하십시오.
답변
Identify which files are in conflict (Git should tell you this).
Open each file and examine the diffs; Git demarcates them. Hopefully it will be obvious which version of each block to keep. You may need to discuss it with fellow developers who committed the code.
Once you've resolved the conflict in a file
git add the_file
.Once you've resolved all conflicts, do
git rebase --continue
or whatever command Git said to do when you completed.
답변
병합 충돌은 동시에 파일을 변경하면 발생합니다.다음은 해결 방법입니다.
Git Cli.
다음은 충돌 상태가 될 때 수행 할 수있는 간단한 단계입니다.
- Note the list of conflicted files with:
git status
(underUnmerged paths
section). Solve the conflicts separately for each file by one of the following approaches:
Use GUI to solve the conflicts:
git mergetool
(the easiest way).To accept remote/other version, use:
git checkout --theirs path/file
. This will reject any local changes you did for that file.To accept local/our version, use:
git checkout --ours path/file
However you've to be careful, as remote changes that conflicts were done for some reason.
Related: What is the precise meaning of "ours" and "theirs" in git?
Edit the conflicted files manually and look for the code block between
<<<<<
/>>>>>
then choose the version either from above or below=====
. See: How conflicts are presented.Path and filename conflicts can be solved by
git add
/git rm
.
Finally, review the files ready for commit using:
git status
.If you still have any files under
Unmerged paths
, and you did solve the conflict manually, then let Git know that you solved it by:git add path/file
.If all conflicts were solved successfully, commit the changes by:
git commit -a
and push to remote as usual.
참조 : GitHub의 명령 줄에서 병합 충돌 해결
실용적인 튜토리얼의 경우 확인 : 시나리오 5 - Katacoda가 병합 충돌을 고정합니다.
diffmerge.
시각적으로 Windows, MacOS 및 Linux / UNIX에서 파일을 비교하고 병합 할 수있는 Diffmerge를 성공적으로 사용했습니다.
그래픽으로 3 개의 파일 간의 변경 사항을 표시 할 수 있으며 자동 병합 (안전한 경우) 및 결과 파일 편집을 완벽하게 제어 할 수 있습니다.

이미지 소스 : Diffmerge (Linux screenshot)
단순히 그것을 다운로드하고 repo로 실행하십시오.
git mergetool -t diffmerge .
맥 OS
MacOS에서 다음을 통해 설치할 수 있습니다.
brew install caskroom/cask/brew-cask
brew cask install diffmerge
아마 (제공되지 않은 경우) 경로에 배치 된 다음과 같은 추가 간단한 랩퍼가 필요합니다 (예 : / usr / bin).
#!/bin/sh
DIFFMERGE_PATH=/Applications/DiffMerge.app
DIFFMERGE_EXE=${DIFFMERGE_PATH}/Contents/MacOS/DiffMerge
exec ${DIFFMERGE_EXE} --nosplash "$@"
그런 다음 다음 키보드 단축키를 사용할 수 있습니다.
⌘-Alt-Up / Down 이전 / 다음 변경으로 이동합니다. ⌘-alt-left / 왼쪽에서 왼쪽 또는 오른쪽으로 변경을 받아들이려면
또는 두 개의 파일이나 디렉토리를 병합하여 세 번째 파일이나 디렉토리를 만들 수있는 opendiff (xcode 도구의 일부)를 사용할 수 있습니다.
답변
스택 오버플로 질문에서 답변을 확인하십시오. GIT의 병합, 특히 다른 버전의 파일을 문제로 보는 방법을 보여주는 찰스 베일리의 답변을 보여줍니다.
# Common base version of the file.
git show :1:some_file.cpp
# 'Ours' version of the file.
git show :2:some_file.cpp
# 'Theirs' version of the file.
git show :3:some_file.cpp
출처:https://stackoverflow.com/questions/161813/how-to-resolve-merge-conflicts-in-a-git-repository
최근댓글