एक विशेष प्रतिबद्धता तक खींचो


106

मैं git pullएक विशिष्ट प्रतिबद्धता तक ही काम करना चाहता हूं ।

 A->B->C->D->E->F (Remote master HEAD)

तो मान लीजिए कि मेरा local masterहेड पॉइंट इंगित करता है B, और मैं तब तक खींचना चाहता हूं E। मुझे क्या करना चाहिए ?

यह एक विशिष्ट प्रतिबद्धता नहीं खींच रहा है, यह एक विशिष्ट प्रतिबद्धता तक खींच रहा है।



3
git fetchऔर git merge E
प्रहार करें

मैं वर्तमान में बी उदाहरण के लिए हूं, लेकिन मैं केवल सी, ई और एफ को खींचना चाहता हूं। मैं डी को निकालना चाहता हूं! धन्यवाद
Frenkey

@ फ़्रेनकी आप मास्टर को मर्ज कर सकते हैं, फिर अंतिम तीन कमिट निकाल सकते हैं और फिर अंतिम दो को चुन सकते हैं। इसके अलावा आप
रिबेट

क्या होगा यदि मैं केवल C से परिवर्तन लाना चाहता हूं, तो A और B के परिवर्तन को C में शामिल न करें? मैं उसे कैसे कर सकता हूँ?
विकास चौहान '

जवाबों:


120

git pullgit fetchइसके बाद कुछ भी नहीं है git merge। तो आप क्या कर सकते हैं

git fetch remote example_branch

git merge <commit_hash>


माना जाता है कि "यह देखें" क्या है?
डेवलपर

@ ब्रेट लिंक को पोस्ट करना भूल गए .. इसे पूरी तरह से हटा दिया
unrealsoul007

@ unrealsoul007 यह केवल एक विशिष्ट प्रतिबद्ध अधिकार का विलय करेगा? तो B से E तक खींचने के लिए, कमांड git मर्ज होगा <प्रतिबद्ध_hash C> <प्रतिबद्ध_hash D> <प्रतिबद्ध_hash E> सही?
विम फिजेन

7
@WimFeijen अपने सभी पूर्वजों के साथ git merge Eविलय कर देगा और (git जानता है कि और विलय करने की आवश्यकता नहीं है क्योंकि वे आपकी शाखा में पहले से ही थे)। यदि आप केवल तब के परिवर्तन चाहते हैं तो आपको इसके बजाय करना चाहिए । ECDABEgit cherry-pick E
नेक्सस

उत्तर के लिए धन्यवाद दोस्तों, मैं उसी मुद्दे की तलाश में था।
आकाश बिसारिया

24

सबसे पहले, नवीनतम रेपो को रिमोट रेपो से लाएं। यह आपकी स्थानीय शाखा को प्रभावित नहीं करेगा।

git fetch origin

फिर रिमोट ट्रैकिंग शाखा की जाँच करें और कमिट देखने के लिए एक लॉग लॉग करें

git checkout origin/master
git log

जिस कमेट को आप मर्ज करना चाहते हैं (या उसके पहले ~ ५ श्लोक) को कमिट करें और मास्टर में मर्ज करें

git checkout master
git merge <commit hash>

1
मैंने आपको वोट दिया क्योंकि यह विज्ञापन के रूप में काम नहीं करता है। सबसे पहले, आपकी विधि "git fetch origin" के साथ यह सभी दूरस्थ शाखाओं को लाती है (इसे स्पष्ट रूप से इंगित किया जाना चाहिए, विशेष रूप से कई और बड़ी शाखाओं वाली परियोजनाओं में काम करने वाले लोगों के लिए)। दूसरा, इस पद्धति के साथ "गिट मर्ज <कम हैश>" आपके स्थानीय इतिहास को वांछित कमेट तक नहीं मिलाता है, यदि आप इतिहास में वापस आ गए हैं। उदाहरण: आप स्थानीय रूप से 100 पर हैं, आप 150 तक उठना चाहते हैं, सब कुछ प्राप्त करके (दूरस्थ HEAD 100 पर होने के साथ)।
प्लेसहोल्डर

8
@ नोटधारक आपको git fetchऐसी बकवास लिखने से पहले मैनुअल को पढ़ना चाहिए । इसके अलावा, आपको मूल प्रश्न और मेरे उत्तर को पढ़ना चाहिए। यदि आप मेरे उत्तर का पालन करते हैं तो आप "इतिहास में वापस" नहीं होंगे क्योंकि मैं उपयोगकर्ता को स्पष्ट रूप से निर्देश देता हूं git checkout master। यदि आप कम से कम 50% स्पष्ट नहीं हैं तो कुल मिलाकर कृपया पोस्ट न करें।
डेवलपर

1
मामले में यह किसी और के लिए स्पष्ट नहीं है, git fetch originस्पष्ट रूप से मूल प्राप्त करता है
डैनियल फैरेल

2
यह पूरी तरह से काम करता है और स्वीकृत उत्तर की तुलना में बेहतर तरीके से समझाया जाता है।
Walen

