Так что я сделал довольно большую ошибку. Я сделал коммит, вытащил, слил (но при этом испортил код) и затем нажал. Я хотел бы повторить это слияние и получить правильный код. Есть какой-либо способ сделать это?
Я использую bitbucket.
Так что я сделал довольно большую ошибку. Я сделал коммит, вытащил, слил (но при этом испортил код) и затем нажал. Я хотел бы повторить это слияние и получить правильный код. Есть какой-либо способ сделать это?
Я использую bitbucket.
Не уверен, что это "благословенный" способ сделать это, но вот что я сделал, чтобы решить ту же проблему, не прибегая к "принудительному толчку" или чему-то грубому в этом роде.
Давайте предположим, что ваша история выглядит примерно так (а 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
И вот оно у тебя! Вы успешно сделали слияние без аннулирования истории!
Вы можете сделать это, как это:
То есть:
git reset --hard SHA1
git merge branchname
git commit
git push --force remotename branchname
Просто имейте в виду, что git push --force
перезапишет все, что у вас было в удаленной ветви, и другие люди, использующие эту ветку, могут также пострадать. (Обычно вы не должны этого делать.)
git merge --abort
и затем вы можете снова слить
Пожалуйста, проверьте эту надежду, это полезно для вас
https://www.kernel.org/pub/software/scm/git/docs/howto/revert-branch-rebase.html