git-reset hash
устанавливает ссылку на ветвь для данного хэша и, при необходимости, проверяет ее с помощью --hard
.
git-checkout hash
устанавливает рабочее дерево для данного хэша; и если хеш не является именем ветви, вы получите оторванную голову.
в конечном счете, git имеет дело с 3 вещами:
working tree (your code)
-------------------------------------------------------------------------
index/staging-area
-------------------------------------------------------------------------
repository (bunch of commits, trees, branch names, etc)
git-checkout
по умолчанию просто обновляет индекс и рабочее дерево и может дополнительно обновлять что-либо в хранилище (с параметром -b
)
git-reset
по умолчанию просто обновляет репозиторий и индекс, а также опционально рабочее дерево (с опцией --hard
)
Вы можете думать о хранилище так:
HEAD -> master
refs:
master -> sha_of_commit_X
dev -> sha_of_commit_Y
objects: (addressed by sha1)
sha_of_commit_X, sha_of_commit_Y, sha_of_commit_Z, sha_of_commit_A ....
git-reset
манипулирует тем, на что указывают ссылки на ветви.
Предположим, ваша история выглядит так:
T--S--R--Q [master][dev]
/
A--B--C--D--E--F--G [topic1]
\
Z--Y--X--W [topic2][topic3]
Имейте в виду, что ветви - это просто имена, которые продвигаются автоматически при коммите.
Итак, у вас есть следующие ветки:
master -> Q
dev -> Q
topic1 -> G
topic2 -> W
topic3 -> W
А ваша текущая ветка topic2
, то есть ГЛАВА указывает на тему 2.
HEAD -> topic2
Затем git reset X
сбросит имя topic2
так, чтобы оно указывало на X; Это означает, что если вы сделаете коммит P на ветке topic2, все будет выглядеть так:
T--S--R--Q [master][dev]
/
A--B--C--D--E--F--G [topic1]
\
Z--Y--X--W [topic3]
\
P [topic2]