Поэтому я сделал довольно большую ошибку. Я сделал коммит, вытащил, слил (но при этом испортил код) и затем нажал. Я хотел бы повторить это слияние и получить правильный код. Есть какой-либо способ сделать это?
Просто примечание - на самом деле это тема 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
И вот оно! Вы успешно сделали слияние без аннулирования истории!
Просто имейте в виду, что git push --forceвсе, что у вас было в удаленной ветке, будет перезаписано, и другие люди, использующие эту ветку, могут также пострадать. (Обычно вы не должны этого делать.)
Хотя это может ответить на вопрос OP, ответы только по ссылке не очень хорошо приняты на SO. Однако вы можете указать в своем ответе наиболее важные выдержки из ссылки.
Хотя эта ссылка может ответить на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если связанная страница изменится.
Ответы:
Не уверен, что это «благословенный» способ сделать это, но вот что я сделал, чтобы решить ту же проблему, не прибегая к «принудительному толчку» или чему-то еще грубому.
Давайте предположим, что ваша история выглядит примерно так (а M - расширенное слияние):
Запуск
git checkout -b merge_fix <commit ID E>
создает ветку, прежде чем мы допустим какие-либо ошибки:Теперь давайте сделаем слияние в нашей новой ветке. Мы не можем просто слиться
master
, поэтому нам нужно вручную выбрать коммит до нашего неудачного слияния:git merge <commit ID C>
не допускайте ошибок, которые вы делали в прошлый раз!Предполагая, что коммит
G
выглядит хорошо, теперь мы хотим синхронизироваться с вершинойmaster
ветви. Эта команда говорит git игнорировать изменения, которые были внесены в master, и заставляет наши изменения стать результатом слияния:git merge -s ours master
Наконец, (опять же, при условии, что коммит
H
выглядит хорошо, мы хотим перемотать вперед,master
чтобы включить наше фиксированное слияние:Это на самом деле просто перемещает
master
указатель веткиH
, но я воспользуюсь возможностью немного очистить свой ASCII-арт:И вот оно! Вы успешно сделали слияние без аннулирования истории!
источник
Вы можете сделать это, как это:
То есть:
Просто имейте в виду, что
git push --force
все, что у вас было в удаленной ветке, будет перезаписано, и другие люди, использующие эту ветку, могут также пострадать. (Обычно вы не должны этого делать.)источник
git push --force
небезопасноgit merge --abort
и тогда вы можете снова слитьисточник
Пожалуйста, проверьте эту надежду, это полезно для вас
источник