क्या मैं तेजी से फॉरवर्डिंग को डिफ़ॉल्ट रूप से git में बंद कर सकता हूं?


263

मैं वास्तव में कभी ऐसे समय के बारे में नहीं सोच सकता जब मैं इसके git mergeबजाय प्रयोग करूं git rebaseऔर एक कमिट शो नहीं करना चाहता। क्या डिफ़ॉल्ट रूप से तेजी से अग्रेषण करने के लिए गिट कॉन्फ़िगर करने का कोई तरीका है? तथ्य यह है कि एक --ffविकल्प है कि इसका मतलब यह है कि वहाँ एक रास्ता है, लेकिन मैं इसे दस्तावेज़ में खोजने के लिए प्रतीत नहीं कर सकते हैं।


3
मैं mergeशाखाओं के लिए हर समय उपयोग करता हूं जब किसी ने अपने रिमोट को बंद नहीं किया है ताकि उन्हें जल्दी से आगे बढ़ाया जा सके। यह ऐसा करने का सबसे सरल और सुरक्षित तरीका लगता है। मैं उत्सुक हूं, आपके पास स्पष्ट रूप से एक उपयोग मामला है। आप कभी भी एक मर्ज कमेटी बनाना चाहेंगे जहाँ शाखा के एक तरफ कोई कमिट नहीं है?
सीबी बेली

12
मैं शाखाओं का उपयोग कमिट्स के एक तार्किक समूह बनाने के लिए करता हूं। इसलिए अगर मैं मर्ज करता हूं, तो यह मूल रूप से यह कहने का एक तरीका है "ये कमिट्स एक साथ चलते हैं"। आप इसे लगभग एक गरीब आदमी के इंटरैक्टिव रिबेस और स्क्वैश के रूप में सोच सकते हैं। :-)
जेसन बेकर

13
तेजी से अग्रेषण बंद करने से, अत्यंत उपयोगी है विशेष रूप से जब की तरह एक मॉडल का अनुसरण एक सफल Git शाखाओं में मॉडल
steinybot

2
कृपया इसके लिए स्वीकृत उत्तर को एरिक प्लैटन के उत्तर में परिवर्तित करें stackoverflow.com/a/6810687/3408 - मैंने स्वीकार किए गए उत्तर में कदम उठाए, तब महसूस किया कि यह केवल वर्तमान शाखा में मास्टर शाखा के लिए था, जो मूर्खतापूर्ण है।
rjmunro

3
@ jpmc26 प्रत्येक अपने स्वयं के अनुमान लगाता है। मैं उस लेख से असहमत हूं। एक मर्ज कमिट के दो माता-पिता को ढूंढना मुश्किल नहीं है और आपको बताता है कि बदलाव क्या थे। फिर आप उन बदलावों को ले सकते हैं और कुछ अन्य शाखा पर "रिबेस" कर सकते हैं। फ्लैट मॉडल के साथ आपको मैन्युअल रूप से ढूंढना और चेरी पिक करना होगा। हम शाखाओं में बँधना चुनते हैं। निश्चित रूप से यह जटिल है जब पूरे पेड़ को देखते हुए लेकिन यह वास्तविकता है, समानांतर में होने वाले कई परिवर्तन। सब कुछ चपटा करना बस छुपाता है कि वास्तव में क्या हुआ।
स्टेनिबोट

जवाबों:


282

हाँ, वहाँ है --no-ff। आप प्रति शाखा में मर्ज विकल्प कॉन्फ़िगर कर सकते हैं, जैसे

git config branch.master.mergeoptions  "--no-ff"

अपनी $(REPO)/.git/configफ़ाइल में निम्न जोड़ता है :

[branch "master"]
    mergeoptions = --no-ff

फुटनोट: अपने अनुभव की बात करते हुए, मैंने अंततः पाया कि फास्ट-फॉरवर्ड को बंद करना ज्यादातर गिट न्यूकमर्स के लिए मददगार था - हालांकि एक बार जब वर्कफ़्लोज़ और कॉन्सेप्ट के लिए आपका मन बहलने लगता है, तो निश्चित रूप से आप अपने लॉग ग्राफ को बेकार के टन के साथ धुंधला होने से बचना चाहते हैं - विलय Remote ..blarf 'टाइप का काम करता है।

फुटनोट 2, एक दशक बाद: नीचे दिए गए अन्य उत्तर अधिक आधुनिक विन्यास विकल्प प्रदान करते हैं, लेकिन वास्तव में, आप शायद इस दिन और उम्र में चूक (यानी जब भी संभव हो) तेजी से आगे रहना चाहते हैं, क्योंकि खाली मर्ज-कमिट वास्तव में ही होता है इतिहास को और अधिक कठिन बनाना।


