-
Notifications
You must be signed in to change notification settings - Fork 24
[git] Коммиты
Взять из статьи Редактирование истории в git
Если в eterhack внесено изменение, которое нужно перенести в master:
git checkout master
git cherry-pick COMMIT-ID
"Отказаться" от нескольких последних коммитов в истории (в частности, от последнего) Создать новую ветку new в нужной нам точке истории и переставить на неё существующую:
git checkout <id> -b new
git branch -M <нужная нам ветка>
Например, отказаться от последнего коммита на ветке master (если мы на нём находимся), можно так:
git checkout HEAD^ -b new_master
git branch -M master
После первой команды мы находимся "на один коммит назад" и создали там новую ветку с именем new_master (текущей веткой является new_master). После второй команды мы "переименовали" new_master в master, -M позволяет проигнорировать, что master уже есть.
Тоже самое можно сделать одной командой:
git reset --hard <id>
Работаем надо фичей чисто локально, ничего не заливая в удалённый репозиторий. В процессе работы делаем несколько коммитов. Потом находим баги и делаем ещё коммиты. В результате иногда хочется объеденить несколько последних коммитов в один. Есть способ, но это можно делать только ДО ЗАЛИВКИ ИЗМЕНЕНИЙ в удалённый репозиторий. Если сделать после то будет путанница. делаем:
git plog
Находим в тот коммит (запоминаем его id), после которого все изменения можно собрать в один коммит.
Затем командой reset перемещаем метку ветки на этот коммит с cохранением всех изменений и индекса (ключ --soft)
git reset --soft <id_коммита>
Теперь мы откатились назад и в рабочей папке у нас лежат все изменеия сделанные после коммита с id. Теперь их просто надо закоммитить одинм коммитом
git ci
git reset [--ключ] <id>
Позволяет "передвинуть" текущий HEAD (и метку ветки) на заданный коммит. Есть три варианта, задаваемых ключами:
-
--hard - "выкидывает" всё текущее состояние рабочий копии, вы оказываетесь на коммите , как будто после него ничего не было; Т.е. это просто "перестановка ветки".
-
--soft - "сохраняет" изменения в рабочей копии (и в "индексе" git) и добавляет к ним изменения из "истории" от до точки, из которой мы переходим. Более подробно см. п. "Слияние нескольких коммитов в один".
-
--mixed - (по умолчанию) - ведёт себя как --soft, но не изменяет состояние "индекса" git (оно будет соответствовать коммиту , на который мы перешли) - новые и изменённые файлы не считаются "добавленными" в индекс, т.е. в отличии от --soft для них требуется явно делать git add, git rm, .etc
Поскольку git reset (особенно --hard), позволяет "потерять" последнее положение ветки (т.е. оставить HEAD "непомеченным"), следует использовать эту команду с осторожностью.
Дописать отсюда: http://www.opennet.ru/base/dev/git_edit_history.txt.html
git clean -d -x -n
-
-d
- включать директории -
-x
- включать файлы игнорируемые git (из .gitignore) -
-n
- только показать что будет сделано, заменить на-f
для выполнения
Тут главное чтобы изменяемые коммиты небыли залиты на сервер. Если будут залиты получится неприятное дублирование и вообще каша.
Правка текста последнего коммита
git commit --amend
Если нужно поменять много коммитов то делается при помощи rebase
, читаем в статье Изменение коммитов в Git