Git
Chapters ▾ 2nd Edition

2.2 Git’in Əsasları - Depoda Dəyişikliklərin Qeyd Edilməsi

Depoda Dəyişikliklərin Qeyd Edilməsi

Bu nöqtədə, artıq lokal maşınızda düzgün şəkildə işləyən Git deposu olmalıdır hansı ki qarşınızdakı bütün sənədlərin yoxlanılmasıkopyalanması ona daxildir. Tipik olaraq, layihə yazmaq istədiyiniz vəziyyətə çatdığı zaman dəyişiklik etməyi və həmçinin həmin dəyişikliklərin görüntülərini yerləşdirə bilmək imkanına malik olacaqsınız.

Unutmayın ki, işlək qovluqdakı hər bir fayl iki haldan birində ola bilər: izlənilmiş və ya izlənilməmiş. İzlənmiş fayllar son görüntülərdə olan fayllardır; və həmin bu fayllar dəyişdirilə, dəyişdirilməyə və ya səhnələşdirilə bilər. Bir sözlə, izlənən fayllar Git’in tanıdığı fayllardır.

Bəs işlənməmiş və ya yüklənməmiş fayllar nədir?- Bu fayllar işçi qovluğunuzdakı son görüntüdə və quruluş sahənizdə olmayan hər hansısa bir fayllardır. İlk depo klonlaşdırıldığı zaman, bütün sənədləriniz izlənəcək və düzəldilməyəcək, çünki Git onları artıq yoxlayıb və siz heç bir şey düzəltməmisiniz.

Faylları redaktə edərkən Git onları dəyişdirilmiş kimi görür, bunun səbəbi sonuncu əmrinizi icra etdikdən bəri onları dəyişmisiniz. Siz iş gördüyünüz zaman dəyişdirilmiş fayllar seçilərək mərhələlənir və daha sonra mərhələlənmiş dəyişikliklər commit olunur və bu proses dövr şəkildə təkrar olunur.

Fayllarınızın  Statusunun Vaxtı
Figure 8. Fayllarınızın Statusunun Vaxtı

Fayllarınızın Vəziyyətinin Yoxlanılması

Faylların hansı vəziyyətdə və harda olduğunu müəyyənləşdirmək üçün istifadə olunan əsas alət git status əmridir. Bu əmri birbaşa klondan sonra işləsəniz, bunun kimi bir şey görməlisiniz:

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean

Bu isə təmiz bir iş qovluğunun olması deməkdir; başqa sözlə izlənilən faylların heç biri dəyişdirilmir. Git həmçinin əlavə edilməmiş faylları görmür və həmin fayllar burada siyahıya alınacaqdır. Sonda əmr sizə hansı branch’da olduğunuzu söyləyir və serverdəki eyni branch’dan ayrılmadığınızı bildirir. Hazırda da bu branch həmişə master funksiyasındadır. Git’də Branch branch’lar və arayışları ətraflı şəkildə araşdıracaq. İş funksiyası bundan ibarətdir.

Gəlin, layihənizə yeni bir fayl, sadə README faylı əlavə edək. Bu zaman əgər fayl əvvəllər yox idisə və git status-unu işlədirsinizsə, yüklənməmiş faylınızı belə görəcəksiniz:

$ echo 'My Project' > README
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Untracked files:
  (use "git add <file>..." to include in what will be committed)

    README

nothing added to commit but untracked files present (use "git add" to track)

