Friday 23 March 2018

힘내 합병 전략 재귀


힘내 합치기 전략 재귀 적
병합 메커니즘 (git merge 및 git pull 명령)을 사용하면 백엔드의 '병합 전략'을 - s 옵션으로 선택할 수 있습니다. 일부 전략은 자체 옵션을 취할 수도 있습니다. 이 옵션은 - X & lt; option & gt; 자식 병합 및 / 또는 자식 끌어 인수.
이렇게하면 3 방향 병합 알고리즘을 사용하여 두 개의 헤드 (즉, 현재 브랜치와 다른 브랜치)를 해결할 수 있습니다. 그것은 십자가 병합 모호성을 신중하게 탐지하려고 시도하며 일반적으로 안전하고 빠른 것으로 간주됩니다.
이 방법은 3 방향 병합 알고리즘을 사용하는 두 개의 헤드 만 해결할 수 있습니다. 3 방향 병합에 사용할 수있는 공통 조상이 둘 이상이면 공통 조상의 병합 된 트리를 만들어이를 3 방향 병합을위한 참조 트리로 사용합니다. 이는 Linux 2.6 커널 개발 이력에서 가져온 실제 병합 커밋에 대한 테스트로 인해 불일치가 발생하지 않고 병합 충돌이 줄어들 었다고보고되었습니다. 또한 이름 변경과 관련된 병합을 감지하고 처리 할 수 ​​있습니다. 하나의 분기를 가져 오거나 병합 할 때 기본 병합 전략입니다.
'재귀 적'전략은 다음과 같은 옵션을 취할 수 있습니다.
이 옵션은 '우리'버전을 선호함으로써 충돌하는 덩어리가 자동으로 자동 해결되도록합니다. 우리 쪽과 충돌하지 않는 다른 트리의 변경 사항이 병합 결과에 반영됩니다. 이진 파일의 경우 전체 내용이 우리 측에서 가져옵니다.
이것은 다른 트리가 전혀 포함하지 않는 'ours'병합 전략과 혼동되어서는 안됩니다. 그것은 다른 나무가 한 모든 것을 버리고 '우리의'역사는 그 안에 일어난 모든 것을 포함한다고 선언합니다.
이것은 '우리'의 반대입니다. "우리"와는 달리이 병합 옵션을 혼란스럽게하는 "그들의 것"병합 병합이 없다는 점에 유의하십시오.
이 옵션을 사용하면 'merge-recursive'는 중요하지 않은 일치 행 (예 : 고유 기능의 중괄호)으로 인해 때때로 발생하는 mismerges를 피하기 위해 약간의 시간을 소비합니다. 병합 할 분기가 격렬하게 갈라 졌을 때 이것을 사용하십시오. git-diff [1] --patience를 참고하십시오.
'merge-recursive'에게 다른 diff 알고리즘을 사용하도록 지시합니다. 중요하지 않은 매칭 라인 (뚜렷한 기능의 중괄호)으로 인해 발생하는 불일치를 피할 수 있습니다. 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도 참조하십시오.
'their'버전이 라인에 공백 변경 만 도입하면 'our'버전이 사용됩니다.
'our'버전이 공백 변경을 도입했지만 'their'버전이 상당한 변경을 포함하면 'their'버전이 사용됩니다.
그렇지 않으면 병합은 일반적인 방법으로 진행됩니다.
3 방향 병합을 해결할 때 가상 체크 아웃을 실행하고 파일의 모든 3 단계를 체크인합니다. 이 옵션은 다른 깨끗한 필터 또는 줄 끝 정규화 규칙으로 분기를 병합 할 때 사용하기위한 것입니다. 자세한 내용은 gitattributes [5]의 "checkin / checkout 속성이 다른 분기를 병합"을 참조하십시오.
재 정규화 옵션을 비활성화합니다. 이것은 merge. renormalize 구성 변수를 겹쳐 씁니다.
이름 바꾸기 감지 기능을 해제하십시오. git-diff [1] --no-renames도 참조하십시오.
이름 바꾸기 감지 기능을 켜고 필요에 따라 유사도 임계 값을 설정합니다. 이것이 기본값입니다. git-diff [1] --find-renames도 참조하십시오.
find-renames = & lt; n & gt;에 대한 더 이상 사용되지 않는 동의어입니다. .
이 옵션은보다 진보 된 형태의 '하위 트리 (subtree)'전략입니다. 이 전략은 병합 할 때 두 나무를 서로 맞춰야하는 방식을 추측합니다. 대신 지정된 경로가 두 개의 트리 모양을 일치시키기 위해 접두사로 사용됩니다 (또는 처음부터 제거됩니다).
이 경우 두 개 이상의 헤드가있는 경우는 해결되지만 수동으로 해결해야하는 복잡한 병합은 수행되지 않습니다. 주제 머리말을 함께 묶는 데 주로 사용됩니다. 둘 이상의 분기를 가져 오거나 병합 할 때 기본 병합 전략입니다.
이렇게하면 여러 개의 머리가 처리되지만 병합 된 트리는 항상 현재 분기 헤드의 트리이므로 다른 모든 분기의 모든 변경 사항을 무시합니다. 그것은 사이드 브랜치의 오래된 개발 이력을 대체하기 위해 사용됩니다. 이것은 '재귀 적'병합 전략에 대한 - Xours 옵션과 다릅니다.
이는 수정 된 재귀 적 전략입니다. 나무 A와 B를 병합 할 때 B가 A의 하위 트리에 해당하면 B는 먼저 같은 레벨의 나무를 읽지 않고 A의 트리 구조와 일치하도록 조정됩니다. 이 조정은 공통 조상 트리에서도 수행됩니다.
3- 방향 병합을 사용하는 전략 (기본값, '재귀 적'포함)을 사용하면 두 분기에서 변경이 이루어 지지만 나중에 분기 중 하나에서 되돌릴 경우 변경 내용이 병합 된 결과에 나타납니다. 어떤 사람들은이 행동이 혼란 스럽다는 것을 알게됩니다. 병합을 수행 할 때 헤드 및 병합베이스 만 고려되므로 개별 커밋이 고려되지 않기 때문에 발생합니다. 따라서 병합 알고리즘은 복귀 된 변경 사항을 전혀 변경되지 않은 것으로 간주하고 대신 변경된 버전으로 대체합니다.

