৭.৩ গিট টুলস – স্ট্যাশিং এবং ক্লিনি
স্ট্যাশিং এবং ক্লিনিং
প্রায়শই, আপনি যখন আপনার প্রজেক্টের অংশে কাজ করছেন, জিনিসগুলি অগোছালো অবস্থায় আছে এবং আপনি অন্য কিছুতে কাজ করার জন্য কিছু ব্রাঞ্চ পরিবর্তন করতে চান। সমস্যা হল, আপনি অর্ধ-সমাপ্ত কাজের একটি কমিট করতে চান না যাতে আপনি পরে এই জায়গায় ফিরে যেতে পারেন। এই সমস্যার সমাধান হল git stash কমান্ড।
স্ট্যাশিং আপনার ওয়ার্কিং ডিরেক্টরির অগোছালো অবস্থা নিয়ে যায় — অর্থাৎ, আপনার পরিবর্তিত ট্র্যাক করা ফাইল এবং পর্যায়ক্রমে পরিবর্তনগুলি —-এবং এটিকে অসমাপ্ত পরিবর্তনের স্ট্যাকে সংরক্ষণ করে যা আপনি যেকোনো সময় পুনরায় আবেদন করতে পারেন ( এমনকি একটি ভিন্ন ব্রাঞ্চেও )।
নোট
git stash push এ স্থানান্তর
2017 সালের অক্টোবরের শেষের দিকে, গিট মেইলিং লিস্টে ব্যাপক আলোচনা হয়েছে, যেখানে git stash save কে , বিদ্যমান অপশন কমান্ড git stash push এর জন্য বিলুপ্ত করা হয়েছে। এর প্রধান কারণ হচ্ছে, নির্বাচিত পাথস্পেক্স কে ( pathspecs ) স্ট্যাশিং ( স্ট্যাশিং ) করার অপশনটি git stash push এই কমান্ডই করতে পারে , যা git stash save কমান্ডটি করতে পারে না।
git stash save খুব শীঘ্রই চলে যাচ্ছে না, তাই হঠাৎ করে অদৃশ্য হয়ে যাওয়া নিয়ে চিন্তা করবেন না। কিন্তু আপনি নতুন কার্যকারিতার জন্য push অপশনে স্থানান্তর করা শুরু করতে পারেন।
আপনার কাজকে স্ট্যাশিং করা
স্ট্যাশিং প্রদর্শনের জন্য, আপনি আপনার প্রজেক্টে যাবেন এবং কয়েকটি ফাইলে কাজ শুরু করবেন এবং সম্ভবত পরিবর্তনগুলির মধ্যে একটি স্টেজ করবেন। আপনি যদি git status চালান তবে আপনি আপনার এলোমেলো অবস্থাটি দেখতে পাবেন:
$ git status
Changes to be committed:
(use "git reset HEAD ..." to unstage)
modified: index.html
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git checkout -- ..." to discard changes in working directory)
modified: lib/simplegit.rb
এখন আপনি ব্রাঞ্চ স্যুইচ করতে চান, কিন্তু আপনি এখনও যা কাজ করছেন তা কমিট করতে চান না, তাই আপনি পরিবর্তনগুলি স্ট্যাশ করে রাখবেন। আপনার স্ট্যাশিং স্ট্যাকের উপর একটি নতুন স্ট্যাশ পুশ করতে, git stash push বা git stash চালান:
$ git stash
Saved working directory and index state \
"WIP on master: 049d078 Create index file"
HEAD is now at 049d078 Create index file
(To restore them type "git stash apply")
আপনি এখন দেখতে পারেন যে আপনার ওয়ার্কিং ডিরেক্টরি পরিষ্কার:
$ git status
# On branch master
nothing to commit, working directory clean
এই মুহুর্তে, আপনি ব্রাঞ্চ পরিবর্তন করতে পারেন এবং অন্য কোথাও কাজ করতে পারেন; আপনার পরিবর্তন আপনার স্ট্যাকে সংরক্ষণ করা হয়। আপনি কোন স্ট্যাশগুলি সংরক্ষণ করেছেন তা দেখতে, git stash list ব্যবহার করতে পারেন:
$ git stash list
stash@{0}: WIP on master: 049d078 Create index file
stash@{1}: WIP on master: c264051 Revert "Add file_size"
stash@{2}: WIP on master: 21d80a5 Add number to log
এই ক্ষেত্রে, দুটি স্ট্যাশ আগে সংরক্ষিত হয়েছিল, তাই আপনার কাছে তিনটি ভিন্ন স্ট্যাশ করা কাজের অ্যাক্সেস রয়েছে। মূল স্ট্যাশ কমান্ডের হেল্প আউটপুটে দেখানো কমান্ডটি ব্যবহার করে আপনি এইমাত্র করা স্ট্যাশটিকে পুনরায় প্রয়োগ করতে পারেন: git stash apply। আপনি যদি পুরানো স্ট্যাশগুলির মধ্যে একটি প্রয়োগ করতে চান, আপনি এটির নামকরণ নির্দিষ্ট করতে পারেন, যেমন: git stash apply stash@{2}। আপনি যদি একটি স্ট্যাশ নির্দিষ্ট না করেন তবে গিট সাম্প্রতিকতম স্ট্যাশটিকে ধরে নেয় এবং এটি প্রয়োগ করার চেষ্টা করে:
$ git stash apply
On branch master
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git checkout -- ..." to discard changes in working directory)
modified: index.html
modified: lib/simplegit.rb
no changes added to commit (use "git add" and/or "git commit -a")
আপনি দেখতে পাচ্ছেন যে গিট আপনার ফাইলগুলিকে পুনরায় সংশোধন করে যখন আপনি স্ট্যাশ সংরক্ষণ করেন। এই ক্ষেত্রে, আপনি যখন স্ট্যাশ প্রয়োগ করার চেষ্টা করেছিলেন তখন আপনার কাছে একটি পরিষ্কার ওয়ার্কিং ডিরেক্টরি ছিল এবং আপনি এটিকে যে ব্রাঞ্চ থেকে সংরক্ষণ করেছিলেন সেখানে এটি প্রয়োগ করার চেষ্টা করেছিলেন। সফলভাবে একটি স্ট্যাশ প্রয়োগকরার জন্য একটি পরিষ্কার ওয়ার্কিং ডিরেক্টরি থাকা এবং এটি একই ব্রাঞ্চে প্রয়োগ করা প্রয়োজনীয় নয়। আপনি একটি ব্রাঞ্চে একটি স্ট্যাশ সংরক্ষণ করতে পারেন, পরে অন্য ব্রাঞ্চে স্যুইচ করতে পারেন এবং পরিবর্তনগুলি পুনরায় প্রয়োগ করার চেষ্টা করতে পারেন। আপনি যখন একটি স্ট্যাশ প্রয়োগ করেন —কোন কিছু সঠিকভাবে প্রয়োগ করা না গেলে সেক্ষেত্রে গিট আপনাকে মার্জ কনফ্লিক্ট দেয়।
আপনার ফাইলগুলির পরিবর্তনগুলি পুনরায় প্রয়োগ করা হয়েছে, কিন্তু আপনি যে ফাইলটি আগে স্টেজিং করেছিলেন তা পুনঃস্থাপন করা হয়নি৷ এটি করার জন্য, আপনাকে অবশ্যই একটি –index অপশন সহ git stash apply কমান্ডটি চালাতে হবে যাতে পরিবর্তনগুলি পুনরায় প্রয়োগ করার চেষ্টা করা যায়। আপনি যদি এটি চালাতেন, তাহলে আপনি আপনার আসল অবস্থানে ফিরে যেতেন:
$ git stash apply --index
On branch master
Changes to be committed:
(use "git reset HEAD ..." to unstage)
modified: index.html
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git checkout -- ..." to discard changes in working directory)
modified: lib/simplegit.rb
এপ্লাই অপশানটি শুধুমাত্র স্ট্যাশ করে রাখা কাজগুলোতে প্রয়োগ করার চেষ্টা করে —-আপনি এটিকে আপনার স্ট্যাকে রেখেছেন। এটি অপসারণ করতে, স্ট্যাশের নাম দিয়ে git stash drop চালাতে পারেন:
$ git stash list
stash@{0}: WIP on master: 049d078 Create index file
stash@{1}: WIP on master: c264051 Revert "Add file_size"
stash@{2}: WIP on master: 21d80a5 Add number to log
$ git stash drop stash@{0}
Dropped stash@{0} (364e91f3f268f0900bc3ee613f9f733e82aaed43
আপনি স্ট্যাশ প্রয়োগ করতে git stash pop কমান্ড চালাতে পারেন এবং তারপরে অবিলম্বে এটি আপনার স্ট্যাক থেকে ফেলে দিতে পারেন।
ক্রিয়েটিভ স্ট্যাশিং
কিছু স্ট্যাশ ভেরিয়েন্ট রয়েছে যা সহায়ক হতে পারে। প্রথম যে অপশনটি যেটি বেশ জনপ্রিয় তা হল git stash কমান্ডের –keep-index অপশনটি। এটি গিটকে শুধুমাত্র তৈরি করা স্ট্যাশের সমস্ত স্টেজ করা বিষয়বস্তুকে অন্তর্ভুক্ত করতে বলে না কিন্তু একই সাথে এটিকে ইনডেক্স এ রেখে দেয়।
$ git status -s
M index.html
M lib/simplegit.rb
$ git stash --keep-index
Saved working directory and index state WIP on master: 1b65b17 added the index file
HEAD is now at 1b65b17 added the index file
$ git status -s
M index.html
আপনি স্ট্যাশের সাথে আরেকটি সাধারণ জিনিস করতে পারেন তা হল আনট্র্যাক করা ফাইলগুলির পাশাপাশি ট্র্যাক করা ফাইলগুলিকে স্ট্যাশ করে রাখা। ডিফল্টরূপে, git stash শুধুমাত্র সংশোধিত এবং স্ট্যাশ করা ফাইলগুলিকে ট্র্যাক করে। আপনি যদি –include-untracked বা -u উল্লেখ করেন, গিট তৈরি করা স্ট্যাশে আনট্র্যাক করা ফাইলগুলিকে অন্তর্ভুক্ত করবে। যাইহোক, স্ট্যাশে আনট্র্যাক করা ফাইলগুলি অন্তর্ভুক্ত করলেও তা স্পষ্টভাবে উপেক্ষা করা ফাইলগুলিকে অন্তর্ভুক্ত করবে না; উপরন্তু উপেক্ষা করা ফাইলগুলি অন্তর্ভুক্ত করতে, –all ( বা শুধু -a ) ব্যবহার করুন।
$ git status -s
M index.html
M lib/simplegit.rb
?? new-file.txt
$ git stash -u
Saved working directory and index state WIP on master: 1b65b17 added the index file
HEAD is now at 1b65b17 added the index file
$ git status -s
$
পরিশেষে, আপনি যদি –patch ফ্ল্যাগ নির্দিষ্ট করেন, গিট পরিবর্তিত সমস্ত কিছুকে স্ট্যাশ করে রাখবে না বরং আপনি কোন পরিবর্তনগুলিকে স্ট্যাশ করতে চান এবং কোনটি আপনি আপনার ওয়ার্কিং ডিরেক্টরিতে রাখতে চান তা আপনাকে ইন্টারেক্টিভভাবে প্রম্পট করবে।
$ git stash --patch
diff --git a/lib/simplegit.rb b/lib/simplegit.rb
index 66d332e..8bb5674 100644
--- a/lib/simplegit.rb
+++ b/lib/simplegit.rb
@@ -16,6 +16,10 @@ class SimpleGit
return `#{git_cmd} 2>&1`.chomp
end
end
+
+ def show(treeish = 'master')
+ command("git show #{treeish}")
+ end
end
test
Stash this hunk [y,n,q,a,d,/,e,?]? y
Saved working directory and index state WIP on master: 1b65b17 added the index file
স্ট্যাশ থেকে একটি ব্রাঞ্চ তৈরি করা
আপনি যদি কিছু কাজ স্ট্যাশ করে রাখেন, কিছুক্ষণের জন্য সেখানে রেখে দেন এবং যে ব্রাঞ্চ থেকে আপনি কাজটি স্ট্যাশ করে রেখেছিলেন সেখানে কাজ চালিয়ে যান, আপনার কাজটি পুনরায় প্রয়োগ করতে সমস্যা হতে পারে। যদি আবেদনটি একটি ফাইল সংশোধন করার চেষ্টা করে যা আপনি পরিবর্তন করেছেন, তাহলে আপনি একটি মার্জ কনফ্লিক্ট পাবেন এবং এটি সমাধান করার চেষ্টা করতে হবে। আপনি যদি স্ট্যাশ করে রাখা পরিবর্তনগুলি পুনরায় পরীক্ষা করার একটি সহজ উপায় চান, আপনি git stash branch <new branchname> কমান্ড চালাতে পারেন, যা আপনার নির্বাচিত ব্রাঞ্চের নাম দিয়ে আপনার জন্য একটি নতুন ব্রাঞ্চ তৈরি করে, আপনি যখন আপনার কাজটি স্ট্যাশ করে রেখেছিলেন তখন আপনি যে কমিট-এ ছিলেন সেগুলো চেক আউট করে, সেখানে আপনার কাজটি পুনরায় প্রয়োগ করে, এবং তারপর এটি সফলভাবে প্রয়োগ করা হলে স্ট্যাশটি ফেলে দেয়:
$ git stash branch testchanges
M index.html
M lib/simplegit.rb
Switched to a new branch 'testchanges'
On branch testchanges
Changes to be committed:
(use "git reset HEAD ..." to unstage)
modified: index.html
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git checkout -- ..." to discard changes in working directory)
modified: lib/simplegit.rb
Dropped refs/stash@{0} (29d385a81d163dfd45a452a2ce816487a6b8b014)
সহজে স্ট্যাশ করে রাখা কাজ পুনরুদ্ধার এবং একটি নতুন ব্রাঞ্চে কাজ করার জন্য এটি একটি চমৎকার শর্টকাট।
আপনার ওয়ার্কিং ডিরেক্টরি পরিষ্কার করা
অবশেষে, আপনি আপনার ওয়ার্কিং ডিরেক্টরিতে কিছু কাজ বা ফাইল স্ট্যাশ করে রাখতে চান না, তবে কেবল সেগুলি থেকে রেহাই পেতে চান ; তবে এর জন্যই git clean কমান্ড।
আপনার ওয়ার্কিং ডিরেক্টরি পরিষ্কার করার কিছু সাধারণ কারণ হতে পারে মার্জ বা বাহ্যিক সরঞ্জাম দ্বারা তৈরি করা ক্রাফ্ট অপসারণ করা বা একটি পরিষ্কার বিল্ড চালানোর জন্য বিল্ড আর্টিফ্যাক্টগুলি সরিয়ে ফেলা।
আপনি এই কমান্ডের ব্যবহারের ক্ষেত্রে বেশ সতর্কতা অবলম্বন করবেন, যেহেতু এটি আপনার ওয়ার্কিং ডিরেক্টরি থেকে ট্র্যাক না করা ফাইলগুলি সরানোর জন্য ডিজাইন করা হয়েছে। আপনি যদি আপনার মত পরিবর্তন করেন তবে প্রায়শই সেই ফাইলগুলির বিষয়বস্তু পুনরুদ্ধার করা হয় না। একটি স্ট্যাশ এ সংরক্ষণ করে সবকিছু মুছে ফেলার জন্য, একটি নিরাপদ অপশন হল git stash –all কমান্ড চালানো।
ধরে নিচ্ছি আপনি ক্রাফ্ট ফাইলগুলি মুছে ফেলতে চান বা আপনার ওয়ার্কিং ডিরেক্টরি পরিষ্কার করতে চান, আপনি git clean দিয়ে তা করতে পারেন। আপনার ওয়ার্কিং ডিরেক্টরিতে সমস্ত আনট্র্যাক করা ফাইলগুলি মুছে ফেলার জন্য, আপনি git clean -f -d চালাতে পারেন, যা যে কোনও ফাইল এবং ফলস্বরূপ খালি হয়ে যাওয়া কোনও সাবডিরেক্টরিগুলিকে সরিয়ে দেয়। -f এর অর্থ ‘ফোর্স’ বা “সত্যিই এটি করুন”, এবং এটি প্রয়োজন হয় যদি গিট কনফিগারেশন ভেরিয়েবল স্পষ্টভাবে clean.requireForce এ false সেট করা না থাকে।
আপনি যদি কখনও দেখতে চান এটি কী করবে, তবে বিকল্প হিসেবে –dry-run ( বা -n ) কমান্ডটি চালাতে পারেন, যার অর্থ “ড্রাই রান কর এবং আমাকে বল তুমি কি অপসারণ করলে”।
$ git clean -d -n
Would remove test.o
Would remove tmp/
ডিফল্টরূপে, git clean কমান্ড শুধুমাত্র আনট্র্যাক করা ফাইলগুলিকে সরিয়ে দেবে যেগুলি উপেক্ষা করা হয় না। আপনার .gitignore বা অন্যান্য উপেক্ষা করা ফাইলের প্যাটার্নের সাথে মেলে এমন কোনো ফাইল সরানো হবে না। আপনি যদি সেই ফাইলগুলিকেও মুছে ফেলতে চান, যেমন একটি বিল্ড থেকে তৈরি করা সমস্ত .o ফাইল মুছে ফেলতে চান যাতে আপনি একটি সম্পূর্ণ পরিষ্কার বিল্ড করতে পারেন, তাহলে আপনি ক্লিন কমান্ডে -x যোগ করতে পারেন।
$ git status -s
M lib/simplegit.rb
?? build.TMP
?? tmp/
$ git clean -n -d
Would remove build.TMP
Would remove tmp/
$ git clean -n -d -x
Would remove build.TMP
Would remove test.o
Would remove tmp/
আপনি যদি না জানেন যে git clean কমান্ডটি কী করতে চলেছে, সর্বদা এটিকে -n দিয়ে চালান।
অন্য উপায়ে আপনি প্রক্রিয়াটি সম্পর্কে সতর্ক হতে পারেন তা হল -i বা “interactive” ফ্ল্যাগ দিয়ে এটি চালানো।
এটি একটি ইন্টারেক্টিভ মোডে ক্লিন কমান্ড চালাবে।
$ git clean -x -i
Would remove the following items:
build.TMP test.o
*** Commands ***
1: clean 2: filter by pattern 3: select by numbers 4: ask each 5: quit
6: help
What now>
এইভাবে আপনি পৃথকভাবে প্রতিটি ফাইলের মধ্য দিয়ে যেতে পারেন বা ইন্টারেক্টিভভাবে মুছে ফেলার জন্য প্যাটার্ণ নির্দিষ্ট করে দিতে পারেন।
নোট
একটি অদ্ভুত পরিস্থিতি রয়েছে যেখানে আপনাকে গিটকে আপনার ওয়ার্কিং ডিরেক্টরি পরিষ্কার করতে বলার জন্য অতিরিক্ত জোরদার হতে হবে। আপনি যদি এমন একটি ওয়ার্কিং ডিরেক্টরিতে থাকেন যার অধীনে আপনি অন্যান্য গিট সংগ্রহস্থলগুলি অনুলিপি বা ক্লোন করেছেন ( সম্ভবত সাবমডিউল হিসাবে ), এমনকি git clean -fd সেই ডিরেক্টরিগুলি মুছতে অস্বীকার করবে। এইসব ক্ষেত্রে, আপনাকে জোর দেওয়ার জন্য একটি দ্বিতীয় -f অপশন যোগ করতে হবে।