programing

비트 병합 충돌을 해결하기 위해 vimdiff를 어떻게 사용합니까?

powerit 2023. 7. 2. 21:03
반응형

비트 병합 충돌을 해결하기 위해 vimdiff를 어떻게 사용합니까?

방금 내 마스터 깃에 브랜치를 병합했고, 나는.Automatic merge failed; fix conflicts and then commit the result.나는 뛰었습니다.git mergetool그리고 vimdiff는 아래 이미지와 함께 열립니다.저는 vimdiff를 어떻게 사용하는지 모릅니다.여기서 각 패널은 무엇을 의미하며 병합 충돌을 해결하려면 어떻게 해야 합니까?

enter image description here

네 개의 버퍼는 모두 동일한 파일의 다른 보기를 제공합니다.왼쪽 상단 버퍼(LOCAL)는 대상 분기(결합할 대상)에서 파일이 어떻게 보였는지를 나타냅니다.오른쪽 상단 버퍼(REMOTE)는 병합할 원본 분기에서 파일이 표시된 방식입니다.중간 버퍼(BASE)는 두 버전의 공통 조상입니다(왼쪽 및 오른쪽 버전이 서로 어떻게 분리되었는지 비교할 수 있습니다).

제가 다음 사항을 잘못 알고 있을 수도 있습니다.병합 충돌의 원인은 BASE 이후 두 파일 모두 파일의 동일한 부분을 변경했기 때문이라고 생각합니다. LOCAL은 따옴표를 더블에서 싱글로 변경했고 REMOTE는 배경 값을 컬러에서 URL로 변경했습니다.(Merge는 LOCAL의 모든 변경 사항이 REMOTE에도 있다는 것을 알아차릴 만큼 똑똑하지 않다고 생각합니다. LOCAL이 REMOTE와 동일한 위치에서 BASE 이후로 변경되었다는 것만 알고 있습니다.)

맨 아래 버퍼에는 실제로 편집할 수 있는 파일(작업 디렉토리에 있는 파일)이 들어 있습니다.할 수 .vim에서는 자동 병합에서 처리할 수 없는 각 상위 보기와 어떻게 다른지 보여 줍니다.원격 변경을 원하지 않는 경우 LOCAL에서 변경사항을 가져옵니다.LOCAL 변경사항보다 REMOTE에서 변경사항을 가져오려면 해당 변경사항을 끌어옵니다.REMOTE와 LOCAL이 모두 잘못되었다고 생각되는 경우 BASE에서 끌어옵니다.더 좋은 생각이 있다면 완전히 다른 것을 해보세요!결국 여기서 수행하는 변경 사항은 실제로 적용될 변경 사항입니다.

@chefner의 답변은 훌륭합니다. 질문의 "합병 충돌을 해결하려면 어떻게 진행해야 합니까?" 부분에 대한 자세한 내용을 추가하고 싶습니다.이 경우 실제로 vimdiff를 사용하는 방법을 알아보면 아래와 같습니다.


먼저, "모든 것 중단" 옵션을 다루려면 - "vimdiff"를 사용하지 않고 병합을 중단하려면: 를 누릅니다.:qa!를 누릅니다(Vim 편집기를 종료하려면 어떻게 해야 합니까? 참조).병합이 완료되었는지 여부를 묻는 메시지가 표시됩니다.n.


vimdiff를 사용하려면 몇 가지 유용한 바로 가기를 사용합니다.여기에서는 Vim(탐색 및 삽입/일반 모드)의 기본 사항을 알고 있다고 가정합니다.

  • 하단 버퍼로 이동합니다(결과 표시).Ctrl-W j
  • /;k를 사용하여 다음 디프로 이동하거나 및 를c 사용하여c 각각 다음 디프와 이전 디프로 이동합니다.
  • 더 많은 컨텍스트를 보려면 폴더에서 사용합니다o.
  • 각 디프에 대해, @chepner의 답변에 따르면, 로컬, 원격 또는 기본 버전에서 코드를 가져오거나, 편집하여 적합한 대로 다시 실행할 수 있습니다.
    • 버전에서 로컬버서면사용려가를 사용합니다.:diffget LO
    • 원에서::diffget RE
    • 베스에서::diffget BA
    • 또는 직접 코드를 편집하려면 먼저 로컬/원격/베이스에서 버전을 가져온 다음 삽입 모드로 이동하여 나머지를 편집합니다.
  • 완료되면 병합 합니다.:wqa
  • 일반적으로 Git는 병합이 수행된 것을 감지하고 병합 커밋을 만듭니다.

