2017-07-03 3 views
1

Da ich einige Änderungen von origin/master zu ziehen versuchen, erhalte ich diese Fehlermeldung:Wie git ziehen, während die lokalen Änderungen ignoriert werden?

error: Your local changes to the following files would be overwritten by merge

weil ich lokale Änderungen vorgenommen. Ich möchte nicht, diese Änderungen zu übernehmen, so dass ich glaube, ich git stash auf meinem Zweig verwenden soll, dann git pull origin master

Meine Frage ist:

  1. Wird der Zug einfach die Änderungen ignorieren und verschmelzen richtig
  2. Kann ich meine lokalen Änderungen auch nach dem Pull + ohne weitere Schritte verwenden?

Vielen Dank!

PS: Ja, ich googelte, ich möchte nur sicherstellen, dass ich richtig verstanden habe.

Antwort

1

verwenden, um diese Befehle:

git stash # stash you changes 
git pull : # pull 
git stash pop # re-get the stashed changes, not needed if you don't want to keep your changes 
+1

erklären, was diese Befehle sind. OP kann nicht wissen, was Stash Pop ist –

0

Die stash mecanism ist, was Sie verwenden möchten.

Zuerst speichert git stash [save [name of the stash]] Ihre Arbeit in einem Pseudo-Commit, das an Ihren aktuellen HEAD angehängt ist. Dadurch werden Sie mit einem sauberen HEAD verlassen, auf dem Sie Ihren Ursprung des Commits abrufen können (das heißt git pull)

die Änderung zu übernehmen Sie aus und verstaute Sie git stash apply oder git stash pop verwenden können. Beide verschmelzen den Stash mit deinem aktuellen HEAD und bitten dich, den Konflikt bei Bedarf zu lösen. Der erste Befehl behält den Stash (Sie können git stash drop es nach), die zweite Anwendung und automatisch ablegen.


NB: Wenn Sie sich diese sehr oft tun finden, können Sie rebase.autostash git Konfiguration auf true gesetzt. Jedes Mal, wenn Sie mit Konflikten ziehen, wird es den nächsten Befehl tun, anstatt den Zug der Ablehnung:

git stash save 
git pull 
git stash apply 
2

Wenn Sie vom Server neuen Code ziehen es wird Ihrem lokalen Code zu überschreiben.

Wenn Ihre Änderungen wichtig sind, müssen Sie sie bestätigen und dann vom Server ziehen. Und sie werden in der Lage sein, die Änderungen zu vergleichen und diese richtig zusammenzuführen.

tun: git commit -m "Any message" dann git pull Und dann NUR, WENN BENÖTIGT wird git Sie für das Lösen von Zusammenführungskonflikten bitten.

Ich rate Ihnen dringend, einen GUI-basierten Git-Manager zu verwenden. Es wird Ihnen viel Arbeit erleichtern.

Wenn Ihre Änderungen so geringfügig sind, dass sie keinen Commit verdienen, können Sie Ihre lokalen Änderungen an einem temporären Ort speichern und dann wieder zurückbringen. tun Sie das folgende:

  1. verstauen Sie Ihre Änderungen git stash. Ich werde alle lokalen Änderungen an einem Temp-Ort vornehmen.

  2. ziehen vom Server git pull. Alle Ihre Änderungen werden überschrieben.

  3. bringen Sie Ihre lokalen Änderungen aus dem Versteck git stash pop. Es bringt die lokalen Veränderungen zurück.

0

Logischerweise sollte dies auf alle drei einen Kommentar sein (zu der Zeit ich dies schrieb) der Antworten, die die Sequenz empfehlen:

git stash 
git pull 
git stash pop # or "git stash apply" -- "pop" means "apply, then drop" 

alle sind fein Antworten. Aber ich brauche Platz, um Dinge zu formatieren und viel zu schreiben.

:-)

Ich will nicht diese Änderungen

Haben Sie keine Angst begehen zu begehen! Sie können auch commit und dann wieder committen. In der Tat macht die Verwendung von git stash commits: Sie sind nur Commits, die nicht auf Zweig sind. Dies kann etwas mit der zweiten Sache unten helfen. Aber der Schlüssel hier ist zu erinnern, dass Ihre lokalen Niederlassungen sind Ihre, mit zu tun, wie Sie werden.


git fetch Mit -die ist, was git pull tut zuerst, bevor es ein zweites tut Ding hat keine Auswirkungen auf Ihre Zweige, nur auf den sogenannten Fernverfolgung Zweige. Diese Remote-Tracking-Zweige sind die Art und Weise, wie Ihr Git sich erinnert, was es auf dem anderen Git unter origin gesehen hat. Das heißt, Ihre origin/master zum Beispiel erinnert sich, was sie jetzt haben. Wenn sie Änderungen an ihrem Git vornehmen, fällt Ihr origin/master allmählich zurück, aber Sie können jederzeit git fetch laufen lassen und bekommen "was sie jetzt haben" und Ihr origin/master ist wieder auf dem neuesten Stand. Dies hat keine Auswirkungen auf Ihre eigenen master.

