আমি কীভাবে আমার স্থানীয় অনির্দিষ্ট পরিবর্তনগুলিকে অন্য গিট শাখায় মার্জ করব?


621

গিটে আমি কীভাবে নিম্নলিখিতগুলি করতে পারি?

আমার বর্তমান শাখাটি শাখা 1 এবং আমি কিছু স্থানীয় পরিবর্তন করেছি। যাইহোক, আমি এখন বুঝতে পারি যে আমি আসলে এই পরিবর্তনগুলি ব্রাঞ্চ 2 এ প্রয়োগ করা উচিত। এই পরিবর্তনগুলি প্রয়োগ / একীভূত করার কোনও উপায় আছে যাতে তারা শাখা 1 এ প্রতিশ্রুতি না দিয়ে শাখা 2 এ স্থানীয় পরিবর্তন হয়ে যায়?


2
এসওতে এখানে দুর্দান্ত গিট টিউটোরিয়াল রয়েছে । স্ট্যাক ওভারফ্লোতে সমস্ত গিট প্রশ্নগুলির জন্য এটি কেন্দ্রীয়।
ডেসিও লিরা

উত্তর:


896

যেহেতু আপনার ফাইলগুলি এখনও প্রতিশ্রুতিবদ্ধ নয় branch1:

git stash
git checkout branch2
git stash pop

অথবা

git stash
git checkout branch2
git stash list       # to check the various stash made in different branch
git stash apply x    # to select the right one

যেমনটি বেঞ্জহান মন্তব্য করেছেন ( git stashম্যান পৃষ্ঠা দেখুন ):

বর্তমানে চিহ্নবিহীন (নতুন যুক্ত হওয়া) ফাইলগুলি স্থিত করে রাখতে, যুক্তিটি যুক্ত করুন -u, তাই:

git stash -u

2
আপনি স্বাগত জানাই। স্টেটস ব্যবহারের আরও উদাহরণ unethicalblogger.com/posts/2008/11/…
ভনসি

2
আপনি যদি একই সমস্যার সমাধান খুঁজছেন তবে টিএফএসের সাথে সমতুল্য সমাধানটি আপনার পরিবর্তনগুলি সাময়িক করা হয় তবে / মাইগ্রেট স্যুইচটি ব্যবহার করে সঠিক শাখায় আনসাভেলভ করতে টিএফএস পাওয়ার সরঞ্জামগুলি ব্যবহার করুন।
xr280xr

1
এটি আমার পক্ষে কাজ করেছে। তবে, 'স্ট্যাশ পপ' কাজ করার জন্য আমাকে একটি স্থানীয় শাখাও তৈরি করতে হয়েছিল। আপনার সাথে যদি এমন কিছু ঘটতে থাকে তবে স্ট্যাকওভারফ্লো.com/ জিজ্ঞাসাগুলি / 1783405/git-checkout-remote- ব্র্যাঞ্চ চেকআউট করুন ।
মিমোরালেয়া

21
এছাড়াও বর্তমানে untracked (নতুন যোগ) ফাইল লুকিয়ে রাখার জন্য , যুক্তি যোগ -u, তাই: git stash -u
বেনজহান

2
@ বেঞ্জহান ভাল পয়েন্ট আরও দৃশ্যমানতার জন্য আমি আপনার মন্তব্যে উত্তরে অন্তর্ভুক্ত করেছি।
ভোনসি

84

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

git checkout branch2

এটি এত দিন কাজ করবে যতক্ষণ আপনি সম্পাদনা করছেন এমন কোনও ফাইল শাখা 1 এবং শাখা 2 এর মধ্যে পৃথক নয়। এটি আপনাকে শাখা 2 এ রেখে দিবে আপনার সাথে কাজের পরিবর্তনগুলি সংরক্ষণ করা হবে। যদি সেগুলি আলাদা হয় তবে আপনি উল্লেখ করতে পারেন যে আপনি স্থানীয় পরিবর্তনগুলি -mচেকআউট করার বিকল্পের সাথে শাখাগুলি স্যুইচ করার মাধ্যমে প্রবর্তিত পরিবর্তনের সাথে একত্রীকরণ করতে চান ।

git checkout -m branch2

আপনি যদি সূচকে পরিবর্তনগুলি যুক্ত করেন তবে আপনি প্রথমে পুনরায় সেট করে এই পরিবর্তনগুলি পূর্বাবস্থায় ফিরিয়ে আনতে চাইবেন। (এটি আপনার কার্যকরী অনুলিপি সংরক্ষণ করবে, এটি কেবল পর্যায়ের পরিবর্তনগুলি সরিয়ে ফেলবে))

