programing

"git merge - s our"의 "they" 버전이 있습니까?

cafebook 2023. 4. 19. 00:20
반응형

"git merge - s our"의 "they" 버전이 있습니까?

브랜치 를 「A」로 결합할 때, 「B」를 사용해 「.git merge 갈등도 생기고요.모든 갈등은 "B" 버전으로 해결할 수 있다는 것을 알고 있습니다.

있다git merge -s ours지지가 . . . . . . . . . . . 。git merge -s theirs.

왜재 지지 ?? ??? 후에 같은 수 은 무엇입니까?git ( )git checkoutB-R-R-R-R-R-R-R-R-R-R-R-R-R-R-R-R-R-R-R-R-R-R-R)

브런치 A(트리의 B 버전에 대한 결합 커밋 포인트)에서 임의의 것을 폐기하는 "솔루션"은 제가 원하는 솔루션이 아닙니다.

비슷한 대안은 다음과 같습니다.--strategy-option 형식)-X ) ( )를 받아들입니다.theirs §:

git checkout branchA
git merge -X theirs branchB

은 더 , 더 많이, 더 많이, 더 많이, 더 많이, 더 많이, 더 많이, 더 많이, 더 많이, 더 많이, 더 많이, 더 많이.-X ours-s ours중요한 차이점은-X머지를 쪽을 , 「재귀 머지」는 「재귀 머지」를 사용합니다.-s ours머지를 변경하여 상대방을 완전히 무시합니다.

, 을 사용하는 주된 가 되는 경우도 있습니다.-X theirs-s theirs삭제된 파일입니다. 「」를 실행해 .git rm삭제한 파일의 이름을 지정합니다.

git rm {DELETED-FILE-NAME}

후, ,,는-X theirs예상대로 동작할 수 있습니다.

실제 는 ★★★★★★★★★★★★★★★★★★★★★★★★★★★.git rm명령을 실행하면 충돌이 처음부터 발생하지 않습니다.

지점 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를 인수로 사용하여 스크립트로 랩할 수 있습니다.

이 첫두 번째 은, 「 Commit」의 경우와 .이것은 예상대로입니다.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 oursgit 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

는 merge commit first parent라는 에 주의해 주십시오.branchB 두 만 '두 번째'에서 온 거예요branchA예를 들어 다음과 같습니다.간달프458의 대답은 그렇다.

B의 콘텐츠만 사용하고 올바른 부모 순서를 유지합니다.

s for 게게 그그 그그 this그 this this this this for this'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의 답변이 (일시적인 분기를 필요로 하지 않고) 하는 입니다.

특수한 경우

branchB의 조상이다.branchA,git merge는 동작하지 않습니다(「Already up up」등의 메세지로 종료됩니다).

이 경우 또는 기타 유사/고도의 경우 low-level 명령을 사용할 수 있습니다.

나는 지금부터 Paul Pladijs의 답을 사용했다.'정상적인' 머지를 할 수 있다는 것을 알게 되었습니다.경합이 일어나면

git checkout --theirs <file>

다른 브랜치의 리비전을 사용하여 경합을 해결합니다.각 파일에 대해 이 작업을 수행할 경우,

git merge <branch> -s theirs

어쨌든, Marge-Strategy에 의한 노력보다! (git 버전 1.8.0으로 테스트 완료)

git merge를 사용하여 "A"의 토픽 브랜치 "B"를 Marge하면 충돌이 발생합니다.모든 경합은 "B" 버전을 사용하여 해결할 수 있습니다.

나는 git merge-s 우리 것을 알고 있다.하지만 제가 원하는 것은 git merge >-s 그들의 것입니다.

마스터에서 분기를 만들고 마스터에 다시 병합하여 마스터에 있는 이전 항목을 덮어쓰려고 합니다.내가 이 게시물을 접했을 때 바로 그것이 내가 하고 싶었던 것이다.

한 분기를 다른 분기에 먼저 병합하는 경우를 제외하고 원하는 대로 정확하게 수행하십시오.방금 했는데 잘 되더라고요.

git checkout Branch
git merge master -s ours

그런 다음 마스터를 체크 아웃하고 브랜치를 통합합니다(이제 원활하게 진행됩니다).

git checkout master
git merge Branch

문제를 해결했습니다.

git checkout -m old
git checkout -b new B
git merge -s ours old

지점 A에 있는 경우 다음을 수행합니다.

git merge -s recursive -X theirs B

git 버전 1.7.8에서 테스트 완료

왜 존재하지 않는 거죠?

"git 명령어"에서 설명한 바와 같이 어떤 브랜치를 다른 브랜치처럼 만드는 방법git merge -s theirsGit 2.15(2017년 4분기)가 명확해졌습니다.

의 매뉴얼-X<option>marges는 다음과 같이 잘못 기재되어 있습니다.-s theirs"는 존재하지만 그렇지 않습니다.

Junio C Hamano()gitster의 commit c25d98b(2017년 9월 25일)를 참조하십시오.
(2017년 9월 28일 Junio C Hamano에 의해 병합)

