Git
Chapters ▾ 2nd Edition

2.3 Mga Pangunahing Kaalaman sa Git - Pagtitingin sa Kasaysayan ng Commit

Pagtitingin sa Kasaysayan ng Commit

Pagkatapos mong gumawa ng iilang mga commit, o kung na-clone mo ang isang repositoryo na may umiiral na kasaysayan ng commit, malamang na gusto mong tumingin pabalik kung ano ang nangyari. Ang pinaka pangunahin at malakas na kagamitan upang gawin ito ay ang git log na utos.

Ang mga halimbawang ito ay gumagamit ng pinaka simpleng proyekto na tinatawag na “simplegit”. Upang makuha ang proyekto, patakbuhin ang

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

Kapag ikaw ay nagpatakbo ng git log sa proyektong ito, dapat kang makakuha ng output na parang kagaya nito:

$ 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

Bilang default, na may walang mga argumento,ang git log ay naglilista ng mga commit na ginawa sa repositoryo na iyon sa baliktad na pagkasunod-sunod — yan ay, ang pinaka-kamakailang mga commit lang ipinapakita muna. Tulad ng iyong nakikita, ang utos na ito ay naglilista sa bawat commit na kasama ang SHA-1 checksum nito, ang pangalan ng may-akda at email, ang petsa ng pagkasulat, at ang mensahe ng commit.

Isang malaking bilang at iba’t ibang mga opsyon sa git log na utos ay magagamit para ipakita sayo ang eksakto na kung ano ang iyong hinahanap. Dito, ipapakita namin sa iyo ang ilang mga pinaka sikat.

Isa sa maraming nakakatulong na mga opsyon ay ang -p o --patch, na nagpapakita ng pagkakaiba (ang tapal na output) ay ipinakilala sa bawat commit. Maaari mo ring limitahan ang bilang ng iyong ng mga log entry na ipinapakita, tulad ng paggamit ng -2 upang ipakita lamang ang huling dalawang entry.

$ 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

Ang opsyon na ito ay nagpapakita ng parehong impormasyon ngunit may direktang diff na sumusunod na bawat entry. Ito ay kapaki-pakinabang para sa pagsusuri ng code o upang mabilis ang pag-browse kung ano ang nangyari sa panahon ng isang serye ng mga commit na naidagdag sa isang tagatulong. Maaari ka ring gumamit ng isang serye ng pagsasama ng mga opsyon sa git log. Halimbawa, kung nais mong makita ang ilang pinaliit na mga stat para sa bawat commit, maaari mong gamitin ang --stat na opsyon:

$ 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(+)

Tulad ng iyong nakikita, ang --stat na opsyon ay nagpapakita sa ibabaw sa bawat commit na entry sa listahan ng mga binagong mga file, kung gaano karaming mga file ang binago, at gaano karami ang mga linya sa mga file ang idinagdag at inalis. Naglalagay din ito ng buod ng impormasyon sa dulo.

Ang isa pang talagang kapaki-pakinabang na opsyon ay ang --pretty. Ang opsyon na ito ay nagbabago ng log output para i-format maliban sa nakatakda. Ang kaunting prebuilt na mga opsyon ay magagamit para gamitin mo. Ang oneline na opsyon ay nagpapakita ng bawat commit sa isang solong linya, na kung saan ay kapaki-pakinabang kung ikaw ay naghahanap ng maraming mga commit. At saka, ang short, full, at fuller ang mga opsyon ay nagpapakita ng halos lahat na parehong format ngunit may mas kaunti o higit pang impormasyon, ayon sa pagkakabangit:

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

Ang pinakawili-wili na opsyon ay ang format, na nagbibigay-daan upang tukuyin ang iyong sariling log output na format. Ito ay lalong magagamit kapag ikaw ay bumubuo ng output para sa pag-parse ng makina — dahil ikaw ay tumukoy sa format ng malinaw, alam mo na hindi ito magbabago kahit na may mga update sa 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

Mga kapaki-pakinabang na mga opsyon para sa git log --pretty=format ay naglilista ng ilan sa maraming kapaki-pakinabang na mga opsyon na makukuha sa format.

Table 1. Mga kapaki-pakinabang na mga opsyon para sa git log --pretty=format
Opsyon Paglalarawan ng Output

%H

Commit hash

