2013-09-21 5 views
213

Я начал использовать git когда-нибудь назад и не совсем понимаю тонкости. Мой основной вопрос здесь заключается в том, чтобы выяснить разницу между git pull и git pull --rebase, так как добавление опции --rebase не похоже на что-то совсем другое: просто тянет.Разница между git pull и git pull --rebase

Пожалуйста, помогите мне с пониманием разницы.

+6

Связанный: [Когда следует использовать git pull --rebase?] (Http://stackoverflow.com/q/2472254/456814). –

+2

Возможный дубликат [git pull VS git fetch git rebase] (http://stackoverflow.com/questions/3357122/git-pull-vs-git-fetch-git-rebase) –

+0

Полезная ссылка: https: // www. atlassian.com/git/tutorials/rewriting-history/git-rebase –

ответ

236

git pull = git fetch + git merge против отслеживания вверх по течению ветвь

git pull --rebase = git fetch + git rebase против отслеживания вверх по течению ветку

Если вы хотите знать, как git merge и git rebase отличаются, read this.

+8

Стоит отметить, что выражение 'git pull -rebase' такое же, как' git fetch' и 'git rebase' в основном как это , но это не * точно * семантически эквивалентно. Есть некоторые отличия, некоторые из которых объясняются здесь. http://gitolite.com/git-pull--rebase – w0rp

+4

Это то, что я бы назвал «удобной ложью», чтобы заимствовать фразу от Скотта Мейерса. Это хороший способ объяснить это независимо. – w0rp

9

В самом простейшем случае каких-либо столкновений

  • с перебазироваться: rebases локальных коммитов наверх удаленной ГОЛОВЫ и делает не создать объединение/слияния совершить
  • без/нормального: слияния и создает слияние совершить

Смотри также:

man git-pull

Точнее, мерзавец тянуть работает мерзавец выборки с заданными параметрами и вызовов мерзавец слияния, чтобы объединить извлекаемые ветви головы в текущей отрасли. С --rebase, он запускает git rebase вместо git merge.

Смотрите также:
When should I use git pull --rebase?
http://git-scm.com/book/en/Git-Branching-Rebasing

+3

И в случае столкновений? – Rndm

+1

Вас попросят разрешить их вручную, а затем - продолжить с rebase: 'git sdd modified-file; git rebase -continue' или merge: 'git add modified-file; git commit; 'где' modified-file' - ваш локальный файл, который вы изменили вручную/mergetool. – drahnr

187

Иногда у нас есть восходящий поток, который переустанавливает/перематывает ветку, на которую мы зависим. Это может быть большой проблемой - вызывать беспорядочные конфликты для нас, если мы отстаем.

Магия git pull --rebase

Нормальный мерзавец тянуть, грубо говоря, что-то вроде этого (мы будем использовать пульт под названием происхождение и филиал под названием Foo во всех этих примерах):

# assume current checked out branch is "foo" 
git fetch origin 
git merge origin/foo 

На первый взгляд, можно подумать, что мерзавец тянуть --rebase делает именно это:

git fetch origin 
git rebase origin/foo 

Но это не поможет, если вышестоящий перебазироваться участие любой «squashin g "(это означает, что патч-идентификаторы коммитов изменились, а не только их порядок).

Это означает, что git pull --rebase должен сделать немного больше. Вот объяснение того, что он делает и как.

Допустим, ваша отправная точка это:

a---b---c---d---e (origin/foo) (also your local "foo") 

Время проходит, и вы сделали несколько коммитов на вершине собственного «Foo»:

a---b---c---d---e---p---q---r (foo) 

Между тем, в приступе антисоциальная ярость, поддерживающий восходящий поток не только усугубил свой «фу», он даже использовал сквош или два. Его цепочка фиксации теперь выглядит примерно так:

a---b+c---d+e---f (origin/foo) 

Погиб в этом месте приведет к хаосу. Даже git fetch; git rebase origin/foo не сократил бы его, потому что коммиты «b» и «c» с одной стороны и совершить «b + c» с другой, будут конфликтовать. (И аналогично d, e и d + e).

Что git pull --rebase делает, в этом случае является:

git fetch origin 
git rebase --onto origin/foo e foo 

Это дает:

a---b+c---d+e---f---p'---q'---r' (foo) 

Вы все еще можете получить конфликты, но они будут подлинными конфликты (между p/q/r и a/b + c/d + e/f), а не конфликтами, вызванными b/c, конфликтующими с b + c и т. д.

Ответ взяты из (и слегка изменен):
http://gitolite.com/git-pull--rebase

+6

Это лучший ответ. Возможно, вы захотите изменить окончательный результат на 'a --- b + c --- d + e --- f --- p '--- q' --- r '(foo)', поскольку хэши изменений перестановки , – Bastien

+1

Изменено, спасибо, что указали, что вне @Bastien –

+9

Этот ответ был скопирован и вставлен дословно из http://gitolite.com/git-pull--rebase и должен включать атрибуцию по лицензии на этой странице. – Wildcard

5

Для этого важно понимать разницу между Merge и перебазироваться.

Ребазы - это то, как изменения должны проходить от вершины иерархии вниз , и слияния - это то, как они возвращаются вверх.

Для получения дополнительной информации см - http://www.derekgourlay.com/archives/428

+0

Я думаю, что ваш ответ предлагает гораздо более простое объяснение, которое не очевидно для остальных ответов выше. Благодарю. –

+0

Добро пожаловать @Aron C –

30

Предположим, у вас есть два коммиты в местном отделении:

 D---E master 
    /
A---B---C---F origin/master 

После "мерзавца блату", будет:

 D--------E 
    /  \ 
A---B---C---F----G master, origin/master 

После «мерзавцем pull --rebase ", не будет точки слияния G. Обратите внимание, что D и E становятся разными коммитами:

A---B---C---F---D'---E' master, origin/master 
+0

это не A --- B --- C --- D '--- E' - F? – prgmrDev

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