আমি কীভাবে কোনও একক ফাইলের সংস্করণটি একটি গিট শাখা থেকে অন্য গিটার শাখায় অনুলিপি করব?


943

আমার দুটি শাখা রয়েছে যা সম্পূর্ণ একত্রে একত্রিত হয়েছে।

যাইহোক, মার্জটি সম্পন্ন হওয়ার পরে, আমি বুঝতে পেরেছি যে একত্রীকরণের ফলে একটি ফাইল গণ্ডগোল হয়েছে (অন্য কেউ একটি স্বয়ংক্রিয় ফর্ম্যাট, গাহ করেছেন), এবং অন্য শাখায় নতুন সংস্করণে পরিবর্তন করা সহজ হবে এবং তারপরে আমার শাখায় নিয়ে আসার পরে আমার এক লাইন পরিবর্তনটি পুনরায় .োকান।

সুতরাং এই কাজটি করার গিটের সবচেয়ে সহজ উপায় কী?


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
যদিও .. এটিও দুর্দান্ত উপায়: গিট শো কমিট_আইডি: পাথ / টু / ফাইল> পাথ / টু / ফাইল
মিলুশভ

14
দূরবর্তী: গিট চেকআউট উত্স / অন্যান্য ব্রাঞ্চ মাইফিল.টেক্সট
রোমান আরএন নেস্টারভ

6
ওয়াইল্ডকার্ডগুলি ব্যবহার করে কাজ করে, আপনাকে কেবল এগুলি মুড়িয়ে ফেলা দরকার ''যাতে শেল দ্বারা তাদের ব্যাখ্যা করা না যায়।
উইক্টর জাজকভস্কি

82

আমি এই প্রশ্নের অনুরূপ অনুসন্ধানে শেষ করেছি। আমার ক্ষেত্রে আমি অন্য শাখা থেকে একটি ফাইলকে বর্তমান কার্যনির্বাহী ডিরেক্টরিতে বের করতে চেয়েছিলাম যা ফাইলটির মূল অবস্থান থেকে পৃথক ছিল। উত্তর :

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

18
'গিট শো'-এর উদ্দেশ্য হ'ল পাঠযোগ্য বিন্যাসে টার্মিনালে ডেটা আউটপুট দেওয়া, যা ফাইলের সামগ্রীর সাথে ঠিক মেলে গ্যারান্টিযুক্ত নয়। সামগ্রিকভাবে একটি শব্দ-নথি অনুলিপি করা আরও ভাল, এবং অন্য নথিতে এর বিষয়বস্তু অনুলিপি-আটকানোর চেষ্টা করবেন না।
গোনেন

আমি কেবল এটি দেখতে চেয়েছিলাম যাতে আমি বর্তমান শাখার বিপরীতে সামগ্রীগুলি তুলনা করতে পারি (কোডের কিছু অংশ পরীক্ষা করে দেখুন)। আমি যদিও এর সাথে
ভিম

3
চেকআউট করার আগে সামগ্রীগুলির তুলনা করতে, git diff <other branch> <path to file>ভাল কাজ করে।
র‌্যান্ডাল

2
@ গোনেন: গিট সংস্করণ ২.২১.০ অনুসারে, "গিট শো" ম্যানুয়াল পৃষ্ঠাটি "প্লেইন ব্লবসের জন্য এটি সরল বিষয়বস্তুগুলি দেখায়।" আমি নিশ্চিত নই যে এর অর্থ আমরা সর্বদা ভাল কিনা। আমি সেভাবে একটি চিত্র আনতে সচেতন ...
হিব্বালিগ

52

চেকআউট কমান্ড ব্যবহার সম্পর্কে কী:

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

8
উভয় শাখায় ফাইলটি উপস্থিত না থাকলে নোট মার্জ (২ য় কমান্ড) কাজ করতে পারে না
সিম্পুজার

হুঁ। আমার ডিফস্ট্যাট নেই এটি কি কোনও ডিফার সরঞ্জামের একটি নির্দিষ্ট সংস্করণ, কারণ আমি এর আগে কখনও শুনিনি (এবং আমি কি এটিতে স্যুইচ করা উচিত?): ডি
দেউওয়াদ

git diffএকটি --statযুক্তি সমর্থন করে যা মূলত ডিফস্ট্যাট হিসাবে একই কাজ করে thing
hlovdal

এটি কাজ পেতে আমাকে উভয় শাখা স্থানীয়ভাবে চেক আউট করতে হয়েছিল।
ইউনিটাসব্রুকস 23 '10

