git absorb - स्वचालित `git commit --fixup`
(github.com/tummychow)- Facebook द्वारा बनाए गए
hg absorbका Git के लिए पोर्ट किया गया संस्करणhg absorbको पिछले कुछ वर्षों में version control systems में सबसे शानदार workflow सुधारों में से एक कहा जा सकता है- जब working directory में uncommitted changes किसी draft changeset के ऊपर हों, तो
hg absorbचलाने पर uncommitted सुधार अपने-आप उपयुक्त draft ancestor changeset में absorb हो जाते हैं - commit बनाए बिना या history बदलने के नियम हाथ से बनाए बिना
hg histedit+ "roll" जैसा काम किया जा सकता है - command बदली गई lines को देखता है, उन lines को बदलने वाले changeset को ढूंढता है, और उस changeset को uncommitted changes शामिल करने के लिए संशोधित करता है
- अगर बिना conflict के बदलाव नहीं किए जा सकते, तो वे uncommitted स्थिति में ही रह जाते हैं
- यह workflow review feedback लागू करने जैसे कामों में बहुत उपयोगी है। फ़ाइल changes करें,
hg absorbचलाएँ, और changes व commits के बीच mapping अपने-आप व्यवस्थित हो जाती है। यह लगभग जादू जैसा है
git absorb उपयोग परिदृश्य
- आपके पास कई commits वाला एक feature branch है
- टीम का एक सदस्य branch की review करता है और कुछ bugs बताता है
- आपके पास bug fixes हैं, लेकिन क्योंकि आप atomic commits में विश्वास करते हैं, आप उन्हें किसी धुंधले
fixescommit में एक साथ नहीं डालना चाहते git commit --fixupके लिए commit SHA हाथ से ढूंढने या manual interactive rebase चलाने के बजाय यह करें:git add $FILES_YOU_FIXEDgit absorb --and-rebase
git absorbअपने-आप पहचानता है कि किन commits को सुरक्षित रूप से संशोधित किया जा सकता है, और कौन से staged changes किस commit से संबंधित हैं- फिर यह उन changes के लिए
fixup!commits लिखता है --and-rebaseफ़्लैग के साथ येfixupcommits संबंधित commits में अपने-आप समाहित हो जाते हैं- यदि आप इस पर पूरी तरह भरोसा नहीं करते, तो output को हाथ से जाँचें और फिर Git की built-in autosquash सुविधा का उपयोग करके
fixupको feature branch में मिला सकते हैं
इंस्टॉलेशन
- नवीनतम tagged release से artifacts डाउनलोड करके इंस्टॉल किया जा सकता है
- Windows, MacOS, Linux के लिए artifacts उपलब्ध हैं
उपयोग विधि
- absorb करने वाले changes को
git addसे stage करें git absorbचलाएँ- यदि परिणाम संतोषजनक हो तो
git rebase -i --autosquashचलाएँ - यदि संतोषजनक न हो तो
git reset --softसे पिछली स्थिति में लौटें
How it works (roughly)
git absorbजाँचता है कि दो patches P1 और P2 आपस में interchangeable हैं या नहीं- डिफ़ॉल्ट रूप से यह आख़िरी 10 commits को ध्यान में रखता है
- index के हर hunk के लिए, यह जाँचता है कि वह hunk सबसे हालिया commit के साथ interchangeable है या नहीं
- जैसे ही कोई non-interchangeable commit मिलता है, वह उस hunk को एक
fixupcommit में बदल देता है
Configuration
Stack size
- डिफ़ॉल्ट रूप से यह आख़िरी 10 commits को ध्यान में रखता है
- अधिक commits को शामिल करने के लिए
.gitconfigमेंmaxStackमान सेट करें
One fixup per fixable commit
- डिफ़ॉल्ट रूप से हर absorb किए जा सकने वाले hunk के लिए अलग
fixupcommit बनाया जाता है -Fफ़्लैग का उपयोग करके एक ही commit में absorb होने वाले सभी hunks के लिए केवल एकfixupcommit बनाया जा सकता है
Auto-stage all changes if nothing staged
- डिफ़ॉल्ट रूप से केवल staged files को ध्यान में रखा जाता है
- यदि कुछ भी staged न हो, तो सभी changes को अपने-आप stage करने के लिए
autoStageIfNothingStagedसेट करें
Fixup target always SHA
- डिफ़ॉल्ट रूप से
fixupcommit message लक्ष्य commit के summary की ओर इशारा करता है - इसे इस तरह भी सेट किया जा सकता है कि वह हमेशा लक्ष्य के SHA की ओर इशारा करे
TODO
- force फ़्लैग लागू करना
- remote default branch जाँच लागू करना
- अलग-अलग safety checks को निष्क्रिय करने के लिए छोटा force फ़्लैग जोड़ना
- यह सुनिश्चित करना कि सभी error outputs उपयोगकर्ता के लिए उपयोगी हों
- सफलता पर अधिक logs आउटपुट करना
- और अधिक tests जोड़ना
- stack और interchange details का documentation करना
- और अधिक interchange cases जोड़ना
- ऐसा लागू करना कि सभी hunks एक साथ memory में load न हों
- concurrent modifications से सुरक्षा के लिए index locking लागू करना
GN⁺ की संक्षिप्त टिप्पणी
git absorbFacebook केhg absorbसे पोर्ट किया गया एक tool है, जो commits को अपने-आप संशोधित करके development workflow बेहतर बनाता है- review feedback लागू करते समय यह बहुत उपयोगी है, क्योंकि यह commit को हाथ से ढूंढने या संशोधित करने की ज़रूरत के बिना काम को अपने-आप संभाल लेता है
- इसी तरह की सुविधा देने वाला एक और tool
git-autofixupहै। यह commit messages के आधार परfixupcommits अपने-आप बनाता है - फ़ायदे यह हैं कि code review feedback लागू करना आसान हो जाता है और commit history अधिक साफ़ रहती है। कमी यह है कि automation पर बहुत अधिक निर्भरता कभी-कभी अप्रत्याशित परिणाम दे सकती है
2 टिप्पणियां
Hacker News टिप्पणियाँ
git absorbका उपयोग करने वाले लोगों का मानना है कि यह टूल बहुत उपयोगी हैgit absorbअपने-आप सही commit ढूंढ देता हैgit commit --fixupके लिए alias का उपयोग करके संतुष्ट हैंgit absorbका इस्तेमाल किया, लेकिन यह अक्सर गलत parent commit चुन लेता थाgit --fixupऔरgit rebase --autosquashका इस्तेमाल पहले नहीं किया, लेकिन ये उपयोगी लगते हैंgit-absorbएक कदम आगे जाता हुआ लगता हैcommits और history को बदलने को लेकर संदेह है
magitका उपयोग करके आसानी से fixup commit बनाए जा सकते हैंgit commit --fixupऔरgit rebase --autosquashके बारे में पता चलाgit rebase -iकई तरह की ज़रूरतें पूरी करता हैबहुत ज़्यादा साफ-सुथरी commit history पर अटक जाने की बात समझ नहीं आती
आखिरी 10 commits में से बिना conflict वाले संशोधित किए जा सकने वाले commit को चुनने की बात समझ नहीं आती
fixup^का काफी उपयोग करते हैंयह टिप्पणी थोड़ा चुभ गई। मैंने fixup / autosquash को बस थोड़ा-बहुत आज़माया था, लेकिन इससे थोड़ा खालीपन-सा महसूस हुआ कि क्या इसकी फ़िक्र सिर्फ मैं ही कर रहा हूँ...