Sizin hazırki vəziyyətinizdə “İzlənilməyən fayllar” başlığının altında yeni README faylınızın izlənilmədiyini görə bilərsiniz. İzlənilməmiş fayllar dedikdə əsasən Git’in əvvəlki snapshot`da (commit) olmayan fayllar nəzərdə tutulur. Sən onu açıq şəkildə bildirməyənədək Git onu sənin commit snapshotuna daxil etməyə başlamayacaq.Təsadüfən yaradılan ikili faylları və başqa faylları hansı ki heç onları daxil etməyi düşünmürsünüz və beləliklə də daxil etməyə başlamırsınız. README daxil olmaqla başlamaq istəsəniz,bu zaman faylı izləməyə başlayırsınız.

Yeni Faylların Izlənməsi

Yeni bir faylı izləməyə başlamaq üçün git add əmrindən istifadə edirsiniz. README faylını izləməyə başlamaq üçün bunu işlədə bilərsiniz:

$ git add README

Status əmrinizi yenidən işləsəniz, README faylınızın izlənildiyini və mərtəbəli olaraq commit`ləndiyini görə bilərsiniz:

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)

    new file:   README

Bunu da qeyd edə bilərsiniz ki,o mərtəbəlidir çünki Dəyişikliklər commit olunub başlığı altında verilir. Bu anda commit etsəniz git add əmrini işlətdiyiniz anda faylın versiyası növbəti tarixi snapshotda olacaq. Xatırlaya bilərsiniz ki, əvvəllər git init işlətməyə başladığınız zaman git add <files> əmrindəki faylları yəni qovluğunuzdakı faylları izləməyə başladınız. git add əmri ya bir fayl ya da bir qovluğu adlandırır; əgər bu bir qovluqdursa, əmr həmin qovluqdakı bütün faylları rekursiv şəkildə əlavə edir.

Dəyişdirilmiş Faylların Quruluşu

Gəlin izlənilən bir faylı dəyişdirək. Əvvəllər izlənilən CONTRIBUTING.md adlı bir faylı dəyişdirsəniz və yenidən git status əmrinizi işə salsanız, bu kimi bir şey əldə edirsiniz:

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   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

CONTRIBUTING.md faylı “Dəyişikliklər commit üçün mərhələnməyib” adlı bir bölmə altında görünür – bu isə izlənilən bir faylın iş qovluğunda dəyişdirildiyini, lakin hələ də mərhələləndirilməməsi deməkdir. Onu mərhələli etmək üçün çox funksiyalı əmr olan git add əmrindən istifadə olunur və bu əmrdən - yeni sənədləri izləməyə, faylları mərhələləndirməyə və həll edildiyi kimi birləşmə ziddiyyətli faylları qeyd etmək kimi digər işləri istifadə etmək üçün də istifadə edirsiniz. “Bu faylı layihəyə əlavə et” əvəzinə “bu məzmunu növbəti comittə əlavə et” kimi düşünmək daha faydalı ola bilər. Gəlin indi CONTRIBUTING.md faylını mərhələndirmək üçün git add əmrini və daha sonra git status-unu yenidən işə salaq:

$ git add CONTRIBUTING.md
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   README
    modified:   CONTRIBUTING.md

