চেক-ইন করার জন্য পরিবর্তিত ফাইলগুলি অন্য শাখায় স্থানান্তরিত করা হচ্ছে


422

এটি প্রায়শই আমার সাথে ঘটে: আমি কিছু কোড লিখি, আমার পরিবর্তনগুলি যাচাই করতে যাই, এবং তখন বুঝতে পারি realize পরিবর্তনগুলি যাচাই করার জন্য আমি সঠিক শাখায় নেই in তবে আমি আমার পরিবর্তনগুলি আবার না ঘটিয়ে অন্য শাখায় স্যুইচ করতে পারি না। সেখানে পরীক্ষা করে দেখার জন্য কি অন্য কোনও শাখায় পরিবর্তনগুলি স্থানান্তর করার কোনও উপায় আছে?

উত্তর:


751

git stash তোমার বন্ধু.

আপনি যদি এখনও কমিট না করে থাকেন তবে কেবল চালান git stash। এটি আপনার সমস্ত পরিবর্তন সরিয়ে ফেলবে।

আপনি যে শাখায় পরিবর্তন চান তা চালান এবং চালান git stash pop

গিট স্ট্যাশ এর জন্য প্রচুর ব্যবহার রয়েছে। এটি অবশ্যই আরও কার্যকর কারণগুলির মধ্যে একটি।

একটি উদাহরণ:

# work on some code
git stash
git checkout correct-branch
git stash pop

122
অনাবৃত পরিবর্তিত স্ট্যাশ করার দরকার নেই, আপনি যখন একটি শাখা পরীক্ষা করেন তখন এগুলি আপনার সাথে যায়। অস্থায়ী জিনিসগুলির দীর্ঘমেয়াদী সঞ্চয় করার জন্য স্ট্যাশ হ'ল (আপনি যে জিনিসগুলি শেষ করতে এবং পরে প্রতিশ্রুতিবদ্ধ করতে চান তবে এখনই আপনার অন্য কিছু করার দরকার আছে)।
টেককব

2
বুঝতে পেরেছি. সুতরাং আমাকে স্ট্যাশ করতে হবে, শাখাটি স্যুইচ করতে হবে এবং তারপরে পপ করতে হবে C:\kf [develop +0 ~4 -0]> git checkout feature/customers<br/> error: Your local changes to the following files would be overwritten by checkout:<br/> AspWebApp.vNext/global.asa<br/> RestApi/Web.config<br/> Please, commit your changes or stash them before you can switch branches.<br/> Aborting
ইসমাইলস

3
@ টেককব "অস্থায়ী জিনিসগুলির দীর্ঘমেয়াদী স্টোরেজ" বলে যে বক্তব্যটি খুব বিশ্রী মনে হচ্ছে, স্ট্যাশ ব্যবহারের আরেকটি বিষয় হ'ল এটি স্ট্যাকের দিকে ঠেলে দেয় যদি আপনি এটি বহন করতে না চান এবং অন্য কোনও কিছুতে কাজ করতে চান তবে এটি সেভাবে কার্যকর it । হ্যাঁ আপনার দরকার নেই তবে কেবল পরিষ্কার এবং আরও নিয়ন্ত্রণে বোধ করছেন।
এথেরিয়ন

ব্রাভো বাচ্চা! আপনি যদি কমিট করেন তবে আপনার কী করা উচিত তা যুক্ত করা উচিত
hanশান শ্রীবাস্তব

2
@ টেককুব এটি কেবল সত্য যদি আপনি যে শাখায় সরিয়ে চলেছেন আপনি যে শাখায় চালু রয়েছেন তা আপ টু ডেট থাকে। উদাহরণস্বরূপ যদি আপনি দুর্ঘটনাক্রমে প্রোড শাখায় কাজ করছেন এবং মঞ্চের শাখায় স্যুইচ করা প্রয়োজন তবে স্টেজটি মধ্য-সময়ের স্ট্যাচে বদলে গেছে স্যুইচটি করার একমাত্র উপায়।
ড্যানিয়েলসন 317

248

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

আপনি যদি আছে ইতিমধ্যে আপনার পরিবর্তনগুলি প্রতিশ্রুতিবদ্ধ:

  1. git logআপনি যে প্রতিশ্রুতিটি স্থানান্তর করতে চান তার SHA টাইপ করুন এবং মনে রাখবেন।
  2. আপনি যে শাখায় প্রতিশ্রুতিটি স্থানান্তর করতে চান তা দেখুন।
  3. git cherry-pick SHAউপরে থেকে SHA প্রতিস্থাপন টাইপ করুন ।
  4. আপনার মূল শাখায় ফিরে যান।
  5. git reset HEAD~1আপনার ভুল-শাখা কমিট করার আগে পুনরায় সেট করতে ব্যবহার করুন ।

cherry-pick একটি প্রদত্ত প্রতিশ্রুতি নেয় এবং এটি বর্তমানে চেক-আউট হেডে প্রয়োগ করে, সুতরাং আপনাকে কমিটটি একটি নতুন শাখায় অনুলিপি করার অনুমতি দেয়।


