Как я могу переключиться на другую ветку в git?


221

Какая из этих строк верна?

git checkout 'another_branch'

Или

git checkout origin 'another_branch'

Или

git checkout origin/'another_branch'

И в чем разница между этими линиями?



32
git checkout [branch]для большинства пользователей, приходящих на этот вопрос
JGallardo

Ответы:


224

Если another_branchлокально уже существует, и вы не в этой ветви, то git checkout another_branchпереключается на филиал.

Если another_branchне существует, но origin/another_branchсуществует, то git checkout another_branchэквивалентно git checkout -b another_branch origin/another_branch; git branch -u origin/another_branch. Это для создания another_branchиз origin/another_branchи установить origin/another_branchв качестве верхнего по течению another_branch.

Если ни один не существует, git checkout another_branchвозвращает ошибку.

git checkout origin another_branchвозвращает ошибку в большинстве случаев. Если originэто ревизия и another_branchфайл, то он проверяет файл этой ревизии, но, скорее всего, это не то, что вы ожидаете. originв основном используется в git fetch, git pullи git pushкак пульт дистанционного управления, псевдоним URL - адрес в удаленном хранилище.

git checkout origin/another_branchуспешно, если origin/another_branchсуществует. Это приводит к тому, что он находится в отключенном состоянии HEAD, а не в какой-либо ветви. Если вы делаете новые коммиты, новые коммиты не доступны из существующих ветвей, и ни одна из ветвей не будет обновлена.

ОБНОВЛЕНИЕ :

Начиная с версии 2.23.0, мы также можем использовать git switchдля создания и переключения веток.

Если fooсуществует, попробуйте переключиться на foo:

git switch foo

Если fooне существует и origin/fooсуществует, попробуйте создать fooиз, origin/fooа затем переключитесь на foo:

git switch -c foo origin/foo
# or simply
git switch foo

В более общем случае, если fooон не существует, попробуйте создать fooиз известного ref или commit и затем переключитесь на foo:

git switch -c foo <ref>
git switch -c foo <commit>

Если мы поддерживаем репозиторий в Gitlab и Github одновременно, локальный репозиторий может иметь два пульта, например, originдля Gitlab и githubдля Github. В этом случае хранилище имеет origin/fooи github/foo. git switch fooбудет жаловаться fatal: invalid reference: foo, потому что не известно, из какого ref origin/fooили github/foo, чтобы создать foo. Мы должны указать это с git switch -c foo origin/fooили в git switch -c foo github/fooсоответствии с необходимостью. Если мы хотим создать ветви из обеих удаленных веток, лучше использовать отличительные имена для новых ветвей:

git switch -c gitlab_foo origin/foo
git switch -c github_foo github/foo

Если fooсуществует, попробуйте воссоздать / принудительно создать foo(или сбросить foo) известный ref или commit, а затем переключиться на foo:

git switch -C foo <ref>
git switch -C foo <commit>

которые эквивалентны:

git switch foo
git reset [<ref>|<commit>] --hard

Попробуйте переключиться на отдельный заголовок известного ref или commit:

git switch -d <ref>
git switch -d <commit>

Если вы просто хотите создать ветку, но не переключаться на нее, используйте git branchвместо этого. Попробуйте создать ветку из известного ref или commit:

git branch foo <ref>
git branch foo <commit>

24
Этот ответ является правильным (как обычно, и голосовали против него), но я добавлю комментарий, который может быть полезен: по git checkoutмоему мнению, команда делает слишком много вещей. Вот почему здесь так много режимов работы. Если бы единственной вещью git checkoutбыло переключение ветвей, ответ был бы простым, но он также может создавать ветви и даже извлекать файлы из определенных коммитов без переключения ветвей.
Торек

11
это правильный ответ, но он показывает, как git как-то облажался в командной строке. git checkout для переключения ветки?
Тханг

3
@thang Ну, с выпуском 2.23.0 это исправлено: теперь вы можете использовать git switchдля переключения на ветку.
legends2k

Switch не работает для этой версии git. Что я использую для переключения на другую ветку в этой версии git? C: \ widget> git --version git версия 2.11.0.windows.3 C: \ widget> мастер переключения git git: 'switch' не является командой git. Смотрите «git --help». C: \ widget>
Джон

1
@John используется git checkoutвместо старых версий, что также работает в современных версиях.
ElpieKay

66

Переключение на другую ветку в git. Простой ответ,

git-checkout - переключение веток или восстановление файлов рабочего дерева

git fetch origin         <----this will fetch the branch
git checkout branch_name <--- Switching the branch

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


Последняя команда переводит меня в отключенное состояние HEAD. Значит, никто не может редактировать ветку.

2
Ветвь, которую вы пытаетесь оформить, не выбрана, тогда вам нужно получить ее перед оформлением заказа. Вы можете пропустить выборку, если ветка обновлена, тогда просто используйте git checkout branchname.
danglingpointer

Разве не достаточно выполнить git pull после переключения на ветку?

тянуть также хорошо, тянуть делает выборку и слить вместе в фоновом режиме. Я не вижу различий.
danglingpointer

17

[ git checkout "branch_name"]

это еще один способ сказать:

[ git checkout -b branch_name origin/branch_name]

в случае, если "branch_name" существует только удаленно.

[ git checkout -b branch_name origin/branch_name] полезно, если у вас несколько пультов.

Что касается [ git checkout origin 'another_branch'] Я не уверен, что это возможно, AFAK вы можете сделать это с помощью команды "fetch" - [ git fetch origin 'another_branch']


Я знаю команду "git checkout -b branchName" для создания другой ветки. Это был не вопрос!

10

С Git 2.23 можно использовать git switch <branch name>для переключения веток.


6

Что сработало для меня следующее:

Переключитесь на нужную ветку:

git checkout -b BranchName

И тогда я вытащил «мастера» по:

git pull origin master

6

Полезные команды для работы в повседневной жизни:

git checkout -b "branchname" ->  creates new branch
git branch                   ->  lists all branches
git checkout "branchname"    ->  switches to your branch
git push origin "branchname" ->  Pushes to your branch
git add */filename           -> Stages *(All files) or by given file name
git commit -m "commit message" -> Commits staged files
git push                     -> Pushes to your current branch

5

Если вы хотите, чтобы ветка отслеживала удаленную ветвь, что очень важно, если вы собираетесь фиксировать изменения в ветке и извлекать изменения и т. Д., Вам нужно использовать add -t для фактической проверки, например: git checkout -t branchname


4

Проверьте : git branch -a

Если вы получаете только одну ветку. Затем выполните следующие шаги.

  • Шаг 1 : git config --list
  • Шаг 2 : git config --unset remote.origin.fetch
  • Шаг 3 : git config --add remote.origin.fetch +refs/heads/*:refs/remotes/origin/*

2
Интересно, как эта серия команд переключится на другую ветку?

Это может быть полезно сделать, когда вы ранее делали поверхностный клон (используя depthпараметр) и теперь удивляетесь, почему вы не можете получить другие удаленные ветви, error: pathspec 'another_branch' did not match any file(s) known to gitиспользуя команды, предложенные выше. Это, конечно, не то, о чем был первоначальный вопрос, но это может помочь другим почесать здесь свои головы.
luciash d 'быть

0

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

git switch [branchName] ИЛИ git checkout [branchName]

Пример: разработка git switch ИЛИ разработка
git checkout

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.