Ich weiß, wie man das löst:
user@host$ git pull
Updating 9386059..6e3ffde
error: Your local changes to the following files would be overwritten by merge:
foo.bar
Please, commit your changes or stash them before you can merge.
Aborting
Aber gibt es nicht eine Möglichkeit, das zu git pull
tun stash
und pop
für mich zu tanzen?
Wenn dieser Befehl einen anderen Namen hat, ist er in Ordnung.
Das Erstellen eines Shell-Alias für git stash; git pull; git stash pop
ist eine Lösung, aber ich suche nach einer besseren Lösung.
git stash; git pull; git stash pop
Programmgesteuertes Laufen ist gefährlich, denn wenn es nichts zu verstauen gibt,git stash
wird es ein No-Op sein, abergit stash pop
das letzte Versteck (falls vorhanden) wird platzen, was mit ziemlicher Sicherheit nicht das ist, was Sie wollen. User torek hat einen tollen Beitrag dazu auf Stack Overflow, aber ich kann ihn nicht finden ...Antworten:
Für Git 2.6+ (veröffentlicht am 28. September 2015)
Das
nurgit config
Einstellung, die von Interesse wäre, ist:(Mit Git 2.27, Q2 2020 haben Sie jetzt auch
merge.autostash
, siehe unten)kombinieren Sie das mit:
Das würde ausreichen, damit ein einfacher
git pull
selbst in einem schmutzigen Baum arbeiten kann.In diesem Fall wird kein Alias benötigt.
Siehe Commit 53c76dc (04. Juli 2015) von Kevin Daudt (
Ikke
) .(Zusammengeführt von Junio C Hamano -
gitster
- in Commit e69b408 , 17. August 2015)Hinweis: Wenn Sie ohne Autostash ziehen möchten (obwohl
rebase.autoStash true
eingestellt), haben Sie seit Git 2.9 (Juni 2016):Siehe Commit 450dd1d , Commit 1662297 , Commit 44a59ff , Commit 5c82bcd , Commit 6ddc97c , Commit eff960b , Commit efa195d (02. April 2016) und Commit f66398e , Commit c48d73b (21. März 2016) von Mehul Jain (
mehul2029
) .(Zusammengeführt von Junio C Hamano -
gitster
- in Commit 7c137bb , 13. April 2016)Commit f66398e umfasst insbesondere:
Warnung: Vor Git 2.14 (Q3 2017) wurde "
git pull --rebase --autostash
" nicht automatisch gespeichert, wenn der lokale Verlauf schnell zum Upstream weitergeleitet wird.Siehe Commit f15e7cf (01. Juni 2017) von Tyler Brazier (
tylerbrazier
) .(Zusammengeführt von Junio C Hamano -
gitster
- in Commit 35898ea , 05. Juni 2017)Update: Mariusz Pawelski stellt in den Kommentaren eine interessante Frage:
Antworten:
Der ursprüngliche Thread , der diese Autostash-Funktion behandelt, wurde ursprünglich sowohl für
git pull
(Merge) als auch für (Merge) implementiertgit pull --rebase
.Aber ... Junio C Hamano (Git-Betreuer) bemerkte, dass:
In Bezug auf eine klassische Pull-Merge ist es also besser:
Abgesehen davon hat Git 2.27 (Q2 2020)
git pull
gelernt, zu warnen, wenn keinepull.rebase
Konfiguration vorhanden ist und weder--[no-]rebase
noch--ff-only
angegeben ist (was zu einer Zusammenführung führen würde).Siehe Commit d18c950 (10. März 2020) von Alex Henrie (
alexhenrie
) .(Zusammengeführt von Junio C Hamano -
gitster
- in Commit 1c56d6f , 27. März 2020)Mit Git 2.27 (Q2 2020)
git merge
lernt "--autostash
" die Option " " und die neuemerge.autostash
Einstellung.Sehen Sie verpflichten d9f15d3 , begehen f8a1785 , begehen a03b555 , begehen 804fe31 , begehen 12b6e13 , begehen 0dd562e , begehen 0816f1d , begehen 9bb3dea , begehen 4d4bc15 , begehen b309a97 , begehen f213f06 , begehen 86ed00a , begehen facca7f , begehen be1bb60 , begehen efcf6cf , begehen c20de8b , verpflichten bfa50c2 , Commit 3442c3d , Commit 5b2f6d9 (07. April 2020), Commit 65c425a(04. April 2020) und Commit fd6852c , Commit 805d9ea (21. März 2020) von Denton Liu (
Denton-L
) .(Zusammengeführt von Junio C Hamano -
gitster
- in Commit Bf10200 , 29. April 2020)Und:
quelle
rebase.autoStash
gilt nur bei Verwendung von rebase.pull.rebase
gilt nur bei Verwendung von Pull.die_on_unclean_work_tree
.2.5.5
.rebase
(oderpull --rebase
). Aber niemand kümmert sich um Autostashing, wenn Sie mit Zusammenführungen normal arbeitenpull
. Es gibt also keinen automatischen Schalter dafür? Oder fehlt mir etwas? Ich machegit pull --rebase
es lieber, aber OP fragte nach "Standard"git pull
Um ein paar Sekunden für entgegenkommende Entdecker zu sparen, hier eine Zusammenfassung (dank @VonC):
quelle
git config pull.rebase true
undgit config rebase.autoStash true
alles, was Sie jemals brauchen werden, istgit pull
. Einfachgit pull
. Keine weiteren Optionen erforderlich.--autostash
Option. Das-c rebase.autoStash=true
funktioniert ab Git 2.6.Wie im obigen Kommentar angegeben, funktioniert das Festlegen der beiden Konfigurationswerte derzeit nicht
git pull
, da die Autostash-Konfiguration nur für tatsächliche Rebases gilt. Diese Git-Befehle machen, was Sie wollen:Oder setzen Sie es als Alias:
Dann mach:
Natürlich kann dieser Alias nach Wunsch umbenannt werden.
quelle
Mit Git 2.6+ können Sie Folgendes verwenden:
Dies
--rebase
macht Git-Pullrebase
anstelle vonmerge
, so dass Einstellungen / Optionen wie--ff-only
nicht zutreffen.Ich verwende
--ff-only
standardmäßig einen Alias zum Ziehen (git pull --ff-only
) und kann ihn danngup
(von oben) verwenden, falls eine Schnellvorlaufzusammenführung nicht möglich ist oder Änderungen gespeichert sind.quelle
git pull --ff-only
undgit pull pull --rebase --autostash
Wie Sie bereits erwähnt haben, ist dies der richtige Weg. Sie können es in einem Alias verwenden, um Ihre Eingabe zu speichern und eine Verknüpfung zu verwenden, oder Sie können es in einer einzelnen Zeile verwenden (kann auch ein Alias sein).
git stash && git pull --rebase && git stash pop
Es wird dasselbe tun wie Sie, aber in einer einzigen Zeile (&&) und wenn Sie als Alias festgelegt sind, wird es sogar kürzer sein.
In den folgenden Zeilen werden die eingehenden / ausgehenden Änderungen angezeigt, bevor Sie ziehen / drücken
quelle
stash pop
einige zufällige Dinge von zuvor.git stash
nichts verstaut wird, "gibt" es immer noch keinen Fehlercode zurück, so dass das && weiterhin mitgit pull
und fortfährtgit stash pop
und ein vorheriges Versteck einfügt . Verwenden Sie dies also besser nicht, es sei denn, Sie sind sich sehr sicher, dass es etwas verstaut!