복사 붙여넣기 또는 사용자 지정 바로 가기 없이 로컬 및 원격 충돌 헝크를 모두 추가하는 것은 불가능한 것 같습니다. https://vi.stackexchange.com/questions/10534/is-there-a-way-to-take-both-when-using-vim-as-merge-tool 은 add add가 일반적인 충돌 유형이기 때문에 유감입니다.

키를 을 방지하기 , 의 vimdiff에 Enter 키를 하세요..vimrc:

set shortmess=Ot

https://vi.stackexchange.com/questions/771/how-can-i-suppress-the-press-enter-prompt-when-opening-files-in-diff-mode 에서 언급한 바와 같이

인터넷에서 다른 vimdiff 바로 가기를 검색할 수 있습니다.저는 이것이 유용하다는 것을 알았습니다: https://gist.github.com/hyamamoto/7783966 .

vimdiff를 대체할 최고의 병합 도구

이것은 일종의 모욕적인 말이지만, 이것은 제가 vimdiff를 시도한 후에 결국 바이머로 수렴하게 된 것입니다.

병합 충돌을 해결하려면 다음을 확인해야 합니다.

  • 원격의
  • 현지의
  • 두 가지 차이:
    • 디프베이스 원격
    • 디프베이스 로컬

그리고 나서 두 가지를 모두 합치려고 노력합니다.

vimdiff는 화면에 BASE, LOCAL 및 REMOTE를 표시합니다.

    +--------------------------------+
    | LOCAL  |     BASE     | REMOTE |
    +--------------------------------+
    |             MERGED             |
    +--------------------------------+

오른쪽 왼쪽 왼쪽을 여러 번 보는 것 외에 제가 필요로 하는 두 가지 차이점을 어떻게 명확하게 보여줄 수 있는지 모르겠습니다.

게다가 LOCAL과 REMOTE는 이미 Git merge 충돌 마커에 표시되어 있으므로 다시 표시하는 도구로는 그렇게 많은 것을 얻을 수 없습니다.

따라서, 저는 대신 제가 놓친 어려움을 실제로 보여주는 작은 "디프 툴"을 만들었습니다.

~/빈/시로산 틸리머지 도구

#!/usr/bin/env bash
BASE="$1"
LOCAL="$2"
REMOTE="$3"
diff --color -u "$BASE" "$LOCAL"
diff --color -u "$BASE" "$REMOTE"
exit 1

GitHub 업스트림.

다음과 함께 설치합니다.

git config --global mergetool.cirosantilli-mergetool.cmd 'cirosantilli-mergetool $BASE $LOCAL $REMOTE'
git config --global mergetool.cirosantilli-mergetool.trustExitCode true
# If you want this to become your default mergetool.
#git config --global merge.tool 'cirosantilli-mergetool'

이제, 당신이 할 때:

git mergetool -t cirosantilli-mergetool

터미널에서 원하는 두 가지 차이점을 보여줍니다. 예를 들어 다음과 같습니다.

--- ./src/dev/arm/RealView_BASE_15560.py        2019-12-27 13:46:41.967021591 +0000
+++ ./src/dev/arm/RealView_LOCAL_15560.py       2019-12-27 13:46:41.979021479 +0000
@@ -994,7 +994,7 @@                                                              
                                       
     def setupBootLoader(self, cur_sys, loc):
         if not cur_sys.boot_loader:                           
-            cur_sys.boot_loader = [ loc('boot_emm.arm64'), loc('boot_emm.arm') ]
+            cur_sys.boot_loader = [ loc('boot.arm64'), loc('boot.arm') ]
         cur_sys.atags_addr = 0x8000000                  
         cur_sys.load_offset = 0x80000000                    

@@ -1054,7 +1054,7 @@                                           
             ]                                                     
                       
     def setupBootLoader(self, cur_sys, loc):
-        cur_sys.boot_loader = [ loc('boot_emm_v2.arm64') ]
+        cur_sys.boot_loader = [ loc('boot_v2.arm64') ]
         super(VExpress_GEM5_V2_Base,self).setupBootLoader(
                 cur_sys, loc)                             
                                                           