Hər iki fayl mərhələləşdirilib və növbəti commit`inizə daxil olacaq. Bu anda bunu etməmişdən əvvəl CONTRIBUTING.md-də etmək istədiyiniz bir kiçik dəyişikliyi xatırlayırsınız. Onu yenidən açırsınız və bu dəyişikliyi edirsiniz və commit üçün hazırsınız. Bununla belə, gəlin git status-unu bir daha işə salaq:

$ vim CONTRIBUTING.md
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   README
    modified:   CONTRIBUTING.md

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

Bu necə olur? İndi CONTRIBUTING.md həm mərhələli, həm də mərhələsiz olaraq siyahıya alınmışdır.Bəs bu necə mümkündür? Məlum olur ki, git add əmrini əlavə edərkən faylı mərhələlərə ayırır.İndi commit etsəniz, görərsiniz ki, CONTRIBUTING.md versiyası, git add əmrini son dəfə işlətdiyiniz kimidir, git commit işlətdiyiniz zaman işlək qovluqda göründüyüz faylın versiyası deyil. git add işlədikdən sonra bir fayl dəyişdirirsinizsə, faylın son versiyasını mərhələlərə ayırmaq üçün git add-ı yenidən işə salmalısınız:

$ git add CONTRIBUTING.md
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   README
    modified:   CONTRIBUTING.md

Qısa Status

Gitin nəticə çıxarışı çox ətraflı həm də çox uzundur. Etdiyiniz dəyişikləri daha yığcam şəkildə görə bilməyiniz üçün gitin qısa işarəsi də mövcuddur. git status -s və ya git status --short əmrlərini işlətsəniz əmrdən daha sadə çıxarış əldə edəcəksiniz:

$ git status -s
 M README
MM Rakefile
A  lib/git.rb
M  lib/simplegit.rb
?? LICENSE.txt

İzlənməyən yeni sənədlər var ?? əlavə edilmiş yeni fayllarda A, dəyişdirilmiş fayllarda isə M və s var. Çıxışda iki sütun var ki bunlardan - sol tərəfdə olan sütun quruluş sahəsinin vəziyyətini, sağ tərəfdə olan isə sütun işçi ağacının vəziyyətini göstərir. Məsələn, bu çıxışda, README faylı işçi qovluğunda dəyişdirilir, lakin hələ mərhələli deyil, lib/simplegit.rb faylı isə dəyişdirilir və mərhələlərə ayrılır. Rakefile dəyişdirildi, mərhələlərə ayrıldı və sonra yenidən dəyişdirildi, buna görə həm mərhələli, həm də sabit olmayan dəyişikliklər vardır.

Nəzərə Alınmayan Fayllar

Siz tez-tez Git’in avtomatik olaraq əlavə etməsini və izlənilməyənləri göstərməyə çalışan bir faylın olacağını görəcəksiniz. Ümumilikdə, avtomatik olaraq sistem tərəfindən yaradılan fayllar vardır ki, bunlara giriş faylları aid edilir. Belə hallarda, .gitignore kimi adlandırılan bir fayl siyahısı nümunələri yarada bilərsiniz. Budur .gitignore faylına bir nümunə:

$ cat .gitignore
*.[oa]
*~

İlk sətir, Git`ə sonluğu .o və yaxud .a ilə bitən istənilən sənədləri yəni kodunuzu düzəltməyin məhsulu ola biləcək obyekt və arxiv faylları nəzərə almamasını bildirir.İkinci sətir, Git`in müvəqqəti faylları qeyd etmək üçün Emacs kimi bir çox mətn redaktoru tərəfindən istifadə olunan bir tilde(~) ilə bitən bütün faylları nəzərə almadığını bildirir. Siz həmçinin log,tmp və ya pid qovluğunu; avtomatik olaraq yaradılan sənədləri və başqalarını da daxil edə bilərsiniz.Yeni depo üçün .gitignore faylını qurmaq ümumilikdə yaxşı fikirdir, buna görə də siz git deponuzdakı faylların birdən commit olunmasını istəmirsiniz.

.gitignore faylında nümunələr üçün qoya biləcəyiniz qaydalar bundan ibarətdir:

  • Boş xəttlər və ya # başlayan sətirlər nəzərə alınmır.

  • Standart qlob naxışları və bütün bunlar işçi ağacında tətbiq olunacaq.

  • Rekursivliyə yol verməmək üçün naxışları irəli zolaqla (/) başlaya bilərsiniz.

  • Bir qovluğu təyin etmək üçün nümunələri irəli bir xəttlə (/) bitirə bilərsiniz. *Nida (!) ilə başlayaraq bir nümunəni rədd edə bilərsiniz.

Qlob naxışlar gündəlik olaraq sadələşdirilən ifadələr kimidir. Bir ulduz (*) sıfır və ya daha çox simvola uyğun gəlir; [abc] mörtərizədəki istənilən simvola uyğundur (bu vəziyyətdə a,b və ya c); bir sual işarəsi (?) bir simvola uyğun gəlir; defislə ayrılmış simvolları əhatə edən mörtərizələr ([0-9]) aralarında olan hər hansı bir simvola uyğundur ( bu vəziyyətdə 0 ilə 9 arasında) iç-içə qovluqları uyğunlaşdırmaq üçün 2 ** ulduzdan da istifadə edə bilərsiniz; a/**/z a/z, a/b/z, a/b/c/z və s.

Budur başqa bir nümunə ``.gitignore` qovluğu:

