किसी दूसरी शाखा से सिर्फ एक फ़ाइल कैसे प्राप्त करें


1260

मैं गिट का उपयोग कर रहा हूं और मास्टर शाखा पर काम कर रहा हूं। इस शाखा में एक फाइल होती है जिसे कहा जाता है app.js

मेरी एक experimentशाखा है जिसमें मैंने बदलाव और टन के एक समूह का निर्माण किया। अब मैं सभी परिवर्तनों को केवल करने के लिए किया लाना चाहते app.jsसे experimentकरने के लिए masterशाखा।

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

एक बार फिर मुझे मर्ज नहीं चाहिए। मैं शाखा app.jsसे experimentशाखा में सभी परिवर्तन लाना चाहता हूं master



1
आज के उत्तर को छोड़कर और अन्य लोग इस बात का उत्तर देते हैं कि फ़ाइल की सामग्री की प्रतिलिपि कैसे बनाई जाए, यही मैं खुद चाहता था जब मुझे वह मिल जाए। हालाँकि, यदि वास्तव में पढ़ा जाए, तो निक बदलाव लाना चाहते थे, न कि पूर्ण पाठ, और फाइल में परिवर्तन masterहो सकता है experiment, उदाहरण के लिए अन्य शाखाओं से विलय किए गए परिवर्तन शामिल हो सकते हैं जो फ़ाइल में खो जाएंगे बस कॉपी की गई है। दूसरी ओर पीएस वह विलय नहीं करना चाहता है, लेकिन जहां तक ​​मुझे पता है कि git mergeशब्द केवल शाखा के लिए है, विशिष्ट फ़ाइल के लिए नहीं, इसलिए यहां कोई विरोधाभास नहीं है।
बजे अलेक्सई मार्टियनोव

जवाबों:


1599
git checkout master               # first get back to master
git checkout experiment -- app.js # then copy the version of app.js 
                                  # from branch "experiment"

यह भी देखें कि एक फाइल के परिवर्तन को कैसे करें?


अगस्त २०१ ९ अपडेट करें, २.२३

नए git switchऔर git restoreआदेशों के साथ, यह होगा:

git switch master
git restore -s experiment -- app.js

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

git restore -s experiment --staged --worktree -- app.js
# shorter:
git restore -s experiment -WS -- app.js

जैसा कि जकुब नारुबस्की ने टिप्पणियों में उल्लेख किया है:

git show experiment:path/to/app.js > path/to/app.js

काम करता है, सिवाय इसके कि, एसओ प्रश्न में विस्तृत रूप से " Git में विशिष्ट संशोधन से किसी एकल फ़ाइल को कैसे पुनर्प्राप्त करें? ", आपको रेपो की मूल निर्देशिका से पूर्ण पथ का उपयोग करने की आवश्यकता है।
इसलिए उनके उदाहरण में जकूब द्वारा उपयोग किया गया पथ / to / app.js।

के रूप में फ़्रॉस्टी टिप्पणी में उल्लेख है:

आप केवल app.js का सबसे हालिया राज्य प्राप्त करेंगे

लेकिन, git checkoutया git show, आप वास्तव में अपने इच्छित किसी भी संशोधन का संदर्भ दे सकते हैं, जैसा कि एसओ प्रश्न " git gui में फ़ाइल के गिट चेकआउट संशोधन " में चित्रित किया गया है :

$ git show $REVISION:$FILENAME
$ git checkout $REVISION -- $FILENAME

यह वही होगा जो $ FILENAME संस्करण फ़ाइल का पूर्ण पथ है।

$REVISIONके रूप में दिखाया जा सकता है git rev-parse:

experiment@{yesterday}:app.js # app.js as it was yesterday 
experiment^:app.js            # app.js on the first commit parent
experiment@{2}:app.js         # app.js two commits ago

और इसी तरह।

schmijos टिप्पणियों में जोड़ता है :

आप भी इसे स्टैश से कर सकते हैं:

git checkout stash -- app.js

यदि आप दो शाखाओं पर काम कर रहे हैं और कमिट नहीं करना चाहते हैं तो यह बहुत उपयोगी है।


13
एक नोट: आप केवल app.js के सबसे हाल ही में राज्य मिलेगा, आप प्रयोग शाखा से किए गए किसी भी इतिहास नहीं मिलेगा।
फ्रॉस्टी

2
@ThomasReggi आपको किसी भी शाखा से किसी भी वर्तमान शाखा में एक फ़ाइल आयात (चेकआउट) करने में सक्षम होना चाहिए। यदि आप नहीं कर सकते हैं, तो यहां एक सटीक प्रश्न हो सकता है, जिसमें सटीक त्रुटि संदेश और जीआईटी और ओएस के संस्करण जैसे विशिष्ट विवरण का उपयोग किया गया है।
वॉन

