2016-08-01 3 views
0

Что я пытаюсь сделать:Как очистить git-историю, удалив некоторые коммиты после того, как они были нажаты?

Я завершил функцию.

git add -A; git commit -m "feature A complete" 

Тогда я понял, что пропустил некоторые вещи.

git add -A; git commit -m "feature A missed something 1" 
git add -A; git commit -m "feature A missed something 2" 
git add -A; git commit -m "feature A missed something 3" 

Теперь моя история выглядит следующим образом:

A238ad1 feature A missed something 3 
3238adX feature A missed something 2 
1238ad7 feature A missed something 1 
111AAA2 feature A complete 

Я хочу, чтобы выглядеть следующим образом:

111AAA2 feature A complete 

Со всеми missed something коммитов объединены в feature A complete фиксации.

Я знаю, что git rebase -i HEAD~4 - это правильный путь, но на самом деле он не удаляет плохие коммиты, чтобы очистить историю.

Я заметил, что в некоторых других статьях есть команда git commit --fixup и git rebase -i --autosquash, но я не заставляю ее работать правильно. Я уверен, что это очень просто, я просто из этого сегодня.

+0

Причина, по которой они ничего не удаляют, вероятно, потому, что вы не указали, что делать с этими коммитами во время интерактивной переадресации. Вы должны изменить 'pick', который по умолчанию используется' squash'. Таким образом, он будет раздавливать друг с другом, и вам будет дана возможность редактировать фиксацию в конце –

ответ

1

В этом случае следует использовать интерактивную Rebase

Это может быть инициирована с помощью

git rebase -i 

затем количество головок, которые вы хотите включить

git rebase -i HEAD~5 

где HEAD~5 указывает последний 5 совершает

Затем вы можете использовать дополнительно o чтобы раздавить ваши коммиты в один и отредактировать сообщение. Просто вместо того, чтобы pick вариант написать squash вместо

squash

Так вот вы видите, изменить вариант pick для s который является аббревиатурой для squash. Когда я сохраню и закрою этот файл, будет инициирована интерактивная перезагрузка, и фиксации, которые я указал для раздачи, будут раздавлены в 21b4e04 Fixed missing bad practice. После раздачи он попросит вас ввести новое сообщение фиксации. Введите новое сообщение и нажмите enter, и все готово.

+0

Хмммм. Я только что создал тестовое репо, протестировал это, и он сработал, но он не работает в моем другом репо. Кажется, это правильный ответ, хотя он не работает в моем другом репо ...:/раздражает. –

+0

Как странно, он дает сообщение об ошибке или какой-либо вывод вообще? –

+0

В основном я думаю, потому что я уже их подтолкнул. Теперь я пытаюсь понять, как сквош совершает компромисс между целями, потому что другие люди совершили после меня. то есть 'git rebase -i origin/master ~ 5 origin/master ~ 2'. Это возможно? –

Смежные вопросы