কখনও কখনও এটি কার্যকরভাবে অসম্ভব (যেখানে অতিরিক্ত তথ্য পাওয়ার ক্ষেত্রে আপনি ভাগ্যবান হতে পারেন তার কিছু ব্যতিক্রম সহ) এবং সমাধানগুলি এখানে কাজ করবে না।
গিট রেফারির ইতিহাস সংরক্ষণ করে না (যার মধ্যে শাখা রয়েছে)। এটি কেবলমাত্র প্রতিটি শাখার (মাথা) বর্তমান অবস্থান সংরক্ষণ করে। এর অর্থ আপনি সময়ের সাথে সাথে গিটে কিছু শাখার ইতিহাস হারাতে পারেন। আপনি যখনই উদাহরণস্বরূপ শাখা করবেন, ততক্ষনে এটি হ'ল কোন শাখাটি আসল। সমস্ত শাখা হ'ল:
git checkout branch1 # refs/branch1 -> commit1
git checkout -b branch2 # branch2 -> commit1
আপনি ধরে নিতে পারেন যে প্রথমে কমেন্টটি হয়েছিল সেই শাখা। এটি ক্ষেত্রে প্রবণতা থাকে তবে এটি সর্বদা হয় না। উপরের ক্রিয়াকলাপের পরে প্রথমে যে কোনও শাখায় যাত্রা করতে আপনাকে বিরত করার কিছুই নেই। অতিরিক্তভাবে, গিট টাইমস্ট্যাম্পগুলি নির্ভরযোগ্য হওয়ার গ্যারান্টিযুক্ত নয়। আপনি উভয় প্রতিশ্রুতি না দেওয়া পর্যন্ত না যে তারা কাঠামোগতভাবে শাখা হয়ে ওঠে।
ডায়াগ্রামে আমরা সংখ্যার সাথে সংখ্যায় কমিট করার ঝোঁক রাখি, যখন কমিট ট্রি গাছগুলি শাখাগুলি করে তখন গীটের ক্রমটির কোনও বাস্তব স্থিতিশীল ধারণা থাকে না। এই ক্ষেত্রে আপনি সংখ্যার (নির্দেশক ক্রম) টাইমস্ট্যাম্প দ্বারা নির্ধারিত হয়ে ধরে নিতে পারেন (আপনি যখন সমস্ত টাইমস্ট্যাম্পগুলি একই স্থানে সেট করেন তখন গিট ইউআই কীভাবে জিনিস পরিচালনা করে তা মজাদার হতে পারে)।
এই ধারণাটি মানবিকভাবে প্রত্যাশা করে:
After branch:
C1 (B1)
/
-
\
C1 (B2)
After first commit:
C1 (B1)
/
-
\
C1 - C2 (B2)
এটি আসলে যা আপনি পান:
After branch:
- C1 (B1) (B2)
After first commit (human):
- C1 (B1)
\
C2 (B2)
After first commit (real):
- C1 (B1) - C2 (B2)
আপনি বি 1 কে আসল শাখা হিসাবে ধরে নিবেন তবে এটি কেবল একটি মৃত শাখা হতে পারে (কেউ চেকআউট-বি করেছেন তবে এটি কখনও প্রতিশ্রুতিবদ্ধ হয়নি)। আপনি উভয়ের সাথে প্রতিশ্রুতি না দেওয়া অবধি এই নয় যে আপনি গিটের মধ্যে একটি বৈধ শাখা কাঠামো পাবেন:
Either:
/ - C2 (B1)
-- C1
\ - C3 (B2)
Or:
/ - C3 (B1)
-- C1
\ - C2 (B2)
আপনি সর্বদা জানেন যে সি 1 সি 2 এবং সি 3 এর আগে এসেছিল তবে আপনি কখনই নির্ভরযোগ্যভাবে জানতে পারবেন না যে সি 2 সি-এর আগে এসেছিল বা সি 3 সি 2 এর আগে এসেছে (কারণ আপনি উদাহরণস্বরূপ আপনার ওয়ার্কস্টেশনের সময় নির্ধারণ করতে পারেন)) বি 1 এবং বি 2 এছাড়াও বিভ্রান্ত করছে কারণ আপনি জানতে পারবেন না কোন শাখাটি প্রথমে এসেছিল। আপনি এটি বেশ কয়েকটি ক্ষেত্রে খুব ভাল এবং সাধারণত সঠিক অনুমান করতে পারেন। এটি কিছুটা রেস ট্র্যাকের মতো। সমস্ত জিনিস গাড়িগুলির সাথে সাধারণত সমান হয় তারপরে আপনি ধরে নিতে পারেন পিছনে কোলে আসা একটি গাড়ি পিছনে একটি কোল শুরু করে। আমাদের এমন কনভেনশনও রয়েছে যেগুলি খুব নির্ভরযোগ্য, উদাহরণস্বরূপ মাস্টার প্রায় সর্বদা দীর্ঘকালীন বেঁচে থাকা শাখাগুলির প্রতিনিধিত্ব করবেন যদিও দুঃখজনকভাবে আমি এমন কেসগুলি দেখেছি যেখানে এমনকি এটিও এরকম নয়।
এখানে দেওয়া উদাহরণ হ'ল ইতিহাস সংরক্ষণের উদাহরণ:
Human:
- X - A - B - C - D - F (B1)
\ / \ /
G - H ----- I - J (B2)
Real:
B ----- C - D - F (B1)
/ / \ /
- X - A / \ /
\ / \ /
G - H ----- I - J (B2)
বাস্তব এখানেও বিভ্রান্তিমূলক কারণ আমরা মানুষ হিসাবে এটি বাম থেকে ডানে, শিকড় থেকে পাতায় (রেফারি) পড়ি। গিট তা করে না। যেখানে আমরা আমাদের মাথায় (এ-> বি) করি (এ <-বি বা বি-> এ)। এটি রেফ থেকে মূল পর্যন্ত পড়ে reads রেফগুলি যে কোনও জায়গায় হতে পারে তবে কমপক্ষে সক্রিয় শাখার জন্য পাতা হতে ঝোঁক to একটি রেফারেন্স প্রতিশ্রুতিবদ্ধ দিকে নির্দেশ করে এবং প্রতিশ্রুতিবদ্ধ করে কেবল তাদের পিতামাতাদের / তাদের সন্তানের জন্য নয়। কমিট যখন মার্জ কমিট হয় তখন এর একাধিক পিতা-মাতার থাকে। প্রথম পিতামাতা সর্বদা আসল প্রতিশ্রুতি যা মেশানো হয়েছিল merge অন্যান্য বাবা-মায়েদের সর্বদা কমিট থাকে যা মূল প্রতিশ্রুতিতে মার্জ হয়েছিল।
Paths:
F->(D->(C->(B->(A->X)),(H->(G->(A->X))))),(I->(H->(G->(A->X))),(C->(B->(A->X)),(H->(G->(A->X)))))
J->(I->(H->(G->(A->X))),(C->(B->(A->X)),(H->(G->(A->X)))))
এটি খুব দক্ষ প্রতিনিধিত্ব নয়, বরং প্রতিটি রেফ (বি 1 এবং বি 2) থেকে গিট সমস্ত পাথের একটি অভিব্যক্তি নিতে পারে।
গিটের অভ্যন্তরীণ স্টোরেজটি আরও দেখতে দেখতে (পিতামাতার হিসাবে এ দু'বার প্রদর্শিত হয় না):
F->D,I | D->C | C->B,H | B->A | A->X | J->I | I->H,C | H->G | G->A
যদি আপনি কোনও কাঁচা গিট কমিট করেন তবে আপনি শূন্য বা আরও বেশি প্যারেন্ট ক্ষেত্রগুলি দেখতে পাবেন। যদি শূন্য থাকে তবে এর অর্থ কোনও পিতা-মাতা নেই এবং প্রতিশ্রুতিবদ্ধটি একটি মূল (আপনার আসলে একাধিক শিকড় থাকতে পারে)। যদি এটির একটি থাকে তবে এর অর্থ হ'ল কোনও সংযুক্তি ছিল না এবং এটি কোনও মূল প্রতিশ্রুতি নয়। যদি একের অধিক থাকে তবে এর অর্থ হ'ল প্রতিশ্রুতিবদ্ধতাটি মার্জ হওয়ার ফলাফল এবং প্রথম পিতা-মাতার সমস্তই মার্জ হওয়ার পরে।
Paths simplified:
F->(D->C),I | J->I | I->H,C | C->(B->A),H | H->(G->A) | A->X
Paths first parents only:
F->(D->(C->(B->(A->X)))) | F->D->C->B->A->X
J->(I->(H->(G->(A->X))) | J->I->H->G->A->X
Or:
F->D->C | J->I | I->H | C->B->A | H->G->A | A->X
Paths first parents only simplified:
F->D->C->B->A | J->I->->G->A | A->X
Topological:
- X - A - B - C - D - F (B1)
\
G - H - I - J (B2)
উভয় যখন এটিকে আঘাত করবে তখন তাদের চেইন একই হবে, তার আগে তাদের চেইনটি সম্পূর্ণ আলাদা হবে। প্রথম দুটি কমিট সাধারণভাবে করা প্রথমটি হ'ল সাধারণ পূর্বপুরুষ এবং সেখান থেকে তারা অন্যদিকে চলে গিয়েছিল। কমান্ড, শাখা এবং রেফারির মধ্যে এখানে কিছু বিভ্রান্তি থাকতে পারে। আপনি আসলে একটি অঙ্গীকার মার্জ করতে পারেন। এটিই যা মার্জ করে তা সত্যিই করে। একটি রেফ কেবল কমান্টের দিকে নির্দেশ করে এবং একটি শাখা ফোল্ডারে রেফের চেয়ে বেশি কিছু নয় ggit / refs / head, ফোল্ডারের অবস্থানটি এটি নির্ধারণ করে যা কোনও ট্যাগ যেমন অন্য কিছুের চেয়ে একটি রেফ একটি শাখা।
আপনি যেখানে ইতিহাস হারিয়েছেন তা হ'ল একীভূত হওয়া পরিস্থিতিগুলির উপর নির্ভর করে দুটি কাজের মধ্যে একটি করবে।
বিবেচনা:
/ - B (B1)
- A
\ - C (B2)
এক্ষেত্রে উভয় দিকের সাথে একীভূত হওয়ার ফলে বর্তমান চেক আউট শাখার দ্বারা প্রতিশ্রুতিবদ্ধ প্রতিশ্রুতি হিসাবে প্রথম পিতামাতার সাথে এবং দ্বিতীয় পিতামাতার সাথে আপনি যে বর্তমান শাখায় মার্জ হয়ে গেছেন সেই শাখার ডগায় প্রতিশ্রুতি হিসাবে নতুন প্রতিশ্রুতি তৈরি করবে। এটি একটি নতুন প্রতিশ্রুতি তৈরি করতে হবে যেহেতু উভয় শাখারই সাধারণ পূর্বপুরুষের পরিবর্তিত হয়েছে যা অবশ্যই একত্রিত হতে হবে।
/ - B - D (B1)
- A /
\ --- C (B2)
এই মুহুর্তে ডি (বি 1) এর এখন উভয় শাখা (নিজেই এবং বি 2) থেকে উভয় সেট পরিবর্তন রয়েছে। তবে দ্বিতীয় শাখায় বি 1 থেকে পরিবর্তন নেই। আপনি যদি B1 থেকে B2 তে পরিবর্তনগুলি মার্জ করে যাতে সেগুলি সিঙ্ক্রোনাইজ হয় তবে আপনি এমন কিছু দেখতে প্রত্যাশা করতে পারেন (আপনি গিট মেশিনকে এটি এর জন্য --no-ff এর সাথে করতে বাধ্য করতে পারেন):
Expected:
/ - B - D (B1)
- A / \
\ --- C - E (B2)
Reality:
/ - B - D (B1) (B2)
- A /
\ --- C
বি 1 এর অতিরিক্ত কমিট থাকলেও আপনি তা পাবেন। যতক্ষণ না বি 2 তে পরিবর্তন হয় না যে বি 1 নেই, দুটি শাখা একত্রী করা হবে। এটি দ্রুত অগ্রসর হয় যা রিবেসের মতো (পুনর্বাসনাগুলিও খায় বা লিনিয়ার ইতিহাসের ইতিহাস), কেবল একটি রিবেসের পরিবর্তে কেবল একটি শাখায় একটি পরিবর্তন সেট থাকে যেহেতু এটির অন্য শাখায় একটি শাখা থেকে পরিবর্তন সেট প্রয়োগ করতে হয় না।
From:
/ - B - D - E (B1)
- A /
\ --- C (B2)
To:
/ - B - D - E (B1) (B2)
- A /
\ --- C
আপনি যদি B1 এ কাজ বন্ধ করে দেন তবে দীর্ঘকালীন ইতিহাস সংরক্ষণের জন্য জিনিসগুলি বেশিরভাগ ক্ষেত্রে সূক্ষ্ম। কেবল বি 1 (যা হতে পারে মাস্টার) সাধারণত অগ্রসর হবে তাই বি 2 এর ইতিহাসে বি 2 এর অবস্থানটি সাফল্যের সাথে উপস্থাপন করে যে এটি বি 1 তে একীভূত হয়েছিল was গিটটি এটিকে প্রত্যাশা করে, এ থেকে বি এর শাখা তৈরি করবে, তারপরে আপনি যতগুলি পরিবর্তন সঞ্চারিত হবেন ততই আপনি এটিকে বিতে বিভক্ত করতে পারেন, তবে বি কে আবার এ-তে মার্জ করার সময়, আপনি বি-তে আরও কাজ করবেন এমনটা আশা করা যায় না । আপনি যে শাখায় কাজ করে যাচ্ছিলেন তা দ্রুত ফরোয়ার্ড করার পরে যদি আপনি আপনার শাখায় কাজ চালিয়ে যাচ্ছেন তবে প্রতিবার আপনার বি এর আগের ইতিহাসটি মুছে ফেলবেন। উত্স থেকে দ্রুত এগিয়ে যাওয়ার পরে শাখায় প্রতিশ্রুতিবদ্ধ হওয়ার পরে আপনি সত্যই প্রতিটি সময় একটি নতুন শাখা তৈরি করছেন।
0 1 2 3 4 (B1)
/-\ /-\ /-\ /-\ /
---- - - - -
\-/ \-/ \-/ \-/ \
5 6 7 8 9 (B2)
1 থেকে 3 এবং 5 থেকে 8 হ'ল স্ট্রাকচারাল শাখা যা আপনি 4 বা 9 এর জন্য ইতিহাস অনুসরণ করেন তা প্রদর্শিত হয় এবং এই নামহীন এবং অবাস্তব স্ট্রাকচারাল শাখাগুলির নাম এবং রেফারেন্স শাখাগুলির কোনটির সাথে সম্পর্কিত তা জানার মতো কোনও উপায় নেই কাঠামোর শেষ আপনি এই অঙ্কন থেকে ধরে নিতে পারেন যে 0 থেকে 4 টি B1 এর সাথে সম্পর্কিত এবং 4 থেকে 9 B2 এর সাথে সম্পর্কিত তবে 4 এবং 9 এর বাইরে কোন শাখাটি কোন শাখার অন্তর্ভুক্ত তা জানতে পারে না, আমি কেবল এটিকে এমনভাবে আঁকলাম যে এটি দেয় যে মায়া। 0 বি 2 এর সাথে সম্পর্কিত হতে পারে এবং 5 টি বি 1 এর সাথে সম্পর্কিত হতে পারে। এই ক্ষেত্রে 16 টি পৃথক সম্ভাবনা রয়েছে যার মধ্যে প্রতিটি কাঠামোগত শাখার নামকরণ করা শাখা থাকতে পারে।
এই চারপাশে কাজ করে এমন বেশ কয়েকটি গিট কৌশল রয়েছে। আপনি গিট সংহতিকে কখনই দ্রুত এগিয়ে না যেতে বাধ্য করতে পারেন এবং সর্বদা মার্জ শাখা তৈরি করতে পারেন। আপনার পছন্দের কিছু কনভেনশন অনুসারে শাখা ইতিহাস সংরক্ষণের একটি ভয়ঙ্কর উপায় হ'ল ট্যাগ এবং / বা শাখাগুলি (ট্যাগগুলি সত্যই সুপারিশ করা হয়)। আপনি যে শাখায় মার্জ হয়ে যাচ্ছেন তাতে আমি সত্যিই একটি ডামি খালি কমিটের সুপারিশ করব না। একটি সাধারণ প্রচলিত কনভেনশন হ'ল যতক্ষণ না আপনি সত্যই আপনার শাখা বন্ধ করতে চান ততক্ষণ কোনও ইন্টিগ্রেশন শাখায় মার্জ না করা। এটি এমন একটি অনুশীলন যা লোকেদের শাখাগুলি করার বিষয়টিকে ঘিরে কাজ করার মতো আচরণ করা উচিত। তবে বাস্তব বিশ্বে আদর্শ সর্বদা ব্যবহারিক নয় অর্থ সঠিক কাজ করা প্রতিটি পরিস্থিতির পক্ষে কার্যকর নয়। যদি আপনি '