2
एक उप-निर्देशिका में, आप भी उपयोग कर सकते हैं experiment:./app.js। (आपको पूर्ण पथ निर्दिष्ट करने की आवश्यकता नहीं है।) मैंने यह बहुत उपयोगी त्रुटि संदेश के लिए धन्यवाद सीखा है git ने मुझे दिया: "क्या आपका मतलब था 'mybranch: full / path / to / my / file.xsl' aka 'mybranch। ./file.xsl '? " हाँ, मैंने किया! मुझे नहीं लगता कि मैं कभी एक घातक त्रुटि संदेश से इतना खुश हुआ हूं।
इवान लेनज़

1
@TomaszGandor हां, मैं उल्लेख करता हूं कि stackoverflow.com/a/21066489/6309 में , जहां git शो इंडेक्स को संशोधित नहीं करेगा, लेकिन git चेकआउट इंडेक्स को संशोधित करता है।
दोपहर

1
@FriedBrice मेरा जवाब देखें: इन दिनों, यह होगाgit restore -s new-feature path/to/app.js
VonC

358

सब कुछ बहुत सरल है, उसके लिए गिट चेकआउट का उपयोग करें।

मान लें कि you're on masterशाखा प्राप्त करने के लिए, app.js from new-featureशाखा करें:

git checkout new-feature path/to/app.js

// note that there is no leading slash in the path!

यह आपको वांछित फ़ाइल की सामग्री लाएगा। आप हमेशा की तरह, फ़ाइल को पाने के लिए नई-सुविधा शाखा नाम के बजाय sha1 के भाग का उपयोग कर सकते हैं क्योंकि यह उस विशेष प्रतिबद्ध में था।

नोट : new-featureएक स्थानीय शाखा होने की आवश्यकता है , रिमोट नहीं।


76
मुझे हमेशा मूल निर्दिष्ट करने में मदद मिलती है git checkout origin/source_branch path/to/fileक्योंकि यदि आपने अपने स्थानीय रेपो के स्रोत शाखा को अपडेट करने के लिए उपेक्षित किया है, तो आपको फ़ाइल का पुराना संस्करण मिल सकता है ... मुझसे पूछें कि मुझे कैसे पता है। ;)
तांत्रिक

2
@Mymozaaa सवाल का उल्लेख नहीं किया गया था, इस प्रकार यह धारणा है कि यह एक शुद्ध रूप से स्थानीय रेपो है
दिमित्री एवोन्टोमोव

1
क्या यह कमांड फ़ाइल के इतिहास, या फ़ाइल के अंतिम संस्करण को लाएगा?
user1366265

1
@ user1366265 यह कमांड फ़ाइल को डाल देगा क्योंकि यह विशेष रूप से आपके द्वारा निर्दिष्ट या आपके द्वारा निर्दिष्ट शाखा के प्रमुख के लिए थी। "एक फ़ाइल का इतिहास" जैसी कोई चीज नहीं है, सभी इतिहास की जानकारी केवल शाखाओं में संग्रहीत होती है।
दिमित्री एवोन्टोमोव

3
यह चेक-आउट फ़ाइल को स्वचालित रूप से चरणबद्ध करने लगता है। क्या मंचन के बिना भी ऐसा करना संभव है?
bluenote10

44
git checkout branch_name file_name

उदाहरण:

git checkout master App.java

यह काम नहीं करेगा यदि आपकी शाखा के नाम में एक अवधि है।

git checkout "fix.june" alive.html
error: pathspec 'fix.june' did not match any file(s) known to git.

@PhilipRego यह उत्तर सही है। मैं अनुमान लगा रहा हूं कि आपकी शाखा में अलग-अलग पूंजीकरण या विराम चिह्न है, या आपके पास केवल एक दूरस्थ शाखा है और स्थानीय नहीं है। Git चेकआउट डॉक्टर देखें: git-scm.com/docs/git-checkout#Documentation/…
Bret

@ ब्रेट ने पाया कि जब शाखा नाम की अवधि होती है तो यह काम नहीं करता है। मैंने एक संपादन का सुझाव दिया
फिलिप रेगो

यह सबसे अच्छा जवाब है। मैं चाहता हूं कि यह उत्तर उच्चतम श्रेणी में आए। वर्तमान उच्चतम एक बहुत भ्रामक है और सीधा नहीं है
रसेल लेगो

41

वॉनसी और छ्ह के उत्तरों के लिए पूरक।

git show experiment:path/to/relative/app.js > app.js
# If your current working directory is relative than just use
git show experiment:app.js > app.js

या

git checkout experiment -- app.js

2
ठंडा! मुझे लंबे रास्तों को निर्दिष्ट करने से नफरत है। क्या --शाखा के नाम और रास्तों के बीच डबल डैश ( ) वैकल्पिक है? क्या यह केवल रास्तों को रोकने के लिए है, जो विकल्प / स्विच के रूप में व्यवहार किए जाने से एक डैश के साथ शुरू होगा?
टॉमस गैंडर

