Git
Chapters ▾ 2nd Edition

2.4 Git’in Əsasları - Ləğv Edilən İşlər (Geri qaytarılan)

Ləğv Edilən İşlər (Geri qaytarılan)

İstənilən mərhələdə hansısa əməliyyatı və yaxud bir şeyi geri qaytarmaq istəyə bilərsiniz. Burada etdiyiniz dəyişiklikləri geri qaytarmaq üçün bir neçə əsas vasitəni nəzərdən keçirəcəyik. Diqqətli olun, çünki bu boşluqların bəzisini geri qaytara bilməzsiniz.Git’də səhv etdiyiniz zaman hər hansısa işinizi itirə biləcəyiniz sahələrdən biridir.

Ümumi geri qaytarılmaların biri çoxu erkən commit etdiyinizdə və bəlkə də bəzi faylları əlavə etməyi unutduğunuzda və ya commit mesajınızı qarışdırdığınız zaman baş verir. Bu commiti yenidən yerinə yetirmək istəyirsinizsə, unutduğunuz əlavə dəyişiklikləri düzəldin, onları mərhələlərə ayırın və yenidən --amend seçimini istifadə edərək commitləyin:

$ git commit --amend

Bu əmr mərhələli sahənizi alır və commit üçün istifadə edir. Sonuncu commitinizdən bəri heç bir dəyişiklik etməmisiniz (məsələn, əvvəlki commitinizdən dərhal sonra bu əmri işə salırsınız), sonra sizin snapshotunuz tam olaraq eyni görünəcəkdir və bütün dəyişikliklər sizin commit mesajınızdır.

Eyni commit mesajı redaktoru işə düşür, lakin artıq əvvəlki commitlərinizin mesajı var. Mesajı həmişəki kimi eyni şəkildə düzəldə bilərsiniz, ancaq o əvvəlki commitlərinizin üstünə yazlacaqdır.

Məsələn, commitləsəniz və commitə əlavə etmək istədiyiniz bir fayla dəyişiklik etməyi unutduğunuzu başa düşsəniz, belə bir şey edə bilərsiniz:

$ git commit -m 'Initial commit'
$ git add forgotten_file
$ git commit --amend

Bir tək commitlə başa vurursunuz - ikinci commit birincinin nəticələrini əvəz edir.

Note

Sonuncu commitinizi dəyişdirərək, onu köhnə commiti itələyən və yerinə yeni təkmilləşdirilmiş commitlə əvəz etməyi başa düşmək vacibdir. Effektiv olaraq, əvvəlki əməl heç vaxt olmayıb və depozit tarixinizdə görünməyəcək.

Dəyişdirmə əmsalının açıq dəyəri, "Faylı əlavə etməyi unutmusunuz" və ya "Darn, sonuncu commitə yazmağı düzəlt" şəklindəki commit mesajları ilə depozit tarixçənizi ləkələmədən, son commitinizə kiçik düzəlişlər etməkdir.

Mərhələli Bir Faylın Mərhələlərə Ayrılmaması

Növbəti iki bölmə sizə mərhələlərə ayrılmış sahənizi və iş qovluq dəyişikliklərinizlə necə işlədiyinizi nümayiş etdirir. Gözəl tərəfi odur ki, həmin iki sahənin vəziyyətini müəyyənləşdirmək üçün istifadə etdiyiniz əmr onlara dəyişiklikləri necə geri qaytarmağınızı da xatırladır. Məsələn, deyək ki, iki fayl dəyişdirmisiniz və bunları iki ayrı dəyişiklik kimi commit etmək istəyirsiniz, amma təsadüfən git add * yazın və ikisini də düzəldin. İkisindən birini necə bağlamaq olar?

git status əmri sizə xatırladır:

$ git add *
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    renamed:    README.md -> README
    modified:   CONTRIBUTING.md

"Dəyişikliklər commitlənir" mətninin altından, və mərhələlərə ayrılmadığı üçün git reset HEAD <file>...-dan istifadə edildiyi deyilir. Beləliklə, CONTRIBUTING.md faylını açmaq üçün bu tövsiyədən istifadə edək:

$ git reset HEAD CONTRIBUTING.md
Unstaged changes after reset:
M	CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    renamed:    README.md -> README

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   CONTRIBUTING.md

Komanda bir az qəribədir, amma işləyir. CONTRIBUTING.md faylı dəyişdirilir, lakin bir daha dayanmır.

Note

Doğrudur, git reset təhlükəli bir əmr ola bilər, xüsusilə də --hard flag-ı təmin edirsinizsə. Bununla birlikdə, yuxarıda təsvir olunan ssenaridə, işçi qovluqdakı fayla toxunulmur, buna görə nisbətən təhlükəsizdir.

İndi bu sehrli çağırış, git reset əmri haqqında bilməyimiz üçün lazım olan bütün şeylərdir. Yenidən qurmağıç reset-i necə edəcəyimizi və digər maraqlı məlumatları Reset Demystified'də necə düzəltməli olduğumuz haqqında daha çox məlumat verəcəyik.

Dəyişdirilmiş Faylın Dəyişdirilməməsi

CONTRIBUTING.md faylındakı dəyişiklikləri saxlamaq istəmədiyinizi başa düşdüyünüz zaman nə olacaq? Onu necə asanlıqla düzəliş edə bilərsiniz - sonuncu dəfə commit etdikdə (və ya əvvəlcə klonlaşdırıldığınızda və ya iş dəftərinizə daxil olduqda) göründüyü vəziyyətə qaytara bilərsiniz? Xoşbəxtlikdən, git status-u da bunu necə edəcəyinizi söyləyir. Son nümunə çıxışında, tənzimlənməmiş sahə belə görünür:

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   CONTRIBUTING.md

Etdiyiniz dəyişiklikləri necə ləğv edəcəyinizi açıq şəkildə izah edir. Gəlin deyilənləri edək:

$ git checkout -- CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    renamed:    README.md -> README

Dəyişikliklərin geri qaytarıldığını görə bilərsiniz.

Important

Başa düşmək üçün vacibdir ki, git checkout -- <file> təhlükəli bir əmrdir. Bu zaman fayla etdiyiniz hər hansı bir yerli dəyişiklik yox ola bilər. Git sadəcə bu faylı ən son commitlənmiş versiya ilə əvəz edir. Bu saxlanmamış yerli dəyişiklikləri tamamilə bilməyincəyə qədər bu əmrdən heç vaxt istifadə etməyin.

Həmin fayla etdiyiniz dəyişiklikləri saxlamaq istəyirsinizsə, lakin hələ də onu aradan qaldırmaq lazımdırsa, GGit’də Branch etməyə davam edəcəyik; ümumiyyətlə isə bunlar daha yaxşı yoldur.

Unutmayın, Git-də commitlənən hər şey demək olar ki, həmişə bərpa edilə bilər. Hətta silinmiş branch-da olan və ya --amend commitlə yazılmış commitlər bərpa edilə bilər (Data Recovery məlumatların bərpası üçün məlumatların bərpasına baxın).