Vivasoft-logo

২.৩ গিট বেসিক – কমিট হিস্টোরি দেখা

কমিট হিস্টোরি দেখা

বেশ কিছু কমিট তৈরি করার পর অথবা একটি রিপোজিটরি ক্লোন করার পর এর এক্সিস্টিং কমিট হিস্টোরিগুলো হয়ত আপনি দেখতে চাইবেন, যাতে করে আপনি বুঝতে পারেন যে পূর্বে কি ঘটেছিল। এটি করার জন্য সবচাইতে পাওয়ারফুল টুল টি হলো git log কমান্ড। এই উদাহণগুলোতে simplegit নামক একটি সিম্পল প্রজেক্ট ব্যবহার করি। প্রজেক্ট টি ক্লোন করার জন্য এই কমান্ডটি রান করুন:
				
					$ git clone https://github.com/schacon/simplegit-progit
				
			
যখন আপনি git log কমান্ডটি রান করবেন আপনি নিম্নরুপ আউটপুট দেখতে পাবেন:
				
					$ 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

				
			
ডিফল্টভাবে git log কমান্ডটি কোনো আর্গুমেন্ট ছাড়া উক্ত রিপোজিটরিতে কমিটগুলো বিপরীত ক্রমানুসারে লিস্ট করে এবং অতি সাম্প্রতিক কমিটগুলো সবার আগে দেখায়। উক্ত কমান্ড টি প্রত্যকটি কমিট SHA-1 চেকসাম, অথোর এর নাম এবং ইমেইল, কমিট এর তারিখ এবং কমিট মেসেজসহ সহ কমিটগুলো লিস্ট করে।

আপনি আসলে যা খুঁজে বের করতে চান তা দেখানোর জন্য git log কমান্ড এ অনেকগুলো অপশন এভেইলেবল রয়েছে। এখানে আমরা কিছু পপুলার কমান্ড দেখব।

অপশনগুলোর মধ্যে একটি গুরুত্তপূর্ণ অপশন হল -p অথবা –patch, যা প্রত্যকটি কমিট-এর মধ্যে পার্থক্য দেখায়। আপনি ডিসপ্লে তে দেখানো লগ এন্ট্রি সংখ্যাগুলোর মধ্যে লিমিট দিতে পারবেন। যেমন -2 ব্যবহার করলে শুধুমাত্র শেষের দুইটি এন্ট্রি দেখাবে।
				
					$ 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

				
			
এই অপশনটি একই ইনফরমেশন দেখাবে কিন্তু প্রতিটি এন্ট্রির জন্য সরাসরি পার্থক্য হিসেবে দেখাবে। এটি কোড রিভিউ এর জন্য খুবই সুবিধাজনক। খুব দ্রুত ব্রাউজ করে একটি কমিট সিরিজ চেক করে দেখা যায় যে এতে কি ঘটেছে বা কি কি পরিবর্তন হয়েছে, যা একজন কোলাবোরেটর অ্যাড করেছে। আপনি সামারাইজিং সিরিজ অপশনটিও git log এর মাধ্যমে ইউজ করতে পারেন। উদাহরণস্বরূপ আপনি যদি প্রত্যেকটি কমিট এর জন্য সংক্ষিপ্ত স্ট্যাটাসগুলো দেখতে চান তাহলে আপনি –stat অপশনটি ব্যবহার করতে পারেন।
				
					$ 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 অপশনটি প্রত্যেকটি কমিট এন্ট্রি কে একটি পরিবর্তিত ফাইল হিসেবে প্রিন্ট করে। এখানে কতগুলো ফাইল এবং লাইন এখানে চেঞ্জ, অ্যাড বা রিমুভ হয়েছে তা দেখাচ্ছে। এটি সবশেষে তথ্যগুলোর একটি সারঃসংক্ষেপও দেখায়।

অন্য আর একটি গুরুত্তপূর্ণ অপশন হল –pretty. এই অপশনটি ডিফল্ট লগ আউটপুট করে চেঞ্জ করে ফরম্যাটেড একটি আউটপুট দেখায়। ইউজ করার জন্য অল্প কিছু প্রিবিল্ড অপশন এভেইলেবল রয়েছে। oneline ভ্যালু টি প্রত্যেকটি কমিটকে একটি সিঙ্গেল লাইন এ দেখায়ে যেটি অনেকগুলো কমিট দেখার ক্ষেত্রে কাজে লাগে। অন্যদিকে short, full এবং fuller এই ভ্যালুগুলো সাধারণত একই ফরম্যাট এ আউটপুট দেখায় কিন্তু কিছু সংখ্যক কম বেশি ইনফরমেশন দেখায়।
				
					$ git log --pretty=oneline
ca82a6dff817ec66f44342007202690a93763949 changed the version number
085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 removed unnecessary test
a11bef06a3f659402fe7563abf99ad00de2209e6 first commit

				
			
