Git
Chapters ▾ 2nd Edition

2.3 Git асослари - Фиксирлашлар тарихини кўриш

Фиксирлашлар тарихини кўриш

Бир қанча фиксирлашларни амалга оширганингиздан сўнг ёки бир қанча фиксирлашлари мавжуд бўлган омборни клонлаштирсангиз эҳтимол сиз ортга бир назар ташлагингиз ва ушбу омбор билан нималар бўлганлигини билгингиз келар. Бу хоҳишни амалга оширишнинг энг оддий ва самарали усули бу git log командасидан фойдаланишдир.

Қуйида келтирилган мисоллар ‘`simplegit’'номли жуда содда лойиҳани ишлатади, уни доим демонстрация қилиш учун ишлатиб келаман. Ушбу лойиҳани олиш учун:

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

ни бажаринг. git log командасини ушбу лойиҳада бажарганингизда натижасида сиз қуйидагиларга ўхшаш маълумотларни олишингиз керак:

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

    changed the version number

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

    removed unnecessary test

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

    first commit

Одатда git log командаси аргументсиз ушбу лойиҳада яратилган фиксирлашларни тескари тартибдаги рўйҳатини намойиш қилади. Яъни энг охирги фиксирлашлар биринчилардан кўринади. Сиз кўрганингиздек ушбу команда ҳар бир фиксирлашларни ўзининг SHA-1 назорат йиғиндиси, муаллифнинг номи ва электрон манзили, яратилиш санаси, шарх билан биргаликда кўрсатади.

`git log`нинг жуда кўп тўпламдаги параметрлари мавжуд бўлиб, уларнинг комбинацияси асосида айнан сиз нима изласангиз уларни топишингиз мумкин. Бу ерда биз сизга кўп ишлатиладиганларини кўрсатамиз.

Кўпроқ фойдали параметрларидан бири бу -p бўлиб, у ҳар бир киритилган фиксирлашларга бириктирилган дельтани (фарқ/diff) кўрсатади. Сиз шунингдек -2 ни охирги 2 тасини чиқариш учун ишлатишингиз мумкин:

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

    changed the 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

    removed 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
\ No newline at end of file

Ушбу параметр ўша – ўша маълумотларни кўрсатади ва қўшимча сифатида ҳар бир фиксирлашдан сўнг бевосита кўрсатиладиган киритилган ўзгаришларни кўрсатади. Бу кодни текшириш ёки ҳамкасбингиз томонидан киритилган қатор фиксирлашлари оқибатида нима бўлганини тез кўриб чиқишда жуда қулайдир. git log командаси билан биргаликда сиз яна йиғиндини ҳисобловчи бир гуруҳ параметрларни ишлатишингиз мумкин. Масалан, агар сиз ҳар бир фиксирлашлар ҳақида қисқача статистик маълумотларни олишни истасангиз --stat параметрини ишлатишингиз мумкин:

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

    changed the 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

    removed 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

    first commit

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

Қайд этиш файлидан кўриниб турганидек, --stat параметри ҳар бир фиксирлашлар остида ўзгартирилган файллар рўйҳатини, сонини шунингдек ушбу файллардаги қўшилган ва олиб ташланган сатрларни ҳам кўрсатаябди. У шунингдек охирида жами маълумотларни ҳам чиқараябди.

Бошқа яна ҳақиқатдан ҳам фойдалироқ бўлган параметр бу --pretty. У қайдларни чиқариш форматини ўзгартиришга имкон беради. Сиз учун тегишли бўлган аввалдан ўрнатилган бир қанча вариантлар мавжуд. oneline параметри ҳар бир фиксирлашларни бир қаторда кўрсатиш учун хизмат қилади ва бу имконият сизга жуда кўп фиксирлашларни кўраётганингизда қўл келади. Бунга қўшимча тарзида short, full ва fuller параметрлари амалда чиқариш форматини ўзгартирмасдан параметрларга мос ҳолда камроқ ёки кўпроқ қисмларни чиқаришга имкон беради:

$ git log --pretty=oneline
ca82a6dff817ec66f44342007202690a93763949 changed the version number
085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 removed unnecessary test
a11bef06a3f659402fe7563abf99ad00de2209e6 first commit

Янада қизиқарли параметр бу format. У сизга қайдларни ўз форматингизда чиқариш учун хизмат қилади. Бу асосан сиз қайдларни автоматик тарзда ажратиб (parsing) ҳисобот тайёрлашни хоҳлаган вақтда фойда беради, чунки аниқ форматни берганлигингиз сабабли Git ни янгиланишида ўзгармаслигига сизни ишончингиз комил бўлади:

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

git log --pretty=format кўп ишлатиладиган параметрлар жадвалда форматнинг кўпроқ фойдали бўлган параметрлар рўйҳати келтирилган.

Table 1. git log --pretty=format кўп ишлатиладиган параметрлар
Параметр Чиқарилувчи маълумот изоҳи

%H

Фиксирлаш хеши

%h

Фиксирлашнинг қисқартирилган хеши

%T

Дарахт хеши

%t

Дарахт қисқартирилган хеши

%P

Аждодлар фиксирлашлари хеши

%p

Аждодлар фиксирлашлари қисқартирилган хеши

%an

Муаллиф номи

%ae

Муаллиф электрон почта қутиси

%ad

Муаллиф санаси (формат --date= параметрига мос келади)

%ar

Муаллиф санаси, нисбатан (мас. "2 ой олдин")

%cn

Фиксирловчи номи

%ce

Фиксирловчи почта қутиси

%cd

Фиксирловчи санаси

%cr

Фиксирловчи санаси, нисбатан

%s

Шарҳлар

Сизни муаллиф ва фиксирловчи орасидаги фарқ қизиқтириши мумкин. Муаллиф бу – бошидан ишни бошлаган одам бўлса, фиксировчи бу – шундан сўнг ишни қабул қилган одам. Шунинг учун агар проектга сиз патч юборсангиз ва яратувчилардан бири ушбу патчни қўлласа иккиларингиз ҳам сиз – муаллиф сифатида, яратучи – фиксирловчи тарзида унутилмайсизлар. Биз ушбу фарқни сал кейинроқ Distributed Git бўлимда кўриб ўтамиз.

oneline ва format параметрлари log командасининг бошқа --graph параметри билан ҳам ишлатилади. Бу параметр тармоқланиш ва бирлашиш тарихини кўрсатувчи ASCII графни қўшади. Шулардан бирини бизнинг Grit лойиҳамиз омбори нусхаси учун кўришимиз мумкин:

$ 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 Added a 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

Биз кейинги бўлимда бирлаштириш ва тармоқлантириш билан ишлашни бошлаганимизда ушбу маълумот янада қизиқарли бўлиб қолади.

Биз git log ни чиқаришдаги форматлашнинг энг содда параметрларини кўрдик, улар бунданда кўпроқ. . git log учун барча параметрлар жадвал log командасининг биз томондан кўриб ўтилган ва бошқа фойдали параметрларини таъсир кўрсатиш изоҳи билан ўзида мужассамлаштирган.

Table 2. git log учун барча параметрлар
Параметр Чиқарилувчи маълумот изоҳи

-p

Ҳар бир фиксирлаш билан киритилган патч (фарқ/diff)ни чиқаради.

--stat

Ҳар бир фиксирлашдаги ўзгартирилган файллар бўйича статистикани намойиш этади.

--shortstat

--stat командасидаги фақат changed/insertions/deletions ларни намойиш этади.

--name-only

Ҳар бир фиксирлашдан кейинги ўзгартирилган файлларни рўйҳатини намойиш этади.

--name-status

қўшишлар/ўзгартиришлар/ўчиришлар каби маълумотлар билан биргаликда файллар рўйҳатини чиқаради.

--abbrev-commit

Назорат йиғиндиси SHA-1 нинг 40 та белгисини ўрнига биринчи бир нечта белгисини чиқаради.

--relative-date

Санани тўлиқ формати ўрнига нисбат форматида чиқаради (масалан, “2 ҳафта олдин”)

--graph

Қайдни чиқариш вақтида у билан ёнма-ён тармоқланиш ва бирлашиш тарихини ASCII графини чиқаради.

--pretty

Фиксирлашларни “алтернатив” форматда чиқаради. Параметрлар oneline, short, full, fuller ва format ларни ўз ичига олади(сиз ўзингизни шахсий форматингизни кўрсатишингиз мумкин).

log командасини маълумотларини чиқаришини чегаралаш

Чиқариш форматининг опцияларидан ташқари git log чегараловчи бир қанча фойдали параметрларга ҳам эга. Яъни ушбу параметрлар фиксирлашларни маълум бир қисмини намойиш этиш учун хизмат қилади. Сиз бундай параметрлардан бирини кўрдингиз у -2 параметри бўлиб, энг охирги иккита фиксирлашни кўриш учун хизмат қилди. Аслида сиз n та фиксирлашларни кўриш учун `-<n>`ни беришингиз мумкин. Амалиётда сизга буни тез-тез қўллашга имкон бўлмаслиги мумкин чунки, одатда Git канал (pipe) орқали барча чиқаришларни саҳифаловчига (pager) жўнатади ва бунинг оқибатида сиз фақат битта саҳифани кўра оласиз.

Чиқаришда вақт бўйича чегараловчи --since ва --until каби параметрлардан фойдаланиш ҳам мумкин. Масалан, навбатдаги команда охирги икки ҳафта ичида бажарилган фиксирлашларни кўрсатади:

$ git log --since=2.weeks

Бундай команда кўп форматлар билан ишлай олади, жумладан сиз аниқ бир вақтни "2008-01-15" ёки нисбат вақтни "2 years 1 day 3 minutes ago" каби кўрсатишингиз ҳам мумкин.

Сиз шунингдек қидириш мезонларини киритиб, фиксирлашлар рўйҳатини саралашингиз мумкин. --author опцияси муаллиф бўйича саралашга хизмат қилади, --grep опцияси ҳабарларни калит сўз бўйича қидиришни таъминлайди. (Билиш жоизки, агар сиз author ва grep опцияларини ҳам кўрсатсангиз у ҳолда биринчи ёки иккинчи мезонга мос келадиган барча фиксирлашлар рўйҳатини кўришингиз мумкин бўлади. Биринчи ва иккинчи мезонга мос келадиган фиксирлашлар рўйҳатини олишни истасангиз --all-match опциясини қўшишингизга тўғри келади.)

Бошқа ёрдами тегиши мумкин бўлган ёрдамчи фильтр бу -S параметри бўлиб, у фақат матнларни олади ва киритилган ўзгаришлар, кодга қўшилган ёки коддан ўчирилган матнларнинг фиксирлашларини намойиш этади. Масалан, агар сиз махсус функцияга мурожаатни кодга қўшилган ёки коддан олиб ташланганини ўзида ташкил этган охирги фиксирлашни кўрмоқчи бўлсангиз сиз қуйидагини чақиришингиз керак:

$ git log -Sfunction_name

Охиргиси ҳақиқатдан ҳам фойдали фильтр-опция у git log учун йўлдир. Каталог номи ёки файл номини кўрсатиб сиз log ни ичидаги фиксирлашлардан кўрсатилган файлларга ўзгаришлар киритганларини ажратиб оласиз. Ушбу опция ҳар доим охирида келтирилади ва бошқа опциялардан йўлни ажратиш мақсадида иккита минус (--) орқали ажратилади.

git log командасида маълумотларни чиқаришни чегаралаш параметрлари жадвалда маълумот учун кўп қўлланиладиган опциялар рўйҳати келтирилган.

Table 3. git log командасида маълумотларни чиқаришни чегаралаш параметрлари
Параметр Изоҳ

-(n)

Охирги n фиксирлашларни кўрсатиш

--since, --after

Кўрсатилган санадан кейин кўрсатилган муаллиф томонидан бажарилган фиксирлашларни олиш.

--until, --before

Кўрсатилган санагача бўлган фиксирлашларни олиш.

--author

Муаллифи кўрсатилган сатрга мос фиксирлашларни олиш.

--committer

Фиксирловчиси кўрсатилган санага мос бўлган фиксирлашларнни олиш.

--grep

Кўрсатилган матнни ўзида мужассамлаштирган фақат фиксирлашларни кўрсатади.

-S

Кўрсатилган сатр кодга қўшилган ёки коддан олиб ташланган фиксирлашларнигина кўрсатади.

Масалан, агар сиз 2008 йил октябрда Junio Hamano томонидан бажарилган ва бирлаштирилмаган синов файлларига киритилган ўзгаришлар фиксирлашларини Git тарихидан кўрмоқчи бўлсангиз сиз қуйидаги каби йўл тутишингиз мумкин:

$ git log --pretty="%h - %s" --author=gitster --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 тарихидаги тахминан 40 000 га яқин фиксирлашлардан команда берилган мезонларга мосининг атиги 6 тасини ажратиб берди.