2016-02-01 4 views
1

Я создал ветвь AB из ветки A, я через некоторое время сменил новые изменения с A на AB, также выполнил некоторую «незавершенную работу», которая выполняет AB;Squash/fixup совершает слияния

Теперь я хочу оставить только одно сообщение с сообщением firs, но сохранить там все данные из слияний и т. Д .;

Я сделал git log --pretty=oneline

a last commit 
b merge branch from A 
c merge pull request from A 
d meger branch from A 
e WIP commit 
f WIP commit 
g WIP commit 
h first commit 

Я пытаюсь сделать различные комбинации git rebase -i {commit}, но каждый раз, когда я теряю некоторые коммиты

Как сделать это в правильном направлении?

+0

Вы можете сквош фиксировать один за другим (отдельные прогоны перебора). Это вы можете легко проверить результат после каждого шага. – arkascha

+0

Проблема @archascha, которая объединяется, не отображается в инструменте git-rebase-todo –

+0

У вас есть опция --preserve-merges with git rebase --interactive, но, как сказано в документе, есть риски ошибок (см. Конец страница): https://git-scm.com/docs/git-rebase –

ответ

2

Самый простой способ сделать это - git reset. Эта команда позволяет сохранить все содержимое с последней фиксацией в вашем рабочем каталоге, перемещая текущую ветку на другую фиксацию. Так сделайте следующее:

git branch backup  #keeps your current history from getting lost in case you screw up 
git reset --soft h  #moves current branch to the first commit (i.e. h) 
git commit --amend  #makes commit h contain all the changes you made 

После того, как вы убедитесь, все, как вы хотите, вы можете удалить ветвь backup.

+0

так приятно; действительно очень полезно! –