git resetसब चल रहा है HEAD, और आम तौर पर शाखा रेफरी ।
प्रश्न: वर्किंग ट्री और इंडेक्स का क्या?
जब साथ रोजगार --soft, चाल HEAD, सबसे अधिक बार शाखा रेफरी को अद्यतन करने, और केवलHEAD ।
यह इस प्रकार है commit --amend:
- यह एक नई प्रतिबद्धता नहीं बनाता है।
- यह वास्तव में किसी भी प्रतिबद्ध के लिए हेड को स्थानांतरित कर सकता है (जैसा
commit --amendकि केवल चालू नहीं है , जबकि चालू प्रतिबद्ध को फिर से करने की अनुमति है)
केवल संयोजन का यह उदाहरण मिला:
- एक क्लासिक मर्ज
- एक उप-मर्ज
सभी एक में (ऑक्टोपस, क्योंकि दो से अधिक शाखाएँ हैं) विलय।
टॉमस "थेम्पी" कार्नेकी अपने "सबट्री ऑक्टोपस मर्ज" लेख में बताते हैं :
- यदि आप किसी परियोजना को किसी अन्य परियोजना के उपनिर्देशिका में मर्ज करना चाहते हैं, और बाद में सबप्रोजेक्ट को अद्यतित रखना चाहते हैं, तो उप-मर्ज रणनीति का उपयोग किया जा सकता है। यह गिट सबमॉडल्स का एक विकल्प है।
- ऑक्टोपस मर्ज की रणनीति का उपयोग तीन या अधिक शाखाओं को मर्ज करने के लिए किया जा सकता है। सामान्य रणनीति केवल दो शाखाओं को मिला सकती है और यदि आप इससे अधिक विलय करने का प्रयास करते हैं, तो गिट स्वतः ऑक्टोपस रणनीति पर वापस आ जाता है।
समस्या यह है कि आप केवल एक रणनीति चुन सकते हैं। लेकिन मैं एक साफ इतिहास पाने के लिए दोनों को जोड़ना चाहता था जिसमें पूरे भंडार को एक नए संस्करण में अद्यतन किया जाता है।
मेरे पास एक सुपरप्रोजेक्ट है, चलो इसे कॉल करें projectA, और एक सबप्रोजेक्ट projectB, जिसे मैं एक उपनिर्देशिका में विलय कर दिया projectA।
(यह सबट्री मर्ज हिस्सा है)
मैं कुछ स्थानीय कमिट्स भी बना रहा हूं।
ProjectAनियमित रूप से अपडेट किया जाता है, projectBहर दो दिन या सप्ताह में एक नया संस्करण होता है और आमतौर पर एक विशेष संस्करण पर निर्भर करता है projectA।
जब मैं दोनों परियोजनाओं को अपडेट करने का फैसला करता हूं, तो मैं बस से नहीं खींचता projectAऔर projectB जैसा कि पूरे प्रोजेक्ट का परमाणु अद्यतन होना चाहिए, इसके लिए दो कमिट बनाएंगे ।
इसके बजाय, मैं एक एकल मर्ज कमिट बनाता हूं जो जोड़ती है projectA, projectBऔर मेरा स्थानीय कमिट करता है ।
यहाँ मुश्किल हिस्सा यह है कि यह एक ऑक्टोपस मर्ज (तीन सिर) है, लेकिन projectBइसे सबट्री रणनीति के साथ विलय करने की आवश्यकता है । तो यह है कि मैं क्या:
# Merge projectA with the default strategy:
git merge projectA/master
# Merge projectB with the subtree strategy:
git merge -s subtree projectB/master
यहाँ लेखक ने एक प्रयोग किया reset --hard, और फिर read-treeकाम करने वाले पेड़ और सूचकांक के लिए पहले दो मर्जों को बहाल करने के लिए, लेकिन यह वह जगह है जहाँ reset --softमदद कर सकता है:
मैं उन दो मर्जों को फिर से कैसे करूं , जिन्होंने काम किया है, अर्थात मेरे काम करने वाले पेड़ और सूचकांक हैं ठीक है, लेकिन उन दोनों को रिकॉर्ड करने के लिए बिना?
# Move the HEAD, and just the HEAD, two commits back!
git reset --soft HEAD@{2}
अब, हम टॉमस के समाधान को फिर से शुरू कर सकते हैं:
# Pretend that we just did an octopus merge with three heads:
echo $(git rev-parse projectA/master) > .git/MERGE_HEAD
echo $(git rev-parse projectB/master) >> .git/MERGE_HEAD
# And finally do the commit:
git commit
तो, हर बार:
- आप जो काम करते हैं (कार्यशील पेड़ और सूचकांक में) से संतुष्ट हैं
- आप उन सभी कमिटों से संतुष्ट नहीं हैं जो आपको वहाँ ले जाने के लिए ले गईं:
git reset --soft जवाब है।
git reset --soft: stackoverflow.com/questions/6869705/…