Я просто раздавил некоторые коммиты git rebase
и сделал git push --force
(что, я знаю, зло).
Теперь другие разработчики программного обеспечения имеют другую историю, и когда они это сделают git pull
, Git объединится. Есть ли способ исправить это, кроме как сделать rm my-repo; git clone git@example.org:my-repo.git
?
Мне нужно что-то вроде противоположности git push --force
, но git pull --force
не дало ожидаемых результатов.
git checkout master && git branch -D test && git checkout -b test origin/test
Ответы:
Чтобы получать новые коммиты
Сброс
Вы можете сбросить коммит для локальной ветки, используя
git reset
.Чтобы изменить коммит локальной ветки:
Будьте осторожны, как сказано в документации:
Если вы хотите сохранить какие-либо изменения, которые вы получили локально -
--soft
вместо этого выполните сброс. Который обновит историю коммитов для ветки, но не изменит какие-либо файлы в рабочем каталоге (и вы сможете потом их зафиксировать).Rebase
Вы можете воспроизвести ваши локальные коммиты поверх любого другого коммита / ветки, используя
git rebase
:Это вызовет rebase в интерактивном режиме, где вы можете выбрать способ применения каждого отдельного коммита, которого нет в истории, над которой вы перебираете.
Если коммиты, которые вы удалили (с помощью
git push -f
), уже были перетащены в локальную историю, они будут перечислены как коммиты, которые будут применены повторно - их необходимо будет удалить как часть перебазирования, или они просто будут повторно включены в историю для ветки - и вновь появиться в удаленной истории при следующем нажатии.Используйте справку
git command --help
для получения более подробной информации и примеров по любой из вышеперечисленных (или других) команд.источник
git reset origin/otherbranch --hard
reset --hard
, или Вариант 2:reset --soft
+rebase
, верно?git reset --soft origin/master
изменит историю коммитов, чтобы соответствовать удаленным и сценическим различиям, которые затем будут зафиксированы . В этом сценарии не будет необходимости перебазировать (и вам будет запрещено делать это из-за незафиксированных изменений), потому что нет разницы в истории коммитов. Два варианта сбрасываются или перебазируются - не комбинация обоих. Пожалуйста, задайте вопрос, если ваш сценарий отличается от того, на который я ответил здесь.Это не исправит ответвления, в которых уже есть код, который вам не нужен (см. Ниже, как это сделать), но если они потянули какую-то ветвь и теперь хотят, чтобы она была чистой (а не «впереди» origin / some-branch) тогда вы просто
Примечание. Вы можете объединить их, поставив && между ними.
Примечание 2: Флориан упомянул об этом в комментарии, но кто читает комментарии, когда ищет ответы?
Примечание 3: Если у вас есть зараженные ветви, вы можете создавать новые, основываясь на новой "тупой ветви", и только коммиты "вишня" выбираются.
Пример:
Теперь новая функция - ваша ветка без лишних (возможно, плохих) коммитов!
источник
git checkout -b base-branch origin/base-branch
сgit checkout --track origin/base-branch
Потяните с ребазой
Обычное извлечение - это выборка + слияние, но вам нужно получить + перебазировать. Это опция с
pull
командой:источник