Ось довга відповідь.
Віддалені:
Якщо ви використовуєте 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
.
Це може здатися довільним, але є простий спосіб запам'ятати, коли слід використовувати косую рису і коли використовувати пробіл. Коли ви користуєтеся косою рисою, ви маєте на увазі відділення віддаленого відстеження на власній машині, тоді як, використовуючи пробіл, ви фактично маєте справу з гілкою на віддаленій машині по мережі.