Skip to content

[git] Коммиты

rsajob edited this page Jul 6, 2015 · 8 revisions

Взять из статьи Редактирование истории в git

Перенос отдельного коммита из другой ветки (cherry-pick)

Если в 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)

git clean -d -x -n
  • -d - включать директории
  • -x - включать файлы игнорируемые git (из .gitignore)
  • -n - только показать что будет сделано, заменить на -f для выполнения

Изменение коммитов

Тут главное чтобы изменяемые коммиты небыли залиты на сервер. Если будут залиты получится неприятное дублирование и вообще каша.

Правка текста последнего коммита

git commit --amend

Если нужно поменять много коммитов то делается при помощи rebase, читаем в статье Изменение коммитов в Git

Clone this wiki locally