का उपयोग करते हुए gitk log
, मैं दोनों के बीच अंतर नहीं कर सका। मैं अंतर कैसे देख सकता हूं (git कमांड या कुछ टूल के साथ)?
का उपयोग करते हुए gitk log
, मैं दोनों के बीच अंतर नहीं कर सका। मैं अंतर कैसे देख सकता हूं (git कमांड या कुछ टूल के साथ)?
जवाबों:
--no-ff
झंडा रोकता है git merge
एक "तेजी से आगे" को क्रियान्वित करता है, तो उसे पता चलता है कि अपने वर्तमान से HEAD
प्रतिबद्ध आप मर्ज करने के लिए कोशिश कर रहे हैं के एक पूर्वज है। एक फास्ट-फ़ॉरवर्ड तब होता है, जब मर्ज कमिट का निर्माण करने के बजाय, git आपकी ब्रांच पॉइंटर को आने वाली कमिट पर इंगित करने के लिए ले जाता है। यह आमतौर पर तब होता है जब git pull
बिना किसी स्थानीय बदलाव के किया जाता है।
हालाँकि, कभी-कभी आप इस व्यवहार को होने से रोकना चाहते हैं, आमतौर पर क्योंकि आप एक विशिष्ट शाखा टोपोलॉजी को बनाए रखना चाहते हैं (जैसे आप विषय शाखा में विलय कर रहे हैं और आप यह सुनिश्चित करना चाहते हैं कि इतिहास पढ़ते समय यह उसी तरह दिखे)। ऐसा करने के लिए, आप --no-ff
ध्वज को पास कर सकते हैं और हमेशा फास्ट-फ़ॉरवर्डिंग के बजाय मर्ज का निर्माण git merge
करेंगे ।
इसी तरह, यदि आप स्पष्ट रूप से तेजी से अग्रेषित करने के लिए git pull
या उपयोग git merge
करना चाहते हैं, और आप जमानत करना चाहते हैं यदि यह तेजी से आगे नहीं बढ़ सकता है, तो आप --ff-only
ध्वज का उपयोग कर सकते हैं । इस तरह से आप नियमित रूप से git pull --ff-only
बिना सोचे समझे कुछ कर सकते हैं , और फिर अगर यह गलतियाँ करता है तो आप वापस जा सकते हैं और तय कर सकते हैं कि आप विलय करना चाहते हैं या रिबेट करना चाहते हैं।
gitk
या git log --graph
कि फास्ट-फॉरवर्ड मर्ज ने मर्ज कमिट नहीं बनाया है, जबकि गैर-फास्ट-फॉरवर्ड ने एक किया था।
--no-ff
मास्टर को विकसित करने या विकसित करने के लिए एक सुविधा से एक पुल अनुरोध को मर्ज करने के समान है?
--no-ff
।
यहाँ एक स्पष्ट व्याख्या और उपयोग के चित्रमय चित्रण के साथ एक साइट हैgit merge --no-ff
:
जब तक मैंने यह नहीं देखा, मैं पूरी तरह से गिट के साथ खो गया था। का उपयोग करते हुए--no-ff
करने से इतिहास की समीक्षा करने वाले किसी व्यक्ति को उस शाखा को स्पष्ट रूप से देखने की अनुमति मिलती है जिस पर आपने काम करने के लिए जाँच की थी। (यह लिंक गितुब के "नेटवर्क" विज़ुअलाइज़ेशन टूल की ओर इशारा करता है) और यहाँ चित्रण के साथ एक और बढ़िया संदर्भ है । यह संदर्भ पहले एक अच्छी तरह से git से कम परिचित लोगों पर अधिक ध्यान देने के साथ पूरक है।
यदि आप मेरे जैसे हैं, और न कि एक गुरु-गुरु, मेरा जवाब यहाँ स्थानीय फाइल सिस्टम से हटाने के बिना गिट के ट्रैकिंग से फ़ाइलों को हटाने का वर्णन करता है, जो कि खराब दस्तावेज हैं लेकिन अक्सर घटना होती है। एक और नई स्थिति में वर्तमान कोड मिल रहा है , जो अभी भी मुझे अलग करने का प्रबंधन करता है।
मैंने अपनी वेबसाइट पर एक पैकेज अपडेट किया और अपने वर्कफ़्लो को देखने के लिए मुझे अपने नोट्स पर वापस जाना पड़ा; मैंने इस उत्तर में एक उदाहरण जोड़ना उपयोगी समझा।
Git कमांड के मेरे वर्कफ़्लो:
git checkout -b contact-form
(do your work on "contact-form")
git status
git commit -am "updated form in contact module"
git checkout master
git merge --no-ff contact-form
git branch -d contact-form
git push origin master
नीचे: स्पष्टीकरण सहित वास्तविक उपयोग।
ध्यान दें: नीचे का उत्पादन छीन लिया गया है; गिट काफी क्रिया है।
$ git status
# On branch master
# Changed but not updated:
# (use "git add/rm <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: ecc/Desktop.php
# modified: ecc/Mobile.php
# deleted: ecc/ecc-config.php
# modified: ecc/readme.txt
# modified: ecc/test.php
# deleted: passthru-adapter.igs
# deleted: shop/mickey/index.php
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# ecc/upgrade.php
# ecc/webgility-config.php
# ecc/webgility-config.php.bak
# ecc/webgility-magento.php
ऊपर से 3 चीजें नोटिस करें:
1) आउटपुट में आप ईसीसी पैकेज के अपग्रेड से नई फाइलों को शामिल करने सहित बदलाव देख सकते हैं।
2) यह भी देखें कि दो फाइलें हैं ( /ecc
फ़ोल्डर में नहीं ) मैंने इस परिवर्तन से स्वतंत्र हटा दिया। इसके बजाय उन फ़ाइल को हटाने के साथ भ्रमित करने के लिएecc
, मैं cleanup
बाद में उन फ़ाइलों को हटाने को प्रतिबिंबित करने के लिए एक अलग शाखा बनाऊंगा।
3) मैंने अपने वर्कफ़्लो का पालन नहीं किया! मैं git के बारे में भूल गया, जबकि मैं ecc को फिर से काम करने की कोशिश कर रहा था।
नीचे: git commit -am "updated ecc package"
सामान्य रूप से सर्व-समावेशी करने के बजाय , मैं केवल /ecc
फ़ोल्डर में फ़ाइलों को जोड़ना चाहता था । वे हटाई गई फ़ाइलें मेरे लिए विशेष रूप से हिस्सा नहीं थीं git add
, लेकिन क्योंकि वे पहले से ही गिट में ट्रैक किए गए थे, इसलिए मुझे उन्हें इस शाखा की प्रतिबद्धताओं से हटाने की आवश्यकता है:
$ git checkout -b ecc
$ git add ecc/*
$ git reset HEAD passthru-adapter.igs
$ git reset HEAD shop/mickey/index.php
Unstaged changes after reset:
M passthru-adapter.igs
M shop/mickey/index.php
$ git commit -m "Webgility ecc desktop connector files; integrates with Quickbooks"
$ git checkout master
D passthru-adapter.igs
D shop/mickey/index.php
Switched to branch 'master'
$ git merge --no-ff ecc
$ git branch -d ecc
Deleted branch ecc (was 98269a2).
$ git push origin master
Counting objects: 22, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (14/14), done.
Writing objects: 100% (14/14), 59.00 KiB, done.
Total 14 (delta 10), reused 0 (delta 0)
To git@github.com:me/mywebsite.git
8a0d9ec..333eff5 master -> master
एक दिन में 10+ बार इस प्रक्रिया का उपयोग करने के बाद, मैंने कमांड्स को निष्पादित करने के लिए बैच स्क्रिप्ट लिखने के लिए लिया है, इसलिए मैंने git_update.sh <branch> <"commit message">
उपरोक्त चरणों को करने के लिए लगभग-उचित स्क्रिप्ट बनाई । यहाँ उस लिपि के लिए जिस्ट स्रोत है ।
इसके बजाय git commit -am
मैं "संशोधित" सूची के माध्यम से उत्पादित फ़ाइलों का चयन कर रहा हूं git status
और फिर इस स्क्रिप्ट में उन लोगों को चिपका रहा हूं । इस बारे में आया क्योंकि मैंने दर्जनों संपादन किए लेकिन बदलावों में मदद करने के लिए विभिन्न शाखा नाम चाहते थे।
--no-ff
विकल्प के साथ मर्ज करने के बाद भी सुरक्षित रूप से एक शाखा को हटा सकते हैं ?
स्पष्ट मर्ज : एक नया मर्ज प्रतिबद्ध बनाता है। (यदि आप उपयोग करते हैं तो यह आपको मिलेगा --no-ff
।)
फास्ट फॉरवर्ड मर्ज: नई प्रतिबद्धता बनाए बिना, तेजी से आगे बढ़ें:
रीबेस : एक नया आधार स्तर स्थापित करें:
स्क्वैश: क्रश या निचोड़ (कुछ) बल के साथ ताकि यह समतल हो जाए:
--no-ff
विकल्प सुनिश्चित करता एक तेजी से आगे मर्ज हो कि नहीं, और कहा कि एक नया प्रतिबद्ध वस्तु हमेशा बनाया जाएगा । यदि आप फीचर शाखाओं के इतिहास को बनाए रखना चाहते हैं तो यह वांछनीय हो सकता है।
उपरोक्त छवि में, बाईं ओर का उपयोग करने के बाद गिट इतिहास git merge --no-ff
का एक उदाहरण है और दाईं ओर का उपयोग करने का एक उदाहरण है git merge
जहां एक एफएफ मर्ज संभव था।
EDIT : इस छवि के पिछले संस्करण ने मर्ज कमिट के लिए केवल एक ही अभिभावक का संकेत दिया। मर्ज कमिट में कई पेरेंट कमिट होते हैं जो "फीचर ब्रांच" और मूल शाखा के इतिहास को बनाए रखने के लिए git का उपयोग करता है। कई मूल लिंक हरे रंग में हाइलाइट किए गए हैं।
यह एक पुराना प्रश्न है, और इसका अन्य पदों में कुछ सूक्ष्मता से उल्लेख किया गया है, लेकिन जिस स्पष्टीकरण ने मेरे लिए यह क्लिक किया है वह यह है कि गैर तेज़ फ़ॉरवर्ड मर्ज के लिए एक अलग प्रतिबद्ध की आवश्यकता होगी ।
git merge --no-ff ecc
आपको बस git log
शाखा मास्टर के लिए एक अतिरिक्त मर्ज कमिट होगा । मामले में मास्टर की तकनीकी तौर पर जरूरत नहीं होती है, जो प्रतिबद्ध ecc के प्रत्यक्ष पूर्वज की ओर इशारा करता है, लेकिन --no-ff विकल्प निर्दिष्ट करके आप उस मर्ज कमिट के निर्माण के लिए मजबूर कर रहे हैं। इसका शीर्षक होगा:Merge branch 'ecc'