Git pull меняет ГОЛОВУ? - PullRequest
0 голосов
/ 31 мая 2019

Я понимаю, как git checkout изменяет указатель HEAD, но как насчет git pull?

HEAD можно рассматривать как «текущую ветвь», но когда вы выполняете git pull и ваша текущая ветвь изменяется.Влияет ли это на указатель HEAD?Почему?

Ответы [ 3 ]

1 голос
/ 31 мая 2019

Обычно HEAD - это двойное косвенное обращение к коммиту. git checkout манипулирует первой косвенной информацией, git commit, git merge, git pull и другими командами второй.

Пример: после git checkout master файл .git/HEAD содержит

ref: refs/heads/master

, которая является "символической ссылкой" на ссылку ref (см. git help symbolic-ref). Выполнение git checkout develop дает вам

ref: refs/heads/develop

git pull (то есть git fetch; git merge или git fetch; git rebase) не будет касаться .git/HEAD, но манипулирует .git/refs/heads/master (и / или git./packed-refs).

Таким образом, ответ: git pull не манипулирует HEAD, но ссылка HEAD указывает на. В результате HEAD указывает на другой коммит.

0 голосов
/ 31 мая 2019

Влияет ли это на указатель HEAD?

Это легко узнать самостоятельно.В локальном клоне некоторого git-репо создайте новую ветку (чтобы вы могли бездельничать, не подвергая опасности свою работу), и убедитесь, что она обновлена ​​с помощью пульта:

git checkout -b test-branch
git pull

Далеевзгляните на HEAD в этой ветке:

git log

Обратите внимание на значение HEAD, которое является самым последним коммитом.Теперь измените HEAD с помощью команды reset, чтобы вернуться к нескольким коммитам:

git reset --hard HEAD~3

Теперь вы намеренно изменили HEAD - это то, что reset делает .Синопсис команды reset: Сброс текущего HEAD в указанное состояние .То есть вы только что вернулись во времени за 3 коммита до последнего коммита.Давайте снова посмотрим на HEAD:

git log

Вы можете видеть, что HEAD изменился по сравнению с тем, что было раньше.Теперь используйте pull, чтобы добавить «новые» коммиты с пульта обратно в вашу ветку, и снова посмотрите на HeAD:

git pull
git log

Вы должны увидеть, что HEAD вернулся туда, где он был до reset, и это должно показать вам, что git pull меняет HEAD и почему.

HEAD не является особенным по любой причине, кроме как для имени последнего коммита.Все, что вы делаете, изменяет то, что git видит как последний коммит в вашей ветке, изменяет значение HEAD.

0 голосов
/ 31 мая 2019

В соответствии с git-scm

Точнее, git pull запускает git fetch с заданными параметрами и вызывает git merge, чтобы «объединить полученные заголовки веток с текущей веткой»".

Примечание: двойные кавычки были добавлены мной для выделения.


Влияет ли это на указатель HEAD?

Да, если были получены новые коммиты.

Почему?

Поскольку HEAD ссылается на самый последний коммит.Поскольку вы извлекли последние изменения (прочитанные коммиты), HEAD должен ссылаться на более новые извлеченные коммиты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...