tutorial - gitlab




বর্তমান শাখায় অপ্রয়োজনীয় পরিবর্তনগুলি থাকলে অন্য শাখায় চেকআউট করুন (2)

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

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

এখানে নিয়ম কি? পরিবর্তনগুলি মঞ্চে বা অস্থিতিশীল কিনা তা কোন ব্যাপার না? অন্য শাখায় পরিবর্তন বহন করলে আমার কোন ধারনা হয় না, কেন কখনও কখনও গিট অনুমতি দেয়? যে, কিছু পরিস্থিতিতে এটি সহায়ক?


প্রাথমিক নোট

এখানে পর্যবেক্ষণটি হল যে, আপনি branch1 1 branch1 কাজ শুরু করার পরে (ভুলে যাওয়া বা উপলব্ধি করছেন না যে এটি কোনও আলাদা শাখা শাখা branch2 স্যুইচ করতে ভাল হবে), আপনি চালান:

git checkout branch2

কখনও কখনও গিট বলে "ঠিক আছে, আপনি এখন branch2 উপর আছেন!" কখনও কখনও, গিট বলে "আমি এটা করতে পারব না, আমি আপনার কিছু পরিবর্তন হারাতে চাই।"

যদি গিট আপনাকে এটি করতে দেয় না, তবে আপনাকে তাদের স্থায়ীভাবে সংরক্ষণ করতে, আপনার পরিবর্তনগুলি করতে হবে। আপনি তাদের সংরক্ষণ করতে git stash ব্যবহার করতে পারেন; এটি জন্য ডিজাইন করা জিনিস এক। মনে রাখবেন যে git stash save মানে আসলে "সব পরিবর্তন কমিট করুন, কিন্তু কোনও শাখায় নেই, তারপরে আমি এখন যেখান থেকে এসেছি তা সরিয়ে ফেলুন।" যেটি স্যুইচ করতে পারে: আপনার এখন অগ্রগতির পরিবর্তন নেই। আপনি তারপর সুইচ সুইচ পরে তাদের git stash apply করতে পারেন।

আপনি যদি চান, এখানে পড়া বন্ধ করতে পারেন!

যদি গিট আপনাকে সুইচ দেয় না, আপনার ইতিমধ্যে একটি প্রতিকার আছে: git stash বা git commit ; অথবা, যদি আপনার পরিবর্তনগুলি পুনরায় তৈরি করতে তুচ্ছ হয় তবে git checkout -f ব্যবহার করতে এটি কার্যকর করুন। Git আপনাকে কিছু পরিবর্তন করতে শুরু করলেও git checkout branch2 দেবে যখন এই উত্তরটি সেটি সম্পর্কে। কেন কখনও কখনও কাজ করে, অন্য সময় না?

এখানে নিয়মটি একরকম সহজ, এবং জটিল / কঠিন-ব্যাখ্যা-অন্য ব্যাখ্যা:

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

যে-এবং দয়া করে মনে রাখবেন যে এটি এখনও সরলীকৃত; branch1 git add , git rm branch1 সহ কিছু অতিরিক্ত কঠিন কোণার ক্ষেত্রে রয়েছে এবং অনুমান করুন যে আপনি branch1branch1 । একটি git checkout branch2 এটি করতে হবে:

  • branch2 1 তে থাকা branch2 branch1 প্রতিটি ফাইলের জন্য এবং 1 branch2 ফাইলটিতে 1 টি ফাইল মুছে ফেলুন।
  • branch2branch2 প্রতিটি branch2 জন্য এবং branch2 1 branch2 নয় , সেই ফাইলটি তৈরি করুন (উপযুক্ত সামগ্রী সহ)।
  • উভয় শাখাগুলিতে থাকা প্রতিটি ফাইলের জন্য, যদি শাখা 2 সংস্করণটি আলাদা হয়, তবে কার্যকরী গাছ সংস্করণ আপডেট করুন।

