“git merge -s ours”의 “그들”버전이 있습니까? 병합하면 git merge충돌이 발생합니다. “B”버전을 사용하여 모든

을 사용하여 주제 분기 “B”를 “A”로 병합하면 git merge충돌이 발생합니다. “B”버전을 사용하여 모든 충돌을 해결할 수 있다는 것을 알고 있습니다.

알고 git merge -s ours있습니다. 그러나 내가 원하는 것은와 같습니다 git merge -s theirs.

왜 존재하지 않습니까? 기존 git명령 과의 병합 충돌 후에 어떻게 동일한 결과를 얻을 수 있습니까? ( git checkoutB에서 병합되지 않은 모든 파일)

업데이트 : 지점 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