2013-07-16 2 views
11

я получил несколько фиксаций в моем хранилище:Git: удалить ранее фиксации, но сохранить последние изменения

как:

A - Added Feature A 
B - Removed Feature B 
C - Redesigned Feature C 
D - Added Feature D 
E - Added Feature D 

где Е последние фиксации я сделал. Теперь я хочу избавиться от изменений, внесенных мной с помощью функции C, но я хочу сохранить изменения, добавленные с помощью D и E.

Надеюсь, вы можете мне помочь.

Спасибо

+2

возможно дубликат [Git: удаление выбранного фиксации записей журнала для хранилища] (http://stackoverflow.com/questions/495345/git-removing-selected-commit-log-entries-for- a-repository) – jszakmeister

+1

@jszakmeister: Не совсем то же самое, связанный пост хочет скомбинировать коммиты, а OP хочет здесь их удалить. – CharlesB

+1

@CharlesB Не совсем верно. Скручивание B и C было выбором, и поэтому он снимал коммиты в вопросе OP. Ответ содержит указания обоим. – jszakmeister

ответ

7

Если вы хотите «избавиться от изменений» (как указано в вашем телеобъекте), а не фактически «удалить фиксацию» (как указано в заголовке), простой вариант: , добавив новый совершить, делая точно противоположное тому, что сделал предыдущий фиксатор.

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

git revert - это инструмент, используемый для создания таких злых близнецов совокупности совершений.

0

это называется перебазирования: вы хотите, чтобы переключатель -i.

чтения: https://www.atlassian.com/git/tutorial/rewriting-git-history#!rebase-i

на аналогичный вопрос/ответ см: https://stackoverflow.com/a/2938393/2536029

+0

Спасибо. Но я использовал 'git revert C', который удалил все изменения, сделанные с помощью C. Это было легко. – Strernd

+1

, что было бы первым предложением в связанном ответе. – mnagel

0

, чтобы сделать это, выполните следующие действия:

git rebase -i HEAD~3 

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

D - Added Feature D 
E - Added Feature D 
C - Redesigned Feature C 

you sav е и выход, а затем

git reset HEAD^ 

отменяются фиксации C.

20

Interactive rebase является вашим другом!

Как уже сказал:

$ git rebase -i HEAD~5 

... где -i является интерактивным флагом, и HEAD~5 средств включают в себя последние 5 коммитов в интерактивном перебазировании.

Когда вы получаете редактор вверх в результате выдачи выше, посмотрите на комментарии в открытом файле:

# Commands: 
# p, pick = use commit 
# r, reword = use commit, but edit the commit message 
# e, edit = use commit, but stop for amending 
# s, squash = use commit, but meld into previous commit 
# f, fixup = like "squash", but discard this commit's log message 
# x, exec = run command (the rest of the line) using shell 
# 
# These lines can be re-ordered; they are executed from top to bottom. 
# 
# If you remove a line here THAT COMMIT WILL BE LOST. 
# 
# However, if you remove everything, the rebase will be aborted. 
# 
# Note that empty commits are commented out 

Ключ немного для вас Если удалить строку здесь COMMIT БУДЕТ ПОТЕРЯНО.

Итак, удалите строки, которые ссылаются на коммиты, от которых вы хотите избавиться, сохранить и закрыть, а git будет обрабатывать остальные (возможно, вам придется исправить некоторые конфликты в зависимости от характера фиксации и вернуть вас пытаюсь удалить).

Важно отметить, что если вы уже подтолкнули ваш код, а другие потянули его, вышеуказанное не будет работать, так как коммиты вернутся туда, в следующий раз, когда кто-то, кто проведет вашу ветку, , Интерактивная rebase удаляет коммиты в той мере, в которой их нет, поэтому другие клоны не знают, что они были удалены. В следующий раз, когда они нажимают, они попытаются повторно установить их, так как местные клоны «видят», что у источника нет объектов (коммиттов), которые вы удалили.

+1

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

+0

@CyrilCHAPON - пока я согласен с тем, что это хороший ответ (на название вопроса), ИМО это не обязательно правильный ответ на поставленный вопрос (в теле). Ответ IMO @ aib является предпочтительным, потому что rebasing является разрушительным (переписывает историю - как отмечено в этом ответе, но не выделяется достаточно IMO). Иногда это единственный ответ, но перестановка ИМО должна использоваться только на главной ветке в качестве последнего средства. –

1

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

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

0
git reabse -i HEAD~3 

вы будете иметь список ваших 3 последней фиксацию сообщения

C - Redesigned Feature C 
D - Added Feature D 
E - Added Feature D 

вы просто вставить й сбросу мерзавец ГОЛОВА^перед фиксацией вы хотите отменить, вы хотите, чтобы отменить обязательство C, поэтому его будет как этот

C - Redesigned Feature C 
x git reset HEAD^ 
    D - Added Feature D 
    E - Added Feature D 

выход Rebase консоли, вы увидите, что ваши не совершат больше не в журнале и их файлы на сцене.

0

Если вы используете TortoiseGit в Windows, вы можете щелкнуть правой кнопкой мыши папку Git, затем щелкните TortoiseGit > Show log. Вы можете просмотреть все сделанные ранее коммиты, а затем проверить фиксацию, на которую хотите вернуться.

Нажмите на фиксацию, и вы можете увидеть измененные файлы ниже. Нажмите правой кнопкой мыши на файлы, которые нужно вернуть, а затем щелкните revert to parent revision.

How to revert commits

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