git - কিভাবে গিলে অন্য শাখা থেকে একত্রিত বা পরিবর্তন বাছাই?




git-merge git-cherry-pick (16)

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

আমার ব্যবহার মামলাটি অন্য কারো গীথুব শাখা থেকে আমার নিজের মধ্যে পরিবর্তনগুলি টানতে চেয়েছিল। আপনি ইতিমধ্যে পরিবর্তন সঙ্গে একটি স্থানীয় শাখা আছে যদি আপনি শুধুমাত্র পদক্ষেপ 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

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

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

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

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

আমি বিবেচনা করেছি মতামত:

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

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

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

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


অন্য উপায় আছে যেতে:

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.

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

git remote add foo [email protected]/foo.git
git fetch foo
git read-tree --prefix=my-folder/ -u foo/master:trunk/their-folder

মার্জ সঞ্চালন করতে, পরিবর্তে -m ব্যবহার করুন।

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


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

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

এটা কিছু উত্তর একটি মিশ্রণ।


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

আপনি কোন --interactive করতে পাস করতে পারেন - --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

আমি একটি করতে হবে

গিট diff commit 1। commit2 ফাইলপ্যাটেন্ট | git-apply - ইন্ডেক্স && git কমিট

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

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


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

এই কমান্ডটি 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

আমি সবচেয়ে সহজ উত্তর ধারণ করার জন্য jasonrudolph.com/blog/2009/02/25/… খুঁজে পাওয়া যায় নি। যথোপযুক্ত সৃষ্টিকর্তা

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

উদাহরণ:

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

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


উপরে আপনি উল্লিখিত হিসাবে আমি সঠিক একই সমস্যা ছিল। কিন্তু আমি jasonrudolph.com/blog/2009/02/25/… উত্তর ব্যাখ্যা করে jasonrudolph.com/blog/2009/02/25/… পরিষ্কার খুঁজে পাওয়া যায় নি।

সারাংশ:

  • আপনি যে মার্কেটিং করতে চান সেখান থেকে পথ (গুলি) চেকআউট করুন,

    $ git checkout source_branch -- <paths>...
    
  • বা নির্বাচক কৃপণ একত্রিত করা

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

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

    $ git reset <paths>...
    $ git add -p <paths>...
    
  • অবশেষে কমিট

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

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

আপনি 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

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

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


এখানে আপনি feature1 শাখায় Myclass.java এর সাথে master শাখাতে Myclass.java ফাইলটি প্রতিস্থাপন করতে পারেন। Myclass.java master উপর উপস্থিত না থাকলেও এটি কাজ করবে।

git checkout master
git checkout feature1 Myclass.java

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


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

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

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

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

git checkout branchname1 -- file1 file2 etc

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

git checkout branchname2 -- file3 file4 etc

এখন অন্য শাখার ফাইলগুলি সূচীতে রয়েছে, ইতিহাসের সাথে তৈরি করার জন্য প্রস্তুত।

git commit

এবং আপনি যে প্রতিশ্রুতি বার্তা করতে ব্যাখ্যা ব্যাখ্যা অনেক আছে।

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


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

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


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

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


সবচেয়ে সহজ পদ্ধতি হল আপনি আপনার শাখার সাথে পুনরায় সংযুক্ত হওয়ার জন্য যে শাখাটিতে মার্জ করতে চান তা সেট করতে হয়,

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

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

git status

আপনি ইতিমধ্যে পঠিত ফাইল দেখতে হবে ...

তারপর চালানো

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

সহজ।


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

পদক্ষেপ এক: শাখা ছড়িয়ে

git diff branch_b > my_patch_file.patch

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

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

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

বিকল্প দরকারী নোট

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

স্ল্যাশ পালাতে হবে না।

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

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

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

ধাপ তিন: কোন ধাপ তিন

স্পষ্টতই আপনি আপনার পরিবর্তনগুলি করতে চাইবেন, তবে কে আপনাকে বলবে যে আপনার অঙ্গীকার করার আগে আপনি কিছু অন্যান্য সম্পর্কিত পরিবর্তনগুলি করতে চান না।







git-patch