2015-12-04 2 views
0

У меня есть несколько фиксаций на файл:Как устранить фиксацию и ее изменения из git-истории?

  • совершить E
  • фиксации D
  • фиксации C
  • фиксации B
  • совершающие

Я считаю, что я ввел ошибка в фиксации C. Я хочу удалить все изменения, внесенные в Commit C, на , что один файл, не влияя на другие изменения, и поэтому он выглядит как A -> B -> D -> E.

+0

см. Документы для git revert – Andreas

+0

Одна из возможностей: вы можете использовать флаг '--no-commit' для' git revert' и сбросить изменения ко всем остальным файлам – Whymarrh

+0

Вы не можете удалить commit C, не удаляя все изменения в этой фиксации. Где вы хотите сохранить изменения в других файлах, которые были изменены в фиксации C? – Ajedi32

ответ

2

Вы можете попробовать это:

  1. Отъезд отдельную ветку для текущего рабочего состояния (например, backup_branch).
  2. Выясните коммиты фиксации B, D и E (например, выполните git log).
  3. На вашей цели (не резервного копирования) ветви, возвращается к совершению B, делая git reset --HARD committish_b, где committish_b является то, что вы нашли для совершения хэш коммиттерских B. Делая это, вы потеряете все изменения, сделанные после совершения B на вашей целевой ветке.
  4. Cherry pick совершает D и E на вашу целевую ветку, делая git cherry-pick committish_d и git cherry-pick committish_e.
1

Каждое совершение происходит с хешем.

Скажет хэш commit C был abc123

вы могли бы сделать простой git revert <hash>

$ git revert abc123 

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

source

Edit:

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

commit B имеет хэш abc456.

$ git checkout abc456 -- /path/to/file.ext 
+0

Я только хочу вернуть один файл, а не весь commit. –

+0

О, это не то, что этот вопрос сказал. я отредактирую свой ответ. – sircapsalot

+0

Не вернется ли это обратно в Commit B? Я хочу отменить изменения, внесенные Commit C, как если бы Commit D был проверен в следующем после Commit B, и я хочу, чтобы это повлияло на один файл. –

0

мерзавца фотография commitE-ША

мерзавца фотография commitB-ША/путь/к/файлу

(затем совершить как обычно)

Это создаст новое обязательство отменить изменения в одном файле.

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

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