%h

Pinaiksing commit hash

%T

Tree hash

%t

Pinaiksing tree hash

%P

Magulang na mga hash

%p

Pinaiksing magulang na mga hash

%an

Pangalan ng may-akda

%ae

Email ng may-akda

%ad

Petsa ng may-akda (ang format ay gumagalang sa --date=option)

%ar

Petsa ng may-akda, kaugnay

%cn

Pangalan ng nag-commit

%ce

Email ng nag-commit

%cd

Petsa ng nag-commit

%cr

Petsa ng nag-commit , kaugnay

%s

Paksa

Maaaring ikaw ay nagtataka kung ano ang pagkakaiba na nasa pagitan ng may-akda at ang nag-commit. Ang may-akda ay isang tao na orihinal na sumulat sa trabaho, samantala ang nag-commit ay isang tao na huling inilapat ang trabaho. Kaya, kung magpadala ka sa isang tapal sa isang proyekto at isa sa mga pangunahing miyembro na naglalapat ng patch, kapwa kayo ay makakuha ng credit — ikaw bilang ang may-akda, at ang core na miyembro bilang ang nag-commit. Isali natin ang pagkakaiba nito na mas kaunti pa sa Distributed Git.

Ang oneline at format na mga opsyon ay patikular na kapaki-pakinabang sa ibang log na opsyon na tinatawag na --graph. Ang opsyon na ito ay nagdaragdag ng magandang maliit na ASCII graph na nagpapakita sa iyong branch at merge na kasaysayan:

$ 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

Ang tipo ng output na ito ay magiging mas kawili-wili habang tayo ay gumagamit ng pag-branching at pag-merging sa susunod na kabanata.

Iyan ay ilan lamang sa simple na output-formatting na mga opsyon sa git log — marami pang iba. Pangkaraniwang mga opsyon sa git log Naglilista ng mga opsyon na sinali natin kamakailan lang, pati na rin ang ilan pang ibang mga pangkaraniwang formatting na mga opsyon na maaaring kapaki-pakinabang, kasama ng kung papaano sila nagbabago sa output ng log command.

Table 2. Pangkaraniwang mga opsyon sa git log
Option Paglalarawan

-p

Nagpapakita sa ipinapakitang tapal sa bawat commit.

--stat

Nagpapakita ng mga istatistika para sa mga file na nabago sa bawat commit.

--shortstat

Nagpakita lamang ang nabago/mga ipinasok/mga binura na linya mula sa --stat na utos.

--name-only

Nagpakita ng listahan ng mga file na nabago pagkatapos ng impormasyon ng commit.

--name-status

Nagpakita ng listahan ng mga file na apektado na may idinagdag/binago/binura na impormasyon din.

--abbrev-commit

Nagpakita lamang ang unang ilang mga karakter ng SHA-1 checksum sa halip na lahat 40.

--relative-date

Nagpakita ng petsa sa isang kaugnay na format (halimbawa, “2 linggong nakaraan”) sa halip na gamitin ang buong format ng petsa.

--graph

Nagpakita ng ASCII graph sa branch at merge na kasaysayan bukod sa output ng log.

--pretty

Nagpapakita ng mga commit sa isang humahalili na format. Mga opsyon na kasama ay oneline, short, full, fuller, at format (kung saan ikaw ay tumutukoy ng iyong sariling format).

--oneline

Shorthand para sa --pretty=oneline --abbrev-commit na ginagamit na magkasama.

Paglilimit ng Log Output

Sa karagdagan sa output-formatting na mga opsyon, ang git log ay kumukuha ng isang bilang ng kapaki-pakinabang na paglilimit na mga opsyon — yan ay, ang mga opsyon na nagpapakita sa iyo lamang ng subset ng mga commit. Nakita mo na ang opsyon na iyon — ang -2 na opsyon, na nagpapakita lamang sa huling dalawang commit. Sa katunayan, maaari mong gawin -<n>, kung saan n ang anumang integer na ipinakita sa huling n na mga commit. Sa totoo, ikaw ay malamang hindi ka gumagamit niyan ng madalas, dahil ang Git sa pamamagitan ng default na mga pipe sa lahat ng output sa pamamagitan ng isang pager kaya nakikita lamang ang isang pahina sa log output sa isang pagkakataon.