1
सर्वश्रेष्ठ उत्तर,
वर्किंग परफेक्टली

14

जब तक आप अपनी इच्छा नहीं रखते हैं, तब तक आप नवीनतम प्रतिबद्ध और बस पूर्ववत कर सकते हैं:

git pull origin master
git reset --hard HEAD~1

masterअपनी इच्छित शाखा से बदलें ।

यह देखने के लिए git लॉग का उपयोग करें कि आप कौन सा कमिट करना चाहते हैं:

git log

निजी तौर पर, इसने मेरे लिए बेहतर काम किया है।

मूल रूप से, यह जो करता है वह नवीनतम प्रतिबद्ध को खींचता है, और आप मैन्युअल रूप से एक-एक करके वापस आते हैं। इतिहास को देखने के लिए git लॉग का उपयोग करें।

अच्छे अंक: विज्ञापित के रूप में काम करता है। आपको प्रतिबद्ध हैश का उपयोग करने या अनावश्यक शाखाओं को खींचने की आवश्यकता नहीं है।

खराब अंक: आपको एक के बाद एक कमानों को वापस करना होगा।

चेतावनी: अपने सभी स्थानीय परिवर्तनों को कमिट करें / रोकें, क्योंकि --hardआप उनके साथ हारने वाले हैं। अपने जोखिम पार इस्तेमाल करें!


3
मुझे नहीं पता कि क्यों डाउनवोट्स, यह सबसे साफ तरीका लगता है, और जैसे ही आप एक साधारण पुल अप करना चाहते हैं, कुछ अन्य उत्तरों के विपरीत
मॉरिशियो पसक्विअर जुआन

या तो अधिक उत्थान क्यों न करें, केवल नकारात्मक पक्ष यह है कि आपको HEADवापस जाने से पहले जाने की आवश्यकता है - और मुझे नहीं लगता कि यदि आपको संघर्षों को हल करना होता तो क्या होता। लेकिन यह समाधान के लिए अनुमति देता है git pull --rebase, और इसके विपरीत जो आपने कहा है कि आप सीधे (3 कमिट के लिए ) के Nसाथ कमिट्स पर वापस रीसेट कर सकते हैं । git reset --hard HEAD~Ngit reset --hard HEAD~3
स्टॉक ओवरफ्लो

आप ऐसा कर सकते हैं git reset --hard SHAऔर इसे अपनी इच्छा के अनुसार रीसेट कर सकते हैं, पीछे की ओर गिनने की आवश्यकता नहीं है।
विष्टि

2

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

का निरीक्षण करें:

$ git init। "
/User/dfarrell/git/demo/.git/ में प्रारंभिक खाली गिट रिपॉजिटरी
$ गूंज 'ए'> पत्र
$ git ऐड लेटर
$ जीआईटी कमिट-एम 'इनिशियल लेटर'
[मास्टर (रूट-कमिट) 6e59e76] प्रारंभिक पत्र
 1 फ़ाइल बदली गई, 1 प्रविष्टि (+)
 मोड 100644 पत्र बनाएँ
$ गूंज 'बी' >> पत्र
$ git ऐड लेटर और & git कमिट -m 'Add letter'
[मास्टर 7126e6d] पत्र जोड़ना
 1 फ़ाइल बदली गई, 1 प्रविष्टि (+)
$ गूंज 'ग' >> पत्र; git ऐड लेटर && git कमिट -m 'एडिंग लेटर'
[मास्टर f2458be] पत्र जोड़ना
 1 फ़ाइल बदली गई, 1 प्रविष्टि (+)
$ गूंज 'डी' >> पत्र; git ऐड लेटर && git कमिट -m 'एडिंग लेटर'
[मास्टर 7f77979] पत्र जोड़ना
 1 फ़ाइल बदली गई, 1 प्रविष्टि (+)
$ गूंज 'ई' >> पत्र; git ऐड लेटर && git कमिट -m 'एडिंग लेटर'
[मास्टर 790eade] अक्षर जोड़ना
 1 फ़ाइल बदली गई, 1 प्रविष्टि (+)
$ git लॉग
प्रतिबद्ध 790eade367b0d8ab8146596cd717c25fd895302a
लेखक: डैन फैरेल 
दिनांक: गुरु जुल 16 14:21:26 2015 -0500

    अक्षर जोड़ना

प्रतिबद्ध 7f77979efd17f277b4be695c559c1383d2fc2f27
लेखक: डैन फैरेल 
दिनांक: गुरु जुल 16 14:21:24 2015 -0500

    अक्षर जोड़ना

प्रतिबद्ध f2458bea7780bf09fe643095dbae95cf97357ccc
लेखक: डैन फैरेल 
दिनांक: गुरु जुल 16 14:21:19 2015 -0500

    अक्षर जोड़ना

प्रतिबद्ध 7126e6dcb9c28ac60cb86ae40fb358350d0c5fad
लेखक: डैन फैरेल 
दिनांक: गुरु जुल 16 14:20:52 2015 -0500

    अक्षर जोड़ना