"merge-strategy: "merge-strategy"가 합니다.-s theirs하다'

-Xours에는 merge와 merge가 것을 .-s ours만, (의 )-Xtheirs에 무심코 ''는 '이거 다'라고되어 있어요.ours, 독자들에게도 할 필요가 있다는 을 알려주고 있습니다-s theirs실제로 존재하지도 않는 것.

-Xtheirs는 재귀적 전략에 적용되는 전략 옵션입니다.즉, 재귀적 전략은 가능한 모든 것을 병합하고 "로 되돌아갈 뿐입니다.theirs충돌 시 논리.

theirs합병 전략은 최근 2017년 9월 스레드에서 다시 도입되었습니다.
오래된(2008) 스레드를 인식합니다.

앞의 는 ' 않는다 원하지 않는다'로할 수 .-s theirs잘못된 워크플로우를 장려하기 때문입니다."

에일리어스에 대해 설명합니다.

mtheirs = !sh -c 'git merge -s ours --no-commit $1 && git read-tree -m -u $1' -

야로슬라브 할첸코는 다시 한번 그 전략을 옹호하려 하지만 주니오 C. Hamano는 다음과 같이 덧붙입니다.

우리와 그들의 역사가 대칭적이지 않은 이유는 그들이 아니라 당신이기 때문입니다-우리 역사와 그들의 역사의 통제와 소유권은 대칭적이지 않습니다.

그들의 이력이 메인라인이라고 판단되면 개발라인을 사이드브런치로 취급하여 그 방향으로 머지하는 것이 좋습니다.즉, 머지의 첫 번째 부모는 그 이력에 대한 커밋이고 두 번째 부모는 당신의 이력에 대한 마지막 나쁜 부모입니다. 해서 '어울릴 수 없다'라는 표현을쓰게 .checkout their-history && merge -s ours your-history부모로서의 분별력을 유지하기 위해.

때 '아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아.-s ours는 더 '어울리지 않는', '어울리지 않는', '어울리지 않는', '어울리지 않는', ' 않는', '어울리지 않는',-s theirs
이는 원하는 의미론의 적절한 부분, 즉 살아남은 표준 이력 라인의 관점에서 당신은 다른 역사 라인이 것을 무효화하면서 그것이 것을 보존하기를 원한다.

Mike Beaton의 코멘트에 의하면, Junio는 다음과 같이 덧붙입니다.

git merge -s ours <their-ref> 커밋은 '어느 '으로 되어 있습니다.<their-ref>영구히 무시해야 할 커밋으로 지점에 배치한다.';
그 후 브런치 상태를 Marge하면 나중에 변경 내용이 무시된 변경 내용이 반영되지 않고 나중에 변경 내용이 반영되기 때문입니다.

Marge할 브랜치로부터의 입력만 받는 Marge를 실제로 올바르게 수행하려면 다음과 같이 하십시오.

git merge --strategy=ours ref-to-be-merged

git diff --binary ref-to-be-merged | git apply --reverse --index

git commit --amend

제가 알고 있는 시나리오에서는 경합이 발생하지 않으며, 브랜치를 추가할 필요도 없으며, 통상의 머지 커밋과 같이 동작합니다.

이것은 서브모듈에서는 잘 동작하지 않습니다.

Junio Hamano가 널리 인용한 답변을 참조하십시오.커밋된 콘텐츠를 폐기하려면 커밋을 폐기하거나 적어도 주요 이력에 관여하지 마십시오.왜 미래의 모든 사람들이 아무것도 제공할 것이 없는 커밋 메시지들을 읽도록 귀찮게 하는가?

그러나 때로는 관리상의 요건이 있거나 다른 이유가 있을 수 있습니다.아무것도 기여하지 않는 커밋을 기록해야 하는 상황에서는 다음을 수행합니다.

(편집: 와, 내가 이걸 틀렸나?이것은 동작합니다.)

git update-ref HEAD $(
        git commit-tree -m 'completely superseding with branchB content' \
                        -p HEAD -p branchB    branchB:
)
git reset --hard

이것은 git cappling 명령어 read-tree를 사용하지만 전체적인 워크플로우를 단축합니다.

git checkout <base-branch>

git merge --no-commit -s ours <their-branch>
git read-tree -u --reset <their-branch>
git commit

# Check your work!
git diff <their-branch>

git merge -s their branch B'와 동등한 값(부모 순서를 유지함)

병합 여기에 이미지 설명 입력전:

!!! 클린 스테이트인 것을 확인해 주세요!!

병합을 수행합니다.

git commit-tree -m "take theirs" -p HEAD -p branchB 'branchB^{tree}'
git reset --hard 36daf519952 # is the output of the prev command

우리가 뭘 했더라?우리는 새로운 커밋을 만들었습니다.이 커밋의 컨텐트는 브랜치B입니다-그들의 것입니다.

병합 여기에 이미지 설명 입력후:

보다 정확하게는:

git commit-tree -m "take theirs" -p HEAD -p 'SOURCE^{commit}' 'SOURCE^{tree}'

