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