2016-12-01 17 views
2

Я новичок в git и не знаю, как подойти к этому.Отключить git commits но сохранить изменения внесенные с

Я хочу отменить серию конкретных коммитов (относящихся к одному файлу), которые мы решили, не являются хорошим решением проблемы, но я хочу сохранить все другие коммиты, введенные с тех пор.

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

Это звучит примерно так:

X -> Y -> X -> -Х ->Y -> X -> X

Где Y относится к фиксации, относящимся к этой конкретной функции, и Х - все фиксации, которые мы хотим сохранить нетто, в итоге:

X -> X -> -Х -> X -> X

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

Будет ли вишневый выбор лучше подходит?

РЕДАКТИРОВАТЬ: Возможно, стоит упомянуть, что все эти коммиты толкаются.

+1

Interactive перебазироваться и просто удалить мешающие коммиты подборку. –

ответ

1

Вы можете использовать git rebase --onto, как описано здесь: https://blog.pivotal.io/labs/labs/git-rebase-onto

В вашем конкретном случае:

X1 -> Y1 -> X2 -> X3 -> Y2 -> X4 -> X5 

Команды будут:

git rebase --onto X3 Y2 # strips Y2 
git rebase --onto X1 Y1 # strips Y1 
+0

Просто для подтверждения, это нужно сделать в обратном хронологическом порядке? От последнего до самого раннего? – Nobilis

+0

@Nobilis: вы можете сделать это в любом порядке, но редактирование более ранней истории может изменить последующие хэши, поэтому я решил сделать это таким образом, потому что вы можете записать хэши в начале процесса, а затем использовать их, не проверяя их снова. Если вы делаете это наоборот, это не должно делать ничего страшного, но я думаю, что это может потерпеть неудачу, и вам придется искать хэши снова перед каждым шагом. –

+0

Спасибо за подсказку, я буду рассматривать rebase -onto, о котором я не знал в будущем, но, нажав эти коммиты, кажется, что история перезаписи не является подходящим вариантом в нашем случае. Мне придется спуститься по пути. – Nobilis

0

Вы можете вернуть конкретный файл к предыдущему фиксация:

git reset <commit hash> <filename>

Это может быть хорошо, чтобы просмотреть изменения, внесенные в файл первой:

git diff <commit hash> <file name>

Вы можете получить совершить хэши с git log.

В качестве альтернативы, вы можете просто оформить предыдущую версию файла из системы управления версиями:

git checkout -- <file name>

Edit: Больше информации here.

0

Мне лично я предпочитаю git rebase -i HEAD ~ 10 (интерактивная перезагрузка последних 10 коммитов), где я бы сбросил плохие коммиты, просто комментируя их строки.

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

2

Вы можете использовать интерактивной Rebase для того, чтобы исправить свои ошибки если ваши коммиты еще не разделяет (до сих пор местные коммиты в репозитории)

syntaxe является: мерзавец перебазироваться --interactive совершить года hash (или просто git rebase -i commit's hash)

В этом случае можно сказать, что хэш вашего первого x commit является x1 (используйте git log для git хеш-кода для этой фиксации), то вы можете использовать: git rebase -i x1

enter image description here

Для каждой фиксации вы хотите удалить заменить выбрать по капле

Затем выйти из режима редактирования (с помощью клавиши ESC) и: WQ