이 대답은 Paul Pladijs에 의해 나왔다.나는 단지 그의 명령을 받고 편의를 위해 git 별칭을 만들었다.

.gitconfig를 편집하고 다음을 추가합니다.

[alias]
    mergetheirs = "!git merge -s ours \"$1\" && git branch temp_THEIRS && git reset --hard \"$1\" && git reset --soft temp_THEIRS && git commit --amend && git branch -D temp_THEIRS"

그런 다음 다음 다음 작업을 수행하여 "마지 - 사용자 A"를 병합할 수 있습니다.

git checkout B (optional, just making sure we're on branch B)
git mergetheirs A

당신이 정말 원하는 건

git checkout -B mergeBranch branchB
git merge -s ours branchA
git checkout branchA
git merge mergeBranch
git branch -D mergeBranch

어설프게 들리지만 잘 될 겁니다.내가 이 솔루션에 대해 정말 싫어하는 유일한 생각은 git 이력이 혼란스러울 것이라는 것이다.다만, 이력은 완전하게 보존되기 때문에, 삭제한 파일에 대해서 특별한 조작을 실시할 필요는 없습니다.

기존 baseBranch의 newBranch가 Marge됩니다.

git checkout <baseBranch> // this will checkout baseBranch
git merge -s ours <newBranch> // this will simple merge newBranch in baseBranch
git rm -rf . // this will remove all non references files from baseBranch (deleted in newBranch)
git checkout newBranch -- . //this will replace all conflicted files in baseBranch

이 오래된 질문을 다시 생각해 보면, 짧고 자기 명령어만 사용하기 때문에 이해하기 쉬운 솔루션을 방금 발견했기 때문입니다.하기 에 기재되어 있는 싶습니다(해 주세요).git merge -s theirs질문 본문이 아닙니다. 두 .

# Start from the branch that is going to receive the merge.
git switch our_branch

# Create the merge commit, albeit with the wrong tree.
git merge -s ours their_branch

# Replace our working tree and our index with their tree.
git restore --source=their_branch --worktree --staged :/

# Put their tree in the merge commit.
git commit --amend

경고:git restore2.git 2.23에 된 상당히 명령어입니다. git help restore

이 명령어는 실험적인 것입니다.동작이 바뀔 수 있습니다.

저는 이 방법을 여러 버전의 git(2.25.1, 2.30.2, 2.31.1, 2.34.1, 2.35.1)로 테스트했고 예상대로 작동했습니다.

이것이 반드시 원래의 포스터의 질문에 대답하는 것은 아니지만, 저는 이미 Marge를 시도했지만 갈등으로 끝난 상황에 놓였습니다.보통은 IDE에서 경합을 관리하지만, 이 경합에 액세스 할 수 없는 경우는, 다음의 REGEX 를 사용해 「그들의」콘텐츠와의 차이를 찾아 치환할 수 있습니다.

「」를 리셉스 합니다.<<<<<<< HEAD\n[^•>]+\n=======\n([^•>]+)>>>>>>> .+\n\1

(저와 같은 이유로 다른 사람이 이 페이지에 접속할 경우를 대비해서)

최근 이 작업을 공통 이력을 공유하는 두 개의 개별 저장소에 대해 수행해야 했습니다.처음에:

  • Org/repository1 master
  • Org/repository2 master

는 모든 .repository2 masterrepository1 masterrepository2가 실행하는 모든 변경을 받아들입니다.git의 용어로 말하면, 이것은 라고 불리는 전략이어야 한다.-s theirs하지만 그것은 존재하지 않는다.하세요.-X theirs원하는 대로 이름이 붙여지지만, 동일하지 않습니다(man 페이지에도 해당됨).

은 이이 to to to로 가는 이었다.repository2 브런치를 .repo1-merge그 나뭇가지에서, 나는 도망쳤다.git pull git@gitlab.com:Org/repository1 -s ours문제없이 잘 합쳐집니다.이치노

다시 '다'로 .repository1 브런치를 .repo2-merge그 나뭇가지에서, 나는 달리기를 한다.git pull git@gitlab.com:Org/repository2 repo1-merge문제가 있을 것입니다.

.repository1새로운 마스터가 되거나, 브랜치로 유지하거나.

심플하고 직관적인 2단계 방법은 다음과 같습니다.

git checkout branchB .
git commit -m "Picked up the content from branchB"

이어서

git merge -s ours branchB

(이것에 의해, 2개의 브런치가 Marge 되어 마크가 붙습니다).

유일한 단점은 지점 B에서 삭제된 파일이 현재 지점에서 제거되지 않는다는 것입니다.그 후, 2개의 브랜치간의 간단한 차이를 보면, 그러한 파일이 있는지를 알 수 있습니다.

또한 이 접근방식은 이후 수정 로그에서 무엇을 수행했는지, 무엇을 의도했는지 명확히 한다.

언급URL : https://stackoverflow.com/questions/173919/is-there-a-theirs-version-of-git-merge-s-ours

반응형