সবচাইতে ইন্টারেস্টিং ভ্যালুটি হল format, যা আপনার নিজস্ব লগ আউটপুট গুলোকে ফরম্যাট করে দেখায়। এটি সাধারণত কাজে লাগে যখন আপনি মেশিন পার্স করার জন্য আউটপুট তৈরি করেন। কারণ আপনি আলাদাভাবে ফরম্যাটটি নির্দিষ্ট করে দিয়েছেন এবং আপনি জানেন এটি গিট আপডেটের সাথে চেঞ্জ হবে না।
				
					$ 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 এর জন্য কিছু প্রয়োজনীয় স্পেসিফায়ার এর লিস্ট দেয়া হল:

অপশন

আউটপুটের বর্ণনা

  

%H

কমিট হ্যাশ

%h

অ্যাব্রেভিয়েটেড কমিট হ্যাশ

%T

ট্রি হ্যাশ

%t

অ্যাব্রেভিয়েটেড ট্রি হ্যাশ

%P

প্যারেন্ট হ্যাশ

%p

অ্যাব্রেভিয়েটেড প্যারেন্ট হ্যাশ

%an

অথোরের নাম

%ae

অথোরের ইমেইল

%ad

আথোর তারিখ

%ar

অথোর তারিখ, রিলেটিভ

%cn

কমিটারের নাম

%ce

কমিটারের ইমেইল

%cd

কমিটারের তারিখ

%cr

কমিটারের তারিখ, রিলেটিভ

%s

সাবজেক্ট

আপনি হয়ত আশ্চর্য হয়ে যেতে পারেন যে, অথোর এবং কমিটারের মধ্যে পার্থক্য কি। অথোর হলো একজন ব্যাক্তি যিনি মূলত কাজটি লিখেছেন, যেখানে কমিটার হল এমন একজন ব্যাক্তি যিনি সর্বশেষ কাজটি এপ্লাই করেছেন। সুতরাং আপনি যদি একটি প্রজেক্ট এর একটি প্যাচ এ কাজ সেন্ড করেন এবং এটি একটি কোর মেম্বার এর মাধ্যমে এপ্লাই হয় তাহলে আপনারা দুজনেই ক্রেডিট পেয়ে যাবেন। – আপনি অথোর হিসাবে এবং কোর মেম্বারটি কমিটার হিসেবে বিবেচিত হবে। আমরা এটি আরও বিস্তারিত ডিস্ট্রিবিউটেড গিট এই লিংক এ শিখব।

oneline এবং format অপশনটি বিশেষ করে অন্য আর একটি log অপশন –graph ইউজ করে। এই অপশনটি আপনার ব্রাঞ্চ এবং মার্জ হিস্টোরি এবং একটি ছোট সুন্দর আসকি গ্রাফ দেখায়।
				
					$ 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 লিস্ট এর কমন অপশনগুলো আমরা যতদূর সম্ভব কভার করেছি এর বাইরেও আরও কিছু ইউজফুল ফরম্যাটিং অপশন রয়েছে:

অপশন

বর্ণনা

-p

প্রতিটি কমিটের সাথে সূচিত ট্যাগকে দেখানো

–stat

প্রতিটি কমিটে ফাইল মোডিফাই এর পরিসংখ্যান

–shortstat

–stat কমান্ড হতে পরিবর্তিত, যুক্ত, ডিলিটেড লাইন প্রদর্শন

–name-only

কমিট ইনফরমেশন এর পর পরিবর্তিত ফাইলসমূহ প্রদর্শন

–name-status

যেসকল ফাইলে পরিবর্তিত, যুক্ত, ডিলিটেড ইনফরমেশন আছে তাদের লিস্ট দেখানো

–abbrev-commit

SHA-1 চেকসামের ৪০ টি ক্যারেক্টারের পরিবর্তে শুধুমাত্র প্রথম কয়েকটি ক্যারেক্টার দেখানো

–relative-date

তারিখকে পুরো ফরম্যাটের পরিবর্তে শুধুমাত্র একটা রিলেটিভ ফরম্যাটে দেখানো (যেমন: “২ সপ্তাহ আগে”)

–graph

লগ আউটপুটের সাথে ব্রাঞ্চ বা মার্জ হিস্টোরির আসকি গ্রাফ প্রদর্শন

–pretty

ভিন্ন উপায়ে কমিট প্রদর্শন।  অপশনে ওয়ানলাইন, শর্ট, ফুল, ফুলার এবং ফরম্যাট(যেখানে আপনি নিজস্ব ফরম্যাট স্পেসিফাই করতে পারবেন) যুক্ত থাকে

লগ আউটপুট লিমিট করা

আউটপুট ফরম্যাটিং এর সাথে যোগ করে আরও বলা যায় যে, git log কিছু লিমিটিং অপশন নেয়, যা কমিট এর কিছু সাবসেট দেখায়। আপনি অলরেডি একটি অপশন উপরে দেখে এসেছেন। -2 অপশনটি, যেটি সর্বশেষ দুইটি কমিট দেখায়। আপনি অবশ্য- ইউজ করতে পারেন, যেখানে n হল একটি ইন্টিজার নাম্বার যা সর্বশেষ n টি কমিট দেখাবে। বাস্তবে হয়ত আপনি সচরাচর এটি ইউজ করবেন না, কারণ গিট বাই ডিফল্ট লগ আউটপুটের সময় পেজিনেশন করেই দেখায়। মানে হল, আপনি একই সময়ে মাত্র একটি পেইজ এর আউটপুটই দেখতে পাবেন। যাই হোক, টাইম লিমিট এর অপশনগুলো যেমন –since এবং –until এগুলো খুবই গুরুত্তপূর্ণ। উদাহরণস্বরূপ – এই কমান্ডটি লাস্ট উইক তৈরি হওয়া কমিটগুলো দেখায়:
				
					$ git log --since=2.weeks
				
			
