৩.২: গিট ব্রাঞ্চিং – মৌলিক ব্রাঞ্চিং এবং মার্জিং
মৌলিক ব্রাঞ্চিং এবং মার্জিং
চলুন, আপনি বাস্তব জগতে ব্যবহার করতে পারেন এমন একটি কর্মপ্রবাহের সাথে ব্রাঞ্চিং এবং মার্জিং তথা একত্রিত করার একটি সাধারণ উদাহরণ দেখা যাক। আপনি এই পদক্ষেপগুলি অনুসরণ করবেনঃ
- একটি ওয়েবসাইটে কিছু কাজ করুন।
- একটি নতুন user story এর জন্য আপনি যেখানে কাজ করছিলেন, সেখানে একটি ব্রাঞ্চ তৈরি করুন।
- সেই ব্রাঞ্চে কিছু কাজ করুন।
এই পর্যায়ে, আপনি অন্য একটি গুরুতর সমস্যার ডাক পাবেন এবং আপনার একটি হটফিক্স প্রয়োজন হবে। আপনি নিম্নলিখিত কাজ করবেনঃ
- আপনার প্রোডাকশান ব্রাঞ্চে পরিবর্তন করুন।
- হটফিক্সটি সংযুক্ত করার জন্যে নতুন একটি ব্রাঞ্চ তৈরী করুন।
- এটি পরিক্ষিত হওয়ার পর, হটফিক্স ব্রাঞ্চটিকে একত্রিত করুন এবং প্রোডাকশানে পুশ করুন।
- পুনরায় আপনার অরিজিনাল user story তে ফিরে আসুন এবং কাজ চালিয়ে যান।
মৌলিক ব্রাঞ্চিং
প্রথমত, ধরুন আপনি আপনার প্রজেক্টে কাজ করছেন এবং master ব্রাঞ্চে ইতিমধ্যেই কয়েকটি কমিট রয়েছে।
$ git checkout -b iss53
Switched to a new branch "iss53"
$ git branch iss53
$ git checkout iss53
$ vim index.html
$ git commit -a -m 'Create new footer [issue 53]'
যাই হোক, এটি করার আগে, মনে রাখবেন যে, যদি আপনার কাজের ডিরেক্টরি বা স্টেজিং এরিয়াতে কমিট না করা পরিবর্তনগুলি থাকে, যা আপনি যে ব্রাঞ্চটিতে চেকআউট করছেন তার সাথে বিরোধপূর্ণ হয়, তাহলে গিট আপনাকে ওই ব্রাঞ্চে সুইচ করতে দেবে না। এটির থেকে পরিত্রাণের উপায় রয়েছে (যেমন, স্ট্যাশিং এবং কমিট সংশোধন করা) যা আমরা (স্ট্যাশিং এবং ক্লিনিংয়ে) পরে কভার করব। আপাতত, ধরে নিন আপনি আপনার সবগুলো পরিবর্তন কমিট করেছেন, যাতে আপনি পুনরায় আপনার master শাখায় সুইচ করতে পারেনঃ
$ git checkout master
Switched to branch 'master'
এবার, আপনাকে একটি হটফিক্স তৈরী করতে হবে। আসুন একটি hotfix ব্রাঞ্চ তৈরি করি যাতে এটি সম্পূর্ণ না হওয়া পর্যন্ত কাজ করতে হবেঃ
$ git checkout -b hotfix
Switched to a new branch 'hotfix'
$ vim index.html
$ git commit -a -m 'Fix broken email address'
[hotfix 1fb7853] Fix broken email address
1 file changed, 2 insertions(+)
$ git checkout master
$ git merge hotfix
Updating f42c576..3a0874c
Fast-forward
index.html | 2 ++
1 file changed, 2 insertions(+)
আপনার পরিবর্তন এখন master ব্রাঞ্চ দ্বারা নির্দেশিত কমিটের স্ন্যাপশটে রয়েছে, এবং আপনি ফিক্সটই deploy করতে পারেন।
আপনার অতি-গুরুত্বপূর্ণ ফিক্স ডিপ্লয় হওয়ার পরে, বাধাপ্রাপ্ত হওয়ার আগে আপনি যে কাজটি করছিলেন তাতে ফিরে যেতে প্রস্তুত। যাইহোক, প্রথমে আপনি হটফিক্স ব্রাঞ্চটি মুছে ফেলবেন, কারণ আপনার আর এটির প্রয়োজন নেই — একই জায়গায় master ব্রাঞ্চটি নির্দেশ করে। আপনি এটি git branch কমান্ডে -d অপশান ব্যবহার করে মুছে ফেলতে পারেনঃ
$ git branch -d hotfix
Deleted branch hotfix (3a0874c).
$ git checkout iss53
Switched to branch "iss53"
$ vim index.html
$ git commit -a -m 'Finish the new footer [issue 53]'
[iss53 ad82d7a] Finish the new footer [issue 53]
1 file changed, 1 insertion(+)
মৌলিক মার্জিং
ধরুন আপনি সিদ্ধান্ত নিয়েছেন যে আপনার issue #53 কাজ সম্পূর্ণ হয়েছে এবং আপনার master ব্রাঞ্চে মার্জিং হওয়ার জন্য প্রস্তুত। এটি করার জন্য, আপনি আপনার iss53 ব্রাঞ্চটিকে master এ মার্জ করবেন, যেমন আপনি আগে আপনার hotfix ব্রাঞ্চ মার্জ করেছেন। আপনাকে যা করতে হবে তা হল আপনি যে ব্রাঞ্চে মার্জ করতে চান তাতে চেকাউট করুন এবং তারপর git merg কমান্ডটি চালানঃ
$ git checkout master
Switched to branch 'master'
$ git merge iss53
Merge made by the 'recursive' strategy.
index.html | 1 +
1 file changed, 1 insertion(+)
$ git branch -d iss53
মৌলিক মার্জ কনফ্লিক্ট
মাঝে মাঝে, এই প্রক্রিয়াটি সহজভাবে হয় না। আপনি যে দুটি ব্রাঞ্চে মার্জ করছেন, যদি আপনি সেখানকার একই ফাইলের একই অংশ ভিন্নভাবে পরিবর্তন করেন, গিট তাদের পরিষ্কারভাবে মার্জ করতে সক্ষম হবে না। যদি issue #53 তে আপনার সমস্যার সমাধান hotfix ব্রাঞ্চের মতো একটি ফাইলের একই অংশ পরিবর্তন করে, তাহলে আপনি একটি মার্জ কনফ্লিক্ট বা বিরোধ পাবেন যা দেখতে এরকম হবেঃ
$ git merge iss53
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.
$ git status
On branch master
You have unmerged paths.
(fix conflicts and run "git commit")
Unmerged paths:
(use "git add ..." to mark resolution)
both modified: index.html
no changes added to commit (use "git add" and/or "git commit -a")
<<<<<<< HEAD:index.html
contact : email.support@github.com
=======
please contact us at support@github.com
>>>>>>> iss53:index.html
please contact us at email.support@github.com
আপনি যদি এই সমস্যাগুলি সমাধান করার জন্য একটি গ্রাফিকাল টুল ব্যবহার করতে চান তবে আপনি git mergetool কমান্ডটি চালাতে পারেন, যা একটি উপযুক্ত ভিজ্যুয়াল মার্জ টুল চালু করে এবং আপনাকে কনফ্লিক্টগুলোর মধ্য দিয়ে নিয়ে যায়ঃ
$ git mergetool
This message is displayed because 'merge.tool' is not configured.
See 'git mergetool --tool-help' or 'git help config' for more details.
'git mergetool' will now attempt to use one of the following tools:
opendiff kdiff3 tkdiff xxdiff meld tortoisemerge gvimdiff diffuse diffmerge
ecmerge p4merge araxis bc3 codecompare vimdiff emerge
Merging:
index.html
Normal merge conflict for 'index.html':
{local}: modified file
{remote}: modified file
Hit return to start merge resolution tool (opendiff):
$ git status
On branch master
All conflicts fixed but you are still merging.
(use "git commit" to conclude merge)
Changes to be committed:
modified: index.html
Merge branch 'iss53'
Conflicts:
index.html
#
# It looks like you may be committing a merge.
# If this is not correct, please remove the file
# .git/MERGE_HEAD
# and try again.
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# All conflicts fixed but you are still merging.
#
# Changes to be committed:
# modified: index.html
#