2015-07-06 2 views
0

В моем проекте у меня было две коммиты; A, а затем B, оба из которых были нажаты на пульт.Проверка, а затем редактирование старого коммита с помощью git

Однако я понял, что мои изменения в фиксации B были плохими идеями и вернулись назад, чтобы совершить A, используя git checkout A.

Затем я сделал некоторые изменения для совершения A, совершив commit C, и это то, что я хочу, затем надавить на мой пульт в качестве последней фиксации. Однако, когда я это делаю, он только толкает различия между A и C на текущую версию пульта, которая является B; другими словами, он применяет фиксацию C для фиксации B.

Как получить локальную копию на пульте дистанционного управления в качестве новых, чтобы история фиксации выглядела так: A, B, C (т.е. без возврата B - Я все еще хочу B в моей истории COMMIT)

ответ

1

Если вы не хотите, чтобы переписать историю, вы должны просто совершить Revert для фиксации B:

git revert B 
git commit 
+0

А, чтобы уточнить (см. Редактирование, которое я сделал), я хочу сохранить B в своей истории совершения сделки. Я хочу нажать C как фиксацию поверх B – Miguel

+0

Оказалось, что он возвращает * делает * сохранить возвращенную фиксацию в истории, что именно то, что я хотел! – Miguel

0

вы можете использовать интерактивную Rebase который позволяет перемещаться вокруг порядка фиксации. Запустив git rebase -i HEAD^^^, вы можете вернуться к последним трем записям; вам будет предоставлен файл с фиксацией хешем. Просто отредактируйте файл, перемещая строки вверх/вниз, чтобы упорядочить их в нужном порядке, а затем сохраните файл, и git применит эти изменения в этом порядке для вас.

+0

Я написал больше о перезагрузке http://alblue.bandlem.com/2011/06/git-tip-of-week-rebasing.html и http://alblue.bandlem.com/2011/06/git-tip- of-week-rebasing-revisited.html, если вам интересно узнать больше о том, что они собой представляют. – AlBlue

+0

Но порядок моих коммитов прав: A, затем B, затем C. Проблема в том, что я хочу, чтобы commit C включал возврат к A, а также новые изменения. Вместо этого он просто включает новые изменения поверх B (без возврата). – Miguel

+0

Так что 'git revert A' создать' -A', а затем выполнить 'git rebase -i HEAD ^^' для выполнения интерактивной перестановки '-A' и' C' совершают, затем выполняют 'squash' вместо' edit' для второго коммита, чтобы он стал 'CA' commit. – AlBlue

1

Вы можете создать патч с различиями между А и С, и применять его на верхней части B, чтобы создать совершенно новый коммит, как это:

git diff A C > patch.git 
git checkout B 
... 

На этом этапе убедитесь, что ваш рабочий каталог чист ,

git apply patch.git 
... 

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

git add ... 
git commit