Nach dem Fetch müssen Sie eine zweite Sache - einen zweiten Git-Befehl - verwenden, um "ihre" Arbeit in einen oder mehrere Zweige zu integrieren. Diese zweite Sache kann git merge oder git rebase sein. Wenn Sie git pull ausführen, haben Sie implizit einen dieser beiden Befehle ausgewählt. Ich argumentiere immer, dass es besser ist, eine explizit zu wählen, so dass Sie wissen, was Sie hier tun, aber wenn Sie möchten, können Sie git pull wählen lassen. Es wird git merge standardmäßig auswählen. Dies bedeutet, dass Sie alle Komplikationen von git merge und keine der Komplikationen von git rebase bekommen.

Wahrscheinlich wollen Sie überhaupt keine Komplikationen. Das ist ziemlich hart, denn Git ist Git, du bekommst Komplikationen. Manchmal wird die Zusammenführung fehlschlagen. Manchmal schlägt die Rebase fehl. Dies ist einer der Gründe, warum ich argumentiere, dass Sie eine explizit auswählen sollten: wenn git pull fehlschlägt, müssen Sie wissen, welche zweite Sache ist, dass git pull lief, die fehlgeschlagen ist!

Ich vermute, dass Sie Commits vermeiden, weil Ihre eigenen Commits es viel wahrscheinlicher für git merge oder git rebase scheitern lässt. Das ist wahr! Dies ist auch der Grund, warum git stash helfen kann.Aber Remember, git stash macht nur Commits, die nicht auf Ihre Filialen sind - und das bedeutet, dass, wenn Sie hier einen Fehler vermeiden, in den ersten beiden Schritten, die git pull ausgeführt wird, verschieben Sie nur den Punkt des Scheiterns, wenn Sie un-stash mit git stash pop oder git stash apply!


Unterm Strich, wie es war, ist, dass egal, was Sie tun, werden Sie schließlich auf ein Problem stoßen: Sie werden einige Veränderungen haben Sie gemacht haben, dass Konflikte mit etwas ändern jemand anderes gemacht hat.

Sie müssen diese Änderungen kombinieren. Diese Kombination ist eine Aktion - sozusagen ein Verb - dass Git verschmelzt. Dieses Merge-as-a-Verb, diese Aktion des Mergens, passiert sowohl mit git mergeals auchgit rebase, und es passiert auch mit git stash apply (das ist die erste Hälfte von git stash pop).

Es ist nichts falsch daran, dies über git stash zu tun, aber Sie müssen schließlich lernen, wie es geht. Sobald Sie wissen, wie es geht, können Sie es auch mit git merge oder mit git rebase tun. Um das Zusammenführen in Git durchzuführen, werden Sie Commits verwenden müssen, unabhängig davon, ob es sich um die Commits git stash oder um git commit handelt. Also habe keine Angst zu begehen! Sie können das natürlich so lange hinstellen, wie Sie möchten - und mit git stash vor dem Pull können Sie das einfacher machen - aber denken Sie daran, dass git stash Commits macht und git pull läuft merges!

5

Hier ist, wie Ihr Repo entwickelt, wenn alle angewendet wird:

  1. Bevor Sie ziehen, mit Ihren lokalen Änderungen:

    --*--*--*--*--*--*--A--B (<- some changes you did not commit yet) 
         \   ^
         \   master: your latest local commit on master 
         \ 
         *--*--C origin/master: the latest commit on the remote repo 
    
  2. nach git stash:

         B <- stash: git stored local changes in its stash 
            /  
    --*--*--*--*--*--*--A <- master: the files on your disk have been restored 
         \       to their state in "master" 
         \    
         \ 
         *--*--C origin/master: the latest commit on the remote repo 
    
  3. nach git pull:

         B <- stash 
            /  
    --*--*--*--*--*--*--A--D <- master: merged remote branch in local branch 
         \    /
         \   / 
         \   /
         *--*--C---/ 
          ^origin/master 
    

git gilt die Aktion es normalerweise tut, wenn ziehen: die Remote-Änderungen in Ihrer lokalen Niederlassung verschmelzen.

  1. nach git stash apply:

         B <- stash 
            /  
    --*--*--*--*--*--*--A--D--B' <- modifications stored in B (not committed yet) 
         \    /
         \   / 
         \   /
         *--*--C---- 
          ^origin/master 
    

git die Änderungen im Versteck auf dem neuen führenden begehen


gespeichert Wieder gilt

Die Vorbehalte sind:

  • Schritt 3 (git pull) kann einige Konflikte auslösen, die Sie lösen müssen, bevor Sie den Status D im Diagramm
  • Schritt 4 erreichen.(git stash apply) kann auch einige Konflikte auslösen, wenn Ihre lokalen Änderungen (am Anfang) tatsächlich einige Änderungen von origin/master stören.
    Sie müssen diese vor dem Erreichen von B' im Diagramm lösen.
Verwandte Themen