Git: रिमोट ओरिजिनल मास्टर से सिंगल फाइल को कैसे अपडेट / चेकआउट करें?


362

परिदृश्य:

  1. मैं स्थानीय रूप से एक फ़ाइल में कुछ बदलाव करता हूं और चलाता हूं git add, git commitऔरgit push
  2. फ़ाइल को दूरस्थ मूल मास्टर रिपॉजिटरी में धकेल दिया जाता है
  3. मेरे पास एक और स्थानीय रिपॉजिटरी है जो कैपिस्ट्रानो के माध्यम से उस रिमोट रिपॉजिटरी से "Remote_cache" विधि के साथ तैनात है
  4. अब मैं पूरे आवेदन को तैनात नहीं करना चाहता, लेकिन उस सिंगल फाइल को अपडेट / चेकआउट करना चाहता हूं।

क्या यह किसी भी तरह से संभव है? मुझे कुछ भी नहीं मिल पा रहा था जो काम करेगा और न ही मैं इसका पता लगा पा रहा था। एसवीएन के साथ मैंने सिर्फ किया svn up fileऔर आवाज की।


19
आप उस स्वीकृत उत्तर को बदलने पर विचार करना चाहते हैं जो वास्तव में आपके प्रश्न का उत्तर देता है। ;)
चरण

6
6 से अधिक वर्षों के बाद, मुझे विश्वास है कि हम सुरक्षित रूप से मान सकते हैं कि यह @steps नहीं होगा ...
Félix Gagnon-Grenier

Git 2.23 (अगस्त 2019) के साथ, यह है git restore -s origin/master -- path/to/file। देखें नीचे मेरा उत्तर
VonC

जवाबों:


914

यह करना संभव है (तैनात भंडार में)

git fetch
git checkout origin/master -- path/to/file

भ्रूण सभी हालिया परिवर्तनों को डाउनलोड करेगा, लेकिन यह आपके वर्तमान चेक आउट कोड (कार्य क्षेत्र) में नहीं डालेगा।

चेकआउट डाउनलोड किए गए परिवर्तनों ( origin/master) से विशेष फ़ाइल के साथ काम करने वाले पेड़ को अपडेट करेगा ।

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


1
सुपर काम, यह महान काम किया। उत्पादन में बाकी साइट को अपडेट करने से पहले मुझे एक कंपोजर.जोन फ़ाइल प्राप्त करने और एक अपडेट चलाने की आवश्यकता थी। अगर मैंने मैन्युअल रूप से कंपोज़र.जॉन / लॉक फ़ाइलों को रखा था, जब मैंने एक पुल किया था, तो यह कहकर संघर्ष करेगा कि फाइलें पहले से मौजूद हैं। इस तरह से करने से, git ने बिना किसी शिकायत के फाइलों को पहचान लिया।
डेविड

6
यह वह उत्तर है जिसकी मुझे तलाश थी।
जावदबा

20
@Mymozaaa डबल डैश यह बताता है कि फ़ाइल नाम क्या है। यह आपके फ़ाइल नाम की व्याख्या करने से रोकने के लिए है दुर्भाग्यपूर्ण मामले में एक ही नाम के साथ दो आपको मिल गया है।
जोएल मेलन

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

छोटा सा सवाल, ऐसा करने के बाद, मैं एक अलग मशीन में जा रहा हूं, फिर मैं ऊपर सूचीबद्ध आपके कार्यों को करता हूं, लेकिन फिर git statusमैं उन्हें इस रूप में देखता हूं Changes to be committed:- मतलब, मुझे उन्हें फिर से करने की आवश्यकता है? (सिर्फ यह देखते हुए कि मैं एक भी अछूती फाइल को रिफ्रेश करना चाहता था, लेकिन रेपो खुद ही एक अलग मशीन में छू जाता है)
रिकी लेवी


19
git archive --format=zip --remote=ssh://<user>@<host>/repos/<repo name> <tag or HEAD> <filename> > <output file name>.zip

