रीबेज सिंगल गिट कमिटमेंट


116

वहाँ एक शाखा से किसी अन्य शाखा पर एक प्रतिबद्ध करने के लिए एक तरीका है?

मेरे पास यह शाखा संरचना है:

-- -- -- -- -- (Master)
            \
              -- -- -- -- -- XX (Feature-branch)

मैं सिर्फ इतना करना चाहता हूं कि Feature-branchमास्टर और रोलबैक की अंतिम प्रतिबद्धता को कमिट कर दूं Feature-branch

-- -- -- -- -- XX (Master)
            \
              -- -- -- -- -- (Feature-branch)

मैं उसको कैसे करू?


3
यदि आप किसी भी कमिट को रिबेट कर सकते हैं तो आप किसी एक को रिबास करने के बारे में क्यों पूछते हैं? यदि मैं एसओ में प्रश्न पूछ सकता हूं, तो मैं पूछूंगा कि रिबासिंग (एक सिंगल कमिट) और चेरी-पिकिंग में क्या अंतर है।
वैल

9
क्योंकि मुझे नहीं पता था कि चेरी-पिकिंग अस्तित्व में है, और मैं "फ़ाफ के बारे में शाखा", "विभिन्न शाखा पर फिक्स के लिए अनुरोध प्राप्त करें", "इसे ठीक करें", "गलत शाखा के लिए प्रतिबद्ध", "डी'ओएच!" पर्याप्त है कि सवाल पूछना उपयोगी था।
केविन मेयर

जवाबों:


116

आप xx को मास्टर करने के लिए चुन सकते हैं।

git checkout master
git cherry-pick <commit ID of XX>

और git रिसेट के साथ फीचर ब्रांच से लास्ट कमिट को हटा दें।

git checkout Feature-branch
git reset --hard HEAD^

64
विशेष रूप से 'git rebase ...' नामक एक प्रश्न का उत्तर चेरी-पिक से क्या होता है, जो एक पूरी तरह से अलग अवधारणा है और कभी-कभी इसे अशुद्ध माना जाता है?
बॉन्डैक्स

1
यकीन नहीं होता कि क्या यह प्रासंगिक है, लेकिन जिस प्रतिबद्ध को मैं रीबेस करना चाहता था, उसके पास कुछ फाइलें थीं जो स्थानांतरित हो गईं, और cherry-pickउन्हें ऐसा प्रतीत हुआ जैसे उन्हें पुराने स्थान से हटा दिया गया था और नए स्थान पर बनाया गया था। मुझे लगता है कि रिबास ने इस बात का ध्यान रखा होगा, लेकिन अब तक मैंने ऊपर की तरफ धकेल दिया है, इसलिए मैं इसका परीक्षण नहीं कर सकता। किसी भी मामले में, यदि आपके पास समान स्थिति है तो सावधान रहें।
वाल्डिएरियस

ध्यान दें: Feature-branchआपको अपने मूल में परिवर्तन करने के लिए, git push -f origin Feature-branchक्योंकि Feature-branchअब आपको 1 के पीछे 1 प्रतिबद्ध माना जाएगा origin/Feature-branch
जोजो

1
इस समाधान और चार्ल्सब द्वारा एक के बीच व्यावहारिक अंतर क्या है ?
Lii

96
git rebase --onto master branch~1 branch 

यह कहता है "मास्टर शाखा की नोक पर अंतिम-पहले-शाखा और शाखा (यानी, XX प्रतिबद्ध) के बीच आवागमन की सीमा को फिर से भरना"

इसके बाद ऑपरेशन branchटिप को कमिट किया गया XX, इसलिए आप इसे वापस सेट करना चाहते हैं

git checkout branch
git reset --hard branch@{1}^

जो कहता है "शाखा की स्थिति को अपनी पिछली स्थिति से पहले प्रतिबद्ध करें"

तो एक चेरी लेने के लिए एक सरल उपाय है ...


5
यह मेरे लिए काम नहीं करता है, मैं XX से पहले कमिट खो देता हूं और शाखा को एक ही कमिट के साथ मास्टर करने के लिए रिबूट किया जाता है, लेकिन मैंने --ontoपहले कभी इस्तेमाल नहीं किया इसलिए मैं कुछ गलत कर सकता हूं। BTW ओपी ने कहा कि रिबास लेकिन ऐसा लगता है जैसे वह एक चेरी-पिक करना चाहता है।
tewe

1
मेरी त्रुटि, रिबास वास्तव में मास्टर पर शाखा को स्थानांतरित करता है, इसे रीसेट करना होगा
चार्ल्सब

1
इस समाधान और एक के बाद एक के बीच व्यावहारिक अंतर क्या है ?
Lii

1
@ एलआईआई केवल मैं देख सकता हूं कि यह 4 के बजाय 3 चरणों का उपयोग करता है
चार्ल्स