এই পদক্ষেপগুলির মধ্যে প্রতিটি আপনার কাজ-গাছের মধ্যে কিছু ঝাপসা পারে:

  • কোনও ফাইল সরানো হলে "নিরাপদ" যদি কার্য-গাছের সংস্করণ branch1 প্রতিশ্রুতিবদ্ধ সংস্করণ হিসাবে একই হয়; আপনি যদি পরিবর্তন করেছেন তবে এটি "অনিরাপদ"।
  • branch2 প্রদর্শিত কোনও ফাইল তৈরি করা এখন "নিরাপদ" নয় যদি এটি এখন বিদ্যমান না থাকে। 2 এটি "অসুরক্ষিত" তবে এটি এখন বিদ্যমান থাকলেও "ভুল" সামগ্রী রয়েছে।
  • এবং অবশ্যই, একটি ভিন্ন সংস্করণের সাথে একটি ফাইলের কাজ- branch1 সংস্করণটি প্রতিস্থাপন করা হল "নিরাপদ" যদি কার্য-বৃক্ষ সংস্করণটি ইতিমধ্যে branch1 প্রতিশ্রুতিবদ্ধ।

একটি নতুন শাখার ( git checkout -b newbranch নতুন git checkout -b newbranch ) তৈরি করা সর্বদা "নিরাপদ" বলে মনে করা হয়: এই প্রক্রিয়াটির অংশ হিসাবে কোনও ফাইল যোগ করা, সরানো বা পরিবর্তন করা হবে না এবং সূচী / স্টেজিং- git checkout -b newbranch হবে না। (ক্যাভ্যাট: নতুন শাখার শুরু-বিন্দু পরিবর্তন না করে নতুন শাখা তৈরি করার সময় এটি নিরাপদ; কিন্তু যদি আপনি অন্য যুক্তি যুক্ত করেন, উদাহরণস্বরূপ, git checkout -b newbranch different-start-point , git checkout -b newbranch different-start-point কিছু পরিবর্তন করতে হতে পারে, different-start-point জায়গায় যেতে different-start-pointdifferent-start-point তারপর স্বাভাবিক হিসাবে চেকআউট নিরাপত্তা নিয়ম প্রয়োগ করবে।)

1 এর জন্য এটি একটি শাখায় থাকা ফাইলটির অর্থ কী তা আমরা সংজ্ঞায়িত করার প্রয়োজন, যা পাল্টে শাখাটিকে সঠিকভাবে শনাক্ত করতে হবে। ( "শাখা" দ্বারা আমাদের কী বোঝানো হয় তাও দেখুন) এখানে, আমার আসলে কী অর্থ হল শাখা-নামটি সমাধান করার প্রতিশ্রুতি: একটি ফাইল যার পথ P হল branch1 git rev-parse branch1: P হ্যাশ। পরিবর্তে যদি আপনি একটি ত্রুটির বার্তা branch1 তবে সেই ফাইলটি branch1 1 branch1 । এই নির্দিষ্ট প্রশ্নের উত্তর দেওয়ার সময় আপনার সূচক বা কার্য-বৃক্ষে পাথ P এর অস্তিত্ব প্রাসঙ্গিক নয়। সুতরাং, এখানে গোপন প্রতিটি branch-name : path git rev-parse পুনর্বিবেচনার ফলাফল পরীক্ষা করা। এটি ব্যর্থ হয় কারণ ফাইলটি সর্বাধিক এক শাখায় "ইন" বা আমাদের দুটি হ্যাশ আইডি দেয়। দুটি হ্যাশ আইডি একই থাকলে ফাইলটি উভয় শাখায় একই। কোন পরিবর্তন প্রয়োজন। হ্যাশ আইডিগুলি ভিন্ন হলে, ফাইল দুটি শাখায় আলাদা এবং শাখাগুলি স্যুইচ করতে পরিবর্তিত হতে হবে।

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

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

পরিবর্তনগুলি মঞ্চে বা অস্থিতিশীল কিনা তা কোন ব্যাপার না?

হ্যাঁ, কিছু উপায়ে। বিশেষ করে, আপনি একটি পরিবর্তন মঞ্চ করতে পারেন, তারপরে কাজ বৃক্ষ ফাইলটি "ডি-সংশোধন" করতে পারেন। এখানে দুটি শাখায় একটি ফাইল রয়েছে, যা শাখা 1 এবং শাখা 2 তে ভিন্ন:

