2016-05-11 11 views
1

У меня было 2 фиксаций (местные) и моя история была: A - B:Возвращаясь к последней фиксации после мягкого сброса и изменить

  • В совершающем файл myfile_v1.txt
  • В commit B, несколько других файлов.
  • В моем рабочем каталоге, я обновил файл из первой фиксации с небольшой поправкой: myfile_v2.txt

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

Я сделал это:

  • reset --soft на A
  • addmyfile_v2.txt
  • commit --amend

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

Любые идеи?

ответ

1

A hash hash содержит полную историю этого фиксации. Поэтому, если вы измените историю, история больше не принадлежит этому коммиту, но фиксация должна быть воссоздана.

Существует много способов сделать это. В вашем случае вы можете просто cherry-pickB и все это хорошо.

Как бы это было сделано, это интерактивная перестановка (rebase -i). Либо сначала сделайте интерактивную перезагрузку, изменив строфу A на edit, а затем сделайте исправление, а затем продолжайте перезагрузку. Или, альтернативно, сначала создайте новый фиксатор поверх B, а затем используйте rebase -i для изменения порядка и squash или fixup второй фиксатор. Или даже с помощью автоматической фиксации или автоматического сквоша.

+0

Спасибо! Я не знал команду «вишневый», очень полезный! В следующий раз я попробую другое решение. – Ellda

1

Вы не можете изменить предыдущую фиксацию. Каждая фиксация уникальна.

Что вы можете сделать, так это воссоздать историю с новыми коммитами. С помощью команды git-rebase

Я понимаю, что вы в данный момент сейчас:

Pre_A - A - B 
     \ 
     A1 

Вы потеряли свой «B» Commit. Для восстановления фиксации использовать git-reflog

git reflog 

Вы увидите последнюю позицию филиала HEAD. Одним из них является фиксация B. Запишите Хэш начала строки.Пример:

git reflog 
    a123b Ammend Commit of Previous A that generates A1 commit 
    b234c git reset soft to A Commit 
    c345d B Commit 
    b234c A Commit ##Look that the HASH is the same that the git-reset## 

Как только у вас есть HASH B Commit. Создайте ветвь для восстановления фиксации.

git branch tmpBranch c345d 

На данный момент, что вам нужно, чтобы поставить это обязательство в новой истории «А1», вместо того, чтобы быть в «А». Вы получаете это, используя git-rebase

Я полагаю, что вы работали в своей основной ветке.

git checkout tmpBranch 
git rebase --onto master tmpBranch~1 tmpBranch 

Это воссоздать историю из одного фиксации отсталых tmpBranch фиксации до tmpBranch не совершать (в вашем случае только один фиксации, The B фиксации) в мастера (что указывает на A1 фиксации).

+0

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

+0

Я разрешил его с помощью вишневого цвета, но спасибо за полезную информацию! – Ellda

+0

Вы правы. Этот случай является более простым решением для обработки вишни, чем мое. Я сосредотачиваюсь на части 'git-reflog', потому что я понял, что он« потерял »фиксацию B. – blashser