मैं एक फ़ाइल के एक संस्करण को एक git शाखा से दूसरे में कैसे कॉपी करूं?


943

मुझे दो शाखाएं मिली हैं जो पूरी तरह से एक साथ विलय की गई हैं।

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

तो ऐसा करने का सबसे आसान तरीका क्या है?


3
कृपया ध्यान दें कि स्वीकृत उत्तर में, पहला समाधान परिवर्तनों को चरणबद्ध करता है, और दूसरा समाधान नहीं करता है। stackoverflow.com/a/56045704/151841
user151841

जवाबों:


1672

इसे उस शाखा से चलाएँ जहाँ आप फ़ाइल को समाप्त करना चाहते हैं:

git checkout otherbranch myfile.txt

सामान्य सूत्र:

git checkout <commit_hash> <relative_path_to_file_or_dir>
git checkout <remote_name>/<branch_name> <file_or_dir>

कुछ नोट्स (टिप्पणियों से):

  • कमिट हैश का उपयोग करके आप किसी भी कमिट से फाइल खींच सकते हैं
  • यह फ़ाइलों और निर्देशिकाओं के लिए काम करता है
  • फ़ाइल को ओवरराइट करता है myfile.txtऔरmydir
  • वाइल्डकार्ड काम नहीं करते हैं, लेकिन रिश्तेदार पथ करते हैं
  • कई रास्ते निर्दिष्ट किए जा सकते हैं

एक विकल्प:

git show commit_id:path/to/file > path/to/file

13
हाँ यह होगा। लेकिन यह सवाल का इरादा था।
इक्के

37
शायद स्पष्ट है, लेकिन आपको पूर्ण फ़ाइल नाम का उपयोग करने की आवश्यकता है ... वाइल्डकार्ड काम नहीं करते हैं!
क्रिस हार्ट

6
हालाँकि .. यह भी अच्छा तरीका है: git show प्रतिबद्ध_id: path / to / file> path / to / file
milushov

14
रिमोट: git चेकआउट मूल / otherbranch myfile.txt
रोमन Rrn Nesterov

6
वाइल्डकार्ड का उपयोग करना काम करता है, आपको बस उन्हें लपेटने की ज़रूरत है ''ताकि वे शेल द्वारा व्याख्या न करें।
विकिटोर काजकोव्स्की

82

मैं इसी तरह की खोज पर इस सवाल पर समाप्त हुआ। मेरे मामले में मैं एक फाइल को दूसरी ब्रांच से करंट वर्किंग डायरेक्टरी में निकालना चाह रहा था जो कि फाइल की ओरिजिनल लोकेशन से अलग हो। उत्तर :

git show TREEISH:path/to/file >path/to/local/file

18
Intention गिट शो ’का इरादा टर्मिनल में डेटा को पठनीय प्रारूप में आउटपुट करना है, जो फ़ाइल की सामग्री से बिल्कुल मेल खाने की गारंटी नहीं है। एक ही रूप में एक शब्द-दस्तावेज़ को कॉपी करना बेहतर है, और इसकी सामग्री को किसी अन्य दस्तावेज़ में कॉपी-पेस्ट करने की कोशिश न करें।
गॉनन

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

3
चेकआउट करने से पहले सामग्री की तुलना करने के लिए, git diff <other branch> <path to file>अच्छी तरह से काम करता है।
रान्डेल

2
@Gonen: git संस्करण 2.21.0 के अनुसार, "git show" मैनुअल पेज कहता है "सादे बूँद के लिए, यह सादे सामग्री को दिखाता है।" मुझे यकीन नहीं है अगर इसका मतलब है कि हम हमेशा अच्छे हैं। मैं इस तरह से एक छवि लाने के लिए थोड़े सावधान हूं ...
हिब्बलिग

52

चेकआउट कमांड का उपयोग करने के बारे में क्या:

  git diff --stat "$branch"
  git checkout --merge "$branch" "$file"
  git diff --stat "$branch"

8
नोट मर्ज (2 डी कमांड) काम नहीं कर सकता है अगर फाइल दोनों शाखाओं पर मौजूद नहीं है
सरल

हम्म। मेरे पास कोई अंतर नहीं है। क्या यह एक अलग उपकरण का एक विशिष्ट संस्करण है, क्योंकि मैंने इसके बारे में कभी नहीं सुना है (और क्या मुझे इसे स्विच करना चाहिए?): D
dudewad

git diffएक --statतर्क का समर्थन करता है जो मूल रूप से विसारक के समान काम करता है।
होवडाल

मुझे काम करने के लिए स्थानीय स्तर पर दोनों शाखाओं की जाँच करवानी पड़ी।
यूनिटासब्रुक

18

1) सुनिश्चित करें कि आप उस शाखा में हैं जहाँ आपको फ़ाइल की एक प्रति चाहिए। उदाहरण के लिए: मुझे मास्टर में उप शाखा फ़ाइल चाहिए ताकि आपको चेकआउट करने की आवश्यकता हो या मास्टर में होना चाहिएgit checkout master

2) अब चेकआउट विशिष्ट फ़ाइल जिसे आप उप शाखा से मास्टर में चाहते हैं,

git checkout sub_branch file_path/my_file.ext

यहां sub_branchइसका मतलब है कि आपके पास वह फ़ाइल है जिसके फ़ाइल नाम के बाद आपको कॉपी करने की आवश्यकता है।


बहुत आसान और अच्छी तरह से समझाया गया।
Abk

15

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

