কীভাবে বেছে বেছে মার্জ করবেন বা গিটের অন্য একটি শাখা থেকে পরিবর্তনগুলি বেছে নিন?


1449

আমি একটি নতুন প্রকল্পে গিট ব্যবহার করছি যার দুটি সমান্তরাল রয়েছে - তবে বর্তমানে পরীক্ষামূলক - উন্নয়ন শাখা:

  • master: বিদ্যমান কোডবেস প্লাস কয়েকটি মোডের আমদানি যা আমি সাধারণত নিশ্চিত
  • exp1: পরীক্ষামূলক শাখা # 1
  • exp2: পরীক্ষামূলক শাখা # 2

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

অন্য সমস্ত কিছু ফেলে রেখে এক উন্নয়ন শাখা থেকে অন্য উন্নয়ন শাখায় মার্জ করার সর্বোত্তম উপায় কী?

পদ্ধতির আমি বিবেচনা করেছি:

  1. git merge --no-commit ম্যানুয়াল আনস্টেজিংয়ের পরে বিপুল সংখ্যক সম্পাদনাগুলি যা আমি শাখাগুলির মধ্যে সাধারণ করতে চাই না।

  2. অস্থায়ী ডিরেক্টরিতে সাধারণ ফাইলগুলির ম্যানুয়াল অনুলিপি followed git checkout এবং তারপরে অন্য শাখায় স্থানান্তরিত করার জন্য এবং তারপরে অস্থায়ী ডিরেক্টরি থেকে কার্যকারী ট্রিতে অনুলিপি করা যায়।

  3. উপরের উপর একটি প্রকরণ। expআপাতত শাখা ত্যাগ করুন এবং পরীক্ষার জন্য দুটি অতিরিক্ত স্থানীয় সংগ্রহস্থল ব্যবহার করুন। এটি ফাইলগুলির ম্যানুয়াল অনুলিপিটিকে আরও সোজা করে তোলে।

এই তিনটি পদ্ধতিরই ক্লান্তিকর এবং ত্রুটি-প্রবণ বলে মনে হচ্ছে। আমি আরও ভাল পদ্ধতির আশা করছি; ফিল্টার পাথের প্যারামিটারের মতো কিছু যা git-mergeআরও নির্বাচনী করে তোলে ।


5
যদি আপনার পরীক্ষামূলক শাখাগুলির পরিবর্তনগুলি পৃথক কমিটে ভালভাবে সংগঠিত হয়, তবে নির্বাচনী ফাইলগুলির পরিবর্তে নির্বাচনী কমিটিগুলি মার্জ করার ক্ষেত্রে বিবেচনা করা ভাল better নীচের উত্তরগুলির বেশিরভাগই এটি ধরে নেওয়া অনুমান করে।
আকাইহোলা

2
git merge -s ours --no-commitকিছু দ্বারা অনুসরণ সংমিশ্রণ কি এটির জন্য git read-treeভাল সমাধান হতে পারে না? দেখুন stackoverflow.com/questions/1214906/...
VonC

34
: একটি আরো সাম্প্রতিক প্রশ্ন একটি এক লাইন, ভালো করে লেখা উত্তর আছে stackoverflow.com/questions/10784523/...
brahn

উত্তর:


475

আপনি চেরি-পিক ব্যবহার করুন একটি শাখা থেকে পৃথক কমিট পেতে কমান্ডটি ।

আপনি যে পরিবর্তন (গুলি) চান তা যদি স্বতন্ত্র কমিটে না থাকে তবে কমিটকে পৃথক কমিটে ভাগ করতে এখানে প্রদর্শিত পদ্ধতিটি ব্যবহার করুন । মোটামুটিভাবে বলতে গেলে, আপনি git rebase -iসম্পাদনার জন্য মূল প্রতিশ্রুতিটি পেতে, তারপরে git reset HEAD^বেছে বেছে পরিবর্তনগুলি ফিরিয়ে আনতে ব্যবহার করেনgit commit সেই বিটটিকে ইতিহাসের নতুন প্রতিশ্রুতি হিসাবে প্রতিপন্ন করার জন্য ব্যবহার করেন।

রেড হ্যাট ম্যাগাজিনে এখানে আরও একটি দুর্দান্ত পদ্ধতি রয়েছে , যেখানে তারা ব্যবহার করে git add --patchবা সম্ভবত git add --interactiveআপনি কোনও পৃথক ফাইলে বিভিন্ন পরিবর্তনগুলি বিভক্ত করতে চান ("বিভক্ত" জন্য এই পৃষ্ঠায় সন্ধান করুন), আপনাকে একটি কুঁচকের কেবলমাত্র কিছু অংশ যুক্ত করতে দেয়।

পরিবর্তনগুলি বিভক্ত করার পরে, আপনি এখন নিজের পছন্দমতো চেরি-বাছাই করতে পারেন।


14
আমার বোধগম্যতা থেকে, এটি উচ্চ-ভোটযুক্ত উত্তরের চেয়ে অকারণে আরও সংঘবদ্ধ।
আলেকজান্ডার বার্ড

