source

강제 덮어쓰기와 함께 Git 병합

manycodes 2023. 7. 20. 22:02
반응형

강제 덮어쓰기와 함께 Git 병합

는 라는지있습다니이점▁called라는 있습니다.demo내가 합병해야 하는 것.master.다음 명령을 사용하여 원하는 결과를 얻을 수 있습니다.

git pull origin demo
git checkout master
git pull origin master
git merge demo
git push origin master

제 유일한 걱정은 합병 문제가 있다면 제가 말하고 싶은 것입니다.git의 변경 master병합 프롬프트를 표시하지 않고 분기합니다.그래서 기본적으로 변화가 있습니다.demo는 분는자변덮내어다니의 사항을 .master분점.

여러 가지 옵션이 있다고 둘러보았지만 합병은 위험을 감수하고 싶지 않습니다.

이 대답과 관련은 없지만, 저는 포기하겠습니다.git pull그냥 진행되는git fetch에 뒤에git merge한 번의 가져오기만 수행하면 Git이 세 번의 가져오기 작업을 실행할 수 있는 병합을 세 번 수행합니다.따라서:

git fetch origin   # update all our origin/* remote-tracking branches

git checkout demo         # if needed -- your example assumes you're on it
git merge origin/demo     # if needed -- see below

git checkout master
git merge origin/master

git merge -X theirs demo   # but see below

git push origin master     # again, see below

가장 까다로운 병합 제어

서 가장 은 여서가장흥부분은운로미입니다.git merge -X theirs루트 545가 지적했듯이,-X전략으로 은 둘 다 사용됩니다.recursive인 것.resolve전략상의 선택-X ours또는-X theirs(둘 다는 아니지만 둘 다는 아닙니다.)그러나 그들이 하는 일을 이해하려면 Git가 병합 충돌을 찾고 처리하는 방법을 알아야 합니다.

기본 버전이 현재 버전(로컬, HEAD 또는라고도 함)과 다르면 일부1 파일 내에서 병합 충돌이 발생할 수 있습니다.--ours) 버전 및 다른 버전(리모트 또는 다른 버전이라고도 함)--theirs) 동일한 파일의 버전입니다.즉, 병합은 기본, 우리의 것, 그리고 그들의 것의 세 가지 수정사항(세 가지 커밋)을 식별했습니다."기본" 버전은 커밋 그래프에서 볼 수 있듯이 커밋과 커밋 간의 병합 기반에서 가져온 것입니다(자세한 내용은 다른 StackOverflow 게시물 참조).그런 다음 Git는 "우리가 한 일"과 "그들이 한 일"의 두 가지 변화를 발견했습니다.이러한 변경 사항은 일반적으로 순수하게 텍스트 기반의 라인별로 발견됩니다.Git는 파일 내용에 대한 실질적인 이해가 없습니다. 단지 각 줄의 텍스트를 비교하는 것입니다.

는 이한변은에수있확다습에서 볼 수 .git diff출력, 그리고 항상 그렇듯이, 그들은 맥락도 가지고 있습니다.변경한 내용과 변경한 내용이 서로 다른 줄에 있을 수 있으므로 변경 내용이 충돌하지 않을 것 같지만 상황에 따라 변경된 내용이 파일의 맨 위나 맨 아래에 가까워서 파일이 우리 버전에서는 소진되지만 해당 파일의 경우에는또한 위쪽 또는 아래쪽에 텍스트를 추가했습니다.

다른 라인에서 변경이 발생하는 경우(예: 변경)colorcolour에서 17도를 합니다.fredbarney71번 라인에서 - 충돌이 없음: Git는 두 가지 변경 사항을 모두 받아들입니다.변경사항이 동일한 라인에서 발생하지만 동일한 변경사항인 경우 Git는 변경사항의 복사본을 하나 가져옵니다.변경 내용이 동일한 줄에 있지만 변경 내용이 다른 경우 또는 간섭 컨텍스트의 특수한 경우에만 충돌이 수정/수정됩니다.

-X ours그리고.-X theirs옵션은 Git에게 두 가지 변경 사항 중 하나만 선택하여 이 갈등을 해결하는 방법을 알려줍니다. 우리의 변경 사항 또는 그들의 변경 사항입니다.이 요.demo (비공식적으로)master것) (우리의 것)의을 원합니다.demo당신은 원할 것입니다.-X theirs.

