Comiteri

Cum să schimb mesajul ultimei comiteri?

În cazul când ați depistat greșeli gramaticale sau greșeli de sintaxă în mesajul ultimei comiteri sau poate considerați că mesajul nu descrie suficient de clar modificările comise, puteți împrospăta mesajul după bunul dumnevoastră plac folosind opțiunea --amend a comenzii git-commit

git commit --amend -m '<mesaj nou>'

În cazul când doriți să consultați mesajul ultimei comiteri sau fișierele conținute în aceasta, înainte de a actualiza mesajul, puteți exclude opțiunea -m

git commit --amend

În rezultat se va deschide editorul implicit (vezi git-config) în care veți putea introduce noul mesaj și veți putea vizualiza mesajul vechi împreună cu fișierele din comitere

<mesaj vechi>

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# Changes to be committed:
#       modified:   <fisier1>
#       modified:   <fisier2>
#       modified:   <fisier3>
#

Dacă ultima comitere a fost deja încărcată pe server, adică nu este prezentă doar local, va fi nevoie de a finaliza operațiile de mai sus cu o încărcare forțată a ramurii, adică:

git push -f ...

Warning

1111111111111111111111

Cum să schimb mesajul oricărei sau oricăror comiteri?

Acest lucru este posibil folosind comanda git-rebase cu opțiunea -i (sau --interactive) doar că parametrul trimis acestei comenzi nu este comiterea care trebuie modificată ci comiterea părinte a celei care trebuie modificată sau părintele comun ale comiterilor ce trebuie modificate. Astfel această comandă primește drept parametru o comitere de pornire oferind posibilitatea de a modifica comiterile din intervalul (<comitere de pornire>, HEAD]

git rebase -i <comitere de pornire>

În caz că doriți să schimbați mesajul unei singure comiteri puteți folosi

git rebase -i <comitere>~1

În rezultatul execuției comenzii va apărea editorul implicit

pick <comitere6> <mesaj6>
pick <comitere5> <mesaj5>
pick <comitere4> <mesaj4>
pick <comitere3> <mesaj3>
pick <comitere2> <mesaj2>
pick <comitere1> <mesaj1>

# Rebase 7e2035a..e3335d3 onto 7e2035a
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#

Înlocuiți cuvântul „pick” cu „reword” în dreptul fiecărei comiteri al cărei mesaj doriți să-l schimbați.

Cum să exclud un fișier din ultima comitere?

Dacă ați inclus un fișier (sau mai multe) în plus în ultima comitere, atunci puteți corecta acest lucru fie folosind opțiunea --amend a comenzii git-commit:

git reset HEAD~1 <fisier>
git commit --amend

fie mutând capul pe penultima comitere:

git reset --soft HEAD~1
git reset HEAD <fisier>
git commit

Cum sa revin la ultima comitere?

Dacă ați operat careva modificări nereușite și doriți să le anulați, atunci următoarea comandă va șterge noile modificări și va reveni la ultima comitere:

git reset --hard HEAD

Cum să adaug un fișier la ultima comitere?

Dacă ați uitat să adăugați un fișier în ultima comitere, atunci fie folosiți opțiunea --amend a comenzii git-commit:

git add <fisier>
git commit --amend

fie mutați capul pe penultima comitere:

git reset --soft HEAD~1
git add <fisier>
git commit

Cum să modific un fișier din ultima comitere?

Dacă ați mai făcut niște schimbări care nu merită comise aparte ci se înscriu perfect în ultima comitere, atunci fie folosiți opțiunea --amend a comenzii git-commit:

git add <fisier>
git commit --amend

fie mutați capul pe penultima comitere:

git reset --soft HEAD~1
git add <fisier>
git commit

Cum să anulez ultima operație de comitere?

După comitere ați înțeles că v-ați grăbit și că mai sunt fișiere care trebuie incluse în acestă comitere, dar asupra lor mai este de lucru; atunci:

git reset --soft HEAD~1

apoi după ce ați finalizat lucrul:

git add ...
git commit ...

Cum sa revin la versiunea fișierul dintr-o anumită comitere?

A. Vreau doar să vizualizez acestă versiune (o privire în trecut)

git show <comitere>:<fișier>

B. Vreau să văd diferența

git diff <comitere>:<fișier>

C. Vreau sa înlocuiesc fișierul actual cu acea versiune (restabilirea)

git checkout <comitere> <fisier>

Warning

Ultima comandă alterează atât conținutul din șantier cât și șterge conținutul din index.

D. Vreau să înlocuiesc doar conținutul din index

git reset <comitere> <fisier>

În rezultat fișier rămâne nealterat și se schimbă doar conținutul din index.

Cum să văd istoria unui fișier?

Vreau să văd doar comiterile referitoare la fișier

git log --oneline <fisier>

sau dacă aveți instalat programul gitk puteți îmbunătăți experiența grafică:

gitk <fisier>

B. Vreau să văd diferențele dintre fișier și versiunea sa dintr-o comitere

git diff <comitere> <fișier>

C. Vreau să văd diferența dintre fișier și versiunea sa din index

git diff --cached <fisier>

sau

git diff -- <fișier>

D. Vreau să văd cine a modificat ultimul un anumit rând din fișier

git blame <fișier>

E. Vreau să văd cine a modificat ultimul un anumit rând din fișier dintr-o anumită comitere

git blame <comitere> <fișier>

Cum să scot fișierele adăugate în index?

Dacă din greșeală ați actualizat index-ul atât cu fișiere pe care doriți să le comiteți cât și cu fișiere pe care nu doriți să le comiteți această eroare poate fi înlăturată folosind comanda git-reset

git reset [HEAD] <fișier>

sau puteți aplica comanda pe mai multe fișiere concomitent

git reset [HEAD] -- <fișier1> <fișier2> ... <fișiern>

Warning

Folosind Google puteți găsi și alte recomandări pentru a soluționa această problemă printre care și folosirea git rm --cached <fisier>. Folosirea cestei comenzi nu este identică cu git-reset deoarece git-reset înlocuiește versiunea fișierului din index cu versiunea aceluiași fișier din ultima comitere (adică cea la care indică HEAD), astfel fișierul va fi prezent în următoarea comitere, dar cu conținutul vechi. Pe când git rm --cached șterge complet fișierul din index astfel fișierul va lipsi complet din următoarea comitere (adică nu va fi inclus în istorie).

Cum să mă debarasez de un fișier?

Eu am avut o astfel de situație când cineva a făcut git add la un fișier inclus în fișierul .gitignotre, eu l-am preluat și vina a fost a mea.