Git 저장소의 병합 충돌을 해결하려면 어떻게 해야 합니까?
Git 저장소의 병합 충돌을 해결하려면 어떻게 해야 합니까?
시험:
git mergetool
각 경합을 설명하는 GUI가 열리고 Marge 방법을 선택할 수 있습니다.나중에 약간의 손 편집이 필요할 수도 있지만, 보통은 그것만으로도 충분합니다.확실히 모든 것을 손으로 하는 것보다 훨씬 낫다.
[이 명령어]는 GUI를 설치하지 않으면 열리지 않습니다..
git mergetool
나는 그 결과가 되었다vimdiff
사용되고 있습니다.할 수 는 다음과 같습니다.meld
,opendiff
,kdiff3
,tkdiff
,xxdiff
,tortoisemerge
,gvimdiff
,diffuse
,ecmerge
,p4merge
,araxis
,vimdiff
,emerge
.
은 '보다 낫다'를 사용한 입니다.vimdiff
이 링크를 기반으로 병합 충돌을 해결합니다.
단말기에서 다음 명령을 실행합니다.
git config merge.tool vimdiff git config merge.conflictstyle diff3 git config mergetool.prompt false
세팅이 됩니다.
vimdiff
기본 병합 도구로 사용합니다.단말기에서 다음 명령을 실행합니다.
git mergetool
하면 '오빠지다'가 .
vimdiff
됩니다.╔═══════╦══════╦════════╗ ║ ║ ║ ║ ║ LOCAL ║ BASE ║ REMOTE ║ ║ ║ ║ ║ ╠═══════╩══════╩════════╣ ║ ║ ║ MERGED ║ ║ ║ ╚═══════════════════════╝
이 4가지 뷰는
- LOCAL: 현재 분기의 파일입니다.
- BASE: 공통 상위, 두 변경 전 이 파일의 모양
- REMOTE: 분기에 병합하는 파일
- MERGED: Marge 결과. 이것은 Marge 커밋에 저장되며 향후에 사용됩니다.
+w 를 사용하여 이러한 보기 사이를 이동할 수 있습니다.[w MERGED ]뷰에 직접 접속하려면 + 를 누른 후 를 누릅니다.
MERGED 뷰는 다음과 같이 편집할 수 있습니다.
REMOTE에서 변경 내용을 가져오려면
:diffg RE
BASE에서 변경 내용을 가져오려면
:diffg BA
LOCAL에서 변경 내용을 가져오려면
:diffg LO
저장, 종료, 커밋 및 정리
:wqa
from ( vi ;vi 저장 후 종료)git commit -m "message"
git clean
파일 삭제( " " )*.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 로그를 사용하는 것이 보통입니다.
다음은 몇 가지 힌트입니다.
힌트 1
가장 좋은 점은 "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.
>>>>>>>
가운데 부분은 공통 조상의 모습이에요.이는 상위 및 하위 버전과 비교하여 각 분기에서 변경된 내용을 더 잘 파악할 수 있으므로 각 변경의 목적이 무엇인지 더 잘 파악할 수 있으므로 유용합니다.
갈등이 몇 줄에 불과한 경우, 일반적으로 갈등이 매우 명백해집니다. (갈등을 해결하는 방법을 아는 것은 매우 다릅니다. 다른 사람들이 무엇을 하고 있는지 알아야 합니다.혼란스럽다면, 그 사람을 방으로 불러서 당신이 보고 있는 것을 그들이 볼 수 있도록 하는 것이 가장 좋습니다.)
경합이 길어지면 세 섹션 각각을 "mine", "common", "themes" 등 세 개의 개별 파일로 잘라 붙여넣습니다.
그런 다음 다음 명령을 실행하여 경합을 일으킨 두 개의 다른 헌크를 확인할 수 있습니다.
diff common mine
diff common theirs
병합 도구는 충돌하지 않는 모든 diff hunk도 포함하므로 병합 도구를 사용하는 것과 다릅니다.나는 그것이 주의를 산만하게 한다고 생각한다.
힌트 2
누군가가 이미 언급했지만, 각각의 디퓨얼 헝크의 이면에 있는 의도를 이해하는 것은 일반적으로 충돌이 어디에서 비롯되었고 어떻게 대처해야 하는지를 이해하는 데 매우 도움이 됩니다.
git log --merge -p <name of file>
이것은 공통의 상위 항목과 병합하는 두 개의 헤드 사이에서 해당 파일을 터치한 모든 커밋을 보여줍니다(따라서 병합 전에 이미 두 브랜치에 존재하는 커밋은 포함되지 않습니다).이것은 분명히 현재 갈등의 요소가 아닌 다른 문제를 무시하는 데 도움이 됩니다.
힌트 3
자동 툴을 사용하여 변경 내용을 확인합니다.
자동 테스트가 있는 경우 해당 테스트를 실행합니다.보풀이 있으면 실행하세요.구축 가능한 프로젝트인 경우 커밋하기 전에 구축해야 합니다.모든 경우 변경사항이 손상되지 않았는지 확인하기 위해 약간의 테스트를 수행해야 합니다.(체크, 경합이 없는 머지라도 동작 코드가 깨질 수 있습니다.
힌트 4
미리 계획을 세우고 동료들과 소통합니다.
미리 계획을 세우고 다른 사용자가 작업 중인 내용을 파악하면 머지 충돌을 방지하거나 더 일찍 해결하는 데 도움이 됩니다. 자세한 내용은 아직 최신 정보를 염두에 두고 있습니다.
예를 들어, 같은 파일 세트에 영향을 주는 리팩터링에 대해 자신과 다른 사람이 작업하고 있는 것을 알고 있는 경우, 사전에 서로 대화하여 각자가 어떤 유형의 변경을 하고 있는지를 파악해야 합니다.계획된 변경을 병렬이 아닌 순차적으로 수행하면 상당한 시간과 노력을 절약할 수 있습니다.
대량의 코드를 절단하는 메이저리팩터링의 경우는, 시리얼 처리를 강하게 검토할 필요가 있습니다.즉, 1명이 완전한 리팩터링을 실행하는 동안, 모두가 코드의 그 영역에 관한 작업을 정지합니다.
시간적 압박으로 인해 연속적으로 작업할 수 없는 경우 예상되는 병합 충돌에 대한 정보를 전달하면 자세한 내용을 염두에 두고 문제를 더 빨리 해결할 수 있습니다.예를 들어, 동료가 일주일 동안 중단되는 일련의 커밋을 수행하는 경우 해당 동료 브랜치 상에서 매일 1~2회 Marge/Rebase를 선택할 수 있습니다.이렇게 하면 머지/기본값 경합이 발견되면 모든 것을 하나의 큰 덩어리로 병합하는 데 몇 주를 기다리는 것보다 더 빨리 해결할 수 있습니다.
힌트 5
병합이 확실하지 않은 경우 강제하지 마십시오.
특히 충돌하는 파일이 많고 충돌하는 마커가 수백 줄에 걸쳐 있는 경우에는 병합이 부담스러울 수 있습니다.소프트웨어 프로젝트를 견적할 때 종종 우리는 복잡한 병합 처리와 같은 오버헤드 항목에 충분한 시간을 포함하지 않기 때문에 각각의 충돌을 분석하는데 몇 시간을 소비하는 것은 매우 귀찮은 일입니다.
장기적으로는 미리 계획을 세우고 다른 사람이 어떤 작업을 하고 있는지 파악하는 것이 머지 경합을 예측하고 더 짧은 시간에 올바르게 해결할 수 있도록 준비하는 데 가장 좋은 도구입니다.
경합하고 있는 파일을 특정합니다(이것에 대해서는, GIT 에 의해서 알 수 있습니다.
각 파일을 열고 차이를 조사합니다. Git은 그것들을 구분합니다.각 블록의 어떤 버전을 유지해야 하는지 알 수 있기를 바랍니다.코드를 커밋한 다른 개발자와 상의해야 할 수도 있습니다.
후
git add the_file
.모든 경합이 해결되면
git rebase --continue
또는 Git이 당신이 완료했을 때 실행하라고 한 명령어라도.
병합 충돌은 파일을 동시에 변경할 때 발생합니다.해결 방법은 다음과 같습니다.
git
다음은 충돌 상태가 되었을 때 수행하는 간단한 단계입니다.
- 과 같습니다.
git status
(아래(아래).Unmerged paths
를 참조해 주세요. 다음 방법 중 하나를 사용하여 각 파일에 대해 개별적으로 충돌을 해결합니다.
하려면 GUI를 합니다.GUI를 합니다.
git mergetool
( 장쉬쉬 ( ), 다음과 같이
git checkout --theirs path/file
그러면 해당 파일에 대해 수행한 로컬 변경이 거부됩니다.버전을 다음 명령을
git checkout --ours path/file
그러나 경합이 발생한 원격 변경은 어떤 이유에서인지 발생하므로 주의해야 합니다.
.
<<<<<
/>>>>>
중 .=====
. 를 참조해 주세요.경합이 표시되는 방법을 참조해 주세요.은, 「경로」와「경로」로할 수 .
git add
/git rm
.
가 된 다음은 커밋할 수 없습니다.
git status
.「」아래에 아직 .
Unmerged paths
을 수동으로 Git 음 、 음 、 충 충 。git add path/file
.으로 해결된 다음과 변경 .
git commit -a
여느 때처럼 리모트로 눌러주세요.
다음 항목도 참조하십시오.GitHub 명령줄에서 병합 충돌 해결
실제 튜토리얼에 대해서는 시나리오 5 - 카타코다별 병합 충돌 수정을 확인하십시오.
DiffMerge
Windows, MacOS, Linux/Unix의 파일을 시각적으로 비교 및 Marge할 수 있는 DiffMerge를 성공적으로 사용했습니다.
3개의 파일간의 변경을 그래픽으로 표시할 수 있어 안전한 경우 자동 Marge 및 결과 파일 편집에 대한 완전한 제어가 가능합니다.
이미지 소스: DiffMerge (Linux 스크린샷)
다운로드하여 다음과 같이 재포장하기만 하면 됩니다.
git mergetool -t diffmerge .
MacOS
MacOS에서는 다음을 통해 설치할 수 있습니다.
brew install caskroom/cask/brew-cask
brew cask install diffmerge
PATH에 PATH)를 /usr/bin
#!/bin/sh
DIFFMERGE_PATH=/Applications/DiffMerge.app
DIFFMERGE_EXE=${DIFFMERGE_PATH}/Contents/MacOS/DiffMerge
exec ${DIFFMERGE_EXE} --nosplash "$@"
그런 다음 다음 바로 가기 키를 사용할 수 있습니다.
- ⌘--AltUp/Down 이전/다음 변경으로 이동합니다.
- --/Right 왼쪽 또는 오른쪽에서 변경을 받아들입니다⌘.AltLeft
또는 opendiff(Xcode Tools의 일부)를 사용하여 두 개의 파일 또는 디렉토리를 병합하여 세 번째 파일 또는 디렉토리를 만들 수 있습니다.
스택 오버플로우 질문 Git에서 병합을 중단하는 답변, 특히 문제가 있는 파일의 다른 버전을 보는 방법을 보여주는 Charles Bailey의 답변에서 답변을 확인하십시오.
# 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
을 자주 하시는.git log --merge
.그리고나서git diff
경합이 표시됩니다.
여러 줄의 경합이 있는 경우 외부 GUI 툴에서 무슨 일이 일어나고 있는지 쉽게 확인할 수 있습니다.는 opendiff를 .Git은, 「opendiff」의 합니다.Git v vimdiff 、 gvimdiff 、 kdiff3, tkdiff, meld, xxdiff, emerge 를 git git 、 git git git git git git 、 git git git git git git git git 。git config merge.tool "your.tool"
, 「 」를 클릭합니다.git mergetool
머지가 실패하면 컨텍스트의 차이가 표시됩니다.
하기 위해 을 편집한다.git add filename
인덱스가 갱신되고 diff는 더 이상 표시되지 않습니다.되고 그 이 「」가 .git add
-ed,git commit
병합이 완료됩니다.
버전 전체를 원하거나 개별 변경 사항을 검토하여 각각의 변경 사항을 결정하고 싶습니다.
내 또는 해당 버전을 완전히 수락합니다.
내 버전 수락(로컬, 당사 버전):
git checkout --ours -- <filename>
git add <filename> # Marks conflict as resolved
git commit -m "merged bla bla" # An "empty" commit
버전 수락(리모트, 사용자 버전):
git checkout --theirs -- <filename>
git add <filename>
git commit -m "merged bla bla"
실행 중인 모든 충돌 파일에 대해 수행할 경우:
git merge --strategy-option ours
또는
git merge --strategy-option theirs
모든 변경 내용을 검토하고 개별적으로 승인
git mergetool
- 변경 내용을 검토하고 각 변경 사항에 대한 버전 중 하나를 수락합니다.
git add <filename>
git commit -m "merged bla bla"
: " "mergetool
는 명령줄에서 동작합니다.명령줄 mergetool을 사용하는 방법은 별개의 질문이어야 합니다.
이를 위한 시각적 도구를 설치할 수도 있습니다.meld
git mergetool -t meld
로컬 버전(우리 회사), "베이스" 또는 "머지된" 버전(마지된 현재 결과)과 원격 버전(그들)이 열립니다.된 버전을 하고 을 실행합니다.git mergetool -t meld
"No files need marge" (파일은 병합할 필요가 없습니다)라고 표시될 때까지 다시 입력한 후 3단계와 4단계로 이동합니다.
경합이 표시되는 방법 또는 Git에서는git merge
병합 충돌 마커가 무엇인지 이해하기 위한 문서입니다.
또, 「충돌의 해결 방법」섹션에서는, 경합을 해결하는 방법에 대해서도 설명합니다.
경합이 확인되면 다음 두 가지 작업을 수행할 수 있습니다.
합하하않않않않않않않않결 결결한 청소는 입니다.
HEAD
2.에합니다. 2. 2. 2. 2. 3. 3. 3. 3. commit에 changes changes changes changes changes changes changes changes changes commit commit commit commit commit commit commit commit commit commit commit commit commit commit commit commit commit commit commit commit commit commit.git merge --abort
사용할 수 있습니다.경합을 해결합니다.Git git git git git git git git git git git git 。로 편집하여 「」라고 합니다.
git add
인덱스로 이동합니다.git commit
거래를 성사시키기 위해서요다음과 같은 여러 가지 도구를 사용하여 충돌을 해결할 수 있습니다.
겟툴머
git mergetool
그래픽 머게툴을 기동해, 머게툴의 통합에 도움이 됩니다.차이를 보세요.
git diff
차이를 , 3방향 차이와 3방향 차이 양쪽의 를 강조 합니다.HEAD
★★★★★★★★★★★★★★★★★」MERGE_HEAD
를 참조해당 버전.각 지점의 차이를 보세요.
git log --merge -p <path>
는, 「의 diff는 diff를 나타냅니다.HEAD
, 그 에 전,, 버전, 음음음 version version version version versionMERGE_HEAD
전입니니다다원본을 보세요.
git show :1:filename
조상인 조상을 .git show :2:filename
, 을 나타냅니다.HEAD
및 「」를 참조해 주세요.git show :3:filename
, 을 나타냅니다.MERGE_HEAD
전입니니다다
Marge Conflict Marker 및 해결 방법에 대한 내용은 Pro Git 북의 Basic Merge Conflicts 섹션에서 확인할 수 있습니다.
Marge 경합을 반수동으로 해결하는 Emacs 사용자의 경우:
git diff --name-status --diff-filter=U
에, 경합 해결이 필요한 모든 파일을 나타냅니다.
다음 방법으로 각 파일을 하나씩 열거나 한 번에 엽니다.
emacs $(git diff --name-only --diff-filter=U)
Emacs에서 편집이 필요한 버퍼를 방문하려면
ALT+x vc-resolve-conflicts
이렇게 하면 3개의 버퍼(마인, 그들 버퍼 및 출력 버퍼)가 열립니다.'n'(다음 영역), 'p'(사전 영역)를 눌러 탐색합니다.'a'와 'b'를 각각 눌러 광산 또는 해당 지역을 출력 버퍼에 복사합니다.출력 버퍼를 직접 편집합니다.
완료되면: 'q'를 누릅니다.Emacs는 이 버퍼를 저장할 것인지 여부를 묻습니다.yes버퍼가 완료되면 테리미날에서 실행하여 해결된 것으로 표시합니다.
git add FILENAME
모든 버퍼 유형 종료 시
git commit
마지를 종료합니다.
보너스:
이전 답변에서 pull/fetch/merge에 대해 언급하면서 흥미롭고 생산적인 트릭을 공유하고자 합니다.
git pull --rebase
위의 명령어는 제 Git 생활에서 가장 유용한 명령어로 많은 시간을 절약해 줍니다.
에, 「」를 시험해 .git pull --rebase
git pull
매뉴얼 </FONT CHANGE:』merge
최신 리모트 서버의 변경(fetch+merge)을 자동적으로 동기 해, 로컬의 최신 커밋을 Git 로그의 선두에 배치합니다.수동 당김/머지 걱정은 없습니다.
경합이 있는 경우, 그냥 사용하세요.
git mergetool
git add conflict_file
git rebase --continue
자세한 내용은 다음 사이트를 참조하십시오: "git pull – rebase"의 기능은 무엇입니까?
한 리포지토리의 변경이 중요하지 않다는 것을 잘 알고 있고 다른 리포지토리에 유리한 모든 변경 사항을 해결하려면 다음을 사용하십시오.
git checkout . --ours
저장소 변경 사항을 해결하거나, 또는
git checkout . --theirs
다른 저장소 또는 주 리포지토리에 유리한 변경 사항을 해결합니다.
할 은 GUI 입니다. 예를 들어 병합 도구는 다음과 같습니다.p4merge
git mergetool -t p4merge
파일을 저장하고 닫아야 하기 때문에 다음 파일이 열립니다.
다음 세 가지 단계가 있습니다.
명령으로 충돌을 일으키는 파일을 찾습니다.
git status
다음과 같이 표시된 충돌을 찾을 수 있는 파일을 확인합니다.
<<<<<<<<head blablabla
원하는 방법으로 변경한 후 명령으로 커밋합니다.
git add solved_conflicts_files git commit -m 'merge msg'
Git에서 병합 충돌을 수정하려면 다음 단계를 따르십시오.
Git 상태 확인: Git 상태
패치 세트 가져오기: git fetch (Git 커밋에서 올바른 패치를 체크)
로컬 브런치를 체크 아웃 합니다(여기 예에서는 temp1).git checkout - b temp1
마스터에서 최근 내용을 꺼냅니다: git pull --rebase origin master
mergetool을 시작하고 충돌을 확인하고 수정...리모트 브랜치의 변경을 현재의 브랜치로 체크합니다.git mergetool
상태를 다시 확인합니다: git status
mergetool에 의해 로컬로 작성된 불필요한 파일을 삭제합니다.보통 mergetool은 *.orig 확장자를 가진 추가 파일을 만듭니다.해당 파일은 복제 파일일 뿐이므로 삭제하고 로컬에서 변경 내용을 수정한 후 올바른 버전의 파일을 추가하십시오.git #your_files_correct_files 추가
상태를 다시 확인합니다: git status
변경을 동일한 커밋 ID로 커밋합니다(이것에 의해 새로운 개별 패치 세트가 회피됩니다).git commit -- amend
마스터 브랜치로 푸시: Git push (Git 저장소로)
Cool AJ86의 답변은 거의 모든 것을 요약하고 있다.같은 코드의 양쪽 브랜치에 변경이 있는 경우는, 수동으로 Marge 할 필요가 있습니다.텍스트 편집기에서 충돌하는 파일을 열면 다음과 같은 구조가 나타납니다.
(Code not in Conflict)
>>>>>>>>>>>
(first alternative for conflict starts here)
Multiple code lines here
===========
(second alternative for conflict starts here)
Multiple code lines here too
<<<<<<<<<<<
(Code not in conflict here)
등호 및 꺾쇠 괄호를 제거하면서 새 코드를 원하는 방식으로 대체 코드 또는 둘 중 하나를 선택합니다.
git commit -a -m "commit message"
git push origin master
다른 방법에서 자세히 설명한 것처럼 여러 가지 방법으로 병합 충돌을 수정할 수 있습니다.
진정한 열쇠는 로컬 및 리모트 저장소의 변경 흐름을 파악하는 것이라고 생각합니다.이를 위해서는 트래킹 브랜치를 이해하는 것이 중요합니다.추적 브랜치는 로컬, 실제 파일 디렉토리와 원본으로 정의된 리모트 사이에서 '중간 누락 부품'으로 생각됩니다.
나는 개인적으로 이것을 피하기 위해 두 가지 일을 하는 습관이 생겼다.
대신:
git add .
git commit -m"some msg"
여기에는 두 가지 단점이 있습니다.
신규되며, 될 수 있습니다.a ) 변변 / 변 changes a a a a a a a a a a a a a a a a a a a a a a a a 。
먼저 .b) 파일 목록을 확인할 수 없습니다.
대신, 다음과 같이 하겠습니다.
git add file,file2,file3...
git commit # Then type the files in the editor and save-quit.
이렇게 하면 어떤 파일이 추가될지 보다 신중하게 판단할 수 있을 뿐만 아니라 메시지의 에디터를 사용하여 목록을 검토하고 좀 더 생각할 수 있습니다., 「」가 , 풀, 됩니다.-m
★★★★★★ 。
[업데이트] - 시간이 경과함에 따라 다음 항목으로 전환했습니다.
git status # Make sure I know whats going on
git add .
git commit # Then use the editor
]
또, (그리고 당신의 상황과 더 관련이 있는) 저는 다음 사항을 피하려고 합니다.
git pull
또는
git pull origin master.
풀은 머지를 의미하며 로컬에서 머지를 원하지 않는 변경이 있을 경우 머지되지 말았어야 할 코드에 대한 머지 코드나 머지 충돌이 쉽게 발생할 수 있습니다.
대신 하려고 합니다.
git checkout master
git fetch
git rebase --hard origin/master # or whatever branch I want.
이것도 도움이 될 수 있습니다.
git branch, fork, fetch, merge, rebase 및 clone, 차이점은 무엇입니까?
test
로로 합니다.master
, 하다, 하다, 하다, 하다.
순서 1: 브랜치로 이동
git checkout test
순서 2:
git pull --rebase origin master
순서 3: 경합이 있는 경우는, 이러한 파일을 참조해 수정합니다.
순서 4: 이러한 변경을 추가합니다.
git add #your_changes_files
순서 5:
git rebase --continue
스텝 6: 경합이 해소되지 않으면 다시 스텝3으로 돌아갑니다경합이 없는 경우는, 다음의 순서에 따릅니다.
git push origin +test
스텝 7: 테스트와 마스터 간에 경합이 발생하지 않습니다.머지를 직접 사용할 수 있습니다.
「」를 사용합니다.patience
경합에 는, 「」를 합니다.patience
츠미야개별 회선이 아닌 블록 매칭을 시도합니다.
들어 전략은 인 Git과 할 수 .{
다른 기능에 속합니다.이것은, 에 의해서 회피하다patience
:
git merge -s recursive -X patience other-branch
매뉴얼에서 다음 항목을 참조하십시오.
With this option, merge-recursive spends a little extra time to avoid
mismerges that sometimes occur due to unimportant matching lines
(e.g., braces from distinct functions). Use this when the branches to
be merged have diverged wildly.
공통 조상과의 비교
Marge 경합이 있어 브랜치를 변경할 때 다른 사람의 생각을 알고 싶다면 브랜치를 (브랜치 대신) 공통의 상위 브랜치와 직접 비교하는 것이 더 쉬울 수 있습니다. 경우에는 '어울리지 않다'를 사용하면 .merge-base
:
git diff $(git merge-base <our-branch> <their-branch>) <their-branch>
일반적으로 특정 파일의 변경 내용만 볼 수 있습니다.
git diff $(git merge-base <our-branch> <their-branch>) <their-branch> <file>
git log --merge -p [[--] path]
, , 브랜치간에 커밋은, 「」, 「」, 「2」, 「2」를 사용하고 있는 합니다.이러한 커밋은, 사용중에서도 발생합니다.--
명령을 사용하여 경로를 분리합니다.
이 문제를 회피하기 위해 해야 할 일은 두 개의 명령줄을 열어 한 번에 실행하는 것입니다.
git log ..$MERGED_IN_BRANCH --pretty=full -p [path]
그리고 다른 쪽에서는
git log $MERGED_IN_BRANCH.. --pretty=full -p [path]
<고객명>의 치환$MERGED_IN_BRANCH
및 가 with with with with with with the the the the the the the the the 。[path]
이치노(「」(「」) 사이의 모든을 패치합니다...
의 커밋 2개의 커밋이 있습니다.에서와 같이 으로 will은은은은은은은은은은은은은은은은은은은은은은은은은은은은은은이 사용됩니다.HEAD
('Marge'는 'Marge' 'Marge' ('Marge')
이렇게 하면 분기된 후 두 분기의 파일에 어떤 커밋이 들어갔는지 확인할 수 있습니다.그것은 보통 갈등을 해결하는 것을 훨씬 더 쉽게 만든다.
2016년 12월 12일 현재 github.com에서 지점 통합 및 경합 해결이 가능합니다.
따라서 오래된 답변에서 제공되는 명령줄이나 서드파티 툴을 사용하지 않으려면 GitHub의 네이티브 툴을 사용하십시오.
이 블로그 투고에서는 상세하게 설명하고 있습니다만, 기본적인 것은 UI를 사용해 2개의 브런치를 「머지」하면, 이러한 머지 경합을 처리할 수 있는 에디터로 이동하는 「경합 해결」옵션이 표시됩니다.
병합 충돌은 다음과 같은 다양한 상황에서 발생할 수 있습니다.
- " " 를 실행하고
git fetch
다음에 또 한 번.git merge
- " " 를 실행하고
git fetch
다음에 또 한 번.git rebase
- " " 를 실행하고
git pull
중 (상기 조건 중 와 동일) - " " 를 실행하고
git stash pop
- git 패치를 적용하는 경우(예를 들어 이메일로 전송할 파일로 내보내는 커밋)
충돌을 해결하려면 Git과 호환되는 Merge Tool을 설치해야 합니다.저는 개인적으로 KDiff3를 사용하고 있는데 편리하고 좋았습니다.여기서 Windows 버전을 다운로드할 수 있습니다.
https://sourceforge.net/projects/kdiff3/files/
그나저나 Git Extensions를 설치하면 Kdiff3를 설치하는 옵션이 셋업 마법사에 있습니다.
그런 다음 KDiff3를 mergetool로 사용하도록 Git 구성을 설정합니다.
$ git config --global --add merge.tool kdiff3
$ git config --global --add mergetool.kdiff3.path "C:/Program Files/KDiff3/kdiff3.exe"
$ git config --global --add mergetool.kdiff3.trustExitCode false
$ git config --global --add diff.guitool kdiff3
$ git config --global --add difftool.kdiff3.path "C:/Program Files/KDiff3/kdiff3.exe"
$ git config --global --add difftool.kdiff3.trustExitCode false
(경로를 KDiff3 EXE 파일의 실제 경로로 바꾸는 것을 잊지 마십시오).
그 후 Marge 경합이 발생할 때마다 다음 명령어만 실행하면 됩니다.
$ git mergetool
그런 다음 Kdiff3를 열고 먼저 병합 충돌을 자동으로 해결하려고 합니다.대부분의 충돌은 자동으로 해결되며 나머지는 수동으로 수정해야 합니다.
Kdiff3의 외관은 다음과 같습니다.
그런 다음 파일을 저장하면 충돌과 함께 다음 파일로 이동하고 모든 충돌이 해결될 때까지 동일한 작업을 다시 수행합니다.
모든 것이 정상적으로 병합되었는지 확인하려면 mergetool 명령을 다시 실행하십시오.다음과 같은 결과가 나타납니다.
$ git mergetool
No files need merging
저는 충돌을 피하기 위해 항상 아래 단계를 따릅니다.
git checkout master
브랜치로 ) ('마스터 브랜치로 와주세요)git pull
.) (마스터 업데이트)git checkout -b mybranch
(새로운 브런치를 체크하고 그 브런치에서 작업을 시작하여 마스터가 항상 트렁크 상단에 있도록 합니다).git add .
...git commit
Andgit 푸시(변경 후 로컬브런치)git checkout master
)
같은 작업을 수의 로컬 할 수 , 동시에 할 수 .git checkout
필요한 경우 언제든지 지사로 연락하십시오.
는 했지만, 'Merge conflict'의 git diff
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
git diff
++<<<<<<< HEAD
+ display full last name boolean in star table
++=======
+ users viewer.id/star.id, and conversation uses user.id
+
++>>>>>>> feat/rspec-tests-for-cancancan
하지만 여기 도움이 된 것이 있습니다.
와 사이의 모든 것은 1개의 파일에 포함되어 있습니다.
★★★★★★★★★★★★★★★★★★★★★★★ 의 모든 것
=======
★★★★★★★★★★★★★★★★★」>>>>>>>
것, 말 을 열고, 그 ), 「Marge」는 「Marge」의 「Marge」의 「Marge」의 「Marge」의 「Marge」의 「Marge」의 「Marge」의 「Marge」의 「Marge」의 「Marge」의 「Marge」의 「Marge」의 「Marge」의 「Marge」(Marge」의 「Marge」의 「Marge」의 「Marge」의 어느쪽
merge
가 해결되었다★★★★★★★★★★★★★★★★★★!
Visual Studio 코드용 GitLens
GitLens for Visual Studio Code를 사용해 보세요.주요 기능은 다음과 같습니다.
3. 경합을 쉽게 해결하다
이 기능은 이미 마음에 듭니다.
2. 현재 회선 문제
3. 시궁창 탓
4. 상태 바 비난
그리고 많은 특징들이 있습니다.여기에서 확인하실 수 있습니다.
이 답변은 저처럼 에디터 내에서 모든 작업을 수행하는 Vim 사용자를 위한 대안을 추가하는 것입니다.
TL;DR
Tpope는 Vim을 위해 탈주자라는 훌륭한 플러그인을 생각해냈다.설치가 완료되면:Gstatus
이 있는 파일 및 「경합」이을 합니다.:Gdiff
Git 3 자 자 자 git git git git git git git git git 。
3자 결합이 완료되면 runbean을 사용하면 다음과 같은 방법으로 결합하는 브랜치의 변경을 얻을 수 있습니다.
:diffget //2
, 원래의 (HEAD) 브랜치에서 변경을 취득합니다.:diffget //3
, 머지 브랜치에서 변경을 가져옵니다.
되면 파일음음음음음음음음음음음음음 once once 라고 입력합니다.:Gwrite
를 지정합니다.
Vimcasts는 이러한 단계를 자세히 설명하는 훌륭한 비디오를 공개했습니다.
Microsoft의 Visual Studio 코드를 사용하여 충돌을 해결합니다.그것은 매우 사용하기 쉽다.저는 작업 공간에서 프로젝트를 열어 둡니다.충돌을 감지하고 강조 표시합니다.또한 HEAD 또는 착신 중 원하는 변경을 선택할 수 있는 GUI 옵션이 제공됩니다.
git fetch <br>
git checkout **your branch**<br>
git rebase master<br>
이 순서에서는, 우선하는 IDE 를 사용해 경합을 해결합니다.
이 링크를 클릭하면 파일의 충돌을 해결하는 방법을 확인할 수 있습니다.
git add<br>
git rebase --continue<br>
git commit --amend<br>
git push origin HEAD:refs/drafts/master (push like a drafts)<br>
이제 모든 것이 좋아졌고 당신은 게릿에서 당신의 약속을 찾을 수 있을 것이다.
편집을 위해 Visual Studio 코드를 사용해 보십시오(아직 편집하지 않은 경우).
병합을 시도하고 병합 충돌에 도달하면 Visual Studio 코드가 병합 충돌을 자동으로 감지합니다.
이나, '원문 변경 ', '원문 변경 내용', '원문 변경 내용', '원문 변경 내용', '원문 변경 내용', '원문 변경 내용', '원문 변경 내용', '원문 변경 내용'을 들여야 할 이 될 수 .incoming
or or or openicle.
current change
( ( ( (전 ( ( ( ( 。
나한테도 도움이 됐고 너도 도움이 될 수 있어!
PS: Git에 코드와 Visual Studio 코드를 설정한 경우에만 동작합니다.
충돌을 해결하는 보다 안전한 방법은 git-mediate를 사용하는 것입니다(여기서 제안하는 일반적인 솔루션은 매우 오류가 발생하기 쉬운 imho입니다).
사용 방법에 대한 간단한 소개는 이 게시물을 참조하십시오.
Visual Studio (저의 경우 Visual Studio 2015)를 이용하시는 분들을 위해
Visual Studio에서 프로젝트를 닫습니다.특히 큰 프로젝트에서는 UI를 사용하여 Marge할 때 Visual Studio가 당황하는 경향이 있습니다.
명령 프롬프트에서 마지를 수행합니다.
git체크아웃타겟_targets
git merge source_marge
그런 다음 Visual Studio에서 프로젝트를 열고 Team Explorer → Branch로 이동합니다.이제 Merge is pending(머지 보류 중)이라는 메시지가 나타나고 메시지 바로 아래에 충돌하는 파일이 나열됩니다.
충돌하는 파일을 클릭하면 병합, 비교, 원본 가져오기 및 대상 가져오기 옵션이 나타납니다.Visual Studio의 병합 도구는 매우 사용하기 쉽습니다.
언급URL : https://stackoverflow.com/questions/161813/how-do-i-resolve-merge-conflicts-in-a-git-repository
'source' 카테고리의 다른 글
NAMED 콘텐츠를 사용하여 WPF UserControl을 작성하는 방법 (0) | 2023.04.11 |
---|---|
WPF가 현재 설계 모드로 실행되고 있는지 여부를 확인할 수 있는 방법이 있습니까? (0) | 2023.04.11 |
제목 변경 시 원치 않는 UIButton 애니메이션을 중지하는 방법 (0) | 2023.04.11 |
SQL Server "텍스트" 데이터 유형의 WHERE 절 (0) | 2023.04.11 |
연속 스트림을 '그립'하는 방법 (0) | 2023.04.11 |