2014-02-21 4 views
0

Так что я немного запутался на git fetch 'ing. Когда я принес на пульте дистанционного управления, он сказал, что там было 5 новых филиалов:Git Fetch и местные филиалы

From https://github.com/*************** 
* [new branch]  ca***** -> ********** 
* [new branch]  ma***** -> ********** 
... 
* [new tag]   v***  -> v*** 

Но если я делаю git branch на моей локальной системе, они не там. Очевидно, я не понимаю git fetch, и чтение man-страниц не помогло мне понять, что я знаю о git. Может кто-нибудь дать мне короткое объяснение извлечения?

ответ

1

С git fetch у вас есть «пульты». Обычный первый пульт - origin, но может быть и больше.

С git в целом люди имеют ветви.

Удаленный репозиторий обычно представляет собой хранилище git, что означает ... у него есть ветви.

Предположим, вы решили создать новую ветку, которую никто не использует, для вашего собственного использования. Вы ловко назовете это branch. Увы, теперь у Джо есть такая же идея, и он назвал свою ветку branch, и он подталкивает ее в хранилище, в котором вы оба делитесь по телефону origin.

Затем вы запускаете git fetch origin (или git fetch таким образом, чтобы он доходил до origin, то же самое). И ... это приносит Джо branch.

Что происходит с отрасль?

Ответ: ничего! Это великая вещь в ветвях гитов: ваши местные филиалы - ваши, и ваши в одиночку, и только вы можете повлиять на них.

Но что, если вы хотите использовать «свою» ветку? Ну, когда ваш git консультируется с ними и получает список «своих» филиалов, он переименовывает их. Если вы собираете ветки с origin, а там один из них называется branch, git изменяет вашу копию на «удаленную ветку», которую он называет origin/branch. Если у вас больше пультов, ветвь branch на пульте дистанционного управления another будет another/branch.

Так, origin/cawhatever является «ваша копия» «филиала cawhatever», как в последний раз видели на пульте дистанционного управления имени origin, последний раз, когда ваш мерзавец был шанс пойти туда и посмотреть, что там. Git обновляет их как на fetch, так и на push операциях (хотя в старых версиях git, если вы запускаете его так, как это делает git pull, он подавляет обновления «удаленных ветвей»).


Полная история немного больше: ваши местные филиалы имеют «полное имя», которое начинается с refs/heads/. Это в основном «каталог» или «папка», полная названий ветвей (и/или подкаталогов с большим количеством имен ветвей). Удаленные ветви живут в пространстве под «справочником» refs/remotes/. Это гарантирует, что ваши и их никогда не столкнется. Но иногда, когда вы добавляете пульт дистанционного управления, это может случайно иметь то же имя, что и ветка, которую вы создали. (Подумайте, что произойдет, если вы создадите локальную ветвь с именем origin, например!) В этом случае вы должны указать длинную форму имени (см. gitrevisions).

Теги живут под refs/tags/.Существует не переименование тегов, встроенных, поэтому, когда вы приносите их теги, они входят в одно и то же пространство имен, что и ваши собственные теги. Это делает использование тегов несколько более деликатным, особенно если вы начинаете говорить с несколькими различными пультами.

По большей части, однако, подумайте о отдаленных ветвях как о «том, что они имели в прошлый раз, когда я проверил». Вы можете иметь свои (локальные) ветви «отслеживать» удаленные ветви, а затем git status расскажет вам, как далеко «впереди» и/или «сзади» вы, из того, что находится в вашем репозитории, в копии «того, что у них было в последний раз» проверено».

+0

Ого, спасибо за длительное, но понятное описание! – ForgetfulFellow

0

Вы должны сделать git checkout --track origin/<branch_name> затем сделать git fetch origin

Смежные вопросы