LINUX.ORG.RU

Git: как откатиться назад, но оставить коммит для истории

 


0

1

Я использую GIT единолично просто как хранилище истории версий, без ветвлений, слияний и т. п. Коммичу, коммичу, иногда смотрю когда и что написал.

Сейчас возникла необходимость сделать следующее: нужно откатить последний коммит, но так, чтобы он остался в истории. То есть, нужно «обойти» последний коммит, как показано на рисунке:

http://i.piccy.info/i9/9798454faefe38fd495ba76d15a86d17/1384691418/12802/3836...

Я нахожусь в точке 2. Нужно откатиться до точки 1, кое что поправить, и сделать точку 3. Потом точку 4, 5, и т.д. Но при этом «состояние» точки 2 должно остаться доступным в случае чего.

Читаю про «мягкие» и «жесткие» ресеты, и не понимаю, как работает мягкий ресет. Хотя, воде бы, именно он нужен в данном случае. Везде написано одно и то же:

«Мягкий» (с ключом "--soft") резет оставит нетронутыми ваши индекс и все дерево файлов и директорий проекта, вернется к работе с указанным коммитом. Иными словами, если вы обнаруживаете ошибку в только что совершенном коммите или комментарии к нему, то легко можно исправить ситуацию.



Как это так «нетронутыми все дерево файлов и директорий проекта»? Тогда что поменяется после команды reset?

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

Как это можно сделать? Какую последовательность команд использовать?



★★★★★

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

git branch some_old_trash

2. унести хед текущей ветки на коммит назад, это

git reset --hard HEAD^

upd: на счёт --soft, он нужен если нужно что-то поправить в текущем коммите. Мб тебе нужен софт, не пойму из описания.

mashina ★★★★★ ()
Последнее исправление: mashina (всего исправлений: 2)

Как это можно сделать? Какую последовательность команд использовать?

git branch newbranch HEAD~1

?

fmap ()

Да в принципе можно и git tag сделать. Даже если ветку удалишь, пока тэг висит, состояние доступно.

Adonai ★★★ ()

Тогда что поменяется после команды reset?

после:

просто reset очистится стейдж, т.е. обратная команда для git add

--soft, HEAD текущей ветки уйдёт на указанный коммит + все выброшенные изменения попадут в текущий стейдж. Далее можно будет внести в них изменения и снова закоммитить.

--hard, тоже что и --soft, но все выброшенные изменения потеряются. Т.е. в твоём случае откатишься на состояние commit1 без возможности доработать commit2

mashina ★★★★★ ()

Вот так:

git checkout -b previous_version_with_commit_2 # создаем ветку с бекапом commit 2 (необязательно, если ветка уже есть)
git checkout HEAD~1 # переключаемся на commit 1
git checkout -b version_with_commit_1 # создаем ветку без commit 2

# (опционально) добавляем существующие коммиты поверх commit 1
git cherry-pick ${whatewer}

Или еще короче

git branch previous_version_with_commit_2 # бекапим commit 2
git reset --hard HEAD~1 # удаляем commit 2 из текущей ветки

KennyMinigun ★★★★★ ()
Последнее исправление: KennyMinigun (всего исправлений: 1)
Ответ на: комментарий от KennyMinigun

git branch previous_version_with_commit_2 # бекапим commit 2
git reset --hard HEAD~1 # удаляем commit 2 из текущей ветки

Сделал так. Спасибо.

Xintrea ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.