Git
Chapters ▾ 2nd Edition

2.3 Git’in Əsasları - Commit Tarixçəsinə Baxış

Commit Tarixçəsinə Baxış

Bir neçə əmr yaratdıqdan və ya mövcud bir commit tarixçəsi olan bir deponu klonlaşdırdıqdan sonra, yəqin ki, baş verənləri görmək üçün geri baxmaq istərdiniz. Bunu etmək üçün ən əsas və güclü vasitə git log əmridir.

Bu nümunələrdə simplegit adlı çox sadə bir layihədən istifadə olunur.

Layihəni əldə etmək üçün:

$ git clone https://github.com/schacon/simplegit-progit

Bu layihədə git log əmrini işlətdiyiniz zaman görünən belə bir nəticə əldə etməlisiniz:

$ git log
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Mar 17 21:52:11 2008 -0700

    Change version number

commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Sat Mar 15 16:40:33 2008 -0700

    Remove unnecessary test

commit a11bef06a3f659402fe7563abf99ad00de2209e6
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Sat Mar 15 10:31:28 2008 -0700

    Initial commit

Default olaraq, heç bir arqument olmadan, git log həmin depoda commitlənən əmrləri tərs xronoloji qaydada sadalayır; yəni ən son tapşırıqlar ilk olaraq göstərilir. Gördüyünüz kimi, bu əmr hər bir commiti özünün SHA-1 çeki, müəllifin adı və e-poçtu, yazılmış tarixi və commit mesajı ilə sadalayır.

git log əmrində çox sayda və müxtəlif seçimlər istədiyinizi tam olaraq göstərmək üçün mövcuddur.

Daha faydalı seçimlərdən biri hər əməldə təqdim olunan fərqi (patch çıxışı) göstərən -p və ya --patch-dır. Yalnız son iki giriş göstərmək üçün -2 istifadə kimi göstərilən girişlərinin sayını məhdudlaşdıra bilərsiniz.

$ git log -p -2
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Mar 17 21:52:11 2008 -0700

    Change version number

diff --git a/Rakefile b/Rakefile
index a874b73..8f94139 100644
--- a/Rakefile
+++ b/Rakefile
@@ -5,7 +5,7 @@ require 'rake/gempackagetask'
 spec = Gem::Specification.new do |s|
     s.platform  =   Gem::Platform::RUBY
     s.name      =   "simplegit"
-    s.version   =   "0.1.0"
+    s.version   =   "0.1.1"
     s.author    =   "Scott Chacon"
     s.email     =   "schacon@gee-mail.com"
     s.summary   =   "A simple gem for using Git in Ruby code."

commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Sat Mar 15 16:40:33 2008 -0700

    Remove unnecessary test

diff --git a/lib/simplegit.rb b/lib/simplegit.rb
index a0a60ae..47c6340 100644
--- a/lib/simplegit.rb
+++ b/lib/simplegit.rb
@@ -18,8 +18,3 @@ class SimpleGit
     end

 end
-
-if $0 == __FILE__
-  git = SimpleGit.new
-  puts git.show
-end

Bu seçim hər girişin ardınca bir fərq ilə eyni məlumatı göstərir. Kodun yoxlanılması və ya bir əməkdaşın əlavə etdiyi bir sıra müddətdə baş verənlərə tez baxmaq üçün çox faydalıdır. git log ilə bir sıra ümumiləşdirmə variantlarından da istifadə edə bilərsiniz.

Məsələn, hər bir əməl üçün bəzi qısaldılmış statistikanı görmək istəyirsinizsə, --stat seçimindən istifadə edə bilərsiniz:

$ git log --stat
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Mar 17 21:52:11 2008 -0700

    Change version number

 Rakefile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Sat Mar 15 16:40:33 2008 -0700

    Remove unnecessary test

 lib/simplegit.rb | 5 -----
 1 file changed, 5 deletions(-)

commit a11bef06a3f659402fe7563abf99ad00de2209e6
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Sat Mar 15 10:31:28 2008 -0700

    Initial commit

 README           |  6 ++++++
 Rakefile         | 23 +++++++++++++++++++++++
 lib/simplegit.rb | 25 +++++++++++++++++++++++++
 3 files changed, 54 insertions(+)

--stat seçimi hər bir commit girişində dəyişdirilmiş faylların siyahısını, neçə faylın dəyişdirildiyini və həmin sənədlərdə neçə sətir əlavə olunduğunu və silindiyini görə bilərsiniz. Və bununla yanaşı məlumatın xülasəsini də sonunda qoyur.

