Există o comandă Git (sau o secvență scurtă de comenzi) care să facă în siguranță și cu siguranță următoarele?
- Scapă de orice modificări locale.
- Obține ramura dată de la origine, dacă este necesar.
- Să verifice ramura dată?
În prezent sunt blocat cu:
git fetch -p
git stash
git stash drop
git checkout $branch
git pull
dar mă deranjează pentru că mi se cere parola de două ori (de către fetch
și pull
). În general, aș fi mulțumit de orice soluție, atâta timp cât parola este necesară o singură dată.
Câteva note:
- Este o parte din scriptul de implementare homebrewed pentru o aplicație (codul este găzduit pe GitHub).
- Nu ar trebui să existe nicio diferență dacă ramura a fost deja preluată de la origine sau nu (adică prima desfășurare a unei noi ramuri nu ar trebui să necesite, în mod ideal, niciun pas suplimentar).
- Scriptul este localizat pe o mașină la distanță care poate fi accesată de mai multe persoane, prin urmare nu sunt stocate credențiale și trebuie introduse utilizatorul/parola (dar numai o singură dată, dacă este posibil).
- Nu-mi pasă de nicio modificare locală; vreau întotdeauna o copie imaculată a ramurii date (partea ulterioară a scriptului de implementare produce modificări locale).
- Nu pot să clonez sau să export un depozit proaspăt de fiecare dată; durează prea mult timp.
Ați putea urma o soluție similară cu „Cum pot forța „git pull” să suprascrie fișierele locale?”:
git fetch --all
git reset --hard origin/abranch
git checkout $branch
Asta ar implica doar un singur fetch.
Cu Git 2.23+, git checkout
este înlocuit aici cu git switch
(prezentat aici) (încă experimental).
git switch -f $branch
(cu -f
fiind un alias pentru --discard-changes
, , după cum se menționează în răspunsul lui Jan)
Continuați chiar dacă indexul sau arborele de lucru diferă de HEAD.
Atât indexul, cât și arborele de lucru sunt restaurate pentru a se potrivi cu obiectivul de comutare.
- Eu folosesc această soluție, dar am adăugat suplimentar
git checkout $branch
la sfârșit, deoarece altfel informațiile despre ramura curentă returnate de git erau greșite. – > . - @VonC, Mulțumesc. acest lucru chiar a suprascris masterul cu ramura. – > .
Câteva puncte:
- Cred că
git stash
+git stash drop
ar putea fi înlocuit cugit reset --hard
-
… sau, chiar mai scurt, să se adauge
-f
lacheckout
comanda:git checkout -f -b $branch
Acest lucru va elimina orice modificări locale, ca și cum
git reset --hard
a fost folosită înainte de checkout.
În ceea ce privește întrebarea principală: în loc să trageți în ultimul pas, ați putea să unificați ramura corespunzătoare de la distanță în ramura locală: git merge $branch origin/$branch
, Dacă nu se face asta, cred că nu se lovește de la distanță. În acest caz, se elimină nevoia de acreditări și, prin urmare, se rezolvă cea mai mare preocupare a dvs.
- Este posibil ca litera -b să trebuiască să fie scrisă cu majuscule.
git checkout -f -B $branch
resetează ramura locală, dacă aceasta există deja. – > .
git reset
și git clean
pot fi exagerate în anumite situații (și pot fi o mare pierdere de timp).
Dacă aveți pur și simplu un mesaj de genul „Următoarele fișiere netrasate vor fi suprascrise…” și doriți ca remote/origin/upstream să suprascrie acele fișiere netrasate conflictuale, atunci git checkout -f <branch>
este cea mai bună opțiune.
Dacă sunteți ca mine, cealaltă opțiune a fost să curățați și să efectuați un --hard reset
apoi să vă recompilați proiectul.
Noul git-switch
comandă (începând cu GIT 2.23) are, de asemenea, un indicator --discard-changes
care ar trebui să vă ajute. git pull
ar putea fi necesar după aceea.
Atenție: este încă considerată experimentală.
- Punct bun. Am promovat comutatorul git în trecut (stackoverflow.com/a/57066202/6309). Mi-am actualizat răspunsul din 2013 pentru a include această nouă comandă. – > .
git reset --hard
2.git checkout $branch
3.git pull origin $branch
– > Por g19fanatic.