# ignore all .a files
*.a

# but do track lib.a, even though you're ignoring .a files above
!lib.a

# only ignore the TODO file in the current directory, not subdir/TODO
/TODO

# ignore all files in any directory named build
build/

# ignore doc/notes.txt, but not doc/server/arch.txt
doc/*.txt

# ignore all .pdf files in the doc/ directory and any of its subdirectories
doc/**/*.pdf
Tip

GitHub, layihəniz üçün bir başlanğıc nöqtəsi istəyirsinizsə https://github.com/github/gitignore-da sizin üçün onlarla layihə və dildə ``.gitignore` fayl nümunələrinin kifayət qədər əhatəli siyahısının saxlanıldığını görəcəksiniz..

Note

Ən sadə halda yəni normal olaraq bütün depolarda olan .gitignore faylı deponuzun əsas hissəsində vardır. Bununla birlikdə alt qovluqlarda əlavə .gitignore sənədlərinin olması da mümkündür.Bu iç-içə .gitignore sənədlərindəki sənədlər yalnız yerləşdikləri qovluğun altındakı sənədlərə aiddir. Fayllar özünün aid olduğu qovluğun altında yerləşir. Linux deposunda 206 .gitignore faylı var.

Detallara baxmaq üçün .gitignore baxa bilərsiniz.

Mərhələli və Mərhələsiz Dəyişikliklərə Baxış

git status əmri sizin üçün çox qeyri-müəyyəndirsə - yalnız hansı sənədlərin dəyişdirildiyini deyil, nəyi dəyişdirdiyinizi bilmək istəyirsiniz - git diff əmrini istifadə edə bilərsiniz. Daha sonra git diff-u daha ətraflı açacağıq, ancaq bu iki suala cavab vermək üçün çox güman ki, istifadə edəcəksiniz: Nəsə dəyişmisiniz, amma hələ mərhələlərə ayrılmayıb? Və nə mərhələlərə ayrılmışdır ki,siz onları commit edəcəksiniz? git status bu suallara ümumiyyətlə fayl adlarını sadalayaraq cavab versə də, git diff sizə əlavə edilmiş və çıxarılan sətirləri göstərir - patch kimi.

Deyək ki, yenidən README faylını redaktə etdiniz və mərhələlərə ayırdınız və sonra CONTRIBUTING.md faylını mərhələlərə ayırmadan redaktə edin. git status əmrinizi işlədirsinizsə, yenidən belə bir şey görürsünüz:

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   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

Dəyişdirdiyiniz, lakin hələ mərhələlərə ayrılmamış olduğunu görmək üçün sadəcə git diff yazın, başqa heç bir arqument ehtiyac yoxdur:

$ git diff
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 8ebb991..643e24f 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -65,7 +65,8 @@ branch directly, things can get messy.
 Please include a nice description of your changes when you submit your PR;
 if we have to read the whole diff to figure out why you're contributing
 in the first place, you're less likely to get feedback and have your change