Gayunpaman, ang oras na naglilimita na mga opsyon tulad ng --since at --until ay lubhang nakakatulong. For example, this command gets the list of commits made in the last two weeks:

$ git log --since=2.weeks

Ang utos na ito ay gumagana sa maraming mga format — maaari mong tukuyin ang tiyak na petsa tulad ng "2008-01-15", o isang kaugnay na petsa tulad ng "2 years 1 day 3 minutes ago".

Maaari mo ring i-filter ang listahan ng mga nai-commit na tumugma sa ilang pamantayan sa paghahanap. Ang --author na opsyon ay nagpapahintulot sayo na i-filter sa isang tiyak na may-akda, at ang --grep na opsyon na hinahayaan kang maghanap para sa mga keyword na nasa commit na mga mensahe.

Maaari mong tukuyin ang higit pa sa isang instance sa parehong --author at --grep na pamantayan sa paghahanap , kung saan ay naglilimita sa output ng commit upang ang mga commit na tumugma sa anuman sa --author na mga palatandaan at anuman sa --grep na mga palatandaan; gayunpaman, pagdagdag sa --all-match na opsyon sa karagdagang mga limitasyon sa output sa mga nai-commit lang na tumutugma _sa lahat _ --grep ng mga palatandaan.

Isa pang nakakatulong talaga na filter ay ang -S na opsyon (ang pananalita ay tinutukoy bilang Git’s “pickaxe” na opsyon), na kung saan kay kumukuha ng isang string at nagpapakita lamang sa mga commit na iyon na nagbago ang bilang ng mga pangyayari ng string na iyon. Halimbawa, kung gusto mong humanap sa huling commit na nagdagdag o nag-alis ng isang reperensiya sa tiyak na pag-andar, maaari kang tumawag:

$ git log -S function_name

Ang huling talagang kapaki-pakinabang na opsyon na maipasa sa git log bilang isang fitler ay ang path. Kung ikaw ay tumukoy ng direktoryo o pangalan ng file, maaari mong limitahan ang log output para i-commit ang ipinakilala na pagbago ng mga file na iyon. Ito ay laging huling opsyon at sa pangkalahatan ay nauna ng dobleng mga gitling (--) upang ihiwalay ang mga path mula sa mga opsyon.

Sa Mga opsyon upang limitahan ang output sa git log kami ay maglista nito at ilan pang iba na pangkaraniwang mga opsyon para sa iyong reperensiya.

Table 3. Mga opsyon upang limitahan ang output sa git log
Opsyon Paglalarawan

-<n>

Ipinakita lamang ang huling n na mga commit

--since, --after

Limitahan ang mga commit sa mga ginawa pagkatapos sa tinutukoy na petsa.

--until, --before

Limitahan ang mga commit sa mga ginawa bago ang tinutukoy na petsa.

--author

Ipinapakita lamang ang mga commit na kung saan ang entry ng may-akda ay tumugma sa tinutukoy na string.

--committer

Ipinapakita lamang ang mga commit na kung saan ang entry ng taga-commit ay tumugma sa tinutukoy na string.

--grep

Ipinapakita lamang ang mga commit na may isang mensahe ng commit na naglalaman ng string

-S

Ipinapakita lamang ang mga commit na pagdaragdag o pag-alis sa code na tumutugma sa string

Halimbawa, kung gusto mong tingnan kung saan ang mga commit na nagbago sa mga test files sa loob ng kasaysayan ng Git source code na nai-commit ni Junio Hamano sa buwan ng Oktubre 2008 at hindi mga merge na commit, maaari kang magpatakbo sa isang bagay na tulad nito:

$ 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

Na nasa halos 40,000 na mga commit sa Git source code na kasaysayan, itong utos ay nagpapakita ng 6 na tumugma sa pamantayan na iyon.

Tip
Pag-iwas sa pagpakita sa pinagsamang mga commit

Depende sa workflow na ginagamit sa iyong repositoryo, ito’y posible na ang malaking porsyento sa mga commit sa iyong kasaysayan ng log ay pinagsama lamang ng mga commit, na karaniwang hindi masyadong makabuluhan. Upang iwasan ang pagpakita sa pinagsamang mga commit na gumugulo sa iyong kasaysayan ng log, idagdag lamang ang opsyon ng log`--no-merges`.