1
यह ssh पर क्लोन किए गए रेपो के लिए एक अच्छा समाधान है, लेकिन ऐसा लगता है कि यह https से अधिक समर्थित नहीं है: git archive --remote=https://github.com/git/git.git master:git/contrib/completion git-completion.bash | tar -x मुझे त्रुटि संदेश देता है:fatal: Operation not supported by protocol.
Alderath

1
साथ अच्छा था tar: s --to-stdout,git archive --remote="gitolite3@<host>:<repo>" <tag> <file> | tar xf - --to-stdout
Puggan Se

18

Git 2.23 (अगस्त 2019) और नए (अभी भी प्रायोगिक) कमांड के साथ git restore, " वर्किंग डायरेक्टरी से सभी फाइलों को रीसेट कैसे करें , लेकिन स्टेजिंग एरिया से नहीं? "

git fetch
git restore -s origin/master -- path/to/file

विचार यह है: git restoreकेवल फाइलों से संबंधित है, फाइलों और शाखाओं से git checkoutनहीं।
" कन्फ्यूज्ड बायgit checkout " देखें : यह वह जगह है जहाँ पर git switchआता है)


कोडरसम टिप्पणी में जोड़ता है :

मेरे मामले में मैं अपने अपस्ट्रीम से डेटा प्राप्त करना चाहता था (जिसमें से मैंने फोर्क किया था)।
तो बस इसे बदल दिया गया:

git restore -s upstream/master -- path/to/file

2
क्या राहत है कि यह आदेश आखिरकार मौजूद है ... क्या पहले से लोग कर रहे थे? मैं पूरी चीज़ को पुनर्स्थापित कर रहा था और मेरी ज़रूरत की व्यक्तिगत फ़ाइलों की प्रतिलिपि बना रहा था, लेकिन यह दर्दनाक था।
माइक वाइज

यह मेरे लिए काम करता है, लेकिन मेरे मामले में मैं अपने अपस्ट्रीम से डेटा प्राप्त करना चाहता था (जिसमें से मैं भूल गया था)। तो बस बदल गयाgit restore -s upstream/master -- path/to/file
कोडरसम

इस प्रतिक्रिया के लिए @coderSam आपको धन्यवाद। अधिक दृश्यता के उत्तर में मैंने आपकी टिप्पणी शामिल की है।
VonC

8

आप क्या कर सकते हैं:

  1. अपने स्थानीय गिट रेपो को अपडेट करें:

    git fetch

  2. स्थानीय शाखा बनाएँ और उस पर जाँच करें:

    git branch pouet && git checkout pouet

  3. इस शाखा पर अपनी इच्छित प्रतिबद्धता लागू करें:

    git cherry-pick abcdefabcdef

    (abcdefabcdef वह कमेटी है जिसे आप लागू करना चाहते हैं)


4
एक तरफ के रूप में, आपका दूसरा चरण भी एक कमांड में किया जा सकता है git checkout -b pouet
ग्रेग हेविगेल

4
'पौट' इस उदाहरण का सबसे अच्छा शाखा नाम है।
Hussard

2

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

इस तरह से शांत शांत नहीं है, लेकिन यह काम करता है अगर आप लोग कुछ और नहीं समझ सकते हैं।


-10

मुझे लगता है कि मुझे एक आसान हैक मिल गया है।

स्थानीय रिपॉजिटरी (आपके पास दूरस्थ सर्वर में नवीनतम कमेटी से अपडेट की गई फ़ाइल चाहते हैं) पर मौजूद फ़ाइल को डिलीट करें

और फिर ए git pull

क्योंकि फ़ाइल हटा दी गई है, कोई विरोध नहीं होगा


यह स्थानीय रूप से उस फ़ाइल में किए गए सभी अंतिम परिवर्तनों को हटा देता है, और अन्य सभी फ़ाइलों को भी खींचता है, जो विशेष रूप से ओपी नहीं करना चाहता है।
लेगरोजन

दूरस्थ शाखा को अपडेट करने के बजाय, स्थानीय को हटाना बहुत बुरा विचार है।
c0der512
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.