Які відмінності між місцевою гілкою, локальною гілкою відстеження, віддаленою гілкою та гілкою віддаленого відстеження?


158

Я тільки почав використовувати Git, і я дуже заплутався між різними гілками. Чи може хто-небудь допомогти мені розібратися, що таке наступні типи галузей?

  • місцеві відділення
  • місцеві гілки стеження
  • віддалені гілки
  • відділення дистанційного відстеження

У чому різниця між ними? А як вони працюють між собою?

Я думаю, швидкий демо-код буде дуже корисним.

Відповіді:


123

Місцеве відділення є філією , що тільки ви (локальний користувач) може бачити. Він існує лише на вашій локальній машині.

git branch myNewBranch        # Create local branch named "myNewBranch"

Віддалений філія знаходиться філія на віддаленому місці (в більшості випадків origin). Ви можете підштовхнути новостворену місцеву гілку myNewBranchдо origin. Тепер інші користувачі можуть відстежувати це.

git push -u origin myNewBranch   # Pushes your newly created local branch "myNewBranch"
                                 # to the remote "origin".
                                 # So now a new branch named "myNewBranch" is
                                 # created on the remote machine named "origin"

Віддалене відстеження філія є локальною копією віддаленого філії. При myNewBranchнатисканні на originвикористання команди вище, origin/myNewBranchна вашій машині створюється відділення віддаленого відстеження . Ця гілка відстеження відстежує віддалену гілку myNewBranchна origin. Ви можете оновити гілку віддаленого відстеження, щоб вона синхронізувалася з віддаленою гілкою за допомогою git fetchабо git pull.

git pull origin myNewBranch      # Pulls new commits from branch "myNewBranch" 
                                 # on remote "origin" into remote tracking
                                 # branch on your machine "origin/myNewBranch".
                                 # Here "origin/myNewBranch" is your copy of
                                 # "myNewBranch" on "origin"

Місцеве відділення стеження є місцевою філією , який відстежує іншу гілку. Це так, що ви можете натискати / тягнути комітети до / з іншої гілки. Місцеві гілки відстеження у більшості випадків відстежують віддалену гілку відстеження. Коли ви підштовхуєте локальну гілку до originвикористання параметра git push commandз -u(як показано вище), ви встановлюєте локальну гілку myNewBranchдля відстеження віддаленої гілки відстеження origin/myNewBranch. Це потрібно для використання git pushта git pullбез вказівки висхідного потоку для підштовхування або витягування з нього.

git checkout myNewBranch      # Switch to myNewBranch
git pull                      # Updates remote tracking branch "origin/myNewBranch"
                              # to be in sync with the remote branch "myNewBranch"
                              # on "origin".
                              # Pulls these new commits from "origin/myNewBranch"
                              # to local branch "myNewBranch which you just switched to.

Для визначення локальної гілки відстеження, чи не те саме, що локальна гілка після натискання на віддалене?
mskw

2
@mskw Ні, локальна гілка відстеження та локальна (не відстежуюча) гілка відрізняються між собою. Місцева гілка НЕ ​​пов'язана з жодною гілкою. Це просто відділення, існуюче на вашій локальній машині, ізольовано. Місцева гілка відстеження асоціюється з віддаленою гілкою відстеження. Таким чином, ви можете натискати / тягнути зобов’язання один до одного.
SNce

196

Ось довга відповідь.

Віддалені:

Якщо ви використовуєте 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.

Це може здатися довільним, але є простий спосіб запам'ятати, коли слід використовувати косую рису і коли використовувати пробіл. Коли ви користуєтеся косою рисою, ви маєте на увазі відділення віддаленого відстеження на власній машині, тоді як, використовуючи пробіл, ви фактично маєте справу з гілкою на віддаленій машині по мережі.


Я б створив гілку і перейшов до гілки в одному cmd як: git checkout -b mynewbranch
Zeta

Я полюбив останній пункт про різницю між косою та косою рисою!
aderchox

12

Місцева філія:

Гілка на вашій машині, в якій ви можете працювати та додавати комісії. Ви можете перелічити ці гілки за допомогою git branch.

Місцеве відділення (із відстеженням):

Звичайна локальна гілка, налаштована так, щоб відповідати віддаленій гілці. Це має такі переваги, як здатність git pullі git pushбез необхідності вказувати назву сховища та філії. Відстеження також спонукає git statusвас повідомляти, коли ваша філія попереду або позаду пульта.

Віддалене відділення:

Просто гілка у віддаленому сховищі - як правило, на сервері, такому як GitHub тощо.

Відділення дистанційного відстеження:

Місцева копія віддаленого відділення. Ця гілка ніколи не повинна редагуватися. Її мета - відслідковувати поточний стан віддаленої гілки. Гілки віддаленого відстеження можна переглядати git branch -rі, як правило, виглядати приблизно так origin/master(назва репо, за якою слід нахил, а потім назва гілки). Запуск git fetchбуде оновлювати віддалені гілки відстеження, щоб відображати стан відповідних віддалених гілок.

git branch -avvє моїм особистим улюбленим для відображення швидкого огляду, які гілки знаходяться на моїй машині, які гілки знаходяться на віддаленому і останні останнє виконання в кожному. У -aчастині зазначено, що всі гілки повинні бути показані (віддалені та локальні). На vкінцевому підставці для багатослівного (він показує хеш останнього фіксації та повідомлення). Завдяки @Flimm за вказівку, що друга vдодає інформацію про те, яка локальна гілка відстежує, яку віддалену.


1
я не розумію різницю між локальними відстеженнями та віддаленими гілками відстеження - перша відповідає походженням, а друга віддаленій машині. але хіба це не одне і те ж? Хіба це не просто репо, яке зазвичай є на Github?
akantoword

1
@akantoword Я оновив відповідь, щоб спробувати трохи уточнити. В основному, гілка відстеження - це просто локальна копія віддаленої гілки, яка не призначена для роботи. Місцева гілка з відстеженням - для роботи.
Ерік Метсісон,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.