কমিটগুলি মার্জ করার পরিবর্তে আমি কীভাবে একটি একক ফাইলে পরিবর্তনগুলি মার্জ করব?


382

আমার দুটি শাখা আছে (এ এবং বি) এবং আমি শাখা এ থেকে একটি একক ফাইল শাখা বি থেকে সংশ্লিষ্ট একক ফাইলের সাথে একত্রীকরণ করতে চাই


2

27
যা অন্য পোস্টে প্রতিক্রিয়া অধিকাংশই বেছে বেছে একত্রীকরণ কিভাবে চলেছেন করে না ফাইল । এটি নির্বাচিত উত্তরটিকে ভুল করে তোলে। প্রশ্নটি উত্তরহীন রয়ে গেছে।


এই উত্তরটি যাওয়ার উপায়, আইএমও। git diff branch_name > patch git apply patchstackoverflow.com/a/9473543/1091853
blamb

উত্তর:


630

আমি একই সমস্যা জুড়ে এসেছি। সুনির্দিষ্টভাবে বলতে গেলে , আমার দুটি শাখা রয়েছে Aএবং Bএকই ফাইলগুলি রয়েছে তবে কিছু ফাইলগুলিতে ভিন্ন প্রোগ্রামিং ইন্টারফেস রয়েছে। এখন ফাইলের পদ্ধতিগুলি f, যা দুটি শাখায় ইন্টারফেসের পার্থক্যের থেকে পৃথক, শাখায় পরিবর্তিত হয়েছিল B, তবে পরিবর্তনটি উভয় শাখার জন্য গুরুত্বপূর্ণ। সুতরাং, আমি শুধু ফাইল মার্জ করতে প্রয়োজন fশাখার Bফাইলে fশাখার A

একটি সাধারণ কমান্ড ইতিমধ্যে আমার জন্য সমস্যার সমাধান করেছে যদি আমি ধরে নিই যে সমস্ত পরিবর্তনগুলি উভয় শাখায় প্রতিশ্রুতিবদ্ধ Aএবং B:

git checkout A

git checkout --patch B f

প্রথম কমান্ডটি শাখায় স্যুইচ করে A, যেখানে আমি Bফাইলটির সংস্করণটি মার্জ করতে চাই f। দ্বিতীয় কমান্ড ফাইল প্যাচ fসঙ্গে fএর HEADএর B। এমনকি আপনি প্যাচের একক অংশ গ্রহণ / বাতিল করতে পারেন। পরিবর্তে Bআপনি এখানে কোনও প্রতিশ্রুতি নির্দিষ্ট করতে পারেন, এটি হওয়ার দরকার নেই HEAD

সম্প্রদায় সম্পাদনা : যদি ফাইল fউপর Bউপস্থিত না Aএখনো, তারপর বাদ --patchবিকল্প। অন্যথায়, আপনি একটি "পরিবর্তন করবেন না" পাবেন। বার্তা।


10
আপনি কেবল কোনও ফাইল আপডেট করতে চাইলে এটি কাজ করে। আমি যদি শাখা বি থেকে শাখা এ একটি নতুন ফাইল যুক্ত করতে চাই তবে কী হবে?
উমায়ের এ।

25
@ উমাইআশরাফ - আপনি প্যাচ বিকল্পটি সরিয়ে বি থেকে ক এ একটি নতুন ফাইল যুক্ত করতে সক্ষম হবেন।
বিবাক

9
হুমম ... আমি যখন চেষ্টা করে দেখি তখন "কোনও পরিবর্তন হয় না" বার্তাটি পাই তবে স্পষ্টভাবে পরিবর্তন রয়েছে। ঠিক আছে, আমার যে ফোল্ডারে প্রাসঙ্গিক ফাইল ছিল সেখানে থাকা দরকার। সম্পাদনা:
স্ট্যাকওভারফ্লোতে

2
এটি কাজ করতে আমাকে ব্যবহার git checkout --patch B -- fকরতে হয়েছিল।
ব্যবহারকারীর 4545424

8
কেবল এটি যুক্ত করতে হবে যে আপনার যদি ফাইলটিতে একাধিক পরিবর্তন (কুন) থাকে এবং আপনি সেগুলি সব মঞ্চায়িত করতে চান তবে আপনি প্রতিটি সময় aটিপানোর পরিবর্তে ইন্টারেক্টিভ পর্যায়ে টিপতে পারেন y। অথবা git checkout B -- fপরিবর্তে কমান্ড ব্যবহার করুন।
দিমিত্রি গনচর

17

এই পরিস্থিতিতে আমি যা করি তা এখানে। এটি ক্লডজ তবে এটি আমার পক্ষে ঠিক কাজ করে।

  1. আপনার কার্যকারী শাখার বাইরে অন্য একটি শাখা তৈরি করুন।
  2. গিট টান / গিট সংশোধন (SHA1) মার্জ করে যা আপনার অনুলিপি করতে চান ফাইলটি ধারণ করে। সুতরাং এটি আপনার সমস্ত পরিবর্তনকে একীভূত করবে, তবে আমরা কেবল একটি ফাইল দখল করতে এই শাখাটি ব্যবহার করছি।
  3. আপনার ফাইল অনুসন্ধান করুন কোনও দ্বন্দ্ব ইত্যাদি ঠিক করুন।
  4. আপনার কার্যকারী শাখা চেকআউট করুন
  5. আপনার মার্জ থেকে কমিট করা ফাইলটি চেকআউট করুন।
  6. এটা কমিট।

