2014-11-12 4 views
23

मैं अपने git log पर निम्नलिखित स्थिति है:मेरी पिछली प्रतिबद्धता को कैसे छीनना है?

commit 111 <-- need to push it to the repository 

commit 222 <-- need to stash this one 

... 

आप देख सकते हैं, मैं केवल पिछले (पिछले) के बिना धक्का भंडार के लिए प्रतिबद्ध करने की जरूरत है।

मैं यह कैसे कर सकता हूं? git revert --soft commit_hash मेरी मदद करेगा?

धन्यवाद!

+0

क्या कोई कारण है कि आप पिछले प्रतिबद्धता को छीनना चाहते हैं? क्या आप प्रतिबद्ध 222 * में किए गए किसी भी बदलाव का उपयोग करने की योजना बना रहे हैं? – rmorrin

+0

हां, मैं निकटतम भविष्य में प्रतिबद्ध 222 में परिवर्तनों का उपयोग करना चाहता हूं। लेकिन प्रतिबद्धता 111 को धक्का देने के लिए और प्रतिबद्ध 222 के साथ इसे विलय नहीं करने के लिए, मुझे 222 प्रतिबद्ध करने के लिए किसी भी तरह की आवश्यकता है। – MadCat45

उत्तर

23

आप धक्का दिया नहीं गया है या तो अपने दूरदराज के भंडार के लिए प्रतिबद्ध है, तो आप इंटरैक्टिव रिबेसिंग का उपयोग करें 'को पुन: व्यवस्थित' करने के लिए अपने प्रतिबद्ध है और केवल (नया) सबसे हाल ही में प्रतिबद्ध के परिवर्तन भी छिपा सकते हो सकता है।

मान लिया जाये कि आप अपने वर्तमान शाखा की नोक है (अपने उदाहरण में 111 प्रतिबद्ध) की जाँच की, पर अमल करें:

git rebase -i HEAD~2 

यह आपका डिफ़ॉल्ट संपादक खुल जाएगा, पिछले 2 प्रतिबद्ध लिस्टिंग और के साथ आप प्रदान कुछ निर्देश आप यहां क्या करते हैं, इस बारे में बहुत सावधान रहें, क्योंकि आप अपने भंडार के इतिहास को प्रभावी ढंग से 'पुनः लिखने' के लिए जा रहे हैं, और अगर आप सावधान नहीं हैं तो संभावित रूप से काम खो सकते हैं (यदि आवश्यक हो तो पूरे भंडार का बैकअप लें)। मैं अनुमान किया है, उदाहरण के लिए प्रतिबद्ध

pick 222 commit to be stashed 
pick 111 commit to be pushed to remote 

# Rebase 111..222 onto 333 
# 
# Commands: 
# p, pick = use commit 
# r, reword = use commit, but edit the commit message 
# e, edit = use commit, but stop for amending 
# s, squash = use commit, but meld into previous commit 
# f, fixup = like "squash", but discard this commit's log message 
# x, exec = run command (the rest of the line) using shell 
# 
# These lines can be re-ordered; they are executed from top to bottom. 
# 
# If you remove a line here THAT COMMIT WILL BE LOST. 
# 
# However, if you remove everything, the rebase will be aborted. 
# 
# Note that empty commits are commented out 

पुन: व्यवस्थित करें दो प्रतिबद्ध नीचे हैश/खिताब (वे सूचीबद्ध हैं सबसे पुराने => सबसे नया) इस तरह:

pick 111 commit to be pushed to remote 
pick 222 commit to be stashed 

सहेजें और बाहर निकलें, और इस बिंदु Git पर होगा आपके द्वारा बदले गए दो कामों को फिर से लिखने के लिए कुछ प्रसंस्करण करें। किसी भी मुद्दे को मानते हुए, आपको अपने दो परिवर्तनों के क्रम को उलटना चाहिए था। इसकी पुष्टि git log --pretty=oneline -5 से की जा सकती है जो नवीनतम-पहले आउटपुट करेगा।

इस बिंदु पर, आप बस एक नरम रीसेट सबसे हाल ही में पर प्रतिबद्ध कर सकते हैं, और अपने काम में परिवर्तन भी छिपा सकते:

git reset --soft HEAD~1 
git stash 

ऐसा नहीं है कि इस विकल्प केवल यदि आप नहीं है वास्तव में व्यवहार्य है उल्लेख करने के लिए महत्वपूर्ण है पहले आपके किसी भी बदलाव को आपके रिमोट पर धक्का दिया था, अन्यथा यह भंडार का उपयोग कर हर किसी के लिए समस्याएं पैदा कर सकता है।

3

तो यह मेरे थे, मैं किसी भी जोखिम भरा संशोधन संपादन से बच जाएंगे और निम्न कार्य के बजाय:

  1. मूल रूप से एक बुकमार्क के रूप में, SHA जहां 222 हामी भर दी थी पर एक नई शाखा बनाएँ।

  2. मुख्य शाखा में वापस स्विच करें। इसमें, 222 प्रतिबद्धता वापस करें।

  3. किए गए सभी कामों को पुश करें, जो केवल 111 को दबाएंगे, क्योंकि 222 को वापस कर दिया गया था।

  4. यदि आवश्यक हो तो चरण # 1 से शाखा पर कार्य करें। इसे अद्यतित रखने के लिए आवश्यक ट्रंक से विलय करें। मैं छेड़छाड़ से परेशान नहीं होगा।

जब 222 में किए गए परिवर्तनों में बदलाव के लिए समय है, तो उस शाखा को ट्रंक में विलय किया जा सकता है।

-2

यह मेरे लिए काम करता है;

  1. वर्तमान शाखा की उत्पत्ति पर प्रतिबद्धता पर चेकआउट।
  2. इस प्रतिबद्धता से नई शाखा बनाएं।
  3. नई शाखा में चेकआउट।
  4. नई शाखा में छेड़छाड़ के लिए कोड के साथ शाखा मर्ज करें।
  5. नई शाखा में सॉफ्ट रीसेट करें।
  6. अपना लक्ष्य कोड छूएं।
  7. नई शाखा हटाएं।

मैं इस के लिए SourceTree की तरह कुछ उपयोग करने की सलाह देता हूं।

संबंधित मुद्दे