Wiem, jak to rozwiązać:
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
Ale czy nie ma sposobu, by pozwolić git pull
mi tańczyć stash
i pop
tańczyć?
Jeśli to polecenie ma inną nazwę, jest w porządku.
Utworzenie aliasu powłoki dla git stash; git pull; git stash pop
jest rozwiązaniem, ale szukam lepszego rozwiązania.
git stash; git pull; git stash pop
programowe jest niebezpieczne, ponieważ jeśli nie ma nic do ukrycia,git stash
nie będzie to możliwe, alegit stash pop
wyrzuci ostatnią skrytkę (jeśli w ogóle), co prawie na pewno nie jest tym, czego chcesz. Użytkownik torek ma świetny post na ten temat w Stack Overflow, ale nie mogę go znaleźć ...Odpowiedzi:
Git 2.6+ (wydany 28 września 2015 r.)
Plik
tylkogit config
ustawienie, które mogłoby być interesujące, to:(z Git 2.27, Q2 2020, masz teraz również
merge.autostash
, patrz poniżej)połącz to z:
To wystarczyłoby, aby prosty
git pull
do pracy nawet na brudnym drzewie.W takim przypadku alias nie jest potrzebny.
Zobacz commit 53c76dc (04 lipca 2015) autorstwa Kevina Daudta (
Ikke
) .(Scalone przez Junio C Hamano -
gitster
- w zatwierdzeniu e69b408 , 17 sierpnia 2015)Uwaga: jeśli chcesz pobierać bez autostashu (nawet jeśli
rebase.autoStash true
jest ustawiony), masz od wersji 2.9 (czerwiec 2016):Zobacz commit 450dd1d , commit 1662297 , commit 44a59ff , commit 5c82bcd , commit 6ddc97c , commit eff960b , commit efa195d (02 kwietnia 2016) i commit f66398e , commit c48d73b (21 marca 2016) przez Mehul Jain (
mehul2029
) .(Scalone przez Junio C Hamano -
gitster
- w zatwierdzeniu 7c137bb , 13 kwietnia 2016 r.)Commit f66398e obejmuje w szczególności:
Ostrzeżenie: przed Git 2.14 (Q3 2017), "
git pull --rebase --autostash
" nie był automatycznie ukrywany, gdy lokalna historia jest szybko przesyłana do nadawcy.Zobacz commit f15e7cf (01 czerwca 2017) autorstwa Tyler Brazier (
tylerbrazier
) .(Scalone przez Junio C Hamano -
gitster
- w zobowiązaniu 35898ea , 05 czerwca 2017 r.)Aktualizacja: Mariusz Pawelski zadaje w komentarzach ciekawe pytanie:
Odpowiedź:
Oryginalne nici omówieniem tej autostash funkcji był realizowany zarówno początkowo
git pull
(scalanie) igit pull --rebase
.Ale ... Junio C Hamano (opiekun Git) zauważył, że:
Tak więc, jeśli chodzi o klasyczne łączenie pull-merge, lepiej:
To powiedziawszy, z Git 2.27 (Q2 2020), "
git pull
" nauczył się ostrzegać, gdy żadnapull.rebase
konfiguracja nie istnieje i ani--[no-]rebase
nie--ff-only
jest podana (co spowodowałoby scalenie).Zobacz commit d18c950 (10 marca 2020) autorstwa Alexa Henrie (
alexhenrie
) .(Scalone przez Junio C Hamano -
gitster
- w zatwierdzeniu 1c56d6f , 27 marca 2020 r.)W Git 2.27 (Q2 2020) "
git merge
" uczy się--autostash
opcji " " i nowychmerge.autostash
ustawień.Zobacz popełnić d9f15d3 , popełnić f8a1785 , popełnić a03b555 , popełnić 804fe31 , popełnić 12b6e13 , popełnić 0dd562e , popełnić 0816f1d , popełnić 9bb3dea , popełnić 4d4bc15 , popełnić b309a97 , popełnić f213f06 , popełnić 86ed00a , popełnić facca7f , popełnić be1bb60 , popełnić efcf6cf , popełnić c20de8b , zobowiązać bfa50c2 , commit 3442c3d , commit 5b2f6d9 (07 kwietnia 2020), commit 65c425a(04 kwietnia 2020) i commit fd6852c , commit 805d9ea (21 Mar 2020) by Denton Liu (
Denton-L
) .(Scalone przez Junio C Hamano -
gitster
- w zobowiązaniu bf10200 , 29 kwietnia 2020 r.)I:
źródło
rebase.autoStash
ma zastosowanie tylko w przypadku korzystania z rebase.pull.rebase
ma zastosowanie tylko przy użyciu pull.die_on_unclean_work_tree
.2.5.5
.rebase
(lubpull --rebase
). Ale nikt nie zajmuje się autostashingiem, gdy robisz coś normalnegopull
z połączeniami. Więc nie ma do tego automatycznego przełącznika? Albo coś mi brakuje? Wolę to robić,git pull --rebase
ale OP zapytał o "standard"git pull
Aby zaoszczędzić kilka sekund nadciągającym odkrywcom, oto podsumowanie (dzięki @VonC):
źródło
git config pull.rebase true
igit config rebase.autoStash true
, wszystko, czego kiedykolwiek będziesz potrzebować, togit pull
. Po prostugit pull
. Żadne inne opcje nie są wymagane.--autostash
opcji potrzebujesz co najmniej Git 2.9 .-c rebase.autoStash=true
Pracuje w dalszej Git 2.6.Jak stwierdzono w powyższym komentarzu, ustawienie dwóch wartości konfiguracyjnych obecnie nie działa
git pull
, ponieważ konfiguracja autostash dotyczy tylko rzeczywistych ponownych baz. Te polecenia git robią, co chcesz:Lub ustaw jako alias:
Następnie wykonaj:
Oczywiście ten alias można dowolnie zmienić.
źródło
Z Git 2.6+ możesz korzystać z:
To
--rebase
powoduje użycie git-pullrebase
zamiastmerge
, więc ustawienia / opcje takie jak--ff-only
nie będą miały zastosowania.--ff-only
Domyślnie używam aliasu do ściągania (git pull --ff-only
), a następnie mogę użyćgup
(od góry) w przypadku, gdy szybkie scalanie do przodu nie jest możliwe lub są zachowane zmiany.źródło
git pull --ff-only
igit pull pull --rebase --autostash
Jak już wspomniałeś, jest to sposób na zrobienie tego. Możesz go używać w aliasie, aby zaoszczędzić na pisaniu i używać skrótu lub możesz użyć go w jednej linii (może to być również alias)
git stash && git pull --rebase && git stash pop
Zrobi to samo, co zrobiłeś, ale w jednej linii (&&), a jeśli ustawisz jako alias, będzie nawet krótszy.
W następnych wierszach zostaną wyświetlone zmiany przychodzące / wychodzące przed pociągnięciem / pchnięciem
źródło
stash pop
usunie kilka losowych rzeczy z wcześniejszych.git stash
nic nie przechowuje, nadal „zwraca” brak kodu błędu, więc && będzie nadal kontynuowałgit pull
igit stash pop
i pobierze poprzedni plik. Więc lepiej tego nie używaj, chyba że jesteś pewien, że coś skryje!