Für Git 2.6+ (veröffentlicht am 28. September 2015)
Das nur git config
Einstellung, die von Interesse wäre, ist:
rebase.autoStash
(Mit Git 2.27, Q2 2020 haben Sie jetzt auch merge.autostash
, siehe unten)
Wenn der Wert auf "true" gesetzt ist, erstellen Sie vor Beginn des Vorgangs automatisch einen temporären Stash und wenden Sie ihn nach Beendigung des Vorgangs an.
Dies bedeutet, dass Sie Rebase auf einem schmutzigen Arbeitsbaum ausführen können.
Seien Sie jedoch vorsichtig: Die endgültige Stash-Anwendung nach einer erfolgreichen Rebase kann zu nicht trivialen Konflikten führen. Der Standardwert ist false.
kombinieren Sie das mit:
pull.rebase
Wenn true, werden die Zweige über dem abgerufenen Zweig neu basiert, anstatt den Standardzweig von der Standardfernbedienung zusammenzuführen, wenn "git pull" ausgeführt wird.
git config pull.rebase true
git config rebase.autoStash true
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)
pull
: Dirty Tree zulassen, wenn rebase.autostash
aktiviert
rebase hat gelernt, Änderungen zu speichern, wenn er auf einen schmutzigen Arbeitsbaum stößt, git pull --rebase
tut dies jedoch nicht.
Überprüfen Sie nur, ob der Arbeitsbaum verschmutzt ist, wenn er rebase.autostash
nicht aktiviert ist.
Hinweis: Wenn Sie ohne Autostash ziehen möchten (obwohl rebase.autoStash true
eingestellt), haben Sie seit Git 2.9 (Juni 2016):
pull --rebase --no-autostash
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:
pull --rebase
: --[no-]autostash
Flag hinzufügen
Wenn die rebase.autoStash
Konfigurationsvariable festgelegt ist, kann sie in git pull --rebase
der Befehlszeile nicht für " " überschrieben werden.
Lehren Sie " git pull --rebase
" das --[no-]autostash
Befehlszeilenflag, das den aktuellen Wert von überschreibt rebase.autoStash
, falls gesetzt. Da " git rebase
" die --[no-]autostash
Option versteht, geht es nur darum, die Option an das zugrunde liegende " git rebase
" zu übergeben, wenn " git pull --rebase
" aufgerufen wird.
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)
pull
: ff --rebase --autostash
funktioniert in Dirty Repo
Wenn git pull --rebase --autostash
in einem verschmutzten Repository ein schneller Vorlauf durchgeführt wurde, wurde nichts automatisch gespeichert und der Pull schlug fehl.
Dies lag an einer Verknüpfung, um zu vermeiden, dass Rebase ausgeführt wird, wenn wir schnell vorspulen können, aber Autostash wird in diesem Codepfad ignoriert.
Update: Mariusz Pawelski stellt in den Kommentaren eine interessante Frage:
Also schreiben alle darüber, autostash
wann Sie Rebase (oder pull --rebase
) machen.
Aber niemand nimmt etwa autostashing , wenn Sie mit dem normalen Zug tun verschmilzt .
Es gibt also keinen automatischen Schalter dafür? Oder fehlt mir etwas? Ich mache git pull --rebase
es lieber, aber OP fragte nach " Standard " Git Pull
Antworten:
Der ursprüngliche Thread , der diese Autostash-Funktion behandelt, wurde ursprünglich sowohl für git pull
(Merge) als auch für (Merge) implementiert git pull --rebase
.
Aber ... Junio C Hamano (Git-Betreuer) bemerkte, dass:
Wenn dies pull-merge
etwas wäre, das den "Ärger" hervorrufen würde, der dieses Thema ausgelöst hat, überschneidet sich die lokale Änderung per Definition mit der Zusammenführung, und dieser interne "Stash Pop" berührt die Pfade, die die Zusammenführung berührt hat, und führt wahrscheinlich nicht zu "Abgelegt" "aber lassen Sie weitere Konflikte gelöst werden.
Ich vermute, dass die pull.autostash
Konfiguration keine gute Ergänzung ist, da sie einen schlechten, schmerzauslösenden Workflow fördert.
In einfachen Fällen kann es nicht schaden, aber wenn lokale Änderungen komplex sind, würde es aktiv schaden, als es nicht zu haben, und die Konfiguration beraubt den Anreiz zur Auswahl.
Die Gleichung ist für "Pull-Rebase" etwas anders, da "Rebase" darauf besteht, dass Sie von einem sauberen Arbeitsbaum ausgehen, sodass sich der Ärger "Herunterladen und dann stoppen" größer anfühlt. Ich habe den Verdacht, dass eine Lockerung eine produktivere Lösung für das eigentliche Problem sein könnte.
In Bezug auf eine klassische Pull-Merge ist es also besser:
Ermutigen Sie den Benutzer, vor dem Ausführen von " git pull
" über die Art der WIP nachzudenken, die er im Arbeitsbaum hat .
Ist es ein zu komplexes Tier, das das, was andere tun, stören kann, oder ist es eine triviale Veränderung, die er verstauen und zurückwerfen kann?
Wenn erstere, ist er weitaus besser dran, " checkout -b
" zu arbeiten, weiter zu arbeiten, bis die lokale Veränderung in eine etwas bessere Form kommt, und "zu begehen", bevor er in den ursprünglichen Zweig zieht.
In letzterem Fall ist er besser dran:
- "
git pull
",
- Nachdem Sie Konflikte festgestellt haben, führen Sie sie aus
git stash
,
git merge FETCH_HEAD
und
git stash pop
Abgesehen davon hat Git 2.27 (Q2 2020) git pull
gelernt, zu warnen, wenn keine pull.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)
pull
: warnen, wenn der Benutzer nicht gesagt hat, ob er neu aufbauen oder zusammenführen soll
Unterzeichnet von: Alex Henrie
Oft vergessen unerfahrene Git-Benutzer, " pull --rebase
" zu sagen, und erhalten eine unnötige Zusammenführung vom Upstream.
Normalerweise möchten sie entweder pull --rebase
in den einfacheren Fällen " pull --ff-only
" oder " " die Kopie der Hauptintegrationszweige aktualisieren und ihre Arbeit separat neu starten.
Die pull.rebase
Konfigurationsvariable hilft ihnen in den einfacheren Fällen, aber es gibt keinen Mechanismus, um diese Benutzer darauf aufmerksam zu machen.
Geben Sie eine Warnmeldung aus, wenn keine --[no-]rebase
Option über die Befehlszeile und keine pull.rebase
Konfigurationsvariable angegeben wird.
Dies wird diejenigen stören, die niemals " pull --rebase
" wollen ", die nichts Besonderes tun mussten, aber die Kosten für die Unannehmlichkeiten werden nur einmal pro Benutzer bezahlt, was ein angemessener Preis sein sollte, um einer Reihe neuer Benutzer zu helfen.
Mit Git 2.27 (Q2 2020) git merge
lernt " --autostash
" die Option " " und die neue merge.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)
pull
: pass --autostash zum Zusammenführen
Unterzeichnet von: Denton Liu
Vorher --autostash
nur mit gearbeitet git pull --rebase
.
Im letzten Patch wurde jedoch auch das Zusammenführen gelernt, --autostash
sodass es keinen Grund mehr gibt, warum wir diese Einschränkung nicht mehr haben sollten.
Lehren Sie Pull to Pass --autostash
zum Zusammenführen, genau wie beim Rebase.
Und:
rebase
: Verwendung apply_autostash()
von sequencer.c
Unterzeichnet von: Denton Liu
Die apply_autostash()
Funktion in builtin/rebase.c
ist der apply_autostash()
Funktion sequencer.c
insofern ähnlich genug , als sie fast austauschbar sind, mit Ausnahme der Art von Argument, die sie akzeptieren. Machen Sie die sequencer.c
Version extern und verwenden Sie sie in Rebase.
Die Rebase-Version wurde in 6defce2b02 ("eingebaute Rebase: Support- --autostash
Option", 2018-09-04, Git v2.20.0-rc0 - Zusammenführung in Stapel 8 aufgeführt ) als Teil der Shell-zu-C-Konvertierung eingeführt.
Die Funktion wurde dupliziert, da zu diesem Zeitpunkt ein weiteres Projekt in Bearbeitung war, das die interaktive Rebase ebenfalls von Shell auf C konvertierte, und sie nicht durch Refactoring der sequencer.c
Version von mit ihnen in Konflikt geraten wollten apply_autostash()
.
Da beide Bemühungen längst abgeschlossen sind, können wir sie jetzt frei miteinander kombinieren.