2017-02-10 7 views
0

Ive erhalten einen Fehler beim Versuch, eine Verzweigung zu fusionieren oder zu ziehen.Git Fehler beim Zusammenführen/ziehen

Der Fehler (in diesem Beispiel aus einem Pull-Request) ist wie folgt:

MacBook-Pro-2:boilerplate Gene$ git pull origin test_branch 
From https://github.com/me/boilerplate 
* branch   test_branch  -> FETCH_HEAD 

Merge branch 'test_branch' of https://github.com/me/boilerplate into test_branch 

# Please enter a commit message to explain why this merge is necessary, 
# especially if it merges an updated upstream into a topic branch. 
# 
# Lines starting with '#' will be ignored, and an empty message aborts 
# the commit. 
~                    
~                    
~                    
~                    
~                    
~                    
~                    
~                    
~                    
~                    
~                    
~                    
~                    
~                    
~                    
~                    
"~/Sites/boilerplate/.git/MERGE_MSG" 7L, 302C 

Sache ist ich definitiv eine Nachricht begehen eingegeben.

git commit -am "saving my work"

Und dieser Fehler tut jede Option geben Sie mir, es zu lösen oder sogar ctrl + c aus. Ich muss das Terminalfenster schließen und neu öffnen.

Die Sache ist, sobald ich das Terminal wieder öffnen, scheint die Zusammenführung oder Pull-Anforderung immer erfolgreich zu sein, ist aber nicht verpflichtet. Ich begehe meine Änderungen und es ist in Ordnung. Es ist meistens nur nervig (und ein bisschen nervenaufreibend für wichtigere Zusammenführungen).

Weiß jemand, was das sein kann und wie man es verhindert?

+1

Wissen Sie, wie man 'vi' benutzt? – PetSerAl

+0

Mögliches Duplikat von [Wie kann ich gits Merge-Commit-Nachricht anpassen?] (Http://stackoverflow.com/questions/3148863/how-can-i-customize-gits-merge-commit-message) – chwarr

+0

Ich weiß nicht 'vi' – yevg

Antwort

1

Dies ist keine Fehlermeldung. git pull muss eine Zusammenführung machen und es bittet Sie zu erklären, warum ... was ein bisschen unaufrichtig ist, um den Benutzer zu fragen, aber das ist Git für Sie.

git pull origin test_branch ist wirklich git fetch origin plus ein git merge origin/test_branch. Git kommuniziert nicht mit Remote-Repositorys, es sei denn, Sie sagen es ihm, also muss es einen neuen Schnappschuss von dem bekommen, was sich auf der Fernbedienung geändert hat. Es führt die fetch aus, um eine Aktualisierung des Status des Remote-Repositorys zu erhalten. Es speichert dies in entfernten Verfolgungszweigen wie origin/test_branch, wo sich der test_branch-Zweig auf dem origin-Repository befindet.

Vor dem Abruf könnte Ihr Repo in etwa so aussehen.

A - B - C - D [origin/test_branch] 
      \ 
       E - F [test_branch] 

Das bedeutet, das letzte Mal abgerufen aus origin, seine test_branch bei D. war dann Sie ein paar lokale Commits tat.

Nach dem Abruf könnte es so aussehen.

A - B - C - D - G - H [origin/test_branch] 
      \ 
       E - F [test_branch] 

Jemand schob sonst einige Änderungen, so dass Ihr test_branch von origin ‚s test_branch Zweig abgezweigt hat. Dies muss zusammengeführt werden, so git pull tut git merge origin/test_branch. Dies führt zu einem Zusammenführungs-Commit, und wie bei jeder Zusammenführung fragt es Sie, warum es passiert ist.

A - B - C - D - G - H [origin/test_branch] 
      \  \ 
       E - F - I [test_branch] 

Sie können etwas wie "Synchronisation mit der Fernbedienung" sagen.


Tun Sie dies genug, und Sie erhalten viele Zusammenführungen, die wirklich nur Buchhaltung sind.

A - B - C - D - G - H - J - K - L - M [origin/test_branch] 
      \  \  \  \ 
       E - F - I - N - O - P - Q [test_branch] 

I, O und Q sind alle bedeutungslos. Mit jedem, der dies tut, kann das Repository ein großes Chaos werden. Ich habe es ordentlich gezeichnet, aber Git tut das nicht immer.

Es gibt einen besseren Weg. git pull --rebase. Anstelle von Fetch + Merge ist dies ein Fetch + Rebase.Also nach der fetch hast du das.

A - B - C - D - G - H [origin/test_branch] 
      \ 
       E - F [test_branch] 

Statt git merge origin/test_branch zu tun, es tut git rebase origin/test_branch. Es schreibt E und F so, als ob sie die ganze Zeit über auf H wären und ihnen neue Commit-IDs geben würden.

A - B - C - D - G - H [origin/test_branch] 
      \  \ 
       E - F E1 - F1 [test_branch] 

E und F werden schließlich Müll gesammelt werden, aber sie werden für eine Weile hängen, um so, wenn etwas schief geht man diesen Prozess umkehren.

Es gibt keine Buchhaltungszusammenlegungen, um Dinge zu verwirren. Die Geschichte ist schön und linear. Es ist, als ob Sie die ganze Zeit an dem neuesten Code arbeiten würden.

Im Gegensatz zu anderen Anwendungen von rebase ist dies immer sicher, da es nur Commits betrifft, die Sie noch nicht mit anderen geteilt haben. Sie können es sicher so einstellen, dass git pull immer in Ihrem ~/.gitconfig Rebase wird.

[pull] 
     rebase = true 

Jetzt wird git pull origin test_branch statt Merge rebase verwenden, und Sie werden eine sauberere Geschichte mit weniger Buchhaltung haben.

+0

Vielen Dank für Ihre gründliche Antwort. Ich weiß, dass das Beispiel sich auf eine Pull-Anfrage bezieht, aber was würde diese Nachricht im Falle einer Zusammenführung bedeuten? – yevg

+0

@yevg 'git pull' ist keine Pull-Anfrage. Eine Pull-Anfrage ist eine Github-Sache, nicht Git. Was Sie bekommen * ist * eine Nachricht von einer Zusammenführung, 'git pull' ist ein' git fetch' + 'git merge'. – Schwern

Verwandte Themen