ईमानदारी से मुझे नहीं पता। मैंने यह भी ध्यान नहीं दिया कि जब तक आपने इसे इंगित नहीं किया तब तक मैं दोहरे डैश को भूल गया था।
AlexLordThorsen

6
@TomaszGandor --वैकल्पिक है, लेकिन शाखा नामों के साथ संघर्ष से बचने के लिए यह अधिक उपयोगी है। उदाहरण के लिए, git checkout -- fooइसका अर्थ है "HEAD से फ़ाइल फू को चेक करें" (यानी , फू में स्थानीय परिवर्तन को अधिलेखित करें , यानी का एक सबसेट git reset --hard), लेकिन git checkout fooइसका मतलब यह हो सकता है कि या "चलो शाखा फू में जाएं "।
एलोइस महदाल

8

या यदि आप किसी अन्य शाखा से सभी फाइलें चाहते हैं:

git checkout <branch name> -- .

23
प्रारंभिक खोज में "सिर्फ एक फ़ाइल" शामिल है।
महानोवैन

1
यह विलय के बजाय मौजूदा फाइलों को बदल देता है
Amare

3
यह .एक बड़ा अंतर बनाता है: किसी अन्य शाखा में जाने के बजाय यह वहां से सभी फ़ाइलों को कॉपी करता है जबकि अभी भी आपको वर्तमान पर छोड़ रहा है। आपको इसमें जाने के बिना अन्य शाखा से सामग्री मिलती है।
Xeverous

4

फ़ाइल को गितुब पर समीक्षा करें और इसे वहां से खींचें

यह एक व्यावहारिक दृष्टिकोण है जो सीधे ओपी का जवाब नहीं देता है, लेकिन कुछ उपयोगी पाए गए हैं:

यदि विचाराधीन शाखा GitHub पर है, तो आप इच्छित शाखा में जा सकते हैं और GitHub द्वारा प्रदान किए जाने वाले किसी भी टूल का उपयोग करके फाइल कर सकते हैं, फिर सादे पाठ को देखने के लिए 'Raw' पर क्लिक करें, और (वैकल्पिक रूप से) पाठ को कॉपी और पेस्ट करें चाहा हे।

मुझे यह दृष्टिकोण पसंद है क्योंकि यह आपके स्थानीय मशीन पर खींचने से पहले आपको दूरस्थ रूप से संपूर्ण फ़ाइल को देखने देता है।


2
हालाँकि, कच्ची फ़ाइल को कॉपी और पेस्ट करने से आपके गिट अंतर में अवांछित चरित्र परिवर्तन होने की संभावना है। यह कोई भी बदलाव सुनिश्चित करने के लिए फ़ाइल को सीधे आपके प्रोजेक्ट में सहेजना सुरक्षित है।
फिलिप रीगो

0

यदि आप किसी विशेष समिति (किसी भी शाखा) से फ़ाइल चाहते हैं, तो 06f8251f कहें

git checkout 06f8251f path_to_file

उदाहरण के लिए, विंडोज़ में:

git checkout 06f8251f C: \ A \ B \ C \ D \ file.h


1
जवाब देने में व़क्त लेने के लिए शुक्रिया! लेकिन यह सवाल का जवाब नहीं देता है, और एक अच्छा जवाब जो बहुत अलग है, 9 साल पहले ही पोस्ट किया जा चुका है। सवाल को उछालने की जरूरत नहीं है।
नाथन

यह एक मान्य व्यावहारिक परिदृश्य है। उत्तर शाखा के साथ सही ढंग से व्यवहार करता है, लेकिन शाखा की किसी विशेष प्रतिबद्धता को देखने के बारे में क्या।
अरुपजबसु

0

दूसरा तरीका अंतर के साथ एक पैच बनाना और इसे मास्टर शाखा में लागू करना है। मान लें कि आपके द्वारा ऐप पर काम शुरू करने से पहले अंतिम प्रतिबद्ध है। 00000aaaaa और आपके द्वारा इच्छित संस्करण को साझा करने का वचन 00000bbbb है

आप इसे प्रयोग शाखा पर चलाते हैं:

git diff 00000aaaaa 00000bbbbb app.js > ~/app_changes.git

यह app.js के लिए उन दो कमिट्स के बीच सभी अंतरों के साथ एक फाइल बनाएगा, जिसे आप जहां चाहें लागू कर सकते हैं। आप उस फ़ाइल को प्रोजेक्ट के बाहर कहीं भी रख सकते हैं

फिर, गुरु में आप बस चलाते हैं:

git apply ~/app_changes.git

अब आप परियोजनाओं में होने वाले परिवर्तनों को देखने वाले हैं जैसे कि आपने उन्हें मैन्युअल रूप से बनाया था।


-3
git checkout master               -go to the master branch first
git checkout <your-branch> -- <your-file> --copy your file data from your branch.

git show <your-branch>:path/to/<your-file> 

आशा है कि यह आपकी मदद करेगा। कृपया मुझे बताएं कि क्या आपके पास कोई प्रश्न है।

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