2017-01-10 2 views
0

Вот мой сценарий. Я работаю против ветви A. Я объединил ветвь признаков локально из ветки B в ветвь A. После этого я сделал несколько изменений на ветке A и сделал фиксацию Y. Я заметил, что слияние вызвало проблемы, и мне нужно отмените это слияние и оставьте только фиксацию Y. Я не перешел из локальной в удаленную ветку. Все изменения находятся на исходящих записях. Как я могу это сделать, не потеряв работу, выполняемую при совершении Y, а просто нажав на нее? благодаряИзбавиться от конкретных локальных коммитов с git

BTW: Я использую Source Tree (я знаю, что, возможно, это будет командная строка, но если кто-нибудь знает, как сделать это с помощью дерева исходного кода, который был бы удивительным)

ответ

2

до тех пор, как ничто в фиксации Y напрямую конфликтует с любым из объединенных изменений из ветви B, вы должны иметь возможность запускать интерактивную перезагрузку и отбрасывать слияние. Я не знаком с Source Tree, так что я могу предоставить терминальные команды:

(из ветви А): git rebase -i HEAD~3 (произвольные 3, вам просто нужно увидеть несколько фиксаций)

Найти слияние совершало, и следуя инструкциям по интерактивной перестановке, вы можете изменить слово pick на drop. Сохранить и выйти, а git будет воспроизводить коммиты, но пропустите фиксацию, которую вы указали, чтобы удалить.

Примечание: Если вам неудобно потерять работу, я предлагаю вам нажать на свое дистанционное репо, а затем попробовать интерактивную перезагрузку. Если он работает так, как вам нужно, то принудительно обновите свое репо, и если он не работает должным образом, вы получите резервную копию.

Надеюсь, это поможет!

+0

Это правильный ответ (используйте 'git rebase -i'), но вам не нужно явно удалять комманду слияния, потому что' git rebase -i' сделает это за вас: по умолчанию для rebase следует отказаться сливается. Использование 'git rebase -p' пытается сохранить слияния (на самом деле нужно * воссоздать * их, что имеет некоторые незначительные опасности), но вообще неразумно сочетать это с' git rebase -i' в любом случае. – torek

+0

Я поместил это как отдельный комментарий, потому что это отдельная идея: вместо того, чтобы нажимать на другой репозиторий, если вы немного нервничаете, проще создать новое название ветки, чтобы сохранить текущую цепочку фиксации. Просто запустите 'git branch saveme' перед запуском' git rebase -i'. Когда ваша rebase закончится, ветка 'saveme' будет иметь ваши оригинальные (pre-rebase) коммиты, и ваша текущая ветка будет иметь ваши новые (после rebase) копии. Если все хорошо, вы можете «git branch -D saveme» перебросить сохраненные оригиналы. (Фактически, rebase сохраняет ваши оригиналы для вас под специальным именем 'ORIG_HEAD'.) – torek