Menu
২.৫ গিট বেসিক – রিমোট নিয়ে কাজ
রিমোট নিয়ে কাজ
যেকোনো গিট প্রজেক্টে কাজ করতে সক্ষম হওয়ার জন্য আপনাকে রিমোট রিপোসিটরিগুলোর সাথে কিভাবে কাজ করতে হয় তা জানতে হবে। রিমোট রিপোসিটরি হল ইন্টারনেট বা নেটওয়ার্কের কোথাও হোস্ট করা থাকা প্রজেক্টের ভার্সন। এখন আমাদের কোন প্রজেক্ট নিয়ে কাজ করার সময় এই রিপোসিটরি রিড/রাইড করা লাগতে পারে, আবার একটি কাজ আমরা অনেকজন এক সাথে করতে পারি তখন অন্যদের সহযোগিতার মাধ্যমে এই রিমোট রিপোসিটরি গুলো পরিচালনা করা এবং অন্যদের কাজ ভাগ করার প্রয়োজন হলে রিপোসিটরিগুলোতে ডাটা পুশ করা এবং পুল করা লাগতে পারে। রিমোট রিপোসিটরি গুলো পরিচালনা করার মধ্যে রয়েছে কিভাবে রিমোট রিপোসিটরিগুলো অ্যাড করতে হয়, অথবা যেগুলো লাগবে না সেইগুলাকে কিভাবে রিমুভ করতে হয় এবং বিভিন্ন রিমোট এর ব্রাঞ্চগুলোকে কিভাবে পরিচালনা করা এবং সেইগুলোকে ট্র্যাক করা হয়। এই অধ্যায়ে আমরা এই জিনিসগুলো নিয়ে আলোচনা করব।
নোট
রিমোট রিপোসিটরি আপনার লোকাল মেশিনে থাকতে পারে
এটা সম্পূর্ণভাবে সম্ভব যে আপনি এমন একটি রিমোট রিপোসিটরি এর সাথে কাজ করতে পারেন যেটা আসলে একই হোস্টে আছে | রিমোট শব্দটি দিয়ে এটা বোঝায় না যে রেপোজিটরিটি নেটওয়ার্ক অথবা ইন্টারনেট এর অন্য কোথাও আছে, বরং এটা বোঝায় যে আপনার লোকাল থেকে অন্য কোথাও আছে | এই ধরনের রিমোট রেপোজিটরির সাথে কাজ করা, অন্য যেকোনো রিমোট রেপোজিটরির স্ট্যান্ডার্ড পুশিং,পুলিং এবং ফেচিং এর মতই।
এটা সম্পূর্ণভাবে সম্ভব যে আপনি এমন একটি রিমোট রিপোসিটরি এর সাথে কাজ করতে পারেন যেটা আসলে একই হোস্টে আছে | রিমোট শব্দটি দিয়ে এটা বোঝায় না যে রেপোজিটরিটি নেটওয়ার্ক অথবা ইন্টারনেট এর অন্য কোথাও আছে, বরং এটা বোঝায় যে আপনার লোকাল থেকে অন্য কোথাও আছে | এই ধরনের রিমোট রেপোজিটরির সাথে কাজ করা, অন্য যেকোনো রিমোট রেপোজিটরির স্ট্যান্ডার্ড পুশিং,পুলিং এবং ফেচিং এর মতই।
রিমোট রিপোসিটোরি দেখানো
যে সকল রিমোট সার্ভারগুলি আমরা কনফিগার করে রাখছি সেগুলো দেখার জন্য আমরা git remote কমান্ডটি রান করব এবং এটি রান হওয়ার পর একটি সংক্ষিপ্ত তালিকা দেখাবে। আপনি যদি আপনার রিপোসিটরি ক্লোন করে থাকেন তাহলে আপনি অন্তত origin লেখা দেখতে পাবেন, কারন আপনি যে সার্ভার থেকে ক্লোন করেছেন এটা হল তার গিট প্রদত্ত ডিফল্ট নাম।আমরা উদারণ স্বরুপ দেখতে পারি :
$ git clone https://github.com/schacon/ticgit
Cloning into 'ticgit'...
remote: Reusing existing pack: 1857, done.
remote: Total 1857 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (1857/1857), 374.35 KiB | 268.00 KiB/s, done.
Resolving deltas: 100% (772/772), done.
Checking connectivity... done.
$ cd ticgit
$ git remote
origin
এক্ষেত্রে আপনি -v স্পেসিফাই করে দিলে তা রিমোটে রিড ও রাইট করার জন্য যেসকল শর্টনেম গুলো গিট স্টোর করে রেখেছে তাদের ইউআরএল গুলো দেখতে পারবেন।
$ git remote -v
origin https://github.com/schacon/ticgit (fetch)
origin https://github.com/schacon/ticgit (push)
আবার আপনার যদি একাধিক রিমোট থাকে, তাহলে এই কমান্ডটি সবগুলো রিপোজিটরির একটি লিস্ট করে দেখাবে। যেমন একাধিক রিমোট সম্বলিত একটি রিপোসিটরি যাতে কিছু সংখ্যক কোলাবরেটর কাজ করছে সেক্ষেত্রে এই কমান্ডটি দিয়ে রান করলে নিম্নরুপ দেখাবে:
$ cd grit
$ git remote -v
bakkdoor https://github.com/bakkdoor/grit (fetch)
bakkdoor https://github.com/bakkdoor/grit (push)
cho45 https://github.com/cho45/grit (fetch)
cho45 https://github.com/cho45/grit (push)
defunkt https://github.com/defunkt/grit (fetch)
defunkt https://github.com/defunkt/grit (push)
koke git://github.com/koke/grit.git (fetch)
koke git://github.com/koke/grit.git (push)
origin git@github.com:mojombo/grit.git (fetch)
origin git@github.com:mojombo/grit.git (push)
এতে করে আপনি অন্যান্য ইউজারদের কন্ট্রিবিউশন খুব সহজেই দেখতে পারবেন যাদের মাঝে এক বা একাধিকের ক্ষেত্রে পুশ করার পারমিশনও আপনি পেতে পারেন, তবে তা এখানের আলোচ্য বিষয় নয়।
লক্ষ করবেন যে, এই রিমোটগুলো বেশ কিছু ধরনের প্রটোকল ব্যবহার করে। এ সম্পর্কে একটি গিট সার্ভারে আলোচনা করা হয়েছে।
লক্ষ করবেন যে, এই রিমোটগুলো বেশ কিছু ধরনের প্রটোকল ব্যবহার করে। এ সম্পর্কে একটি গিট সার্ভারে আলোচনা করা হয়েছে।
রিমোট রিপোজিটরি অ্যাড করা
আমরা কিভাবে git clone কমান্ডটি origin রিমোট যোগ করে তা উল্লেখ করেছি এবং কিছু উদাহরণ দেখিয়েছি। এখন আমরা দেখবো কিভাবে শর্টনেমযুক্ত একটি নতুন রিমোট যুক্ত করবেন। এক্ষেত্রে এই কমান্ডটি রান করুন: git remote add <shortname> <url>
$ git remote
origin
$ git remote add pb https://github.com/paulboone/ticgit
$ git remote -v
origin https://github.com/schacon/ticgit (fetch)
origin https://github.com/schacon/ticgit (push)
pb https://github.com/paulboone/ticgit (fetch)
pb https://github.com/paulboone/ticgit (push)
এখন আপনি পুরো ইউআরএল এর পরিবর্তে কমান্ড লাইনে স্ট্রিং pb ব্যবহার করতে পারেন। উদাহরণস্বরূপ, আপনি যদি পলের কাছে থাকা সমস্ত তথ্য আনতে চান কিন্তু আপনার রিপোসিটরিতে যদি না থাকে তবে আপনি git fetch pb চালাতে পারেন।
$ git fetch pb
remote: Counting objects: 43, done.
remote: Compressing objects: 100% (36/36), done.
remote: Total 43 (delta 10), reused 31 (delta 5)
Unpacking objects: 100% (43/43), done.
From https://github.com/paulboone/ticgit
* [new branch] master -> pb/master
* [new branch] ticgit -> pb/ticgit
পলের master ব্রাঞ্চ এখন pb/master হিসেবে অ্যাক্সেসযোগ্য —আপনি একে আপনার যেকোনো একটি ব্রাঞ্চে মার্জ করতে পারেন, অথবা আপনি যদি এটি ইন্সপেক্ট করতে চান, সেক্ষেত্রে আপনি আপনার লোকাল এ একটা নতুন ব্রাঞ্চে চেকআউট করে দেখতে পারেন। গিট ব্রাঞ্চিং এ আমরা এ নিয়ে বিষদভাবে আলোচনা করেছি।
রিমোট থেকে ফেচ ও পুল করা
আপনি কিছুক্ষণ আগে দেখেছেন, আপনার রিমোট প্রজেক্ট থেকে কোন ডাটা পেতে চাইলে আপনি নিম্নোক্ত কমান্ডটি রান করতে পারেন
$ git fetch
এই কমান্ডটি রিমোট প্রজেক্টে হিট করে এবং যে ডাটাগুলো আপনার কাছে নেই সেগুলো রিমোট প্রজেক্ট থেকে পুল ডাউন করে। ফলে, ওই রিমোট এর সবগুলো ব্রাঞ্চের রেফারেন্স আপনার কাছে থাকে, যাতে আপনি যে কোন সময় মার্জ অথবা ইন্সপেক্ট করতে পারেন।
যদি আপনি একটি রিপোজিটরিকে ক্লোন করেন, সেক্ষেত্রে ওই কমান্ডটি স্বয়ংক্রিয়ভাবে ওই রিমোট রিপোজিটরি কে “অরিজিন” নামে যোগ করে। সুতরাং git fetch origin যে কোন নতুন কাজ(ডাটা) নিয়ে আসে যা আপনি ক্লোন করার পর সেই সার্ভারে পুশ করেছেন (বা শেষবার ফেচ করা হয়েছে)। একটি গুরুত্বপূর্ণ বিষয় হল git fetch কমান্ডটি শুধুমাত্র আপনার লোকাল রিপোজিটরিতে ডাটা ডাউনলোড করে, এটি স্বয়ংক্রিয়ভাবে আপনার কোন কাজের সাথে মার্জ করবে না অথবা আপনি বর্তমানে যে কাজ করছেন তা সংশোধন করবে না। আপনার কাজ যখন শেষ হয়ে যাবে তখন আপনাকে এটি ম্যানুযইয়্যালি মার্জ করে নিতে হবে।
যদি আপনার বর্তমান ব্রাঞ্চ একটি রিমোট ব্রাঞ্চকে ট্র্যাক করার জন্য সেট করা হয় (আরো তথ্যের জন্য পরবর্তী বিভাগ এবং গিট ব্রাঞ্চ দেখুন), স্বয়ংক্রিয়ভাবে ওই রিমোট ব্রাঞ্চ কে আপনার কারেন্ট ব্রাঞ্চে ফেচ এবং তারপরে মার্জ করতে git pull কমান্ডটি ব্যবহার করতে পারেন। এটি আপনার জন্য একটি সহজ বা আরো সুবিধা জনক কর্ম প্রবাহ হতে পারে, বাই ডিফল্টভাবে, git clone কমান্ড স্বয়ংক্রিয়ভাবে আপনার লোকাল master ব্রাঞ্চ সেটআপ করে যাতে আপনি যে সার্ভার থেকে গ্রহণ করেছ, সেখানে রিমোট মাস্টার ব্রাঞ্চ ট্র্যাক করতে পারে। git pull কমান্ডটি দিলে সাধারণত আপনি যে সার্ভার থেকে গ্রহণ করেছন সেখান থেকে ডাটা নিয়ে আসে এবং আপনি বর্তমানে যে কোড এ কাজ করছেন, তাতে স্বয়ংক্রিয়ভাবে এটি মার্জ করার চেষ্টা করে।
যদি আপনি একটি রিপোজিটরিকে ক্লোন করেন, সেক্ষেত্রে ওই কমান্ডটি স্বয়ংক্রিয়ভাবে ওই রিমোট রিপোজিটরি কে “অরিজিন” নামে যোগ করে। সুতরাং git fetch origin যে কোন নতুন কাজ(ডাটা) নিয়ে আসে যা আপনি ক্লোন করার পর সেই সার্ভারে পুশ করেছেন (বা শেষবার ফেচ করা হয়েছে)। একটি গুরুত্বপূর্ণ বিষয় হল git fetch কমান্ডটি শুধুমাত্র আপনার লোকাল রিপোজিটরিতে ডাটা ডাউনলোড করে, এটি স্বয়ংক্রিয়ভাবে আপনার কোন কাজের সাথে মার্জ করবে না অথবা আপনি বর্তমানে যে কাজ করছেন তা সংশোধন করবে না। আপনার কাজ যখন শেষ হয়ে যাবে তখন আপনাকে এটি ম্যানুযইয়্যালি মার্জ করে নিতে হবে।
যদি আপনার বর্তমান ব্রাঞ্চ একটি রিমোট ব্রাঞ্চকে ট্র্যাক করার জন্য সেট করা হয় (আরো তথ্যের জন্য পরবর্তী বিভাগ এবং গিট ব্রাঞ্চ দেখুন), স্বয়ংক্রিয়ভাবে ওই রিমোট ব্রাঞ্চ কে আপনার কারেন্ট ব্রাঞ্চে ফেচ এবং তারপরে মার্জ করতে git pull কমান্ডটি ব্যবহার করতে পারেন। এটি আপনার জন্য একটি সহজ বা আরো সুবিধা জনক কর্ম প্রবাহ হতে পারে, বাই ডিফল্টভাবে, git clone কমান্ড স্বয়ংক্রিয়ভাবে আপনার লোকাল master ব্রাঞ্চ সেটআপ করে যাতে আপনি যে সার্ভার থেকে গ্রহণ করেছ, সেখানে রিমোট মাস্টার ব্রাঞ্চ ট্র্যাক করতে পারে। git pull কমান্ডটি দিলে সাধারণত আপনি যে সার্ভার থেকে গ্রহণ করেছন সেখান থেকে ডাটা নিয়ে আসে এবং আপনি বর্তমানে যে কোড এ কাজ করছেন, তাতে স্বয়ংক্রিয়ভাবে এটি মার্জ করার চেষ্টা করে।
নোট
গিট ভার্সন 2.27 থেকে, যদি pull.rebase ভেরিয়েবল সেট না করা হয় তবে git pulll একটি সতর্কতা দেখাবে। আপনি ভেরিয়েবল সেট না করা পর্যন্ত গিট আপনাকে সতর্ক করবে।
আপনি যদি গিট-এর ডিফল্ট আচরণ চান (সম্ভব হলে দ্রুত-ফরোয়ার্ড করুন, অন্যথায় একটি মার্জ কমিট তৈরি করুন): git config –global pull.rebase “false”
অথবা আপনি যদি রিবেস করতে চান: git config –global pull.rebase “true”
আপনি যদি গিট-এর ডিফল্ট আচরণ চান (সম্ভব হলে দ্রুত-ফরোয়ার্ড করুন, অন্যথায় একটি মার্জ কমিট তৈরি করুন): git config –global pull.rebase “false”
অথবা আপনি যদি রিবেস করতে চান: git config –global pull.rebase “true”
আপনার রিমোট সার্ভার এ পুশ করুন
যখন আপনার প্রজেক্ট এমন একটা অবস্থায় থাকে যেটা আপনি শেয়ার করতে চান তখন আপনাকে এটি আপ স্ট্রিমে পুশ করতে হবে, সে ক্ষেত্রে কমান্ডটি হল : git push
$ git push origin master
এই কমান্ডটি তখনই কাজ করে যখন আপনি এমন একটি সার্ভার থেকে গ্রহণ করেছেন যেখানে আপনার রাইট অ্যাক্সেস রয়েছে এবং এর মধ্যে কেউই এখানে কোন পুশ দেয়নি। যদি আপনি এবং অন্য কেউ একই সময়ে গ্রহণ করে এবং তারা আপস্ট্রিমে আগে পুশ দেয় এবং তারপরে আপনি পুশ দেন, তখন আপনার পুশ রিজেক্টেড হবে। আপনাকে আগে তাদের কাজ(ডাটা) ফেচ করে আনতে হবে এবং আপনার কাজের মাঝে সংযুক্ত করার পর আপনি পুশ করতে পারবেন। কিভাবে রিমোট সার্ভারে ইউজ করতে হয় সে সম্পর্কে আরো বিস্তারিত তথ্যের জন্য গিট ব্রাঞ্চিং দেখুন।
রিমোট ইন্সপেক্ট করা
আপনি যদি একটি নির্দিষ্ট রিমোট সম্পর্কে আরো তথ্য দেখতে চান সেক্ষেত্রে আপনি git remote show
$ git remote show origin
* remote origin
Fetch URL: https://github.com/schacon/ticgit
Push URL: https://github.com/schacon/ticgit
HEAD branch: master
Remote branches:
master tracked
dev-branch tracked
Local branch configured for 'git pull':
master merges with remote master
Local ref configured for 'git push':
master pushes to master (up to date)
এটি ট্র্যাকিং ব্রাঞ্চের তথ্যের এর পাশাপাশি রিমোট রিপোজিটরির জন্য ইউয়ারএল গুলোকে তালিকাভুক্ত করে। যদি আপনি master ব্রাঞ্চ এ থাকেন এবং git pulll কমান্ডটি রান করেন সেইখেত্রে এটি ফেচ করার পর স্বয়ংক্রিয়ভাবে রিমোট এর মাস্টার ব্রাঞ্চকে লোকাল ব্রাঞ্চে মার্জ করবে। এছাড়াও এটি রিমোট থেকে পুল করা সকল রেফারেন্সগুলোর একটি তালিকা দিয়ে দেয়।
এটি একটি সহজ উদাহরণ যখন আপনি অনেক বেশি গিট ব্যবহার করবেন তখন সম্ভবত অনেক কিছুর সম্মুখীন হতে পারেন, এজন্য git remote show কমান্ডটি ব্যবহারের মাধ্যমে আপনি আরও বেশ কিছু তথ্য পেতে পারেন।
এটি একটি সহজ উদাহরণ যখন আপনি অনেক বেশি গিট ব্যবহার করবেন তখন সম্ভবত অনেক কিছুর সম্মুখীন হতে পারেন, এজন্য git remote show কমান্ডটি ব্যবহারের মাধ্যমে আপনি আরও বেশ কিছু তথ্য পেতে পারেন।
$ git remote show origin
* remote origin
URL: https://github.com/my-org/complex-project
Fetch URL: https://github.com/my-org/complex-project
Push URL: https://github.com/my-org/complex-project
HEAD branch: master
Remote branches:
master tracked
dev-branch tracked
markdown-strip tracked
issue-43 new (next fetch will store in remotes/origin)
issue-45 new (next fetch will store in remotes/origin)
refs/remotes/origin/issue-11 stale (use 'git remote prune' to remove)
Local branches configured for 'git pull':
dev-branch merges with remote dev-branch
master merges with remote master
Local refs configured for 'git push':
dev-branch pushes to dev-branch (up to date)
markdown-strip pushes to markdown-strip (up to date)
master pushes to master (up to date)
এই কমান্ডটি দেখায় যে, নির্দিষ্ট ব্রাঞ্চে থাকাকালীন সময় git push কমান্ডটি রান করাতে কোন ব্রাঞ্চ স্বয়ংক্রিয়ভাবে পুশ হয়েছে। এছাড়াও যখন আপনি git pull কমান্ডটি রান করবেন তখন আপনি আরো দেখতে পারবেন, সার্ভারে কোন রিমোট ব্রাঞ্চগুলো আপনার এবং কোনগুলো আপনার না, আবার আপনার কোন রিমোট ব্রাঞ্চগুলো পূর্বে ছিল কিন্তু এখন সার্ভার থেকে রিমুভ করা হয়েছে এবং একাধিক লোকাল ব্রাঞ্চ যা রিমোট-ট্র্যাকিং ব্রাঞ্চ স্বয়ংক্রিয়ভাবে মার্জ হয়, যখন আপনি git pull কমান্ডটি চালান।
নামকরণ এবং রিমোট ব্রাঞ্চ অপসারণ
রিমোট এর শর্টনেম পরিবর্তন করতে চাইলে git remote rename কমান্ডটি চালাতে পারেন। উদারনস্বরূপ আপনি যদি pb এর নাম পরিবর্তন করে paul করতে চান তাহলে আপনি যেটা করতে পারেন সেটা হল git remote rename
$ git remote rename pb paul
$ git remote
origin
paul
আপনি যদি কোনো কারণে রিমোট অপসারণ করতে চান অথবা আপনি সার্ভারটি সরিয়ে নিয়েছেন বা আর কোনো নির্দিষ্ট মিরর ব্যবহার করছেন না, অথবা সম্ভবত একজন কন্ট্রিবিউটর আর কন্ট্রিবিউট করছেন না তাহলে আপনি হয় git remote remove বা git remote rm কমান্ডটি ব্যবহার করতে পারেন |
$ git remote remove paul
$ git remote
origin
একবার আপনি এইভাবে রিমোটের রেফারেন্স মুছে ফেললে, সেই রিমোটের সাথে সম্পর্কিত সমস্ত রিমোট-ট্র্যাকিং ব্রাঞ্চে এবং কনফিগারেশন সেটিংসও রিমুভ হয়ে যায়।