Başqa bir həqiqətən faydalı seçim - --pretty-dır. Bu seçim log çıxışını standartdan başqa formatlara dəyişdirir. İstifadəniz üçün bir neçə əvvəlcədən qurulmuş seçim mövcuddur. Onlayn seçim hər bir commiti bir sətirdə yazdırır, bu çox sayda commitə baxdığınızda daha faydalı olacaqdır. Bundan əlavə, qısa, dolğundaha dolğun variantlar çıxarışı təxminən eyni formatda göstərir, lakin müvafiq olaraq daha az və ya daha çox məlumatla:

$ git log --pretty=oneline
ca82a6dff817ec66f44342007202690a93763949 Change version number
085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 Remove unnecessary test
a11bef06a3f659402fe7563abf99ad00de2209e6 Initial commit

Ən maraqlı seçim, öz giriş-çıxış formatını təyin etməyə imkan verən format-dır. Bu, maşın analizi üçün çıxış hazırlayarkən xüsusilə faydalıdır - formatı dəqiq müəyyənləşdirdiyiniz üçün bilirsiniz ki, Git yeniləmələri ilə dəyişmir:

$ git log --pretty=format:"%h - %an, %ar : %s"
ca82a6d - Scott Chacon, 6 years ago : Change version number
085bb3b - Scott Chacon, 6 years ago : Remove unnecessary test
a11bef0 - Scott Chacon, 6 years ago : Initial commit

Git log üçün faydalı seçimlər - Useful specifiers for git log --pretty=format , formatın qəbul etdiyi daha faydalı variantların bəzilərini sadalayır.

Table 1. Useful specifiers for git log --pretty=format
Specifier Description of Output

%H

Commit hash

%h

Abbreviated commit hash

%T

Tree hash

%t

Abbreviated tree hash

%P

Parent hashes

%p

Abbreviated parent hashes

%an

Author name

%ae

Author email

%ad

Author date (format respects the --date=option)

%ar

Author date, relative

%cn

Committer name

%ce

Committer email

%cd

Committer date

%cr

Committer date, relative

%s

Subject

authorcommitter arasındakı fərqin nə olduğunu bilmək istəyirsiniz. Deməli müəllif əsəri əvvəlcə yazan şəxsdir, komissiyaçı isə əsəri son dəfə tətbiq etmiş şəxsdir. Beləliklə, bir layihəyə bir patch göndərsəniz və əsas üzvlərdən biri patch-ı tətbiq edərsə, bu halda ikiniz də kredit alırsınız - müəllif, komitənin üzvü də.

Bu fərqliliyi paylanmış Git-də bir az daha geniş şəkildə əhatə edəcəyik. onelineformat seçimləri --graph adlı başqa bir log seçimi ilə xüsusilə faydalıdır. Bu seçim filialınızı və birləşmə tarixinizi göstərən gözəl bir kiçik ASCII qrafikini əlavə edir:

$ git log --pretty=format:"%h %s" --graph
* 2d3acf9 Ignore errors from SIGCHLD on trap
*  5e3ee11 Merge branch 'master' of git://github.com/dustin/grit
|\
| * 420eac9 Add method for getting the current branch
* | 30e367c Timeout code and tests
* | 5a09431 Add timeout protection to grit
* | e1193f8 Support for heads with slashes in them
|/
* d6016bc Require time for xmlschema
*  11d191e Merge branch 'defunkt' into local

Növbəti fəsildə budaqlamaq və birləşmə yolu ilə olduqda bu cür çıxış daha maraqlı olacaq.

Bunlar günlük çıxarmaq üçün yalnız sadə çıxış formatı git log-dur və orada daha çox şeylər var. Common options to git log bu günə qədər əhatə etdiyimiz seçimlər, həmçinin faydalı ola biləcək bəzi digər ümumi formatlaşdırma seçimlərini və log əmrinin nəticələrini necə dəyişdirdiyini sadalayır.

Table 2. Common options to git log
Option Description

-p

Show the patch introduced with each commit.

--stat

Show statistics for files modified in each commit.

--shortstat

Display only the changed/insertions/deletions line from the --stat command.

--name-only

Show the list of files modified after the commit information.

--name-status

Show the list of files affected with added/modified/deleted information as well.

--abbrev-commit

Show only the first few characters of the SHA-1 checksum instead of all 40.

--relative-date

Display the date in a relative format (for example, “2 weeks ago”) instead of using the full date format.

--graph

Display an ASCII graph of the branch and merge history beside the log output.

--pretty

Show commits in an alternate format. Option values include oneline, short, full, fuller, and format (where you specify your own format).

--oneline

Shorthand for --pretty=oneline --abbrev-commit used together.

Giriş Çıxışın Məhdudlaşdırılması