এই কমান্ডটি অনেকগুলো ফরম্যাট এর সাথে কাজ করে — আপনি একটি নির্দিষ্ট তারিখ যেমনঃ”2008-01-15″ দিয়ে দিতে পারেন অথবা একটি রিলেটিভ তারিখ যেমন: “2 years 1 day 3 minutes ago” দিতে পারেন।

আপনি কমিটগুলোকে ফিল্টার এর মাধ্যমে দেখাতে পারেন যেটি কিছু নির্দিষ্ট ক্রাইটেরিয়া ম্যাচ করে। –author অপশনটি একটি স্পেসিফিক অথোর এর উপর ফিল্টার করতে দেয় এবং – –grep অপশনটি কিওয়ার্ডদিয়ে কমিট মেসেজগুলোতে সার্চ করতে দেয়।
নোট
আপনি –author এবং –grep সার্চ এর ক্রাইটেরিয়াকে একটির বেশী ইন্সট্যান্স এ নির্দিষ্ট করে দিতে পারেন, যেটি কমিট আউটপুট এমনভাবে দেখাবে যেন, যেকোন –authorবা যেকোন —grep প্যাটার্ন ম্যাচ করে। যাই হোক –all-match অপশনটি এমনভাবে আউটপুটগুলোকে লিমিট করে যাতে সকল কমিটগুলো –grep প্যাটার্ন ম্যাচ করে।
অন্য একটি হেল্পফুল ফিল্টার হল -S অপশন (গিটের পিকেক্স অপশনকে রেফার করে), যা একটি স্ট্রিং নেয় এবং ওই কমিটগুলোই দেখায় যেগুলো উক্ত স্ট্রিং অনুযায়ী কতবার চেঞ্জ হয়েছে। যদি আপনি সর্বশেষ কমিটটি খুজে বের করতে চান যেটি একটি নির্দিষ্ট ফাংশনের রেফারেন্সে এড হয়েছে বা রিমুভ হয়েছে:
				
					$ git log -Sfunction_name
				
			
সর্বশেষ খুব প্রয়োজনীয় অপশনটি হল ফিল্টার পাথ দিয়ে git log করা। যদি আপনি সরাসরি একটি ডিরেক্টরি বা ফাইল এর নেইম নির্দিষ্ট করে দেন তাহলে আপনি log output এমনভাবে লিমিট করতে পারবেন যে শুধু উক্ত ফাইলগুলোতেই যে কমিটগুলো আছে শুধু সেগুলোই দেখাবে। এটিই সর্বশেষ অপশন এবং সাধারণত ডাবল ড্যাশ (–) দিয়ে শুরু হয়।

এবার git log থেকে আউটপুটের অপশন লিমিট করার জন্য গুলো আমরা লিস্ট করব এবং আরও কিছু কমন অপশন দেখবঃ

অপশন

বর্ণনা

-(n)

শেষ n সংখ্যক কমিট প্রদর্শন

–since, –after

নির্দিষ্ট তারিখের পরের কমিট দেখনো

–until, –before

নির্দিষ্ট তারিখের পূর্ব পর্যন্ত কমিট দেখনো

–author

যেসকল কমিটে অথোরের এন্ট্রি কোন নির্দিষ্ট স্ট্রিং কে ধারণ করে তাদের প্রদর্শন

–committer

যেসকল কমিটে কমিটারের এন্ট্রি কোন নির্দিষ্ট স্ট্রিং কে ধারণ করে তাদের প্রদর্শন

–grep

যেসকল কমিট মেসেজ সম্বলিত কমিট নির্দিষ্ট স্ট্রিং কে ধারণ করে তাদের প্রদর্শন

-S

যেসকল কমিট নির্দিষ্ট স্ট্রিং ম্যাচ করে এমন কোড অ্যাড বা রিমোভ করে তাদের প্রদর্শন

উদাহরণস্বরূপ যদি আপনি দেখতে চান যে কোন কমিটগুলো “জুনিও হামানো” অক্টোবর ২০০৮ এ করেছে এবং মার্জ হয়নি এরকম কমিট করেছে এবং গিট সোর্স কোড হিস্টোরিতে, টেস্ট ফাইলটি মডিফাই করেছে তাহলে আমরা নিচের কমান্ডটি রান করতে পারি:
				
					$ 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

				
			
গিট এর সোর্স কোড হিস্টোরি তে প্রায় চল্লিশ হাজার কমিট এর মাঝে এই কমান্ডটি ৬ টি ম্যাচ খুজে বের করেছে এই ক্রাইটেরিয়া অনুযায়ী।