54
এটি প্রযুক্তিগতভাবে সঠিক উত্তর, সঠিক উত্তরটি "সংশ্লেষিত" উপস্থিত হয়। --- উচ্চতর ভোট দেওয়া উত্তরটি কেবল একটি দ্রুত এবং নোংরা "উত্তর দেয়" উত্তরটি, যা বেশিরভাগ মানুষের কাছে তারা প্রায় সমস্তই ছিল (:
জ্যাকব

3
@ কাইহোলা: হেড ^ সঠিক। ম্যান গিট-রেভ-পার্স দেখুন: রিভিশন প্যারামিটারের প্রত্যয় means মানে সেই প্রতিশ্রুতিবদ্ধ বস্তুর প্রথম পিতামাতা। প্রত্যয় ^ স্বরলিপিটি প্রতিশ্রুতিবদ্ধতা থেকে পৌঁছনীয় কমিটগুলি বাদ দেওয়ার জন্য ব্যবহৃত হয়।
টাইলার রিক

13
: আমি শুধু আরেকটি পদ্ধতির যা cleanest এবং কম তাদের সমস্ত সংবর্ত বলে মনে হয় শেয়ার করতে চেয়েছিলেন jasonrudolph.com/blog/2009/02/25/... মোট সরলতা এবং সন্ত্রস্ত
superuseroi

14
কোন পদ্ধতির 'সঠিক' তা নিয়ে বিতর্ক নিয়ে বিভ্রান্ত? ফাইল এবং কমিটের মধ্যে পার্থক্য বিবেচনা করুন (নীচে মন্তব্যগুলি দেখুন) । ওপি ফাইলগুলিকে একীভূত করতে চায় এবং কমিটগুলির উল্লেখ করে না। উচ্চ-ভোট প্রাপ্ত উত্তর ফাইলগুলির জন্য নির্দিষ্ট; গৃহীত উত্তরটি চেরি-পিক ব্যবহার করে, যা কমিটের জন্য নির্দিষ্ট। নির্বাচনের মাধ্যমে কমিটিকে মার্জ করার জন্য চেরি-পিকটি মূল হতে পারে তবে ফাইলগুলি একটি শাখা থেকে অন্য শাখায় স্থানান্তরিত করার জন্য এটি অত্যন্ত বেদনাদায়ক হতে পারে। যদিও কমিটগুলি গিটের শক্তির কেন্দ্রস্থল, তবুও ফাইলগুলির একটি ভূমিকা আছে তা ভুলে যাবেন না!
কে ভি

970

আপনার উপরে উল্লিখিত ঠিক একই সমস্যাটি আমার ছিল। তবে উত্তরটি ব্যাখ্যা করতে গিয়ে আমি এই পরিষ্কার পেলাম ।

সারসংক্ষেপ:

  • আপনি যে শাখাটি মার্জ করতে চান তা থেকে পথ (গুলি) পরীক্ষা করুন,

    $ git checkout source_branch -- <paths>...
    

    ইঙ্গিত: এটি --লিঙ্কযুক্ত পোস্টে না দেখেও কাজ করে ।

  • বা বাছাই করে বাছাই করে ks

    $ git checkout -p source_branch -- <paths>...
    

    বিকল্পভাবে, পুনরায় সেট করুন এবং তারপরে বিকল্পটি যুক্ত করুন -p,

    $ git reset <paths>...
    $ git add -p <paths>...
    
  • শেষ পর্যন্ত প্রতিশ্রুতিবদ্ধ

    $ git commit -m "'Merge' these changes"
    

9
বার্ট জে এর লিঙ্কযুক্ত নিবন্ধটি সর্বোত্তম পন্থা। পরিষ্কার, সহজ, একটি কমান্ড। এটি আমি ব্যবহার করতে চলেছি। :)
পিস্তোস

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

10
@mykhal এবং অন্যদের: এই সূচক ফাইল পর্যায়ে স্বয়ংক্রিয়ভাবে যাতে করে আপনি যদি চেক আউট foo.cকরতে git reset HEAD foo.cযে ফাইল unstage এবং আপনি তারপর, এটা বিবিধতা পারবেন না। আমি এটি চেষ্টা করে খুঁজে পেয়েছি এবং এর উত্তর খুঁজতে এখানে ফিরে এসেছি
মিচিয়াকিগ

12
আপনি যে পরিবর্তনগুলি ব্যবহার করতে পারেন তা দেখতে:git diff --cached
ওডারওয়াত

9
এই উত্তর অনুসারে git checkout -p <revision> -- <path>আপনি বর্ণিত প্রথম তিনটি আদেশ জারি করার সমান হবে :)
7hi4g0

337

নির্বাচিতভাবে একটি শাখা থেকে অন্য শাখায় ফাইলগুলি মার্জ করতে, চালান

git merge --no-ff --no-commit branchX

branchXবর্তমান শাখায় আপনি যে শাখাটি মার্জ করতে চান তা কোথায় ।

--no-commitবিকল্প আসলে তাদের সংগঠনের ছাড়া ফাইল যে গীত দ্বারা মার্জ করা হয়েছে মঞ্চ হবে। এটি আপনাকে মার্জড ফাইলগুলিকে পরিবর্তন করতে এবং তারপরে সেগুলি নিজেই প্রতিশ্রুতিবদ্ধ করার সুযোগ দেবে।

আপনি কীভাবে ফাইলগুলি মার্জ করতে চান তার উপর নির্ভর করে চারটি কেস রয়েছে:

1) আপনি একটি সত্য মার্জ করতে চান।

এই ক্ষেত্রে, আপনি গিটগুলি স্বয়ংক্রিয়ভাবে মার্জ হয়ে যাওয়ার পরে মার্জ করা ফাইলগুলি গ্রহণ করেন এবং তারপরে তাদের প্রতিশ্রুতিবদ্ধ।

2) কিছু ফাইল রয়েছে যা আপনি মার্জ করতে চান না।

উদাহরণস্বরূপ, আপনি বর্তমান শাখায় সংস্করণ ধরে রাখতে চান এবং যে শাখায় আপনি মার্জ করছেন তাতে সংস্করণটি উপেক্ষা করতে চান।

বর্তমান শাখায় সংস্করণ নির্বাচন করতে, চালান:

git checkout HEAD file1

এটি file1বর্তমান শাখায় সংস্করণটি পুনরুদ্ধার করবে এবং file1গিট দ্বারা স্বতঃবৃত্তিকে ওভাররাইট করবে ।

3) আপনি যদি শাখা-এ সংস্করণ চান (এবং সত্যিকারের মার্জ না)।

চালান:

git checkout branchX file1

এটি file1ইন এর সংস্করণ পুনরুদ্ধার করবে branchXএবং file1গিট দ্বারা স্বয়ংক্রিয়ভাবে মার্জ হওয়া ওভাররাইট করবে ।

4) শেষ কেসটি যদি আপনি কেবলমাত্র নির্দিষ্ট মার্জগুলিতে নির্বাচন করতে চান file1

এই ক্ষেত্রে, আপনি file1সরাসরি সংশোধিত সম্পাদনা করতে পারেন, সংস্করণটি আপনি যেটি চান তা আপডেট করুন file1এবং তারপরে প্রতিশ্রুতিবদ্ধ।

যদি গিট কোনও ফাইল স্বয়ংক্রিয়ভাবে মার্জ করতে না পারে তবে এটি ফাইলটিকে " আনারমিড " হিসাবে প্রতিবেদন করবে এবং একটি অনুলিপি তৈরি করবে যেখানে আপনাকে ম্যানুয়ালি দ্বন্দ্বগুলি সমাধান করতে হবে।



একটি উদাহরণের সাথে আরও ব্যাখ্যা করতে, আসুন আমরা বলি যে আপনি মার্জ করতে চান branchX বর্তমান শাখায় :

