৬.২ গিটহাব – প্রজেক্টে কন্ট্রিবিউট করা

প্রজেক্টে কন্ট্রিবিউট করা

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

প্রজেক্ট ফর্ক করা

পুশ অ্যাক্সেস নেই, এমন কোনও এক্সিস্টিং প্রজেক্টে কন্ট্রিবিউট করতে চাইলে আপনি প্রজেক্টটিকে ফর্ক করতে পারেন। একটি প্রজেক্ট ফর্ক করলে গিটহাব সম্পূর্ণ আপনার জন্য প্রজেক্টটির একটি কপি তৈরি করে, এটিতে আপনার নেমস্পেসে থাকে, এবং আপনি এটিতে পুশ করতে পারেন।
নোট

ঐতিহাসিকভাবে, “ফর্ক” শব্দটি প্রসঙ্গত কিছুটা নেতিবাচক, এর অর্থ হলো কেউ একটি ওপেন সোর্স প্রজেক্টকে ভিন্ন ডিরেকশানে নিয়েছে, কখনও কখনও কন্ট্রিবিউটদেরদের বিভক্ত করে একটি প্রতিযোগিতামূলক প্রজেক্ট তৈরি করে। গিটহাবে “ফর্ক” হল আপনার নিজের নেমস্পেসে একই প্রজেক্ট, যা আপনাকে আরও ওপেন ম্যানারে কন্ট্রিবিউট রাখার উপায় হিসাবে পাবলিকলি একটি প্রজেক্টে পরিবর্তন করতে দেয়।

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

একটি প্রজেক্ট ফর্ক করতে, প্রজেক্ট পেজে যান এবং পেজের উপরের ডানদিকে “Fork” বাটনে ক্লিক করুন।

forkbutton
ফিগার ৮৮. ফর্ক বাটন

কয়েক সেকেন্ড পরে, আপনাকে মূল প্রজেক্টের কোডের কপিসহ নতুন প্রজেক্ট পেজে নিয়ে যাওয়া হবে, যেখানে আপনি পরিবর্তন করতে পারবেন।

গিটহাব ফ্লো

গিটহাব পুল রিকোয়েস্টকে কেন্দ্র করে একটি কোলাবোরেশন ওয়ার্কফ্লো ডিজাইন করা হয়েছে। এই ফ্লো কাজ করে যখন আপনি একটি সিঙ্গেল শেয়ার্ড (shared) রিপোজিটরিতে কোলাবোরেট করছেন  সম্পর্কযুক্ত কোনও টিমের সাথে, অথবা গ্লোবালি ডিস্ট্রিবিউটেড কোম্পানির সাথে অথবা এমন কোনও নেটওয়ার্কের সাথে যেখানে অনেক অপরিচিত লোক অনেকগুলো ফর্কের মাধ্যমে কোনও প্রজেক্টে কন্ট্রিবিউট করছেন। এই ব্যাপারে গিট ব্রাঞ্চিং এর টপিক ব্রাঞ্চিং ওয়ার্কফ্লোতে আলোচনা করা হয়েছে।

এটা যেভাবে কাজ করে তা দেয়া হলোঃ

১. প্রজেক্ট ফর্ক করুন

২. master ব্রাঞ্চ থেকে একটি টপিক ব্রাঞ্চ তৈরি করুন

৩. ইম্প্রুভের জন্য প্রজেক্টটিতে কিছু কমিট করুন

৪. আপনার গিটহাব প্রজেক্টে ব্রাঞ্চটি পুশ করুন

৫. একটি পুল রিকোয়েস্ট খুলুন

৬. আলোচনা এবং প্রয়োজন হলে কমিট করুন

৭. প্রজেক্টের মালিক মার্জ অথবা ক্লোজ করবেন

৮. আপডেটেড মাস্টারটি আপনার ফর্কে সিংক করুন

এই ফ্লোটি ইন্টিগ্রেশন ম্যানেজার ওয়ার্কফ্লোতে কভার করা হয়েছে, কিন্তু পরিবর্তনগুলি রিভিউ করার জন্য ইমেল ব্যবহার করার পরিবর্তে, টিমগুলি গিটহাবের ওয়েব ভিত্তিক টুলস ব্যবহার করে।

চলুন, এই ওয়ার্কফ্লোটি ব্যবহার করে একটি উদাহরণের মাধ্যমে গিটহাবে হোস্ট করা একটি ওপেন সোর্স প্রজেক্টে চেইঞ্জের প্রস্তাব করা দেখি।

টিপ

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

পুল রিকোয়েস্ট ক্রিয়েট করা

টনি,তার আরডুইনো প্রোগ্রামেবল কন্ট্রোলার (Arduino programmable microcontroller) রান করার জন্য কোড খুঁজছিলো এবং গিটহাবের https://github.com/schacon/blink এ একটি ভালো প্রোগ্রাম ফাইল পেয়েছে।

