2011-12-31 17 views
36

Zgodnie z dokumentacją, git ciągnąć wykonuje git sprowadzić następnie korespondencji seryjnej git, jednak w takim przypadku wykonywania origin master git ciągnąć należy wykonać git sprowadzić mistrz pochodzenie prawda? Jednak wydaje się, że tak się nie dzieje. Oto przykład.git pull origin master nie aktualizuje origin/master?

Podobno mój Remote Master pochodzenia (na GitHub w moim przypadku) ma następującą historię:

commit 1111111 : my first commit 
commit 2222222 : a commit from someone else 

i mam tylko mój pierwszy popełnienia lokalnie jak robi następujących wystawach

git checkout master 
git log --pretty=format:'%h' -n 1 
1111111 

git checkout origin/master 
git log --pretty=format:'%h' -n 1 
1111111 

Stąd ja wykonaj moje pociągnięcie i spójrz na wyniki w następujący sposób:

git checkout master 
git pull origin master 

git log --pretty=format:'%h' -n 1 
2222222 

git checkout origin/master 
git log --pretty=format:'%h' -n 1 
1111111 

Jak widać, pu W rzeczywistości zaktualizowałem mój główny oddział o nowe zatwierdzenia ze zdalnego pochodzenia, ale moje lokalne pochodzenie/wzorzec jest nadal tam, gdzie był. Zmuszając mnie do wykonaj następujące Czy to prawidłowe zachowanie dla ciągnięcia git lub czy mogę mieć coś miss skonfigurowane? Przejrzałem stronę man git pull i nie widziałem niczego, co by to sugerowało, ale mogłem to przegapić.

+0

sprawdzić, czy to pomaga wyjaśnić, dlaczego do ciebie. http://stackoverflow.com/questions/2452226/master-branch-and-origin-master-hiver-diverged-how-to-undiverge-brews lub ten jeden http://stackoverflow.com/questions/2883840/differences -between-git-pull-origin-master-git-pull-origin-master – carbonbasednerd

+1

prawdopodobny duplikat ['git pull origin mybranch' pozostawia lokalny mybranch N zobowiązuje przed pochodzenia. Dlaczego?] (Http: // stackoverflow.com/questions/1741143/git-pull-origin-mybranch-leaves-local-mybranch-n-commits-ahead-of-origin-why) –

+0

Możesz rozważyć zrobienie 'git fetch', po którym następuje' git merge'. Zwykle otrzymasz mniej niespodzianek i większą kontrolę nad tym, jak scalić. –

Odpowiedz

28

To trochę dziwne, ale jeśli używasz git pull [remote] <refspec>, to w rzeczywistości nie aktualizuje zdalnych odwołań. To ma sens, jeśli myślisz o tym w pewien określony sposób: ponieważ określasz konkretne odwołanie do pobierania, nie musisz szukać niczego na temat odległych oddziałów, więc z natury nie wiesz, co to jest odległy oddział powinien zaktualizować. Mogło to oczywiście zrozumieć i nie zdziwiłbym się, gdyby w końcu został naprawiony, ale takie jest istniejące zachowanie. (Mogą to być wiadomości na liście dyskusyjnej - nie wiem.)

Można jednak z łatwością obejść to. Jeśli używasz git pull origin/master, ponieważ określasz, co pobrać przez oddział zdalny, powinien on zaktualizować gałąź zdalną. A jeśli i tak znajdujesz się w swoim głównym oddziale (lub innym źródle/źródle śledzącym gałąź), możesz po prostu wykonać git pull i pozwolić na wypełnienie wartości domyślnych, a aktualizacja zaktualizuje gałęzie.

Zostało to udokumentowane na stronie man git-pull, najprościej w części PRZYKŁADY, ale także w innych miejscach. Odpowiedni fragment:

Merge do bieżącego oddziału zdalnego oddział dalej:

$ git pull origin next 

pozostawia kopię obok tymczasowo w FETCH_HEAD, ale nie aktualizuje żadnych oddziałów zdalnych śledzenia. Korzystanie z oddziałów zdalnych śledzenia, to samo można zrobić powołując się pobrać i scalić:

$ git fetch origin 
$ git merge origin/next 
+0

Czy jest to udokumentowane w dowolnym miejscu na stronach git man? –

+0

Jest pochowany gdzieś na stronie "git-pull", tak myślę. Spróbuję go upolować jakiś czas później, jeśli dobrze pamiętam. – Cascabel

+0

@KennethBaltrinic: Znajduje się w sekcji przykładów i można go również wywnioskować z pozostałej dokumentacji. – Cascabel