В чем разница между "git reset --hard master" и "git reset --hard origin/master"?
Я пробовал много ссылок на stackoverflow/в другом месте, чтобы правильно понять поведение
git reset --hard option
Я знаю, что:
- если он опущен или если это
origin, сброс выполняется при последней фиксации наorigin - если хэш SHA1 предоставляется, сброс выполняется при соответствующей фиксации.
чего я не понимаю, это следующее значения:
originHEADorigin/masterorigin/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/masterorigin/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 будет соответственно?