मैं किसी विशिष्ट कमिट को रिमोट पर कैसे धकेल सकता हूं, और पिछले कमिट को नहीं?


826

मैंने विभिन्न फाइलों पर कई कमिट किए हैं, लेकिन अभी तक मैं अपने रिमोट रिपॉजिटरी को केवल एक विशिष्ट कमिट पर धकेलना चाहूंगा।

क्या यह संभव है?


6
संभव डुप्लिकेट ऑफ़ गिट: पुश एक सिंगल कमिट
user151019

अच्छी तकनीक यहां देखें: stackoverflow.com/a/1789142/1579667
बेंज

जवाबों:


1086

दिए गए कमिट के माध्यम से पुश अप करने के लिए, आप लिख सकते हैं:

git push <remotename> <commit SHA>:<remotebranchname>

बशर्ते <remotebranchname>रिमोट पर पहले से मौजूद हो। (यदि ऐसा नहीं होता है, तो आप git push <remotename> <commit SHA>:refs/heads/<remotebranchname>इसे स्वतःपूर्ण करने के लिए उपयोग कर सकते हैं ।)

यदि आप पिछले कमिट्स को धक्का दिए बिना कमिटमेंट पुश करना चाहते हैं , तो आपको पहले कमिट्स git rebase -iको री-ऑर्डर करने के लिए उपयोग करना चाहिए ।


66
git push <remotename> <commit SHA>:<remotebranchname>काम करता है। ट्रिक यह git rebase -iहै कि आप जिस कमिट को पहली
कमिटमेंट के

29
एक और अच्छी टिप यह है कि आप यह सुनिश्चित करने के लिए कि आप उस रिबास-आई को करने के बाद जिस धक्का को लगाना चाहते हैं, उसके SHA की नकल करें , और इससे पहले नहीं, जैसे मैंने अभी किया :)
एस्टन

33
ध्यान रखें कि यह विफल रहता है यदि दूरस्थ शाखा अभी तक मौजूद नहीं है। शाखा बनाने के साथ किया जा सकता है git push <remotename> <commit SHA>:refs/heads/<new remote branch name>। इसके बाद, उत्तर का वर्णन करते हुए धक्का दें।
वेस Oldenbeuving

31
उदाहरण के लिए, सब कुछ पुश करने के लिए लेकिन कुछ मानक नामों के साथ अंतिम प्रतिबद्ध git push origin HEAD~1:master
आर्टलेस शोर

3
यह भी ध्यान दें, कि यदि आपने पहले ही बाद में SHA को उस दूरस्थ शाखा में धकेल दिया है, तो आपको इस पर जोर लगाने की आवश्यकता होगी। -fझंडे का इस्तेमाल करें ।
इयान वॉन

79

अन्य जवाबों में कमी के विवरण की कमी है।

git push <remotename> <commit SHA>:<remotebranchname>

किसी एकल कमिट को धक्का देगा, लेकिन उस कमिट को आपके लोकल, नॉन-पुश, कमिट्स का OLDEST होना चाहिए, टॉप, फर्स्ट, या टिप कमेंट से भ्रमित न हों, जो कि मेरी राय में सभी अस्पष्ट विवरण हैं। कमिट को अपने सबसे पुराने कमिट्स यानी अपने सबसे हाल के कमेंट से सबसे ज़्यादा ज़रूरत है। यदि यह सबसे पुराना कमिट नहीं है, तो आपके पुराने, लोकल, नॉन-पुश SHA से लेकर SHA तक सभी कमिट किए जाएंगे। कमिट्स का उपयोग फिर से करने के लिए:

git rebase -i HEAD~xxx

प्रतिबद्ध को पुन: व्यवस्थित करने के बाद आप इसे सुरक्षित रूप से दूरस्थ भंडार में धकेल सकते हैं।

संक्षेप में, मैंने उपयोग किया

git rebase -i HEAD~<number of commits to SHA>
git push origin <post-rebase SHA>:master

मेरे दूरस्थ मास्टर शाखा के लिए एक एकल प्रतिबद्ध धक्का।

संदर्भ:

  1. http://blog.dennisrobinson.name/push-only-one-commit-with-git/
  2. http://blog.dennisrobinson.name/reorder-commits-with-git/

