2017-02-09 21 views
0

Это локальный репозиторий. Нет ветвей. Вход показываетПерейти к предыдущему фиксации, внести изменения и зафиксировать как новый заголовок

HEAD->master A 
9812   B 
4578   C 

Я хочу сделать текущий рабочий каталог так же, как C, редактировать несколько файлов, заменить несколько двоичных файлов (PDF) и сделать новое обязательство, скажем MODC. Таким образом, новый журнал будет:

HEAD->master ModC 
7845   A 
9812   B 
4578   C 

Кажется простым. Но я боролся и столкнулся со всеми видами ветвей, слияниями, перестановками, сбрасыванием!

Что такое уверенный выстрел, безупречный способ достижения того, что я хочу?

+0

Сброс ветви к предыдущей фиксации происходит только тогда, когда вам не нужны текущие изменения совершающих (в вашем случае возврата совершить 'A'). Но из вашей второй схемы кажется, что вы хотите создать новый коммит с измененными изменениями из commit 'B' и сохранить изменения в фиксации' A'. – Eimantas

+0

Да. Я хочу достичь именно того, что я описал в вопросе. – deshmukh

+0

Итак, вам все еще нужны коммиты 'A' &' B' или нет? – Eimantas

ответ

1

Вот способ добиться того, что:

# get content of 'C' commit (without creating any commit yet) : 
git checkout 4578 -- . # <- the '.' is very important. see below 

# edit whatever files you want ... 

# make regular commit with your new content : 
git add <files> 
git commit 

Тонкое различие:

git checkout 4578 

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

git checkout 4578 . 
# or 
git checkout 4578 -- . 

будет не трогаем текущие активную фиксацию и поместить содержимое фиксации 4578 на диске

+0

Недостатком этого метода является то, что вы теперь смешивали две вещи в одном коммите: возвращая A и B, а затем добавляя новые изменения. Это затруднит обзор. – Schwern

1

Я хочу сделать текущий рабочий каталог так же, как C

Вы можете использовать git revert, чтобы отменить изменения, которые пришли после того, как С.

git revert C..HEAD 

Это сделает новый фиксация, которая возвращает A и B.

HEAD->master Revert A & B 
7845   A 
9812   B 
4578   C 

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

HEAD->master ModC 
3847   Revert A & B 
7845   A 
9812   B 
4578   C 

You can read more about how to undo changes in the Pro Git book.


Вы также можете сделать так, А и Б никогда не случалось с git reset. git reset может быть использован для перемещения ветви туда, где вы хотите, как перемещение мастера обратно к С.

git checkout master 
git reset --hard C 

Теперь вы будете иметь это.

HEAD->master   C 

Это как если бы А и Б никогда не случались. Теперь вы можете добавлять и фиксировать свои изменения поверх С, как обычно.

Существует еще более мощный инструмент, называемый «интерактивной перезагрузкой», который может испортиться с историей, но вы также можете по-настоящему испортить это. You can read more about that in the Pro Git book.

+0

Спасибо. Но чтобы убедиться, что решение применяется к * любому * предыдущему фиксации, я изменил вопрос. Вы посмотрите на это? – deshmukh

+0

@deshmukh Когда вы говорите «* Я хочу сделать текущую рабочую директорию такой же, как C *», вы имеете в виду, что хотите выбросить A и B? – Schwern

+0

№ A и B останутся в git. Поэтому я могу вернуться к A или B, когда захочу. Просто, что все файлы в рабочем каталоге будут от C. – deshmukh