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
, то есть точки с головы до topic2.
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]
Я рассмотрел это в обновлении моего ответа на один из ваших предыдущих вопросов - посмотрите на искусство ascii около вершины, особенно там, где он говорит «Отступление: ...» (столько, сколько я бы хотел больше повторить для повторного ответа на него здесь) – Cascabel
Я действительно думаю, что вы можете опубликовать свой ответ здесь и получить репутацию от него. Если кто-то ищет определенные знания, он не найдет другого поста. Эта цель - очень конкретная тема, и она заслуживает отдельной страницы. Кстати, похоже, вы мой наставник Git :-) harigato, senseï! –
Но я понимаю, разница в том, что сброс перемещает ветку, а не проверку. –