एक अलग सिर में किए गए प्रतिबद्ध के साथ क्या करना है


279

Git का उपयोग करके मैंने कुछ इस तरह बनाया

git clone
git checkout {a rev number tree rev before} (here I started to be in a detached head state)
//hacking
git commit
//hacking
git commit
(some commit where made on origin/master)
git pull (which does complete because there was some error due to the fact that I'm no more on master)

क्योंकि इसने मुझे कहा कि मैं तब भी प्रतिबद्ध रह सकता हूं जब एक अलग राज्य में, मैंने ऐसा किया। लेकिन अब मैं अपनी अलग हो चुकी हेड ब्रांच और मेरी लोकल मास्टर ब्रांच को मिलाना चाहता हूं, और फिर अपने मूल / मास्टर में बदलावों का गुच्छा आगे बढ़ा दूंगा।

तो मेरा सवाल यह है कि मैं अपनी वास्तविक स्थिति के साथ मास्टर शाखा का विलय कैसे कर सकता हूं (अलग सिर)



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

इस समय मैं अपने आप को प्रदान नहीं कर सकता लेकिन अगर आप इसे प्रदान कर सकते हैं, तो मुझे यहाँ देखकर खुशी होगी। यहां तक ​​कि अगर यह एक ड्रॉ होना चाहिए, तो यह स्पष्ट कर देगा
बेंजीन

जवाबों:


476

एक शाखा बनाएं जहां आप हैं, फिर मास्टर पर जाएं और इसे मर्ज करें:

git branch my-temporary-work
git checkout master
git merge my-temporary-work

12
भविष्य में सिर काटने से कैसे बचें?
ycomp

मैंने ऐसा किया और खुद को 5 कमिट द्वारा मूल से आगे पाया। उस मामले में आप बस धक्का मूल उत्पत्ति करते हैं?
विनेमुका

5
अजीब है, मैं "पहले से ही अद्यतित हूं।" जब मेरे अस्थायी-काम का विलय हो रहा है
रॉबर्ट सिनक्लेयर

10
"Git Branch -d my-अस्थायी-काम" के साथ मेरे अस्थायी-काम को हटाने के लिए मत भूलना
कैप्टन लेप्टन

5
@ycomp "डिटैक्ड हेड" तब होता है जब आप एक पुरानी कमिट की फाइलों को एडिट करते हैं और बाद में बिना ब्रांच वाले इस नए कमिट को रेफर करते हैं। अलग किए गए सिर से बचने के लिए, पुराना चेकआउट न करें। यदि आप अभी भी वहां से सभी फ़ाइलों को चाहते हैं, लेकिन एक नई प्रतिबद्ध के रूप में, तो आप कमिट के बजाय निर्देशिका से निर्देशिका की जांच कर सकते हैं। इसका जवाब देखें
lucidbrot

96

आप ऐसा कुछ कर सकते हैं।

# Create temporary branch for your detached head
git branch tmp

# Go to master
git checkout master

# Merge in commits from previously detached head
git merge tmp

# Delete temporary branch
git branch -d tmp

और भी सरल होगा

git checkout master
git merge HEAD@{1}

लेकिन यह थोड़ा खतरा है कि यदि आप एक गलती करते हैं तो अलग किए गए सिर पर किए गए कमिट्स को पुनर्प्राप्त करना थोड़ा कठिन हो सकता है।


4
मुझे पता है कि यह वर्षों बाद है, लेकिन इस उत्तर के लिए धन्यवाद। मैंने स्वयं को यहां स्वीकृत उत्तर के साथ खोज करने पर विचार नहीं किया क्योंकि मैं एक अस्थायी शाखा के आसपास नहीं छोड़ना चाहता था और इस उत्तर को इसे हटाने की आज्ञा है।
जेरेमी प्रेडेमोर

8
यदि आप कमांड का उपयोग करने का निर्णय लेते हैं, git merge HEAD@{1}तो आपको संभवतः यह सुनिश्चित करना चाहिए कि वह जो आप उपयोग करके उपयोग करना चाहते हैंgit reflog
माइकल स्ट्रैमल

3
HEAD @ {1} को मर्ज करने में सक्षम होने के कारण मैंने अपनी जान बचाई क्योंकि मैंने पहले से ही मास्टर की पूर्व जांच कर ली थी।
जूएल

अजीब है, मैं "पहले से ही अद्यतित हूं।" जब विलय tmp (लेकिन फाइलें अलग हैं)
रॉबर्ट सिनक्लेयर

18

यह जो मैंने किया है:

मूल रूप से, detached HEADएक नई शाखा के रूप में सोचो , बिना नाम के। आप किसी भी अन्य शाखा की तरह ही इस शाखा में प्रवेश कर सकते हैं। एक बार जब आप कमिटिंग कर लेते हैं, तो आप इसे रिमोट पर धकेलना चाहते हैं।

तो पहली चीज जो आपको करने की ज़रूरत है, उसे यह detached HEADनाम देना है । इस पर रहते हुए आप इसे आसानी से कर सकते हैं detached HEAD:

git checkout -b some-new-branch

अब आप इसे किसी अन्य शाखा की तरह रिमोट पर धकेल सकते हैं।

मेरे मामले में, मैं भी detached HEAD(अब some-new-branch) में किए गए कमिट्स के साथ इस ब्रांच को तेजी से आगे बढ़ाना चाहता था । सब मैंने किया था

git checkout master

git pull # To make sure my local copy of master is up to date

git checkout some-new-branch

git merge master // This added current state of master to my changes

बेशक, मैंने इसे बाद में मर्ज कर दिया master

यह इसके बारे में।


1
इस जवाब ने मेरे लिए काम किया जहां दूसरों ने नहीं किया। git checkout -b new-branchमेरे लिए काम किया। अन्य सुझावों के लिए बुलाया git branch new-branch, लेकिन वह मुझे अभी भी हटाए गए सिर में छोड़ दिया और नई शाखा ने मेरे परिवर्तन नहीं उठाए।
जेसी पटेल

17

आप बस git merge <commit-number>या कर सकते हैंgit cherry-pick <commit> <commit> ...

जैसा कि रयान स्टीवर्ट ने सुझाव दिया है कि आप वर्तमान हेड से एक शाखा भी बना सकते हैं:

git branch brand-name

या सिर्फ एक टैग:

git tag tag-name

आप अलग-अलग सिर पर अपना प्रतिबद्ध नंबर पा सकते हैंgit rev-parse HEAD
KOGI

6

अलग किए गए HEAD के मामले में, सामान्य की तरह काम करता है, इसके अलावा कोई नामित शाखा अपडेट नहीं होती है। अपने प्रतिबद्ध परिवर्तनों के साथ मास्टर शाखा को अपडेट करने के लिए, एक अस्थायी शाखा बनाएं जहां आप हैं (इस तरह अस्थायी शाखा में आपके द्वारा अलग किए गए सभी बदलाव होंगे), फिर मास्टर शाखा पर जाएं और अस्थायी शाखा को मर्ज करें मालिक।

git branch  temp
git checkout master
git merge temp

3

एक आसान फिक्स यह है कि उस कमिटमेंट के लिए एक नई ब्रांच बनाएं और उसके लिए चेकआउट करें git checkout -b <branch-name> <commit-hash>:।

इस तरह, आपके द्वारा किए गए सभी परिवर्तन उस शाखा में सहेजे जाएंगे। मामले में आपको बचे हुए कामों से अपनी मास्टर शाखा को साफ करने की आवश्यकता होती है, इसे अवश्य चलाएं git reset --hard master

इसके साथ, आप अपनी शाखाओं को फिर से लिखेंगे इसलिए सुनिश्चित करें कि इन परिवर्तनों के साथ किसी को परेशान न करें। अलग किए गए HEAD राज्य के बेहतर चित्रण के लिए इस लेख पर एक नज़र रखना सुनिश्चित करें ।


1

शायद सबसे अच्छा समाधान नहीं है, (इतिहास को फिर से लिखना होगा) लेकिन आप भी कर सकते थे git reset --hard <hash of detached head commit>

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