यह सभी देखें:

  1. git: डुप्लीकेट कमिट्स आफ्टर लोकल रीबेस फॉलो द्वारा पुल
  2. git: सिंगल कमिट्स को पुश करना, रिबेट के साथ रीऑर्डर करना, डुप्लीकेट कमिट्स

3
कुछ उत्पत्ति इसकी अनुमति नहीं दे सकती, ऐसा लगता है। उदाहरण के लिए GitLab के साथ मैं देख रहा हूं कि 'आपको इस परियोजना पर संरक्षित शाखा में पुश कोड को लागू करने की अनुमति नहीं है।' जो थोड़ा अजीब है क्योंकि मुझे नहीं लगता कि मैं कुछ भी मजबूर कर रहा था, बस एक सामान्य धक्का कर रहा था। किसी भी विचार को 'मजबूर' के बिना कैसे करना है?
एड एविस

1
@ एड Shoudl को बलपूर्वक धक्का देने की कोई आवश्यकता नहीं है। लगता है जैसे आप अपने विशिष्ट git सेटअप के साथ कोई समस्या है। शायद आपने सुदूर HEAD प्रतिबद्ध अतीत में विद्रोह किया था? मुझे नहीं पता कि एक संरक्षित शाखा क्या है, एक अनुमति मुद्दे की तरह लगता है।
शमूएल

1
शमूएल - जो समझ में आता है, लेकिन गिट रिबेस -आई केवल आपको स्थानीय कमिट दिखाता है जो बाद में दूरस्थ हेड की तुलना में हैं, इसलिए मुझे नहीं पता कि मैं ऐसा कैसे कर सकता था।
एड एविस

1
सैमुअल - वास्तव में मैं अब आंशिक धक्का कर सकता हूं इसलिए मुझे नहीं पता कि क्या गलत हुआ है, लेकिन यह एक रास्ता या किसी अन्य से दूरस्थ एचईएडी से प्राप्त नहीं करने के लिए प्रतिबद्ध करने की कोशिश कर रहा है।
एड एविस

1
@ एड ने कहा कि "गिट रिबेस-आई केवल आपको स्थानीय कमिट दिखाता है जो बाद में रिमोट हेड से अधिक है", मुझे नहीं लगता कि यह सच है। मैंने परीक्षण किया और दूरस्थ HEAD के अतीत को पुन: स्थापित करने में सक्षम था।
शमूएल

25

मैं उपयोग करने का सुझाव देता हूं git rebase -i; आपके द्वारा किए गए कमिट्स के शीर्ष पर जाने के लिए कमिट करें। फिर git logविद्रोही प्रतिबद्ध के SHA प्राप्त करने के लिए उपयोग करें, इसे देखें और इसे धक्का दें। रिबेस को सुनिश्चित करना होगा कि आपके अन्य सभी कमिट अब आपके द्वारा पुश किए गए के बच्चे हैं, इसलिए भविष्य के पुश भी ठीक काम करेंगे।


3
क्या आप शायद एक पूर्ण उदाहरण जासूसी दे सकते हैं। फिर से git logकदम?
ड्रक्स

4
मान लें कि आपके पास उस क्रम में प्रतिबद्ध "A", "B", "C" संदेशों के साथ 3 अपेक्षाकृत स्वतंत्र हैं और आप "पुश" करना चाहते हैं। 'गिट रिबास -आई' को आपको और संपादक को तीनों को सूचीबद्ध करना चाहिए; B को ऊपर ले जाएं और सहेजें / छोड़ें। 'git log --pretty = oneline -n3' प्रत्येक संदेश से पहले hashes के साथ B, A, C को सूचीबद्ध करेगा, अब B अंतिम होगा। 'git चेकआउट -b अस्थायी $ hash_of_B; git push 'को उस बिंदु पर B को धकेलना चाहिए। तब आप शायद 'चेक चेक-बी मास्टर' चाहते हैं; git Branch -d temp 'अपने पिछले राज्य में वापस आने के लिए, यह मानते हुए कि आप अपने स्थानीय मास्टर शाखा में हैं; लागू के रूप में बदलें।
वाल्टर मुंड

