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


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

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

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.

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


Я бы использовал, чтобы создать ветку и перейти к ветке в одном 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«s на конце подставке для многословных (это показывает последний коммит хэш и сообщение). Спасибо @Flimm за указание, что второй vдобавляет информацию о том, какая локальная ветвь отслеживает, какой удаленный.


1
я не понимаю разницы между локальным отслеживанием и удаленным отслеживанием ветвей - первый соответствует источнику, а второй - удаленной машине. но разве это не одно и то же? разве это не просто репо, который обычно есть на github?
akantoword

1
@akantoword Я обновил ответ, чтобы попытаться немного уточнить. По сути, удаленная ветвь отслеживания - это просто локальная копия удаленной ветки, для которой не предназначена работа. Локальная ветка с отслеживанием предназначена для работы.
Эрик Матисон,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.