git reset

3
আমি কোনওভাবে বুঝতে হবে স্ট্যাশটিকে "সরল" বলে মনে করেছি, তবে বিভিন্ন শাখা জুড়ে ওয়ার্কিং ডিরেক্টরিটি বিবেচনায় নেওয়া আপনার পদ্ধতির চেয়ে ভাল। +1
ভোনসি

6
একটি সাধারণ traditionalতিহ্যবাহী চেকআউট হাতের সমস্যার জন্য আরও উপযুক্ত বলে মনে হচ্ছে। চেকআউট হালকা ওজন, এটি কেবল পরিবর্তন করতে হবে এমন ফাইলগুলি আপডেট করে। সম্ভবত স্ট্যাশ পদ্ধতির বিষয়টি বোঝা আরও সহজ, বা এটি সম্ভবত এটি ব্যবহারের ক্ষেত্রে চেকআউটটি 'নিরাপদ' যথেষ্ট নয় obvious
সিবি বেইলি

যদি checkout -mকিছু পরিস্থিতিতে "নিরাপদ" না হন (সম্ভবত এটি একীভূত সংঘাতের কারণ হতে পারে), তবে স্ট্যাশগুলি কোনও সুবিধা দেবে (যেমন আপনি কোনও স্ট্যাশ পপ আনপপ করতে পারেন)?
ক্রেগ ম্যাককুইন

1
@ ক্রেইগএমসি কিউইন আপনি একটি পপড স্ট্যাশ আনপপ করতে পারবেন না তবে স্ট্যাশ যখন আপনি এটি পপ করবেন তখন বিবাদ সম্পর্কে অভিযোগ করবে। আপনি দ্বন্দ্বগুলি সংশোধন করতে পারেন এবং তারপরে প্রতিশ্রুতিবদ্ধ করতে পারেন, তবে মূল স্ট্যাশ এখনও এই ক্ষেত্রে স্ট্যাকের মধ্যে রয়েছে! :)
শান এফ

একীভূত সংঘাতের ঘটনায় ফাইলগুলি কি ব্যাকআপ হয় না .orig?
জোকুল

13

পূর্বে উল্লিখিত স্ট্যাশ পদ্ধতির একটি সংক্ষিপ্ত বিকল্প হ'ল:

সাময়িকভাবে পরিবর্তনগুলি স্ট্যাশে স্থানান্তরিত করুন।

  1. git stash

একটি নতুন শাখা তৈরি করুন এবং স্যুইচ করুন এবং তারপরে স্ট্যাশটিকে কেবল এক ধাপে পপ করুন।

  1. git stash branch new_branch_name

তারপরে ঠিক addএবং commitএই নতুন শাখায় পরিবর্তন।


10

সতর্কতা: গিট newbies জন্য নয়।

এটি আমার ওয়ার্কফ্লোতে যথেষ্ট পরিমাণে আসে যা আমি এটির জন্য একটি নতুন গিট কমান্ড লেখার চেষ্টা করেছি। স্বাভাবিক git stashপ্রবাহটি যাওয়ার পথে তবে কিছুটা বিশ্রী। আমি সাধারণত প্রথমে একটি নতুন প্রতিশ্রুতিবদ্ধ করি যেহেতু যদি আমি পরিবর্তনগুলি লক্ষ্য করি তবে সমস্ত তথ্য আমার মনে সতেজ থাকে এবংgit commit আমি যা পেয়েছি তা কেবলই শুরু করা ভাল (সাধারণত মাস্টার সম্পর্কিত একটি বাগফিক্স যা আমি কাজ করার সময় আবিষ্কার করেছি) বৈশিষ্ট্য শাখা) এখনই।

এটিও সহায়ক — যদি আপনি এইরকম অনেক পরিস্থিতিতে পড়ে থাকেন তবে আপনার বর্তমানের পাশাপাশি আরও একটি কার্যকরী ডিরেক্টরি থাকতে পারে যা সর্বদা masterশাখাটি পরীক্ষা করে রাখা হয়।

সুতরাং আমি কীভাবে এটি অর্জন করব তা এভাবে চলে যায়:

  1. git commit একটি ভাল প্রতিশ্রুতি বার্তা সঙ্গে এখনই পরিবর্তনগুলি।
  2. git reset HEAD~1 বর্তমান শাখা থেকে প্রতিশ্রুতি পূর্বাবস্থাপন।
  3. (alচ্ছিক) বৈশিষ্ট্যটিতে কাজ চালিয়ে যান।

