Wednesday 21 February 2018

힘내 합치기 전략 재귀 실패


재귀 적 전략과 병합하지 못했습니다.
App Store를 통해 가져 오기 우리의 응용 프로그램 에서이 게시물을 읽으십시오!
변경 사항을 사용하여 체리 피크 선택 충돌을 해결하려면 어떻게합니까?
나의 git cherry-pick FOO는 갈등을 일으켰습니다.
충돌하는 파일을 살펴보고 & lt; & lt; & lt; & lt; & lt; & lt; & lt; 그리고 =======, 그리고 충돌 마커 자체가 있지만, 나는 쉬운 방법이 있기를 바라고 있습니다.
나는 svn 동등 물이 해결하기 위하여 그들의 충돌을 선택하고 있었다고 생각한다.
어떻게해야합니까?
나는 자식 체크 아웃을 원하지 않는다 - 그 & lt; 파일 & gt; git checkout foo & lt; file & gt;와 동일한 결과를 생성하는 것처럼 보입니다. git diff FOO 대신에.
먼저 체리 피크를 취소하고 실행하십시오.
둘째, 체리 피크를 시도해보십시오. 그러나 이번에는 자신의 변화가 아니라 자신의 변화를 얻습니다.

재귀 적 전략과 병합하지 못했습니다.
git-merge - 두 개 이상의 개발 기록을 함께 결합합니다.
기술.
이것은 여러 병합 전략 스크립트를 구동하는 병합 기계에 대한 최상위 인터페이스입니다.
두 번째 구문 (& lt; msg & gt; HEAD & lt; remote & gt;)은 역사적인 이유로 지원됩니다. 명령 줄이나 새 스크립트에서 사용하지 마십시오. git merge - m & lt; msg & gt;와 동일합니다. & lt; 리모컨 & gt; .
병합이 끝나면 diffstat를 표시합니다. diffstat도 구성 옵션 merge. stat에 의해 제어됩니다.
병합이 끝나면 diffstat를 표시하지 마십시오.
--stat와 --no-stat의 동의어; 이것들은 더 이상 사용되지 않으며 앞으로 제거 될 것입니다.
분기 이름 외에도 병합중인 실제 커밋의 한 줄 설명으로 로그 메시지를 채 웁니다.
병합중인 실제 커밋의 한 줄 설명을 나열하지 마십시오.
병합을 수행하지만 병합을 실패한 것으로 가정하고 자동 커밋하지 않아 사용자가 커밋하기 전에 병합 결과를 검사하고 추가 조정할 기회를 제공합니다.
병합을 수행하고 결과를 커밋하십시오. 이 옵션을 사용하여 --no-commit을 대체 할 수 있습니다.
실제 머지가 일어난 것처럼 작업 트리와 인덱스 상태를 생성하지만 HEAD를 실제로 커밋하거나 이동시키지 말고 $ GIT_DIR / MERGE_HEAD를 기록하여 다음 git commit 명령으로 병합 커밋을 생성하지 마십시오. 이렇게하면 다른 브랜치 (또는 문어의 경우 더 많이)를 병합하는 것과 동일한 효과를 가지는 현재 브랜치의 맨 위에 단일 커밋을 생성 할 수 있습니다.
병합을 수행하고 결과를 커밋하십시오. 이 옵션은 --squash를 무시하는 데 사용할 수 있습니다.
병합이 빨리 감기로 해결 된 경우에도 병합 커밋을 생성하십시오.
병합이 빨리 감기로 해결 된 경우 병합 커밋을 생성하지 않고 분기 포인터 만 업데이트합니다. 이것은 git-merge의 기본 동작입니다.
-s & lt; strategy & gt; --strategy = & lt; strategy & gt;
주어진 병합 전략을 사용하십시오. 시도해야하는 순서대로 지정하기 위해 두 번 이상 제공 할 수 있습니다. - s 옵션이 없으면 빌트인 전략 목록이 대신 사용됩니다 (단일 헤드를 병합 할 때 git-merge-recursive, 그렇지 않으면 git-merge-octopus).
병합 커밋에 사용될 커밋 메시지 (생성 된 경우). git-fmt-merge-msg 스크립트는 자동화 된 git-merge 호출에 좋은 기본값을 제공하는 데 사용될 수 있습니다.
다른 지점 머리가 지점으로 합류했습니다. 적어도 하나의 & lt; remote & gt;가 필요합니다. 둘 이상의 & lt; remote & gt; 지정 분명히 당신이 문어를 시험하고 있다는 것을 의미합니다.
병합 전략.
이렇게하면 3 방향 병합 알고리즘을 사용하여 두 개의 헤드 (즉, 현재 브랜치와 다른 브랜치) 만 해결할 수 있습니다. 그것은 십자가 병합 모호성을 신중하게 탐지하려고 시도하며 일반적으로 안전하고 빠른 것으로 간주됩니다.
이 방법은 3 방향 병합 알고리즘을 사용하는 두 개의 헤드 만 해결할 수 있습니다. 3 방향 병합에 사용할 수있는 공통 조상이 둘 이상이면 공통 조상의 병합 된 트리를 만들어이를 3 방향 병합을위한 참조 트리로 사용합니다. 이는 Linux 2.6 커널 개발 기록에서 가져온 실제 병합 커밋에 대한 테스트를 통해 잘못된 병합을 일으키지 않고 병합 충돌이 줄어들 었다고보고되었습니다. 또한 이름 변경과 관련된 병합을 감지하고 처리 할 수 ​​있습니다. 하나의 분기를 가져 오거나 병합 할 때 기본 병합 전략입니다.
이 경우 두 개 이상의 경우를 해결하지만 수동으로 해결해야하는 복잡한 병합은 거부합니다. 주제 머리말을 함께 묶는 데 주로 사용됩니다. 두 개 이상의 분기를 가져 오거나 병합 할 때 기본 병합 전략입니다.
이렇게하면 여러 개의 머리가 처리되지만 병합 결과는 항상 현재 분기 머리입니다. 그것은 사이드 브랜치의 오래된 개발 이력을 대체하기 위해 사용됩니다.
이는 수정 된 재귀 적 전략입니다. 나무 A와 B를 병합 할 때 B가 A의 하위 트리에 해당하면 B는 먼저 같은 레벨의 나무를 읽지 않고 A의 트리 구조와 일치하도록 조정됩니다. 이 조정은 공통 조상 트리에서도 수행됩니다.
복잡한 충돌을 일으키고 다시 시작하려는 병합을 시도했다면 git-reset [1]을 사용하여 복구 할 수 있습니다.
구성.
ORIG_HEAD 사이의 diffstat 레코드를 인쇄하고 병합이 끝날 때 결과를 병합할지 여부. 기본값은 True입니다.
병합 된 커밋 요약을 새로 생성 된 병합 커밋 메시지에 포함할지 여부. 기본값은 False입니다.
병합 중에 이름 바꾸기 검색을 수행 할 때 고려해야 할 파일 수. 지정하지 않으면 diff. renameLimit 값이 기본값으로 사용됩니다.
git-mergetool [1]에 의해 병합 된 해상도 프로그램을 제어합니다. 유효한 기본 제공 값은 "kdiff3", "tkdiff", "meld", "xxdiff", "emerge", "vimdiff", "gvimdiff"및 "opendiff"입니다. 다른 값은 사용자 지정 병합 도구로 처리되며 해당하는 mergetool. 재귀 적 병합 전략에 의해 표시되는 출력의 양을 제어합니다. 레벨 0은 충돌이 감지되면 최종 오류 메시지를 제외하고는 아무 것도 출력하지 않습니다. 레벨 1은 충돌 만 출력하고, 출력 충돌은 2 개, 파일 변경은 2 개입니다. 레벨 5 이상은 디버깅 정보를 출력합니다. 기본값은 2입니다. GIT_MERGE_VERBOSITY 환경 변수로 재정의 할 수 있습니다.
사용자 지정 저수준 병합 드라이버에 대해 사람이 읽을 수있는 이름을 정의합니다. 자세한 내용은 gitattributes [5]를 참조하십시오.
사용자 지정 저수준 병합 드라이버를 구현하는 명령을 정의합니다. 자세한 내용은 gitattributes [5]를 참조하십시오.
공통 조상간에 내부 병합을 수행 할 때 사용할 저수준 병합 드라이버를 명명합니다. 자세한 내용은 gitattributes [5]를 참조하십시오.
& lt; name & gt; 분기로 병합하기위한 기본 옵션을 설정합니다. 구문과 지원되는 옵션은 git-merge의 옵션과 동일하지만 현재 공백 문자가 포함 된 옵션 값은 지원되지 않습니다.
병합 방법.
병합은 항상 현재 HEAD와 하나 이상의 커밋 (일반적으로 분기 헤드 또는 태그) 사이에 있으며 인덱스 파일은 HEAD 커밋의 트리 (즉, 마지막 커밋의 내용)와 정확히 일치해야합니다. 즉, git-diff --cached HEAD는 변경 사항을보고해야합니다.
그렇지 않으면 병합은 저장소에서 어떤 피해도 끼치 지 않습니다. 즉, 원격에서 개체를 가져올 수 있으며 git pull remote rbranch : lbranch를 사용하여 원격 분기를 추적하는 데 사용되는 로컬 분기를 업데이트 할 수도 있습니다. 작업 트리,.git / HEAD 포인터 및 색인 파일은 그대로 유지됩니다).
작업 트리 파일에 로컬 수정이있을 수 있습니다. 즉, git-diff는 변경 사항을보고 할 수 있습니다. 그러나 병합 작업 트리를 작업 영역으로 사용하며 병합 작업이 변경 내용을 잃지 않도록 병합을 방해하지 않도록합니다. 읽기 트리 문서의 이러한 복잡한 테이블은 "병합을 방해하는"경로의 의미를 정의합니다. 또한 로컬 수정이 병합을 방해하면 다시 만지기 전에 중지됩니다.
따라서 위의 두 "실패한 병합"사례에서 데이터 손실에 대해 걱정할 필요가 없습니다. 단순히 병합을 수행 할 준비가되지 않았기 때문에 병합이 전혀 발생하지 않았습니다. 당신이하고있는 일을 끝내고, 끝내고 준비가 끝난 후에 같은 풀을 다시 시도 할 수 있습니다.
일이 깔끔하게 합쳐지면 다음과 같은 일이 일어납니다.
결과는 색인 파일과 작업 트리에서 모두 업데이트됩니다.
색인 파일은 트리로 작성됩니다.
트리는 커밋됩니다. 과.
HEAD 포인터가 앞으로 나아갑니다.
2. 때문에 인덱스 파일의 원래 상태가 정확히 현재 HEAD 커밋과 일치해야합니다. 그렇지 않으면 병합 결과와 함께 색인 파일에 이미 등록 된 로컬 변경 사항을 작성합니다. 이는 좋지 않습니다. 1. 왜냐하면 당신의 브랜치와 머지하는 동안 (일반적으로 전체 트리의 일부분 인) 원격 브랜치간에 다른 경로 만 포함하기 때문에, 겹치지 않는 한 작업 트리에서 로컬 수정을 할 수 있습니다 병합 업데이트 내용
충돌이 발생하면 다음과 같은 일이 발생합니다.
HEAD는 그대로 유지됩니다.
완전히 통합 된 경로는 인덱스 파일과 작업 트리에서 모두 업데이트됩니다.
충돌하는 경로의 경우 색인 파일은 최대 세 가지 버전을 기록합니다. stage1은 공통 조상 인 HEAD의 stage2와 remote branch의 stage3을 저장합니다 (git-ls-files - u로 스테이지를 검사 할 수 있습니다). 작업 트리 파일에는 "merge"프로그램의 결과가 있습니다. 즉 친숙한 충돌 마커들과의 3- 방향 병합 결과 === & gt; & gt; & gt; .
다른 변경 사항은 수행되지 않습니다. 특히 병합을 시작하기 전에 가지고 있던 로컬 수정 사항은 동일하게 유지되고 색인 항목은 그대로 남아 있습니다 (즉, HEAD 일치).
충돌을 본 후에는 다음 두 가지 작업을 수행 할 수 있습니다.
병합하지 않기로 결정하십시오. 유일한 정화 작업은 색인 파일을 HEAD 커밋으로 재설정하여 역순으로 바꾸고 2와 3으로 이루어진 작업 트리 변경을 정리하는 것입니다. git-reset은 이것에 사용할 수 있습니다.
갈등을 해결하십시오. git-diff는 위의 2.와 3. 때문에 충돌하는 경로만을보고합니다. 작업 파일을 원하는 모양 (git-add 또는 git-rm)으로 편집하여 색인 파일에 병합 결과가 포함되도록합니다. git-commit을 실행하여 결과를 커밋합니다.