무턱대고 신청하기-X하지만, 위험합니다.변경 사항이 라인별로 충돌하지 않았다고 해서 변경 사항이 실제로 충돌하지는 않습니다!한 가지 고전적인 예는 변수 선언이 있는 언어에서 발생합니다.기본 버전이 사용되지 않는 변수를 선언할 수 있습니다.

int i;

우리 버전에서는 사용되지 않은 변수를 삭제하여 컴파일러 경고가 사라지도록 합니다. 그리고 그들의 버전에서는 다음을 사용하여 몇 줄의 루프를 추가합니다.i루프 카운터로.만약 우리가 두 변화를 결합한다면, 결과 코드는 더 이상 컴파일되지 않습니다.-X변경 사항이 다른 라인에 있으므로 여기서는 옵션이 도움이 되지 않습니다.

자동화된 테스트 제품군이 있는 경우 가장 중요한 작업은 병합 후 테스트를 실행하는 것입니다.커밋한 후 이 작업을 수행하고 필요한 경우 나중에 수정하거나 커밋하기 전에 다음을 추가하여 수행할 수 있습니다.--no-commit에▁git mergeㅠㅠㅠㅠ 이 모든 에 대한 은 다른 이 모든 것에 대한 자세한 내용은 다른 게시물에 남겨둘 것입니다.


1또한 "파일 전체" 작업과 관련하여 충돌이 발생할 수 있습니다. 예를 들어, 파일에서 단어의 철자를 수정하여 변경한 후 전체 파일을 삭제합니다(삭제).Git는 이러한 충돌을 자체적으로 해결하지 않습니다.-X논쟁들.


병합 횟수 감소 및/또는 스마트 병합 및/또는 기본 재배치 사용

두 명령 시퀀스에는 모두 세 개의 병합이 있습니다.첫번째는 가져오는 것입니다.origin/demo 京都로demo)git pull만약 당신의 Git이 매우 오래되었다면, 업데이트에 실패할 것입니다.origin/demo그러나 동일한 최종 결과가 생성됩니다.)는 두째는가것는입다니져오번것다입니▁bring를 가져오는 것입니다.origin/master안으로master.

누가 잘 demo 및/는master하면 당신이작성다면한코.demo지점, 그리고 다른 사람들은 코드를 작성하고 그것을 밀어넣고 있습니다.demo에 대한 분기점.origin그러면 이 첫 번째 단계 병합에서 충돌이 발생하거나 실제 병합이 발생할 수 있습니다.종종, 작업을 결합하기 위해 병합보다는 리베이스를 사용하는 것이 좋습니다(인정하건대, 이것은 취향과 의견의 문제입니다).그렇다면 다음을 사용할 수 있습니다.git rebase대신.반면에, 만약 당신이 결코 당신 자신의 커밋을 하지 않는다면.demo당신은 심지어 필요하지도 않습니다.demo분점.또는 이 작업의 대부분을 자동화하지만 사용자와 다른 사용자 모두가 수행한 커밋이 있을 때 주의 깊게 확인할 수 있는 경우 사용할 수 있습니다.git merge --ff-only origin/demo이것은 당신에게 빨리 전달할 것입니다.demo업데이트된 내용과 일치하는origin/demo가능한 경우에는 완전히 실패하고 그렇지 않은 경우에는 완전히 실패합니다(이 시점에서 두 변경 집합을 검사하고 필요에 따라 실제 병합 또는 기본 재배치를 선택할 수 있습니다).

이와 같은 논리는 다음에 적용됩니다.master당신이 병합을 하고 있지만 master그래서 당신은 확실히 필요합니다.master할 수 더 높기 에, 이 그나빠전른수없경병실가다패더니능가이합이또높능때한러문에기성할합수이행우는할달병합로비으▁also▁be▁it▁should다▁if니▁to▁merge▁probably가합능▁would▁the▁so▁lik▁it▁is▁fail그▁even▁however,가 되어야 할 것입니다.git merge --ff-only origin/master.

예를 들어, 당신은 결코 당신 자신의 약속을 하지 않습니다.demo이 경우에는 이름을 버리고,demo전체:

git fetch origin   # update origin/*

git checkout master
git merge --ff-only origin/master || die "cannot fast-forward our master"

git merge -X theirs origin/demo || die "complex merge conflict"

git push origin master