blink-01-start
ফিগার ৮৯. যে প্রজেক্টে আমরা কন্ট্রিবিউট করতে চাচ্ছি
একমাত্র সমস্যা ছিলো ব্লিঙ্কিং রেটের অনেক গতিশীলতা। আমাদের কাছে মনে হলো প্রতিটা স্টেট চেইঞ্জের মাঝে এক সেকেন্ডের পরিবর্তে ৩ সেকেন্ড ওয়েট করলে ভালো হতো। তাই চলুন প্রোগ্রামটিকে ইম্প্রুভ করি এবং প্রস্তাবিত পরিবর্তন হিসেবে প্রজেক্টে সাবমিট করি।  প্রথমে প্রজেক্টির আমাদের নিজস্ব কপি পেতে আমরা প্রজেক্টটিকে ফর্ক করবো। এখানে আমাদের ইউজার নেইম “tonychacon“, তাই আমাদের কপি করা প্রজেক্টটি https://github.com/tonychacon/blink তে, তাই আমরা এখানে এডিট করতে পারি। আমরা লোকালে এটিকে ক্লোন করবো, টপিক ব্রাঞ্চ ক্রিয়েট করবো, সবার শেষে কোডের চেইঞ্জটি করে চেইঞ্জটি গিটহাবে পুশ করবো। 
				
					$ git clone https://github.com/tonychacon/blink (1)
Cloning into 'blink'...

$ cd blink
$ git checkout -b slow-blink (2)
Switched to a new branch 'slow-blink'

$ sed -i '' 's/1000/3000/' blink.ino (macOS) (3)
# If you're on a Linux system, do this instead:
# $ sed -i 's/1000/3000/' blink.ino (3)