-merged in.
+merged in. Also, split your changes into comprehensive chunks if your patch is
+longer than a dozen lines.

 If you are starting to work on a particular area, feel free to submit a PR
 that highlights your work in progress (and note in the PR title that it's

Bu əmr işçi qovluğunuzdakılar ilə quruluş sahənizdəkiləri müqayisə edir. Nəticə hələ də mərhələlərə ayrılmamış dəyişiklikləri sizə bildirir.

Nəyi mərhələlərə ayırdığınızı görmək üçün git diff --staged əmrindən istifadə edə biləcəksiniz. Bu əmr mərhələli dəyişikliklərinizi son əmrinizlə müqayisə edir:

$ git diff --staged
diff --git a/README b/README
new file mode 100644
index 0000000..03902a1
--- /dev/null
+++ b/README
@@ -0,0 +1 @@
+My Project

Qeyd etmək vacibdir ki, git diff özündə son commitdən bəri baş vermiş dəyişiklikləri göstərmir – yalnız hələ də mərhələlərə ayrılmayan dəyişikliklərdən başqa. Bütün dəyişikliklərinizi mərhələlərə ayırmısınızsa, git diff heç bir nəticə verməyəcək.

Başqa bir misal üçün, CONTRIBUTING.md faylını mərhələlərə ayırıb və sonra onu redaktə etsəniz,mərhələli fayldakı dəyişiklikləri və sabit olmayan dəyişiklikləri görmək üçün git diff istifadə edə bilərsiniz. Əgər bunu görürsünüzsə:

$ git add CONTRIBUTING.md
$ echo '# test line' >> CONTRIBUTING.md
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   CONTRIBUTING.md

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

İndi nəyin hələ də mərhələlərə ayrılmadığını görə bilmək üçün git diff-dən istifadə edə bilərsiniz:

$ git diff
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 643e24f..87f08c8 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -119,3 +119,4 @@ at the
 ## Starter Projects

 See our [projects list](https://github.com/libgit2/libgit2/blob/development/PROJECTS.md).
+# test line

git diff --cached indiyənə qədər mərhələlərə ayırdıqlarınızı görə bilmək üçündür. (--staged--cached sinonimdir.):

$ git diff --cached
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 8ebb991..643e24f 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -65,7 +65,8 @@ branch directly, things can get messy.
 Please include a nice description of your changes when you submit your PR;
 if we have to read the whole diff to figure out why you're contributing
 in the first place, you're less likely to get feedback and have your change
-merged in.
+merged in. Also, split your changes into comprehensive chunks if your patch is
+longer than a dozen lines.

 If you are starting to work on a particular area, feel free to submit a PR
 that highlights your work in progress (and note in the PR title that it's
Note
Git Diff Xarici Alətdə

Kitabın qalan hissəsi ərzində git diff əmrini müxtəlif yollarla istifadə etməyə davam edəcəyik. Bu diff`lərə baxmağın başqa yollarıda vardır ki, əgər siz görüntü proqramı əvəzinə qrafik və ya xarici görüntülü proqrama üstünlük verəsəniz. git diff əvəzinə git difftool işlədirsinizsə, ortaya çıxan vimdiff və daha çox (kommersiya məhsulları daxil olmaqla) kimi proqramlarda bu diff`lərdən birini görə bilərsiniz. Sisteminizdə nə olduğunu görmək üçün git difftool --tool-help işlədin.

Dəyişikliklərinizin Commit’lənməsi

Artıq mərhələlərə ayrılmış sahəniz istədiyiniz şəkildə qurulduğundan dəyişikliklərinizi edə bilərsiniz. Unutmayın ki, hələ də mərhələlərə ayılmamış bir şey –yəni yaratdığınız və dəyişdirdiyiniz hər hansı bir fayl onları redaktə etdiyinizdən bəri işləməmişdir - buna görə də bu commit`ə daxil olmayacaq. Diskinizdə dəyişdirilmiş fayllar kimi qalacaqlar. Bu vəziyyətdə, bildirək ki, git status-u son dəfə işlətdikdə hər şeyin səhnəyə mərhələlərə ayrıldığını gördünüz, buna görə dəyişikliklərinizi commitləməyə hazırsınız. Commit etməyin ən sadə yolu git commit yazmaqdır:

$ git commit

Doing so launches your editor of choice.

Note

Bu, shell`nizin EDITOR mühitinin dəyişkənliyi ilə təyin olunur - adətən vim və ya emacs, buna baxmayaraq git config --global core.editor əmrindən istifadə edərək istədiyiniz ilə konfiqurasiya edə bilərsiniz.Başlanğıc.

Redaktor aşağıdakı mətni göstərir (bu nümunə Vim ekranıdır):

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# Your branch is up-to-date with 'origin/master'.
#
# Changes to be committed:
#	new file:   README
#	modified:   CONTRIBUTING.md
#
~
~
~
".git/COMMIT_EDITMSG" 9L, 283C

Default commit mesajında şərh edilmiş git status əmrinin son çıxarışını və üstündə bir boş sətir olduğunu görürsünüz. Bu şərhləri silə və commit olunmuş mesajınızı yaza bilərsiniz və ya nə commit’lədiyinizi yadda saxlamağınız üçün onları tərk edə bilərsiniz.

Note

Dəyişdirdiyiniz şeyi daha aydın xatırlatmaq üçün,git commit-v seçimini verə bilərsiniz. Redaktorunuzdakı nə dəyişiklikləri commit’lədiyinizi dəqiqliyi ilə görə bilərsiniz.

Redaktordan çıxdıqda, Git commit mesajlı commit’inizi yaradır (şərhlərlə və fərq ləğv olunur).

Alternativ olaraq, commit mesajınızı commit əmrinə uyğun olaraq bir -m flag’dan sonra göstərərək yaza bilərsiniz:

$ git commit -m "Story 182: fix benchmarks for speed"
[master 463dc4f] Story 182: fix benchmarks for speed
 2 files changed, 2 insertions(+)
 create mode 100644 README

Indi ilk commitinizi yaratdınız! Gördüyünüz kimi commit özü haqqında sizə çıxarışlar vermişdir;hansı branch’la siz commit etdiniz (master),nə qədər fayl dəyişdirilldiyini statiskalar commitdəki əlavə edilmiş və silinmiş xəttlər haqqındadır.

Siz hələ mərhələlərə ayrılmamış nə isə orada dəyişdirilmişdir; tarixinizə əlavə etmək üçün başqa bir commit edə bilərsiniz. Hər dəfə bir commit yerinə yetirdiyiniz zaman, geri qaytara biləcəyiniz və ya sonrakı ilə müqayisə edə biləcəyiniz layihənizin snapshotunuzu qeyd edirsiniz..

Mərhələləri Ayrılmış Sahəni Atlamaq

Sənətkarlıq commitləri istədiklərinizi dəqiq yerinə yetirmək üçün inanılmaz dərəcədə faydalı ola bilsə də, mərhələlərə ayırmaq sahəsi bəzən iş prosesinizdə lazım olduğundan biraz daha mürəkkəbdir. Mərhələlərə ayırma sahəsini atlamaq istəyirsinizsə, Git sadə bir qısa yol təqdim edir. git command əmrinə -a variantını əlavə edərək, commit etmədən əvvəl izlənilən hər bir faylı avtomatik olaraq mərhələ halına gətirir, git add hissəsini atlamağa imkan verir:

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
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

no changes added to commit (use "git add" and/or "git commit -a")
$ git commit -a -m 'Add new benchmarks'
[master 83e38c7] Add new benchmarks
 1 file changed, 5 insertions(+), 0 deletions(-)

Commit etməyinizdən əvvəl bu vəziyyətdə CONTRIBUTING.md faylına necə əlavə etməyiniz lazım olduğuna diqqət yetirin. Ona görə ki, -a flag’ı bütün dəyişdirilmiş faylları daxil edir. Bu əlverişlidir, amma diqqətli olun; bəzən bu flag istənməyən dəyişiklikləri daxil etməyinizə səbəb olacaqdır.

Faylların Silinməsi

Git’dən bir fayl çıxarmaq üçün onu izlənilmiş fayllarınızdan çıxartmalısınız (daha doğrusu, mərhələləyə ayrılmış sahənizdən çıxarın) və sonra commit etməlisiniz. git rm əmri bunu edir və həmçinin növbəti dəfə ətrafınıza izlənməmiş fayl kimi görmədiyiniz üçün faylı iş qovluğunuzdan çıxarır.

Faylı sadəcə işçi qovluqdan çıxarırsınız, bu, çıxma git status çıxışınızdakı “Commit üçün mərhələlərə ayrılmamış dəyişikliklər” (yəni mərhələlərə ayrılmamış) altında göstərilir:

$ rm PROJECTS.md
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        deleted:    PROJECTS.md

no changes added to commit (use "git add" and/or "git commit -a")

Sonra git rm ilə işləsəniz, bu, faylın silinməsini mərhələləndirir:

$ git rm PROJECTS.md
rm 'PROJECTS.md'
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    deleted:    PROJECTS.md

Növbəti dəfə commit etdiyiniz zaman, fayl yox olacaq və artıq izlənilməyəcək. Fayl dəyişdirmisinizsə və ya əvvəlcədən mərhələlərə ayrılmış sahəyə əlavə etmisinizsə, -f seçimi ilə çıxarılmanı məcbur etməlisiniz. Bu, əvvəlcədən görünməmiş və Git’dən bərpa olunmayan məlumatların təsadüfən çıxarılmasının qarşısını almaq üçün təhlükəsizlik xüsusiyyətidir.

Edə biləcəyiniz başqa faydalı bir şey, faylı iş ağacınızda saxlamaq, ancaq hazırlama sahənizdən çıxarmaqdır. Başqa sözlə, faylı sabit diskdə saxlamaq istəyə bilər, lakin artıq Git izləməməlidir. .gitignore faylınıza bir şey əlavə etməyi unutmusunuzsa və təsadüfən böyük bir giriş faylı və ya bir dəstə .a tərtib edilmiş fayllar kimi mərhələlərə ayırsanız bu xüsusilə faydalıdır. Bunu etmək üçün --cached seçimdən istifadə edin:

$ git rm --cached README

git rm əmrinə faylları, qovluqları və fayl-glob naxışlarını ötürə bilərsiniz. Bu kimi şeylər edə biləcəyinizi nəzərdə tutur:

$ git rm log/\*.log

* önündəki (\) qeyd edin. Bu, Git’in qabığındakı (shell) fayl adının genişlənməsinə əlavə olaraq, öz ad genişləndirməsini həyata keçirdiyinə görə lazımdır. Bu əmr log/ qovluğunda .log genişlənməsinə sahib olan bütün faylları silir. Və ya bu kimi bir şey edə bilərsiniz:

$ git rm \*~

Bu əmr adları ~ ilə bitən bütün faylları silir.

Daşınan Fayllar

Bir çox digər VNS sistemlərindən fərqli olaraq, Git fayl hərəkətini dəqiq izləmir. Git-də bir faylın adını dəyişsəniz, Git’də faylın adını dəyişdiyinizi bildirən heç bir metadata qeyd olunmur. Bununla belə Git, faktdan sonra bunu bilmək üçün olduqca ağıllıdır - bir az sonra isə fayl hərəkətini aşkarlamaqla məşğul olacağıq. Beləliklə, Git’in mv komandası olması bir az çaşdırıcıdır. Git’də bir faylın adını dəyişdirmək istəyirsinizsə, belə bir şey işlədə bilərsiniz:

$ git mv file_from file_to

və yaxşı işləyir. Əslində, bu kimi bir şey işlədib statusa baxsan, Git’in adını dəyişmiş bir fayl hesab etdiyini görərsiniz:

$ git mv README.md README
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    renamed:    README.md -> README

Lakin, bu kimi bir şey işlətməyə bərabərdir:

$ mv README.md README
$ git rm README.md
$ git add README

Git bunun tamamilə adının dəyişdirildiyini göstərir, buna görə bir faylın bu şəkildə və ya mv əmri ilə dəyişdirilməsinin əhəmiyyəti yoxdur. Yeganə real fərq, git mv-nin üç əmrin əvəzinə bir əmrin olması - rahatlıq funksiyasıdır. Daha əhəmiyyətlisi, bir faylın adını dəyişmək üçün istədiyiniz hər hansı bir vasitədən istifadə edə bilərsiniz və commit etməməzdən əvvəl add/rm ünvanına müraciət edə bilərsiniz.