- 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 में विश्वास करते हैं, आप उन्हें किसी धुंधले
fixes commit में एक साथ नहीं डालना चाहते
git commit --fixup के लिए commit SHA हाथ से ढूंढने या manual interactive rebase चलाने के बजाय यह करें:
git add $FILES_YOU_FIXED
git absorb --and-rebase
git absorb अपने-आप पहचानता है कि किन commits को सुरक्षित रूप से संशोधित किया जा सकता है, और कौन से staged changes किस commit से संबंधित हैं
- फिर यह उन changes के लिए
fixup! commits लिखता है
--and-rebase फ़्लैग के साथ ये fixup commits संबंधित 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 को एक
fixup commit में बदल देता है
Configuration
Stack size
- डिफ़ॉल्ट रूप से यह आख़िरी 10 commits को ध्यान में रखता है
- अधिक commits को शामिल करने के लिए
.gitconfig में maxStack मान सेट करें
One fixup per fixable commit
- डिफ़ॉल्ट रूप से हर absorb किए जा सकने वाले hunk के लिए अलग
fixup commit बनाया जाता है
-F फ़्लैग का उपयोग करके एक ही commit में absorb होने वाले सभी hunks के लिए केवल एक fixup commit बनाया जा सकता है
Auto-stage all changes if nothing staged
- डिफ़ॉल्ट रूप से केवल staged files को ध्यान में रखा जाता है
- यदि कुछ भी staged न हो, तो सभी changes को अपने-आप stage करने के लिए
autoStageIfNothingStaged सेट करें
Fixup target always SHA
- डिफ़ॉल्ट रूप से
fixup commit 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 absorb Facebook के hg absorb से पोर्ट किया गया एक tool है, जो commits को अपने-आप संशोधित करके development workflow बेहतर बनाता है
- review feedback लागू करते समय यह बहुत उपयोगी है, क्योंकि यह commit को हाथ से ढूंढने या संशोधित करने की ज़रूरत के बिना काम को अपने-आप संभाल लेता है
- इसी तरह की सुविधा देने वाला एक और tool
git-autofixup है। यह commit messages के आधार पर fixup commits अपने-आप बनाता है
- फ़ायदे यह हैं कि 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 को बस थोड़ा-बहुत आज़माया था, लेकिन इससे थोड़ा खालीपन-सा महसूस हुआ कि क्या इसकी फ़िक्र सिर्फ मैं ही कर रहा हूँ...