git merge --no-ff --no-commit branchX

তারপরে আপনি git statusপরিবর্তিত ফাইলগুলির স্থিতি দেখতে কমান্ডটি চালান ।

উদাহরণ স্বরূপ:

git status

# On branch master
# Changes to be committed:
#
#       modified:   file1
#       modified:   file2
#       modified:   file3
# Unmerged paths:
#   (use "git add/rm <file>..." as appropriate to mark resolution)
#
#       both modified:      file4
#

কোথায় file1,file2 এবং file3ফাইলগুলি গিটটি সফলভাবে স্বয়ংক্রিয়ভাবে মার্জ হয়েছে।

এর অর্থ কী এটি যে পরিবর্তন করে master এবং branchXযারা তিন ফাইলগুলি সমস্ত জন্য কোনো দ্বন্দ্ব ছাড়া একসঙ্গে সংযুক্ত করা হয়েছে।

আপনি কীভাবে চালনা করে মার্জটি করা হয়েছিল তা পরিদর্শন করতে পারেন git diff --cached;

git diff --cached file1
git diff --cached file2
git diff --cached file3

যদি আপনি কিছু মার্জটি অযাচিত পান তবে আপনি এটি করতে পারেন

  1. ফাইলটি সরাসরি সম্পাদনা করুন
  2. সংরক্ষণ
  3. git commit

আপনি যদি মার্জ করতে চান না file1 না এবং বর্তমান শাখায় সংস্করণ ধরে রাখতে চান

চালান

git checkout HEAD file1

আপনি যদি মার্জ করতে চান না file2 এবং কেবল সংস্করণটি চানbranchX

চালান

git checkout branchX file2

তুমি যদি চাও file3 স্বয়ংক্রিয়ভাবে একত্রী হতে কিছু করবেন না।

গিট ইতিমধ্যে এ পর্যায়ে এটি একীভূত করেছে।


file4উপরে গিট দ্বারা ব্যর্থ একীকরণ। এর অর্থ উভয় শাখায় পরিবর্তন রয়েছে যা একই লাইনে ঘটে। এখান থেকেই আপনাকে দ্বন্দ্বগুলি ম্যানুয়ালি সমাধান করতে হবে। আপনি যে শাখায় file4পরিণত হতে চান সেই সংস্করণটির জন্য সরাসরি ফাইল সম্পাদনা করে বা চেকআউট কমান্ডটি চালিয়ে আপনি মার্জটি বাতিল করতে পারেন ।


শেষ পর্যন্ত, ভুলবেন না git commit


10
সতর্কতা অবলম্বন করুন: যদি এটি git merge --no-commit branchXকেবলমাত্র দ্রুত-অগ্রসর হয় তবে পয়েন্টারটি আপডেট করা হবে এবং
--no-কমিটকে

16
@cfi --no-ffএই আচরণটি রোধ করতে কী যোগ করার কথা?
এডুয়ার্ডো কস্তার

5
আমি অবশ্যই এই উত্তরটি এডুয়ার্ডোর "--no-ff" বিকল্পের সাথে আপডেট করার পরামর্শ দিচ্ছি। আমি পুরো জিনিসটি পড়েছি (যা অন্যথায় দুর্দান্ত ছিল) কেবলমাত্র আমার মার্জটি দ্রুত-ফরওয়ার্ড করার জন্য।
Funktr0n

7
এই সমাধানটি সেরা ফলাফল এবং নমনীয়তা দেয়।
থিয়াগো ম্যাসাডো

20
সর্বাধিক ভোটের উত্তরের বিপরীতে, এই সমাধানটি আমার একত্রীকরণের ইতিহাসটি সংরক্ষণ করেছে, যা শাখাগুলিতে আমি আংশিক প্রতিশ্রুতি রেখেছি এবং আমার পক্ষে গুরুত্বপূর্ণ। আমি প্রস্তাবিত অন্যান্য সমাধানগুলির সমস্ত চেষ্টা করি নি, তাই সম্ভবত তাদের মধ্যে কেউ কেউ এটিও করেন।
ws_e_c421

107

আমি উপরের পদ্ধতিগুলি পছন্দ করি না। একক পরিবর্তন বাছাইয়ের জন্য চেরি-পিক ব্যবহার দুর্দান্ত, তবে আপনি যদি কিছু খারাপ পরিবর্তন বাদে সমস্ত পরিবর্তন আনতে চান তবে এটি একটি ব্যথা। এই আমার পদ্ধতির।

--interactiveগিট একীকরণে আপনি পাস করতে পারেন এমন কোনও যুক্তি নেই ।

বিকল্পটি এখানে:

আপনার শাখার 'বৈশিষ্ট্যটিতে' কিছু পরিবর্তন রয়েছে এবং আপনি কিছু না কিছু আনতে চান তবে তাদের সবাইকে 'নিবিড়ভাবে না করে' মাস্টারের কাছে আনতে চান (অর্থাত আপনি প্রতিটি চেরিকে বেছে নিতে এবং প্রতিশ্রুতি দিতে চান না)

git checkout feature
git checkout -b temp
git rebase -i master

# Above will drop you in an editor and pick the changes you want ala:
pick 7266df7 First change
pick 1b3f7df Another change
pick 5bbf56f Last change

# Rebase b44c147..5bbf56f onto b44c147
#
# Commands:
# pick = use commit
# edit = use commit, but stop for amending
# squash = use commit, but meld into previous commit
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#

git checkout master
git pull . temp
git branch -d temp

সুতরাং কেবল শেল স্ক্রিপ্টে এটি মুড়িয়ে রাখুন, মাস্টারকে $ টুতে এবং বৈশিষ্ট্যটি $ এ পরিবর্তন করুন এবং আপনি যেতে ভাল:

#!/bin/bash
# git-interactive-merge
from=$1
to=$2
git checkout $from
git checkout -b ${from}_tmp
git rebase -i $to
# Above will drop you in an editor and pick the changes you want
git checkout $to
git pull . ${from}_tmp
git branch -d ${from}_tmp

আমি স্থির বিন্যাস - এই বেশ সুন্দর পদ্ধতি, যদি তোমরা করে একটি নির্বাচন করতে চান
1800 তথ্য

আমি এখন এই কৌশলটি ব্যবহার করছি এবং মনে হচ্ছে এটি সত্যই ভাল কাজ করেছে।
dylanfm

