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

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

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

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

Вот что я пробовал. Я клонировал репозиторий и редактировал файл. В исходном репозитории кто-то обновил один и тот же файл и нажал. Тогда,

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

  • Я побежал git pull, и я получил

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

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

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

$ 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

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

Ответ 1

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

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

Ответ 2

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

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

git pull выполняет git fetch и git merge FETCH_HEAD.

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

Ответ 3

Вы написали

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

Кажется, вы смущены тем, что делают git log и git fetch.

В предположении, что ветвь с именем master в настоящее время проверена (вы также можете быть в состоянии standached-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 отслеживает.

Ответ 4

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

git pull= git fetch + git merge

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

git log origin/master