Что происходит на самом деле, когда я делаю git fetch и git checkout origin / branch из локальной ветви, где есть новые файлы? - PullRequest
0 голосов
/ 11 июня 2018

Предположим, у меня есть локальная ветвь A и две удаленные ветки A и B. локальная ветвь A содержит некоторые файлы , которых нет в remote B.затем я делаю следующее:git fetchgit checkout origin/B

затем эти файлы из локального A остаются там, я удалил эти файлы и зафиксировал необходимые изменения в некоторых файлах, которые были в origin/B:

git add .git commit -m "fixes made"

затем голова оторвалась с показом хэша коммита

Итак, у меня есть два вопроса здесь

  1. Почему эти файлы из моего местного филиала A скопированы / остались в / в origin/B?

  2. Почему голова отсоединилась?

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

@ hobbs уже дал вам правильный ответ .

Чтобы ответить на вопрос в ваш комментарий :

Каждая ветвь будет иметь различный HEAD.Так как же это на самом деле происходит?

В Git слово HEAD (заглавными буквами) не означает " верхушка ветви ", как вы могли ожидать 1 ;вместо этого HEAD - это специальная ссылка, которая указывает на ветку, которую вы в настоящее время извлекаете в своем рабочем каталоге.

Документация лучше всего говорит:

Один Git-репозиторий может отслеживать произвольное количество веток, но ваше рабочее дерево связано только с одной из них (ветвью «текущая» или «извлеченная»), и HEAD указывает на эту ветку.

Обычно HEAD указывает на имя ветви 2 , но также может указывать на конкретную фиксацию.Когда это происходит, говорят, что это « отсоединенный HEAD ».

Теперь, так как вы не можете фиксировать напрямую в ветку удаленного отслеживания , когда вы говорите:

git checkout origin/B

HEAD заканчивается указанием непосредственно на коммит, на который ссылается origin/B вместо локального имени ветки;таким образом, он становится отделенной ГОЛОВОЙ .

  1. Это называется "head" , строчные буквы.
  2. На самом деле в каталоге .git есть текстовый файл с именем HEAD, который буквально содержит название ветви, на которую он указывает.
0 голосов
/ 11 июня 2018

Почему эти файлы из моей локальной ветки A скопированы / остались / в / в origin / B?

Поскольку они не являются файлами из ветви A. Онив вашем рабочем каталоге находятся файлы, которые не управляются git.Вы не добавили их ни в какой коммит в ветке А или где-либо еще.И git ничего не делает с файлами, которым не было сказано управлять.Работа не «на ветке», пока вы ее не совершите.

Почему голова отсоединилась?

Потому что вы сделали git checkout origin/B, в результате чего HEAD отсоединился,Вы, вероятно, имели в виду git checkout -t origin/B, который создает новую ветвь B с восходящим потоком origin/B и точками HEAD там.

...