만약 당신이 당신 자신의 일을 하고 있다면,demo이 되지 않습니다. 병합을 유지하는 것이 추가할 수도 ). 기존 병합을 유지하는 것이 좋습니다(그러나 추가할 수도 있음).--ff-only원하는 동작에 따라) 또는 기본 재배치로 전환합니다. 병합이 충돌과 실패할 수도 . 병합은 충돌과 함께 실패할 수 있습니다. 병합은 다음과 같습니다.--ff-only빠르게 전달하지 못할 수도 있고, 기본 재배치가 충돌과 함께 실패할 수도 있습니다(기본적으로 병합 기계를 사용하는 체리 분할 커밋에 의해 기본 작업이 수행되므로 병합 충돌이 발생할 수 있습니다).

변경/충돌이 있는 파일을 다른 브랜치로 효과적으로 교체해야 하는 비슷한 문제가 있었습니다.

은 제가찾해은을 사용하는 이었습니다.git merge -s ours branch.

은 " 은다과같다니습음옵션다니▁is▁note▁the▁option같습▁that다"입니다.-s그리고 아닌-X.-s는 의사을나타다니냅용▁of의 .ours으로, 최고수준합전서로으략병의,,,-X적할것 니다입을 하는 입니다.ours에 대한 recursive합병 전략, 이 경우에는 제가 원하는 것이 아닙니다.

서 단계, 치위oldbranch는 쓰려분기다로 입니다.newbranch.

  • git checkout newbranch합니다.
  • git merge -s ours oldbranch이전 분기에서 병합되지만 모든 파일은 유지됩니다.
  • git checkout oldbranch 합니다.
  • get merge newbranch 새 에 병합합니다.

이 병합 접근 방식은 다음 위에 커밋 하나를 추가합니다.master안에 있는 모든 것을 붙여넣는 것.feature갈등이나 다른 헛소리에 대해 불평하지 않고 말입니다.

enter image description here

당신이 무엇을 만지기 전에.

git stash
git status # if anything shows up here, move it to your desktop

이제 마스터를 준비합니다.

git checkout master
git pull # if there is a problem in this step, it is outside the scope of this answer

받기feature 멋을 부린

git checkout feature
git merge --strategy=ours master

덤벼봐요!

git checkout master
git merge --no-ff feature

는 이명령은다코덮데됩니다도의 데 이 될 것입니다.demo로분다하로 master

git fetch --all

유어 풀어demo

git pull origin demo

은 체웃아크로음입니다.master분점.코드를 켠 상태에서 이 분기가 완전히 변경됩니다.demo

git checkout master

박숙에 .master분기하고 이 명령을 실행합니다.

git reset --hard origin/demo

reset즉, 현재 분기를 재설정합니다.

--hard입니다.

origin/demo현재를 강제로 덮어쓰는 코드로 간주되는 분기가 됩니다.master

에는 " " " " " " " " " 에 대한 됩니다.origin/demo또는demo가지를 치다

그다음, 결국강, 코를로누다릅에 로 밀어줍니다.master원격 저장소로 분기합니다.

git push --force

"우리" 옵션을 사용해 볼 수 있습니다.

git 병합 분기 - Xours

이 옵션을 사용하면 충돌하는 헝크가 당사 버전을 선호하여 자동으로 해결됩니다.우리 측과 충돌하지 않는 다른 트리의 변경 사항이 병합 결과에 반영됩니다.이진 파일의 경우 전체 내용을 당사에서 가져옵니다.

사용하려고 했을 때-X theirs그리고 다른 관련 명령 스위치를 계속해서 병합 커밋을 받았습니다.아마 제가 제대로 이해하지 못했을 겁니다.이해하기 쉬운 한 가지 대안은 분기를 삭제한 후 다시 추적하는 것입니다.

git branch -D <branch-name>
git branch --track <branch-name> origin/<branch-name>

이것이 정확히 "합병"은 아니지만, 이것이 제가 이 질문을 접했을 때 찾고 있던 것입니다.저의 경우 원격 분기에서 강제로 푸시된 변경 사항을 끌어내고 싶었습니다.

이 을 수행할 수 . 브랜치는 할 자 자 수 수 있 행 습 니 다 을 작 업 이 도 않 고 브 삭 지 신 하 의 치 를 제 랜 다 니 ▁yougit reset:

git reset --hard origin/<branch-name>

다른 SO 게시물은 여기에 더 자세히 나와 있습니다.

git checkout master
git merge demo
cd /root/of/source/
git checkout --theirs . # this will overwrite everything by img of demo
git add .
git commit -m "bla bla"

언급URL : https://stackoverflow.com/questions/40517129/git-merge-with-force-overwrite

반응형