많은 충돌이있을 수있는 원격 지점에서 병합하고 있습니다. 충돌 여부를 어떻게 알 수 있습니까?
나는 같은 것을 표시되지 않습니다 --dry-run
에를 git-merge
.
많은 충돌이있을 수있는 원격 지점에서 병합하고 있습니다. 충돌 여부를 어떻게 알 수 있습니까?
나는 같은 것을 표시되지 않습니다 --dry-run
에를 git-merge
.
답변:
앞에서 언급했듯이 --no-commit
플래그를 전달 하지만 빨리 감기 커밋을 피하려면 다음 --no-ff
과 같이 전달하십시오 .
$ git merge --no-commit --no-ff $BRANCH
단계적 변경 사항을 검토하려면 다음을 수행하십시오.
$ git diff --cached
빨리 감기 병합 인 경우에도 병합을 취소 할 수 있습니다.
$ git merge --abort
git merge --only-if-there-wont-be-any-conflicts
하거나 git diff --show-conflicts <commit>
유용 할 것입니다. 아직 안타까운 일이 있거나 뭔가 빠졌습니까?
git pull --ff-only
!
리포지토리와 원격 장치 간의 충돌을 자동으로 찾는 방법을 구현해야했습니다. 이 솔루션은 메모리에서 병합을 수행하므로 인덱스 또는 작업 트리를 건드리지 않습니다. 나는 이것이 당신 이이 문제를 해결할 수있는 가장 안전한 방법이라고 생각합니다. 작동 방식은 다음과 같습니다.
git fetch origin master
git merge-base FETCH_HEAD master
git merge-tree mergebase master FETCH_HEAD
( mergebase 는 이전 단계에서 merge-base가 인쇄 한 16 진수 ID입니다)이제 원격 마스터를 로컬 마스터와 병합하려고하지만 모든 브랜치를 사용할 수 있다고 가정하십시오. git merge-tree
메모리에서 병합을 실행하고 결과를 표준 출력에 인쇄합니다. 패턴에 대한 GREP <<
나 >>
. 또는 출력을 파일로 인쇄하여 확인할 수 있습니다. '둘 다 변경됨'으로 시작하는 행을 찾으면 충돌이있을 수 있습니다.
git merge-tree `git merge-base FETCH_HEAD master` FETCH_HEAD master
git merge-tree `git merge-base clieop master` clieop master | grep -A3 "changed in both"
Simply awesome! +100
+<<<<<<< .our
나는 같은 GREP 표현식을 사용하므로grep -q '^+<* \.our$'
이것에 대한 나의 단순한 무차별 해결책은 다음과 같습니다.
"사전 마스터"브랜치 작성 (마스터에서)
원하는 모든 것을이 프리 마스터에 병합하십시오.
그러면 마스터를 건드리지 않고 병합이 어떻게되었는지 확인할 수 있습니다.
어쨌든 @ orange80의 조언을 따르겠습니다.
git merge --abort
충돌 git reset --hard HEAD~1
이 있거나 병합이있는 경우 언제든지 할 수 있습니다 git reset --hard origin/master
. 다른 브랜치를 생성하면 안전감을 느낄 수 있지만 git의 작동 방식을 배우면 잘못 배치 된 두려움이라는 것을 알 수 있습니다. 작업 사본을 변경하지 않는 것이 우려되는 경우에는 해결책이 없습니다.
git merge --no-commit
빨리 감기 할 수 있으면 병합을 중단하지 않습니다. git merge --abort
병합 된 경우 작동하지 않습니다. 이것을 스크립트로 작성 git merge
하려면 다른 유형의 충돌을 설명하기에 충분한 오류 코드로 응답하지 않기 때문에 어색 합니다. 새로운 브랜치를 사용하면 손상된 스크립트가 리포지토리를 수동 개입이 필요한 상태로 유지하지 못합니다. 물론 당신은 아무것도 잃을 수 없습니다. 그러나 다른 방식으로 구축하는 것이 더 쉽습니다.
git과의 병합을 취소하는 것은 너무 쉬워서 드라이 런에 대해 걱정하지 않아도됩니다.
$ git pull $REMOTE $BRANCH
# uh oh, that wasn't right
$ git reset --hard ORIG_HEAD
# all is right with the world
편집 : 아래 주석에서 언급했듯이 작업 디렉토리 또는 준비 영역에 변경 사항이 있으면 위의 작업을 수행하기 전에 숨길 수 있습니다 (그렇지 않으면 위의 경우 사라집니다 git reset
)
git branch --contains HEAD
직접 또는 더 직접 목록을 확인하는 문제입니다.git merge --ff-only
--dry-run
"병합이 빨리 진행되는지 간단히 확인"하지 않습니다. 병합은 파일, 충돌 등의 정확한 결과를 반환합니다. ff가 실제로 흥미롭지 않습니까?
git stash; git reset --hard
? @BrianPhillips
나는 이것을하기위한 별칭을 만들고 매력처럼 작동합니다.
git config --global alias.mergetest '!f(){ git merge --no-commit --no-ff "$1"; git merge --abort; echo "Merge aborted"; };f '
이제 난 그냥 전화
git mergetest <branchname>
충돌이 있는지 확인합니다.
현재 브랜치를 원격 브랜치와 비교하면 풀 / 병합시 변경되는 내용이 표시됩니다.
#see diff between current master and remote branch
git diff master origin/master
request-pull git 명령을 사용하여 그렇게합니다. 병합 할 때 발생할 수있는 모든 변경 사항을 볼 수 있지만 로컬 또는 원격 리포지토리에서 아무 작업도 수행하지 않습니다 .
예를 들어 "feature-x"라는 브랜치를 마스터 브랜치에 병합한다고 가정합니다.
git request-pull master origin feature-x
(어떤 일도하지 않고) 일어날 일에 대한 요약을 보여줍니다 :
The following changes since commit fc01dde318:
Layout updates (2015-06-25 11:00:47 +0200)
are available in the git repository at:
http://fakeurl.com/myrepo.git/ feature-x
for you to fetch changes up to 841d3b41ad:
----------------------------------------------------------------
john (2):
Adding some layout
Refactoring
ioserver.js | 8 +++---
package.json | 7 +++++-
server.js | 4 +--
layout/ldkdsd.js | 277 +++++++++++++++++++++++++++++++++++++
4 files changed, 289 insertions(+), 7 deletions(-)
create mode 100644 layout/ldkdsd.js
-p
매개 변수 를 추가하면 변경된 모든 파일에 대해 git diff를 수행하는 것과 마찬가지로 전체 패치 텍스트가 표시됩니다.
master
와 origin
명령 줄 옵션에서 수행하고 제가 지방에 예를 들어 나는 경우에 대해 branch1
하고 싶지 request-pull
로컬 기능 분기에 branch2
? 여전히 필요 origin
합니까? 물론, 항상 문서를 읽을 수 있습니다.
아직 패치 사용을 제안한 사람이 아무도 없습니다.
당신이에서 병합을 테스트하고 싶은 말 your_branch
에 master
(난 당신이 있으리라 믿고있어 master
체크 아웃) :
$ git diff master your_branch > your_branch.patch
$ git apply --check your_branch.patch
$ rm your_branch.patch
그 트릭을해야합니다.
다음과 같은 오류가 발생하면
error: patch failed: test.txt:1
error: test.txt: patch does not apply
이는 패치가 성공하지 못했으며 병합으로 인해 충돌이 발생했음을 의미합니다. 출력이 없다는 것은 패치가 깨끗하고 브랜치를 쉽게 병합 할 수 있음을 의미합니다
이것은 실제로 작업 트리를 변경 하지는 않습니다 (물론 패치 파일을 만드는 것 외에도 나중에 안전하게 삭제할 수 있습니다). git-apply 문서에서 :
--check
Instead of applying the patch, see if the patch is applicable to the
current working tree and/or the index file and detects errors. Turns
off "apply".
나보다 git에 대해 더 똑똑하고 경험이 많은 사람에게주의하십시오. 여기서 내가 틀렸다면 알려주십시오.이 방법은 일반 병합과 다른 동작을 보여줍니다. 8 년 이상이 질문이 존재했다는 것은 아무도이 겉보기에 명백한 해결책을 제시하지 않을 것입니다.
git diff master your_branch | git apply --check
.
이것은 흥미로울 수 있습니다 : 문서에서 :
복잡한 충돌을 일으킨 병합을 시도하고 다시 시작하려는 경우 git merge --abort로 복구 할 수 있습니다 .
그러나 순진하지만 느린 방법으로도 할 수 있습니다.
rm -Rf /tmp/repository
cp -r repository /tmp/
cd /tmp/repository
git merge ...
...if successful, do the real merge. :)
(참고 : 커밋되지 않은 변경 사항이 충돌하지 않도록하려면 / tmp로 복제하는 것만으로는 작동하지 않습니다. 사본이 필요합니다).
cp -r repository/.git /tmp/repository/.git
, cd /tmp/repository
, git reset --hard
, git add --all
, git reset --hard
(좋은 측정을 위해), git status
(가 깨끗하는지 확인합니다).
나는 이것이 오래된 질문이라는 것을 알고 있지만 Google 검색에 처음으로 나타납니다.
Git은 병합 할 때 --ff-only 옵션을 도입했습니다.
보낸 사람 : http://git-scm.com/docs/git-merge
--ff 전용
현재 HEAD가 이미 최신 상태이거나 병합을 빨리 진행할 수있는 경우가 아니면 0이 아닌 상태로 병합 및 종료를 거부하십시오.
이렇게하면 병합 및 빨리 감기가 시도되고, 실패하면 빨리 감기를 수행 할 수 없다는 메시지가 표시되고 작업 분기는 그대로 둡니다. 빨리 감을 수 있으면 작업 지점에서 병합을 수행합니다. 이 옵션은에서 사용할 수 있습니다 git pull
. 따라서 다음을 수행 할 수 있습니다.
git pull --ff-only origin branchA #See if you can pull down and merge branchA
git merge --ff-only branchA branchB #See if you can merge branchA into branchB