В чем разница между локальным филиалом, филиалом локальной отслеживания, удаленной веткой и удаленной ветвью отслеживания?

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

  • локальные ветки
  • локальные ветки отслеживания
  • удаленные ветки
  • удаленные ветки отслеживания

В чем разница между ними? И как они работают друг с другом?

Быстрый демо-код будет действительно полезен, я думаю.

Ответ 1

A локальная ветвь - это ветвь, которую может видеть только вы (локальный пользователь). Он существует только на вашей локальной машине.

git branch myNewBranch        # Create local branch named "myNewBranch"

A удаленная ветвь - это ветвь в удаленном месте (в большинстве случаев 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"

A ветвь удаленного отслеживания - это локальная копия удаленной ветки. Когда 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"

A локальная ветвь отслеживания - это локальная ветвь , которая отслеживает другую ветку. Это значит, что вы можете нажать/вытащить фиксации в/из другой ветки. В большинстве случаев локальные ветки отслеживания отслеживают ветвь удаленного отслеживания. Когда вы нажимаете локальную ветвь на 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.

Ответ 2

Вот длинный ответ.

Remotes:

Если вы используете Git совместно, вам, вероятно, потребуется синхронизировать свои коммиты с другими машинами или местоположениями. Каждая машина или местоположение называется удаленной, в терминологии Git, и каждая из них может иметь одну или несколько ветвей. Чаще всего у вас будет только один, названный origin. Чтобы перечислить все пульты, запустите git remote:

$ git remote
bitbucket
origin

Вы можете видеть, в каких местах эти удаленные имена используются для быстрого доступа, запустив git remote -v:

$ git remote -v
bitbucket [email protected]:flimm/example.git (fetch)
bitbucket [email protected]:flimm/example.git (push)
origin [email protected]:Flimm/example.git (fetch)
origin [email protected]:Flimm/example.git (push)

Каждый пульт имеет каталог под git/refs/remotes/:

$ ls -F .git/refs/remotes/
bitbucket/ origin/

Филиалы на вашем компьютере:

TL;DR: на вашем локальном компьютере у вас есть три типа веток: локальные ветки не отслеживания, локальные ветки отслеживания и ветки удаленного отслеживания. На удаленной машине у вас только один тип ветки.

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: [email protected]:Flimm/example.git
  Push  URL: [email protected]: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.

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

Ответ 3

Локальная ветвь:

В вашей машине, на которой вы можете работать, и добавьте ее. Вы можете перечислить эти ветки с помощью git branch.

Локальная ветвь (с отслеживанием):

Обычный локальный ветвь, настроенный на соответствие удаленной ветке. У этого есть преимущества, такие как возможность git pull и git push без указания имени репозитория и ветки. Отслеживание также приводит к тому, что git status сообщает вам, когда ваша ветка впереди или за пультом дистанционного управления.

Удаленная ветка:

Просто ветка в удаленном репозитории - обычно на сервере, таком как GitHub и т.д.

Отслеживание удаленного отслеживания

Локальная копия удаленной ветки. Эта ветка никогда не должна редактироваться. Его цель - отслеживать текущее состояние удаленной ветки. Удаленные ветки отслеживания можно просмотреть с помощью git branch -r и, как правило, выглядеть примерно как origin/master (имя репо, за которым следует слэш, за которым следует название ветки). Запуск git fetch будет обновлять ветки удаленного отслеживания, чтобы отобразить состояние соответствующих удаленных ветвей.

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