Вот длинный ответ.
Remotes:
Если вы используете Git для совместной работы, вам, вероятно, потребуется синхронизировать ваши коммиты с другими машинами или местами. В терминах Git каждая машина или место называется удаленным , и у каждого может быть одна или несколько веток. Чаще всего у вас будет только один, названный origin
. Чтобы получить список всех пультов, запустите git remote
:
$ git remote
bitbucket
origin
Вы можете увидеть, для каких мест эти удаленные имена являются ярлыками, запустив git remote -v
:
$ git remote -v
bitbucket git@bitbucket.org:flimm/example.git (fetch)
bitbucket git@bitbucket.org:flimm/example.git (push)
origin git@github.com:Flimm/example.git (fetch)
origin git@github.com:Flimm/example.git (push)
Каждый пульт имеет каталог под git/refs/remotes/
:
$ ls -F .git/refs/remotes/
bitbucket/ origin/
Филиалы на вашей машине:
TLDR: на вашем локальном компьютере у вас есть три типа ветвей: локальные ветви без отслеживания, локальные ветви отслеживания и ветви удаленного отслеживания. На удаленной машине у вас есть только один тип ветви.
1. Местные отделения
Вы можете просмотреть список всех локальных филиалов на вашем компьютере, выполнив git branch
:
$ git branch
master
new-feature
Каждая локальная ветвь имеет файл под .git/refs/heads/
:
$ ls -F .git/refs/heads/
master new-feature
На вашем компьютере есть два типа локальных филиалов: не отслеживание локальных филиалов и отслеживание локальных филиалов.
1.1 Не отслеживание местных филиалов
Не отслеживающие локальные филиалы не связаны ни с каким другим филиалом. Вы создаете один, запустив git branch <branchname>
.
1.2. Отслеживание местных филиалов
Отслеживающие локальные ветви связаны с другой ветвью, обычно веткой удаленного отслеживания. Вы создаете один, запустив git branch --track <branchname> [<start-point>]
.
Вы можете просмотреть, какие из ваших местных отделений отслеживают филиалы, используя git branch -vv
:
$ git branch -vv
master b31f87c85 [origin/master] Example commit message
new-feature b760e04ed Another example commit message
Из результатов этой команды видно, что локальная ветвь master
отслеживает ветку удаленного отслеживания origin/master
, а локальная ветвь new-feature
ничего не отслеживает.
Другой способ увидеть, какие ветви отслеживают ветви, - это посмотреть .git/config
.
Отслеживание местных филиалов полезно. Они позволяют запускать git pull
и git push
без указания, какую ветвь использовать. Если ветвь не настроена для отслеживания другой ветки, вы получите ошибку, подобную этой:
$ git checkout new-feature
$ git pull
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details
git pull <remote> <branch>
If you wish to set tracking information for this branch you can do so with:
git branch --set-upstream new-feature <remote>/<branch>
2. Удаленное отслеживание веток (все еще на вашем компьютере)
Вы можете просмотреть список всех веток удаленного отслеживания на вашем компьютере, выполнив git branch -r
:
$ git branch -r
bitbucket/master
origin/master
origin/new-branch
Каждая ветка удаленного отслеживания имеет файл под .git/refs/<remote>/
:
$ tree -F .git/refs/remotes/
.git/refs/remotes/
├── bitbucket/
│ └── master
└── origin/
├── master
└── new-branch
Думайте о ветвях удаленного отслеживания как о локальном кеше для того, что содержат удаленные машины. Вы можете обновить свои ветки удаленного отслеживания, используя git fetch
, что git pull
используется за кулисами.
Несмотря на то, что все данные для ветки удаленного отслеживания хранятся локально на вашем компьютере (например, в кеше), они все равно никогда не называются локальными ветвями. (По крайней мере, я бы так не назвал!) Это просто называется веткой удаленного отслеживания.
Филиалы на удаленной машине:
Вы можете просмотреть все удаленные ветви (то есть ветви на удаленной машине), выполнив git remote show <remote>
:
$ git remote show origin
* remote origin
Fetch URL: git@github.com:Flimm/example.git
Push URL: git@github.com:Flimm/example.git
HEAD branch: master
Remote branches:
io-socket-ip new (next fetch will store in remotes/origin)
master tracked
new-branch tracked
Local ref configured for 'git pull':
master merges with remote master
new-branch merges with remote new-branch
Local ref configured for 'git push':
master pushes to master (up to date)
new-branch pushes to new-branch (fast-forwardable)
Эта git remote
команда запрашивает удаленную машину по сети о ее ветвях. Он не обновляет ветки удаленного отслеживания на вашем локальном компьютере, использовать git fetch
или git pull
для этого.
Из вывода вы можете увидеть все ветви, которые существуют на удаленном компьютере, посмотрев под заголовком «Удаленные ветви» (игнорируйте линии, помеченные как «устаревшие»).
Если бы вы могли войти на удаленный компьютер и найти хранилище в файловой системе, вы могли бы взглянуть на все его ветви в разделе refs/heads/
.
Шпаргалка:
Чтобы удалить локальное отделение, будь то отслеживание или отсутствие отслеживания, безопасно:
git branch -d <branchname>
Чтобы удалить локальную ветвь, будь то отслеживание или отсутствие отслеживания, принудительно:
git branch -D <branchname>
Чтобы удалить ветку удаленного отслеживания:
git branch -rd <remote>/<branchname>
Чтобы создать новую локальную не отслеживающую ветвь:
git branch <branchname> [<start-point>]
Чтобы создать новую локальную ветвь отслеживания: (Обратите внимание, что если <start-point>
указано и является веткой удаленного отслеживания origin/foobar
, --track
флаг включается автоматически)
git branch --track <branchname> [<start-point]
Пример:
git branch --track hello-kitty origin/hello-kitty
Чтобы удалить ветку на удаленной машине:
git push --delete <remote> <branchname>
Чтобы удалить все устаревшие ветви удаленного отслеживания, то есть там, где соответствующие ветви на удаленном компьютере больше не существуют:
git remote prune <remote>
Вы , возможно, заметили , что в некоторых командах, можно использовать <remote>/<branch>
и другие команды, <remote> <branch>
. Примеры: git branch origin/hello-kitty
а git push --delete origin hello-kitty
.
Это может показаться произвольным, но есть простой способ запомнить, когда использовать косую черту, а когда использовать пробел. Когда вы используете косую черту, вы имеете в виду ветку удаленного отслеживания на своем компьютере, тогда как при использовании пробела вы фактически имеете дело с веткой на удаленном компьютере по сети.