কখনও কখনও পরে (অবিচ্ছিন্নভাবে), বা তত্ক্ষণাত অন্য টার্মিনাল উইন্ডোতে:

  1. cd my-project-master যা অন্য একটি ডাব্লুডি ভাগ করে নিচ্ছে .git
  2. git reflog আমি স্রেফ তৈরি করা বাগফিক্সটি সন্ধান করতে।
  3. git cherry-pick SHA1 প্রতিশ্রুতিবদ্ধ।

Allyচ্ছিকভাবে (এখনও অবিচ্ছিন্ন) আপনি বাগ বাগ পেতে আপনার বৈশিষ্ট্য শাখাটি পুনরায় চালু করতে (বা মার্জ করতে পারেন) সাধারণত আপনি যখন পিআর জমা দিতে চলেছেন এবং ইতিমধ্যে আপনার বৈশিষ্ট্য শাখা এবং ডাব্লুডি পরিষ্কার করেছেন:

  1. cd my-project যা আমি কাজ করছি মূল ডাব্লুডি
  2. git rebase master বাগফিক্স পেতে।

এই পদ্ধতিতে আমি নিরবচ্ছিন্নভাবে বৈশিষ্ট্যটিতে কাজ চালিয়ে যেতে পারি এবং কোনও বিষয় নিয়ে git stashবা আমার ডাব্লুডি পরিষ্কার করার আগে git checkout(এবং তারপরে আবার বৈশিষ্ট্যটির শাখাটি ব্যাকআউট চেক করানো) নিয়ে চিন্তা করতে হবে না এবং এখনও আমার সমস্ত বাগফিক্সগুলি masterপরিবর্তে চলে গেছে আমার বৈশিষ্ট্য শাখায় লুকানো।

আইএমও git stashএবং git checkoutআপনি যখন কোনও বড় বৈশিষ্ট্য নিয়ে কাজ করার মাঝামাঝি হন তখন আসল পিআইএ হয়।


আমার উত্তরের জন্য আকর্ষণীয় এবং বৈধ বিকল্প। +1
ভোনসি

আপনি কি পারদর্শী থেকে আসছে? my-project-masterভাগ করার একই .gitতোলে এটা মত শব্দ। কেন নয় git checkout -b bugfixABC; git commit -a; git reset HEAD^ --hard, তারপর পরে (অ্যাসিঙ্ক্রোনাস) থাকাকালীন master, git cherry-pick <SHA1 of the commit(s) in bugfixABC? (বা এমনকি, SHA1 খুঁজে বের করতে এড়াতে, git rebase --onto master feature bugfixABCআপনি বর্তমানে যেখানেই শাখা চালু আছেন সেখান থেকে Which যার অর্থ আপনি git resetউপরের পরে সরাসরি এটি করতে পারেন , চালিয়ে feature
গৌথিয়ার

যাইহোক, ওপি মনে হয় যে তারা পরিবর্তনগুলি করতে প্রস্তুত নয়, সেক্ষেত্রে checkout -mএটি আরও ভাল।
গৌথির

2

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


আমি এই সমাধানটি বুঝতে পারি না: এটি শাখা 1 থেকে শাখা 2 এর ইতিহাস পুনর্লিখন করবে ... কেন আমরা কেবল শাখা 2 তে স্থানীয় অ-প্রতিশ্রুতিবদ্ধ পরিবর্তন পেতে চাইলে শাখা 1 তে শাখা 1 থেকে সমস্ত প্রতিশ্রুতিবদ্ধ পরিবর্তনগুলি আসবে? ...
ভনসি

@ ভনসি: সম্মত হয়েছে, এক্ষেত্রে শাখা ১-এ শাখাগুলির মধ্যে সর্বশেষ সংশ্লেষের পর থেকে রিবেস সমস্ত প্রতিশ্রুতিবদ্ধ পরিবর্তনগুলি পায়। আমি প্রথমে এই প্রশ্নের "অ-প্রতিশ্রুতিবদ্ধ" প্যারামিটার পাইনি। রিবেস ভাল উত্তর নয়।
ক্লফ

@ ক্লাফেরি: পিএফইউ ... আমার মাথাব্যথা শুরু হয়েছিল;) আপনার উত্তরটি আমি হ্রাস করতে পারতাম, তবে যেহেতু আমি নিজেই একটি প্রকাশ করেছি, সেখানে একটি "সুস্পষ্ট বিরোধের বিরোধ" ছিল। আপনার আপডেট হওয়া পোস্ট সহ, আমাকে এখনই মোটেও ডাউনভোট করতে হবে না। ধন্যবাদ :)
ভনসি

