গিট শাখা থেকে নির্দিষ্ট ফাইলগুলি কীভাবে মার্জ করা যায়


179

আমার 2 গিট শাখা শাখা 1 এবং ব্রাঞ্চ 2 রয়েছে এবং আমি শাখা 2 তে ফাইল 2.plie কে শাখা 1 তে ফাইল.পিতে এবং কেবল সেই ফাইলটিতে মার্জ করতে চাই।

সংক্ষেপে আমি কেবল শাখা 1 তে ফাইল.পিতে কাজ করতে চাই তবে মার্জ কমান্ডের সুবিধা নিতে চাই। এই কাজ করতে সবচেয়ে ভালো উপায় কি?



উত্তর:


207

যখন বিষয়বস্তুটি শাখা 2file.py থেকে রয়েছে যা এখন আর শাখা 1 তে প্রযোজ্য নয় , এর জন্য কিছু পরিবর্তন বাছাই করা এবং অন্যকে রেখে যাওয়া দরকার। সম্পূর্ণ নিয়ন্ত্রণের জন্য --patchস্যুইচটি ব্যবহার করে একটি ইন্টারেক্টিভ মার্জ করুন :

$ git checkout --patch branch2 file.py

ম্যান পৃষ্ঠায় ইন্টারেক্টিভ মোড বিভাগটি git-add(1)কী কী ব্যবহার করা হবে তা ব্যাখ্যা করে:

y - stage this hunk
n - do not stage this hunk
q - quit; do not stage this hunk nor any of the remaining ones
a - stage this hunk and all later hunks in the file
d - do not stage this hunk nor any of the later hunks in the file
g - select a hunk to go to
/ - search for a hunk matching the given regex
j - leave this hunk undecided, see next undecided hunk
J - leave this hunk undecided, see next hunk
k - leave this hunk undecided, see previous undecided hunk
K - leave this hunk undecided, see previous hunk
s - split the current hunk into smaller hunks
e - manually edit the current hunk
? - print help

স্প্লিট কমান্ড বিশেষভাবে দরকারী।


3
আমরা কীভাবে প্যাচ ব্যবহার করতে পারি এবং একই সাথে মার্জ সরঞ্জামটি ব্যবহার করতে পারি? মূল জিনিসগুলির পরিবর্তে
গ্যাব্রিয়েল

@ গ্যাব্রিয়েল আমি প্যাচ ফাইল এবং টারবলগুলি সহ গিটকেও ব্যবহার করেছি কারণ একটি রেপো তৈরি করা এত সহজ ( git init <dir>) এবং অবশেষে এটি ফেলে দেওয়া ( rm -r <dir>)।
পিডিপি

105

যদিও প্রতি সেফটি মার্জ নয় , কখনও কখনও অন্য শাখায় অন্য ফাইলের সম্পূর্ণ সামগ্রীর প্রয়োজন হয়। জেসন রুডলফের ব্লগ পোস্টটি একটি শাখা থেকে অন্য শাখায় ফাইলগুলি অনুলিপি করার সহজ উপায় সরবরাহ করে। কৌশলটি নিম্নরূপ প্রয়োগ করুন:

$ git checkout branch1 # ensure in branch1 is checked out and active
$ git checkout branch2 file.py

এখন file.pyএখন শাখা 1 এ


91
সহজ, কিন্তু যে না আসলে একটি ব্যাপার একত্রীকরণ । এটি কেবল file.pyশাখা 2 এ যা আছে তা দিয়ে ওভাররাইট করে
গ্রেগ হিউগিল

আপনি যদি শাখা 1 থেকে শাখা 2 এ ফাইলটি আবার মার্জ করে দেন? আপনি দ্বন্দ্ব পেতে হবে!
আমির

এটি কি ইতিহাস প্রতিশ্রুতিবদ্ধ রাখে?
সি

18

অন্যান্য বর্তমান উত্তরগুলির মধ্যে কোনটিই আসলে ফাইলগুলিকে "মার্জ" করবে না, যেন আপনি মার্জ কমান্ডটি ব্যবহার করছেন। (সর্বোত্তমভাবে তাদের আপনাকে ম্যানুয়ালি পৃথকীকরণগুলি বেছে নেওয়ার প্রয়োজন হবে you) যদি আপনি প্রকৃতপক্ষে কোনও সাধারণ পূর্বপুরুষের কাছ থেকে তথ্যটি ব্যবহার করার সুযোগ নিতে চান তবে আপনি গিটের "অ্যাডভান্সড মার্জিং" বিভাগে পাওয়া কোনওটির ভিত্তিতে একটি পদ্ধতি অনুসরণ করতে পারেন g ব্যবহৃত গ্রন্থ.

এই প্রোটোকলের জন্য, আমি ধরে নিচ্ছি যে আপনি উত্স / মাস্টার থেকে হেডের মধ্যে 'path / to / file.txt' ফাইলটি মার্জ করতে চাইছেন - যথাযথ হিসাবে সংশোধন করুন। (আপনাকে আপনার সংগ্রহস্থলের শীর্ষ ডিরেক্টরিতে থাকতে হবে না তবে এটি সহায়তা করে))

# Find the merge base SHA1 (the common ancestor) for the two commits:
git merge-base HEAD origin/master

