ABDiff 도움말

Git Diff / Merge 워크플로

Git은 자체 내부 알고리즘을 사용하여 차이점, 병합 및 리베이스를 수행합니다. 이러한 작업은 결정론적이며 완전히 자동화되어 있습니다: Git은 외부 도구에 의존하지 않습니다.

하지만 인간의 판단이 요구되는 상황도 있습니다. 예를 들어, 변경을 텍스트가 아니라 시각적 또는 의미적으로 평가해야 할 때. 그러한 경우에는 Git이 외부 도구를 호출하여 검사를 지원할 수 있으며, 의사결정은 지원하지 않습니다.

macOS에서 흔히 볼 수 있는 예는 FileMerge.app이며, 이는 Xcode 명령줄 도구와 함께 설치되고 Git에서 diff 또는 병합 도우미로 실행할 수 있습니다.

Merge

Git이 브랜치를 병합하고 변경 사항을 조정할 수 없을 경우, 충돌이 발생한 모든 파일에 충돌 마커를 기록한 뒤 병합을 중단하고 사용자에게 알립니다. 충돌 마커가 있는 각 파일에 대해 Git 인덱스에 세 단계가 기록됩니다: common ours와 theirs. 이 시점에서 리포지토리는 conflicted merge 상태에 있으며 Git은 모든 충돌이 해결되기를 기다리고 있습니다.

충돌된 파일 File.swift이 생성되는 파일

충돌을 수동으로 해결하려면 파일을 편집하십시오:

  1. 파일을 편집기에서 열고 충돌 마커를 제거하십시오.
  2. 해결된 파일을 git add 로 스테이징하십시오.

외부 도구에서 충돌을 해결하려면 실행:

git mergetool

git mergetool는 충돌된 파일마다 도구를 한 번 실행하고, BASE, ours, theirs 및 병합 결과 경로를 도구에 전달합니다. Git은 다음 파일을 실행하기 전에 도구가 종료될 때까지 기다립니다. 각 파일에 대한 애플리케이션의 종료 코드는 해당 파일이 해결된 것으로 표시되었는지 여부를 결정합니다. 또한 git add <file>을 명시적으로 실행하여 스테이징된 것으로 표시할 수 있는 옵션도 있습니다.

여러 개의 병합 도구가 구성된 경우, Git은 이 목록에서 찾은 첫 번째 도구를 선택합니다:

  1. merge.tool 구성.
  2. $GIT_MERGE_TOOL 환경 변수.
  3. 알려진 설치된 도구에서 자동 감지.

외부 도구 호출

각 충돌 파일 Example.swift에 대해 Git은 여기 표시된 추가 파일을 생성합니다:

Example_BACKUP_70842.swift
Example_BASE_70842.swift
Example_LOCAL_70842.swift
Example_REMOTE_70842.swift
Example.swift

각 호출마다 접미사 번호가 변경됩니다. 그런 다음, Git 통합에서 본 대로 구성된 명령으로 도구를 호출합니다. abd에 대한 명령은

abd --base Example_BASE_70842.swift --local Example_LOCAL_70842.swift --remote Example_REMOTE_70842.swift --result Example.swift

이 도구는 충돌 마커를 제거하고 정상적으로 종료하도록 되어 있습니다. 이는 갈등이 해결되었음을 나타냅니다.

Diff

차이를 위해 외부 도구는 시각 검사를 위해서만 유용합니다. Git은 애플리케이션이 종료될 때 반환 코드를 무시합니다. git difftool를 호출하면 Git이 변경된 파일들을 열거하고 각 파일 쌍에 대한 외부 도구를 실행합니다.

보통은 비교하려는 파일을 끌어다 놓는 것이 더 좋습니다. 하지만 모든 것을 비교하고 싶다면 git difftool을 실행하십시오. 호출된 외부 도구는 이 목록에서 처음 찾은 도구입니다:

  1. diff.tool 구성.
  2. $GIT_DIFF_TOOL 환경 변수.
  3. $PATH의 알려진 도구에서 자동 감지.
  4. vimdiff으로 대체합니다.