В чем разница между "git reset --hard master" и "git reset --hard origin/master"?

Я пробовал много ссылок на stackoverflow/в другом месте, чтобы правильно понять поведение

git reset --hard option

Я знаю, что:

  • если он опущен или если это origin, сброс выполняется при последней фиксации на origin
  • если хэш SHA1 предоставляется, сброс выполняется при соответствующей фиксации.

чего я не понимаю, это следующее значения:

  1. origin
  2. HEAD
  3. origin/master
  4. 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 будет соответственно?