प्रतिबद्ध 6e59e7650314112fb80097d7d3803c964b3656f0
लेखक: डैन फैरेल 
दिनांक: गुरु जुल 16 14:20:33 2015 -0500

    प्रारंभिक पत्र
$ git चेकआउट 6e59e7650314112fb80097d7d3803c964b3656f
$ git चेकआउट 7126e6dcb9c28ac60cb86ae40fb358350d0b5fad
नोट: '7126e6dcb9c28ac60cb86ae40fb358350d0c5fad' की जाँच करें।

आप 'अलग राज्य' में हैं। आप चारों ओर देख सकते हैं, प्रयोगात्मक बना सकते हैं
परिवर्तन और उन्हें प्रतिबद्ध है, और आप इसमें किए गए किसी भी कमिट को त्याग सकते हैं
एक और चेकआउट करके किसी भी शाखा को प्रभावित किए बिना राज्य।

यदि आप अपने द्वारा बनाए गए कमिट को बनाए रखने के लिए एक नई शाखा बनाना चाहते हैं, तो आप ऐसा कर सकते हैं
चेकआउट कमांड के साथ -b का उपयोग करके (अभी या बाद में) ऐसा करें। उदाहरण:

  git चेकआउट -b new_branch_name

HEAD अब 7126e6d पर है ... अक्षर जोड़ना
$ git चेकआउट -b B 7126e6dcb9c28ac60cb86ae40fb358350d0c5fad
एक नई शाखा 'बी' में बदल गया
$ git पुल 790eade367b0d8ab8146596cd717c25fd895302a
घातक: '790eade367b0d8ab8146596cd717c25fd895302a' गिट रिपोजिटरी प्रतीत नहीं होता है
घातक: दूरस्थ रिपॉजिटरी से नहीं पढ़ सकता है।

कृपया सुनिश्चित करें कि आपके पास सही एक्सेस अधिकार हैं
और भंडार मौजूद है।
$ git मर्ज 7f77979efd17f277b4be695c559c1383d2fc2f27
7126e6d..7f77979 को अपडेट कर रहा है
तेजी से आगे बढ़ना
 पत्र | 2 ++
 1 फ़ाइल बदली गई, 2 प्रविष्टि (+)
$ बिल्ली पत्र
ए
ख
सी
घ

1

मुझे इस वीडियो से अपडेटेड उत्तर मिला है , स्वीकृत जवाब मेरे काम नहीं आया।

पहले git से नवीनतम रेपो क्लोन करें (यदि नहीं है) git clone <HTTPs link of the project> (या SSH का उपयोग करके) तो उपयोग की इच्छा शाखा पर जाएं git checkout <branch name>

कमांड का उपयोग करें

git log

नवीनतम आवागमन की जाँच करने के लिए। विशेष प्रतिबद्ध के शाल की प्रतिलिपि बनाएँ। फिर कमांड का उपयोग करें

git fetch origin <Copy paste the shal here>

एंटर की दबाने के बाद। अब कमांड का उपयोग करें

git checkout FETCH_HEAD

अब विशेष प्रतिबद्ध आपके स्थानीय के लिए उपलब्ध होगा। कुछ भी बदलें और कोड का उपयोग करके धक्का दें git push origin <branch name>। बस इतना ही। संदर्भ के लिए वीडियो देखें ।


0

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

git pull origin <sha>

जैसे

[dbn src]$ git fetch
[dbn src]$ git status
On branch current_feature
Your branch and 'origin/master' have diverged,
and have 2 and 7 different commits each, respectively.
...
[dbn src]$ git log -3 --pretty=oneline origin/master
f4d10ad2a5eda447bea53fed0b421106dbecea66 CASE-ID1: some descriptive msg
28eb00a42e682e32bdc92e5753a4a9c315f62b42 CASE-ID2: I'm so good at writing commit titles
ff39e46b18a66b21bc1eed81a0974e5c7de6a3e5 CASE-ID2: woooooo
[dbn src]$ git pull origin 28eb00a42e682e32bdc92e5753a4a9c315f62b42
[dbn src]$ git status
On branch current_feature
Your branch and 'origin/master' have diverged,
and have 2 and 1 different commits each, respectively.
...

यह 28eb00, ff39e4 और सब कुछ पहले खींचता है, लेकिन f4d10ad नहीं खींचता है। यह आपके gitconfig में पुल सेटिंग्स का उपयोग करने की अनुमति देता है, और सम्मान को बढ़ाता है। यह काम करता है क्योंकि आप मूल रूप से एक शाखा के रूप में 28eb00 का इलाज कर रहे हैं।

मेरे द्वारा उपयोग किए जा रहे git के संस्करण के लिए, इस पद्धति के लिए एक पूर्ण प्रतिबद्ध हैश की आवश्यकता है - कोई भी संक्षिप्तीकरण या उपनाम की अनुमति नहीं है। आप कुछ ऐसा कर सकते हैं:

[dbn src]$ git pull origin `git rev-parse origin/master^`
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.