खोज…
टिप्पणियों
स्क्वैशिंग क्या है?
स्क्वैशिंग कई कमिट्स लेने और उन्हें एक ही कमिट में संयोजित करने की प्रक्रिया है, जो शुरुआती कमिट्स से सभी परिवर्तनों को एनकैप्सुलेट करती है।
स्क्वाशिंग और दूरस्थ शाखाएँ
जब एक दूरस्थ शाखा पर नज़र रखने वाली शाखा पर स्क्वाश करने पर विशेष ध्यान दें; यदि आप एक ऐसी टिप्पणी को दरकिनार कर देते हैं जो पहले से ही एक दूरस्थ शाखा में धकेल दी गई है, तो दो शाखाओं को बदल दिया जाएगा, और आपको दूरस्थ शाखा पर उन परिवर्तनों को लागू करने के लिए git push -f
का उपयोग करना होगा। ध्यान रखें कि यह दूसरों को उस दूरस्थ शाखा पर नज़र रखने के लिए समस्या पैदा कर सकता है , इसलिए जब सार्वजनिक या साझा किए गए रिपॉजिटरी पर बल-धकेलने वाले स्क्वैश किए जाते हैं तो सावधानी बरती जानी चाहिए।
यदि यह परियोजना GitHub पर होस्ट की गई है, तो आप इसे Settings
- Branches
- Protected Branches
जोड़कर, कुछ शाखाओं पर, जैसे master
पर "बल धक्का सुरक्षा" सक्षम कर सकते हैं।
रिबासिंग के बिना स्क्वैश हाल के कमिट
यदि आप पिछले x
को एक एकल में स्क्वैश करना चाहते हैं, तो आप निम्न आदेशों का उपयोग कर सकते हैं:
git reset --soft HEAD~x
git commit
पिछले कमिट्स की संख्या के साथ x
को प्रतिस्थापित करना चाहते हैं जिसे आप स्क्वीस्ड कमिट में शामिल करना चाहते हैं।
मन है कि यह एक नई प्रतिबद्धता पैदा करेगा, अनिवार्य रूप से उनके लेखक, संदेश और तारीख सहित पिछले x
बारे में जानकारी भूल जाएगा। आप शायद पहले से मौजूद संदेश को कॉपी-पेस्ट करना चाहते हैं।
रिबास के दौरान स्क्वाशिंग कमिट
git rebase
दौरान कमिट किया जा सकता है। यह अनुशंसा की जाती है कि आप इस तरीके से स्क्वैश करने के प्रयास से पहले रिबासिंग को समझें।
निर्धारित करें कि आप किस से प्रतिबद्ध करना चाहते हैं, और इसके प्रतिबद्ध हैश को नोट करें।
रन
git rebase -i [commit hash]
।वैकल्पिक रूप से, आप एक प्रतिबद्ध हैश के बजाय
HEAD~4
टाइप कर सकते हैं, नवीनतम प्रतिबद्ध देखने के लिए और नवीनतम से पहले 4 और कमिट्स।संपादक में जो इस कमांड को चलाते समय खुलता है, निर्धारित करें कि कौन सा स्क्वैश करना चाहते हैं। उन पंक्तियों की शुरुआत में
pick
को बदलें जो उन्हें पिछले प्रतिबद्ध में स्क्वैश के साथsquash
करते हैं।चयन करने के बाद कि आप कौन सा स्क्वैश करना चाहते हैं, आपको एक प्रतिबद्ध संदेश लिखने के लिए प्रेरित किया जाएगा।
लॉग इन करने के लिए निर्धारित करें कि कहां से रिबास करें
> git log --oneline
612f2f7 This commit should not be squashed
d84b05d This commit should be squashed
ac60234 Yet another commit
36d15de Rebase from here
17692d1 Did some more stuff
e647334 Another Commit
2e30df6 Initial commit
> git rebase -i 36d15de
इस बिंदु पर आपकी पसंद का संपादक पॉप अप करता है जहां आप यह वर्णन कर सकते हैं कि आप कमिट्स के साथ क्या करना चाहते हैं। Git टिप्पणियों में सहायता प्रदान करता है। अगर आप इसे छोड़ देते हैं तो कुछ नहीं होगा क्योंकि हर कमिटमेंट रखा जाएगा और उनका ऑर्डर वैसा ही होगा जैसा वे रिबेट से पहले थे। इस उदाहरण में हम निम्नलिखित आदेश लागू करते हैं:
pick ac60234 Yet another commit
squash d84b05d This commit should be squashed
pick 612f2f7 This commit should not be squashed
# Rebase 36d15de..612f2f7 onto 36d15de (3 command(s))
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
कमिट मैसेज लिखने के बाद लॉग इन करें
> git log --oneline
77393eb This commit should not be squashed
e090a8c Yet another commit
36d15de Rebase from here
17692d1 Did some more stuff
e647334 Another Commit
2e30df6 Initial commit
ऑटोसक्वाश: कमिटिंग कोड जिसे आप रिबास के दौरान स्क्वैश करना चाहते हैं
निम्नलिखित इतिहास को देखते हुए, कल्पना करें कि आप एक बदलाव करते हैं जिसे आप प्रतिबद्ध bbb2222 A second commit
में स्क्वैश करना चाहते bbb2222 A second commit
:
$ git log --oneline --decorate
ccc3333 (HEAD -> master) A third commit
bbb2222 A second commit
aaa1111 A first commit
9999999 Initial commit
एक बार जब आप अपने परिवर्तन कर लेते हैं, तो आप उन्हें हमेशा की तरह अनुक्रमणिका में जोड़ सकते हैं, फिर उन --fixup
तर्क का उपयोग करके कमिट करें, --fixup
आप स्क्वैश करना चाहते हैं:
$ git add .
$ git commit --fixup bbb2222
[my-feature-branch ddd4444] fixup! A second commit
यह एक प्रतिबद्ध संदेश के साथ एक नई प्रतिबद्धता पैदा करेगा जिसे Git एक इंटरैक्टिव रिबेस के दौरान पहचान सकता है:
$ git log --oneline --decorate
ddd4444 (HEAD -> master) fixup! A second commit
ccc3333 A third commit
bbb2222 A second commit
aaa1111 A first commit
9999999 Initial commit
इसके बाद, --autosquash
तर्क के साथ एक इंटरैक्टिव रिबेस करें:
$ git rebase --autosquash --interactive HEAD~4
Git आपको प्रस्ताव देगा कि आप commit --fixup
साथ की गई commit --fixup
को सही स्थिति में स्क्वैश करें:
pick aaa1111 A first commit
pick bbb2222 A second commit
fixup ddd4444 fixup! A second commit
pick ccc3333 A third commit
प्रत्येक --autosquash
पर टाइप करने से बचने के लिए - आप डिफ़ॉल्ट रूप से इस विकल्प को सक्षम कर सकते हैं:
$ git config --global rebase.autosquash true
मर्ज के दौरान स्क्वाशिंग कमिट
आप एक शाखा द्वारा किए गए परिवर्तन को स्क्वैश करने के लिए git merge --squash
स्क्वैश का उपयोग सिंगल कमिट में कर सकते हैं। कोई वास्तविक प्रतिबद्धता नहीं बनाई जाएगी।
git merge --squash <branch>
git commit
यह git reset
का उपयोग करने के लिए कम या ज्यादा बराबर है, लेकिन अधिक सुविधाजनक है जब शामिल किए जाने वाले परिवर्तनों का एक प्रतीकात्मक नाम है। की तुलना करें:
git checkout <branch>
git reset --soft $(git merge-base master <branch>)
git commit
स्वतः खोज और फ़िक्सअप
जब परिवर्तन होते हैं, तो यह निर्दिष्ट करना संभव है कि भविष्य में कमिट को दूसरे कमिट में स्क्वैश किया जाएगा और ऐसा किया जा सकता है,
git commit --squash=[commit hash of commit to which this commit will be squashed to]
एक भी इस्तेमाल कर सकते हैं - - --fixup=[commit hash]
वैकल्पिक रूप से तय करने के लिए।
यह भी हैश के बजाय प्रतिबद्ध संदेश से शब्दों का उपयोग करना संभव है, जैसे,
git commit --squash :/things
जहां 'चीजों' शब्द के साथ सबसे हालिया प्रतिबद्ध का इस्तेमाल किया जाएगा।
ये 'संदेश' के साथ शुरू होगा 'fixup!'
या 'squash!'
बाकी कमिट मैसेज के बाद इन कमिट्स को स्क्वैश किया जाएगा।
जब --autosquash
फ्लैग का उपयोग ऑटोसक्वाश / फिक्सअप फीचर का उपयोग करने के लिए किया जाना चाहिए।