18

1) আপনার শাখায় যেখানে ফাইলের একটি অনুলিপি দরকার তা নিশ্চিত করুন। উদাহরণস্বরূপ: আমি মাস্টারে সাব ব্রাঞ্চ ফাইলটি চাই তাই আপনার চেকআউট করতে হবে বা মাস্টার হওয়া উচিতgit checkout master

2) এখন আপনি কেবলমাত্র সাব শাখা থেকে মাস্টার হিসাবে চান সেই নির্দিষ্ট ফাইলটি চেকআউট করুন,

git checkout sub_branch file_path/my_file.ext

এখানে sub_branchআপনার ফাইল ফাইলের পরে কপি করার দরকার আছে এর অর্থ।


খুব সহজ এবং ভাল ব্যাখ্যা।
Abk

15

মাদল্যাপের উত্তর অনুসরণ করে আপনি কেবল একটি ডিরেক্টরিকে অন্য একটি শাখা থেকে ডিরেক্টরি ব্লব দিয়ে অনুলিপি করতে পারেন।

git checkout other-branch app/**

অপটির প্রশ্ন হিসাবে যদি আপনি সেখানে কেবল একটি ফাইল পরিবর্তন করেছেন তবে এটি ঠিক work _ ^ কাজ করবে ^


1
লক্ষ্য করুন যে উভয় শাখাকে যথাযথভাবে টানতে হবে, প্রথমে বা origin/other-branchরেপো শাখার উল্লেখ করার জন্য ব্যবহার করতে হবে। মূল কথা, তবে আমাকে কামড় দাও। (উত্তরটি দুর্দান্ত - কোনও সম্পাদনার দরকার নেই)
আকৌপ্পি

7

আমি ব্যবহার করব git restore(গিট ২.২৩ থেকে উপলব্ধ)

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সেগুলি মুছবে। তবে এটি ভাল ডিফল্ট বাহাভিউর, আপনি সম্ভবত ডিরেক্টরিটির অবস্থা একইরকম হতে চান otherbranch, "একই নয় তবে আমার বর্তমান শাখায় অতিরিক্ত ফাইল সহ"


চমৎকার উত্তর. লক্ষ্য শাখায় git restoreকোনও নতুন উত্স শাখা থেকে কোনও ফাইল অনুলিপি করার কোনও উপায় আছে কি ? গিট শো দিয়ে আমি শেল পুনর্নির্দেশ ( git show otherbranch:path/to/file1.txt > path/to/file2.txt) দিয়ে এটি করতে পারি , তবে আপনি উল্লিখিত কারণে শেল পুনর্নির্দেশটি এড়াতে চাই।
অ্যাডমিরালআডামা

1
@ অ্যাডমিরালআডামা আসলেই না। এবং আমি মনে করি এটির প্রবেশের বড় কোনও সম্ভাবনা নেই git restore(তবে কে জানে;))। এই পুনঃনির্দেশ সংক্রান্ত সমস্যাগুলি মূলত পাওয়ারশেল সমস্যা, নিশ্চিত না যে এর সাথে অন্য কোনও শেল রয়েছে যা এতে সমস্যা আছে। আমি সাধারণত "গিট ব্যাশ" বা "সেন্টিমিডি" তে ফিরে যাই যেখানে আমাকে " git showপুনর্নির্দেশ" কমান্ড ব্যবহার করতে হবে । বা জিআইআইআই ব্যবহার করুন যেমন গিটএক্সটেনশনের যেখানে আপনি প্রতিশ্রুতিবদ্ধ ফাইল ট্রি ব্রাউজ করতে পারেন এবং যে কোনও ফাইলের "সংরক্ষণ করুন" এ ক্লিক করতে পারেন।
মারিউজ পাভেলস্কি

আহ আমি দেখি. আমি পাওয়ারশেল ব্যবহার করি না তাই শেল পুনর্নির্দেশটি আমার জন্য এনপি হয়। তথ্যের জন্য ধন্যবাদ।
অ্যাডমিরালআডামা

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")

আমি "ফিচার-বি কোনও ফাইল নয়" পেয়েছি, শাখার নামটি প্রথমে আসে - এই সম্পর্কে -> "> ডিরেক্টরি / কিছুফিল.পিএপি" ফাইলটির এনকোডিং পরিবর্তন করতে পারে?
টিয়াগো অলিভিয়েরা ডি ফ্রেইটাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.