Разница между "checkout" и "checkout -b", когда удаленный существует? - PullRequest
0 голосов
/ 08 октября 2018

Если у меня есть удаленная ветка, я могу локально сделать git checkout MyRemoteBranch, и она будет работать нормально.Под нормальной работой я имею в виду, что он создаст локальную ветвь с именем MyRemoteBranch и переключится на нее, и эта локальная будет отслеживать удаленный.

В этом случае, когда мне нужно передавать параметр -b?В чем разница между приведенным ниже, когда пульт существует:

git checkout MyRemoteBranch

Vs

git checkout -b MyRemoteBranch

Ответы [ 4 ]

0 голосов
/ 09 октября 2018

Существует большая разница между этими двумя командами.когда вы используете

git checkout myRemoteBrench

Это переключает вашу ветку, только если ветвь уже существует.

Но когда вы используете

git checkout -b myRemoteBranch

Сначала она проверяет, является ли упомянутая веткасуществует, если нет, то создает новую ветку с заданным именем и переключается на нее.

0 голосов
/ 08 октября 2018

В этом случае, когда мне нужно передавать параметр -b?В чем разница между приведенными ниже, когда удаленный существует

Разница в том, что если вы передадите флаг -b, git создаст новую ветвь с именемвы даете и основываетесь на ветви, в которой вы были, когда создавали эту ветку.Без флага git будет искать существующую ветку, включая ветку в любых отслеживаемых вами удаленных репозиториях, и переключаться на одну из них, если ее найдет.

Итак, скажем: 1)вы находитесь в своей собственной ветке с именем foo;2) у вас есть пульт под названием upstream;и 3) у этого пульта есть ветвь с именем bar.Если вы скажете:

git checkout bar

, вы переключитесь на локальную копию foo ветви на upstream (при условии, что ваш репозиторий уже знает о foo, потому что вы недавно сделали git fetch).Другими словами, если вы сделаете:

git diff upstream/bar

, тогда git не сообщит о каких-либо различиях.

Но, если вы установите флаг -b:

git checkout -b bar

затем git создаст новую ветку , которая также называется bar, но будет иметь тот же контент, что и ветка foo, в которой вы только что находились. Другими словами:

git diff upstream/bar

сообщит о различиях между upstream 'bar филиалом и вашим локальным bar филиалом (который, опять же, получил свое содержимое из вашей foo ветви).

Попробуйте сами.Просто выберите две существующие удаленные ветви, которые не существуют локально, скажем, upstream/branch1 и upstream/branch2 на вашем пульте, которые, как вы знаете, имеют некоторые различия.Убедитесь, что есть различия с git diff upstream/branch1 upstream/branch2.Теперь оформите первую ветку без флага -b:

 git checkout branch1

Теперь у вас должна быть локальная ветка с именем branch1.Опять же, убедитесь, что это соответствует исходной версии: git diff upstream/branch1 branch1.Там не должно быть никаких различий.Затем попробуйте создать branch2, используя флаг -b:

 git checkout -b branch2

Теперь у вас должен быть локальный branch2, но он должен совпадать с тем, что в branch1, а также upstream/branch1.Подтвердите:

 git diff upstream/branch1 branch2      # should be no diffs
 git diff upstream/branch2 branch2      # should be like diffing branch1 and upstream/branch2
0 голосов
/ 09 октября 2018

Ответ Калеба правильный (и я проголосовал за него), но здесь он в более точной записи:

  • git checkout -b <em>name</em> пытается создать новыйимя ветви name, используя текущий (HEAD) коммит в качестве хеш-идентификатора для новой ветви.Сбой, если имя ветви уже существует.

  • git checkout <em>name</em> пытается извлечь существующую ветку, используя имя name.

    • Если это не удается из-за того, что name не существует, он переходит ко второму шагу, который в документации Git иногда называется режимом "DWIM": Делай то, что имею в виду .

    • Шаг DWIM проверяет все ваши имена для удаленного отслеживания: origin/<em>name</em>, upstream/<em>name</em>, если у вас есть пульт с именем upstream,и так далее.Если соответствует ровно одному , он выполняет эквивалент:

      git checkout -b <em>name</em> <em>remote-tracking-name</em>

      , который, как вы можете видеть, имеет еще один аргумент, чем исходная опция -b.

  • git checkout -b <em>name</em> <em>commit-specifier</em> - который вы можете вызывать вручную, если хотите, но вызывается для вас в режиме DWIM - пытается создать новое имя ветви name, используя данный commit-specifier в качестве хеш-идентификатора для новой ветви.Это не удастся, если имя существует или , если вы не можете git checkout этот конкретный хэш-идентификатор фиксации прямо сейчас.(См. Извлечение другой ветки, если в текущей ветке есть незафиксированные изменения , для получения дополнительной информации о том, когда вы можете или не можете переключиться на другую фиксацию.)следует также упомянуть git checkout --track <em>remote-tracking name</em>, например, git checkout --track upstream/develop.Он ищет имя удаленного отслеживания, а затем использует его для создания новой (локальной) ветви с тем же именем: в этом случае будет создана новая ветка develop, как если бы вы запускали git checkout -b develop upstream/develop.Это полезно, если у вас есть нет develop прямо сейчас, но do имеют оба origin/develop и upstream/develop.Режим DWIM не будет работать, потому что git checkout develop не знает, использовать ли origin/develop или upstream/develop.

0 голосов
/ 08 октября 2018

git checkout MyRemoteBranch - это когда эта ветка уже находится в удаленном репозитории.

git checkout -b MyRemoteBranch с помощью этого параметра -b вы создаете новую ветку локально, независимо от того, находится ли она в удаленном

.
...