Çıxış formatlama seçimlərinə əlavə olaraq, git log bir sıra faydalı məhdudlaşdırma seçimlərini də tələb edir; yəni, yalnız alt hissəni göstərməyinizə imkan verən seçimlər. Artıq belə bir seçim görmüsünüz - yalnız son iki nəticəni əks etdirən -2 seçimi. Əslində edə bilərsiniz -<n>`, burada n son commit n işləndiyini göstərmək üçün istənilən tamdır. Əslində, sizin tez-tez istifadə etməyinizin ehtimalı azdır, çünki standart borularla Git bütün pager vasitəsi ilə çıxır, bir anda giriş çıxışının yalnız bir səhifəsini görürsünüz. Bununla birlikdə, --since--until kimi seçimlər çox faydalıdır. Məsələn, bu əmr son iki həftədə edilən əmrlərin siyahısını alır:

$ git log --since=2.weeks

Bu əmr çox sayda formatla işləyir - "2008-01-15" və ya "2 il 1 gün 3 dəqiqə əvvəl" kimi nisbi bir tarix təyin edə bilərsiniz.

Həmçinin bəzi axtarış meyarlarına uyğun gələnləri siyahıya silə bilərsiniz. --author seçimi, müəyyən bir müəllif üzərində filter etməyə imkan verir və --grep seçimi mesaj commitində açar sözlər axtarmağa imkan verir.

Note

--author--grep axtarış meyarlarının birdən çoxunu göstərə bilərsiniz, bu da commitin nəticəsini (çıxarışını) hər hansı bir --author və nümunələrin hər hansı birinə uyğun gəlməsini məhdudlaşdıracaq; Bununla birlikdə, uyğunluq seçimi əlavə, bütün uyğun modellərə uyğun gələnləri --grep məhdudlaşdırır.

Digər həqiqətən faydalı bir filtr, bir simli və yalnız bu sətirdə baş verənlərin sayını dəyişdirən əmrləri göstərən -S seçimidir (ümumiyyətlə Git-in “pickaxe” seçimi adlanır). Məsələn, müəyyən bir funksiyaya istinad əlavə edən və ya çıxarmış son commiti tapmaq istəyirsinizsə, çağıra edə bilərsiniz:

$ git log -S function_name

git log bir filtr kimi keçmək üçün faydalı bir seçim yoludur. Dəqiqləşdirilmiş şəkildə bir qovluq və ya fayl adını göstərsəniz, log çıxarışının commitlənməsi ilə həmin fayllara bir dəyişiklik təqdim etməyi məhdudlaşdıra bilərsiniz. Bu həmişə son seçimdir və ümumiyyətlə yolları seçimlərdən ayırmaq üçün ikiqat tire (--) əvvəl olur. Options to limit the output of git log çıxışını (çıxarışını) məhdudlaşdırmaq üçün Seçimlərdə bu və arayışınız( rəy) üçün bir neçə digər ümumi variantları sadalayacağıq.

Table 3. Options to limit the output of git log
Option Description

-<n>

Show only the last n commits

--since, --after

Limit the commits to those made after the specified date.

--until, --before

Limit the commits to those made before the specified date.

--author

Only show commits in which the author entry matches the specified string.

--committer

Only show commits in which the committer entry matches the specified string.

--grep

Only show commits with a commit message containing the string

-S

Only show commits adding or removing code matching the string

Məsələn, Git mənbə kodu tarixində dəyişən test sənədlərinin Junio Hamano tərəfindən oktyabr 2008-ci ildə commitləndiyini və birləşdirilmədiyini görmək istəyirsinizsə, bu kimi bir şey işlədə bilərsiniz:

$ git log --pretty="%h - %s" --author='Junio C Hamano' --since="2008-10-01" \
   --before="2008-11-01" --no-merges -- t/
5610e3b - Fix testcase failure when extended attributes are in use
acd3b9e - Enhance hold_lock_file_for_{update,append}() API
f563754 - demonstrate breakage of detached checkout with symbolic link HEAD
d1a43f2 - reset --hard/read-tree --reset -u: remove unmerged new paths
51a94af - Fix "checkout --track -b newbranch" on detached HEAD
b0ad11e - pull: allow "git pull origin $something:$current_branch" into an unborn branch

Git mənbə kodu tarixində təxminən 40.000 commitdən bu əmr bu meyarlara uyğun 6-nı göstərir.

Tip
Birləşmə Commit Görüntüsünün Qarşısını Alır

Deponuzda istifadə olunan iş axınından asılı olaraq, giriş tarixinizdəki commitlərin əhəmiyyətli bir faizinin yəni adətən çox məlumat verməyən commitlərin sadəcə birləşməsi mümkündür. Birləşmə ekranının giriş tarixinizi ləkələməsini qarşısını almaq üçün, günlük log seçimini əlavə edin --no-merges.