@ ভনসি: পরের বার, যতক্ষণ না আমার উত্তর যেমন উত্তর হিসাবে ভুল হয় ততক্ষণ নির্দ্বিধায় ভোট বোধ করুন;)
ক্লাফ

1

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

গিটে আলাদা শাখায় প্রতিশ্রুতিবদ্ধ কীভাবে

আপনি my_branchযে প্রতিশ্রুতিবদ্ধ হতে চান তাতে অনির্বাচিত পরিবর্তনগুলি রয়েছে master, সমস্ত পরিবর্তনগুলি বিনা প্রতিশ্রুতি ছাড়াই my_branch

উদাহরণ

git merge master
git stash -u
git checkout master
git stash apply
git reset
git add example.js
git commit
git checkout .
git clean -f -d
git checkout my_branch
git merge master
git stash pop

ব্যাখ্যা

masterআপনার শাখায় মার্জ করে শুরু করুন , যেহেতু আপনাকে শেষ পর্যন্ত এটি করতে হবে এবং যে কোনও দ্বন্দ্বের সমাধান করার এখন সেরা সময়।

-uবিকল্প (ওরফে --include-untracked) এ git stash -uআপনি পরেও করতে untracked ফাইল হারানোর করা থেকে আটকায় git clean -f -dমধ্যে master

git checkout masterএটি করা জরুরী হওয়ার পরেও আপনি করবেন না git stash pop, কারণ আপনার পরে এই স্ট্যাশ দরকার হবে। আপনি যদি তৈরি হওয়া স্ট্যাশটিকে পপ করেন my_branchএবং তারপরে এটি git stashকরেন master, আপনি পরে যখন সেই স্ট্যাশটি প্রয়োগ করবেন তখন অযথা মার্জ সংঘাত সৃষ্টি করবে my_branch

git resetথেকে সমস্ত কিছু আনস্টেজ করে git stash apply। উদাহরণস্বরূপ, স্ট্যাশ-এ সংশোধন করা হয়েছে এমন ফাইলগুলি কিন্তু master"আমাদের দ্বারা মুছে ফেলা" বিরোধ হিসাবে মঞ্চায়িত হয় না ।

git checkout . এবং git clean -f -d প্রতিশ্রুতিবদ্ধ নয় এমন সমস্ত কিছু বাতিল করুন: ট্র্যাক করা ফাইলগুলিতে সমস্ত পরিবর্তন এবং সমস্ত অচিহ্নযুক্ত ফাইল এবং ডিরেক্টরি। এগুলি ইতিমধ্যে স্ট্যাশে সংরক্ষণ করা হয়েছে এবং যদি এটিকে ছেড়ে দেওয়া হয় masterতবে ফিরে স্যুইচ করার সময় অহেতুক সংহত দ্বন্দ্বের কারণ হতে পারে my_branch

শেষটি git stash popমূলটির উপর ভিত্তি করে my_branchহবে এবং তাই কোনও মার্জ সংঘাত সৃষ্টি করবে না। যাইহোক, যদি আপনার স্ট্যাশ-এ অনতিবিলম্বিত ফাইল থাকে যা আপনি মাস্টার হিসাবে প্রতিশ্রুতিবদ্ধ করেছেন তবে গিট অভিযোগ করবে যে এটি "স্ট্র্যাশ থেকে অবিরত ফাইলগুলি পুনরুদ্ধার করতে পারেনি"। এই সংঘাতের সমাধান করতে, আপনার কাজ গাছ, তারপর থেকে যারা ফাইল মুছে দিন git stash pop, git add .এবং git reset


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

1
আপনি যদি তারা মিশে গিয়ে তৈরি করছি তাদেরকে পৃথক রাখতে না পারেন, কিন্তু আপনি হয় , একাধিক অ্যাকাউন্ট থাকে করার অনুমতি দেওয়া যতদিন না পর্যন্ত আপনি জালিয়াতি ভোট কমিট তাদের ব্যবহার করবেন না হিসাবে (বা তাদের একে অপরের সাথে যোগাযোগ সাধারণত থাকে)। আপনার পরিস্থিতি একটি মোডে ব্যাখ্যা করুন। এছাড়াও, মোছাটি একটি সৎ ভুল ছিল, আপনি কীভাবে কাউকে বলতে পারেন যে আপনি দুটি আলাদা অ্যাকাউন্ট ব্যবহার করছেন?

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

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