(এই উত্তরটি লেখার জন্য কিছুটা সময় নিয়েছিল, এবং কোড উইজার্ডের উত্তর লক্ষ্য এবং মূলত সঠিক, তবে সম্পূর্ণরূপে সম্পূর্ণ নয়, তাই আমি এটি যাইহোক পোস্ট করব))
"রিমোট গিট ট্যাগ" বলে কোনও জিনিস নেই। কেবলমাত্র "ট্যাগ" রয়েছে। আমি এই সমস্তটি পেডেন্টিক না হওয়ার জন্য উল্লেখ করছি, 1 তবে নৈমিত্তিক গিট ব্যবহারকারীদের সাথে এটি সম্পর্কে প্রচুর বিভ্রান্তি রয়েছে, এবং গিট ডকুমেন্টেশন 2 টি প্রাথমিকভাবে সহায়ক নয় । (দুর্বল ডকুমেন্টেশনের কারণে বিভ্রান্তি আসে কিনা, বা দুর্বল ডকুমেন্টেশন আসে কারণ এটি সহজাতভাবে কিছুটা বিভ্রান্তিকর, বা কী, তা পরিষ্কার নয়))
সেখানে হয় "দূরবর্তী শাখা", আরো সঠিকভাবে "দূরবর্তী-ট্র্যাকিং শাখা" বলা, কিন্তু লক্ষ করে যে এই আসলে স্থানীয় সত্ত্বা হয় এটা মূল্য। কোনও রিমোট ট্যাগ নেই, যদিও (যদি না আপনি (পুনরায় সেগুলি আবিষ্কার করেন))। কেবলমাত্র স্থানীয় ট্যাগ রয়েছে, তাই আপনার এটি ব্যবহার করার জন্য স্থানীয়ভাবে ট্যাগটি পাওয়া দরকার।
নির্দিষ্ট কমিটের নামগুলির জন্য সাধারণ ফর্ম - যা গিটকে রেফারেন্স কল করে — যে কোনও স্ট্রিং দিয়ে শুরু হয় refs/
। একটি স্ট্রিং যা refs/heads/
একটি শাখার নাম দিয়ে শুরু হয় ; একটি refs/remotes/
রিমোট ট্র্যাকিং শাখার নাম দিয়ে শুরু একটি স্ট্রিং ; refs/tags/
নামের সাথে একটি স্ট্রিং শুরু হয় ট্যাগ। নাম refs/stash
হ'ল স্ট্যাশ রেফারেন্স (যেমন ব্যবহার করা git stash
; ট্রেলিং স্ল্যাশের অভাব নোট করুন)।
কিছু অস্বাভাবিক বিশেষ-কেস নাম দিয়ে শুরু করো না আছে refs/
: HEAD
, ORIG_HEAD
, MERGE_HEAD
, এবং CHERRY_PICK_HEAD
বিশেষ করে সব নাম নির্দিষ্ট করে উল্লেখ করতে পারে (যদিও হয় HEAD
সাধারণত একটি শাখার নাম, অর্থাত, ধারণ করে রয়েছে )। তবে সাধারণভাবে, রেফারেন্স দিয়ে শুরু হয় ।ref: refs/heads/branch
refs/
এই বিষয়টিকে বিভ্রান্ত করার জন্য গিট একটি কাজ করে তা হ'ল এটি আপনাকে বাদ দিতে refs/
এবং প্রায়শই শব্দটি পরে দেয় refs/
। উদাহরণস্বরূপ, আপনি বাদ দিতে পারেন refs/heads/
বা refs/tags/
কোনও স্থানীয় শাখা বা ট্যাগ উল্লেখ করার সময় fact এবং স্থানীয় শাখাটি পরীক্ষা করার সময় আপনাকে অবশ্যই বাদ দিতে হবেrefs/heads/
! ফলাফল যখনই দ্ব্যর্থহীন হয় আপনি এটি করতে পারেন, বা we যেমনটি আমরা উল্লেখ করেছি — যখন আপনাকে অবশ্যই এটি করতে হবে (জন্য )।git checkout branch
এটি সত্য যে রেফারেন্সগুলি কেবলমাত্র আপনার নিজস্ব সংগ্রহস্থলগুলিতেই নয়, দূরবর্তী সংগ্রহস্থলগুলিতেও রয়েছে। যাইহোক, গিট আপনাকে কেবল খুব নির্দিষ্ট সময়গুলিতে একটি দূরবর্তী সংগ্রহস্থলের রেফারেন্সগুলিতে অ্যাক্সেস দেয়: যথা, সময় fetch
এবং push
ক্রিয়াকলাপ। এছাড়াও আপনি ব্যবহার করতে পারেন git ls-remote
বা git remote show
তাদের দেখতে, কিন্তু fetch
এবং push
যোগাযোগের আরো আকর্ষণীয় পয়েন্ট।
Refspecs
সময় fetch
এবং push
, গীত স্ট্রিং ব্যবহার এটা আহ্বান refspecs স্থানীয় ও দূরবর্তী সংগ্রহস্থলের মধ্যে রেফারেন্স স্থানান্তর করতে। সুতরাং, এটি এই সময়ে এবং রেফস্প্যাকের মাধ্যমে, দুটি গিট সংগ্রহস্থল একে অপরের সাথে সিঙ্কে প্রবেশ করতে পারে। আপনার নামগুলি একবারে সিঙ্ক হয়ে গেলে আপনি একই নামটি ব্যবহার করতে পারেন যা প্রত্যন্ত ব্যবহার করে। fetch
যদিও এখানে কিছু বিশেষ যাদু রয়েছে এবং এটি শাখার নাম এবং ট্যাগের নাম উভয়কেই প্রভাবিত করে।
git fetch
আপনার গিটকে অন্য গিটকে কল করতে (বা সম্ভবত পাঠ্য বার্তা) নির্দেশ দেওয়ার কথা ভাবা উচিত - "রিমোট" "এবং এর সাথে কথোপকথন করতে হবে। এই কথোপকথনের শুরুর দিকে, রিমোটটি তার সমস্ত উল্লেখগুলি তালিকাভুক্ত করে: এর মধ্যে যে কোনও রেফারেন্স সহ refs/heads/
সমস্ত কিছু এবং এর ভিতরে থাকা সমস্ত কিছুই refs/tags/
। আপনার Git এই মাধ্যমে স্ক্যান এবং (চলিত এর উপর ভিত্তি করে refspec আনা) renames তাদের শাখা।
আসুন নামের রিমোটটির জন্য স্বাভাবিক রেস্পেককে একবার দেখে নেওয়া যাক origin
:
$ git config --get-all remote.origin.fetch
+refs/heads/*:refs/remotes/origin/*
$
এই রেফস্পেকটি আপনার গিটকে প্রতিটি নাম মিলে refs/heads/*
- রিমোটের প্রতিটি শাখা- refs/remotes/origin/*
র সাথে মিলিয়ে তার নাম পরিবর্তন করে , অর্থাৎ, মিলে যাওয়া অংশটিকে একই রাখবেন, শাখার নামটি ( refs/heads/
) একটি রিমোট-ট্র্যাকিং শাখার নামতে পরিবর্তন করুন ( refs/remotes/
বিশেষত , refs/remotes/origin/
)।
এটা এই refspec মাধ্যমে যে origin
এর শাখা দূরবর্তী জন্য আপনার রিমোটের-ট্র্যাকিং শাখা হয়ে origin
। শাখার নাম এই ক্ষেত্রে origin
, রিমোটের নাম সহ, রিমোট-ট্র্যাকিং শাখার নাম হয়ে যায় । +
রেফস্পেকের সামনের প্লাস চিহ্নটি "ফোর্স" পতাকা সেট করে, অর্থাত আপনার রিমোট ট্র্যাকিং শাখাটি এটির সাথে মেলে তুলতে যা লাগে তা নির্বিশেষে দূরবর্তীটির শাখার নামটি মিলিয়ে আপডেট করা হবে। ( +
শাখাগুলি ব্যতীত , শাখার আপডেটগুলি "দ্রুত ফরোয়ার্ড" পরিবর্তনের মধ্যে সীমাবদ্ধ থাকে এবং গিগ সংস্করণ ১.৮.২ বা তার পরে একইভাবে ট্যাগ আপডেটগুলি উপেক্ষা করা হয় then তারপরে একই দ্রুত-ফরওয়ার্ড বিধিগুলি প্রয়োগ করা হয়েছিল))
ট্যাগ
কিন্তু ট্যাগ সম্পর্কে কি? তাদের জন্য কোনও রেসপেক নেই - কমপক্ষে, ডিফল্টরূপে নয়। আপনি একটি সেট করতে পারেন, সেক্ষেত্রে রেফস্পেকের ফর্মটি আপনার উপর নির্ভর করে; অথবা আপনি চালাতে পারেন git fetch --tags
। ব্যবহার --tags
যোগ করার প্রভাব রয়েছে refs/tags/*:refs/tags/*
refspec অর্থাৎ, এটা সব ট্যাগ ওভার এনেছে ( কিন্তু আপডেট করা হয় না আপনার ট্যাগ যদি আপনি ইতিমধ্যে এই নামের একটি ট্যাগ আছে, কি রিমোটের ট্যাগ বলেছেন নির্বিশেষে সম্পাদনা, জানুয়ারি 2017: গীত 2.10 হিসাবে , পরীক্ষণ দেখায় যে --tags
রিমস্কেক পড়ার মতো জোর করে আপনার ট্যাগগুলি রিমোটের ট্যাগগুলি থেকে আপডেট করে +refs/tags/*:refs/tags/*
; এটি গিটের পূর্ববর্তী সংস্করণ থেকে আচরণে পার্থক্য হতে পারে)।
নোট যে কোন এখানে পুনঃনামকরনের হয়: দূরবর্তী যদি origin
ট্যাগ আছে xyzzy
, এবং আপনি না, এবং আপনি git fetch origin "refs/tags/*:refs/tags/*"
, আপনি পেতে refs/tags/xyzzy
আপনার সংগ্রহস্থলে জোড়া হয়েছে (প্রতি নির্দেশ একই দূরবর্তী হিসাবে কমিট)। আপনি যদি এটি ব্যবহার করেন +refs/tags/*:refs/tags/*
তবে আপনার ট্যাগটি xyzzy
যদি একটি থাকে তবে সেটির দ্বারা প্রতিস্থাপন করা হবে origin
। এটি হ'ল +
রেফস্পেকের বলের পতাকাটির অর্থ "আমার গিটারটি তাদের গিট থেকে যেটি পায় তার সাথে আমার রেফারেন্সের মানটি প্রতিস্থাপন করে"।
আনার সময় অটোম্যাটিক ট্যাগ
ঐতিহাসিক কারণে, 3 যদি আপনি তন্ন তন্ন ব্যবহার --tags
বিকল্প কিংবা --no-tags
বিকল্প, git fetch
বিশেষ কর্ম লাগে। মনে রাখবেন যে আমরা উপরে বলেছি যে রিমোটটি আপনার স্থানীয় গিটকে তার সমস্ত রেফারেন্স প্রদর্শন করেই শুরু হয় , আপনার স্থানীয় গিট সেগুলি দেখতে চায় কি না। 4 আপনার গিট এই মুহুর্তে এটি দেখতে পাওয়া সমস্ত ট্যাগগুলির নোট নেয়। তারপরে, এটি যে কোনও প্রতিশ্রুতিবদ্ধ অবজেক্ট ডাউনলোড করতে শুরু করে, এটি যা কিছু আনতে হবে তা হ্যান্ডল করার জন্য প্রয়োজন, যদি এই কমিটগুলির মধ্যে একটিরও সেই ট্যাগগুলির মতো একই আইডি থাকে, গিট সেই ট্যাগটি যোগ করতে পারে those বা সেই ট্যাগগুলি, যদি একাধিক ট্যাগের সেই আইডি থাকে — আপনার ভাণ্ডার
সম্পাদনা করুন, জানুয়ারি 2017: শো যে গীত 2.10 মধ্যে আচরণ এখন পরীক্ষা: তাদের গীত নামে একটি ট্যাগ প্রদান করে টি , এবং আপনি নামে একটি ট্যাগ নেই টি , এবং কমিট সঙ্গে যুক্ত আইডি টি শাখা এক পূর্বপুরুষ যা আপনি git fetch
পরীক্ষা করছেন, আপনার গিট আপনার ট্যাগগুলি সাথে বা তার বাইরে T যুক্ত করে --tags
। যোগ করার --tags
ফলে আপনার গিট তাদের সমস্ত ট্যাগ প্রাপ্ত করে এবং আপডেটও জোর করে।
শেষের সারি
আপনি git fetch --tags
তাদের ট্যাগ পেতে ব্যবহার করতে পারেন। তাদের আপনার বিদ্যমান ট্যাগ নামের সাথে ট্যাগ নাম সংঘাত, আপনি যদি পারে (Git সংস্করণটি উপর নির্ভর করে) এমনকি মুছে দিতে হবে (অথবা নামান্তর) আপনার ট্যাগের কিছু, এবং তারপর চালানো git fetch --tags
তাদের ট্যাগ পেতে। যেহেতু ট্যাগগুলি remote দূরবর্তী শাখাগুলির বিপরীতে automatic স্বয়ংক্রিয় নামকরণ হয় না, তাই আপনার ট্যাগের নামগুলি অবশ্যই তাদের ট্যাগের সাথে মিলে যায়, এজন্য আপনার দ্বন্দ্বের সমস্যা থাকতে পারে।
ইন সবচেয়ে স্বাভাবিক ক্ষেত্রে, যদিও, একটি সহজ git fetch
কাজ হবে, তাদের করে এবং তাদের ম্যাচিং ট্যাগ ওভার আনয়ন এবং যেহেতু তারা-কেবা তারা-হবে করে সময় তারা করে প্রকাশ এ ট্যাগ, আপনি তাদের ট্যাগ সঙ্গে যোগাযোগ রাখা হবে। আপনি যদি নিজের নিজস্ব ট্যাগ না তৈরি করেন না বা তাদের সংগ্রহশালা এবং অন্যান্য সংগ্রহশালাগুলি (একাধিক রিমোটের মাধ্যমে) মিশ্রণ করেন তবে আপনার কোনও ট্যাগের নাম সংঘর্ষ হবে না, তাই আপনাকে ট্যাগ মুছে ফেলা বা নাম পরিবর্তন করে গোলমাল করতে হবে না তাদের ট্যাগ প্রাপ্ত।
আপনার যখন উপযুক্ত নাম প্রয়োজন
আমি পূর্বেই উল্লেখ করা যে আপনার বর্জন করতে refs/
প্রায় সবসময়, এবং refs/heads/
এবং refs/tags/
এবং তাই অধিকাংশ সময় হয়েছে। কিন্তু কখন পারবে না ?
সম্পূর্ণ (অথবা কাছাকাছি সম্পূর্ণ যাহাই হউক না কেন) উত্তর হল ডকুমেন্টেশন । লিটকে দেওয়া ছয়-পদক্ষেপের ক্রম ব্যবহার করে গিট একটি প্রতিশ্রুতিবদ্ধ আইডিতে একটি নাম সমাধান করবে। কৌতূহলীভাবে, ট্যাগগুলি শাখাগুলিকে ওভাররাইড করে: যদি কোনও ট্যাগ এবং একটি শাখা থাকে এবং তারা বিভিন্ন কমিটের দিকে নির্দেশ করে, তবে:gitrevisions
xyzzy
xyzzy
git rev-parse xyzzy
আপনি যে আইডি ট্যাগ পয়েন্ট। তবে — এবং এটি যা থেকে নিখোঁজ রয়েছে gitrevisions
- git checkout
শাখার নাম পছন্দ করে, তাই git checkout xyzzy
আপনাকে ট্যাগ উপেক্ষা করে শাখায় বসিয়ে দেবে।
অস্পষ্টতার ক্ষেত্রে, আপনি প্রায় সর্বদা পুরো নামটি ব্যবহার করে রেফ নামটি বানান করতে পারেন refs/heads/xyzzy
বা refs/tags/xyzzy
। (নোট যে এই করে দিয়ে কাজ git checkout
, কিন্তু একটি সম্ভবত অপ্রত্যাশিত পদ্ধতিতে: git checkout refs/heads/xyzzy
একটি শাখা চেকআউট বদলে একটি বিচ্ছিন্ন-হেড চেকআউট ঘটায় এই জন্যই আপনি শুধু মনে রাখবেন যে করতে হবে। git checkout
প্রথমে একটি শাখা নামের সংক্ষিপ্ত নাম ব্যবহার করবে: এভাবেই আপনি xyzzy
ট্যাগটি xyzzy
উপস্থিত থাকলেও শাখাটি পরীক্ষা করে দেখুন the আপনি যদি ট্যাগটি দেখতে চান তবে আপনি ব্যবহার করতে পারেন refs/tags/xyzzy
))
কারণ ( gitrevisions
নোট হিসাবে ) গিট চেষ্টা করবে , আপনি কমিট ট্যাগটি সনাক্ত করতে কেবল লিখতেও পারেন । (কেউ নামে একটি বৈধ রেফারেন্স লিখতে পরিচালিত করে থাকে তাহলে মধ্যে যাইহোক, এই যেমন সমাধান হবে । কিন্তু স্বাভাবিকভাবে শুধুমাত্র বিভিন্ন নাম থাকা উচিত ।)refs/name
tags/xyzzy
xyzzy
xyzzy
$GIT_DIR
$GIT_DIR/xyzzy
*HEAD
$GIT_DIR
1 ঠিক আছে, ঠিক আছে, " কেবলমাত্র পেডেন্টিক হওয়ার জন্য নয় "। :-)
2 কেউ কেউ "খুব সহায়ক নয়" বলতেন এবং আমি আসলে তাতে সম্মত হতে চাইতাম।
3 মূলত, git fetch
এবং রিমোটস এবং রেসপেস্কগুলির সম্পূর্ণ ধারণাটি গিটের সাথে সামান্য কিছুটা দেরী সংযোজন ছিল, এটি গিট 1.5 এর সময়কালের মধ্যে ঘটেছিল। তার আগে এখানে কয়েকটি অ্যাড-হক বিশেষ কেস ছিল এবং ট্যাগ-আনার মধ্যে একটি ছিল, সুতরাং এটি বিশেষ কোডের মাধ্যমে দাদাদের কাছে পেয়েছিল।
4 যদি সাহায্য করে, হিসেবে দূরবর্তী গীত মনে Flasher অপভাষা অর্থ।
git checkout A
। কিA
? আপনি কীভাবে তৈরি করেছেনA
?