--- ./src/dev/arm/RealView_BASE_15560.py        2019-12-27 13:46:41.967021591 +0000
+++ ./src/dev/arm/RealView_REMOTE_15560.py      2019-12-27 13:46:41.991021366 +0000
@@ -610,10 +610,10 @@           
     def attachIO(self, *args, **kwargs):              
         self._attach_io(self._off_chip_devices(), *args, **kwargs)
                                      
-    def setupBootLoader(self, cur_sys, loc):
-        cur_sys.boot_loader = loc('boot.arm') 
-        cur_sys.atags_addr = 0x100                           
-        cur_sys.load_offset = 0       
+    def setupBootLoader(self, cur_sys, boot_loader, atags_addr, load_offset):
+        cur_sys.boot_loader = boot_loader      
+        cur_sys.atags_addr = atags_addr     
+        cur_sys.load_offset = load_offset

여기 두 개의 디프가 터미널에 버려져 있는 것을 볼 수 있습니다.

  • RealView_BASE_15560.pyRealView_LOCAL_15560.py
  • RealView_BASE_15560.pyRealView_REMOTE_15560.py

차이가 크다면, 저는 그냥 제 tmux 초능력으로 검색해보겠습니다.

TODO: 너바나를 달성하기 위해 마지막으로 남은 것은 갈등을 겪고 있는 건달들에게만 어려움을 보여주는 방법일 것입니다.왜냐하면 차이는 크지만 작은 덩어리만 충돌하면 찾기가 귀찮기 때문입니다.

예, vimdiff에서 제공하는 바로 가기가 몇 개 손실되지만 일반적으로 충돌을 해결하려면 두 버전 모두에서 신중하게 복사 붙여넣기가 필요합니다. Git 충돌 마커가 있는 일반 vim 세션 내에서 이 작업을 수행할 수 있습니다.

파일을 관찰하고 분산하는 동안vimdiff실행 중

앉아서 완벽한 설정을 자동화하기 전에cirosantilli-mergetool이것이 제가 필요로 하는 두 가지 어려움을 해결하기 위해 제가 하고 있던 일입니다.

하는 동안에git mergetool실행 중vimdiff파일에 충돌이 있는 경우, 예를 들어,main.pygit는 각 버전에 대해 다음과 같은 이름의 파일을 생성합니다.

main_BASE_1367.py
main_LOCAL_1367.py
main_REMOTE_1367.py

와 같은 디렉토리에main.py어디에1367Git merge 도구의 PID는 다음에서 언급한 대로 "임의" 정수입니다. Git merge 충돌에서 생성되는 BACKUP, BASE, LOCAL REMOTE 파일은 무엇입니까?

제가된 파일 중에 그서내가원차보위기먼찾파다습니생일을성된저가 있는 파일을 .git status그런 다음 새 터미널을 열고 파일 쌍 간에 vimdiff를 수행합니다.

vim -d main_BASE_1367.py main_LOCAL_1367.py
vim -d main_BASE_1367.py main_REMOTE_1367.py

git mergetool이 정보는 많은 사람들이 무슨 일이 일어나고 있는지 빠르게 파악하는 데 도움이 됩니다!

또한 병합 도구가 실행되는 동안에도 파일을 열기만 하면 됩니다.

vim main.py

더 큰 편집기 창이 있으면 더 쉬울 것 같으면 직접 편집하십시오.

충돌 병합으로 직접 이동

하는 동안에]c내부의 항상 이 있는 것은 .vimdiff 파일의 diff 파일입니다. 항상 병합 충돌이 있는 것은 아닙니다.

이것을 돕기 위해, 나는 내 안에 있습니다.~/.vimrc:

# Git Merge conflict
nnoremap <leader>gm /\v^\<\<\<\<\<\<\< \|\=\=\=\=\=\=\=$\|\>\>\>\>\>\>\> /<cr>

충돌을 직접 찾을 수 있습니다.

활기를 띠다

아마도 가장 좋은 옵션은 vimdiff 사용을 포기하고 다음에서 언급한 일반 vim + gitmerge에 의존하는 것입니다: 어떤 Git 커밋이 충돌을 유발하는지 어떻게 알 수 있습니까?vimdiff의 학습 곡선은 성가시고, 우리가 가장 필요로 하는 기능을 하지 않기 때문입니다.

언급URL : https://stackoverflow.com/questions/14904644/how-do-i-use-vimdiff-to-resolve-a-git-merge-conflict

반응형