Ви можете об’єднати свою 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):
Про цей робочий процес повідомляється в цій публікації блогу ОП :
Чому я хочу це знову?
Поки мій репо не мав нічого спільного з публічною версією, це було добре, але оскільки я хотів би мати можливість спілкуватися на 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
(запропоновано Бараком А. Перлмуттером ):
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
(запропонований тим самим Майклом Гебетсройтером ):
Майкл Гебецройтер підслухався, стверджуючи, що я "обдурюю";) і дав інше рішення за допомогою команд сантехніки нижчого рівня:
(це не було б git, якби це було неможливо лише за допомогою команд git, все в git з diff / patch / apply не є реальним рішенням;).
# 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 використовує SHA1 у .git / MERGE_HEAD як другий батько, тому ми можемо заповнити це, щоб створити коміт злиття. Отже, цього можна досягти за допомогою:
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