12

Так что я сделал довольно большую ошибку. Я сделал коммит, вытащил, слил (но при этом испортил код) и затем нажал. Я хотел бы повторить это слияние и получить правильный код. Есть какой-либо способ сделать это?

Я использую bitbucket.

4 ответа4

7

Не уверен, что это "благословенный" способ сделать это, но вот что я сделал, чтобы решить ту же проблему, не прибегая к "принудительному толчку" или чему-то грубому в этом роде.

Давайте предположим, что ваша история выглядит примерно так (а M - расширенное слияние):

-A--B--C--M (master points here)
  \      /
   D----E

Запуск git checkout -b merge_fix <commit ID E> создает ветку до того, как мы допустим какие-либо ошибки:

-A--B--C--M (master points here)
  \      /
   D----E (HEAD and merge_fix point here)

Теперь давайте сделаем слияние в нашей новой ветке. Мы не можем просто выполнить слияние в master , поэтому нам нужно вручную выбрать коммит до нашего неудачного слияния: git merge <commit ID C> Не повторяйте те же ошибки, что и в прошлый раз!

-A--B--C--M (master points here)
  \      X
   D----E-G (HEAD and merge_fix point here)

Предполагая, что коммит G выглядит хорошо, теперь мы хотим синхронизироваться с вершиной master ветви. Эта команда говорит git игнорировать изменения, которые были внесены в master, и заставляет наши изменения стать результатом слияния: git merge -s ours master

-A--B--C--M (master points here)
  \      X  \
   D----E-G--H (HEAD and merge_fix point here)

Наконец, (опять же, при условии, что коммит H выглядит хорошо, мы хотим, чтобы master перемотки вперед включил наше фиксированное слияние:

git checkout master
git merge merge_fix

Это на самом деле просто перемещает указатель master ветки на H , но я воспользуюсь возможностью немного очистить свой ASCII-арт:

-A--B--C--M--H (HEAD, master, and merge_fix all point here)
  \      X  /
   D----E--G

И вот оно у тебя! Вы успешно сделали слияние без аннулирования истории!

4

Вы можете сделать это, как это:

  1. Сброс на коммит до вашего слияния.
  2. Выполните объединение снова
  3. Принудительный толчок

То есть:

git reset --hard SHA1
git merge branchname
git commit
git push --force remotename branchname

Просто имейте в виду, что git push --force перезапишет все, что у вас было в удаленной ветви, и другие люди, использующие эту ветку, могут также пострадать. (Обычно вы не должны этого делать.)

2

git merge --abort и затем вы можете снова слить

0

Пожалуйста, проверьте эту надежду, это полезно для вас

https://www.kernel.org/pub/software/scm/git/docs/howto/revert-branch-rebase.html

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .