Dacă doriți să aflați mai multe despre părțile din git despre care v-a fost frică să întrebați înainte, atunci această listă este pentru dvs. Aici sunt colectate cele mai tipice situații și modalități de a le rezolva pe amândouă experienta personala autor și colectate pe tot Internetul.

Eroare la comentariul de comitere

Dacă commit-ul nu a fost încă trimis la server (push), atunci puteți utiliza o comandă simplă care vă permite să editați textul mesajului la ultima commit.

git commit --amend

Cum anulez ultima comitere?

Puteți utiliza git reset astfel:

git reset - hard HEAD ~ 1

HEAD ~ 1 înseamnă o comitere înainte de HEAD adică la poziția actuală. Trebuie remarcat faptul că aceasta este o metodă „nucleară” care va anula toate modificările. Dacă trebuie să salvați tot ceea ce ați făcut, dar nu ați avut încă timp să comiteți, utilizați:

git reset --soft HEAD ~ 1

Ștergeți ramura de pe server

git push origine - șterge numele_branșă

Care este diferența dintre „git pull” și „git fetch”?

git pull este în esență o preluare de git urmată imediat de unirea de git. git fetch preia modificările de pe server și le stochează în refs / telecomenzi /. Acest lucru nu afectează în niciun fel sucursalele locale și modificările actuale. Și git pull împinge deja toate aceste modificări în copia locală.

Cum se anulează „git add” înainte de a comite?

Ați rulat git add numele fișierului accidental și doriți să anulați adăugarea acestui fișier. Dacă angajamentul nu a fost încă făcut, acest lucru va ajuta:

git resetează numele fișierului

Cum rezolv conflictele de îmbinare?

Utilizați git mergetool, care oferă o interfață convenabilă pentru rezolvarea conflictelor.

Eliminați toate fișierele și directoarele locale care nu au fost urmărite de git din copia dvs. curentă

Prudență! Mai bine faceți o copie de rezervă înainte de a face acest lucru.

Clonați toate ramurile de pe server

Sunt șanse să fi făcut deja acest lucru, iar ramurile sunt doar ascunse. Iată o comandă pentru a le arăta pe toate:

Puteți utiliza originea / numele sucursalei pentru verificarea ramurii dorite. Sau git checkout -b branch_name origine / branch_name origine pentru a crea o ramură locală corespunzătoare celei la distanță.

Redenumiți sucursala locală

git branch -m nume vechi nume nou

Reveniți la orice comitere

Puteți utiliza reset, așa cum s-a arătat mai devreme, dar acest lucru va însemna că doriți să reveniți definitiv la starea în care vă aflați și nu doar să o priviți (trebuie să faceți check-out pentru acest lucru). ID-ul de confirmare trebuie să fie același cu cel care apare în ieșirea comenzii git log.

git reset --hard commit_id

Din nou, acest lucru va anula orice modificare actuală, deci asigurați-vă că acest lucru este ceea ce doriți. Sau utilizați --soft în loc de --hard.

Eliminați submodulul

Crearea de submodule este rar utilizată, dar uneori aveți nevoie de ea. Iată deci de ce aveți nevoie:

git submodule deinit submodulename
git rm submodulename
git rm --nume submodulen cache
rm -rf .git / modules / submodulename

Suprascrieți fișierele locale în timpul git pull

Resetarea Git vă va ajuta din nou:

git fetch --all
git reset - hard origine / master

Cum pot adăuga un director gol în depozit?

În nici un caz! Pur și simplu nu este acceptat și considerat că nu este necesar pentru dvs. Dar există un singur truc. Puteți crea un fișier .gitignore în directorul dorit cu următorul conținut:

# Ignorați totul din acest director
*
# Cu excepția fișierului în sine.gitignore
! .gitignore

Exportarea surselor, similar cu „exportul svn”

Utilizați arhiva git astfel:

git archive --format zip --output /path/to/file/file.zip master

Anulați toate modificările, cu excepția celor deja adăugate la comiterea planificată

git checkout -.

Creați o ramură nouă pe server din ramura locală curentă

git config --global push.default current
git push -u

Recuperați fișierul șters

În primul rând, trebuie să găsiți ultimul commit în care fișierul exista încă.

Sucursalele la distanță sunt legături către starea sucursalelor din depozitele dvs. la distanță. Acestea sunt sucursale locale și nu pot fi mutate; se mișcă automat ori de câte ori comunicați prin rețea. Ramurile la distanță acționează ca marcaje pentru a vă reaminti unde ramurile din depozitele la distanță au fost ultima dată când v-ați conectat la ele.

Arată ca (nume de repo la distanță) / (ramură). De exemplu, dacă doriți să vedeți cum arăta ramura master de pe serverul de origine ultima dată când v-ați conectat la acesta, verificați ramura de origine / master. Dacă dvs. și un partener ați lucrat la aceeași problemă și au încărcat sucursala iss53, este posibil să aveți propria sucursală iss53 locală; dar acea ramură de pe server va indica spre commit la origin / iss53.

Toate acestea sunt probabil confuze, așa că să ne uităm la un exemplu. Să presupunem că aveți propriul dvs. server Git online la git.ourcompany.com. Dacă clonați ceva din acesta, Git îi va denumi automat originea, va lua toate datele de acolo, va crea un pointer către ceea ce indică ramura principală și o va denumi local / master (dar nu o puteți muta) ... Git vă va face, de asemenea, propria ramură master care începe în același loc cu ramura master originară, astfel încât să aveți ceva cu care să lucrați (a se vedea Figura 3-22).

Figura 3-22. Clonarea unui proiect Git vă oferă propria ramură master și origine / master care indică spre ramura master la origine.

Dacă faceți ceva în filiala principală locală și între timp altcineva împinge modificările pe git.ourcompany.com și actualizează filiala principală acolo, poveștile dvs. vor continua diferit. De asemenea, până când nu vă conectați la serverul de origine, indicatorul dvs. de origine / master nu se va mișca (vezi Figura 3-23).



Figura 3-23. Atunci când faceți lucrări locale și cineva împinge schimbări pe un server la distanță, fiecare poveste continuă într-un mod diferit.

Pentru a vă sincroniza munca, rulați comanda git fetch origin. Această comandă caută ce origine server se potrivește (în cazul nostru, git.ourcompany.com); preia de acolo toate datele pe care nu le aveți încă și vă actualizează magazinul de date local; deplasează originea / masterul într-o nouă poziție (vezi Figura 3-24).


Figura 3-24. Comanda git fetch vă actualizează linkurile la distanță.

Pentru a demonstra cum vor arăta ramuri îndepărtate într-o situație cu mai multe servere la distanță, să presupunem că aveți un alt server Git intern care este utilizat pentru dezvoltare doar de una dintre echipele dvs. de dezvoltare. Acest server este situat la git.team1.ourcompany.com. Puteți să-l adăugați ca un nou link la distanță la proiectul la care lucrați în prezent utilizând comanda git remote add, așa cum este descris în Capitolul 2. Denumiți acest server la distanță în echipă, care va fi o prescurtare pentru adresa URL completă (a se vedea Figura. 3-25).



Figura 3-25. Adăugarea unui server la distanță suplimentar.

Acum puteți rula git fetch teamone pentru a prelua tot ce nu aveți pe server. Deoarece acest server are în prezent doar un subset de date pe care le are originea, Git nu primește nicio dată, ci scoate o ramură la distanță numită teamone / master, care indică același commit ca ramura master pe teamone (vezi Figura 3 26).



Figura 3-26. Acum aveți un link local către filiala principală a teamone.

Trimiterea modificărilor

Dacă aveți o ramură serverfix pe care doriți să lucrați cu altcineva, o puteți împinge la fel cum ați împins prima ramură. Rulați git push (server la distanță) (ramură):

$ git push origine serverfix Numărarea obiectelor: 20, gata. Comprimarea obiectelor: 100% (14/14), gata. Scrierea obiectelor: 100% (15/15), 1,74 KiB, gata. Total 15 (delta 5), \u200b\u200breutilizat 0 (delta 0) To [e-mail protejat]: schacon / simplegit.git * serverfix -\u003e serverfix

Este un fel de contracție. Git extinde automat numele sucursalei serverfix la refs / heads / serverfix: refs / heads / serverfix, ceea ce înseamnă „luați ramura locală serverfix și actualizați ramura serverfix la distanță de acolo”. Vom discuta detaliile referințelor / capetelor / părții în capitolul 9, dar de obicei pot fi omise. De asemenea, puteți rula git push origine serverfix: serverfix - la fel se va întâmpla - se spune „luați serverfix-ul meu și faceți-l serverfix la distanță”. Puteți utiliza acest format pentru a împinge o ramură locală către o ramură la distanță cu un nume diferit. Dacă nu doriți ca sucursala să fie numită serverfix pe serverul de la distanță, atunci în loc de comanda anterioară, rulați git push origine serverfix: awesomebranch. Acest lucru vă va împinge ramura serverfix locală la ramura minunată a ramurii proiectului la distanță.

$ git fetch origin remote: Numărarea obiectelor: 20, gata. telecomandă: Comprimarea obiectelor: 100% (14/14), gata. la distanță: Total 15 (delta 5), \u200b\u200breutilizat 0 (delta 0) Despachetarea obiectelor: 100% (15/15), gata. Din [e-mail protejat]: schacon / simplegit * serverfix -\u003e origin / serverfix

Este important să rețineți că atunci când aveți noi sucursale la distanță atunci când primiți date, nu primiți automat copii editabile locale pentru acestea. Cu alte cuvinte, în cazul nostru nu veți obține o nouă ramură serverfix - doar indicatorul origine / serverfix, pe care nu îl puteți schimba.

Pentru a îmbina această activitate în ramura dvs. de lucru curentă, rulați git merge origin / serverfix. Dacă aveți nevoie de propria ramură serverfix pe care puteți lucra, puteți crea una pe baza ramurii la distanță:

$ git checkout -b serverfix origin / serverfix Branch serverfix configurat pentru urmărirea referințelor / telecomenzilor / originii / serverfix la sucursală. S-a trecut la o nouă ramură „serverfix”

Acest lucru vă va oferi o filială locală la care să lucrați. Va începe de unde este originea / serverfix.

Urmărirea sucursalelor

Verificarea unei ramuri locale cu git checkout dintr-o ramură la distanță creează automat ceea ce se numește ramură urmărită... Ramurile urmărite sunt ramuri locale care sunt direct legate de ramura la distanță. Dacă, în timp ce se află pe o ramură urmărită, tastați git push, Git va ști deja pe ce server și pe ce ramură să împingă modificările. La fel, rularea unui git pull pe una dintre aceste ramuri primește mai întâi toate legăturile la distanță și apoi se fuzionează automat cu ramificarea la distanță corespunzătoare.

La clonarea unui depozit, de regulă, se creează automat o ramură master care urmărește originea / masterul, astfel încât git push și git pull funcționează pentru această ramură „din cutie” și nu necesită argumente suplimentare. Cu toate acestea, puteți configura urmărirea pentru alte sucursale. depozit la distanță... Tocmai ați văzut un exemplu simplu de cum să faceți acest lucru - git checkout -b [sucursală] [șters. server] / [sucursală]. Dacă utilizați Git versiunea 1.6.2 sau o versiune ulterioară, puteți utiliza și comanda rapidă --track:

$ git checkout --track origin / serverfix Branch serverfix configurat pentru urmărirea referințelor / telecomenzilor / originii / serverfix-ului la distanță. S-a trecut la o nouă ramură „serverfix”

Pentru a configura o ramură locală cu un nume diferit de ramura la distanță, puteți utiliza cu ușurință prima versiune cu un nume de ramură local diferit:

$ git checkout -b sf origine / serverfix Branch sf configurat pentru a urmări referințele / telecomenzile / originea / serverfix ale ramurilor la distanță. A trecut la o ramură nouă „sf”

Acum filiala dvs. locală de sf va împinge și extrage automat modificările de la origin / serverfix.

Eliminarea ramurilor de pe un server la distanță

Să presupunem că dvs. și colaboratorii dvs. ați terminat cu o inovație și ați fuzionat-o în ramura master de pe serverul de la distanță (sau în altă ramură în care este stocat codul stabil). Puteți împinge o ramură pe un server de la distanță utilizând sintaxa oarecum tâmpită git push [remote. server]: [sucursală]. Pentru a elimina ramura serverfix de pe server, procedați în felul următor:

$ git push origine: serverfix To [e-mail protejat]: schacon / simplegit.git - serverfix

Bate. Nu mai există ramură pe serverul dvs. Poate doriți să marcați pagina curentă, deoarece veți avea nevoie de această comandă și probabil că veți uita sintaxa. Vă puteți aminti această comandă revenind la sintaxa git push [șterge. server] [loc. ramură]: [șterge. ramură], la care ne-am uitat puțin mai devreme. Omiterea [lok. ramură], în esență, spuneți „nu luați nimic în depozitul meu și faceți-o astfel încât în \u200b\u200b[remote. ramură] a fost la fel. "

Dacă utilizați autentificarea prin parolă:

  1. $ git clone https: // nume de utilizator: [e-mail protejat]/opt/git/repository.git

Lucrul cu sucursale

Afișați toate sucursalele:
  1. $ git ramură
Creați o sucursală nouă:
  1. $ git ramură
Treceți la o nouă sucursală:
  1. $ git checkout
Creați o ramură nouă și treceți la aceasta:
  1. $ git checkout -b
Ștergeți sucursala locală:
  1. $ git branch -d
Eliminați ramura din depozitul de la distanță:
  1. $ git push origin --delete

Lucrul cu comitetele

Cum elimin ultimul commit?

  1. $ git reset --soft HEAD ^
Git How To. Capitolul 16. Anularea comiterilor
Git How To. Capitolul 17. Eliminarea comitetelor dintr-o ramură
Documentație oficială Git. Noțiuni de bază Git - inversarea modificărilor

Cum modific ultima comisie?

  1. $ git add new_file.txt
  2. $ git commit --amend

Cum modific comentariul pentru ultima comitere?

  1. $ git commit --amend
  2. $ git commit --amend -m „Comentariu nou”

Cum pot combina mai multe confirmări?

  1. $ git rebase -i HEAD ~ 3
În loc de HEAD ~ 3, puteți utiliza hash-ul commit. Trebuie să treceți hash-ul comitetului la care doriți să îmbinați (aplatizați) totul.
Se va deschide un editor cu o listă de confirmări, cu cea mai veche confirmare în partea de sus.
  1. alegeți 1111111 Confirmați 1 comentariu
  2. alege 2222222 Comit 2 comentariu
  3. alege 3333333 Comit 3 comentariu
Trebuie să înlocuim pick cu squash pentru a obține astfel:
  1. alegeți 1111111 Confirmați 1 comentariu
  2. squash 2222222 Commit 2 comentariu
  3. squash 3333333 Commit 3 comentariu
Apoi, trebuie să salvați fișierul și să ieșiți. Va fi deschis din nou editor de text cu toate comentariile pentru comitere. Trebuie să editați, să salvați și să ieșiți. După acești pași, confirmările vor fi combinate.

Cum se anulează modificările într-un anumit fișier și se readuce la starea în care se afla după ultima comitere?

  1. $ git checkout - file.txt

Cum pot reveni la toate modificările neacceptate (neacceptate)?

  1. $ git checkout

Cum pot păstra unele fișiere pentru următorul commit?

Să presupunem că doriți să comiteți modificări în unele fișiere și să comiteți modificări în alte fișiere în următorul commit. Apoi le puteți elimina temporar din depozit (fișiere unstage), apoi le puteți adăuga din nou.
  1. $ git reset HEAD file.txt
Această comandă va elimina fișierul din depozit, va rămâne în comitetele vechi. Direcționează spre ultima comitere din ramura curentă.

Dacă nu puteți trece la depozitul la distanță datorită faptului că versiunea actuală a depozitului este mai mică decât cea din depozitul la distanță

În acest caz, puteți face o împingere forțată.
  1. $ git push -f master de origine

Fuzionarea ramurilor

Cum pot lua doar câteva fișiere dintr-o altă ramură?

  1. $ git checkout branchname - cale / către / fișier.fișier

Depozite la distanță

Afișarea informațiilor despre un depozit la distanță

  1. $ git remote show origin
Ecranul va afișa așa ceva:
  1. * origine la distanță
  2. Adresa URL: [e-mail protejat]: /opt/git/test-project.git
  3. Adresa URL împinsă: [e-mail protejat]: /opt/git/test-project.git
  4. Ramură CAP: stăpân
  5. Ramură la distanță:
  6. master new (următoarea preluare va fi stocată în telecomenzi / origine)
  7. Ref local configurat pentru „git push”:
  8. stăpânul împinge la stăpân (local învechit)

Adăugarea unui depozit la distanță

  1. $ git remote add origin [e-mail protejat]: /opt/git/test-project.git