7.8 Git Tools - 고급 병합.
고급 병합.
Git에서 병합은 일반적으로 매우 쉽다. Git은 다른 브랜치를 여러 번 병합하기 쉽기 때문에 아주 오래 살았던 브랜치를 가질 수 있지만 갈수록 작은 갈등을 해결하면서 최신 상태로 유지할 수 있다는 것을 의미합니다. 시리즈의 끝.
그러나 때로는 까다로운 갈등이 발생합니다. 다른 버전 제어 시스템과 달리, 힘내 병합 충돌 해결에 지나치게 영리하려고하지 않습니다. 힘내의 철학은 병합 해상도가 언제 명확한지를 결정하는 것에 영리해야하지만, 충돌이있을 경우 자동으로 해결하려고 노력하지는 않습니다. 따라서 빠르게 갈라지는 두 가지를 병합하는 데 너무 오래 기다리면 몇 가지 문제가 발생할 수 있습니다.
이 섹션에서는 이러한 문제가 무엇인지, 그리고 힘든 상황을 처리하는 데 도움이되는 Git 도구에 대해 설명하겠습니다. 또한, 수행 할 수있는 병합을 철회하는 방법을 비롯하여 수행 할 수있는 다양한 비표준 유형의 병합에 대해 다룰 것입니다.
충돌을 병합합니다.
Git은 기본 병합 충돌에서 병합 충돌을 해결하기위한 몇 가지 기본 사항을 다루었지만, 보다 복잡한 충돌을 위해 진행중인 작업과 충돌을보다 잘 처리하는 방법을 파악하는 데 도움이되는 몇 가지 도구를 제공합니다.
우선 가능한 한 충돌이있을 수있는 병합을 수행하기 전에 작업 디렉토리가 깨끗한 지 확인하십시오. 진행중인 작업이 있으면 임시 분기로 커밋하거나 숨겨 둡니다. 이렇게하면 여기에서 시도하는 모든 것을 실행 취소 할 수 있습니다. 병합을 시도 할 때 작업 디렉토리에 변경 사항을 저장하지 않은 경우 이러한 팁 중 일부는 작업을 손실하는 데 도움이 될 수 있습니다.
아주 간단한 예제를 살펴 보겠습니다. 우리에게는 안녕하세요 세상을 인쇄하는 매우 간단한 Ruby 파일이 있습니다.
저장소에서 공백이라는 이름의 새 분기를 만들고 모든 유닉스 줄 끝을 DOS 줄 끝으로 변경합니다. 기본적으로 파일의 모든 줄을 변경하지만 공백을 사용합니다. 그런 다음 "hello world"행을 "hello mundo"행으로 변경합니다.
이제 master 브랜치로 돌아가서 함수에 대한 몇 가지 문서를 추가한다.
이제 공백 부분을 병합하려고 시도하고 공백이 변경되어 충돌이 발생합니다.
병합 중단.
이제 몇 가지 옵션이 있습니다. 먼저, 이 상황에서 벗어나는 방법을 설명합시다. 갈등을 예상하지 않고 상황을 잘 다루지 않으려는 경우 git merge --abort를 사용하여 병합을 취소하면됩니다.
git merge --abort 옵션은 병합을 실행하기 전에 상태로 되돌아 가려고합니다. 이 작업을 완벽하게 수행하지 못할 수있는 유일한 경우는 작업 디렉토리에서 unstashed, uncommitted 변경 사항을 실행 한 경우입니다. 그렇지 않으면 정상적으로 작동합니다.
어떠한 이유로 든 다시 시작하기를 원할 경우 git reset --hard HEAD를 실행하면 저장소가 마지막 커밋 된 상태로 돌아갑니다. 커밋되지 않은 작업은 손실되므로 변경 사항을 원하지 않는지 확인하십시오.
공백을 무시합니다.
이 경우 충돌은 공백과 관련이 있습니다. 사건은 간단하기 때문에이 사실을 알고 있습니다 만, 모든 라인이 한 쪽에서 제거되고 다른 쪽에서 다시 추가되기 때문에 충돌을 볼 때 실제 사례에서 쉽게 알 수 있습니다. 기본적으로 Git은이 모든 행을 변경된 것으로 간주하므로 파일을 병합 할 수 없다.
기본 병합 전략은 인수를 취할 수 있으며 그 중 일부는 공백 변경을 제대로 무시하는 방법에 대한 것입니다. 병합에서 공백 문제가 많이 발생했다면 이제는 - Xignore-all-space 또는 - Xignore-space-change를 사용하여 병합을 중단하고 다시 할 수 있습니다. 첫 번째 옵션은 줄을 비교할 때 공백을 완전히 무시하고 두 번째 옵션은 하나 이상의 공백 문자 시퀀스를 동일한 것으로 취급합니다.
이 경우 실제 파일 변경은 충돌하지 않기 때문에 공백 변경을 무시하면 모든 것이 잘 병합됩니다.
공간에서 탭으로 또는 그 반대로 모든 것을 다시 포맷하는 것을 좋아하는 팀원이있는 경우 이는 구명 사입니다.
수동 파일 재 병합.
Git은 공백 사전 처리를 잘 처리하지만 Git이 자동으로 처리 할 수없는 다른 유형의 변경 사항이 있지만 스크립트 가능한 수정 사항이 있습니다. 예를 들어, Git이 공백 변경을 처리 할 수 ​​없다고 가정하고 수동으로 처리해야했습니다.
우리가 실제로해야 할 일은 실제 파일 병합을 시도하기 전에 dos2unix 프로그램을 통해 병합하려는 파일을 실행하는 것입니다. 그러면 어떻게 할 수 있을까요?
먼저 병합 충돌 상태가됩니다. 그런 다음 우리는 내 버전의 파일, 해당 버전 (우리가 합병하는 지점에서) 및 공통 버전 (양쪽에서 분기 한 곳)의 사본을 얻고 자합니다. 그런 다음 측면 또는 측면을 수정하고이 단일 파일에 대해 다시 병합을 수행하려고합니다.
세 가지 파일 버전을 얻는 것은 실제로 매우 쉽습니다. Git은 인덱스에이 버전들을 모두 "스테이지들"에 저장합니다. 1 단계는 일반적인 조상이고 2 단계는 현재 버전이고 3 단계는 병합중인 버전 ( "theirs")의 MERGE_HEAD입니다.
git show 명령과 특수 구문을 사용하여 충돌 한 파일의 각 버전 사본을 추출 할 수 있습니다.
좀 더 하드 코어를 원한다면 ls-files - u plumbing 명령을 사용하여 각 파일에 대한 Git blob의 실제 SHA-1을 얻을 수 있습니다.
1 : hello. rb는 BLOB SHA-1을 찾는 것의 축약입니다.
작업 디렉토리에 3 단계의 내용이 모두 포함되었으므로 수동으로 수정하여 공백 문제를 해결하고 파일을 잘 알려지지 않은 git merge-file 명령으로 다시 병합 할 수 있습니다.
이 시점에서 우리는 파일을 멋지게 병합했습니다. 사실, 이 옵션은 ignore-space-change 옵션보다 더 효과적입니다. 간단히 무시하는 대신 병합 전에 공백 변경을 실제로 수정하기 때문입니다. ignore-space-change 병합에서, 우리는 실제로 DOS 줄 끝이있는 몇 줄로 끝나며, 여러 가지를 섞습니다.
실제로 커밋을 마무리하기 전에 아이디어를 얻고 싶다면 git diff에 병합 결과로 커밋 할 작업 디렉토리의 내용을 비교해 볼 수있다. 이 단계들 중 어떤 단계. 그들 모두를 통해 가자.
병합 전에 분기에서 얻은 결과와 결과를 비교하려면 병합이 도입 된 것을 확인하기 위해 git diff --ours를 실행할 수 있습니다.
그래서 여기서 우리는 분기에서 일어난 일, 우리가 실제로이 병합으로이 파일에 도입 한 것이 그 한 줄을 바꾸는 것을 쉽게 볼 수 있습니다.
병합 결과가 어떻게 다른 쪽과 다른지 확인하려면 git diff를 실행하면됩니다. 이 예제와 다음 예제에서는 공백을 제거하기 위해 - b를 사용해야한다. 왜냐하면 우리는 정리 된 hello. theirs. rb 파일이 아닌 Git에있는 파일과 비교하기 때문이다.
마지막으로 git diff --base를 사용하여 파일이 양쪽에서 어떻게 변경되었는지 확인할 수 있습니다.
이 시점에서 git clean 명령을 사용하여 수동 병합을 위해 생성했지만 추가 필요없는 추가 파일을 지울 수 있습니다.
충돌 체크 아웃.
아마 우리는 어떤 점에서이 시점에서 해결에 만족하지 않을 수도 있습니다. 아니면 한면 또는 양면을 수동으로 편집해도 여전히 제대로 작동하지 않으며 더 많은 상황이 필요합니다.
예제를 약간 바꾸어 봅시다. 이 예제에서는 두 개의 더 긴 브랜치가 있는데, 각 브랜치에는 몇 개의 커밋이 있지만 병합 할 때 합법적 인 컨텐트 충돌이 발생합니다.
우리는 이제 master 브랜치와 mundo 브랜치에 살고있는 세 개의 다른 커밋에만 존재하는 세 가지 커밋을 갖게되었습니다. 문도 지점을 병합하려고하면 갈등이 생깁니다.
우리는 병합 충돌이 무엇인지보고 싶습니다. 파일을 열면 다음과 같은 내용이 표시됩니다.
병합의 양쪽에서이 파일에 내용을 추가했지만 일부 커밋은이 충돌을 일으킨 동일한 위치에서 파일을 수정했습니다.
이 갈등이 어떻게 발생했는지 판단하기 위해 처분 할 수있는 몇 가지 도구를 살펴 보겠습니다. 아마도이 갈등을 어떻게 수정해야하는지 분명하지 않을 수 있습니다. 더 많은 문맥이 필요합니다.
한 가지 유용한 도구는 '--conflict'옵션을 사용하여 git checkout입니다. 이렇게하면 파일을 다시 체크 아웃하고 병합 충돌 표식을 바꿉니다. 이것은 마커를 재설정하고 다시 마커를 해결하려는 경우 유용 할 수 있습니다.
diff - 3 또는 merge (기본값)를 전달할 수 있습니다. diff3을 전달하면 Git은 "ours"와 "theirs"버전을 제공 할뿐만 아니라 "base"버전을 인라인으로 제공하여 약간 다른 버전의 충돌 마커를 사용합니다.
일단 실행하면 파일은 다음과 같이 보입니다.
이 형식이 마음에 들면 merge. conflictstyle 설정을 diff3으로 설정하여 향후 병합 충돌의 기본값으로 설정할 수 있습니다.
git checkout 명령은 --ours 및 --irs 옵션을 취할 수 있습니다. 병합하지 않고 한 쪽 또는 다른 쪽을 선택하는 정말 빠른 방법 일 수 있습니다.
이것은 바이너리 파일의 충돌에 유용 할 수 있습니다. 여기서는 단순히 한쪽을 선택하거나 다른 브랜치에서 특정 파일 만 병합하려는 경우 - 머지를 수행 한 다음 커밋하기 전에 특정 파일을 한쪽 또는 다른 쪽에서 체크 아웃 할 수 있습니다 .
병합 충돌을 해결할 때 유용한 도구는 git log입니다. 이렇게하면 갈등에 기여할 수있는 상황에 대한 정보를 얻을 수 있습니다. 두 줄의 개발이 동일한 코드 영역을 만지는 이유를 기억하기 위해 약간의 역사를 검토하면 가끔 도움이 될 수 있습니다.
이 병합에 관련된 두 분기에 포함 된 모든 고유 커밋의 전체 목록을 얻으려면 Triple Dot에서 배운 "트리플 도트"구문을 사용할 수 있습니다.
관련된 총 6 개의 커밋 중 좋은 목록 일뿐만 아니라 커밋 된 개발 라인도 있습니다.
우리는 훨씬 더 구체적인 문맥을 제공하기 위해 이것을 더 단순화 할 수 있습니다. git log에 --merge 옵션을 추가하면 현재 충돌하고있는 파일을 터치하는 병합 양쪽에 커밋 만 표시됩니다.
대신에 - p 옵션을 사용하여 실행하면, 충돌로 끝난 파일에 대한 diff 만 얻을 수 있습니다. 이것은 정말로 당신이 뭔가 상충되는 이유와 그것을 지능적으로 해결하는 방법을 이해하는 데 도움이되는 상황을 신속하게 제공하는데 도움이 될 수 있습니다.
결합 된 Diff 형식.
힘내르기가 성공한 병합 결과를 단계적으로 처리하기 때문에 충돌하는 병합 상태에있는 동안 자식 diff를 실행하면 현재 충돌이있는 것만을 얻을 수 있습니다. 이는 여전히 해결해야 할 사항을 파악하는 데 도움이 될 수 있습니다.
병합 충돌이 발생하면 git diff 명령을 직접 실행하면 고유 한 diff 출력 형식으로 정보가 제공됩니다.
형식은 "Combined Diff"라고하며 각 행 옆에 두 개의 데이터 열을 제공합니다. 첫 번째 열은 "ours"분기와 작업 디렉토리의 파일간에 해당 행이 다른 경우 (추가 또는 제거 된 경우) 두 번째 열은 "theirs"분기와 작업 디렉토리 복사본간에 동일하게 수행됩니다.
따라서이 예제에서 & lt; & lt; & lt; & lt; & lt; & lt; & lt; & lt; & gt; & gt; & gt; & gt; & gt; & gt; & gt; & gt; 줄은 작업 복사본에 있지만 병합 양쪽에 없습니다. 병합 도구가 컨텍스트에 맞게 병합 되었기 때문에 이는 의미가 있지만 제거 할 것으로 예상됩니다.
충돌을 해결하고 git diff 명령을 다시 실행하면 같은 결과가 표시되지만 좀 더 유용합니다.
이것은 "hola world"가 우리 편이었지만 작업 복사본이 아니라, "hello mundo"가 작업 복사본에 있지만 "hola mundo"가 어느 쪽에도 있지 않았지만 이제는 그 안에 있다는 것을 보여줍니다. 작업 사본. 이는 해상도를 커밋하기 전에 검토하는 것이 유용 할 수 있습니다.
git 로그에서 병합을 확인하여 사실 이후에 무언가가 어떻게 해결되었는지 확인할 수도 있습니다. Git은 병합 커밋에서 git show를 실행하거나 git log - p 옵션에 --cc 옵션을 추가하면이 형식을 출력합니다 (기본적으로 병합되지 않은 커밋에 대한 패치 만 표시).
병합 실행 취소.
이제 병합 커밋을 만드는 방법을 알았으므로 실수로 일부를 만들 것입니다. Git을 사용하여 작업하는 것이 가장 좋은 점 중 하나는 실수를하는 것이 좋다는 것입니다. 실수를 수정하는 것이 가능하기 때문에 (그리고 많은 경우에) 쉽게 수정할 수 있기 때문입니다.
병합 커밋도 마찬가지입니다. 주제 분기에서 작업을 시작하여 우연히 마스터로 병합했다고 가정 해 보겠습니다. 이제 커밋 기록은 다음과 같습니다.
원하는 결과가 무엇인지에 따라이 문제에 접근하는 데는 두 가지 방법이 있습니다.
참조를 수정하십시오.
원하지 않는 병합 커밋이 로컬 리포지토리에만 존재하는 경우, 가장 쉽고 가장 좋은 해결책은 원하는 지점을 가리 키도록 지점을 이동하는 것입니다. 대부분의 경우, git reset --hard HEAD를 사용하여 오류가있는 git 병합을 따르는 경우.
, 이렇게하면 분기 포인터가 다음과 같이 재설정됩니다.
우리는 Reset Demystified에서 재설정을 다시 처리 했으므로 여기에서 무슨 일이 일어나고 있는지 파악하기가 너무 어려워서는 안됩니다. 다음은 빠른 재교육입니다. 재설정 - 보통 3 단계를 거칩니다.
지점 HEAD가 가리키는 곳으로 이동하십시오. 이 경우, merge commit (C6) 이전의 위치로 master를 이동하려고합니다.
색인을 HEAD처럼 보이게하십시오.
작업 디렉토리를 색인처럼 보이게하십시오.
이 접근 방식의 단점은 그것이 공유 리포지토리에서 문제가 될 수있는 재 작성 이력입니다. 일어날 수있는 일에 대해 Rebasing의 위험성을 확인하십시오. 짧은 버전은 다른 사람이 커밋을 작성하는 경우 다시 작성하지 않는 것이 좋습니다. 이 방법은 병합 이후에 다른 커밋이 만들어진 경우에도 작동하지 않습니다. 심판을 움직이면 그 변화를 효과적으로 잃을 것입니다.
커밋을 반대로하십시오.
주변의 브랜치 포인터를 움직이는 것이 효과가 없을 경우, Git은 새로운 커밋을 만들어 기존의 모든 변경 사항을 취소 할 수있는 옵션을 제공합니다. 힘내는이 작업을 "복귀"라고 부르며이 특정 시나리오에서는 다음과 같이 호출합니다.
-m 1 플래그는 "메인 라인"인 부모를 나타내며 유지되어야합니다. HEAD (병합 병합 주제)로 병합을 호출하면 새 커밋에 두 개의 상위가 있습니다. 첫 번째는 HEAD (C6)이고 두 번째는 병합되는 분기의 끝 (C4)입니다. 이 경우 부모 # 1 (C6)의 모든 콘텐츠를 유지하면서 부모 # 2 (C4)에서 병합하여 도입 된 모든 변경 사항을 취소하고 싶습니다.
되돌리기 커밋을 사용한 기록은 다음과 같습니다.
새로운 커밋 ^ M은 C6과 정확히 같은 내용을 담고 있기 때문에 병합되지 않은 것처럼 커밋되지 않은 커밋이 여전히 HEAD의 이력에 남아 있다는 것을 제외하고는 여기에서부터 시작합니다. 주제를 마스터에 다시 병합하려고하면 힘내 기는 혼란 스러울 것이다.
이미 마스터에서 도달 할 수없는 주제는 없습니다. 더 나쁜 것은 주제에 작업을 추가하고 다시 병합하면 Git은 되돌려 진 병합 이후에만 변경 사항을 가져옵니다.
이 문제를 해결하는 가장 좋은 방법은 원래의 병합을 취소하는 것입니다. 이제는 병합 된 변경 사항을 가져 와서 새로운 병합 커밋을 만듭니다.
이 예제에서 M과 ^ M은 취소됩니다. ^^ M은 C3와 C4의 변경 사항을 효과적으로 병합하고 C8의 변경 사항에서 C8 병합을 적용하므로 주제가 완전히 통합되었습니다.
다른 유형의 합병.
지금까지 두 분기의 정상적인 병합을 다루었습니다. 일반적으로 병합의 "재귀 적"전략으로 처리되었습니다. 그러나 분기를 병합하는 다른 방법이 있습니다. 신속하게 몇 가지를 살펴 보겠습니다.
우리 자신의 선호.
우선, 일반적인 "재귀 적"병합 모드로 할 수있는 또 다른 유용한 기능이 있습니다. 우리는 이미 ignore-all-space와 ignore-space-change 옵션을 - X와 함께 전달하는 것을 보았습니다. 하지만 Git이 충돌을 볼 때 한쪽 또는 다른 쪽을 선호하도록 말할 수 있습니다.
기본적으로 Git은 병합중인 두 브랜치간에 충돌이있을 때 코드에 병합 충돌 마커를 추가하고 충돌로 표시하여 해결하도록합니다. Git이 단순히 특정면을 선택하고 충돌을 수동으로 해결하는 대신 다른면을 무시하는 경우 병합 명령에 - Xours 또는 - Xtheir를 전달할 수 있습니다.
힘내 (Git)가 이것을 보게되면 충돌 마커가 추가되지 않습니다. 병합 할 수있는 모든 차이점이 병합됩니다. 충돌하는 모든 차이점은 바이너리 파일을 포함하여 사용자가 지정한 부분을 선택하는 것입니다.
이전에 사용하던 "hello world"예제로 돌아 가면 지사에서의 병합이 충돌을 일으키는 것을 볼 수 있습니다.
그러나 - Xours 또는 - Xtheirs를 사용하여 실행하면 그렇지 않습니다.
이 경우 한쪽에는 "hello mundo", 다른쪽에는 "hola world"라는 파일에 충돌 마커가 표시되는 대신 "hola world"가 선택됩니다. 그러나 해당 분기의 다른 모든 충돌하지 않는 변경 사항은에 병합됩니다.
이 옵션은 앞에서 보았던 git merge-file 명령에 개별 파일 병합을 위해 git merge-file --ours를 실행하여 전달할 수도 있습니다.
이와 같은 일을하고 싶지만 다른 쪽에서 변경 사항을 병합하려고 시도하지는 않습니다. "우리"병합 전략 인 더 엄격한 옵션이 있습니다. 이는 "우리"재귀 병합 옵션과 다릅니다.
이것은 기본적으로 가짜 병합을 수행합니다. 두 브랜치를 부모로 사용하여 새로운 머지 커밋을 기록하지만 병합중인 브랜치를 보지 않습니다. 현재 브랜치의 정확한 코드를 병합 한 결과로 기록됩니다.
우리가 있던 지점과 병합 결과간에 차이가 없다는 것을 알 수 있습니다.
이것은 나중에 Git이 나중에 병합을 할 때 브랜치가 병합되었다고 생각하도록 속이기 위해 유용 할 수 있습니다. 예를 들어, 릴리스 분기를 분기하고 일부 지점에서 마스터 분기로 병합하려는 일부 작업을 수행했다고 가정 해보십시오. 그 동안 마스터의 버그 수정은 릴리스 지점으로 백 포트해야합니다. bugfix 브랜치를 릴리스 브랜치에 병합 할 수 있으며, 심지어 같은 브랜치를 마스터 브랜치에 병합 할 수 있습니다 (수정 사항이 이미 있음에도 불구하고). 나중에 릴리스 브랜치를 다시 병합 할 때 버그 픽스와 충돌이 없습니다.
서브 트리 병합.
하위 트리 병합의 개념은 두 개의 프로젝트가 있으며 프로젝트 중 하나는 다른 프로젝트의 하위 디렉토리에 매핑된다는 것입니다. 하위 트리 병합을 지정할 때 힘내는 종종 하나가 다른 하나의 하위 트리이며 적절하게 병합된다는 것을 알기에 충분히 영리합니다.
별도의 프로젝트를 기존 프로젝트에 추가 한 다음 두 번째 코드를 첫 번째 서브 디렉토리로 병합하는 예제를 살펴 보겠습니다.
먼저 Rack 응용 프로그램을 프로젝트에 추가합니다. Rack 프로젝트를 자체 프로젝트의 원격 참조로 추가 한 다음 자체 지점에 체크 아웃합니다.
이제 우리는 rack_branch 브랜치의 Rack 프로젝트 루트와 master 브랜치의 자체 프로젝트를 가지고 있습니다. 하나를 체크 아웃하고 다른 체크 아웃하면, 그들은 서로 다른 프로젝트의 뿌리를 볼 수 있습니다 :
이것은 일종의 이상한 개념입니다. 저장소의 모든 분기가 실제로 동일한 프로젝트의 분기가되어야하는 것은 아닙니다. 거의 도움이되지 않기 때문에 흔한 일은 아니지만 가지가 완전히 다른 역사를 포함하는 것은 상당히 쉽습니다.
이 경우, Rack 프로젝트를 마스터 프로젝트의 서브 디렉토리로 가져 오려고합니다. 우리는 git read-tree를 사용하여 힘내에서 이것을 할 수있다. Git Internals에서 read-tree와 그 친구들에 대해 더 많이 배우 겠지만, 현재는 하나의 브랜치의 루트 트리를 현재의 스테이징 영역과 작업 디렉토리로 읽는다는 것을 알고 있습니다. 방금 마스터 브랜치로 전환했고, rack_branch 브랜치를 메인 프로젝트의 마스터 브랜치의 rack 서브 디렉토리로 가져 왔습니다 :
우리가 커밋 할 때, 마치 우리가 tarball로부터 복사 한 것처럼 그 서브 디렉토리 아래에 모든 랙 파일을 가지고있는 것처럼 보입니다. 흥미로운 점은 지점 중 하나에서 다른 지점으로 변경 사항을 쉽게 병합 할 수 있다는 것입니다. 따라서 Rack 프로젝트가 업데이트되면 해당 분기로 전환하고 업스트림 변경 사항을 가져올 수 있습니다.
그런 다음 변경 사항을 마스터 분기로 병합 할 수 있습니다. 변경 내용을 가져 와서 커밋 메시지를 미리 채우려면 --squash 옵션과 재귀 적 병합 전략의 - Xsubtree 옵션을 사용하십시오. 재귀 적 전략이 여기에 기본값이지만, 명확하게하기 위해 재귀 전략을 포함시킵니다.
Rack 프로젝트의 모든 변경 사항은 병합되어 로컬에서 커밋 될 준비가되었습니다. 마스터 브랜치의 rack 서브 디렉토리에서 변경을 한 후 나중에 rack_branch 브랜치에 병합하여 관리자에게 제출하거나 업스트림으로 푸시 할 수도 있습니다.
이것은 서브 모듈을 사용하지 않고 서브 모듈 워크 플로우와 다소 유사한 워크 플로우를 가질 수있는 방법을 제공합니다 (Submodules에서 다룹니다). 저장소와 서브 트리의 다른 관련 프로젝트와 분기를 유지하여 프로젝트에 병합 할 수 있습니다. 어떤면에서는 훌륭합니다. 예를 들어 모든 코드가 단일 장소에 커밋 된 경우입니다. 그러나 변경 사항을 재 통합하거나 실수로 분기를 관련없는 저장소로 밀어 넣는 실수를하는 것이 조금 더 복잡하고 쉽다는 단점이 있습니다.
또 다른 약간 이상한 점은 rack 서브 디렉토리에있는 내용과 rack_branch 브랜치에있는 코드를 비교하는 것입니다. 병합해야하는지 확인하기 위해 normal diff 명령을 사용할 수 없습니다. 대신 비교할 브랜치와 함께 git diff-tree를 실행해야합니다 :
또는 랙 하위 디렉토리의 내용과 마지막으로 가져온 서버의 마스터 브랜치를 비교하면 실행할 수 있습니다.