$ git show branch1:inboth
this file is in both branches
$ git show branch2:inboth
this file is in both branches
but it has more stuff in branch2 now
$ git checkout branch1
Switched to branch 'branch1'
$ echo 'but it has more stuff in branch2 now' >> inboth

এই মুহুর্তে, আমরা branch1 তে branch1 সত্ত্বেও, inboth বৃক্ষ ফাইলটি inboth মেলে। এই পরিবর্তনটি git status --short হয় না, যা git status --short এখানে দেখায়:

$ git status --short
 M inboth

স্পেস-ত--এম মানে "সংশোধিত কিন্তু মঞ্চায়িত না" (বা আরো অবিকল, কাজ-গাছের অনুলিপি স্টেজযুক্ত / সূচক কপি থেকে পৃথক)।

$ git checkout branch2
error: Your local changes ...

ঠিক আছে, এখন চলুন শুরু করা যাক বৃক্ষের অনুলিপি, যা আমরা ইতিমধ্যেই জানি branch2 এর অনুলিপিটির সাথে branch2

$ git add inboth
$ git status --short
M  inboth
$ git checkout branch2
Switched to branch 'branch2'

এখানে branch2 -ও-কাজ কপি উভয়ই branch2 ২- branch2 মিলিত হয়েছিল, তাই branch2 অনুমোদিত ছিল।

চলুন আরেকটি ধাপ চেষ্টা করুন:

$ git checkout branch1
Switched to branch 'branch1'
$ cat inboth
this file is in both branches

পরিবর্তনটি আমি এখন স্টেজিং এলাকা থেকে হারিয়েছি (কারণ চেকআউট স্টেজিংয়ের মাধ্যমে লিখছে)। এটি একটি কোণার ক্ষেত্রে একটি বিট। পরিবর্তন চলে গেল না, কিন্তু আমি যে বিষয়টি নিয়ে আলোচনা করেছি তা চলে গেছে।

আসুন ফাইলের তৃতীয় সংস্করণটি মঞ্চে, শাখা-কপি থেকে ভিন্ন, তারপর বর্তমান শাখা সংস্করণের সাথে মিলার জন্য কাজ কপি সেট করুন:

$ echo 'staged version different from all' > inboth
$ git add inboth
$ git show branch1:inboth > inboth
$ git status --short
MM inboth

দুটি M এস এর অর্থ এখানে রয়েছে: স্টেজযুক্ত ফাইলটি HEAD ফাইল থেকে পৃথক, এবং , কাজ-ট্রি ফাইলটি স্টেজযুক্ত ফাইল থেকে পৃথক। ওয়ার্কিং-ট্রি সংস্করণটি branch1 (উকিল HEAD ) সংস্করণটি মেলে:

$ git diff HEAD
$

কিন্তু git checkout করার অনুমতি দেবে না:

$ git checkout branch2
error: Your local changes ...

চলুন branch2 সংস্করণটি branch2 সংস্করণ হিসাবে সেট করি:

$ git show branch2:inboth > inboth
$ git status --short
MM inboth
$ git diff HEAD
diff --git a/inboth b/inboth
index ecb07f7..aee20fb 100644
--- a/inboth
+++ b/inboth
@@ -1 +1,2 @@
 this file is in both branches
+but it has more stuff in branch2 now
$ git diff branch2 -- inboth
$ git checkout branch2
error: Your local changes ...

যদিও বর্তমান কাজের অনুলিপিটি branch2 মিলে যায় তবে branch2 ফাইলটি নেই, তাই একটি git checkout সেই অনুলিপিটি হারাবে এবং git checkout বাতিল করা হবে।

কারিগরি নোটগুলি শুধুমাত্র অতিশয় উত্সাহী :-)

এই সব জন্য অন্তর্নিহিত বাস্তবায়ন প্রক্রিয়া গিট এর সূচক । সূচীটিকে "স্টেজিং এরিয়া" বলা হয়, যেখানে আপনি পরবর্তী কমিটিটি তৈরি করেন: এটি বর্তমান কমিটির সাথে মিলে যায়, যা আপনি এখন চেক-আউট করেছেন, এবং তারপরে আপনি যখন কোনও ফাইল git add তখন আপনি প্রতিস্থাপন করেন সূচী সংস্করণ যা আপনার কাজের-গাছের সাথে আছে।

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

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

