16 पॉइंट द्वारा GN⁺ 2024-09-27 | 2 टिप्पणियां | WhatsApp पर शेयर करें
  • 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 चलाने के बजाय यह करें:
    1. git add $FILES_YOU_FIXED
    2. 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 उपलब्ध हैं

उपयोग विधि

  1. absorb करने वाले changes को git add से stage करें
  2. git absorb चलाएँ
  3. यदि परिणाम संतोषजनक हो तो git rebase -i --autosquash चलाएँ
  4. यदि संतोषजनक न हो तो 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 टिप्पणियां

 
GN⁺ 2024-09-27
Hacker News टिप्पणियाँ
  • git absorb का उपयोग करने वाले लोगों का मानना है कि यह टूल बहुत उपयोगी है

    • जब कई commits वाला PR CI में fail हो जाता है, तो git absorb अपने-आप सही commit ढूंढ देता है
    • यह manually commit ढूंढने की झंझट कम कर देता है
    • false positive लगभग नहीं होते, और अगर false negative हो तो उसे manually संभाला जा सकता है
    • कुछ लोगों की राय है कि PR एक ही commit होना चाहिए, लेकिन हमेशा ऐसा नहीं होता
    • GitHub पर logically छोटे commits को प्राथमिकता दी जाती है
  • git commit --fixup के लिए alias का उपयोग करके संतुष्ट हैं

    • यह current branch के commits दिखाता है और fzf के जरिए चुनने देता है
    • चुने गए commit के आधार पर fixup commit बना देता है
  • git absorb का इस्तेमाल किया, लेकिन यह अक्सर गलत parent commit चुन लेता था

    • manually commit ढूंढना ज्यादा बेहतर लगा
    • commit history पर पूरा control रखना पसंद है
    • यह टूल कुछ ज्यादा ही magic जैसा लगता है
  • git --fixup और git rebase --autosquash का इस्तेमाल पहले नहीं किया, लेकिन ये उपयोगी लगते हैं

    • git-absorb एक कदम आगे जाता हुआ लगता है
    • README से यह साफ नहीं है कि कुछ खास स्थितियों में यह ठीक-ठीक क्या करेगा
  • commits और history को बदलने को लेकर संदेह है

    • गलती सुधारकर नया commit बनाना और आगे बढ़ते रहना बेहतर है
  • magit का उपयोग करके आसानी से fixup commit बनाए जा सकते हैं

    • Emacs इस्तेमाल न करते हों तब भी सिर्फ magit के लिए उसे बनाए रखना सार्थक है
    • vscode उपयोगकर्ताओं के लिए Edamagit अच्छा है
  • git commit --fixup और git rebase --autosquash के बारे में पता चला

    • interactive git rebase उनका पसंदीदा Git टूल है
    • यह पूरी तरह logical atomic commits बनाने में मदद करता है
    • लेकिन इस तरह की history editing कभी-कभी उल्टा असर भी डाल सकती है
  • git rebase -i कई तरह की ज़रूरतें पूरी करता है

    • squash, fixup, reword, delete commits को interactive तरीके से किया जा सकता है
    • Git इस्तेमाल करने वाले हर व्यक्ति को यह सीखना चाहिए
  • बहुत ज़्यादा साफ-सुथरी commit history पर अटक जाने की बात समझ नहीं आती

    • क्या लोग commit history को सच में इतनी बार विस्तार से देखते हैं, इस पर सवाल है
  • आखिरी 10 commits में से बिना conflict वाले संशोधित किए जा सकने वाले commit को चुनने की बात समझ नहीं आती

    • अक्सर conflicts सुलझाते समय fixup^ का काफी उपयोग करते हैं
    • target commit को अपने-आप चुनने पर भरोसा नहीं है
 
roxie 2025-05-18
  • मैं यह नहीं समझ पाता कि लोग बेहद साफ-सुथरी commit history को लेकर इतने जुनूनी क्यों होते हैं
    • यह भी सवाल है कि क्या लोग commit history को इतनी बार और इतने विस्तार से देखते भी हैं

यह टिप्पणी थोड़ा चुभ गई। मैंने fixup / autosquash को बस थोड़ा-बहुत आज़माया था, लेकिन इससे थोड़ा खालीपन-सा महसूस हुआ कि क्या इसकी फ़िक्र सिर्फ मैं ही कर रहा हूँ...