9
আপনার এখানে চেরি-পিক করার দরকার নেই। git reset HEAD~N --softএবং তারপর git checkout -bসব সরাতে এখন একটি নতুন শাখায় মুক্ত কোড।
অ্যারন

19
ফাইলগুলির পরিবর্তনগুলি কোনও নির্দিষ্ট শাখায় আবদ্ধ করা হয় না যতক্ষণ না আপনি এটি প্রতিশ্রুতিবদ্ধ। <- এই এটি আমার জন্য একটি রহস্য সমাধান করেছে। ধন্যবাদ।
তিশাল্লাকা

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

3
@ মিশা আপনি যদি দুটি ইতিহাসের বিভিন্ন ইতিহাসের শাখার মধ্যে স্যুইচ করেন তবে এটি কার্যকর হয় না
ওয়াটশীহান

1
@ অ্যারন এটি অনেক সুন্দর (কমিট-পরবর্তী দৃশ্যের জন্য)! দয়া করে একটি পৃথক উত্তর দিন।
জ্যাকটোজ

16

দুঃখের বিষয় আমার সাথে এটি নিয়মিত হয় এবং আমি git stashযদি আমার ভুল বুঝতে পারি git commitএবং git cherry-pickঅন্যথায় ব্যবহার করি তবে উভয় আদেশই অন্যান্য উত্তরে বেশ ভালভাবে ব্যাখ্যা করা হয়েছে

আমি এর জন্য একটি ব্যাখ্যা যোগ করতে চাই git checkout targetBranch: এই কমান্ডটি কেবলমাত্র আপনার কার্যনির্বাহী ডিরেক্টরি সংরক্ষণ করবে এবং যদি স্নিপশটটি টার্গেটব্র্যাঙ্কের সাথে আপনার বর্তমান শাখার মতো একই ইতিহাসে থাকে

আপনি যদি ইতিমধ্যে আপনার পরিবর্তনগুলি প্রতিশ্রুতিবদ্ধ না করেন তবে নতুন শাখায় যাওয়ার জন্য গিট চেকআউটটি ব্যবহার করুন এবং তারপরে এগুলি স্বাভাবিকভাবে প্রতিশ্রুতিবদ্ধ

@ অ্যাম্বার বক্তব্য মিথ্যা নয়, যখন আপনি একটি সরাতে newBranch , git checkout -b newBranchএকটি নতুন পয়েন্টার তৈরি করা হয় এবং সঠিক একই আপনার বর্তমান শাখা হিসেবে কমিট এটা নির্দেশ করা হয়।
প্রকৃতপক্ষে, যদি আপনার এমন একটি অন্য শাখা হয়ে থাকে যা আপনার বর্তমান শাখার সাথে ইতিহাস ভাগ করে দেয় (একই প্রতিশ্রুতি উভয় বিন্দু) তবে আপনি "আপনার পরিবর্তনগুলি স্থানান্তরিত" করতে পারেনgit checkout targetBranch

যাইহোক, সাধারণত বিভিন্ন শাখা অর্থ পৃথক ইতিহাস, এবং গিট আপনাকে এই শাখাগুলির মধ্যে একটি নোংরা কার্যকরী ডিরেক্টরি বা স্টেজিং অঞ্চল দিয়ে স্যুইচ করতে দেয় না। git checkout -f targetBranchএক্ষেত্রে আপনি হয় (ক্লিন এবং থ্রোওয়ে পরিবর্তন) বা git stage+ git checkout targetBranch( পরিবর্তনগুলি সাফ এবং সংরক্ষণ করুন ) করতে পারেন, কেবল দৌড়ানোই git checkout targetBranchএকটি ত্রুটি দেয়:

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


5

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

  1. git reset --soft <commit>

  2. git checkout <branch>

  3. git commit -m "Commit message goes here"

গিট ডক্স থেকে :

git reset [<mode>] [<commit>]এই ফর্মটি বর্তমান শাখার প্রধানকে পুনরায় সেট করে এবং সম্ভবত সূচকটি (এটি গাছের সাথে পুনরায় সেট করা) এবং কার্যকারী গাছের উপর নির্ভর করে আপডেট করে। বাদ দেওয়া থাকলে, - মিক্সডে ডিফল্ট। অবশ্যই নিম্নলিখিতগুলির মধ্যে একটি হতে হবে:

--softসূচি ফাইল বা কার্যনির্বাহী গাছটিকে মোটেই স্পর্শ করে না (তবে সমস্ত মোডের মতোই মাথাটি পুনরায় সেট করে)। এটি আপনার সমস্ত পরিবর্তিত ফাইলগুলিকে "প্রতিশ্রুতিবদ্ধ হতে পরিবর্তনগুলি" ছেড়ে দেয়, যেমন গিট স্ট্যাটাসটি এতে রাখে।

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