4
আপনি হয়ত এতে পরিবর্তন git rebase -i $toকরতে চাইতে পারেন git rebase -i $to || $SHELL, যাতে git --skipরিবেস ব্যর্থ হলে ব্যবহারকারী প্রয়োজন মতো কল করতে পারেন। নিউলাইনগুলির &&পরিবর্তে একসাথে লাইনের শৃঙ্খলাবদ্ধ worth
সিরোলিটন

2
দুর্ভাগ্যক্রমে, এটির উত্তরের লিঙ্কটি মারা গেছে।
টমাসডাব্লু

লিঙ্কটি কেবল মৃতই নয়, এটির ডাব্লুওটিওর দুর্বল খ্যাতি সতর্কতাও রয়েছে। অতএব আমি এটি সরিয়েছি।
জিন-ফ্রান্সোইস কর্পেট

93

আরও একটি উপায় আছে:

git checkout -p

এটা তোলে মধ্যে একটি মিশ্রণ হয় git checkoutএবং git add -pএবং বেশ করা ঠিক কি আপনি খুঁজছেন পারেন:

   -p, --patch
       Interactively select hunks in the difference between the <tree-ish>
       (or the index, if unspecified) and the working tree. The chosen
       hunks are then applied in reverse to the working tree (and if a
       <tree-ish> was specified, the index).

       This means that you can use git checkout -p to selectively discard
       edits from your current working tree. See the “Interactive Mode”
       section of git-add(1) to learn how to operate the --patch mode.

10
এটি এখন পর্যন্ত সবচেয়ে সহজ, সহজতম পদ্ধতি, যতক্ষণ না আপনি মার্জ করার জন্য কেবল পরিবর্তনযোগ্য সংখ্যক পরিবর্তন করে থাকেন I উদাহরণ: গিট চেকআউট
টাইলার রিক

1
এই প্রশ্নের অনুরূপ উত্তর পোস্ট করা হয়েছে: stackoverflow.com/a/11593308/47185
টাইলার রিক

ওহ, আমি চেকআউট একটি প্যাচ ছিল জানি না! পরিবর্তে আমি চেকআউট / পুনরায় সেট / অ্যাড-পি করেছি।
ড্যানিয়েল সি সোব্রাল

2
সত্যই সবচেয়ে সহজ পদ্ধতি। গিট চেকআউট-পি বৈশিষ্ট্যযুক্ত ব্র্যাঙ্ক ফাইলের নাম। এবং সেরাটি হ'ল কমান্ডটি চালিত হওয়ার পরে এটি আপনাকে অ্যায় / এন / ই /? / ... ইত্যাদি দেয়। ফাইলটি কীভাবে মার্জ করবেন তা সিদ্ধান্ত নিতে বিকল্প। আমি ই দিয়ে চেষ্টা করেছি এবং আবেদনের আগে আমি প্যাচটি সম্পাদনা করতে পারি ... এটি কত সুন্দর। অন্যান্য শাখা থেকে নির্বাচনী ফাইল মার্জ করার জন্য সত্যিকারের একটি লাইনার।
15.33 এ infoclogged

55

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

বলতে আপনি করতে দেয় master, exp1এবং exp2শাখা। আপনি প্রতিটি পরীক্ষামূলক শাখা থেকে একটি ফাইলকে মাস্টারে মার্জ করতে চান। আমি এই জাতীয় কিছু করব:

git checkout master
git checkout exp1 path/to/file_a
git checkout exp2 path/to/file_b

# save these files as a stash
git stash
# merge stash with master
git merge stash

এটি আপনাকে চাইলে প্রতিটি ফাইলের জন্য ইন-ফাইলের ভিন্নতা দেয়। বেশি কিছু না. কিছুই কম. আপনার ক্ষেত্রে সংস্করণগুলির মধ্যে মূলত পৃথক ফাইলের পরিবর্তন রয়েছে - আমার ক্ষেত্রে, রেল 2 থেকে রেল 3 এ একটি অ্যাপ্লিকেশন পরিবর্তন করা।

সম্পাদনা : এটি ফাইলগুলি মার্জ করবে, তবে একটি স্মার্ট মার্জ করবে। ইন-ফাইলের আলাদা তথ্য পেতে এই পদ্ধতিটি কীভাবে ব্যবহার করতে হয় তা আমি বুঝতে সক্ষম হয়েছি (সম্ভবত এটি এখনও চূড়ান্ত পার্থক্যের জন্য হবে ites হোয়াইটস্পেসের মতো বিরক্তিকর ছোট ছোট জিনিসগুলি আপনি -s recursive -X ignore-all-spaceবিকল্পটি ব্যবহার না করা হলে পুনরায় একত্রী হয়ে যাবে ))


4
আরও মনে রাখবেন: আপনি প্রদত্ত শাখা থেকে সমস্ত ইনলাইন একাধিক ফাইল করতে পারেন, যেমনgit checkout exp1 path/to/file_a path/to/file_x
ইমিলার