আমি প্যাচিংয়ের চেষ্টা করেছি এবং আমার পরিস্থিতি এটির জন্য খুব খারাপ ছিল। সংক্ষেপে এটি দেখতে যেমন হবে:

কার্যকারিতা শাখা: একটি পরীক্ষামূলক শাখা: বি (ফাইল.txt রয়েছে যার মধ্যে পরিবর্তন রয়েছে যা আমি ভাঁজতে চাই))

git checkout A

এ এর ভিত্তিতে নতুন শাখা তৈরি করুন:

git checkout -b tempAB

বি টেম্পে মার্জ করুন

git merge B

মার্জ এর sha1 হ্যাশ অনুলিপি করুন:

git log

commit 8dad944210dfb901695975886737dc35614fa94e
Merge: ea3aec1 0f76e61
Author: matthewe <matthewe@matthewe.com>
Date:   Wed Oct 3 15:13:24 2012 -0700

Merge branch 'B' into tempAB

আপনার কার্যকারী শাখা চেকআউট করুন:

git checkout A

আপনার ফিক্স-আপ ফাইলটি চেকআউট করুন:

git checkout 7e65b5a52e5f8b1979d75dffbbe4f7ee7dad5017 file.txt

এবং সেখানে আপনার এটি থাকা উচিত। আপনার ফলাফল প্রতিশ্রুতিবদ্ধ।


3
সুতরাং আমরা এই সব করতে হবে শুধু একটি একক ফাইল মার্জ করতে? অন্য শাখায় ফাইলটি অনুলিপি করা এবং পেস্ট করা সহজ হবে না
রবিন

1
@ রবিন সম্ভবত তা নয়, কারণ ফাইলটিতে মার্জ করা পরিবর্তনগুলি রাখে, যা শাখা এ এবং বি এর মধ্যে পৃথক হয় ফাইলটি অনুলিপি করা আপনার কার্যকরী শাখা A এর মধ্যে কোনও অতিরিক্ত পার্থক্য ওভাররেইট করে দেবে, এবং আপনি বি থেকে কী আনতে চেয়েছিলেন, এতে নাও থাকতে পারে যারা প্রবেশ / সম্পাদনা। উদাহরণস্বরূপ সন্দেহভাজন অন্যভাবে শুরু করা Aথেকে Bশুরু করে। অনুলিপি করা এই পার্থক্যগুলি মুছে ফেলবে।
ব্লেম

13

এটি গিটের অভ্যন্তরীণ ডিফ্টল ব্যবহার করে। হতে পারে সামান্য কাজ কিন্তু সরাসরি এগিয়ে।

#First checkout the branch you want to merge into
git checkout <branch_to_merge_into>

#Then checkout the file from the branch you want to merge from
git checkout <branch_to_merge_from> -- <file> 

#Then you have to unstage that file to be able to use difftool
git reset HEAD <file> 

#Now use difftool to chose which lines to keep. Click on the mergebutton in difftool
git difftool

#Save the file in difftool and you should be done.

1
--(খালি আর্গুমেন্ট লেবেল) এর ব্যবহার স্পষ্ট করার জন্য , গিট চেকআউট ডক্স: যুক্তিযুক্ত ডিসসামবিগেশনটি বলুন: " git checkout -- <pathspec>আপনি যদি সূচিগুলির বাইরে এই পাথগুলি চেকআউট করতে চান তবে ব্যবহার করুন ।" এর কারণ আপনার একই নামে একটি শাখা এবং একটি ফাইল / পাথ উভয়ই থাকতে পারে। এই ধরনের ক্ষেত্রে, যখন উভয় বিদ্যমান থাকে তখন শাখা বা পথটি পরীক্ষা করা উচিত কিনা তা ছিন্ন করার জন্য আপনাকে জিজ্ঞাসা করার পরিবর্তে, গিটটি ডিফল্টভাবে শাখাটি চেকআউট করতে পছন্দ করে। তবে --গিট আগে থাকলে ফাইল / পাথ পরিবর্তে চেকআউট করবে।
শেরিলহোমন 21

8

আমি এই পদ্ধতিটি সহজ এবং দরকারী বলে খুঁজে পেয়েছি: অন্য শাখা থেকে নির্দিষ্ট ফাইলগুলিকে কীভাবে "মার্জ" করা যায়

দেখা যাচ্ছে, আমরা খুব চেষ্টা করছি। আমাদের ভাল বন্ধু গিট চেকআউটটি কাজের জন্য সঠিক সরঞ্জাম।

git checkout source_branch <paths>...

