당신은 당신의 상류 지점을 병합 할 수 dev
으로, 지점 사용자 정의 병합 드라이버 "keepTheirs" :
페이지의 " " git merge -s theirs
"-하지만 존재하지 않는 알 필요 ".
귀하의 경우에는 하나만 .gitattributes
필요하며 다음과 같은 keepTheirs
스크립트 가 필요합니다 .
mv -f $3 $2
exit 0
git merge --strategy=theirs
시뮬레이션 # 1
첫 번째 상위가 업스트림 인 병합으로 표시됩니다.
Jefromi 는 merge -s ours
업스트림 (또는 업스트림에서 시작하는 임시 분기)에서 작업을 병합 한 다음 해당 병합의 결과로 분기를 빠르게 전달하여 주석에서를 언급합니다 .
git checkout -b tmp origin/upstream
git merge -s ours downstream # ignoring all changes from downstream
git checkout downstream
git merge tmp # fast-forward to tmp HEAD
git branch -D tmp # deleting tmp
이는 업스트림 조상을 첫 번째 부모로 기록하는 이점이 있으므로 병합은 "이 주제 브랜치를 파괴하고 업스트림으로 교체"하는 대신 "이 오래된 주제 브랜치를 흡수"하는 것을 의미 합니다.
(2011 년 편집) :
이 워크 플로는 OP에 의해이 블로그 게시물에 보고되었습니다 .
왜 이걸 다시 원합니까?
내 저장소가 공개 버전과 관련이없는 한 괜찮 았지만 이제는 WIP에서 다른 팀 구성원 및 외부 기여자와 공동 작업 할 수있는 기능을 원했기 때문에 공개 분기가 다른 사람들이 분기하고 가져올 수 있습니다. 즉, 이제 GitHub 및 공개에 있으므로 원격 백업에 푸시 한 항목을 더 이상 리베이스하거나 재설정 할 필요가 없습니다.
그래서 내가 어떻게 진행해야할지 남깁니다.
99 %의 시간 동안 내 사본이 업스트림 마스터로 이동하므로 대부분의 시간 동안 내 마스터를 작업하고 업스트림으로 푸시하고 싶습니다.
그러나 가끔씩, 내가 가진 것은 wip
업스트림으로 들어가는 것에 의해 무효화되고 내 wip
.
이 시점에서 마스터를 업스트림과 다시 동기화하고 싶지만 공개적으로 푸시 된 마스터의 커밋 포인트를 파괴하지는 않습니다. 즉, 업스트림과 동일한 복사본을 만드는 변경 집합으로 끝나는 업스트림과의 병합을 원합니다 .
그리고 그것이 git merge --strategy=theirs
해야 할 일입니다.
git merge --strategy=theirs
시뮬레이션 # 2
첫 번째 부모로 우리와 병합으로 표시됩니다.
( jcwenger 제안 )
git checkout -b tmp upstream
git merge -s ours thebranch # ignoring all changes from downstream
git checkout downstream
git merge --squash tmp # apply changes from tmp but not as merge.
git rev-parse upstream > .git/MERGE_HEAD #record upstream 2nd merge head
git commit -m "rebaselined thebranch from upstream" # make the commit.
git branch -D tmp # deleting tmp
git merge --strategy=theirs
시뮬레이션 # 3
이 블로그 게시물에 언급 된 내용 :
git merge -s ours ref-to-be-merged
git diff --binary ref-to-be-merged | git apply -R --index
git commit -F .git/COMMIT_EDITMSG --amend
때때로 당신은 이것을 하기를 원합니다. 당신의 역사에 "쓰레기"가있어서가 아니라 아마도 리베이스를 피해야하는 공용 저장소에서 개발을위한 기준을 변경하기를 원하기 때문일 것 입니다.
git merge --strategy=theirs
시뮬레이션 # 4
(동일한 블로그 게시물)
또는 로컬 업스트림 분기를 빨리 감기 가능하게 유지하려는 경우 잠재적 인 타협은 sid / 불안정한 경우 업스트림 분기가 수시로 재설정 / 재 기반 될 수 있다는 이해와 함께 작업하는 것입니다 (최종적으로 종료되는 이벤트를 기반으로 함). 업스트림 프로젝트 측에 대한 제어).
이것은 큰 문제가 아니며 그 가정에 따라 작업한다는 것은 로컬 업스트림 분기를 빠른 업데이트 만받는 상태로 유지하는 것이 쉽다는 것을 의미합니다.
git branch -m upstream-unstable upstream-unstable-save
git branch upstream-unstable upstream-remote/master
git merge -s ours upstream-unstable
git diff --binary ref-to-be-merged | git apply -R --index --exclude="debian/*"
git commit -F .git/COMMIT_EDITMSG --amend
git merge --strategy=theirs
시뮬레이션 # 5
( Barak A. Pearlmutter 제안 ) :
git checkout MINE
git merge --no-commit -s ours HERS
git rm -rf .
git checkout HERS -- .
git checkout MINE -- debian # or whatever, as appropriate
git gui # edit commit message & click commit button
git merge --strategy=theirs
시뮬레이션 # 6
(동일한 Michael Gebetsroither가 제안 ) :
Michael Gebetsroither는 내가 "속임수"라고 주장하면서 차를 댔고;) 낮은 수준의 배관 명령으로 또 다른 해결책을 제시했습니다.
(git 전용 명령으로 가능하지 않다면 git이 아닙니다. diff / patch / apply를 사용하는 git의 모든 것은 실제 솔루션이 아닙니다.)
# get the contents of another branch
git read-tree -u --reset <ID>
# selectivly merge subdirectories
# e.g superseed upstream source with that from another branch
git merge -s ours --no-commit other_upstream
git read-tree --reset -u other_upstream # or use --prefix=foo/
git checkout HEAD -- debian/
git checkout HEAD -- .gitignore
git commit -m 'superseed upstream source' -a
git merge --strategy=theirs
시뮬레이션 # 7
필요한 단계는 다음과 같이 설명 할 수 있습니다.
- 작업 트리를 업스트림으로 교체
- 인덱스에 변경 사항 적용
- 두 번째 상위 항목으로 업스트림 추가
- 범하다
이 명령 git read-tree
은 두 번째 단계를 수행하는 다른 트리로 색인을 덮어 쓰고 첫 번째 단계를 수행하는 작업 트리를 업데이트하는 플래그를 갖습니다 . 커밋 할 때 git은 .git / MERGE_HEAD의 SHA1을 두 번째 부모로 사용하므로이를 채워 병합 커밋을 만들 수 있습니다. 따라서 다음을 사용하여 수행 할 수 있습니다.
git read-tree -u --reset upstream # update files and stage changes
git rev-parse upstream > .git/MERGE_HEAD # setup merge commit
git commit -m "Merge branch 'upstream' into mine" # commit