কমিট-সুইচিং সহ বেশিরভাগ গিট এই সূচকটির তুলনায় অপেক্ষাকৃত দ্রুত। সূচক আসলে আসলে প্রতিটি ফাইল নিজেই নয়, বরং প্রতিটি ফাইলের হ্যাশ । ফাইলটির অনুলিপিটি কীভাবে Git একটি ব্লব বস্তুকে সংগ্রহ করে , সেগুলি সংরক্ষণ করে। ফাইলগুলি কীভাবে সঞ্চালিত হয় তার অনুরূপ: এটি আসলে ফাইলগুলি ধারণ করে না, তারা কেবল প্রতিটি ফাইলের হ্যাশ ID এ Git পরিচালনা করে। সুতরাং জিটি হ্যাশ আইডিগুলি-বর্তমানে 160-বিট-লম্বা স্ট্রিংগুলির সাথে তুলনা করতে পারে- এটি এক্স এবং Y তে একই ফাইল আছে কিনা তা নির্ধারণ করতে। এটি তখন সূচকগুলির হ্যাশ আইডিগুলিতে হ্যাশ আইডিগুলি তুলনা করতে পারে।

এই উপরের সব oddball কোণার ক্ষেত্রে কি বাড়ে। আমরা এক্স এবং Y উভয় ফাইল path/to/name.txt , এবং path/to/name.txt জন্য আমাদের সূচী এন্ট্রি আছে। হয়তো সব তিনটি হ্যাশ ম্যাচ। হয়তো তাদের দুটি ম্যাচ এবং এক না। সম্ভবত তিনটি ভিন্ন। এবং, আমাদের কাছে another/file.txt থাকতে পারে যা শুধুমাত্র X বা শুধুমাত্র Y তে রয়েছে এবং এখন সূচীতে নেই। এই বিভিন্ন ক্ষেত্রে প্রতিটির নিজস্ব পৃথক বিবেচনার প্রয়োজন : জিটকে কি সিটি থেকে সূচী থেকে ফাইলটি অনুলিপি করতে হবে, অথবা এক্স থেকে Y থেকে স্যুইচ করতে সূচী থেকে সরিয়ে নিতে হবে? যদি তাই হয়, তবে ফাইলটিকে কাজ-গাছের অনুলিপি করতে হবে, অথবা এটি কাজ-গাছ থেকে মুছে ফেলতে হবে। এবং যদি এই ক্ষেত্রে, সূচী এবং কার্য-বৃত্ত সংস্করণগুলি কমপক্ষে এক প্রতিশ্রুতিবদ্ধ সংস্করণগুলির সাথে ভাল মিলিত হয়েছে; অন্যথায় গিট কিছু তথ্য clobbering করা হবে।

(এই সমস্তটির জন্য সম্পূর্ণ নিয়মগুলি আপনাকে "দুই বৃক্ষ মজুরী" শীর্ষক বিভাগের অধীনে, git checkout ডকুমেন্টেশন হিসাবে আশা করা যায় না, বরং git read-tree ডকুমেন্টেশান হিসাবে বর্ণনা করা হয়েছে।)


আপনার দুটি পছন্দ রয়েছে: আপনার পরিবর্তনগুলি আটকে দিন:

git stash

তারপর পরে তাদের ফিরে পেতে:

git stash apply

অথবা আপনার পরিবর্তনগুলি একটি শাখায় রাখুন যাতে আপনি দূরবর্তী শাখাটি পেতে পারেন এবং তারপরে আপনার পরিবর্তনগুলি একত্রিত করতে পারেন। এটি গিট সম্পর্কে সর্বশ্রেষ্ঠ জিনিসগুলির মধ্যে একটি: আপনি একটি শাখা তৈরি করতে পারেন, এটিতে প্রতিশ্রুতিবদ্ধ হন, তারপরে আপনি যে শাখাটিতে ছিলেন তার অন্যান্য পরিবর্তন আনতে পারেন।

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







git