2013-09-20 3 views
8

Мое понимание всегда заключалось в том, что git pull по существу представляет собой комбинацию git fetch и git merge ..., но я столкнулся с ним несколько раз, когда вытаскивание, а затем сравнение показывает изменения, которые не являются моими до тех пор, пока я также сделать выборку:Git Pull не делает Git Fetch

(на ветке сгустка):

git pull origin blob 
git diff origin/blob <- shows a bunch of changes that aren't from my but were just pulled from others 
git fetch 
git diff origin/blob <- shows just my changes 

ли мое понимание тянуть неправильно?

+0

Предполагается, что удаленные изменения между вашим 'git pull' и явным' git fetch' не будут корректными? – BlackVegetable

+0

Да, это правильно. – pinkboi

+0

Интересно, будет ли 'git fetch -all' иметь значение, если вы используете его на третьем шаге. Я бы не подумал, что ваш второй выбор будет иметь значение вообще; вот что меня смущает. – BlackVegetable

ответ

15

Это является общим источником путаницы, настолько, что #git IRC канал консервированной текст справки для этого, называется !pull4:

Мы рекомендуем против использования «мерзавец выборки/тянуть < дистанционный> < refspec> '(т. е. с аргументом ветвления), поскольку он не обновляет < remote>/< branch> ref. Легкий способ правильно найти вещи - это получить все: «git fetch» ​​или «git pull» достаточно, если у вас один пульт; в противном случае мы рекомендуем 'git fetch < remote>' (плюс 'git merge < remote>/< branch>' если вы хотите вытащить/слить).

То, что здесь происходит, что git pull без аргументов делает git fetch на «по умолчанию удаленный» (обычно origin), затем git merge сек удаленная ветвь, соответствующая текущей локальной ветви. git pull <remote> делает то же самое с явно указанным удаленным. Однако, «4-word pull», git pull <remote> <branch>, получает эту ветвь во временное местоположение, FETCH_HEAD, без, обновляя ветви отслеживания, а затем объединяет FETCH_HEAD в вашу текущую ветку.

Таким образом, с помощью git pull origin blob, вы говорите: «Я хочу, чтобы объединить последнюю версию blob ветви на удаленном origin в мою текущую ветвь, без обновления любого из моих отслеживаний ветвей или извлечений любых других данных».

Если ветвь слияния конфигурация является правильной (и они, вероятно, являются, так как git clone и git checkout пытаются установить их автоматически), вы можете просто git pull или git pull origin, и он будет получать все, а затем объединить ветвь, соответствующей вашое в настоящее время -открытая ветка. Если вам нужен более явный контроль, используйте git fetch, а затем git merge. git pull <remote> <branch> редко что вы хотите.

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

+0

В каком случае вы действительно хотите 'git pull ' form? +1 – BlackVegetable

+0

@BlackVegetable Честно говоря, я понятия не имею. Я никогда не использовал его. Думаю, это может быть полезно в рабочих процессах, где вы вообще не беспокоитесь о ветвях отслеживания по какой-либо причине? – ToxicFrog

+0

Спасибо. Я заметил, что git pull сам по себе не имеет этой проблемы. Я иногда хочу сделать git pull origin, если бы у меня была другая ветка, но я думаю, что всегда делаю выборку и слияние с ветвью origin/whatever. – pinkboi

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