52

यह वास्तव में करने के लिए बहुत आसान है। समाधान यह है कि आप एक इंटरएक्टिव रिबेस और "ड्रॉप" करें जो आप उन सभी कमेंट्स को रिबेज में शामिल नहीं करना चाहते हैं।

git rebase -i <target_branch>target_branchवह शाखा कहां है जिस पर आप छूट देना चाहते हैं

फिर आप उस फ़ाइल को संपादित करेंगे जो खोली गई है और pickजो आप चाहते हैं और drop(या dसंक्षेप में) वह सभी कमिट्स जो आप साथ नहीं लाना चाहते हैं।


6
IMO एक बेहतर समाधान है, और यह वास्तव में प्रश्न को संबोधित करता है।
गेब्रियलऑशिरो

यह स्वीकृत समाधान होना चाहिए कि यह कितना सामान्य, सहज और संक्षिप्त है।
पाब्लो एरियस

1

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

  * a8f9182 (HEAD -> उत्पादन) उत्पादन विन्यास
  | * daa18b7 (प्री) प्रीप्रोडक्शन कॉन्फ़िगरेशन
  | /  
  | * d365f5f (स्थानीय) स्थानीय विन्यास
  | /  
  * 27d2835 (देव) अद्भुत नई सुविधा है जो दुनिया को बचाएगा
* 56d2467 (मास्टर) परियोजना के लिए कला के उबाऊ राज्य
| /

कि मैं इसके लिए एक नई कमांड बनाता हूं:

$ बिल्ली ~ / बिन / गिट-रीबेशेशोट 
COMMIT = $ 1
Dest = $ {2: -HEAD}
git रीबेज़ $ {COMMIT} ^ $ {COMMIT} - डोंटो $ DEST

आम तौर पर आप उस कमांड के लिए स्वतः पूर्ण शाखा नाम चाहते हैं, इसलिए इसे इस फ़ंक्शन (.bashrc या .ile में जोड़कर) सोर्सिंग जोड़ें:

_it_rebaseshot () 
{ 
    __gitcomp_nl "$ (__ git_refs)"
}

git स्वतः पूर्ण इसके लिए खोज करेगा

आप इस आदेश का उपयोग इस तरह कर सकते हैं:

# rebase config on prepro on actual HEAD
$ git rebaseshot prepro 
# rebase config on local onto dev
$ git rebaseshot local dev
# rebase production config on master
$ git rebaseshot pro master

जब आप सुविधाओं को सही ढंग से विभाजित करते हैं, तो कब्जे अंतहीन हैं।

* a8f9182 (HEAD -> पोस्टग्रेज) BBDD कॉन्फिग
* a8f9182 (स्थानीय) स्थानीय विन्यास
* a8f9182 (डिबग) लॉग लेवल कॉन्फिग
* a8f9182 (देव) नई सुविधा
|

मुझे लगता है कि यह क्या है रजाई लोग क्या करना चाहते।

जो भी श / रेफरी आपको प्रदान करेगा उसके साथ यह कमांड किसी भी तरह काम करेगा:

$ git rebaseshot <Feature branch> master
$ git rebaseshot <commit of XX> master

//, क्या आप किसी भी परियोजना से जुड़ सकते हैं जहां हम इसे कार्रवाई में देख सकते हैं?
नाथन बसानी

इसकी प्रकृति के लिए, स्थानीय रेपो के बाहर पुन: पेश करने के लिए उपलब्ध शाखाएं शुरू नहीं की जाती हैं। बस मास्टर (लॉग स्तर, डेटाबेस कनेक्शन, कॉन्फ़िगरेशन) के ऊपर कई शाखाएं बनाएं और उनके बीच कमांड का उपयोग करें। प्रभाव देखने के लिए सादा है।
एल्बफैन

//, मैं कुछ समस्याओं में भाग गया। मैं इसे फिर से कोशिश करूँगा।
नाथन बसानी

0

यहाँ एक और विकल्प है:

  1. सुनिश्चित करें कि आपके पास सुविधा शाखा की एक प्रति के साथ एक रिमोट है
  2. स्थानीय सुविधा शाखा हटाएं
  3. पुरानी सुविधा शाखा के समान नाम से एक नई शाखा बनाएं और चेकआउट करें जिसे आपने अभी-अभी मास्टर से हटाया था
  4. चेरी, जिस शाखा को आप चाहते हैं उसकी रिमोट कॉपी से एक कमिटमेंट चुनें।

कमैंट्स जैसे दिखते हैं:

git checkout Feature-branch
git push -u origin HEAD
git checkout master
git branch -D Feature-branch
git checkout -b Feature-branch
git cherry-pick HASH-OF-XX

यह एक रिबांड कमांड नहीं है, लेकिन यह आत्मा में एक रिबेस है।

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