গিটের FETCH_HEAD এর অর্থ কী?


220

git pull --help বলেছেন:

এর ডিফল্ট মোডে git pullশর্টহ্যান্ড git fetchঅনুসরণ করা হয় git merge FETCH_HEAD

এটি কী FETCH_HEADএবং আসলে কী সংঘটিত হয় git pull?


3
দ্রষ্টব্য: যেহেতু গিট 1.8.4 (আগস্ট 2013), git fetch origin masterআসলে আপডেট হবে origin/masterনা কেবল নয় FETCH_HEAD। দেখুন stackoverflow.com/a/20967347/6309
VonC

আরো জানার জন্য git merge FETCH_HEAD(গীত 2.5 সাল থেকে Q2 এর 2015), দেখতে stackoverflow.com/a/30425991/6309
VonC

উত্তর:


218

FETCH_HEADদূরবর্তী সংগ্রহস্থল থেকে সবেমাত্র কী আনা হয়েছে তার উপর নজর রাখার জন্য এটি একটি স্বল্পস্থায়ী রেফ। git pullপ্রথমে অনুরোধ করা হয় git fetch, সাধারণ ক্ষেত্রে দূরবর্তী থেকে একটি শাখা আনতে হয়; FETCH_HEADএই শাখার ডগায় ইঙ্গিত করে (এটি শাখাগুলির মতোই কমিটের SHA1 সঞ্চয় করে)। git pullতারপরে বর্তমান শাখায় git mergeমার্জ FETCH_HEADকরে , ডাকে ।

ফলাফলটি আপনি যা প্রত্যাশা করছিলেন ঠিক সেটাই: উপযুক্ত দূরবর্তী শাখার ডগায় প্রতিশ্রুতি আপনার বর্তমান শাখার ডগায় প্রতিশ্রুতিতে মার্জ করা হয়েছে।

এটি কিছুটা git fetchযুক্তি (বা git remote update) ছাড়াই করা , আপনার সমস্ত দূরবর্তী শাখাগুলি আপডেট করার পরে চালানো git merge origin/<branch>, তবে FETCH_HEADঅভ্যন্তরীণভাবে পরিবর্তিতভাবে জিনিসগুলি নামকরণ করার পরিবর্তে একক রেফারেন্স যা পাওয়া গেছে তা বোঝাতে using


9
@Jefromi: দুঃখিত, আমি মনে করি আপনি ভুল: আমি যতটুকু বুঝি, git fetchআপডেট (মার্জ) দূরবর্তী স্টোরেজ, না শুধু থেকে সব অবজেক্ট ডেটা একটি ব্রাঞ্চ। সুতরাং আমি আপনার উত্তর থেকে বুঝতে পারছি না যে গিটটি কোন শাখার মূল নির্দেশকে কীভাবে নির্দেশ করবে FETCH_HEAD। আমি FETCH_HEADগিট ডকুমেন্টেশনেও পাই না (সংজ্ঞা, উদাহরণ নয়)। অস্তিত্বটি FETCH_HEADআমার কাছে আরও কাজের মতো দেখায়, কোনওভাবেgit pull কাজ করতে পারে ।
আলেক্সি

14
আলেক্সি: স্থানীয় সংগ্রহস্থল কনফিগারেশন FETCH_HEADদ্বারা উল্লিখিত দূরবর্তী শাখার অগ্রভাগের সাথে branch.<BRANCH>.mergeমিল রয়েছে। সুতরাং fetchপ্রকৃতপক্ষে দূরবর্তী স্টোরেজ থেকে সমস্ত অবজেক্টের ডেটা আনার সময় FETCH_HEAD, স্থানীয় শাখার দ্বারা ট্র্যাক করা দূরবর্তী শাখাটি কোথায় উন্নত হয়েছে তা নির্দেশ করতে ব্যবহৃত হয়। তাই আপনি যদি স্থানীয় উপর masterশাখা এবং চালানোর git fetchএবং branch.master.mergeপয়েন্ট refs/heads/master, তারপর FETCH_HEADমানের সমান হবে origin/masterঅবিলম্বে আনা অপারেশনের পর।
লারস্ক

4
@ অ্যালেক্সি FETCH_HEAD এর ম্যান পৃষ্ঠাতে গিট আনার বিবরণের দ্বিতীয় অনুচ্ছেদে বর্ণিত হয়েছে আমার উত্তরটি সঠিক। এবং তর্ক ছাড়াই গিট আনতে ডিফল্ট দূরবর্তী সমস্ত রিমোট শাখা আপডেট করে ... তবে এটি অবশ্যই মার্জ হওয়ার মতো নয়।
ক্যাসাবেল

4
আপনি FETCH_HEADযদি সমস্ত দূরবর্তী শাখা মাধ্যমে আনা হয় তবে কী হবে git fetch -a?
স্টিগি

2
@stigi আপনার বর্তমানে চেকআউটআউট শাখা দূরবর্তী ট্র্যাকিং শাখার ডগা গিট কনফিগারেশনে নির্দেশ করছে। উপরের মন্তব্যে লারস্কের উত্তর দেখুন।
অঙ্কুর আগরওয়াল

19