2
এটা সুন্দর. আমি git checkout feature <path>/*ফাইল গ্রুপ পেয়েছিলাম ।
ইশারউড

এটি ঠিক কাজ করে, তবে দুটি অতিরিক্ত কমিট অবজেক্ট যুক্ত করেছে। বিশাল চুক্তি নয় তবে কিছুটা অগোছালো
মাইটিপর্ক

@ মাইটিপোর্ক আপনি ঠিক বলেছেন দুর্ভাগ্যক্রমে, যেহেতু আমি এটি অনেক আগে লিখেছি, এখন আর নিশ্চিত নই যে "গিট কমিট" এর পরিবর্তে "গিট স্ট্যাশ" এবং "গিট মার্জ স্ট্যাশ" পদক্ষেপগুলি কেন সেখানে রয়েছে।
এরিক হু

2
ওহ যে পরিষ্কার, আমি মনে করি। এইভাবে এটি একটি ফাইলকে মার্জ করে, অগত্যা লক্ষ্য শাখায় পূর্ববর্তী পরিবর্তনগুলি ওভাররাইট করে।
মাইটিপর্ক

48

1800 তথ্যটির উত্তর সম্পূর্ণ সঠিক। যদিও গিট নুব হিসাবে, "গিট চেরি-পিক ব্যবহার করুন" আমার পক্ষে ইন্টারনেটে কিছুটা বেশি খনন না করে এটি বের করার পক্ষে যথেষ্ট ছিল না তাই আমি ভেবেছিলাম যে অন্য কারও সাথে থাকলে আমি আরও বিস্তারিত গাইড পোস্ট করব a অনুরূপ নৌকা।

আমার ব্যবহারের ক্ষেত্রটি অন্যের গিথুব শাখা থেকে বেছে বেছে নিজের মধ্যে পরিবর্তনগুলি নির্বাচন করতে চাইছিল। আপনার যদি ইতিমধ্যে পরিবর্তনগুলির সাথে স্থানীয় শাখা থাকে তবে আপনার কেবলমাত্র পদক্ষেপগুলি 2 এবং 5-7 করা দরকার।

  1. আপনি যে পরিবর্তনগুলি আনতে চান তার সাথে একটি স্থানীয় শাখা তৈরি করুন (তৈরি না করা থাকলে)।

    $ git branch mybranch <base branch>

  2. এটিতে স্যুইচ করুন।

    $ git checkout mybranch

  3. অন্য ব্যক্তির অ্যাকাউন্ট থেকে আপনি যে পরিবর্তনগুলি চান তা টেনে আনুন। আপনি ইতিমধ্যে না থাকলে আপনি এগুলি একটি রিমোট হিসাবে যুক্ত করতে চাইবেন।

    $ git remote add repos-w-changes <git url>

  4. তাদের শাখা থেকে সবকিছু টানুন।

    $ git pull repos-w-changes branch-i-want

  5. আপনি যে পরিবর্তনগুলি চান তা দেখতে কমিট লগগুলি দেখুন:

    $ git log

  6. আপনি যে শাখায় পরিবর্তনগুলি টানতে চান তাতে ফিরে যান।

    $ git checkout originalbranch

  7. চেরি হ্যাশগুলি সহ এক এক করে আপনার প্রতিশ্রুতিগুলি চয়ন করুন।

    $ git cherry-pick -x hash-of-commit

টুপি টিপ: http://www.sourcemage.org/Git_Guide


3
টিপ: git cherryআপনি এখনও মার্জ হয়নি এমন কমিটগুলি সনাক্ত করতে প্রথমে কমান্ডটি ব্যবহার করুন (ম্যানুয়াল প্রথমে দেখুন)।
আকাইহোলা

এটি কাজ করে .. ১. একটি নতুন শাখা তৈরি করেছে some যাও.
রামপ্রসাদবিসিল

আপনার লিঙ্কটি আর কাজ করছে না। আপনি এটি আপডেট করতে পারেন দয়া করে?
creep3007

42

এখানে কিভাবে আপনি প্রতিস্থাপন করতে পারেন হয় Myclass.javaফাইল masterসঙ্গে শাখা Myclass.javaমধ্যে feature1শাখা। এটি Myclass.javaবিদ্যমান না থাকলেও এটি কাজ করবে master

git checkout master
git checkout feature1 Myclass.java

মনে রাখবেন এটি ওভাররাইট হবে - মার্জ হবে না - এবং মাস্টার শাখায় স্থানীয় পরিবর্তনগুলি উপেক্ষা করবে।


6
এটি একীভূত হবে না। এটি কেবল বৈশিষ্ট্য 1 শাখা থেকে পরিবর্তনগুলির সাথে মাস্টারের পরিবর্তনগুলি ওভাররাইট করবে।
স্কঙ্কওয়াফল

3
পুরোপুরি, আমি যেখানে এই জাতীয় সংশ্লেষ খুঁজছিলাম theirsours
মার্জটি খুঁজছিলাম

1
কিছু সময় আপনি যা করতে চান তা হ'ল পুরো ফাইলটি প্রতিস্থাপন করা হয়, তাই আমি যা চেয়েছিলাম তা এটিই ছিল তবে আপনাকে এই ফাইলটিতে যে পরিবর্তনগুলি করা হয়েছে তা আপনি হারাতে চান তা নিশ্চিত করতে হবে।
ম্যাজিক্ল্যাম্প

1
Cleanest সমাধান, প্রদত্ত যে ওপি বিশেষভাবে অন্য ডালে সমতুল্য সঙ্গে সমগ্র ফাইলটি প্রতিস্থাপন করতে চেয়েছিলেন:2. Manual copying of common files into a temp directory followed by ...copying out of the temp directory into the working tree.
ব্রেন্ট Faust

29

সহজ উপায়, প্রকৃতপক্ষে দুটি শাখা থেকে নির্দিষ্ট ফাইলগুলি মার্জ করার জন্য, কেবলমাত্র অন্য শাখার সাথে নির্দিষ্ট ফাইলগুলি প্রতিস্থাপন করবেন না।

প্রথম ধাপ: শাখাগুলি পৃথক করুন

git diff branch_b > my_patch_file.patch

বর্তমান শাখা এবং শাখা_বি এর মধ্যে পার্থক্যের একটি প্যাচ ফাইল তৈরি করে

দ্বিতীয় ধাপ: একটি প্যাটার্নের সাথে মেলে ফাইলগুলিতে প্যাচটি প্রয়োগ করুন

git apply -p1 --include=pattern/matching/the/path/to/file/or/folder my_patch_file.patch

বিকল্পগুলিতে দরকারী নোট

*অন্তর্ভুক্ত প্যাটার্নে আপনি ওয়াইল্ডকার্ড হিসাবে ব্যবহার করতে পারেন ।

স্ল্যাশগুলি পালানোর দরকার নেই।

এছাড়াও, আপনি পরিবর্তে --excolve ব্যবহার করতে পারেন এবং প্যাটার্নের সাথে মিলে যাওয়া ফাইলগুলি বাদ দিয়ে সবকিছুতে প্রয়োগ করতে পারেন, বা প্যাচটি -R এর সাথে বিপরীত করে ফেলতে পারেন

-P1 বিকল্পটি * ইউনিক্স প্যাচ কমান্ডের একটি হোল্ডওভার এবং প্যাচ ফাইলের বিষয়বস্তু প্রতিটি ফাইলের নাম a/বা এর সাথে প্রতিটি ফাইলের নাম সংশোধন করেb/ (বা প্যাচ ফাইলটি কীভাবে উত্পন্ন হয়েছিল তার উপর নির্ভর করে) যা আপনার স্ট্রিপ করতে হবে তা নিশ্চিত করতে পারে যাতে এটি বের করতে পারে প্যাচটি ফাইলের পথে আসল ফাইলটি প্রয়োগ করা দরকার।

আরও বিকল্পের জন্য গিট-আবেদনের জন্য ম্যান পৃষ্ঠাটি দেখুন।

তৃতীয় ধাপ: তিন ধাপ নেই

স্পষ্টতই আপনি আপনার পরিবর্তনগুলি প্রতিশ্রুতিবদ্ধ করতে চান, তবে কে বলবেন যে আপনার প্রতিশ্রুতিবদ্ধ হওয়ার আগে আপনি যে কোনও অন্যান্য সম্পর্কিত টুইটগুলি করতে চান না।


1
এটি খুব কার্যকর ছিল যেখানে বর্তমান_ব্রঞ্চের প্রচুর "অতিরিক্ত" পরিবর্তন রয়েছে যা সংরক্ষণের প্রয়োজন। ব্রাঞ্চ_ বি দ্বারা আনা কেবল পরিবর্তনের ভিন্নতা পেয়েছে: গিট ডিফ হেড ... শাখা_বি (হ্যাঁ - তিনটি পিরিয়ড ম্যাজিক ট্রিক করে)।
সাদ মালিক

@ মাসুকোমি, দ্বিতীয় ধাপে, আপনি কি পদক্ষেপ 1 তে তৈরি প্যাচ-ফাইল যুক্তি হিসাবে যুক্ত করবেন না?
স্পিরালিস

আমার জন্য, সমস্ত পরিবর্তন প্রত্যাখ্যান করা হয়। কোন ধারণা কেন?
লিনাসগেফার্থ

প্রাথমিক চিন্তা @ লিনাসগেফার্থটি কি প্যাচটি তৈরি করার সময় আপনি সম্ভবত পিছনের দিকে শাখা পেয়েছিলেন? আমরা এটি বের করতে পারি কিনা তা দেখার জন্য এসও এর বাইরে অনুসরণ করব up
মাসুকোমি

24

আপনি যদি চান না যে আরও "সরল" সংযুক্তি আরও অনেক পরিবর্তন নিয়ে আসে তবে আপনি কীভাবে ন্যূনতম গোলযোগের সাথে অন্য শাখা থেকে দু'টি ফাইল অনুসরণ করতে ইতিহাস পেতে পারেন তা এখানে।

প্রথমত, আপনি আগে থেকেই ঘোষণা করার অস্বাভাবিক পদক্ষেপ নেবেন যে আপনি যা করতে চলেছেন তা একত্রীকরণ, আপনার কার্য ডিরেক্টরি ডিরেক্টরিতে ফাইলগুলিতে বিনীত কিছু না করে:

git merge --no-ff --no-commit -s ours branchname1

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

git checkout branchname1 -- file1 file2 etc

আপনি যদি অন্য একাধিক শাখা থেকে মার্জ করে থাকেন তবে প্রয়োজন অনুসারে পুনরাবৃত্তি করুন।

git checkout branchname2 -- file3 file4 etc

এখন অন্য শাখার ফাইলগুলি সূচীতে রয়েছে, ইতিহাস সহ প্রতিশ্রুতিবদ্ধ হতে প্রস্তুত।

git commit

এবং সেই প্রতিশ্রুতি বার্তায় আপনার কাছে অনেকগুলি ব্যাখ্যা করার দরকার রয়েছে।

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


3
আপনার প্রথম আদেশ ( git merge --no-ff --no-commit -s outs branchname1) হুবহু আমি যা খুঁজছিলাম! ধন্যবাদ!
রবএম

1
একাধিক শাখা, প্রয়োজনীয় ইতিহাসের সাথে একক ফাইল (গুলি) মার্জ করতে হবে এবং চাপ দেওয়ার আগে ফাইলের বিষয়বস্তু পরিবর্তন করতে হবে, এটি একটি শালীন বিকল্প বলে মনে হয়। উদাহরণস্বরূপ dev => মাস্টার, তবে আপনি হোস্ট সংজ্ঞা বা অনুরূপ মাস্টারকে চাপ দেওয়ার আগে পরিবর্তন করতে চান।
টিমাস

15

আমি জানি যে আমি কিছুটা দেরিতে এসেছি তবে নির্বাচনী ফাইলগুলি মার্জ করার জন্য এটি আমার কর্মপ্রবাহ।

#make a new branch ( this will be temporary)
git checkout -b newbranch
# grab the changes 
git merge --no-commit  featurebranch
# unstage those changes
git reset HEAD
(you can now see the files from the merge are unstaged)
# now you can chose which files are to be merged.
git add -p
# remember to "git add" any new files you wish to keep
git commit

আমি এই বিষয়ে একটি সামান্য প্রকরণ ব্যবহার। মার্জ করার পরিবর্তে আমি চেরি-বাছাই করেছি। এটা কাজ করে। এই পদ্ধতির একমাত্র নেতিবাচকতা হ'ল আপনি আসল কমিট হ্যাশের রেফারেন্স হারাবেন।
ম্যাট ফ্লোরেন্স

15

সবচেয়ে সহজ উপায় আপনি যে শাখার সাথে মার্জ করতে চান তার শাখায় আপনার রেপো সেট করে চালানো,

git checkout [branch with file] [path to file you would like to merge]

আপনি যদি চালান

git status

আপনি ফাইলটি ইতিমধ্যে স্টেজড দেখতে পাবেন ...

তারপরে দৌড়াও

git commit -m "Merge changes on '[branch]' to [file]"

সহজ।


3
এটি আমি পেয়েছি প্রায় সেরা উত্তর। দয়া করে jasonrudolph.com/blog/2009/02/25/… দেখুন তাই পরিষ্কার, সংক্ষিপ্ত এবং এটি ঠিক কাজ করে!
সুপারউসরোই

1
যা সম্পৃক্ত শাখার থেকে ফাইলগুলি সামগ্রীতে মার্জ করার পরিবর্তে সম্পূর্ণরূপে প্রতিস্থাপন করবে
Amare

আমি ঠিক এর মতো উত্তর দিতে যাচ্ছিলাম, আমি ভেবেছিলাম যে আমি এমন নতুন জিনিস আবিষ্কার করেছি যার উত্তর এখনও দেওয়া হয়নি! তবে এটি করার সবচেয়ে সহজ উপায় । এটি শীর্ষে থাকা উচিত!
ইরফান্দি জিপ

15

আমি এই পোস্টটি পেয়েছি সহজ উত্তর অন্তর্ভুক্ত। নিছক কর:

$ #git checkout <branch from which you want files> <file paths>

উদাহরণ:

$ #pulling .gitignore file from branchB into current branch
$ git checkout branchB .gitignore

আরও তথ্যের জন্য পোস্ট দেখুন।


3
এটি সত্যই একীভূত হয় না, এটি বর্তমান শাখায় ফাইলটি ওভাররাইট করে।
ইগোর র্যালিক

1
@ আইগ্রালি এটি একটি দরকারী মন্তব্য, তবে এটি করার "সঠিক" উপায়গুলির অসুবিধার সাথে তুলনা করা, এটি একটি ভাল কাজ ar একজনকে কেবল খুব যত্নবান হতে হবে।
ওউম্যানমার্টিন

12

এটি আশ্চর্যের বিষয় যে গিটটিতে এখনও এমন কোনও সুবিধাজনক সরঞ্জাম "বাক্সের বাইরে" নেই। আমি বর্তমান ভার্সন ব্রাঞ্চের কিছু বাগ-ফিক্স দ্বারা কিছু পুরানো সংস্করণ শাখা (যার এখনও অনেক সফ্টওয়্যার ব্যবহারকারী রয়েছে) আপডেট করার সময় আমি এটি প্রচুরভাবে ব্যবহার করি । এক্ষেত্রে প্রায়শই দ্রুত ট্রাঙ্কে ফাইল থেকে কোডের কয়েকটি লাইন পাওয়া দরকার, অন্যান্য অনেক পরিবর্তন (যা পুরানো সংস্করণে যাওয়ার কথা নয়) উপেক্ষা করে ... এবং অবশ্যই ইন্টারেক্টিভ ত্রি-উপায় সংহতকরণ এই ক্ষেত্রে প্রয়োজন হয়, git checkout --patch <branch> <file path>এই নির্বাচনী একীকরণ উদ্দেশ্যে ব্যবহারযোগ্য নয়।

আপনি এটি সহজেই করতে পারেন:

[alias]আপনার গ্লোবাল .gitconfigবা স্থানীয় .git/configফাইলের বিভাগে কেবল এই লাইনটি যুক্ত করুন:

[alias]
    mergetool-file = "!sh -c 'git show $1:$2 > $2.theirs; git show $(git merge-base $1 $(git rev-parse HEAD)):$2 > $2.base; /C/BCompare3/BCompare.exe $2.theirs $2 $2.base $2; rm -f $2.theirs; rm -f $2.base;' -"

এটি বোঝায় যে আপনি তুলনা ছাড়িয়ে ব্যবহার করেন। প্রয়োজনে আপনার পছন্দের সফ্টওয়্যারটিতে পরিবর্তন করুন। বা যদি আপনার ইন্টারেক্টিভ সিলেক্টিক্ট মার্জিংয়ের প্রয়োজন না হয় তবে আপনি এটিকে ত্রি-মুখী অটো-মার্জতে পরিবর্তন করতে পারেন:

[alias]
    mergetool-file = "!sh -c 'git show $1:$2 > $2.theirs; git show $(git merge-base $1 $(git rev-parse HEAD)):$2 > $2.base; git merge-file $2 $2.base $2.theirs; rm -f $2.theirs; rm -f $2.base;' -"

তারপরে এটি ব্যবহার করুন:

git mergetool-file <source branch> <file path>

এটি আপনাকে অন্য শাখায় যে কোনও ফাইলের সত্য নির্বাচিত ট্রি-ওয়ে সংযুক্তির সুযোগ দেবে।


10

আপনি ঠিক কী খুঁজছিলেন তা নয়, তবে এটি আমার পক্ষে কার্যকর ছিল:

git checkout -p <branch> -- <paths> ...

এটি কয়েকটি উত্তরের মিশ্রণ।


2
এটি প্রকৃতপক্ষে কার্যকর এবং আমার পক্ষে উত্তরের উত্তরটি, @ এলভিনাবাদ এর উত্তরটি যুক্ত করা যেতে পারে। এটি করার সময়: git checkout HEAD file1বর্তমান সংস্করণটি রাখতে এবং ফাইলটি আনমর্ম করার জন্য file1, একত্রীকরণের জন্য ফাইলের অংশটি-p বেছে নিতে বিকল্প ব্যবহার করতে পারেন । কৌতুক জন্য ধন্যবাদ!
সাইমন সি

এটি আমার অনুকূল উত্তর। সরল, দৃষ্টিকোণ এবং কাজ
জেসি রেজা খোরাসানী

8

আমি একটি করতাম

git diff comm1..commit2 ফাইলপ্যাটার্ন | গিট-প্রয়োগ - ইন্ডেক্স এবং& গিট কমিট

এইভাবে আপনি একটি শাখা থেকে ফাইলপ্যাটার জন্য কমিটের সীমাটি সীমাবদ্ধ করতে পারেন।

থেকে চুরি হয়েছে: http://www.gelato.unsw.edu.au/archives/git/0701/37964.html


কিছু পরিস্থিতিতে, এটি খুব সহজ হতে পারে। যাইহোক, পরিবর্তনগুলি যদি অন্য কোনও শাখায় থাকে তবে আপনি উপরের বার্ট জ এর উত্তর অনুসারে ঠিক সেই শাখার ডগা থেকে চেকআউট করতে পারেন।
cdunn2001

বার্ট জে কে?
কালো

8

আপনার উপরে উল্লিখিত ঠিক একই সমস্যাটি আমার ছিল। তবে উত্তরটি ব্যাখ্যা করার ক্ষেত্রে আমি এই গিট ব্লগটি আরও পরিষ্কার পেয়েছি ।

উপরের লিঙ্ক থেকে আদেশ:

#You are in the branch you want to merge to
git checkout <branch_you_want_to_merge_from> <file_paths...>

তুমি কি এটা পরীক্ষা করেছ? আমি নিশ্চিত যে ফাইলগুলিকে একীভূত করার পরিবর্তে <ব্র্যাঞ্চ_ইউ_ওয়ান_ওয়ান_ টু ড্যামার_ফ্রমে> থেকে প্রতিস্থাপন করা হবে
আমারে

7

আমি উপরের 'গিট-ইন্টারেক্টিভ-মার্জ' উত্তরটি পছন্দ করি তবে এর থেকে আরও সহজ। ইন্টারেক্টিভ এবং রিবেস সংমিশ্রণটি ব্যবহার করে আপনার জন্য গিটটি এটি করতে দিন:

      A---C1---o---C2---o---o feature
     /
----o---o---o---o master

সুতরাং কেসটি হ'ল আপনি 'ফিচার' শাখা (শাখা পয়েন্ট 'এ') থেকে সি 1 এবং সি 2 চান, তবে আপাতত বাকিদের কোনওটিই নয়।

# git branch temp feature
# git checkout master
# git rebase -i --onto HEAD A temp

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

      A---C1---o---C2---o---o feature
     /
----o---o---o---o-master--C1---C2 [HEAD, temp]

তারপরে আপনি কেবলমাত্র হেডে মাস্টার আপডেট করতে পারেন এবং টেম্প শাখাটি মুছতে পারেন এবং আপনি যেতে ভাল:

# git branch -f master HEAD
# git branch -d temp

7

কি হবে git reset --soft branch? আমি অবাক হয়েছি যে এটি এখনও কেউ উল্লেখ করেনি।

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


6

আমি জানি এই প্রশ্নটি পুরানো এবং আরও অনেক উত্তর রয়েছে তবে আমি আংশিক ডিরেক্টরিগুলিকে একীভূত করতে 'পাম্প' নামে আমার নিজের স্ক্রিপ্ট লিখেছি। এটি একটি কাজ চলছে এবং আমি এখনও গিট এবং ব্যাশ স্ক্রিপ্টিং উভয়ই শিখছি।

এই কমান্ডটি ব্যবহার করে git merge --no-commit এমন পরিবর্তনগুলি প্রয়োগ করে এবং প্রদত্ত পথের সাথে মেলে না এমন পরিবর্তনগুলি প্রয়োগ করে।

ব্যবহার: git pmerge branch path
উদাহরণ:git merge develop src/

আমি এটি ব্যাপকভাবে পরীক্ষা করিনি। ওয়ার্কিং ডিরেক্টরিটি যেকোন অনুমতিবিহীন পরিবর্তন এবং অচিহ্নযুক্ত ফাইল থেকে মুক্ত হওয়া উচিত।

#!/bin/bash

E_BADARGS=65

if [ $# -ne 2 ]
then
    echo "Usage: `basename $0` branch path"
    exit $E_BADARGS
fi

git merge $1 --no-commit
IFS=$'\n'
# list of changes due to merge | replace nulls w newlines | strip lines to just filenames | ensure lines are unique
for f in $(git status --porcelain -z -uno | tr '\000' '\n' | sed -e 's/^[[:graph:]][[:space:]]\{1,\}//' | uniq); do
    [[ $f == $2* ]] && continue
    if git reset $f >/dev/null 2>&1; then
        # reset failed... file was previously unversioned
        echo Deleting $f
        rm $f
    else
        echo Reverting $f
        git checkout -- $f >/dev/null 2>&1
    fi
done
unset IFS

4

আপনি read-treeপ্রদত্ত প্রত্যন্ত গাছকে বর্তমান সূচীতে পড়তে বা মার্জ করতে ব্যবহার করতে পারেন , উদাহরণস্বরূপ:

git remote add foo git@example.com/foo.git
git fetch foo
git read-tree --prefix=my-folder/ -u foo/master:trunk/their-folder

একত্রিত করার জন্য, -mপরিবর্তে ব্যবহার করুন।

আরও দেখুন: আমি কীভাবে গিটে একটি উপ ডিরেক্টরিকে মার্জ করব?


3

নির্বাচন করে মার্জ / ফাইল দ্বারা প্রতিশ্রুতিবদ্ধ করার জন্য একটি সহজ পদ্ধতির:

git checkout dstBranch git merge srcBranch // make changes, including resolving conflicts to single files git add singleFile1 singleFile2 git commit -m "message specific to a few files" git reset --hard # blow away uncommitted changes


3

যদি আপনার কাছে খুব বেশি ফাইল পরিবর্তিত না হয় তবে এটি আপনাকে অতিরিক্ত শুল্ক ছাড়বে।

অস্থায়ীভাবে ডুপ্লিকেট শাখা
$ git checkout -b temp_branch

২. সর্বশেষ চাওয়া প্রতিশ্রুতিতে পুনরায় সেট করুন
$ git reset --hard HEAD~n , nআপনাকে ফিরে যেতে হবে এমন কমিটের সংখ্যাটি কোথায়

৩. আসল শাখা থেকে প্রতিটি ফাইল চেকআউট করুন
$ git checkout origin/original_branch filename.ext

প্রয়োজন হলে এখন আপনি চাপ দিন এবং চাপ প্রয়োগ করতে পারেন (রিমোট ওভাররাইট করতে)।


3

আপনার যদি কেবলমাত্র একটি নির্দিষ্ট ডিরেক্টরিকে মার্জ করতে এবং অন্য সব কিছু অক্ষত রেখে তবুও ইতিহাস সংরক্ষণের প্রয়োজন হয়, আপনি সম্ভবত এটি চেষ্টা করতে পারেন ... এর একটি নতুন target-branchবন্ধ তৈরি করুনmaster আপনি পরীক্ষার আগে ।

নীচের পদক্ষেপগুলি ধরে নেওয়া হয়েছে যে আপনার দুটি শাখা রয়েছে target-branchএবং আপনি যে source-branchডিরেক্টরিটি dir-to-mergeএকত্রীকরণ করতে চান সেটি হল source-branch। এছাড়াও ধরে নিন যে আপনার অন্যান্য ডিরেক্টরি রয়েছে যেমন dir-to-retainলক্ষ্য হিসাবে আপনি ইতিহাস পরিবর্তন করতে এবং ধরে রাখতে চান না। এছাড়াও, ধরে নেওয়া যায় যে এর মধ্যে মার্জ সংঘাত রয়েছে dir-to-merge

git checkout target-branch
git merge --no-ff --no-commit -X theirs source-branch
# the option "-X theirs", will pick theirs when there is a conflict. 
# the options "--no--ff --no-commit" prevent a commit after a merge, and give you an opportunity to fix other directories you want to retain, before you commit this merge.

# the above, would have messed up the other directories that you want to retain.
# so you need to reset them for every directory that you want to retain.
git reset HEAD dir-to-retain
# verify everything and commit.

2

যখন দুটি শাখার বর্তমান কমিটির মধ্যে কেবল কয়েকটি ফাইল পরিবর্তিত হয়েছে, আমি নিজে নিজেই বিভিন্ন ফাইলগুলিতে গিয়ে পরিবর্তনগুলিকে একত্রীকরণ করি।

git difftoll <branch-1>..<branch-2>

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