142
सीखने की ललक पहाड़ की चढ़ाई जैसी है; लेकिन छोटी चट्टानों के साथ शुरू करने और कठिन लोगों की प्रगति के बजाय, गिट आपको एक ही पहाड़ पर बार-बार चढ़ता है, केवल हर बार अलग-अलग ऊंचाइयों पर गिरने के लिए, हर बार बस आश्चर्यचकित रूप से कि जीवन रेखा संलग्न नहीं थी।
कोन

12
@ थोमस: हाँ; git pullहै git fetch+ git merge
मिशेल टाइली

9
यह अच्छा लग रहा है, लेकिन क्या हर शाखा के लिए इसे स्थापित करने के बजाय सभी शाखाओं के लिए विश्व स्तर पर ऐसा करने का कोई तरीका है?
bwinton

33
ड्रेगन से सावधान रहें। यह विकल्प खतरनाक है, जैसा कि @Thomas ने कहा ... हर जीट पुल मर्ज कमिट बनाता है। git pull --ff, git config में मर्जटॉप = no-ff को ओवरराइड नहीं करता है।
डालीबोर फिलस

15
अगर मैं सिर्फ टाइप करके थक गया हूँ तो क्या होगा git merge --no-ff (branchname)? और मैं git pullकार्य करना चाहता हूं क्योंकि यह हमेशा होता है?
डॉगवॉयर

341

ऐसा लगता है कि धागे में अभी भी एक लंबित प्रश्न है: इसे विश्व स्तर पर कैसे किया जाए (यानी सभी शाखाओं के लिए)? रिकॉर्ड के लिए, हम निम्नलिखित का उपयोग कर सकते हैं:

git config --add merge.ff false

... इसे वर्तमान रिपॉजिटरी में सभी शाखाओं पर लागू करने के लिए। सभी रिपॉजिटरी में सभी शाखाओं पर इसे लागू करने के लिए जहां किसी ने इसे विकल्प के बिना नहीं चलाया है --global(स्थानीय सेटिंग वैश्विक से अधिक है) इसे चलाएं:

git config --global --add merge.ff false

से प्रलेखन :

merge.ff
डिफ़ॉल्ट रूप से, गिट एक अतिरिक्त मर्ज कमिट नहीं बनाता है जब एक कमेट को मर्ज करता है जो कि वर्तमान कमेट का वंशज है। इसके बजाय, वर्तमान शाखा की नोक तेजी से अग्रेषित की जाती है। जब इसे गलत पर सेट किया जाता है, तो यह वैरिएबल ऐसे मामले में एक अतिरिक्त मर्ज कमिट बनाने के लिए कहता है ( --no-ffकमांड लाइन से विकल्प देने के बराबर )। जब केवल सेट किया जाता है, तो केवल ऐसे फास्ट-फ़ॉरवर्ड मर्ज की अनुमति होती है ( --ff-onlyकमांड लाइन से विकल्प देने के बराबर )।


18
नोट: merge.ffGit 1.7.6 में पेश किया गया था। यह पुराने संस्करणों में प्रभावी नहीं है।
क्रिस जॉन्सन

2
Git 1.7.6 का उपयोग करने वाले लोगों के लिए, यह सबसे अच्छा और सरल उपाय है।
रयान लूनी

22
मैं एक साथ एक उपनाम के साथ प्रयोग कर रहा हूँpuff = "pull --ff --ff-only"
10

11
Theres यह भी है (अब, git-scm.com/docs/git-config देखें ) ऑप्शन पुल .ff जिसे केवल सेट किया जा सकता है , जो उपनाम के समान ही करेगा।
जोतो डेम

1
साभार, @jotomo यह सुविधा Git v2.0.0 (प्रतिबद्ध b814da891e8261b909fc5d9fb07b4e8b13989c2d से) उपलब्ध है।
एरिक प्लटन

14

उत्तर के धागे को पढ़ना मैंने निम्नलिखित दो विकल्पों का उपयोग करके समाप्त किया

git config --global pull.ff only # Disallows non ff merges on pull. Overrides merge.ff when pulling
git config --global merge.ff false # even create extra merge commit when fast forward merge would be possible

केवल शिथिल रूप से संबंधित मैंने यह भी पाया है कि खींचने के दौरान परेशानी से बचा जाता है

git config --global pull.rebase true # set up pull to rebase instead of merge

1
git config --global pull.rebase true # नोटिस 'ट्रू' लाइन के अंत में
zowers 8

धन्यवाद @zowers मैंने यह तय किया है
bastian
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.