Есть ли способ повторить слияние в git?

17

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

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


источник
10
Просто примечание - на самом деле это тема SO и не должна была быть перенесена. Попробуйте когда-нибудь прочитать свои собственные страницы справки и обратите внимание на программные инструменты, обычно используемые программистами . Тем не менее, это также актуально здесь - SwiftCore, не расстраивайтесь, что он был перенесен, это была не ваша вина.
Боб

Ответы:

13

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

Давайте предположим, что ваша история выглядит примерно так (а 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

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

mblythe
источник
6

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

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

То есть:

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

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

Янош
источник
6
Просто помните, что делать git push --forceнебезопасно
Zepplock
1

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

Zepplock
источник
Я просто получаю сообщение «нет слияния, чтобы прервать»
3
Это можно сделать только при наличии конфликтов слияния.
chanchal118
почему минус один? это помогло мне.
swdev
Потому что вопрос в том, когда вы уже закончили слияние (неправильно) и нажали.
Робин Грин
-1

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

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

источник
Хотя это может ответить на вопрос OP, ответы только по ссылке не очень хорошо приняты на SO. Однако вы можете указать в своем ответе наиболее важные выдержки из ссылки.
Хотя эта ссылка может ответить на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если связанная страница изменится.
Пранав 웃