FETCH_HEAD হ'ল ফেচটি কমান্ডটি ব্যবহার করে বা টানার অংশ হিসাবে সরাসরি আনা হয়েছিল কিনা তা শেষ প্রান্তের ডগায় একটি সূত্র। FETCH_HEAD এর বর্তমান মান .gitএকটি ফোল্ডারে নামক কোনও ফাইলে সংরক্ষণ করা হয়েছে , আপনি এটি অনুমান করেছিলেন FETCH_HEAD,।

সুতরাং যদি আমি ইস্যু করি:

git fetch https://github.com/ryanmaxwell/Fragaria

FETCH_HEAD এ থাকতে পারে

3cfda7cfdcf9fb78b44d991f8470df56723658d3        https://github.com/ryanmaxwell/Fragaria

যদি আমার কাছে দূরবর্তী ট্র্যাকিং শাখা হিসাবে রিমোট রেপো কনফিগার করা থাকে তবে আমি ট্র্যাকিং শাখার একত্রীকরণের মাধ্যমে আমার আনতে পারি। যদি আমি না করি তবে আমি সরাসরি FETCH_HEAD ব্যবহার করে শেষ আনার টিপটি মার্জ করতে পারি।

git merge FETCH_HEAD

1
আমার 5 সেন্ট যোগ করতে। আমাকে কী বিভ্রান্ত করে তোলে তা হল, আমার FETCH_HEAD সর্বশেষ প্রতিশ্রুতিগুলির পেছনে ছিল, এমনকি যদি কোনও নতুন আনয়ন করা হয় যা "কোনও পরিবর্তন হয়নি" (গ্রহনে) ফিরে আসে। আমি মনে করি এর কারণটি হ'ল, আমার শেষ আনার পর থেকে সমস্ত পরিবর্তনগুলি আমার নিজের এবং আমার দ্বারা সার্ভারে ঠেলা দেওয়া হয়েছিল। সুতরাং পরবর্তী ফলকটির কিছুই করার ছিল না এবং এমনকি FETCH_HEAD আপডেটও করেনি। আমি নিশ্চিত নই যে এটি জিআইটি বা অ্যাক্লিপস গিট বাস্তবায়নের কোনও ঘাটতি কিনা।
টর্গে

11

জোনাথনের উত্তরে উল্লিখিত হিসাবে , FETCH_HEAD ফাইলটির সাথে মিলে যায় .git/FETCH_HEAD। সাধারণত, ফাইলটি এর মতো দেখাবে:

71f026561ddb57063681109aadd0de5bac26ada9                        branch 'some-branch' of <remote URL>
669980e32769626587c5f3c45334fb81e5f44c34        not-for-merge   branch 'some-other-branch' of <remote URL>
b858c89278ab1469c71340eef8cf38cc4ef03fed        not-for-merge   branch 'yet-some-other-branch' of <remote URL>

সমস্ত শাখা ছাড়াও কীভাবে একটি চিহ্নিত রয়েছে তা লক্ষ্য করুন not-for-merge। বিজোড় এক আউটটি শাখা যা আনার আগে পরীক্ষা করা হয়েছিল। সংক্ষিপ্তসারে: FETCH_HEAD মূলত বর্তমানে যে শাখার পরীক্ষা করা হয়েছে তার শাখার রিমোট সংস্করণটির সাথে সম্পর্কিত।


9

আমি সবেমাত্র আবিষ্কার করেছি এবং ব্যবহার করেছি FETCH_HEAD। আমি একটি সার্ভার থেকে কিছু সফ্টওয়্যার স্থানীয় কপি চেয়েছিলাম এবং আমি করেছি

git fetch gitserver release_1

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

 git tag release_1 FETCH_HEAD 

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

আমার মতে এটি সেই উদ্দেশ্যটির পক্ষে সবচেয়ে ভাল এড়ানো এবং আমি যা করার চেষ্টা করেছিলাম তা অর্জনের আরও ভাল উপায়

git fetch gitserver release_1:release_1

অর্থাত্ রিলিজ_1 আনতে এবং এটিকে স্থানীয়ভাবে রিলিজ_1 বলে। (এটি উত্স: গন্তব্য, https://git-scm.com/book/en/v2/Git-Internals-The-Refspec দেখুন ; আপনি যদি একে আলাদা নাম দিতে চান তবেই !)

আপনি FETCH_HEADযদিও বিভিন্ন সময়ে ব্যবহার করতে পারেন :

git fetch gitserver bugfix1234
git cherry-pick FETCH_HEAD

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


আকর্ষণীয় প্রতিক্রিয়া। +1
ভোনসি

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

3

গিট টান হ'ল একটি মার্চ সংমিশ্রণ এবং তার পরে একত্রীকরণ। যখন গিট আনতে হয় তখন এটি FETCH_HEAD এ কী প্রাপ্ত হয়েছিল তার প্রধান প্রতিশ্রুতিটি নোট করে (.git নামের মধ্যে কেবল একটি ফাইল) এবং এই কমিটগুলি তখন আপনার কার্যনির্বাহী ডিরেক্টরিতে মার্জ করা হয়।


3
@ ম্যানজোল্ডস, " এটি যা এনেছে তার বিষয়ে প্রধান প্রতিশ্রুতি " বলতে কী বোঝ ? গিট আনতে সবকিছু নিয়ে আসে।
আলেক্সি

@ গিট ম্যানুয়াল থেকে অ্যালেক্সি: git-scm.com/docs/git-fetch : যে
PJ_Finnegan
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.