git checkout other-branch app/**

यदि आप केवल एक फ़ाइल को बदल देते हैं, तो यह op के प्रश्न के रूप में ठीक काम करेगा ^ _ ^


1
ध्यान दें कि origin/other-branchरेपो शाखा को संदर्भित करने के लिए दोनों शाखाओं को पहले ठीक से खींचा जाना चाहिए या उपयोग करना चाहिए। मूल बातें, लेकिन मुझे बिट। (जवाब बहुत अच्छा है - कोई संपादन की आवश्यकता नहीं है)
अकुप्पी जू

7

मैं उपयोग करूँगा git restore(git 2.23 के बाद से उपलब्ध)

git restore --source otherbranch path/to/myfile.txt


यह अन्य विकल्पों की तुलना में बेहतर क्यों है?

git checkout otherbranch -- path/to/myfile.txt- यह वर्किंग डायरेक्टरी में फाइल को कॉपी करता है, लेकिन स्टेजिंग एरिया को भी (इसी तरह का इफेक्ट अगर आप इस फाइल को मैनुअली कॉपी करेंगे और git addउस पर अमल करेंगे)। git restoreमंचन क्षेत्र को स्पर्श न करें (जब तक कि इसे कहा न जाए--staged विकल्प के रूप में है)।

git show otherbranch:path/to/myfile.txt > path/to/myfile.txtमानक शेल पुनर्निर्देशन का उपयोग करता है। यदि आप पॉवर्सशेल का उपयोग करते हैं तो टेक्स्ट एन्कोडिंग के साथ समस्या हो सकती है या यदि यह द्विआधारी है तो आपको टूटी हुई फ़ाइल मिल सकती है । git restoreफ़ाइलों को बदलने के साथ सभी द्वारा किया जाता हैgit निष्पादन योग्य ।

एक और लाभ यह है कि आप पूरे फ़ोल्डर को पुनर्स्थापित कर सकते हैं:

git restore --source otherbranch path/to

या git restore --overlay --source otherbranch path/toयदि आप फ़ाइलों को हटाने से बचना चाहते हैं। उदाहरण के लिए यदि otherbranchवर्तमान कार्य निर्देशिका की तुलना में कम फ़ाइलें हैं (और इन फ़ाइलों को ट्रैक किया गया है ) बिना --overlayविकल्प के git restoreउन्हें हटा देगा। लेकिन यह अच्छा डिफ़ॉल्ट bahaviour है, आप सबसे अधिक संभावना चाहते हैं कि निर्देशिका की स्थिति उसी तरह हो otherbranch, जैसे "वही नहीं बल्कि मेरी वर्तमान शाखा में अतिरिक्त फ़ाइलों के साथ"


अच्छा उत्तर। क्या git restoreस्रोत शाखा से एक फ़ाइल को लक्ष्य शाखा पर एक नई फ़ाइल में कॉपी करने का एक तरीका है ? गिट शो के साथ मैं इसे शेल पुनर्निर्देशन ( git show otherbranch:path/to/file1.txt > path/to/file2.txt) के साथ कर सकता हूं , लेकिन मैं आपके द्वारा बताए गए कारणों के लिए शेल पुनर्निर्देशन से बचना चाहता हूं।
एडमिरलअड्डा

1
@AdmiralAdama वास्तव में नहीं। और मुझे लगता है कि इसे प्राप्त करने का कोई बड़ा मौका नहीं है git restore(लेकिन जो जानते हैं;))। यह पुनर्निर्देशन समस्या मूल रूप से पॉवर्सशेल समस्या है, निश्चित नहीं है कि क्या कोई अन्य शेल है जिसके साथ समस्या है। मैं आमतौर पर "गिट बैश" या यहां तक ​​कि "सीएमडी" पर वापस जाता हूं जहां मुझे " git showपुनर्निर्देशन" कमांड का उपयोग करने की आवश्यकता होती है । या GitExtensions जैसे GUI का उपयोग करें जहां आप कमिट के फ़ाइल ट्री ब्राउज़ कर सकते हैं और किसी भी फ़ाइल पर "इस रूप में सहेजें" पर क्लिक कर सकते हैं।
मारियस पावेल्स्की

ओह समझा। मैं पॉवर्सशेल का उपयोग नहीं करता हूं इसलिए शायद शेल पुनर्निर्देशन मेरे लिए एनपी है। जानकारी के लिए धन्यवाद।
एडमिरलअड्डा

3

कृपया ध्यान दें कि स्वीकृत उत्तर में, पहला विकल्प पूरी फाइल को दूसरी शाखा से चरणबद्ध करता है (जैसे)git add ... प्रदर्शन किया गया था) , और दूसरा विकल्प सिर्फ फ़ाइल की प्रतिलिपि बनाता है, लेकिन परिवर्तनों को चरणबद्ध नहीं करता है (जैसे कि आपके पास था बस फ़ाइल को मैन्युअल रूप से संपादित किया था और उसमें अंतर था)।

इसे बिना किसी अन्य शाखा से कॉपी किए फाइल को जमा करें

चरणबद्ध परिवर्तन (उदाहरण के लिए git add filename):

$ git checkout directory/somefile.php feature-B

$ git status
On branch feature-A
Your branch is up-to-date with 'origin/feature-A'.
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   directory/somefile.php

बकाया परिवर्तन (मंचन या प्रतिबद्ध नहीं):

$ git show feature-B:directory/somefile.php > directory/somefile.php

$ git status
On branch feature-A
Your branch is up-to-date with 'origin/feature-A'.
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   directory/somefile.php

no changes added to commit (use "git add" and/or "git commit -a")

मुझे "फीचर-बी एक फाइल नहीं है", शाखा का नाम पहले आता है, इस बारे में -> "> निर्देशिका / somefile.php" क्या यह फ़ाइल के एन्कोडिंग को बदल सकता है?
टियागो ओलिवेरा डी फ्रीटास
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.