Git Daily - Evanto/qna GitHub Wiki

1. Как временно переключиться в один из прошлых коммитов чтобы посмотреть содержимое?

master branch:
                
                i   wt
A - B - C - D - ? - ?
            ↑
           HEAD
          

A, B, C, D — коммиты в ветке master. HEAD — положение указателя HEAD. i — индекс Git. Если совпадает c HEAD - пуст. Если нет - содержит изменения, подготовленные к следующему коммиту. wt — состояние рабочей области проекта (working tree). Если совпадает с i — нет неиндексированных изменений, если не совпадает — есть изменения. ↑ — коммит, на который указывает HEAD.

1. Временно переключиться на другой коммит

Перейти в коммит aaaaa:
git checkout aaaaa
, где aaaaa - ключ коммита из лога команды git log.
Пример отображения коммита в логе:

commit e75e50de3fd1afccae9debcc4e71c01b5954a386
Author: Ivan Ivanich <[email protected]>
Date:   Wed Sep 6 18:29:41 2017 +0300

    voting works ok for questions, but not for answers

После этого репозиторий будет находиться в состоянии «detached HEAD»:

eva@eva-CR70-2M-CX70-2OC-CX70-2OD:~/Develop/Ruby/qna$ git checkout e75e50de3fd1afccae9debcc4e71c01b5954a386
Note: checking out 'e75e50de3fd1afccae9debcc4e71c01b5954a386'.

You are in the 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at e75e50d... voting works ok for questions, but not for answers

Чтобы переключиться обратно, используйте имя ветки (например, master):

git checkout master

Ещё по теме:
Как вернуться (откатиться) к более раннему коммиту?

Ниже про черрипик неверно написано, поправить потом.

2. Как переместить несколько выбранных коммитов в другую ветку?

Cherry-Pick – способ забрать в текущую выбранную ветку отдельный коммит из другой ветки, не затрагивая остальных коммитов. Полезен, когда есть ветка на удаление, но в ней есть нужные коммиты, которые надо перенести.

git cherry-pick позволяет переносить несколько коммитов сразу. Для этого нужно задать, например, диапазон коммитов: git cherry-pick F..E. Подробнее о задании диапазонов коммитов (en)

Справка по команде: man git-cherry-pick

Как черрипикнуть коммит X из ветки A в ветку B?

  1. Переключиться на ветку, ИЗ которой переносим коммит: git checkout A
  2. Получить хэш коммита, который хотим черрипикнуть, из лога: git log
  3. Черрипиком перейти в ветку, куда переносим коммит: git checkout cherry-pick
  4. Черрипичим в нее коммит: git cherry-pick X, X - хэш коммита X.

Links: