을 사용하여 주제 분기 “B”를 “A”로 병합하면 git merge
충돌이 발생합니다. “B”버전을 사용하여 모든 충돌을 해결할 수 있다는 것을 알고 있습니다.
알고 git merge -s ours
있습니다. 그러나 내가 원하는 것은와 같습니다 git merge -s theirs
.
왜 존재하지 않습니까? 기존 git
명령 과의 병합 충돌 후에 어떻게 동일한 결과를 얻을 수 있습니까? ( git checkout
B에서 병합되지 않은 모든 파일)
업데이트 : 지점 A (병합 커밋 지점 B의 트리 버전)에서 아무것도 버리는 “솔루션”은 내가 찾고있는 것이 아닙니다.
답변
에 -X
옵션을 추가하십시오 theirs
. 예를 들면 다음과 같습니다.
git checkout branchA
git merge -X theirs branchB
모든 것이 원하는 방식으로 병합됩니다.
내가 본 유일한 문제는 파일이 branchB에서 삭제 된 경우입니다. git 이외의 것이 제거를 수행하면 충돌로 나타납니다.
수정이 쉽습니다. git rm
삭제 된 파일 이름으로 실행 하십시오.
git rm {DELETED-FILE-NAME}
그 후, -X theirs
예상대로 작동합니다.
물론, git rm
명령 을 사용하여 실제 제거를 수행 하면 처음부터 충돌이 발생하지 않습니다.
참고 : 더 긴 양식 옵션도 있습니다.
사용하려면 다음을 교체하십시오.
-X theirs
와:
--strategy-option=theirs
답변
지점 B를 체크 아웃 한 지점 A에 병합하기위한 가능한 테스트 된 솔루션 :
# in case branchA is not our current branch
git checkout branchA
# make merge commit but without conflicts!!
# the contents of 'ours' will be discarded later
git merge -s ours branchB
# make temporary branch to merged commit
git branch branchTEMP
# get contents of working tree and index to the one of branchB
git reset --hard branchB
# reset to our merged commit but
# keep contents of working tree and index
git reset --soft branchTEMP
# change the contents of the merged commit
# with the contents of branchB
git commit --amend
# get rid off our temporary branch
git branch -D branchTEMP
# verify that the merge commit contains only contents of branchB
git diff HEAD branchB
이를 자동화하기 위해 branchA 및 branchB를 인수로 사용하여 스크립트로 랩핑 할 수 있습니다.
이 솔루션은 예상 한대로 병합 커밋의 첫 번째와 두 번째 부모를 유지합니다 git merge -s theirs branchB
.
답변
이전 버전의 git에서는 “그들의”병합 전략을 사용할 수있었습니다.
git pull --strategy=theirs remote_branch
그러나 Junio Hamano (Git 관리자) 가이 메시지에서 설명한 대로이 기능 은 삭제되었습니다 . 링크에서 언급했듯이 대신 다음을 수행하십시오.
git fetch origin
git reset --hard origin
그러나 이것은 실제 병합과는 다릅니다. 귀하의 솔루션은 아마도 당신이 정말로 찾고있는 옵션 일 것입니다.
답변
원하는 결과가 무엇인지 명확하게 알 수 없으므로 답변과 의견에 “올바른”방법을 사용하는 것에 대해 약간의 혼란이 있습니다. 개요를 제공하려고 시도하고 다음 세 가지 옵션을 봅니다.
병합을 시도하고 충돌에 B를 사용하십시오.
입니다 하지 은 “에 대한 그들의 버전 git merge -s ours
“하지만 “에 대한 그들의 버전 git merge -X ours
(대한 짧은” git merge -s recursive -X ours
) :
git checkout branchA
# also uses -s recursive implicitly
git merge -X theirs branchB
예를 들어 Alan W. Smith의 답변 이 이에 해당합니다.
B의 컨텐츠 만 사용
이렇게하면 두 분기 모두에 대해 병합 커밋이 만들어 지지만의 모든 변경 사항은 버리고 branchA
내용 만 유지됩니다 branchB
.
# Get the content you want to keep.
# If you want to keep branchB at the current commit, you can add --detached,
# else it will be advanced to the merge commit in the next step.
git checkout branchB
# Do the merge an keep current (our) content from branchB we just checked out.
git merge -s ours branchA
# Set branchA to current commit and check it out.
git checkout -B branchA
이제 첫 번째 상위 커밋 커밋은 from branchB
이고 두 번째 만 from branchA
입니다. 이것이 예를 들어 간달프 458의 답변 입니다.
B의 콘텐츠 만 사용하고 올바른 부모 순서를 유지하십시오.
이것은 “의 실제 버전 git merge -s ours
“입니다. 이 같은 전에 옵션 등의 내용 (즉,에서, 즉에만있다 branchB
)하지만를 부모의 순서가 올바른, 즉 최초의 부모로부터 온다 branchA
과에서 두 번째 branchB
.
git checkout branchA
# Do a merge commit. The content of this commit does not matter,
# so use a strategy that never fails.
# Note: This advances branchA.
git merge -s ours branchB
# Change working tree and index to desired content.
# --detach ensures branchB will not move when doing the reset in the next step.
git checkout --detach branchB
# Move HEAD to branchA without changing contents of working tree and index.
git reset --soft branchA
# 'attach' HEAD to branchA.
# This ensures branchA will move when doing 'commit --amend'.
git checkout branchA
# Change content of merge commit to current index (i.e. content of branchB).
git commit --amend -C HEAD
이것이 Paul Pladijs의 답변입니다 (임시 지점 필요 없음).
답변
지금부터 Paul Pladijs의 답변을 사용했습니다. “정상”병합을 수행 할 수 있으며 충돌이 발생하므로
git checkout --theirs <file>
다른 지점의 개정판을 사용하여 충돌을 해결합니다. 각 파일에 대해이 작업을 수행하면 예상 한 것과 동일한 동작이 나타납니다.
git merge <branch> -s theirs
어쨌든 노력은 합병 전략보다 더 중요합니다! (이것은 자식 버전 1.8.0에서 테스트되었습니다)
답변
나는 내 문제를 해결했다.
git checkout -m old
git checkout -b new B
git merge -s ours old
답변
git merge를 사용하여 “A”의 주제 분기 “B”를 병합하면 충돌이 발생합니다. “B”버전을 사용하여 모든 충돌을 해결할 수 있음을 알고 있습니다.
git merge -s 우리를 알고 있습니다. 그러나 내가 원하는 것은 git merge> -s와 같은 것입니다.
마스터에서 브랜치를 생성하고 마스터로 다시 병합하여 마스터의 이전 항목을 재정의하려고한다고 가정합니다. 그것이 내가이 포스트를 만났을 때하고 싶었던 바로 그 것입니다.
한 지점을 다른 지점으로 먼저 병합하는 것을 제외하고는 원하는 작업을 정확하게 수행하십시오. 방금이 작업을 수행했으며 훌륭하게 작동했습니다.
git checkout Branch
git merge master -s ours
그런 다음 마스터를 체크 아웃하고 분기를 병합하십시오 (지금 원활하게 진행됨).
git checkout master
git merge Branch