আমরা কেবলমাত্র গিটার চেকআউটটি বৈশিষ্ট্য শাখার নাম এবং নির্দিষ্ট সংস্থাগুলির জন্য পাথগুলি দিতে পারি যা আমরা আমাদের মাস্টার শাখায় যুক্ত করতে চাই।

আরও বোঝার জন্য দয়া করে পুরো নিবন্ধটি পড়ুন


2
এটি ফাইলগুলি ওভাররাইট করে, এটি তাদের মার্জ করে না
অ্যালেক্স জি

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

আমি সম্মত হই যে এটি ওভাররাইট করে। আমি মনে করি আপনি -pএই কমান্ডের বিকল্পটি ব্যবহার করতে চেয়েছিলেন । যার পরে, দুর্ভাগ্যক্রমে, প্যাচ পরিবর্তনের আগে, আপনার ওয়ার্কট্রি ফাইলের কোনও অংশ যা পূর্বে আপনার চেক আউট থেকে শাখা থেকে ডাইভার্ট করেছে overw
ব্লেব

ভাল ধারণাটি ২০০৯ সালের ছিল, সম্ভাবনাগুলি হ'ল গিটের নতুন সংস্করণটি আলাদাভাবে আচরণ করে এবং -পি বা অন্য কিছু প্রয়োজন তবে যখন আমি এটি পোস্ট করছিলাম তখন এটি আমার পক্ষে কাজ করে যাচ্ছিল, তবে আবার সম্ভবত আমি ফাইলগুলি ওভাররাইড হওয়ার বিষয়ে চিন্তা করিনি, কারণ সর্বশেষ সংস্করণটি আমার যা প্রয়োজন ছিল তা ছিল
পাভেল সিওচ

7

আপনি ব্যবহার করতে পারেন:

    git merge-file

টিপ: https://www.kernel.org/pub/software/scm/git/docs/git- विसरा- ফাইল ফাইল html


2
আমি কেবল একটি ফাইল মার্জ করার চেষ্টা করছি, তবে অন্য একটি শাখা থেকে। আমি অন্য একটি শাখা থেকে মার্জ করার বিকল্পটি দেখতে পাচ্ছি নাgit merge-file
ব্লেম করুন

3

নিম্নলিখিত কমান্ডটি (1) সঠিক শাখার ফাইলের তুলনা করবে, মাস্টার (2) ইন্টারেক্টিভভাবে আপনাকে জিজ্ঞাসা করবে যে কোন পরিবর্তনগুলি প্রয়োগ করতে হবে।

গিট চেকআউট - প্যাচ মাস্টার


0

আমার সম্পাদনা প্রত্যাখ্যান করা হয়েছে, সুতরাং আমি এখানে একটি প্রত্যন্ত শাখা থেকে মার্জ করা পরিবর্তনগুলি কীভাবে পরিচালনা করব তা সংযুক্ত করছি।

যদি কোনও ভুল মার্জ করার পরে এটি করতে হয় তবে আপনি এটির মতো কিছু করতে পারেন:

# If you did a git pull and it broke something, do this first
# Find the one before the merge, copy the SHA1
git reflog
git reset --hard <sha1>

# Get remote updates but DONT auto merge it
git fetch github 

# Checkout to your mainline so your branch is correct.
git checkout develop 

# Make a new branch where you'll be applying matches
git checkout -b manual-merge-github-develop

# Apply your patches
git checkout --patch github/develop path/to/file
...

# Merge changes back in
git checkout develop
git merge manual-merge-github-develop # optionally add --no-ff

# You'll probably have to
git push -f # make sure you know what you're doing.

0

ধরে নেওয়া বি বর্তমান শাখা:

$ git diff A <file-path> > patch.tmp
$ git apply patch.tmp -R

দ্রষ্টব্য যে এটি কেবলমাত্র স্থানীয় ফাইলে পরিবর্তনগুলি প্রয়োগ করে। আপনার পরে প্রতিশ্রুতিবদ্ধ করতে হবে।


আমার জন্য এটি একটিerror: <file-path>: already exists in working directory
কনটুর

আপনার বর্তমান ডিরেক্টরিতে ফাইল বা ফাইলের সুনির্দিষ্ট করা উচিত। আমি ব্যবহার করছিgit diff Branch_A <file-path, filename> -- hash_commit > file_name.temp
আর.চ্যাটসিরি

0

আপনি একীভূত করতে ফাইলটির পুরানো সংস্করণটি চেকআউট করতে পারেন, এটি অন্য নামে সংরক্ষণ করে, তারপরে আপনার মার্জ সরঞ্জামটি দুটি ফাইলের মধ্যে যা চালান।

যেমন।

git show B:src/common/store.ts > /tmp/store.ts (যেখানে বি শাখার নাম / প্রতিশ্রুতি / ট্যাগ)

meld src/common/store.ts /tmp/store.ts


0

আমি যেমন এটি করব

git format-patch branch_old..branch_new file

এটি ফাইলের জন্য একটি প্যাচ তৈরি করবে।

লক্ষ্য ব্রাঞ্চ_লচে প্যাচ প্রয়োগ করুন

git am blahblah.patch


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