힘내 합치기 전략 재귀 적
git-merge - 두 개 이상의 개발 기록을 함께 결합합니다.
기술.
그들의 커밋이 현재 브랜치에서 분기 된 이후로 명명 된 커밋의 변경 사항을 현재 브랜치에 반영합니다. 이 명령은 git pull이 다른 저장소의 변경 내용을 통합하는 데 사용되며 한 지점에서 다른 지점으로 변경 사항을 병합하기 위해 손으로 사용할 수 있습니다.
다음 기록이 존재하고 현재 분기가 "마스터"라고 가정합니다.
그런 다음 "git merge topic"은 마스터 (즉, E)에서 현재 커밋 (C)까지 마스터 분기와 분기 된 이후에 주제 분기에서 수행 된 변경 사항을 재생하고 그 결과를 이름과 함께 새로운 커밋에 기록합니다 두 개의 상위 커밋과 변경 사항을 설명하는 사용자의 로그 메시지가 표시됩니다.
두 번째 구문 ( "git merge --abort")은 병합 결과 충돌이 발생한 후에 만 ​​실행할 수 있습니다. git merge --abort는 병합 프로세스를 중단하고 병합 전 상태를 재구성합니다. 그러나 병합이 시작되었을 때 커밋되지 않은 변경 사항이있는 경우 (특히 병합이 시작된 후에 변경 사항이 추가로 수정 된 경우) git merge --abort는 경우에 따라 원래의 병합 변경 사항을 재구성 할 수 없습니다. 따라서:
경고 : 커밋되지 않은 커밋되지 않은 변경 사항으로 git merge를 실행하는 것은 권장하지 않습니다. 가능하면 충돌이 발생해도 복구가 어려울 수 있습니다.
네 번째 구문 ( "git merge --continue")은 병합이 충돌 한 후에 만 ​​실행할 수 있습니다.
병합을 수행하고 결과를 커밋하십시오. 이 옵션을 사용하여 --no-commit을 대체 할 수 있습니다.
--no-commit을 사용하면 병합을 수행하지만 병합을 실패한 것으로 가정하고 자동 커밋하지 않아 사용자가 커밋하기 전에 병합 결과를 검사하고 추가 조정할 수 있습니다.
성공적인 기계적 병합을 커밋하기 전에 편집기를 호출하여 자동 생성 된 병합 메시지를 추가로 편집하여 사용자가 병합을 설명하고 정당화 할 수 있도록합니다. --no-edit 옵션을 사용하여 자동 생성 된 메시지를 수락 할 수 있습니다 (일반적으로 권장하지 않음). --edit (또는 - e) 옵션은 명령 행에서 - m 옵션과 함께 초안 메시지를 제공하고 편집기에서 편집하려는 경우 여전히 유용합니다.
이전 스크립트는 사용자가 병합 로그 메시지를 편집하지 못하도록하는 이전 동작에 따라 달라질 수 있습니다. git merge를 실행할 때 열리는 편집기를 볼 수 있습니다. 이러한 스크립트를 업데이트 된 동작으로 쉽게 조정할 수 있도록 환경 변수 GIT_MERGE_AUTOEDIT는 시작 부분에서 no로 설정할 수 있습니다.
병합이 빨리 감기로 해결되면 병합 커밋을 만들지 않고 분기 포인터 만 업데이트하십시오. 이는 기본 동작입니다.
병합이 빨리 감기로 해결되는 경우에도 병합 커밋을 만듭니다. 주석이있는 (그리고 아마도 서명 된) 태그를 병합 할 때의 기본 동작입니다.
현재 HEAD가 이미 최신 상태이거나 병합을 빨리 감기로 해결할 수없는 경우가 아니면 0이 아닌 상태로 병합 및 종료를 거부합니다.
결과 병합 커밋에 GPG 서명하십시오. keyid 인수는 선택적이며 커미터 ID로 기본 설정됩니다. 지정된 경우 공백없이 옵션에 고정되어야합니다.
브랜치 이름 외에도 로그 메시지에 기껏해야 & lt; n & gt; 병합중인 실제 커밋 git-fmt-merge-msg [1]를 참고하십시오.
--no-log를 사용하면 병합중인 실제 커밋의 한 줄 설명을 나열하지 않습니다.
병합이 끝나면 diffstat를 표시합니다. diffstat도 구성 옵션 merge. stat에 의해 제어됩니다.
-n 또는 --no-stat를 사용하면 병합이 끝날 때 diffstat가 표시되지 않습니다.
실제 병합이 일어난 것처럼 작업 트리와 인덱스 상태를 생성하지만 (머지 정보 제외) 실제로 커밋하지 않고 HEAD를 이동하거나 $ GIT_DIR / MERGE_HEAD를 기록합니다 (다음 git commit 명령으로 병합 커밋). 이렇게하면 다른 브랜치 (또는 문어의 경우 더 많이)를 병합하는 것과 동일한 효과를 가지는 현재 브랜치의 맨 위에 단일 커밋을 생성 할 수 있습니다.
--no-squash를 사용하면 병합을 수행하고 결과를 커밋합니다. 이 옵션은 --squash를 무시하는 데 사용할 수 있습니다.
주어진 병합 전략을 사용하십시오. 시도해야하는 순서대로 지정하기 위해 두 번 이상 제공 할 수 있습니다. - s 옵션이 없으면 대신 내장 전략 목록이 사용됩니다 (단일 헤드를 병합 할 때 git merge-recursive, 그렇지 않으면 git merge-octopus).
-X & lt; 옵션 & gt; --strategy-option = & lt; 옵션 & gt;
병합 전략 특정 옵션을 통해 병합 전략에 전달하십시오.
병합중인 사이드 분기의 팁 커밋이 유효한 키, 즉 유효한 uid가있는 키로 서명되었는지 확인합니다. 기본 신뢰 모델에서는 서명 키가 신뢰할 수있는 키로 서명되었음을 의미합니다. 사이드 브랜치의 팁 커밋이 유효한 키로 서명되지 않으면 병합이 중단됩니다.
--stat와 --no-stat의 동의어; 이것들은 더 이상 사용되지 않으며 앞으로 제거 될 것입니다.
조용히 작동하십시오. 암시 - 진전 없음.
진행 상태를 명시 적으로 켜고 끕니다. 둘 다 지정하지 않으면 표준 오류가 터 L 널에 연결된 경우 진행이 표시됩니다. 모든 병합 전략이 진행률보고를 지원하지는 않습니다.
기본적으로 git merge 명령은 공통 조상을 공유하지 않는 기록을 병합하는 것을 거부합니다. 이 옵션은 생명을 독립적으로 시작한 두 프로젝트의 기록을 병합 할 때이 안전을 무시하는 데 사용할 수 있습니다. 매우 드물기 때문에 기본적으로이를 활성화하는 구성 변수가 없으므로 추가되지 않습니다.
Commit 로그 메시지의 끝에 Committer에 의해 Signed-by-by 행을 추가하십시오. 사인의 의미는 프로젝트에 따라 다르지만 일반적으로 커미터에게 동일한 라이선스로 저작물을 제출할 수있는 권한이 있으며 개발자 원산지 증명서 (개발자 인증서 참조)에 동의한다는 것을 증명합니다.
병합 커밋에 사용될 커밋 메시지를 설정합니다 (생성 된 경우).
--log가 지정되면 병합중인 커밋의 짧은 로그가 지정된 메시지에 추가됩니다.
git fmt-merge-msg 명령은 자동화 된 git merge 호출에 좋은 기본값을 제공하는 데 사용할 수 있습니다. 자동화 된 메시지에는 분기 설명이 포함될 수 있습니다.
가능하다면 rerere 메커니즘이 자동 충돌 해결의 결과로 색인을 갱신하도록하십시오.
현재 충돌 해결 프로세스를 중단하고 병합 전 상태를 재구성하십시오.
병합이 시작될 때 커밋되지 않은 작업 트리 변경 사항이 있으면 git merge --abort가 경우에 따라 이러한 변경 사항을 재구성 할 수 없습니다. 따라서 git merge를 실행하기 전에 변경 사항을 항상 커밋하거나 숨겨 두는 것이 좋습니다.
git merge --abort는 MERGE_HEAD가있는 경우 git reset --merge와 같습니다.
git merge가 충돌로 멈춘 후에는 git merge --continue를 실행하여 병합을 마칠 수 있습니다 (아래의 "충돌을 해결하는 방법"절 참조).
우리 지점으로 합병하기 위해 대개 다른 지점장을 임명합니다. 두 개 이상의 커밋을 지정하면 두 개 이상의 부모와 병합이 생성됩니다 (옥토 퍼스 병합이라고도 함).
명령 줄에서 커밋을하지 않으면 현재 분기가 업스트림으로 사용하도록 구성된 원격 추적 분기를 병합합니다. 이 매뉴얼 페이지의 설정 부분을 참고하십시오.
FETCH_HEAD (및 다른 커 L 트 없음)가 지정되면, 병합을 위해 git fetch를 이전에 호출하여. git / FETCH_HEAD 파일에 기록 된 브랜치가 현재 브랜치에 병합됩니다.
예비 병기 검사.
외부 변경 사항을 적용하기 전에 올바른 모양으로 작업하고 로컬로 커미트해야하므로 충돌이 발생해도 문제가 해결되지 않습니다. git-stash [1]를 참고하십시오. git pull 및 git merge는 로컬 uncommitted 변경이 git pull / git merge가 업데이트해야 할 수도있는 파일과 겹칠 때 아무 작업도하지 않고 중단됩니다.
헤더 커밋과 관련된 인덱스에 등록 된 변경 사항이 있으면 병합 커밋에서 관련이없는 변경 사항을 기록하지 않도록 git pull 및 git merge도 중단됩니다. (한 가지 예외는 변경된 색인 항목이 이미 병합 된 상태 일 때입니다.)
모든 명명 된 커밋이 이미 HEAD의 조상 인 경우 git 병합은 "Already up to date"메시지와 함께 일찍 종료됩니다.
신속한 병합.
종종 현재 브랜치 헤드는 명명 된 커밋의 조상입니다. 이것은 git pull에서 호출 할 때 가장 흔한 경우입니다. 업스트림 저장소를 추적하고 로컬 변경 사항을 커밋하지 않았으며 이제는 새로운 업스트림 리비전으로 업데이트하려고합니다. 이 경우, 새로운 커밋은 결합 된 히스토리를 저장하는 데 필요하지 않다; 대신, HEAD (색인과 함께)는 추가 병합 확약을 작성하지 않고 명명 된 확약을 가리 키도록 갱신됩니다.
이 동작은 --no-ff 옵션으로 생략 할 수 있습니다.
TRUE MERGE.
빨리 감기 병합 (위 참조)을 제외하고, 병합 할 브랜치는 부모를 모두 가진 병합 커밋에 의해 묶여 야합니다.
병합 할 모든 분기의 변경 사항을 조정하는 병합 버전이 커밋되고 HEAD, 색인 및 작업 트리가 커밋됩니다. 겹치지 않는 한 작업 트리를 수정할 수 있습니다. 업데이 트가 그들을 보존합니다.
변경 사항을 조정하는 방법이 명확하지 않으면 다음이 발생합니다.
HEAD 포인터는 그대로 유지됩니다.
MERGE_HEAD ref는 다른 브랜치 헤드를 가리 키도록 설정됩니다.
깔끔하게 병합 된 경로는 인덱스 파일과 작업 트리에서 모두 업데이트됩니다.
충돌하는 경로의 경우 색인 파일은 최대 세 가지 버전을 기록합니다. 1 단계는 공통 조상의 버전, HEAD의 2 단계, MERGE_HEAD의 3 단계를 저장합니다 (git ls-files - u를 사용하여 스테이지를 검사 할 수 있음). 작업 트리 파일에는 "병합"프로그램의 결과가 포함됩니다. 3-way merge) 결과를 친숙한 갈등 마커 (& lt; === & gt; & gt; & gt; .
다른 변경 사항은 없습니다. 특히 병합을 시작하기 전에 가지고 있던 로컬 수정 사항은 동일하게 유지되고 색인 항목은 그대로 남아 있습니다 (즉, HEAD 일치).
복잡한 충돌을 일으키고 다시 시작하려는 병합을 시도한 경우 git merge --abort를 사용하여 복구 할 수 있습니다.
머기 태그.
주석이 달린 (그리고 아마도 서명 된) 태그를 병합 할 때 Git은 빨리 감기 병합이 가능하다하더라도 항상 병합 커밋을 생성하고, 커밋 메시지 템플릿은 태그 메시지와 함께 준비됩니다. 또한 태그가 서명 된 경우 서명 확인은 메시지 템플리트에서 주석으로보고됩니다. git-tag [1]를 참고하십시오.
태그가 붙은 커밋으로 이어지는 작업과 통합하려는 경우 (예 : 업스트림 릴리스 포인트와 동기화 할 때 불필요한 병합 완료를 원하지 않을 수 있습니다.
이 경우, git merge에 넘기 전에 태그를 "unwrap"할 수 있고, 스스로 작업하지 않을 때만 - ff-pass를 전달할 수 있습니다. 예 :
충돌이 나타나기 시작합니다.
병합하는 동안 작업 트리 파일은 병합 결과를 반영하도록 업데이트됩니다. 공통 조상의 버전에 대한 변경 사항 중 중복되지 않는 항목 (즉, 파일의 영역을 변경하고 다른 영역은 그대로 남겨 두거나 그 반대의 경우도 마찬가지 임)은 최종 결과에 그대로 통합됩니다. 그러나 양측이 같은 영역을 변경하면 Git은 한쪽을 다른 쪽보다 무작위로 선택할 수 없으며 양측이 그 영역에 남긴 것을 남겨 두어 해결하도록 요청합니다.
기본적으로 Git은 RCS 제품군의 "병합"프로그램에서 사용하는 스타일과 동일한 스타일을 사용하여 다음과 같이 충돌하는 이러한 혼란을 표시합니다.
충돌하는 한 쌍의 변화가 발생한 영역은 & lt; & lt; & lt; & lt; & lt; & lt; & lt; , =======, & gt; & gt; & gt; & gt; & gt; & gt; & gt; . 그 부분은 전형적으로 당신 쪽이고, 그 부분은 전형적으로 그들 편입니다.
기본 서식에는 충돌 영역에서 원본이 말한 내용이 표시되지 않습니다. 얼마나 많은 줄이 삭제되어 바비의 발언으로 바뀌 었는지 말할 수 없습니다. 당신이 말할 수있는 유일한 것은 당신 측이 그것이 어렵다고 말하기를 원하고 당신이 쇼핑을 선호하는 반면, 다른 측은 그것이 쉽다는 것을 주장하기를 원한다는 것입니다.
"merge. conflictStyle"구성 변수를 "diff3"으로 설정하여 대체 스타일을 사용할 수 있습니다. "diff3"스타일에서는 위의 충돌이 다음과 같이 보일 수 있습니다.
또한, & lt; & lt; & lt; & lt; & lt; & lt; , =======, & gt; & gt; & gt; & gt; & gt; & gt; & gt; 다른 마커를 사용합니다. ||||||| 마커 다음에 원래 텍스트가옵니다. 당신은 원고가 사실을 진술했다고 말할 수 있고, 당신 측은 그 진술에 단순히 포기하고 포기하고 다른 측은보다 긍정적 인 태도를 취하려고했습니다. 원본을보고 더 나은 해상도를 얻을 수도 있습니다.
분쟁을 해결하는 방법.
충돌을 본 후에는 다음 두 가지 작업을 수행 할 수 있습니다.
병합하지 않기로 결정하십시오. 필요한 정리 작업은 인덱스 파일을 HEAD 커밋으로 재설정하여 2를 되돌리고 작업 트리 변경 사항을 2와 3으로 정리하는 것입니다. git merge --abort를 사용하면됩니다.
갈등을 해결하십시오. Git은 작업 트리의 충돌을 표시합니다. 파일을 모양으로 편집하고 git을 사용하여 색인에 추가하십시오. git commit 또는 git merge --continue를 사용하여 거래를 봉인하십시오. 후자의 명령은 git commit을 호출하기 전에 (중단 된) 병합 진행 여부를 확인합니다.
다음과 같은 여러 도구를 사용하여 충돌 문제를 해결할 수 있습니다.
병합 도구를 사용하십시오. git mergetool을 사용하여 병합을 통해 작동하는 그래픽 mergetool을 시작하십시오.
차이점을보세요. git diff는 HEAD 및 MERGE_HEAD 버전의 변경 사항을 강조하는 3 방향 diff를 보여줍니다.
각 지점에서 diff를보십시오. git log --merge - p & lt; path & gt; 먼저 HEAD 버전과 MERGE_HEAD 버전의 diff가 표시됩니다.
원본을보십시오. git show : 1 : filename은 일반적인 조상을 보여줍니다. git show : 2 : filename은 HEAD 버전을 나타내며 git show : 3 : filename은 MERGE_HEAD 버전을 보여줍니다.
현재 분기 맨 위에 분기 수정 사항과 향상된 기능을 병합하여 문어 병합을 만듭니다.
우리의 병합 전략을 사용하여 현재 분기에 쓸모없는 분기를 병합하십시오.
현재의 브랜치에 브랜치 maint를 병합 시키지만, 새로운 커밋을 자동으로 만들지는 마십시오 :
병합에 대한 추가 변경 사항을 포함하거나 자체 병합 완료 메시지를 작성하려는 경우에 사용할 수 있습니다.
병합 커밋에 대한 실질적인 변경 사항을 몰래 사용하려면이 옵션을 남용하지 마십시오. bumping release / version name과 같은 작은 픽스 업도 허용됩니다.
병합 전략.
병합 메커니즘 (git merge 및 git pull 명령)을 사용하면 - s 옵션을 사용하여 백엔드 병합 전략을 선택할 수 있습니다. 일부 전략은 자체 옵션을 취할 수도 있습니다. 이 옵션은 - X & lt; option & gt; 자식 병합 및 / 또는 자식 끌어 인수.
이렇게하면 3 방향 병합 알고리즘을 사용하여 두 개의 헤드 (즉, 현재 브랜치와 다른 브랜치)를 해결할 수 있습니다. 그것은 십자가 병합 모호성을 신중하게 탐지하려고 시도하며 일반적으로 안전하고 빠른 것으로 간주됩니다.
이 방법은 3 방향 병합 알고리즘을 사용하는 두 개의 헤드 만 해결할 수 있습니다. 3 방향 병합에 사용할 수있는 공통 조상이 둘 이상이면 공통 조상의 병합 된 트리를 만들어이를 3 방향 병합을위한 참조 트리로 사용합니다. 이는 Linux 2.6 커널 개발 이력에서 가져온 실제 병합 커밋에 대한 테스트로 인해 불일치가 발생하지 않고 병합 충돌이 줄어들 었다고보고되었습니다. 또한 이름 변경과 관련된 병합을 감지하고 처리 할 수 ​​있습니다. 하나의 분기를 가져 오거나 병합 할 때 기본 병합 전략입니다.
재귀 적 전략에는 다음과 같은 옵션이 있습니다.
이 옵션은 우리 버전을 선호함으로써 충돌하는 덩어리를 자동으로 자동 해결하도록합니다. 우리 쪽과 충돌하지 않는 다른 트리의 변경 사항이 병합 결과에 반영됩니다. 이진 파일의 경우 전체 내용이 우리 측에서 가져옵니다.
이것은 우리의 머지 전략과 혼동되어서는 안됩니다. 이 전략은 다른 트리가 전혀 포함하지 않는 것을 보지 않습니다. 그것은 다른 나무가 한 모든 것을 버리고 우리의 역사에는 그 안에 일어났던 모든 것이 들어 있다고 선언합니다.
이것은 우리와 반대입니다. 우리와 달리, 이 병합 옵션을 혼란스럽게하는 병합을 병합하는 것은 없습니다.
이 옵션을 사용하면 병합 - 재귀 적으로 약간의 시간을 소비하여 중요하지 않은 일치 행 (예 : 별개의 기능에서 오는 중괄호)으로 인해 발생하는 불일치를 피할 수 있습니다. 병합 할 분기가 격렬하게 갈라 졌을 때 이것을 사용하십시오. git-diff [1] --patience를 참고하십시오.
병합 - 재귀 적으로 다른 diff 알고리즘을 사용하도록 지정합니다. 중요하지 않은 매칭 라인 (뚜렷한 기능의 중괄호)으로 인해 발생하는 불일치를 피할 수 있습니다. 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도 참조하십시오.
그들의 버전이 라인에 공백 변경만을 도입한다면, 우리의 버전이 사용됩니다;
우리의 버전이 공백 변경을 도입했지만 그들의 버전이 상당한 변화를 포함한다면, 그들의 버전이 사용됩니다;
그렇지 않으면 병합은 일반적인 방법으로 진행됩니다.
3 방향 병합을 해결할 때 가상 체크 아웃을 실행하고 파일의 모든 3 단계를 체크인합니다. 이 옵션은 다른 깨끗한 필터 또는 줄 끝 정규화 규칙으로 분기를 병합 할 때 사용하기위한 것입니다. 자세한 내용은 gitattributes [5]의 "checkin / checkout 속성이 다른 분기를 병합"을 참조하십시오.
재 정규화 옵션을 비활성화합니다. 이것은 merge. renormalize 구성 변수를 겹쳐 씁니다.
이름 바꾸기 감지 기능을 해제하십시오. git-diff [1] --no-renames도 참조하십시오.
이름 바꾸기 감지 기능을 켜고 필요에 따라 유사도 임계 값을 설정합니다. 이것이 기본값입니다. git-diff [1] --find-renames도 참조하십시오.
find-renames = & lt; n & gt;에 대한 더 이상 사용되지 않는 동의어입니다. .
이 옵션은 병합 할 때 두 트리를 서로 맞춰야하는 방식을 추측하는 하위 트리 전략의 고급 형식입니다. 대신 지정된 경로가 두 개의 트리 모양을 일치시키기 위해 접두사로 사용됩니다 (또는 처음부터 제거됩니다).
이 경우 두 개 이상의 헤드가있는 경우는 해결되지만 수동으로 해결해야하는 복잡한 병합은 수행되지 않습니다. 주제 머리말을 함께 묶는 데 주로 사용됩니다. 둘 이상의 분기를 가져 오거나 병합 할 때 기본 병합 전략입니다.
이렇게하면 여러 개의 머리가 처리되지만 병합 된 트리는 항상 현재 분기 헤드의 트리이므로 다른 모든 분기의 모든 변경 사항을 무시합니다. 그것은 사이드 브랜치의 오래된 개발 이력을 대체하기 위해 사용됩니다. 이것은 재귀 병합 전략에 대한 - Xours 옵션과 다릅니다.
이는 수정 된 재귀 적 전략입니다. 나무 A와 B를 병합 할 때 B가 A의 하위 트리에 해당하면 B는 먼저 같은 레벨의 나무를 읽지 않고 A의 트리 구조와 일치하도록 조정됩니다. 이 조정은 공통 조상 트리에서도 수행됩니다.
3- 방향 병합을 사용하는 전략 (기본값, 재귀 포함)을 사용하면 두 분기에서 변경이 이루어 지지만 나중에 분기 중 하나에서 되돌릴 경우 변경 내용이 병합 된 결과에 나타납니다. 어떤 사람들은이 행동이 혼란 스럽다는 것을 알게됩니다. 병합을 수행 할 때 헤드 및 병합베이스 만 고려되므로 개별 커밋이 고려되지 않기 때문에 발생합니다. 따라서 병합 알고리즘은 복귀 된 변경 사항을 전혀 변경되지 않은 것으로 간주하고 대신 변경된 버전으로 대체합니다.
구성.
병합시 충돌 트리가 작업 트리 파일에 쓰여지는 스타일을 지정하십시오. 기본값은 & lt; & lt; & lt; & lt; & lt; & lt; & lt; & lt; 충돌 마커, 한쪽면의 변경 사항, ======= 마커면, 다른 쪽면의 변경 사항, 그리고 & gt; & gt; & gt; & gt; & gt; & gt; 채점자. 다른 스타일 인 "diff3"은 |||||||을 추가합니다. 마커와 원래 텍스트 앞에 ======= 마커가 있습니다.
커밋 인수없이 merge가 호출되면 원격 브랜치 분기에 저장된 마지막 관찰 값을 사용하여 현재 분기에 대해 구성된 업스트림 브랜치를 병합합니다. & lt; branch & gt;.remote라는 브랜치의 이름을 브랜치 & lt; current branch & gt;.remote에 의해 명명 된 리모트에서 브랜치의 이름을 붙이고 & lt; remote & gt;.fetch 해당 원격 추적 브랜치를 추적하고 이러한 추적 분기의 팁을 병합합니다.
기본적으로 Git은 현재 커밋의 자손 인 커밋을 병합 할 때 추가 병합 커밋을 생성하지 않습니다. 대신 현재 분기의 끝이 빨리 전달됩니다. false로 설정하면, 이 변수는 Git에게 그러한 경우에 여분의 병합 커밋을 생성하게합니다 (커맨드 라인에서 --no-ff 옵션을주는 것과 같습니다). only로 설정하면, 그러한 빨리 감기 병합 만 허용됩니다 (명령 행에서 --ff-only 옵션을주는 것과 같습니다).
분기 이름 외에도 로그 메시지에 연관된 분기 설명 텍스트를 채 웁니다. 기본값은 false입니다.
분기 이름 외에도 병합중인 실제 커밋의 지정된 수의 한 줄 설명으로 로그 메시지를 채 웁니다. 기본값은 false이고 true는 20의 동의어입니다.
병합 중에 이름 바꾸기 검색을 수행 할 때 고려해야 할 파일 수. 지정하지 않으면 diff. renameLimit 값이 기본값으로 사용됩니다.
저장소에서 파일의 표준 표현이 시간이 지남에 따라 변경되었음을 Git에게 알려줍니다 (예 : 이전 커밋은 CRLF 행 끝으로 텍스트 파일을 기록하지만 최근에는 LF 행 끝을 사용함). 이러한 저장소에서 Git은 불필요한 충돌을 줄이기 위해 병합을 수행하기 전에 커밋에 기록 된 데이터를 표준 형식으로 변환 할 수 있습니다. 자세한 내용은 gitattributes [5]의 "checkin / checkout 속성이 다른 분기를 병합"섹션을 참조하십시오.
병합 끝에서 ORIG_HEAD와 병합 결과 사이에 diffstat를 인쇄할지 여부. 기본값은 True입니다.
git-mergetool [1]이 병합 도구를 사용하는 방법을 제어합니다. 아래 목록은 유효한 내장 값을 보여줍니다. 다른 모든 값은 사용자 지정 병합 도구로 취급되며 해당하는 mergetool. & lt; tool & gt;.cmd 변수가 정의되어 있어야합니다.
재귀 적 병합 전략에 의해 표시되는 출력의 양을 제어합니다. 레벨 0은 충돌이 감지되면 최종 오류 메시지를 제외하고는 아무 것도 출력하지 않습니다. 레벨 1은 충돌 만 출력하고, 출력 충돌은 2 개, 파일 변경은 2 개입니다. 레벨 5 이상은 디버깅 정보를 출력합니다. 기본값은 레벨 2입니다. GIT_MERGE_VERBOSITY 환경 변수로 겹쳐 쓸 수 있습니다.
사용자 지정 저수준 병합 드라이버에 대한 사람이 읽을 수있는 이름을 정의합니다. 자세한 내용은 gitattributes [5]를 참조하십시오.
사용자 지정 저수준 병합 드라이버를 구현하는 명령을 정의합니다. 자세한 내용은 gitattributes [5]를 참조하십시오.
공통 조상간에 내부 병합을 수행 할 때 사용할 저수준 병합 드라이버를 명명합니다. 자세한 내용은 gitattributes [5]를 참조하십시오.
& lt; name & gt; 분기로 병합하기위한 기본 옵션을 설정합니다. 구문과 지원되는 옵션은 git merge의 옵션과 동일하지만 공백 문자가 포함 된 옵션 값은 현재 지원되지 않습니다.

힘내 합치기 전략 재귀 적
App Store를 통해 가져 오기 우리의 응용 프로그램 에서이 게시물을 읽으십시오!
다른 git merge 전략은 언제 사용 하시겠습니까?
git-merge의 man 페이지에는 사용할 수있는 여러 가지 병합 전략이 있습니다.
해결 - 3 방향 병합 알고리즘을 사용하여 두 개의 헤드 (즉, 현재 브랜치와 다른 브랜치) 만 해결할 수 있습니다. 그것은 십자가 병합 모호성을 신중하게 탐지하려고 시도하며 일반적으로 안전하고 빠른 것으로 간주됩니다.
재귀 적 - 3 방향 병합 알고리즘을 사용하여 두 개의 머리를 처리 할 수 ​​있습니다. 3 방향 병합에 사용할 수있는 공통 조상이 둘 이상이면 공통 조상의 병합 된 트리를 만들어이를 3 방향 병합을위한 참조 트리로 사용합니다. 이는 Linux 2.6 커널 개발 기록에서 가져온 실제 병합 커밋에 대한 테스트를 통해 잘못된 병합을 일으키지 않고 병합 충돌이 줄어들 었다고보고되었습니다. 또한 이름 변경과 관련된 병합을 감지하고 처리 할 수 ​​있습니다. 하나의 분기를 가져 오거나 병합 할 때 기본 병합 전략입니다.
octopus - 두 개 이상의 경우를 해결하지만 수동으로 해결해야하는 복잡한 병합을 거부합니다. 주제 머리말을 함께 묶는 데 주로 사용됩니다. 두 개 이상의 분기를 가져 오거나 병합 할 때 기본 병합 전략입니다.
ours - 이것은 여러개의 머리를 해결하지만, 병합의 결과는 항상 현재 가지 머리입니다. 그것은 사이드 브랜치의 오래된 개발 이력을 대체하기 위해 사용됩니다.
subtree - 수정 된 재귀 적 전략입니다. 나무 A와 B를 병합 할 때 B가 A의 하위 트리에 해당하면 B는 먼저 같은 레벨의 나무를 읽지 않고 A의 트리 구조와 일치하도록 조정됩니다. 이 조정은 공통 조상 트리에서도 수행됩니다.
기본값과 다른 것을 언제 지정해야합니까? 각각의 시나리오에 가장 적합한 것은 무엇입니까?
나는 해결에 익숙하지 않지만 다른 사람들을 사용했다.
순방향이 아닌 병합의 경우 재귀가 기본값입니다. 우리는 모두 그 점에 익숙합니다.
나는 합병 될 필요가있는 몇 개의 나무를 가지고있을 때 낙지를 사용했습니다. 많은 지사가 독자적으로 개발 한 대규모 프로젝트에서이를 볼 수 있으며 모든 것이 단일 헤드로 모일 준비가되었습니다.
문어 분기는 깔끔하게 할 수있는 한 여러 커밋을 병합합니다.
예를 들어 마스터가있는 프로젝트가 있고 병합 할 세 가지 분기가 있다고 상상해보십시오 (a, b, c라고 함).
일련의 재귀 적 병합은 다음과 같이 보일 것입니다 (재귀를 강제하지 않았으므로 첫 번째 병합은 빨리 감기 였음에 유의하십시오).
그러나 단일 문어 병합은 다음과 같이 보입니다.
우리의 생각 == 나는 다른 머리를 끌어 들이고 싶지만, 머리가 가져 오는 모든 변화를 버리십시오.
이것은 브랜치의 효과없이 브랜치의 히스토리를 유지합니다.
(읽기 : 브랜치 간의 변경 사항을 살펴 보지 않습니다. 브랜치는 병합되고 파일에는 아무 것도 수행되지 않습니다. 다른 브랜치에서 병합하고 싶을 때마다 "우리 파일 버전 또는 버전 "을 사용하면 git merge - X ours를 사용할 수 있습니다)
서브 트리는 다른 프로젝트를 현재 프로젝트의 서브 디렉토리에 병합하려는 경우에 유용합니다. 하위 모듈로 포함시키지 않으려는 라이브러리가있는 경우 유용합니다.
실제로 당신이 선택하고 싶은 유일한 두 가지 전략은 지점에 의한 변경을 포기하고 지점을 역사에 남겨두고 자한다면 독립 프로젝트를 수퍼 프로젝트의 하위 디렉토리에 병합하는 경우 서브 트리 ( 'git-gui'in ' git '저장소).
문어 병합은 두 개 이상의 분기를 병합 할 때 자동으로 사용됩니다. 해결 방법은 주로 역사적인 이유와 재귀 적 병합 전략 모서리 사례에 부딪혔을 때 주로 발생합니다.
"Resolve"와 "Recursive"병합 전략.
재귀 적 (recursive)은 현재 기본 2 헤드 전략이지만, 일부 검색 후에 마침내 "해결"병합 전략에 대한 정보를 찾았습니다.
원래 "해결"은 Git 병합의 기본 전략이었습니다.
가능한 병합 기준이 두 가지 이상인 교차 간 병합 상황에서 해결 전략은 다음과 같이 작동합니다. 가능한 병합 기준 중 하나를 선택하고 최선의 결과를 얻으십시오. 실제로 소리가 나쁘지는 않습니다. 사용자가 코드의 다른 부분을 작업하고있는 것으로 나타났습니다. 이 경우 Git은 이미 수행중인 변경 사항을 다시 검사하고 충돌을 피하면서 중복 된 변경 사항을 건너 뜁니다. 또는, 이것이 충돌을 일으키는 경미한 변경이라면 적어도 개발자가 처리 할 수있는 충돌이 있어야합니다.
나는 기본 재귀 전략으로 실패한 "해결"을 사용하여 나무를 성공적으로 병합했습니다. 나는 치명적이었다 : git write-tree는 트리 오류를 작성하지 못했고이 블로그 게시물 (미러) 덕분에 "-s resolve"를 시도했다. 나는 아직도 정확하게 이유를 모르겠다. 하지만 나는 두 나무에서 중복 된 변화가 있었기 때문에 그것이 적절하다고 생각했다.

МОДЕРАТОРЫ.
Reddit에 오신 것을 환영합니다.
인터넷의 첫 페이지.
수천 개의 커뮤니티 중 하나에 가입하십시오.
토론에 추가하고 싶습니까?
помощь правила сайта центр поддержки вики реддикет 모드 가이드 라인 связаться с нами.
приложенияи инструменты Reddit for iPhone Reddit for Android 모바일 웹 사이트 кнопки.
회신을 보내십시오. & # 32; & # 32; Политика конфиденциальности. &부; 2017 reddit 그래픽입니다. Все права защищены.
REDDIT 및 ALIEN 로고는 reddit inc의 등록 상표입니다.
& pi; & # 32;에 PID 100768로 렌더링 됨 app-323 & # 32; 2017-12-19 20 : 39 : 08.071930 + 00 : 00 9e1524e 국가 코드 : UA.

No comments:

Post a Comment