Comanda Git pentru a verifica orice ramură și a suprascrie modificările locale (Programare, Git, Implementare, Git Checkout)

szeryf a intrebat.

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.

Comentarii

  • 1. git reset --hard 2. git checkout $branch 3. git pull origin $branch –  > Por g19fanatic.
  • FYI dacă folosiți chei ssh nu vi se va cere niciodată o parolă. –  > Por Slam.
  • @Slam nu și dacă folosești GitLab. –  > Por Hutch Moore.
4 răspunsuri
VonC

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.

Comentarii

  • 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. –  > Por szeryf.
  • @VonC, Mulțumesc. acest lucru chiar a suprascris masterul cu ramura. –  > Por psun.
Marcin Łoś

Câteva puncte:

  • Cred că git stash + git stash drop ar putea fi înlocuit cu git reset --hard
  • … sau, chiar mai scurt, să se adauge -f la checkout 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.

Comentarii

  • Este posibil ca litera -b să trebuiască să fie scrisă cu majuscule. git checkout -f -B $branch resetează ramura locală, dacă aceasta există deja. –  > Por xer0x.
Aaron Hull

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.

Jan

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ă.

Comentarii

  • 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ă. –  > Por VonC.