Почему git log не показывает ничего нового после git fetch?

Я узнаю о работе с удаленными устройствами Git, прочитав соответствующий раздел книги Pro Git.

Если вы клонируете репозиторий, команда автоматически добавляет этот удаленный репозиторий под именем «origin». Таким образом, git fetch origin извлекает любую новую работу, которая была отправлена ​​на этот сервер с момента ее клонирования (или последней загрузки).

Важно отметить, что команда git fetch только извлекает данные в ваш локальный репозиторий; он не объединяет его автоматически с какой-либо вашей работой и не изменяет то, над чем вы сейчас работаете. Вы должны вручную объединить его со своей работой, когда будете готовы.

Вот что я пробовал. Я клонировал репозиторий и редактировал файл. В оригинальном репозитории кто-то обновил тот же файл и запушил. Затем,

  1. Я побежал git fetch. Он показал некоторое сообщение о ходе обновления. Однако git log не показал это обновление. Я неправильно понял, что делает git fetch? Я что-то упускаю?

  2. Я запустил git pull и получил

ошибка: ваши локальные изменения в «hello_world.c» будут перезаписаны слиянием. Прерывание. Пожалуйста, зафиксируйте свои изменения или спрячьте их перед слиянием.

Здесь, я считаю, это также слияние и, чтобы избежать случайной потери данных, прерывается.

Изменить: Спасибо за ответы. На самом деле, прежде чем смотреть ответы, я пытался сам и понял то же самое со следующими командами/выходами:

$ git ls-remote origin
d0006a6bfa95e0e90aa820a0e50d31a548625652    HEAD
d0006a6bfa95e0e90aa820a0e50d31a548625652    refs/heads/master
$ git ls-remote .
14375458b8a6b84f82d9fa4d2ded0bb8c9e87431    HEAD
14375458b8a6b84f82d9fa4d2ded0bb8c9e87431    refs/heads/master
d0006a6bfa95e0e90aa820a0e50d31a548625652    refs/remotes/origin/HEAD
d0006a6bfa95e0e90aa820a0e50d31a548625652    refs/remotes/origin/master

Также со следующими командами:

$git log origin --oneline
$git log --oneline

Спасибо, что терпите мои глупые вопросы ;-)


person Adil    schedule 02.07.2015    source источник
comment
[...] Команда git fetch загружает данные в ваш локальный репозиторий [...] Осторожнее со словом pull; в Git он имеет очень специфическое значение, и его использование таким образом может привести только к путанице.   -  person jub0bs    schedule 02.07.2015


Ответы (4)


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

git log может выбрать опцию --all, чтобы показать историю всех веток, локальных и удаленных. В качестве альтернативы вы можете явно указать удаленную ветвь, как в git log origin/master.

person Community    schedule 02.07.2015

Вы написали

Однако журнал git не показал это обновление. Я неправильно понял, что делает git fetch? Я что-то упускаю?

Вы, кажется, не понимаете, что делают и git log, и git fetch.

В предположении, что ветвь с именем master в настоящее время проверена — вы также можете находиться в состоянии detached-HEAD, но давайте не будем усложнять, ради этого объяснения — команда git log без каких-либо других аргументов эквивалентна git log master. Эта команда сообщает Git

Покажите мне все коммиты, которые находятся в родословной локальной ветки master.

Однако вы должны понимать, что git fetch origin не влияет на ваши локальные ветки, такие как master, и не обновляет их. Вместо этого новые коммиты из origin (или любого другого удаленного источника, с которого вы получаете данные) помещаются в ветки удаленного отслеживания< /а>.

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

То, что вы, вероятно, хотите, это запустить

git fetch origin

чтобы получить все новые коммиты из origin и поместить их в ветки удаленного отслеживания (включая origin/master здесь), а затем

git log master..origin/master

чтобы показать журнал всех «новых» коммитов, которые были добавлены в удаленную ветку master, то есть ветку, которая находится на удаленном сервере, известном вам как origin, который отслеживает ваша ветка удаленного отслеживания origin/master.

person jub0bs    schedule 02.07.2015

После git fetch ваше локальное репо знает об изменениях из удаленного репо, но еще не применило их к вашим локальным веткам.

git log без дополнительных параметров показывает лог текущей ветки — а вы еще не слили удаленные изменения в эту ветку.

git pull делает git fetch и git merge FETCH_HEAD.

Ваше сообщение об ошибке означает, что в вашем локальном репо есть незафиксированные изменения. Вы можете зафиксировать или спрятать их (как указано в сообщении) и снова попробовать merge (или pull).

person Melebius    schedule 02.07.2015

Ваши локальные ветки никогда не обновляются из выборки, только ветки отслеживания, git pull с другой стороны,

git pull = git fetch + git merge

Вы не можете видеть какие-либо обновления в git log просто потому, что вы запускаете его не в той ветке, чтобы увидеть свои изменения только из git fetch, вам нужно git log в правильной ветке, которая в вашем случае будет

git log origin/master
person Mohammad AbuShady    schedule 02.07.2015