Git Diff / Merge 워크플로
Git은 자체 내부 알고리즘을 사용하여 차이점, 병합 및 리베이스를 수행합니다. 이러한 작업은 결정론적이며 완전히 자동화되어 있습니다: Git은 외부 도구에 의존하지 않습니다.
하지만 인간의 판단이 요구되는 상황도 있습니다. 예를 들어, 변경을 텍스트가 아니라 시각적 또는 의미적으로 평가해야 할 때. 그러한 경우에는 Git이 외부 도구를 호출하여 검사를 지원할 수 있으며, 의사결정은 지원하지 않습니다.
macOS에서 흔히 볼 수 있는 예는 FileMerge.app이며, 이는 Xcode 명령줄 도구와 함께 설치되고 Git에서 diff 또는 병합 도우미로 실행할 수 있습니다.
Merge
Git이 브랜치를 병합하고 변경 사항을 조정할 수 없을 경우, 충돌이 발생한 모든 파일에 충돌 마커를 기록한 뒤 병합을 중단하고 사용자에게 알립니다. 충돌 마커가 있는 각 파일에 대해 Git 인덱스에 세 단계가 기록됩니다: common ours와 theirs. 이 시점에서 리포지토리는 conflicted merge 상태에 있으며 Git은 모든 충돌이 해결되기를 기다리고 있습니다.
충돌된 파일 File.swift이 생성되는 파일
충돌을 수동으로 해결하려면 파일을 편집하십시오:
- 파일을 편집기에서 열고 충돌 마커를 제거하십시오.
- 해결된 파일을
git add로 스테이징하십시오.
외부 도구에서 충돌을 해결하려면 실행:
git mergetoolgit mergetool는 충돌된 파일마다 도구를 한 번 실행하고,
BASE, ours, theirs 및 병합 결과 경로를 도구에 전달합니다. Git은 다음
파일을 실행하기 전에 도구가 종료될 때까지 기다립니다. 각 파일에 대한
애플리케이션의 종료 코드는 해당 파일이 해결된 것으로 표시되었는지 여부를
결정합니다. 또한 git add <file>을 명시적으로 실행하여
스테이징된 것으로 표시할 수 있는 옵션도 있습니다.
여러 개의 병합 도구가 구성된 경우, Git은 이 목록에서 찾은 첫 번째 도구를 선택합니다:
merge.tool구성.$GIT_MERGE_TOOL환경 변수.- 알려진 설치된 도구에서 자동 감지.
외부 도구 호출
각 충돌 파일 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을 실행하십시오. 호출된
외부 도구는 이 목록에서 처음 찾은 도구입니다:
diff.tool구성.$GIT_DIFF_TOOL환경 변수.$PATH의 알려진 도구에서 자동 감지.vimdiff으로 대체합니다.