1
+1 क्या आपने कभी रिबेट-पुश-रिबेस के बाद "गिट देवताओं का क्रोध" का सामना किया ? (क्या गलती से भी
गर्भ धारण

2
यदि आप मेरे उत्तर को ध्यान से पढ़ते हैं, तो आप देखते हैं कि पुश केवल रिबेस के बाद होता है , और रिबूट किए गए कमिट को केवल अन्य कमिट्स से ऊपर ले जाया जाता है जो अभी तक पुश नहीं किए गए थे। एक बार एक प्रतिबद्ध धक्का दिया जाता है, इसे आम तौर पर पत्थर में सेट माना जाना चाहिए; भविष्य के पुनर्जागरण में इसे अकेला छोड़ दें। यह तकनीक केवल इतनी है कि आप उन्हें धक्का देने से पहले कई स्थानीय परिवर्तनों को एक अच्छे क्रम में क्रमबद्ध कर सकते हैं। यदि आपने सही तरीके से ट्रैकिंग सेट अप की है, तो 'git rebase -i' जिसमें कोई अन्य आर्ग नहीं है, आपको यहां तक ​​कि आपको धक्का दिए गए कमिट को भी नहीं दिखाने के लिए डिफ़ॉल्ट होगा, इसलिए यह कुछ अन्य तरीकों की तुलना में दुर्घटनाओं से सुरक्षित है।
वाल्टर मुंड

21

एक विशिष्ट प्रतिबद्धता को आगे बढ़ाते हुए अन्य सभी तरीकों की तुलना में चेरी-पिक सबसे अच्छा काम करता है।

ऐसा करने का तरीका है:

एक नई शाखा बनाएँ -

git branch <new-branch>

अपनी मूल शाखा के साथ अपनी नई शाखा को अपडेट करें -

git fetch

git rebase

इन क्रियाओं से यह सुनिश्चित हो जाएगा कि आपके पास वही सामान है जो आपके मूल में है।

चेरी- sha idकि आप पुश करना चाहते हैं -

git cherry-pick <sha id of the commit>

आप sha idदौड़कर प्राप्त कर सकते हैं

git log

इसे अपने मूल में रखें -

git push

भागो gitkकि सब कुछ देखने के लिए एक ही तरह से आप चाहते थे लग रहा है।


2
git rebase -iउपरोक्त समाधानों में सुझाए गए अनुसार आदर्श समाधान का उपयोग करना होगा। चेरी पिक का उपयोग केवल तभी किया जाना चाहिए जब आप प्रतिबद्ध को डुप्लिकेट करना चाहते हैं।
विनय भार्गव

13

मेरा मानना ​​है कि आपको उस कमिट पर वापस "git revert" करना होगा और फिर इसे पुश करना होगा। या आप cherry-pickएक नई शाखा में कमिट कर सकते हैं , और उस शाखा को दूरस्थ रिपॉजिटरी पर धकेल सकते हैं। कुछ इस तरह:

git branch onecommit
git checkout onecommit
git cherry-pick 7300a6130d9447e18a931e898b64eefedea19544 # From the other branch
git push origin {branch}

9
git revert यहाँ एक बुरा विचार है - यह
has

1
@ वीसेन: आप तब सिर्फ cherry-pickवही कमिट कर सकते हैं जो आप चाहते हैं।
जोश के

4
रिवर्ट और चेरी-पिक दोनों बुरे विचार हैं। git rebase -i यहां आपका मित्र है, नीचे वाल्टर मुंड का उत्तर देखें।
निकोलस सी

3
@ निकोलस, चेरी एक बुरा विचार क्यों है?
एंटोनी

3
@ एंटोनी, आम तौर पर आप चाहते हैं कि आपकी शाखा मूल के साथ समन्वयित रहे। यदि आप चेरी-पिक करते हैं, तो आप एक कॉपी / पेस्ट कर रहे हैं, और आपको किसी बिंदु पर कॉपी नहीं की गई धक्का से निपटना होगा। यदि आप रिबेस करते हैं, तो, आप "कट और पेस्ट" करते हैं, और अपनी शाखा को रिमोट के साथ सिंक में रखें जहां आप इसे रखना चाहते हैं।
निकोलस सी

0

आप अन्य निर्देशिका में भी कर सकते हैं:

  • git क्लोन [आपका भंडार]
  • अपने मूल भंडार में .गित निर्देशिका को अधिलेखित करें। भंडार की .IT निर्देशिका के साथ अभी आपने क्लोन किया है।
  • git add और git आपका मूल काम करता है
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.