$ git diff --word-diff (4)
diff --git a/blink.ino b/blink.ino
index 15b9911..a6cc5a5 100644
--- a/blink.ino
+++ b/blink.ino
@@ -18,7 +18,7 @@ void setup() {
// the loop routine runs over and over again forever:
void loop() {
  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
  [-delay(1000);-]{+delay(3000);+}               // wait for a second
  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
  [-delay(1000);-]{+delay(3000);+}               // wait for a second
}

$ git commit -a -m 'Change delay to 3 seconds' (5)
[slow-blink 5ca509d] Change delay to 3 seconds
 1 file changed, 2 insertions(+), 2 deletions(-)

$ git push origin slow-blink (6)
Username for 'https://github.com': tonychacon
Password for 'https://tonychacon@github.com':
Counting objects: 5, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 340 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
To https://github.com/tonychacon/blink
 * [new branch]      slow-blink -> slow-blink

				
			
  1. প্রজেক্টের ফর্কটিকে লোকালে ক্লোন করি
  2. একটি বর্ণনামূলক (descriptive) টপিক ব্রাঞ্চ তৈরি করি 
  3. কোডে আমাদের প্রয়োজনীয় পরিবর্তন করি 
  4. টপিক ব্রাঞ্চে আমাদের প্রয়োজনীয় পরিবর্তনটি কমিট করি
  5. গিটহাব ফর্কে আমাদের টপিক ব্রাঞ্চটি পুশ করি
এখন আমরা গিটহাবে আমাদের ফর্কে গেলে আমরা দেখব যে গিটহাব আমাদের নতুন টপিক ব্রাঞ্চটি পুশ করাটি  লক্ষ্য করেছে এবং আমাদের পরিবর্তনগুলো চেক আউট এবং মূল প্রজেক্টে পুল রিকোয়েস্ট তৈরি করার জন্য একটি বড় সবুজ বাটনের মাধ্যমে আমাদের প্রেজেন্ট করছে।  অন্যভাবে আপনি আপনার ব্রাঞ্চটি লোকেট করতে https://github.com/<user>/<project>/branches এর “Branches” পেইজে যেতে পারেন এবং সেখান থেকে নতুন পুল রিকোয়েস্ট ক্রিয়েট করুন।
blink-02-pr
ফিগার ৯০. পুল রিকোয়েস্ট বাটন

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

আমরা আমাদের টপিক ব্রাঞ্চে কিছু কমিটের লিস্ট দেখতে পাই, যেটি master ব্রাঞ্চ থেকে “ahead” এবং প্রজেক্ট owner সমস্ত পরিবর্তনকে সমন্বয় করে মার্জ করবে।

blink-03-pull-request-open
ফিগার ৯১. পুল রিকোয়েস্ট তৈরির পৃষ্ঠাটি

আপনি যখন এই স্ক্রিনে ‘Create pull request’ বাটনটি ক্লিক করবেন, আপনার ফর্ক করা প্রজেক্টের owner একটি নোটিফিকেশন পাবেন যে কেউ একটি পরিবর্তনের পরামর্শ দিচ্ছে এবং এমন একটি পৃষ্ঠার সাথে লিঙ্ক করবে যেটিতে এই পুল রিকোয়েস্ট নিয়ে সমস্ত তথ্য রয়েছে ৷

নোট

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

পুল রিকোয়েস্ট ইটারেট করা

এই পয়েন্টে প্রজেক্ট owner সাজেসটেড পরিবর্তনগুলো দেখতে পারে, রিজেক্ট অথবা কমেন্ট করতে পারে। ধরুন, তিনি আইডিয়াটি পছন্দ করেছেন কিন্তু লাইট অন্য বা অফের জন্য আরো কিছু বাড়তি সময় পছন্দ করছেন। ডিস্ট্রিবিউটেড গিটে ওয়ার্কফ্লোতে মেইলের মাধ্যমে আলোচনা কোথায় হতে পারে, আলোচনা করা হয়েছে। গিটহাবে এটি অনলাইনে হয়। প্রজেক্ট ওউনার সমন্বিত পরিবর্তন রিভিউ করতে পারেন এবং যেকোনো লাইনে ক্লিক করে কমেন্ট করতে পারেন।
blink-04-pr-comment
ফিগার ৯২. পুল রিকোয়েস্টে কোডের একটি নির্দিষ্ট লাইনে কমেন্ট করা

মেইন্টেইনার কমেন্টটি করার পর যারা পুল রিকোয়েস্টটি ওপেন করেছে (এবং অবশ্যই যারা রিপোজিটরিটি ওয়াচ করছে) , তারা নোটিফিকেশন পাবেন। আমরা কাস্টোমাইজেশনে পরে যাবো, কিন্তু টনি যদি ইমেইল নোটিফিকেশন অন করে রাখে, সে এমন একটি মেইল পাবেঃ

blink-04-email
ফিগার ৯৩. ইমেইল নোটিফিকেশনের মাধ্যমে কমেন্ট পাঠানো

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

blink-05-general-comment
ফিগার ৯৪. পুল রিকোয়েস্ট আলোচনা পৃষ্ঠা

এখন কন্ট্রিবিউটর দেখতে পারেন তাদের পরিবর্তন গ্রহণ হওয়ার জন্য তাদের কী করতে হবে। ভাগ্যক্রমে এটি খুব সোজা। যেখানে ইমেলের মাধ্যমে আপনাকে আপনার সিরিজ পুনরায় রোল করতে হবে এবং এটিকে মেইলিং তালিকায় পুনরায় জমা দিতে হবে, গিটহাবের মাধ্যমে আপনি কেবল টপিক ব্রাঞ্চে আবার পুশ করবেন এবং পুল রিকোয়েস্টটি স্বয়ংক্রিয়ভাবে আপডেট হবে। পুল রিকোয়েস্ট ফাইনালে আপনি দেখতে পাবেন যে পুরানো কোড কমেন্টটি নেই, যেহেতু এটি একটি লাইনে তৈরি করা হয়েছিল যা পরিবর্তন করা হয়েছে।

 

একটি বিদ্যমান পুল রিকোয়েস্টে কমিট করা হলে নোটিফিকেশন পাঠায় না, তাই একবার টনি তার সংশোধনগুলি পুশ করার পরে তিনি প্রজেক্ট owner কে অনুরোধ করার জন্য একটি মন্তব্য করার সিদ্ধান্ত নেন যে তিনি অনুরোধ করা পরিবর্তন করেছেন।

blink-06-final
ফিগার ৯৫. পুল রিকোয়েস্ট ফাইনাল

লক্ষ্য করার মতো একটি মজার বিষয় হল যে আপনি যদি এই পুল রিকোয়েস্টের “Files Changed” ট্যাবে ক্লিক করেন, তাহলে আপনি “সমন্বিত” ডিফ পাবেন—অর্থাৎ, আপনার মেইন ব্রাঞ্চে যে মোট ডিফারেন্সটি ইন্ট্রডিউস করা হবে যদি এই টপিক ব্রাঞ্চটি মার্জ করা হয়। git diff মানে, এটি মূলত স্বয়ংক্রিয়ভাবে আপনাকে git diff master…​<branch> যে ব্রাঞ্চের জন্য এই পুল রিকোয়েস্ট ওপেন করা হয়েছিলো। এই ধরণের ডিফ সম্পর্কে আরও জানতে কী ইন্ট্রডিউস করা হয়েছে তা নির্ধারণ করা দেখুন।

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

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

বেশিরভাগ গিটহাব প্রজেক্ট এই বেসিক ওয়ার্কফ্লো ব্যবহার করে। টপিক ব্রাঞ্চ তৈরি করা হয়, পুল রিকোয়েস্ট খোলা হয়, একটি ডিসকাশান হয়, ব্রাঞ্চে আরও কাজ করা হতে পারে এবং অবশেষে রিকোয়েস্টটি বন্ধ বা মার্জ করা হয়।

 

নোট

শুধু ফর্ক না

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

এডভান্সডপুলরিকোয়েস্ট

এখন যেহেতু আমরা গিটহাবে একটি প্রজেক্টে কন্ট্রিবিউট করার বেসিক বিষয়গুলি কভার করেছি, আসুন পুল রিকোয়েস্ট সম্পর্কে কিছু আকর্ষণীয় টিপস এবং কৌশল দেখি যাতে আপনি সেগুলি ব্যবহারে আরও কার্যকর হতে পারেন৷

প্যাচ হিসাবেপুলরিকোয়েস্ট

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

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

উদাহরণস্বরূপ, আপনি যদি পুল রিকোয়েস্ট ফাইনালে আবার তাকান, আপনি লক্ষ্য করবেন যে কন্ট্রিবিউটর তার কমিট রিবেস করেননি এবং আরেকটি পুল অনুরোধ পাঠাননি। এর পরিবর্তে তারা নতুন কমিট যোগ করেছেন এবং তাদের বিদ্যমান ব্রাঞ্চে পুশ করেছেন। এর ফলে আপনি যদি ভবিষ্যতে এই পুল রিকোয়েস্টটি দেখেন, তাহলে সিদ্ধান্তগুলি কেন নেওয়া হয়েছিল তার সমস্ত কন্টেক্সট আপনি সহজেই খুঁজে পেতে পারবেন। সাইটে “Merge” বোতামটি ক্লিক করলে পুল রিকোয়েস্টটিকে রেফারেন্স করে উদ্দেশ্যমূলকভাবে একটি মার্জ কমিট তৈরি হয় যাতে মূল কথোপকথনে ফিরে যাওয়া যায় এবং প্রয়োজনে কোন কিছু বের করা সহজ হয়।

আপস্ট্রীমের সাথে থাকা

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

pr-01-fail
ফিগার ৯৬. পুল রিকোয়েস্ট ঠিকভাবে মার্জ হয়নি

যদি আপনি দেখতে পান যে Pull Request does not merge cleanly, আপনি আপনার ব্রাঞ্চটি ঠিক করতে চাইবেন যাতে এটি সবুজ হয়ে যায় এবং মেইন্টেইনারকে অতিরিক্ত কাজ করতে না হয়।

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

গিটহাবের বেশিরভাগ ডেভেলপার পরবর্তীটি বেছে নেবে, একই কারণে আমরা আগের সেকশানে বেছে নিয়েছিলাম। যা গুরুত্বপূর্ণ তা হল ইতিহাস এবং ফাইনাল মার্জ, তাই রিবেস করা আপনাকে একটি সামান্য পরিচ্ছন্ন ইতিহাস ছাড়া অন্য কিছু দিচ্ছে না যা অনেক বেশি কঠিন এবং ত্রুটি প্রবণ।

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

উদাহরণস্বরূপ, ধরা যাক যে “tonychacon” উদাহরণ যা আমরা আগে ব্যবহার করছিলাম, মূল অথর এমন একটি পরিবর্তন করেছেন যা পুল রিকোয়েস্টে একটি কনফ্লিক্ট তৈরি করবে। আসুন, সেই পদক্ষেপগুলি দিয়ে যাই।

				
					$ git remote add upstream https://github.com/schacon/blink (1)

$ git fetch upstream (2)
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (3/3), done.
Unpacking objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
From https://github.com/schacon/blink
 * [new branch]      master     -> upstream/master

$ git merge upstream/master (3)
Auto-merging blink.ino
CONFLICT (content): Merge conflict in blink.ino
Automatic merge failed; fix conflicts and then commit the result.

$ vim blink.ino (4)
$ git add blink.ino
$ git commit
[slow-blink 3c8d735] Merge remote-tracking branch 'upstream/master' \
    into slower-blink

$ git push origin slow-blink (5)
Counting objects: 6, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (6/6), 682 bytes | 0 bytes/s, done.
Total 6 (delta 2), reused 0 (delta 0)
To https://github.com/tonychacon/blink
   ef4725c..3c8d735  slower-blink -> slow-blink

				
			

১. রিমোট হিসাবে upstream নামে একটি মূল রিপোজিটরি যোগ করুন।

২. সেই রিমোট থেকে নতুন কাজ আনুন।

৩. আপনার টপিক ব্রাঞ্চে সেই রিপোজিটরির প্রধান ব্রাঞ্চকে মার্জ করুন।

৪. যে কনফ্লিক্ট ঘটেছে তা ঠিক করুন।

৫. একই টপিক ব্রাঞ্চে পুশ করুন।

একবার আপনি এটি করলে, পুল রিকোয়েস্টটি স্বয়ংক্রিয়ভাবে আপডেট হবে এবং এটিকে রিচেক করা হবে যে এটি ঠিকভাবে মার্জড হয়েছে কিনা।

ফিগার ৯৭. পুল রিকোয়েস্ট ঠিকভাবে মার্জ হয়েছে এখন

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

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

রেফারেন্স

আপনার পরবর্তী প্রশ্ন হতে পারে “আমি কীভাবে পুরানো পুল রিকোয়েস্টটি রেফারেন্স করব?”। আপনি গিটহাবে লিখতে পারেন এমন প্রায় যেকোনো জায়গায় অন্যান্য জিনিসের রেফারেন্স করার অনেকগুলি উপায় রয়েছে।

চলুন শুরু করা যাক কিভাবে আরেকটি পুল রিকোয়েস্ট বা একটি ইস্যু ক্রস-রেফারেন্স করা যায়। সমস্ত পুল রিকোয়েস্ট এবং ইস্যুগুলির নির্দিষ্ট নম্বর আছে এবং সেগুলি প্রজেক্টের মধ্যে অনন্য। উদাহরণস্বরূপ, আপনার কাছে পুল রিকোয়েস্ট #3 এবং ইস্যু #3 থাকতে পারে না। আপনি যদি অন্য কোনো পুল রিকোয়েস্ট বা ইস্যু রেফারেন্স করতে চান, তাহলে আপনি যেকোনো মন্তব্য বা বিবরণে সহজভাবে #<num> লিখতে পারেন। ইস্যু বা পুল রিকোয়েস্ট অন্য কোথাও থাকলে আপনি আরও সুনির্দিষ্ট হতে পারেন; username#<num> লিখুন যদি আপনি একই রিপোজিটরির ফর্কের কোনও ইস্যু বা পুল রিকোয়েস্টকে রেফারেন্স করেন, অথবা username/repo#<num> লিখুন যদি অন্য রিপোজিটরির কিছু রেফারেন্স করেন।

একটি উদাহরণ দেখা যাক। ধরুন আমরা পূর্ববর্তী উদাহরণে ব্রাঞ্চটিকে রিবেস করেছি, এটির জন্য একটি নতুন পুল রিকোয়েস্ট তৈরি করেছি এবং এখন আমরা নতুন থেকে পুরানো পুল রিকোয়েস্টটি রেফারেন্স করতে চাই। আমরা রিপোজিটরির ফর্কের একটি ইস্যু এবং সম্পূর্ণ ভিন্ন প্রজেক্টের একটি ইস্যু রেফারেন্স করতে চাই। আমরা পুল রিকোয়েস্টে ক্রস রেফারেন্সের মত করে বিবরণটি পূরণ করতে পারি।



mentions-01-syntax
ফিগার ৯৮. পুল রিকোয়েস্টে ক্রস রেফারেন্স
যখন আমরা এই পুল রিকোয়েস্টটি জমা দিই, তখন আমরা সবগুলিকে একটি পুল রিকোয়েস্টে রেন্ডার করা ক্রস রেফারেন্সের মতো দেখতে পাব।
mentions-02-render
ফিগার ৯৯. পুল রিকোয়েস্টে রেন্ডার করা ক্রস রেফারেন্স
লক্ষ্য করুন যে আমরা সেখানে যে সম্পূর্ণ গিটহাব URL রেখেছি তা শুধুমাত্র প্রয়োজনীয় তথ্য দিয়ে সংক্ষিপ্ত করা হয়েছে। এখন যদি টনি আসল পুল রিকোয়েস্টটি বন্ধ করে দেয়, আমরা দেখতে পাব যে এটিকে নতুনটিতে উল্লেখ করার মাধ্যমে গিটহাব স্বয়ংক্রিয়ভাবে পুল রিকোয়েস্টের টাইমলাইনে একটি ট্র্যাকব্যাক ইভেন্ট তৈরি করেছে। এর মানে হল যে, যে কেউ এই পুল রিকোয়েস্টে যান এবং দেখেন যে এটি বন্ধ আছে, তারা সহজেই এটির সাথে লিঙ্কড পুল রিকোয়েস্টে ব্যাক করতে পারবেন। এই লিঙ্কটি দেখতে ক্লোজড পুল রিকোয়েস্টের টাইমলাইনে থাকা নতুন পুল রিকোয়েস্টের লিঙ্কের মত।
mentions-03-closed
ফিগার ১০০. ক্লোজড পুল রিকোয়েস্টের টাইমলাইনে থাকা নতুন পুল রিকোয়েস্টের লিঙ্ক

ইস্যু নম্বর ছাড়াও, আপনি SHA-1 দ্বারা একটি নির্দিষ্ট কমিটকেও রেফারেন্স করতে পারেন। আপনাকে একটি ৪০ অক্ষরের SHA-1 নির্দিষ্ট করতে হবে, কিন্তু গিটহাব যদি এটি একটি মন্তব্যে দেখে, তাহলে এটি সরাসরি কমিটের সাথে লিঙ্ক করবে। যেভাবে আপনি ইস্যুর ক্ষেত্রে করেছিলেন সেভাবে ফর্ক বা অন্যান্য রিপোজিটরিতে কমিট উল্লেখ করতে পারবেন।

গিটহাবফ্লেবার্ডমার্কডাউন

অন্যান্য ইস্যুগুলির সাথে লিঙ্ক করা হল আরেকটি আকর্ষণীয় জিনিস যা আপনি গিটহাবের প্রায় যেকোনও টেক্সট বক্সের সাথে করতে পারেন। ইস্যু এবং পুল রিকোয়েস্টের বিবরণ, মন্তব্য, কোড মন্তব্য এবং আরও অনেক কিছুতে, আপনি যাকে “গিটহাব ফ্লেভারড মার্কডাউন” বলা হয় তা ব্যবহার করতে পারেন। মার্কডাউন হল প্লেইন টেক্সটে লেখার মতো কিন্তু যা রেন্ডার করা হয়।

কিভাবে মন্তব্য বা টেক্সট লেখা যায় এবং তারপর মার্কডাউন ব্যবহার করে রেন্ডার করা যায় তার জন্য গিটহাব ফ্লেভারড মার্কডাউনের একটি উদাহরণের মাধ্যমে লেখা এবং রেন্ডার করা দেখতে পারেন। 

markdown-01-example
ফিগার ১০১. লিখিত এবং রেন্ডার করা গিটহাব ফ্লেভারড মার্কডাউনের একটি উদাহরণ

মার্কডাউনের গিটহাব ফ্লেভার আরও কিছু যোগ করে যা আপনি মৌলিক মার্কডাউন সিনট্যাক্সের বাইরেও করতে পারেন। দরকারী পুল অনুরোধ বা ইস্যু মন্তব্য বা বিবরণ তৈরি করার সময় এগুলি সত্যিই কার্যকর হতে পারে।

টাস্ক লিস্ট 

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

আপনি এই মত একটি কাজের তালিকা তৈরি করতে পারেন:

				
					- [X] Write the code
- [ ] Write all the tests
- [ ] Document the code
				
			
যদি আমরা এটিকে আমাদের পুল রিকোয়েস্ট বা ইস্যুর বর্ণনায় অন্তর্ভুক্ত করি, তাহলে আমরা এটিকে মার্কডাউন কমেন্টে রেন্ডার করা টাস্ক লিস্টের মতো রেন্ডার করা দেখতে পাব।
markdown-02-tasks
ফিগার ১০২. একটি মার্কডাউন কমেন্টে রেন্ডার করা টাস্ক লিস্ট
এটি প্রায়শই পুল রিকোয়েস্টে ব্যবহার করা হয় যাতে বোঝানো হয় যে পুল রিকোয়েস্ট মার্জড হওয়ার আগে আপনি ব্রাঞ্চে কী করতে চান। সত্যিই দুর্দান্ত অংশটি হল আপনি মন্তব্য আপডেট করতে চেকবক্সগুলিতে ক্লিক করতে পারেন — আপনাকে কাজগুলি বন্ধ করার জন্য সরাসরি মার্কডাউন এডিট করতে হবে না৷ আরও কী, গিটহাব আপনার ইস্যু এবং পুল রিকোয়েস্টগুলিতে টাস্ক লিস্টগুলি সন্ধান করবে এবং সেগুলিকে তালিকাভুক্ত পৃষ্ঠাগুলিতে মেটাডেটা হিসাবে দেখাবে৷ উদাহরণস্বরূপ, যদি আপনার কাছে টাস্কগুলির সাথে একটি পুল রিকোয়েস্ট থাকে এবং আপনি সমস্ত পুল রিকোয়েস্টের ওভারভিউ পৃষ্ঠাটি দেখেন, আপনি দেখতে পাবেন এটি কতদূর সম্পন্ন হয়েছে। এটি লোকেদের পুল রিকোয়েস্টগুলিকে সাবটাস্কে ভেঙ্গে ফেলতে সাহায্য করে এবং অন্যান্য লোকেদের শাখার অগ্রগতি ট্র্যাক করতে সাহায্য করে। পুল রিকোয়েস্ট লিস্টে টাস্ক লিস্টের সারাংশে আপনি এর একটি উদাহরণ দেখতে পারেন।
markdown-03-task-summary
ফিগার ১০৩. পুল রিকোয়েস্ট লিস্টে টাস্ক লিস্টের সারাংশ

এগুলি অবিশ্বাস্যভাবে কার্যকর যখন আপনি একটি পুল রিকোয়েস্ট আগে ওপেন করবেন এবং ফিচারটি বাস্তবায়নের মাধ্যমে আপনার অগ্রগতি ট্র্যাক করতে এটি ব্যবহার করেন।

কোড স্নিপেট

আপনি মন্তব্যে কোড স্নিপেট যোগ করতে পারেন। এটি বিশেষভাবে উপযোগী যদি আপনি বাস্তবে আপনার ব্রাঞ্চে একটি কমিট হিসাবে বাস্তবায়ন করার আগে আপনি এমন কিছু করার চেষ্টা উপস্থাপন করতে চান। এটি প্রায়শই কী কাজ করছে না বা এই পুল রিকোয়েস্টটি কী বাস্তবায়ন করতে পারতো তার উদাহরণ কোড যোগ করতে ব্যবহৃত হয়।

কোডের একটি স্নিপেট যোগ করতে আপনাকে এটিকে ব্যাকটিক্সের মধ্যে দিতে হবে।

				
					```java
for(int i=0 ; i < 5 ; i++)
{
   System.out.println("i is : " + i);
}
```

				
			

আপনি যদি একটি ভাষার নাম যোগ করেন যেমন আমরা সেখানে ‘java’ দিয়ে করেছি, গিটহাব এছাড়াও স্নিপেট হাইলাইট করার চেষ্টা করবে। উপরের উদাহরণের ক্ষেত্রে, এটি রেন্ডার্ড ফেন্সড কোড উদাহরণের মতো রেন্ডারিং করবে।

markdown-04-fenced-code
ফিগার ১০৪. রেন্ডার্ড ফেন্সড কোড উদাহরণ

উদ্ধৃতি

আপনি যদি একটি দীর্ঘ মন্তব্যের একটি ছোট অংশের প্রতিক্রিয়া জানাতে চান, তাহলে আপনি মন্তব্য থেকে বেছে  > অক্ষর আগে বসিয়ে উদ্ধৃত করতে পারেন। প্রকৃতপক্ষে, এটি এত সাধারণ এবং এত দরকারী যে এটির জন্য একটি কীবোর্ড শর্টকাট রয়েছে৷ আপনি যদি একটি মন্তব্যে পাঠ্য হাইলাইট করেন যেটির আপনি সরাসরি উত্তর দিতে চান এবং r কী টিপুন, এটি আপনার জন্য মন্তব্য বাক্সে সেই পাঠ্যটি উদ্ধৃত করবে।

উদ্ধৃতি এই মত কিছু দেখায়:

				
					> Whether 'tis Nobler in the mind to suffer
> The Slings and Arrows of outrageous Fortune,

How big are these slings and in particular, these arrows?
				
			
একবার রেন্ডার করা হলে, মন্তব্যটি রেন্ডার করা উদ্ধৃতি উদাহরণের মতো দেখাবে
markdown-04-fenced-code
ফিগার ১০৫. রেন্ডার্ড উদ্ধৃতি কোড উদাহরণ

ইমোজি

অবশেষে, আপনি আপনার মন্তব্যে ইমোজিও ব্যবহার করতে পারেন। আপনি গিটহাব ইস্যু এবং পুল রিকোয়েস্টের মন্তব্যগুলিতে এটিকে বেশ ব্যাপকভাবে ব্যবহৃত হতে দেখবেন। এমনকি গিটহাবে একটি ইমোজি হেল্পার রয়েছে। আপনি যদি একটি মন্তব্য টাইপ করেন এবং আপনি একটি : অক্ষর দিয়ে শুরু করেন, তাহলে একটি অটোকমপ্লিটার আপনাকে আপনি যা খুঁজছেন তা খুঁজে পেতে সাহায্য করবে৷

markdown-06-emoji-complete
ফিগার ১০৬. ইমোজি অটোকমপ্লিটার
মন্তব্যের যেকোনো জায়গায় ইমোজিগুলি :<name>: এর রূপ নেয়। উদাহরণস্বরূপ, আপনি এমন কিছু লিখতে পারেন:
				
					I :eyes: that :bug: and I :cold_sweat:.

:trophy: for :microscope: it.

:+1: and :sparkles: on this :ship:, it's :fire::poop:!

:clap::tada::panda_face:

				
			
রেন্ডার করা হলে, অনেক ইমোজি কমেন্টিং এর মত কিছু দেখাবে।
ফিগার ১০৭. অনেক ইমোজি কমেন্টিং

এমন নয় যে এটি অবিশ্বাস্যভাবে দরকারী, তবে এটি এমন একটি মাধ্যমে মজা এবং আবেগের উপাদান যুক্ত করে যা অন্যথায় আবেগ প্রকাশ করা কঠিন।

নোট

বর্তমানে ইমোজি অক্ষর ব্যবহার করে এমন বেশ কয়েকটি ওয়েব পরিষেবা রয়েছে। ইমোজি খোঁজার জন্য রেফারেন্সের জন্য একটি দুর্দান্ত চিট শীট যেটি এখানে পাওয়া যাবেঃ  https://www.webfx.com/tools/emoji-cheat-sheet/

ইমেজ

এটি প্রযুক্তিগতভাবে গিটহাব ফ্লেভারড মার্কডাউন নয়, তবে এটি অবিশ্বাস্যভাবে দরকারী। মন্তব্যগুলিতে মার্কডাউন চিত্রের লিঙ্কগুলি যোগ করার পাশাপাশি, যেগুলির জন্য URLগুলি খুঁজে পাওয়া এবং এম্বেড করা কঠিন হতে পারে, গিটহাব আপনাকে ছবিগুলিকে এম্বেড করার জন্য পাঠ্য অঞ্চলে ইমেজ ড্র্যাগ এবং ড্রপ করতে দেয়৷

ফিগার ১০৮. ছবিগুলিকে আপলোড করতে ড্র্যাগ এবং ড্রপ এবং স্বয়ংক্রিয়ভাবে এম্বেড করা
আপনি যদি ছবিগুলিকে আপলোড করতে ড্র্যাগ এবং ড্রপ এবং স্বয়ংক্রিয়ভাবে এম্বেড করেন, তাহলে আপনি পাঠ্য এলাকার উপরে একটি ছোট “Parsed as Markdown” হিন্ট দেখতে পাবেন। এটিতে ক্লিক করলে আপনি গিটহাবে মার্কডাউন দিয়ে যা করতে পারেন তার একটি সম্পূর্ণ চিট শীট পাবেন।

আপনার GitHub পাবলিক রিপোজিটরি আপ টু ডেট রাখুন

একবার আপনি একটি গিটহাব রিপোজিটরি ফর্ক হয়ে গেলে, আপনার রিপোজিটরি (আপনার “ফর্ক”) মূল প্রজেক্ট থেকে স্বাধীনভাবে বিদ্যমান। বিশেষ করে, যখন মূল রিপোজিটরিতে নতুন কমিট থাকে, তখন গিটহাব আপনাকে একটি বার্তার মাধ্যমে অবহিত করে যেমন:

				
					This branch is 5 commits behind progit:master.
				
			

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

এটি করার একটি সম্ভাবনা হচ্ছে কোন কনফিগারেশনের প্রয়োজন নেই। উদাহরণস্বরূপ, আপনি যদি https://github.com/progit/progit2.git থেকে ফর্ক করে থাকেন তবে আপনি আপনার মাস্টার ব্রাঞ্চকে এভাবে আপ-টু-ডেট রাখতে পারেন:

				
					$ git checkout master (1)
$ git pull https://github.com/progit/progit2.git (2)
$ git push origin master (3)
				
			

১. আপনি অন্য ব্রাঞ্চে থাকলে, মাস্টারের যান।

২. https://github.com/progit/progit2.git থেকে পরিবর্তন আনুন এবং তাদের মাস্টারে মার্জ করুন।

৩. অরিজিনে আপনার মাস্টার ব্রাঞ্চ পুশ করুন।

এটি কাজ করে, কিন্তু প্রতিবার URL নিয়ে আসাটা একটু ক্লান্তিকর। আপনি এই কাজটিকে কিছুটা কনফিগারেশন দিয়ে স্বয়ংক্রিয় করতে পারেন:

				
					$ git remote add progit https://github.com/progit/progit2.git (1)
$ git fetch progit (2)
$ git branch --set-upstream-to=progit/master master (3)
$ git config --local remote.pushDefault origin (4)
				
			

১. উৎস রিপোজিটরি যোগ করুন এবং এটির একটি নাম দিন। এখানে, আমি এটিকে progit নাম দিয়েছি।

২. progit এর ব্রাঞ্চগুলোর রেফারেন্স নিন, বিশেষ করে মাস্টার।

৩. progit রিমোট থেকে আনার জন্য আপনার মাস্টার ব্রাঞ্চ সেট করুন।

৪. অরিজিন থেকে ডিফল্ট পুশ রিপোজিটরি সংজ্ঞায়িত করুন।

একবার এটি সম্পন্ন হলে, ওয়ার্কফ্লো অনেক সহজ হয়ে যায়

				
					$ git checkout master (1)
$ git pull (2)
$ git push (3)
				
			

১. আপনি অন্য ব্রাঞ্চে থাকলে, মাস্টারের যান।

২. progit থেকে পরিবর্তন আনুন এবং master এ পরিবর্তনগুলি মার্জ করুন।

৩. আপনার মাস্টার ব্রাঞ্চ থেকে অরিজিনে পুশ করুন।

এই পদ্ধতিটি কার্যকর হতে পারে, তবে এটিরও খারাপ দিক আছে। গিট আনন্দের সাথে আপনার জন্য এই কাজটি নিঃশব্দে করবে, কিন্তু আপনি যদি মাস্টারে কমিট দেন গিট আপনাকে সতর্ক করবে না। progit থেকে পুল করেন, তারপরে অরিজিনে পুশ করেন — এই সেটআপের সাথে এই সমস্ত ক্রিয়াকলাপ বৈধ। সুতরাং আপনাকে সরাসরি মাস্টারের কমিট না করার ব্যাপারে যত্ন নিতে হবে, যেহেতু সেই ব্রাঞ্চটি কার্যকরভাবে আপস্ট্রিম রিপোজিটরিতে অন্তর্গত।