재귀 적 전략과 병합하지 못했습니다.
git-merge - 두 개 이상의 개발 기록을 함께 결합합니다.
기술.
그들의 커밋이 현재 브랜치에서 분기 된 이후로 명명 된 커밋의 변경 사항을 현재 브랜치에 반영합니다. 이 명령은 git pull이 다른 저장소의 변경 내용을 통합하는 데 사용되며 한 지점에서 다른 지점으로 변경 사항을 병합하기 위해 손으로 사용할 수 있습니다.
다음 기록이 존재하고 현재 분기가 "마스터"라고 가정합니다.
그런 다음 "git merge topic"은 마스터 (즉, E)에서 현재 커밋 (C)까지 마스터 분기와 분기 된 이후에 주제 분기에서 수행 된 변경 사항을 재생하고 그 결과를 이름과 함께 새로운 커밋에 기록합니다 the two parent commits and a log message from the user describing the changes.
The second syntax (" git merge --abort ") can only be run after the merge has resulted in conflicts. git merge --abort will abort the merge process and try to reconstruct the pre-merge state. However, if there were uncommitted changes when the merge started (and especially if those changes were further modified after the merge was started), git merge --abort will in some cases be unable to reconstruct the original (pre-merge) changes. 따라서:
Warning : Running git merge with non-trivial uncommitted changes is discouraged: while possible, it may leave you in a state that is hard to back out of in the case of a conflict.
The fourth syntax (" git merge --continue ") can only be run after the merge has resulted in conflicts.
Perform the merge and commit the result. This option can be used to override --no-commit.
With --no-commit perform the merge but pretend the merge failed and do not autocommit, to give the user a chance to inspect and further tweak the merge result before committing.
Invoke an editor before committing successful mechanical merge to further edit the auto-generated merge message, so that the user can explain and justify the merge. The --no-edit option can be used to accept the auto-generated message (this is generally discouraged). The --edit (or - e ) option is still useful if you are giving a draft message with the - m option from the command line and want to edit it in the editor.
Older scripts may depend on the historical behaviour of not allowing the user to edit the merge log message. They will see an editor opened when they run git merge . To make it easier to adjust such scripts to the updated behaviour, the environment variable GIT_MERGE_AUTOEDIT can be set to no at the beginning of them.
When the merge resolves as a fast-forward, only update the branch pointer, without creating a merge commit. This is the default behavior.
Create a merge commit even when the merge resolves as a fast-forward. This is the default behaviour when merging an annotated (and possibly signed) tag.
Refuse to merge and exit with a non-zero status unless the current HEAD is already up to date or the merge can be resolved as a fast-forward.
GPG-sign the resulting merge commit. The keyid argument is optional and defaults to the committer identity; if specified, it must be stuck to the option without a space.
In addition to branch names, populate the log message with one-line descriptions from at most <n> actual commits that are being merged. See also git-fmt-merge-msg[1].
With --no-log do not list one-line descriptions from the actual commits being merged.
Show a diffstat at the end of the merge. The diffstat is also controlled by the configuration option merge. stat.
With - n or --no-stat do not show a diffstat at the end of the merge.
Produce the working tree and index state as if a real merge happened (except for the merge information), but do not actually make a commit, move the HEAD , or record $GIT_DIR/MERGE_HEAD (to cause the next git commit command to create a merge commit). This allows you to create a single commit on top of the current branch whose effect is the same as merging another branch (or more in case of an octopus).
With --no-squash perform the merge and commit the result. This option can be used to override --squash.
Use the given merge strategy; can be supplied more than once to specify them in the order they should be tried. If there is no - s option, a built-in list of strategies is used instead ( git merge-recursive when merging a single head, git merge-octopus otherwise).
-X <option> --strategy-option=<option>
Pass merge strategy specific option through to the merge strategy.
Verify that the tip commit of the side branch being merged is signed with a valid key, i. e. a key that has a valid uid: in the default trust model, this means the signing key has been signed by a trusted key. If the tip commit of the side branch is not signed with a valid key, the merge is aborted.
Synonyms to --stat and --no-stat; these are deprecated and will be removed in the future.
Operate quietly. Implies --no-progress.
Turn progress on/off explicitly. If neither is specified, progress is shown if standard error is connected to a terminal. Note that not all merge strategies may support progress reporting.
By default, git merge command refuses to merge histories that do not share a common ancestor. This option can be used to override this safety when merging histories of two projects that started their lives independently. As that is a very rare occasion, no configuration variable to enable this by default exists and will not be added.
Add Signed-off-by line by the committer at the end of the commit log message. The meaning of a signoff depends on the project, but it typically certifies that committer has the rights to submit this work under the same license and agrees to a Developer Certificate of Origin (see developercertificate. org/ for more information).
Set the commit message to be used for the merge commit (in case one is created).
If --log is specified, a shortlog of the commits being merged will be appended to the specified message.
The git fmt-merge-msg command can be used to give a good default for automated git merge invocations. The automated message can include the branch description.
Allow the rerere mechanism to update the index with the result of auto-conflict resolution if possible.
Abort the current conflict resolution process, and try to reconstruct the pre-merge state.
If there were uncommitted worktree changes present when the merge started, git merge --abort will in some cases be unable to reconstruct these changes. It is therefore recommended to always commit or stash your changes before running git merge .
git merge --abort is equivalent to git reset --merge when MERGE_HEAD is present.
After a git merge stops due to conflicts you can conclude the merge by running git merge --continue (see "HOW TO RESOLVE CONFLICTS" section below).
Commits, usually other branch heads, to merge into our branch. Specifying more than one commit will create a merge with more than two parents (affectionately called an Octopus merge).
If no commit is given from the command line, merge the remote-tracking branches that the current branch is configured to use as its upstream. See also the configuration section of this manual page.
When FETCH_HEAD (and no other commit) is specified, the branches recorded in the. git/FETCH_HEAD file by the previous invocation of git fetch for merging are merged to the current branch.
PRE-MERGE CHECKS.
Before applying outside changes, you should get your own work in good shape and committed locally, so it will not be clobbered if there are conflicts. See also git-stash[1]. git pull and git merge will stop without doing anything when local uncommitted changes overlap with files that git pull / git merge may need to update.
To avoid recording unrelated changes in the merge commit, git pull and git merge will also abort if there are any changes registered in the index relative to the HEAD commit. (One exception is when the changed index entries are in the state that would result from the merge already.)
If all named commits are already ancestors of HEAD , git merge will exit early with the message "Already up to date."
FAST-FORWARD MERGE.
Often the current branch head is an ancestor of the named commit. This is the most common case especially when invoked from git pull : you are tracking an upstream repository, you have committed no local changes, and now you want to update to a newer upstream revision. In this case, a new commit is not needed to store the combined history; instead, the HEAD (along with the index) is updated to point at the named commit, without creating an extra merge commit.
This behavior can be suppressed with the --no-ff option.
TRUE MERGE.
Except in a fast-forward merge (see above), the branches to be merged must be tied together by a merge commit that has both of them as its parents.
A merged version reconciling the changes from all branches to be merged is committed, and your HEAD , index, and working tree are updated to it. It is possible to have modifications in the working tree as long as they do not overlap; the update will preserve them.
When it is not obvious how to reconcile the changes, the following happens:
The HEAD pointer stays the same.
The MERGE_HEAD ref is set to point to the other branch head.
Paths that merged cleanly are updated both in the index file and in your working tree.
For conflicting paths, the index file records up to three versions: stage 1 stores the version from the common ancestor, stage 2 from HEAD , and stage 3 from MERGE_HEAD (you can inspect the stages with git ls-files - u ). The working tree files contain the result of the "merge" program; i. e. 3-way merge results with familiar conflict markers <<< === >>> .
No other changes are made. In particular, the local modifications you had before you started merge will stay the same and the index entries for them stay as they were, i. e. matching HEAD .
If you tried a merge which resulted in complex conflicts and want to start over, you can recover with git merge --abort .
MERGING TAG.
When merging an annotated (and possibly signed) tag, Git always creates a merge commit even if a fast-forward merge is possible, and the commit message template is prepared with the tag message. Additionally, if the tag is signed, the signature check is reported as a comment in the message template. See also git-tag[1].
When you want to just integrate with the work leading to the commit that happens to be tagged, e. g. synchronizing with an upstream release point, you may not want to make an unnecessary merge commit.
In such a case, you can "unwrap" the tag yourself before feeding it to git merge , or pass --ff-only when you do not have any work on your own. 예 :
HOW CONFLICTS ARE PRESENTED.
During a merge, the working tree files are updated to reflect the result of the merge. Among the changes made to the common ancestor’s version, non-overlapping ones (that is, you changed an area of the file while the other side left that area intact, or vice versa) are incorporated in the final result verbatim. When both sides made changes to the same area, however, Git cannot randomly pick one side over the other, and asks you to resolve it by leaving what both sides did to that area.
By default, Git uses the same style as the one used by the "merge" program from the RCS suite to present such a conflicted hunk, like this:
The area where a pair of conflicting changes happened is marked with markers <<<<<<< , ======= , and >>>>>>> . The part before the ======= is typically your side, and the part afterwards is typically their side.
The default format does not show what the original said in the conflicting area. You cannot tell how many lines are deleted and replaced with Barbie’s remark on your side. The only thing you can tell is that your side wants to say it is hard and you’d prefer to go shopping, while the other side wants to claim it is easy.
An alternative style can be used by setting the "merge. conflictStyle" configuration variable to "diff3". In "diff3" style, the above conflict may look like this:
In addition to the <<<<<<< , ======= , and >>>>>>> markers, it uses another ||||||| marker that is followed by the original text. You can tell that the original just stated a fact, and your side simply gave in to that statement and gave up, while the other side tried to have a more positive attitude. You can sometimes come up with a better resolution by viewing the original.
HOW TO RESOLVE CONFLICTS.
After seeing a conflict, you can do two things:
Decide not to merge. The only clean-ups you need are to reset the index file to the HEAD commit to reverse 2. and to clean up working tree changes made by 2. and 3.; git merge --abort can be used for this.
Resolve the conflicts. Git will mark the conflicts in the working tree. Edit the files into shape and git add them to the index. Use git commit or git merge --continue to seal the deal. The latter command checks whether there is a (interrupted) merge in progress before calling git commit .
You can work through the conflict with a number of tools:
Use a mergetool. git mergetool to launch a graphical mergetool which will work you through the merge.
Look at the diffs. git diff will show a three-way diff, highlighting changes from both the HEAD and MERGE_HEAD versions.
Look at the diffs from each branch. git log --merge - p <path> will show diffs first for the HEAD version and then the MERGE_HEAD version.
Look at the originals. git show :1:filename shows the common ancestor, git show :2:filename shows the HEAD version, and git show :3:filename shows the MERGE_HEAD version.
Merge branches fixes and enhancements on top of the current branch, making an octopus merge:
Merge branch obsolete into the current branch, using ours merge strategy:
Merge branch maint into the current branch, but do not make a new commit automatically:
This can be used when you want to include further changes to the merge, or want to write your own merge commit message.
You should refrain from abusing this option to sneak substantial changes into a merge commit. Small fixups like bumping release/version name would be acceptable.
MERGE STRATEGIES.
The merge mechanism ( git merge and git pull commands) allows the backend merge strategies to be chosen with - s option. 일부 전략은 자체 옵션을 취할 수도 있습니다. 이 옵션은 - X & lt; option & gt; 자식 병합 및 / 또는 자식 끌어 인수.
이렇게하면 3 방향 병합 알고리즘을 사용하여 두 개의 헤드 (즉, 현재 브랜치와 다른 브랜치)를 해결할 수 있습니다. 그것은 십자가 병합 모호성을 신중하게 탐지하려고 시도하며 일반적으로 안전하고 빠른 것으로 간주됩니다.
이 방법은 3 방향 병합 알고리즘을 사용하는 두 개의 헤드 만 해결할 수 있습니다. 3 방향 병합에 사용할 수있는 공통 조상이 둘 이상이면 공통 조상의 병합 된 트리를 만들어이를 3 방향 병합을위한 참조 트리로 사용합니다. 이는 Linux 2.6 커널 개발 이력에서 가져온 실제 병합 커밋에 대한 테스트로 인해 불일치가 발생하지 않고 병합 충돌이 줄어들 었다고보고되었습니다. 또한 이름 변경과 관련된 병합을 감지하고 처리 할 수 ​​있습니다. 하나의 분기를 가져 오거나 병합 할 때 기본 병합 전략입니다.
재귀 적 전략에는 다음과 같은 옵션이 있습니다.
이 옵션은 우리 버전을 선호함으로써 충돌하는 덩어리를 자동으로 자동 해결하도록합니다. 우리 쪽과 충돌하지 않는 다른 트리의 변경 사항이 병합 결과에 반영됩니다. 이진 파일의 경우 전체 내용이 우리 측에서 가져옵니다.
이것은 우리의 머지 전략과 혼동되어서는 안됩니다. 이 전략은 다른 트리가 전혀 포함하지 않는 것을 보지 않습니다. 그것은 다른 나무가 한 모든 것을 버리고 우리의 역사에는 그 안에 일어났던 모든 것이 들어 있다고 선언합니다.
This is the opposite of ours ; note that, unlike ours , there is no theirs merge stragegy to confuse this merge option with.
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). 병합 할 분기가 격렬하게 갈라 졌을 때 이것을 사용하십시오. git-diff [1] --patience를 참고하십시오.
Tells merge-recursive to use a different diff algorithm, which can help avoid mismerges that occur due to unimportant matching lines (such as braces from distinct functions). git-diff [1] --diff-algorithm도 참조하십시오.
ignore-space-change ignore-all-space ignore-space-at-eol.
3 방향 병합을 위해 표시된 공백 변경 유형의 행을 변경되지 않은 것으로 처리합니다. 행에 대한 다른 변경 사항과 혼합 된 공백 변경 사항은 무시되지 않습니다. git-diff [1] - b, - w 및 --ignore-space-at-eol도 참조하십시오.
If their version only introduces whitespace changes to a line, our version is used;
If our version introduces whitespace changes but their version includes a substantial change, their version is used;
그렇지 않으면 병합은 일반적인 방법으로 진행됩니다.
3 방향 병합을 해결할 때 가상 체크 아웃을 실행하고 파일의 모든 3 단계를 체크인합니다. 이 옵션은 다른 깨끗한 필터 또는 줄 끝 정규화 규칙으로 분기를 병합 할 때 사용하기위한 것입니다. 자세한 내용은 gitattributes [5]의 "checkin / checkout 속성이 다른 분기를 병합"을 참조하십시오.
재 정규화 옵션을 비활성화합니다. 이것은 merge. renormalize 구성 변수를 겹쳐 씁니다.
이름 바꾸기 감지 기능을 해제하십시오. git-diff [1] --no-renames도 참조하십시오.
이름 바꾸기 감지 기능을 켜고 필요에 따라 유사도 임계 값을 설정합니다. 이것이 기본값입니다. git-diff [1] --find-renames도 참조하십시오.
find-renames = & lt; n & gt;에 대한 더 이상 사용되지 않는 동의어입니다. .
This option is a more advanced form of subtree strategy, where the strategy makes a guess on how two trees must be shifted to match with each other when merging. 대신 지정된 경로가 두 개의 트리 모양을 일치시키기 위해 접두사로 사용됩니다 (또는 처음부터 제거됩니다).
이 경우 두 개 이상의 헤드가있는 경우는 해결되지만 수동으로 해결해야하는 복잡한 병합은 수행되지 않습니다. 주제 머리말을 함께 묶는 데 주로 사용됩니다. 둘 이상의 분기를 가져 오거나 병합 할 때 기본 병합 전략입니다.
이렇게하면 여러 개의 머리가 처리되지만 병합 된 트리는 항상 현재 분기 헤드의 트리이므로 다른 모든 분기의 모든 변경 사항을 무시합니다. 그것은 사이드 브랜치의 오래된 개발 이력을 대체하기 위해 사용됩니다. 이것은 재귀 병합 전략에 대한 - Xours 옵션과 다릅니다.
이는 수정 된 재귀 적 전략입니다. 나무 A와 B를 병합 할 때 B가 A의 하위 트리에 해당하면 B는 먼저 같은 레벨의 나무를 읽지 않고 A의 트리 구조와 일치하도록 조정됩니다. 이 조정은 공통 조상 트리에서도 수행됩니다.
With the strategies that use 3-way merge (including the default, recursive ), if a change is made on both branches, but later reverted on one of the branches, that change will be present in the merged result; 어떤 사람들은이 행동이 혼란 스럽다는 것을 알게됩니다. 병합을 수행 할 때 헤드 및 병합베이스 만 고려되므로 개별 커밋이 고려되지 않기 때문에 발생합니다. 따라서 병합 알고리즘은 복귀 된 변경 사항을 전혀 변경되지 않은 것으로 간주하고 대신 변경된 버전으로 대체합니다.
CONFIGURATION.
Specify the style in which conflicted hunks are written out to working tree files upon merge. The default is "merge", which shows a <<<<<<< conflict marker, changes made by one side, a ======= marker, changes made by the other side, and then a >>>>>>> marker. An alternate style, "diff3", adds a ||||||| marker and the original text before the ======= marker.
If merge is called without any commit argument, merge the upstream branches configured for the current branch by using their last observed values stored in their remote-tracking branches. The values of the branch.<current branch>.merge that name the branches at the remote named by branch.<current branch>.remote are consulted, and then they are mapped via remote.<remote>.fetch to their corresponding remote-tracking branches, and the tips of these tracking branches are merged.
By default, Git does not create an extra merge commit when merging a commit that is a descendant of the current commit. Instead, the tip of the current branch is fast-forwarded. When set to false , this variable tells Git to create an extra merge commit in such a case (equivalent to giving the --no-ff option from the command line). When set to only , only such fast-forward merges are allowed (equivalent to giving the --ff-only option from the command line).
In addition to branch names, populate the log message with the branch description text associated with them. Defaults to false.
In addition to branch names, populate the log message with at most the specified number of one-line descriptions from the actual commits that are being merged. Defaults to false, and true is a synonym for 20.
The number of files to consider when performing rename detection during a merge; if not specified, defaults to the value of diff. renameLimit.
Tell Git that canonical representation of files in the repository has changed over time (e. g. earlier commits record text files with CRLF line endings, but recent ones use LF line endings). In such a repository, Git can convert the data recorded in commits to a canonical form before performing a merge to reduce unnecessary conflicts. For more information, see section "Merging branches with differing checkin/checkout attributes" in gitattributes[5].
Whether to print the diffstat between ORIG_HEAD and the merge result at the end of the merge. True by default.
Controls which merge tool is used by git-mergetool[1]. The list below shows the valid built-in values. Any other value is treated as a custom merge tool and requires that a corresponding mergetool.<tool>.cmd variable is defined.
Controls the amount of output shown by the recursive merge strategy. Level 0 outputs nothing except a final error message if conflicts were detected. Level 1 outputs only conflicts, 2 outputs conflicts and file changes. Level 5 and above outputs debugging information. The default is level 2. Can be overridden by the GIT_MERGE_VERBOSITY environment variable.
Defines a human-readable name for a custom low-level merge driver. See gitattributes[5] for details.
Defines the command that implements a custom low-level merge driver. See gitattributes[5] for details.
Names a low-level merge driver to be used when performing an internal merge between common ancestors. See gitattributes[5] for details.
Sets default options for merging into branch <name>. The syntax and supported options are the same as those of git merge , but option values containing whitespace characters are currently not supported.

No comments:

Post a Comment