2016-09-07 2 views
2

Документы и поиск просто путают меня о том, что делать, чтобы очистить историю фиксации.git: очистить или удалить фиксацию для очистки истории фиксации

Скажите, что у меня есть ветка, называемая тестами, которые я использую, чтобы нажимать сборки на travis-ci, и у меня есть сбои сборки. Затем мне пришлось бы сделать некоторые мелкие фиксации, чтобы попытаться исправить сообщение об ошибке и повторно нажать на ветвь tests.

Это может привести к цепочке мелких и почти бессмысленных коммитов, которые я действительно не хочу делать, но я вынужден тем не менее. Как я могу скомпоновать их в одну фиксацию? Я думаю, что rebase - это то, что я ищу, но я смущен о некоторых вещах.

Если я использую squash, я обнаружил, что я столкнулся с тоннами конфликтов слияния, которые я должен решить, и решить их вручную.

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

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

commit1: some new feature 
commit2: crap, builds failing, trying fix 
commit3: more build attempts 
commit4: Ahh I think I got it this time 
commit5: ok finally fixed, build passing 

Сейчас я в основном хотел бы иметь только один совершить сливаться обратно в master. Что бы вы сделали здесь, что не приведет к слиянию конфликтов?

ответ

3

Как насчет

git reset --soft HEAD~[n] 
git commit 

Это должны давит ваш п последних коммитов.

+0

Это действительно отлично работает и не вызывает у меня конфликтов. Думаю, мне придется жить с повторной записью опубликованной истории филиалов в каком-то разветвленном – deltaskelta

+0

Прохладный, рад, что я мог бы помочь. – qantik

1

Что вы здесь делаете, что не приведет к слиянию конфликтов?

К сожалению, конфликты слияния могут быть неизбежны, если вы раздавите коммиты.

Вы можете попробовать выполнить интерактивную переустановку, в которой вы комбинируете исправление, фиксирующееся в одном коммите. Имейте в виду, что это решение рекомендуется только в общем случае, если у вас есть не, но нажал эту ветку на пульт. Итак, если вы сделали локальные коммиты 1-5 локально, не подталкивали их, и вы хотите их комбинировать, тогда интерактивная перебаза - хороший выбор.

Начала следующее:

git checkout tests 
git rebase -i HEAD~5 

Это должно вызвать окно, показывая вам следующий список из 5 фиксаций, переходя от старого коммит 1 до новейших фиксация 5 вашего tests ветви:

pick 07c5abd message for commit 1 
pick dl398cn message for commit 2 
pick 93nmcdu message for commit 3 
pick lst28e4 message for commit 4 
pick 398nmol message for commit 5 

Вы можете видеть, что по умолчанию опция для каждого фиксации - pick. Если вы закончили rebase сейчас, вы просто сохранили бы каждый фиксатор как есть, что фактически не-op. Но так как вы хотите, чтобы раздавить определенный средний зафиксируется, редактировать и изменять список для этого:

pick 07c5abd message for commit 1 
squash dl398cn message for commit 2 
squash 93nmcdu message for commit 3 
squash lst28e4 message for commit 4 
squash 398nmol message for commit 5 

Сохранить и закрыть файл, а затем завершить перебазирования.

Обратите внимание, что происходит выше. Набрав сквош, вы говорите Git, чтобы объединить эту фиксацию в один выше, который является фиксацией, которая была получена непосредственно перед ней. Таким образом, это говорит о том, чтобы squash совершить 5 назад в commit 4, а затем раздавить 4 на 3 и т. Д., Оставив вам только одну фиксацию для фиксации с 1 по 5. Другие коммиты, которые произошли до фиксации 1, остаются как есть.

Если коммиты вы просто раздавленные не были вытеснены, и совершить 1 опережать origin/tests, то вы должны просто быть в состоянии выдвинуть эту ветвь с помощью: Если это не работает

git push origin tests 

, вы возможно, придется заставить подтолкнуть отрасль:

git push --force origin tests 

Но имейте в виду, что это переписывает удаленную историю, и вы должны в идеале не должны делать это.

+0

ОК, я понимаю о рисках переписывания истории, и я не хочу этого делать. Предполагая, что я должен подтолкнуть много «дерьма» к удаленной ветке 'test' ... Что бы вы рекомендовали сделать чистое слияние с мастером? – deltaskelta

+0

Я только что попробовал сделать тестовое репо и перенять исходный файл, а затем создать новую ветвь, совершив две изменения, затем проверить мастер и 'git merge branch2', и я вижу все мои коммиты из ветки2 на главном. Есть ли другой способ, которым я должен это делать? – deltaskelta

+0

ОК это выглядит хорошо для меня. Думаю, мне нужно вручную скопировать ранее написанное или воссоздать хорошо сгенерированное сообщение о коммитах при слиянии? – deltaskelta

1

Git Squash работает с объединением коммитов с одним.

Как указано выше, git rebase -i HEAD~n замените n на количество коммитов, которые вы хотите раздавить, и force push, если необходимо.

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

Идите в сквош только тогда, когда вам действительно не нужно указывать изменения, которые вы делаете. Это изменяет отчет о проделанной работе.

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