В чем разница между "git reset --hard master" и "git reset --hard origin/master"?
Я пробовал много ссылок на stackoverflow/в другом месте, чтобы правильно понять поведение
git reset --hard option
Я знаю, что:
- если он опущен или если это
origin
, сброс выполняется при последней фиксации наorigin
- если хэш SHA1 предоставляется, сброс выполняется при соответствующей фиксации.
чего я не понимаю, это следующее значения:
origin
HEAD
origin/master
origin/branch
все, похоже, имеют одинаковое поведение, т. е. они указывают на последнюю фиксацию master
.
пожалуйста, объясните, что такое значение всех 4 варианта значения, указанных выше.
Я также хотел бы знать, нахожусь ли я в определенной ветви, как я могу сбросить последнюю фиксацию на этой самой ветви?
Если, например, я на v1.2
, origin/v1.2
все еще берет меня на последнюю фиксацию master
.
2 ответов
прежде всего вам нужно понять, что имена ветвей и тегов - это просто указатели на хэш-значения, которые представляют собой одну фиксацию, если вы говорите, что есть 4 варианта, которые имеют одинаковое поведение, то первый логический ответ заключается в том, что все они указывают на одну фиксацию
origin
Я не уверен в этом, но я думаюorigin
им себя разрешит кorigin/HEAD
который, я думаю, будет зависеть от ваших настроек github, в github вы установили " по умолчанию бранч",origin/head
разрешаетorigin/[default_branch]
, в вашем случае я предполагаю, что это мастер, поэтому он имеет тот же эффект, что иorigin/master
.HEAD
всегда указывает на текущий коммит, тот, на котором вы стоите, поэтомуgit reset --hard HEAD
будет постоянно удалять все изменения в отслеживаемых файлах и поэтапных изменениях файлов, но не изменять хэш фиксации.origin/master
последняя фиксация в удаленной главной ветви с момента последней выборки / вытягивания, каждый раз, когда вы совершитьmaster
местныеmaster
обновляется и вашorigin/master
обновляется тоже, если кто-то еще нажимает наmaster
ваше РЕПО не будет знать, что есть обновление, если вы не сделаетеgit fetch
затем вашorigin/master
будет двигаться впередиmaster
, или, может быть, даже расходятся.
запускgit reset --hard origin/master
будет иметь тот же эффект, если в настоящее время вы находитесь наmaster
филиала иmaster
синхронизируется сorigin/master
origin/branch
я не уверен, что это представляет, потому что нетorigin/branch
по умолчанию, поэтому я предполагаю, что вы создали ветку под названиемbranch
и, случается, находится в той же фиксации, что и ваш мастер, чтобы подтвердить, что вы можете попробовать сделатьgit branch
чтобы увидеть все ваши ветви, я предполагаю, что вы найдете один называетсяbranch
чтобы увидеть все это визуально, вы можете попробовать запустить git log --graph --decorate --all
или я предпочитаю визуальный инструмент, как gitk
, если у вас установлен двоичный файл, вы запустите gitk --all
чтобы увидеть все филиалы относительно друг друга
master
, HEAD
, origin/something
и, может быть, какой-то тег, почему бы и нет,мая все указывают на одну и ту же фиксацию, но они определенно не одно и то же.
origin
обычно это имя пульт ДУ хранилище.
вы можете увидеть свои пульты и настроить новые с git remote -v
.
попробуй (с -v
) и это, вероятно, будет иметь смысл.
remote/somebranch
указывает на голову некоторых ветки на удаленном репозитории.
origin/master
указывает на главу master
on origin
.
это то же самое как master
?
да и нет. Если вы потянете свою главную ветку, выполните некоторую работу, а тем временем кто-то другой совершит master
и подталкивает к origin
они будут отличаться.
когда вы git fetch origin
, потом origin/master
будет иметь дополнительные коммиты (будет вперед).
HEAD
просто "the текущая фиксация".
Думайте об этом как .
.
посмотреть этот вопрос
еще раз, это мог бы быть таким же, как master
, но если вы проверяете другую ветку или фиксацию или находитесь в середине ребаза, ну, это не так.
поэтому попробуйте это на новом репозитории, над которым никто больше не работает:
$ git checkout master
$ git log -1 --format="%H" HEAD
123abc
$ git log -1 --format="%H" origin/master
123abc
они одинаковые!
$ git diff origin/master
конечно их содержание тот же.
$ echo "foo" > foo
$ git add foo
$ git commit -m "Foo the thingy"
$ git log -1 --format="%H" HEAD
321bca
$ git log -1 --format="%H" origin/master
123abc
Ах, смотрите, теперь они разные!
$ git push origin master
$ git log -1 --format="%H" HEAD
321bca
$ git log -1 --format="%H" origin/master
321bca
а теперь их нет! мы подтолкнули нашу последнюю приверженность, и они оба указывают на то же самое.
$ git checkout -b newbranch
$ echo "baz" > baz
$ git add baz
$ git commit -m "Baz the thingy with the stuff"
$ git branch -a
master
* new_branch
origin/master
$ git log -1 --format="%H"
789def
$ git log -1 --format="%H" master
321bca
git log -1 --format="%H" origin/master
321bca
git log -1 --format="%H" origin/new_branch
unknown revision or path not in the working tree.
конечно, нет. Мы не давили new_branch
to origin
, это только на локальной машине
git checkout 123abc
мы только что проверили 123abc
старые главы master
. Это не глава филиала, но мы можем это проверить только тот же.
Note: checking out 123abc. You are in 'detached HEAD' state, etc
$ git checkout -b old_master
$ git branch -a
master
* new_branch
origin/master
old_master
теперь угадайте, что их SHA1 будет соответственно?