# Get the contents of the files at each stage
git show <merge-base SHA1>:path/to/file.txt > ./file.common.txt
git show HEAD:path/to/file.txt > ./file.ours.txt
git show origin/master:path/to/file.txt > ./file.theirs.txt

# You can pre-edit any of the files (e.g. run a formatter on it), if you want.

# Merge the files
git merge-file -p ./file.ours.txt ./file.common.txt ./file.theirs.txt > ./file.merged.txt

# Resolve merge conflicts in ./file.merged.txt
# Copy the merged version to the destination
# Clean up the intermediate files

গিট মার্জ-ফাইলে আপনার ডিফল্ট একত্রিতকরণ সেটিংস ফর্ম্যাটিং এবং এর মতো ব্যবহার করা উচিত।

আরও মনে রাখবেন যে আপনার "আমাদের" যদি ওয়ার্কিং কপির সংস্করণ হয় এবং আপনি অতিরিক্ত সতর্ক হতে না চান তবে আপনি সরাসরি ফাইলটিতে অপারেট করতে পারেন:

git merge-base HEAD origin/master
git show <merge-base SHA1>:path/to/file.txt > ./file.common.txt
git show origin/master:path/to/file.txt > ./file.theirs.txt
git merge-file path/to/file.txt ./file.common.txt ./file.theirs.txt

15

সব পরিবর্তন হয় file.pyমধ্যে branch2তাদের নিজস্ব করে এ, অন্যান্য ফাইল পরিবর্তন থেকে পৃথক? যদি তা হয় তবে আপনি সহজেই উপরের cherry-pickপরিবর্তনগুলি করতে পারেন :

git checkout branch1
git cherry-pick <commit-with-changes-to-file.py>

অন্যথায়, mergeপৃথক পাথগুলি চালিত করে না ... আপনি কেবল এবং এর থেকে পরিবর্তনের git diffপ্যাচ তৈরি করতে পারেন :file.pybranch2git applybranch1

git checkout branch2
git diff <base-commit-before-changes-to-file.py> -- file.py > my.patch
git checkout branch1
git apply my.patch

8

আপনি stashএবং stash popফাইলটি করতে পারেন :

git checkout branch1
git checkout branch2 file.py
git stash
git checkout branch1
git stash pop

এই শাখা 1 / file.py শাখার 2 / file.py এর বিষয়বস্তুর সাথে ওভাররাইট করে পরিবর্তিত হওয়ার জন্য মার্জ সংঘাত বাড়াতে হবে।
প্লামসেমপি

2

কেবল শাখা 2 এর পরিবর্তনগুলি মার্জ file.pyকরতে, অন্যান্য পরিবর্তনগুলি দূরে সরিয়ে দিন।

git checkout -B wip branch2
git read-tree branch1
git checkout branch2 file.py
git commit -m'merging only file.py history from branch2 into branch1'
git checkout branch1
git merge wip

মার্জ এমনকি অন্য কোনও ফাইলের দিকে তাকাবে না। গাছগুলি যথেষ্ট আলাদা হলে আপনার চেকআউটগুলি '-f' করতে হবে to

মনে রাখবেন যে এটি শাখা 1 কে এমনভাবে দেখবে যে শাখা 2 এর ইতিহাসের সমস্ত কিছু সেই বিন্দুতে মিশে গেছে, যা আপনি চান তা নাও হতে পারে। উপরের প্রথম চেকআউটের আরও ভাল সংস্করণ সম্ভবত

git checkout -B wip `git merge-base branch1 branch2`

এই ক্ষেত্রে কমিটের বার্তাটিও সম্ভবত হওয়া উচিত

git commit -m"merging only $(git rev-parse branch2):file.py into branch1"

0

আমি একই পরিস্থিতিতে আছি, আমি একটি শাখা থেকে একটি ফাইল মার্জ করতে চাই যার উপর 2 টি শাখায় অনেকগুলি কমিট রয়েছে। আমি উপরোক্ত বিভিন্ন উপায়ে চেষ্টা করেছি এবং অন্যগুলি আমি ইন্টারনেটে পেয়েছি এবং সমস্ত ব্যর্থ হয়েছে (কারণ প্রতিশ্রুতিবদ্ধ ইতিহাস জটিল) সুতরাং আমি আমার পথটি (পাগলের মতো) করার সিদ্ধান্ত নিই।

git merge <other-branch>
cp file-to-merge file-to-merge.example
git reset --hard HEAD (or HEAD^1 if no conflicts happen)
cp file-to-merge.example file-to-merge

0

আমি যা করেছি তা কিছুটা ম্যানুয়াল, তবে আমি:

  1. শাখাগুলি সাধারণত মার্জ করা; এর সাথে একত্রীকরণকে ফিরিয়ে দেওয়া হয়েছে revert;
  2. আমার সমস্ত ফাইল এতে পরীক্ষা করা হয়েছে HEAD~1, অর্থাত্ মার্জ কমিটে তাদের অবস্থা;
  3. প্রতিশ্রুতিবদ্ধ ইতিহাস থেকে এই হ্যাকারিটি আড়াল করার জন্য আমার প্রতিশ্রুতিগুলি পুনরায় স্থাপন করেছেন।

কুশ্রী? হ্যাঁ. মনে রাখা সহজ? হ্যাঁ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.