Мы все слышали , что один никогда не должен перебазироваться опубликовал работу, что это опасно, и т.д. Тем не менее, я не видел никаких рецептов , размещенных на том , как справиться с ситуацией в случае перебазироваться будет опубликовано.
Теперь обратите внимание, что это реально возможно только в том случае, если репозиторий клонируется только известной (и желательно небольшой) группой людей, так что тот, кто нажимает на перебазирование или сброс, может уведомить всех остальных, что им нужно будет обратить внимание в следующий раз, когда они получить (!).
Одно очевидное решение, которое я видел, будет работать, если у вас нет локальных коммитов, foo
и оно будет перебазировано:
git fetch
git checkout foo
git reset --hard origin/foo
Это просто отбросит локальное состояние foo
в пользу его истории в соответствии с удаленным репозиторием.
Но как поступить с ситуацией, если в этой ветке были внесены существенные локальные изменения?
источник
git pull --rebase && git push
. Если вы работаетеmaster
только над ним , то это почти всегда будет делать то, что вам нужно, даже если вы переустановили и нажали на другом конце.git reset --hard @{upstream}
теперь, когда я знаю, что магическое заклинание refspec для «забудьте, что у меня было / было, используйте то, что я получил с пульта дистанционного управления». См. Мой последний комментарий к stackoverflow.com/a/15284176/717355push -f
): см. Мой ответ нижеОтветы:
Восстановить синхронизацию после нажатой перезагрузки в большинстве случаев не так уж и сложно.
Т.е. сначала вы устанавливаете закладку для того места, где изначально находилась удаленная ветвь, затем вы используете ее для воспроизведения ваших локальных коммитов с этой точки и далее на перемещенную удаленную ветку.
Перебазирование похоже на насилие: если оно не решает вашу проблему, вам просто нужно больше. ☺
Вы, конечно, можете сделать это без закладки, если вы посмотрите
origin/foo
идентификатор фиксации перед перебазированием и воспользуетесь им.Таким же образом вы справляетесь с ситуацией, когда вы забыли сделать закладку перед загрузкой. Ничего не потеряно - вам просто нужно проверить рефлог удаленной ветки:
Это напечатает идентификатор фиксации, на который
origin/foo
указывалось перед самой последней выборкой, изменившей свою историю.Тогда вы можете просто
источник
git reflog show origin/foo
для первой строки, говорящей «fetch: принудительное обновление»; это то, что git записывает, когда выборка заставляет удаленную ветку делать что угодно, кроме быстрой перемотки вперед. (Вы также можете просто сделать это вручную - принудительное обновление, вероятно, самое последнее.)Я бы сказал, что раздел восстановления из восходящей перебазировки на странице руководства git-rebase охватывает почти все это.
На самом деле это ничем не отличается от восстановления после вашей собственной перестановки - вы перемещаете одну ветку и переставляете все ветки, которые имели ее в своей истории, на ее новую позицию.
источник
Начиная с мерзавцем 1,9 / 2,0 Q1 2014, вы не должны будете отмечать свой предыдущий филиал происхождения , прежде чем перебазирования его на переписанной вверх по течению ветви, как описано в Аристотель Pagaltzis «s ответ :
См совершать 07d406b и совершать d96855f :
Вот почему в
git merge-base
команде появилась новая опция:Например, если история выглядела так, где:
Git 2.1 (3 квартал 2014 г.) добавит, чтобы эта функция была более надежной: см. Commit 1e0dacd от John Keeping (
johnkeeping
)правильно обработать сценарий со следующей топологией:
где:
B'
является исправленной версиейB
, не идентичной патчуB
;C*
иD*
являются патч-идентичныC
и ,D
соответственно , и конфликт текстуально , если применяется в неправильном порядке;E
текстуально зависит отD
.Правильный результат в
git rebase master dev
том , чтоB
идентифицируется как вилочная точкаdev
иmaster
, таким образом , чтоC
,D
,E
являются коммитами которые должны быть преобразованными наmaster
; ноC
иD
являются патч-идентичными сC*
иD*
и поэтому могут быть отброшены, так что конечный результат будет:Если точка разветвления не идентифицирована, то выбор
B
ветки, содержащей,B'
приводит к конфликту, а если идентичные патчу фиксации не идентифицированы правильно, то выборC
ветки, содержащейD
(или что то же самоеD*
), приводит к конфликту.«
--fork-point
» Режим «git rebase
» регресс , когда команда была переписана в С задней в 2.20 эре, которая была исправлена с Git 2,27 (Q2 2020).См. Фиксацию f08132f (09 декабря 2019 г.) от Junio C Hamano (
gitster
) .(Объединено Junio C Hamano -
gitster
- в коммите fb4175b , 27 марта 2020 г.)источник