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

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

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

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

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

3 ответов


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

git branch myNewBranch        # Create local branch named "myNewBranch"

A удаленный филиал является филиалом в удаленном месте (в большинстве случаев origin). Вы можете нажать только что созданную локальную ветвь myNewBranch to 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 on 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.

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

пульты:

если вы используете 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. Удаленные ветки (еще на машине)

вы можете просмотреть список всех филиалов удаленного отслеживания на вашем компьютере бег!--33-->:

$ 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.

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


Местное Отделение:

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

Местное Отделение (С Отслеживанием):

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

Удаленный Филиал:

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

Удаленного Слежения Филиала:

локальная копия удаленной ветви. Эту ветку никогда не следует редактировать. Его цель-отслеживать текущее состояние удаленной ветви. Удаленные ветви отслеживания можно просматривать с помощью git branch -r и обычно выглядеть origin/master (имя РЕПО, за которым следует косая черта, за которой следует имя ветви). Бег!--6--> обновит ветви удаленного отслеживания, чтобы отразить состояние соответствующих удаленных ветвей.

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