जवाबों:
दोनों git merge --squash
और git rebase --interactive
"कुचल" एक प्रतिबद्ध उत्पादन कर सकते हैं।
लेकिन वे विभिन्न उद्देश्यों की पूर्ति करते हैं।
किसी भी मर्ज संबंध को चिह्नित किए बिना, गंतव्य शाखा पर एक स्क्वैश प्रतिबद्ध का उत्पादन करेगा।
(नोट: यह तुरंत एक प्रतिबद्ध उत्पादन नहीं करता है: आपको एक अतिरिक्त की आवश्यकता है git commit -m "squash branch"
)
यह उपयोगी है यदि आप स्रोत शाखा को पूरी तरह से फेंकना चाहते हैं, तो जा रहे हैं (एसओए प्रश्न से लिया गया स्कीमा ):
git checkout stable
X stable
/
a---b---c---d---e---f---g tmp
सेवा:
git merge --squash tmp
git commit -m "squash tmp"
X-------------------G stable
/
a---b---c---d---e---f---g tmp
और फिर tmp
शाखा को हटाना ।
नोट: git merge
एक --commit
विकल्प है , लेकिन इसका उपयोग नहीं किया जा सकता है --squash
। इसका उपयोग और एक साथ करना कभी संभव नहीं था ।
Git 2.22.1 (Q3 2019) के बाद से, यह असंगति स्पष्ट कर दी गई है:--commit
--squash
विशाल वर्मा ( ) द्वारा देखें 1d14d0c (24 मई 2019 ) । (द्वारा विलय Junio सी Hamano - - में प्रतिबद्ध 33f2790 , 25 जुला 2019)reloadbrain
gitster
merge
: के--commit
साथ मना कर दिया--squash
पहले, जब
--squash
आपूर्ति की गई थी, 'option_commit
' चुपचाप गिरा दिया गया था। यह--commit
स्पष्ट रूप से उपयोग करके स्क्वैश के नो-कम व्यवहार को ओवरराइड करने की कोशिश करने वाले उपयोगकर्ता के लिए आश्चर्यजनक हो सकता है ।
git/git
builtin/merge.c#cmd_merge()
अब शामिल हैं:
if (option_commit > 0)
die(_("You cannot combine --squash with --commit."));
एक नए आधार पर आपके कुछ या सभी हिट्स को रिप्लाई करता है, जिससे आप सीधे स्क्वैश कर सकते हैं (या हाल ही में "ठीक करें", इस SO प्रश्न को देखें ), सीधे जा रहे हैं:
git checkout tmp
git rebase -i stable
stable
X-------------------G tmp
/
a---b
यदि आप सभी प्रकार के स्क्वैश का चयन करते हैं tmp
(लेकिन, इसके विपरीत merge --squash
, आप कुछ को फिर से खेलना और दूसरों को स्क्वैश करना चुन सकते हैं)।
तो मतभेद हैं:
squash
अपनी स्रोत शाखा ( tmp
यहां) को नहीं छूता है और जहां आप चाहते हैं, वहां एक एकल प्रतिबद्ध बनाता है।rebase
आपको उसी स्रोत शाखा (अभी भी tmp
) पर जाने की अनुमति देता है :
tmp
एक साथ स्केम किए गए कमिट्स का प्रतिनिधित्व करते हैं।
G
से समान सामग्री का प्रतिनिधित्व नहीं करेगा । g
X
git merge --no-ff temp
इसके बजाय है git merge --squash temp
, तो आपको एक गड़बड़ इतिहास मिलता है, लेकिन आप यह भी कर सकते हैं जैसे कि git revert e
, बहुत आसानी से। यह एक गड़बड़, लेकिन ईमानदार और व्यावहारिक इतिहास है, और मुख्य शाखा अभी भी काफी साफ बनी हुई है।
git bisect
या git blame
जब बहुत बार उपयोग किया जाता है (जैसा कि git pull --no-ff
: stackoverflow.com/questions/12798767/… )। वैसे भी एक दृष्टिकोण नहीं है, यही वजह है कि इस लेख में तीन का वर्णन किया गया है ( stackoverflow.com/questions/9107861/… )
मर्ज करता है: अपनी शाखा के सभी कमेंट्स को बरकरार रखता है और बेस ब्रांच पर कमिट्स के साथ उन्हें इंटरलेक्ट करता है
मर्ज स्क्वैश: परिवर्तनों को बरकरार रखता है लेकिन इतिहास से अलग व्यक्ति को छोड़ देता है
Rebase: यह मास्टर शाखा की नोक पर शुरू करने के लिए पूरी सुविधा शाखा को स्थानांतरित करता है, प्रभावी रूप से मास्टर में सभी नए कमेंट्स को शामिल करता है
यहाँ पर और अधिक
मर्ज स्क्वाश एक पेड़ (कमिट्स का एक क्रम) को एक ही प्रतिबद्ध में मिला देता है। यही है, यह n में किए गए सभी परिवर्तनों को एक ही कमिट में स्क्वैश करता है।
रिबासिंग फिर से आधार है, यानी एक पेड़ के लिए एक नया आधार (माता-पिता की प्रतिबद्धता) चुनना। हो सकता है कि इसके लिए व्यापारिक शब्द अधिक स्पष्ट हो: वे इसे प्रत्यारोपण कहते हैं क्योंकि यह सिर्फ इतना है: एक पेड़ के लिए एक नई जमीन (माता-पिता की प्रतिबद्धता, जड़) चुनना।
इंटरेक्टिव रिबेस करने के दौरान, आपको स्क्वैश चुनने, संपादित करने या छोड़ने के विकल्प दिए जाते हैं।
उम्मीद है कि स्पष्ट था!
निम्नलिखित उदाहरण से शुरू करते हैं:
अब हमारे पास सुविधा शाखा के परिवर्तन को मास्टर शाखा में विलय करने के लिए 3 विकल्प हैं :
मर्ज करता है
सभी सुविधा शाखा के इतिहास को जारी रखेंगे और उन्हें मास्टर शाखा में स्थानांतरित
करेंगे। अतिरिक्त डमी प्रतिबद्ध करेंगे।
रिबास और मर्ज
करेंगे सभी मास्टर शाखा के सामने सुविधा शाखा के इतिहास को
जोड़ेंगे अतिरिक्त डमी प्रतिबद्ध नहीं जोड़ेंगे।
स्क्वैश और मर्ज
विल समूह के सभी सुविधा शाखा में प्रतिबद्ध एक प्रतिबद्ध तो संलग्न इसे के सामने मास्टर शाखा
जोड़ने होगा अतिरिक्त डमी प्रतिबद्ध।
आप नीचे पा सकते हैं कि मास्टर शाखा उनमें से प्रत्येक के बाद कैसे दिखेगी ।
सभी मामलों में:
हम सुविधा शाखा को सुरक्षित रूप से हटा सकते हैं ।
G
एकc--d--e--f--g
साथ स्क्वैश है?