গিট শাখা - ফিন্সআপে আনসেট-আপস্ট্রিম কেন কল করবেন?


161

গিটে উন্নত ক্রিয়াকলাপের কথা বলতে গেলে আমি একজন নবজাতক of আমি ব্লগিং ফ্রেমওয়ার্ক অক্টোপ্রেস ব্যবহার করে আমার ব্লগ বজায় রাখি । যদিও অক্টোপ্রেস ২০১১ সাল থেকে কোনও বিকাশের অধীনে নেই, এটি আমার উদ্দেশ্যটি ভালভাবে সরবরাহ করে এবং তাই আমি এখন পর্যন্ত কোনও পরিবর্তন করার কথা ভাবি নি।

এফওয়াইআই, আমার ব্লগটি গিথুব পৃষ্ঠাগুলিতে হোস্ট করা আছে।

আজ, একটি নতুন পোস্টে কাজ করার সময়, git statusনিম্নলিখিত বার্তাটি দেখিয়েছে:

On branch source
Your branch is based on 'origin/master', but the upstream is gone.
  (use "git branch --unset-upstream" to fixup)

একই বার্তা পরবর্তী সমস্ত কমান্ড যেমন git add ., git commit -m 'message'এবং এর জন্য পুনরাবৃত্তি হয়েছিল git push origin source

  • বার্তাটির অর্থ কী?
  • কিছু ভেঙে গেছে?
  • যদি হ্যাঁ, কি?
  • আমার কি এটি ঠিক করার দরকার আছে?

যদি সম্ভব হয় তবে দয়া করে আমাকে একটি পিডিএফ / ওয়েব নিবন্ধে নির্দেশ করুন যেখানে আমি এটি পড়তে পারি এবং এটি ভবিষ্যতের জন্য বুঝতে পারি।

আরো বিস্তারিত:

bash-3.2$ git branch -a
* source
  remotes/octopress/2.1
  remotes/octopress/HEAD -> octopress/master
  remotes/octopress/gh-pages
  remotes/octopress/linklog
  remotes/octopress/master
  remotes/octopress/refactor_with_tests
  remotes/octopress/rubygemcli
  remotes/octopress/site
  remotes/origin/source

আরও তথ্যের প্রয়োজন হলে আমাকে জানান know ধন্যবাদ।

উত্তর:


197

টিএল; ডিআর সংস্করণ: রিমোট-ট্র্যাকিং শাখা origin/masterবিদ্যমান ছিল, তবে এখন নেই, তাই স্থানীয় শাখা sourceএমন কিছু ট্র্যাক করছে যা অস্তিত্বহীন, যা সন্দেহজনক — এর অর্থ একটি আলাদা গিট বৈশিষ্ট্য আপনার জন্য কিছু করতে অক্ষম — এবং গিট আপনাকে এ সম্পর্কে সতর্ক করছে। "আপস্ট্রিম ট্র্যাকিং" বৈশিষ্ট্যটি যেমন কাজ করা হয়েছে ঠিক তেমন না করেই আপনি ঠিকঠাক হয়ে যাচ্ছেন, সুতরাং কিছু পরিবর্তন করা উচিত কিনা তা আপনার বিষয় up

অন্য প্রবাহের সেটিংস গ্রহণের জন্য, কেন আমাকে "গিট পুশ - সেট-আপস্ট्रीम উত্স <ব্র্যাঞ্চ>" করতে হবে তা দেখুন?


এই সতর্কতাটি গিটে একটি নতুন জিনিস, গিট 1.8.5-এ প্রথম প্রদর্শিত হবে। রিলিজ নোটগুলি সম্পর্কে এটি সম্পর্কে একটি মাত্র শর্ট বুলেট-আইটেম রয়েছে:

  • "গিট শাখা -v -v" (এবং "গিট স্ট্যাটাস") অন্য কোনও শাখার উপর ভিত্তি করে নেই এমন একটি শাখার মধ্যে পার্থক্য করে না, একটি শাখা যা তার প্রবাহের শাখার সাথে সুসংগত থাকে এবং একটি শাখা যা একটি প্রবাহের সাথে কনফিগার করা হয় শাখা যা আর বিদ্যমান নেই।

এর অর্থ কী তা বর্ণনা করতে আপনাকে প্রথমে "রিমোটস", "রিমোট-ট্র্যাকিং শাখা" এবং গিট কীভাবে "একটি প্রবাহকে ট্র্যাকিং" পরিচালনা করে তা সম্পর্কে জানতে হবে। ( রিমোট-ট্র্যাকিং শাখাগুলি একটি মারাত্মক ত্রুটিযুক্ত শব্দ instead আমি পরিবর্তে দূরবর্তী ট্র্যাকিংয়ের নামগুলি ব্যবহার শুরু করেছি, যা আমার সামান্য উন্নতি বলে মনে হয় though নীচে, যদিও আমি গিট ডকুমেন্টেশনের সাথে সামঞ্জস্য করার জন্য "রিমোট-ট্র্যাকিং শাখা" ব্যবহার করব)। )

প্রতিটি "রিমোট" কেবল একটি নাম, যেমন originবা octopressএই ক্ষেত্রে। তাদের উদ্দেশ্য হ'ল আপনি git fetchবা git pullআপডেট হওয়া জায়গাগুলির পুরো URL এর মতো জিনিস রেকর্ড করা । আপনি যখন 1 গিট ব্যবহার করেন তখন সেই রিমোটে যায় (সংরক্ষিত ইউআরএল ব্যবহার করে) এবং যথাযথ আপডেটের সেট নিয়ে আসে। এটি "রিমোট-ট্র্যাকিং শাখা" ব্যবহার করে আপডেটগুলিও রেকর্ড করে।git fetch remote,

একটি "রিমোট-ট্র্যাকিং শাখা" (বা রিমোট-ট্র্যাকিং নাম) কেবল কোনও "রিমোট" -তে সর্বশেষে দেখা হিসাবে একটি শাখার নাম রেকর্ডিং। প্রতিটি দূরবর্তী নিজেই একটি গিট সংগ্রহস্থল, তাই এর শাখা রয়েছে। দূরবর্তী "উত্স" এর শাখাগুলি আপনার স্থানীয় ভাণ্ডারগুলিতে রেকর্ড করা আছে remotes/origin/। টেক্সট আপনাকে দেখিয়েছি বলেছেন নামে একটি শাখা আছে যে sourceউপর origin, এবং শাখা নামে 2.1, linklog, এবং আরো অনেক কিছু octopress

(একটি "সাধারণ" বা "স্থানীয়" শাখা অবশ্যই একটি শাখা-নাম যা আপনি নিজের সংগ্রহস্থলে তৈরি করেছেন))

সর্বশেষে, আপনি "ট্র্যাক" একটি "রিমোট-ট্র্যাকিং শাখা" করতে একটি (স্থানীয়) শাখা সেট আপ করতে পারেন। একবার স্থানীয় শাখা Lরিমোট-ট্র্যাকিং শাখার ট্র্যাক করার জন্য সেট করা গেলে R, গিট Rতার "আপস্ট্রিম" কল করবে এবং আপনাকে বলবে যে আপনি "এগিয়ে" এবং / অথবা "পিছনে" প্রবাহিত (কমিটের ক্ষেত্রে)। স্থানীয় শাখা এবং রিমোট-ট্র্যাকিং শাখাগুলির একই নাম (দূরবর্তী উপসর্গটি বাদে) ব্যবহার করার মতো এটি স্বাভাবিক (এমনকি প্রস্তাবনা-সক্ষম ) sourceও এবং পছন্দ করা origin/sourceতবে এটি আসলে প্রয়োজনীয় নয়।

এবং এই ক্ষেত্রে, এটি ঘটছে না। আপনার কাছে একটি স্থানীয় শাখা রয়েছে যা sourceএকটি দূরবর্তী ট্র্যাকিং শাখা ট্র্যাক করে origin/master

গিট কীভাবে কোনও দূরবর্তী শাখার ট্র্যাক করার জন্য স্থানীয় একটি শাখা স্থাপন করে তার সঠিক যান্ত্রিকতাগুলি আপনার জানা উচিত নয় , তবে তারা নীচে প্রাসঙ্গিক, সুতরাং আমি কীভাবে এটি কাজ করে তা দেখাব। আমরা আপনার স্থানীয় শাখার নাম দিয়ে শুরু করি source,। দুটি কনফিগারেশন এই নাম, বানান ব্যবহার এন্ট্রি branch.source.remoteএবং branch.source.merge। আপনি যে আউটপুটটি দেখিয়েছেন তা থেকে এটি স্পষ্ট হয়ে গেছে যে এগুলি দুটিই সেট, যাতে আপনি প্রদত্ত আদেশগুলি দৌড়ে নিলে নিম্নলিখিতটি দেখতে পাবেন:

$ git config --get branch.source.remote
origin
$ git config --get branch.source.merge
refs/heads/master

এগুলি একসাথে রেখে 2 এটি গিটকে বলে যে আপনার শাখাটি sourceআপনার "রিমোট-ট্র্যাকিং শাখা" ট্র্যাক করে origin/master

তবে এখন আউটপুটটি দেখুন git branch -a, যা আপনার সংগ্রহস্থলের সমস্ত স্থানীয় এবং দূরবর্তী-ট্র্যাকিং শাখার নাম দেখায়। রিমোট-ট্র্যাকিংয়ের নামগুলি নীচে তালিকাভুক্ত করা হয়েছে remotes/... এবং নেইremotes/origin/master । সম্ভবত এক সময় ছিল, কিন্তু এখন এটি শেষ।

গিট আপনাকে জানিয়ে দিচ্ছে যে এর সাহায্যে আপনি ট্র্যাকিংয়ের তথ্য সরিয়ে ফেলতে পারেন --unset-upstream। এই উভয় আউট সাফ করবে branch.source.originএবং branch.source.merge, এবং সতর্কবার্তা বন্ধ করুন।

এটা তোলে মোটামুটি সম্ভবত মনে হচ্ছে যে আপনি যা চান তা, যদিও, হয় সুইচ নির্ণয় করা থেকে origin/masterঅন্য কিছু ট্র্যাকিং: সম্ভবত origin/source, কিন্তু হয়তো এক octopress/নাম।

আপনার সাথে এটা করতে পারেন git branch --set-upstream-to, 3 উদাহরণ:

$ git branch --set-upstream-to=origin/source

(ধরে নিই যে আপনি এখনও শাখা "উত্স" এ রয়েছেন, এবং origin/sourceএটিই আপনার প্রবাহিত প্রবাহ — তবে কোনটি আসলে আপনি চান তা বলার উপায় নেই)।

(এছাড়াও আপনি কীভাবে একটি বিদ্যমান গিট শাখা একটি দূরবর্তী শাখাকে ট্র্যাক করেন? দেখুন )

আমি মনে করি আপনি এখানে যেভাবে এসেছেন তা হ'ল আপনি যখন প্রথম কাজটি করেছিলেন git clone, তখন আপনি ক্লোনড করেছেন এমন জিনিসটির একটি শাখা ছিল master। আপনার একটি শাখাও ছিল master, যা ট্র্যাক করার জন্য সেট করা হয়েছিল origin/master(এটি গিটের জন্য একটি সাধারণ, মানক সেটআপ)। এর অর্থ আপনি ছিল branch.master.remoteএবং branch.master.mergeসেট, এর originএবং refs/heads/master। কিন্তু তারপর আপনার originদূরবর্তী থেকে তার নাম পরিবর্তন করে masterকরা source। মেলানোর জন্য, আমি বিশ্বাস করি আপনি নিজের স্থানীয় নামও বদলে masterদিয়েছেন source। এই পরিবর্তিত নাম থেকে আপনার সেটিংস, branch.master.remoteকরতে branch.source.remoteএবং থেকে branch.master.mergeথেকে branch.source.merge... কিন্তু এটা পুরানো বাম মান , তাই branch.source.mergeএখন ভুল ছিল।

এই সময়ে "আপস্ট্রিম" সংযোগটি ভেঙেছিল, তবে 1.8.5 এর চেয়ে পুরানো গিট সংস্করণগুলিতে, গিট কখনও ভাঙা সেটিংটি লক্ষ্য করেনি। এখন আপনার 1.8.5 রয়েছে, এটি এটি নির্দেশ করছে।


এটি বেশিরভাগ প্রশ্নকে কভার করে, তবে "আমাকে এটি ঠিক করার দরকার কি" তা নয়। সম্ভবত আপনি এখন ধরে বছরের পর বছর ধরে ভাঙা নীড় ঘিরে কাজ করে যাচ্ছেন (যেমন, )। যদি আপনি এটি চালিয়ে যেতে থাকেন তবে এটি সমস্যাটি নিয়ে কাজ করে চলেছে — সুতরাং, না, আপনার এটি ঠিক করার দরকার নেই । আপনি যদি চান তবে আপনি প্রবাহটি সরাতে এবং অভিযোগগুলি বন্ধ করতে ব্যবহার করতে পারেন, এবং স্থানীয় শাখাটি কোনও প্রবাহকে একেবারেই চিহ্নিত করা যাবে না ।git pull remote branchgit pull origin source--unset-upstreamsource

একটি প্রবাহিত হওয়ার বিষয়টি হ'ল বিভিন্ন ক্রিয়াকলাপকে আরও সুবিধাজনক করে তোলা। উদাহরণস্বরূপ, git fetchদ্বারা অনুসরণ git mergeসাধারণত "সঠিক জিনিস করতে" হবে মূল প্রজেক্টের সঠিকভাবে সেট হয় যদি, এবং git statusপরে git fetchআপনার রেপো যে শাখা জন্য, মূল প্রজেক্টের এক সাথে মিলে যায় কিনা আপনাকে বলতে হবে।

আপনি যদি সুবিধাটি চান তবে প্রবাহটিকে পুনরায় সেট করুন।


1git pull ব্যবহার করে git fetchএবং গিট 1.8.4 এর হিসাবে এটি (শেষ পর্যন্ত!) "রিমোট-ট্র্যাকিং শাখা" তথ্যও আপডেট করে। গিটের পুরানো সংস্করণগুলিতে, আপডেটগুলি git pullকেবলমাত্র সহ, রিমোট-ট্র্যাকিং শাখায় রেকর্ড হয় নি git fetch। আপনার গিটটি অবশ্যই কমপক্ষে 1.8.5 সংস্করণ হওয়া উচিত এটি আপনার পক্ষে কোনও সমস্যা নয়।

2 ঠিক আছে, এই প্লাস এমন একটি কনফিগারেশন লাইন আমি ইচ্ছাকৃতভাবে উপেক্ষা করছি যা এর নীচে পাওয়া গেছে remote.origin.fetch। দূরবর্তী-শাখার পুরো স্থানীয় নামটি খুঁজে বের করতে গিটকে "মার্জ" নামটি মানচিত্র করতে হবে refs/remotes/origin/master। ম্যাপিং প্রায় সবসময়, শুধু এই মত কাজ করে যদিও, তাই এটি যে আন্দাজের এর masterযায় origin/master

3 বা, সাথে git config। আপনি যদি কেবলমাত্র প্রবাহটিকে origin/sourceকেবলমাত্র সেই অংশে সেট করতে চান যা পরিবর্তন করতে হবে branch.source.mergeএবং git config branch.source.merge refs/heads/sourceতা করবে। তবে আপনাকে যা করতে চান তা --set-upstream-toবলছেন না, আপনাকে নিজে করে দেওয়ার পরিবর্তে এটি নিজেই করুন, সুতরাং এটি একটি "আরও ভাল উপায়"।


3
"যদি আপনার পছন্দ হয় তবে আপনি স্থানীয় শাখাটি কোনও প্রবাহকে একেবারে প্রবাহিত না করে চিহ্নিত করতে ব্যবহার করতে --unset-upstream ব্যবহার করতে পারেন ।"
BeatriceThalo

157

টেরকের উত্তর সম্ভবত নিখুঁত, তবে আমি রেকর্ডটির জন্য অন্য একটি মামলার উল্লেখ করতে চেয়েছিলাম যা মূল প্রশ্নে বর্ণিত বর্ণনার চেয়ে আলাদা তবে একই ত্রুটিটি উপস্থিত হতে পারে (কারণ এটি অন্যদেরকে একই সমস্যাযুক্ত হতে পারে):

আমি git init --bareআমার একটি সার্ভার ব্যবহার করে একটি খালি (নতুন) রেপো তৈরি করেছি। তারপরে আমি git cloneএটি আমার পিসির স্থানীয় ওয়ার্কস্পেসে নিয়ে এসেছি।

স্থানীয় রেপোতে একটি সংস্করণ করার পরে কল করার পরে আমি ত্রুটি পেয়েছি git status

টেরকের উত্তর অনুসরণ করে, আমি বুঝতে পেরেছি যে কী ঘটেছে তা হল স্থানীয় ওয়ার্কিং ডিরেক্টরি রেপোতে প্রথম প্রতিশ্রুতিবদ্ধ "মাস্টার" শাখা তৈরি করেছিল। তবে রিমোট রেপোতে (সার্ভারে) কিছুই ছিল না, তাই "মাস্টার" (রিমোটস / উত্স / মাস্টার) শাখাও ছিল না।

git push origin masterস্থানীয় রেপো থেকে চালানোর পরে রিমোট রেপোতে শেষ পর্যন্ত একটি মাস্টার শাখা ছিল। এটি ত্রুটিটি উপস্থিত হতে থামিয়েছে।

সুতরাং উপসংহারে বলা যায় - "মাস্টার" সহ কোনও শাখা না থাকায় শূন্য কমিট সহ নতুন নতুন রিমোট রেপোর জন্য এমন একটি ত্রুটি পেতে পারে।


6
এই ত্রুটি বার্তার জন্য এটি বর্তমানে এনআর 1 ফলাফল এবং সাপেক্ষিকরূপে On branch source Your branch is based on 'origin/master', but the upstream is gone. (use "git branch --unset-upstream" to fixup), এখানে বিকল্প বিকল্প পাওয়া এতটা দুর্দান্ত খালি সংগ্রহস্থলটির ক্লোনিংয়ের ফলে এটি হওয়ার সম্ভাবনা বেশি।
বেলা

2
আমি মনে করি সে কারণেই README.md ফাইলটি দিয়ে আপনার নতুন ভান্ডারটি শুরু করা সর্বদা একটি ভাল ধারণা
আহমেদ হুসেন

8

এটি আপনার সমস্যার সমাধান করতে পারে।

পরিবর্তনগুলি করার পরে আপনি এটি করতে পারেন এবং তারপরেও

git remote add origin https://(address of your repo) it can be https or ssh
then
git push -u origin master

আশা করি এটা তোমার জন্য কাজ করবে.

ধন্যবাদ


1
এটি সত্যই সহায়তা করবে - কারণটি আমার উত্তরে বিস্তারিত (সংক্ষেপে - এটি দূরবর্তী রেপোতে অনুপস্থিত মাস্টার শাখা তৈরি করে)।
এলাজারআর

7

আমার জন্য, .git/refs/origin/masterদুর্নীতিগ্রস্থ হয়ে পড়েছিল।

আমি নিম্নলিখিতটি করেছিলাম, যা আমার জন্য সমস্যাটি স্থির করে।

rm .git/refs/remotes/origin/master
git fetch
git branch --set-upstream-to=origin/master

0

প্রকৃতপক্ষে টেরেক আপনাকে ইতিমধ্যে জানিয়েছে যে কীভাবে আমি করতে সক্ষম হবো তার থেকে কীভাবে আরও বেশি সরঞ্জামগুলি ব্যবহার করতে হয়। যাইহোক, এই ক্ষেত্রে আমি মনে করি এটা কিছু অদ্ভুত নির্দেশ যদি তোমার দিকে নির্দেশাবলী অনুসরণ গুরুত্বপূর্ণ http://octopress.org/docs/deploying/github/ । যথা, আপনার সেটআপে আপনার একাধিক গিথুব সংগ্রহস্থল থাকবে । ডিরেক্টরিটি আপনার ওয়েবসাইটের জন্য সমস্ত উত্স কোড সহ প্রথমে একটিকে $WEBSITEএবং তারপরে কেবল স্থির উত্পন্ন ফাইলগুলির মধ্যে একটি $WEBSITE/_deploy। সেটআপটির মজার বিষয় হ'ল ডিরেক্টরিতে একটি .gitignoreফাইল রয়েছে $WEBSITEযাতে এই সেটআপটি আসলে কাজ করে।

যথেষ্ট ভূমিকা। এই ক্ষেত্রে ত্রুটিটি সংগ্রহস্থল থেকেও আসতে পারে _deploy

cd _deploy

git branch -a
* master
remotes/origin/master
remotes/origin/source

ইন .git/configআপনি সাধারণত ভালো কিছু খুঁজে বের করতে হবে:

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[remote "origin"]
    url = git@github.com:yourname/yourname.github.io.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master

তবে আপনার ক্ষেত্রে শাখা মাস্টারের একটি রিমোট নেই।

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[remote "origin"]
    url = git@github.com:yourname/yourname.github.io.git
    fetch = +refs/heads/*:refs/remotes/origin/*

যা আপনি এর মাধ্যমে সমাধান করতে পারেন:

cd _deploy
git branch --set-upstream-to=origin/master

সুতরাং, টেরেক যেমনটি আপনাকে বলেছিল তেমন সমস্তই, তবে এটি উল্লেখ করা গুরুত্বপূর্ণ যে এটি খুব ভালভাবে _deployআপনার ওয়েবসাইটের মূলের পরিবর্তে ডিরেক্টরিটি উদ্বেগ করতে পারে ।

পিএস: ভবিষ্যতে এই জিনিসটি কামড় না দেওয়ার জন্য একটি শেল ব্যবহার করা যেমন zshএকটি gitপ্লাগইন ব্যবহার করা উপযুক্ত। এটি অবিলম্বে প্রদর্শিত হবে যে _deployএকটি পৃথক সংগ্রহস্থল সম্পর্কিত concerns


0

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

cat .git/refs/remotes/origin/feature/mybranch \
echo 1edf9668426de67ab764af138a98342787dc87fe \
>> .git/refs/remotes/origin/feature/mybranch

0

সমস্যা: আপনার শাখাটি 'উত্স / মাস্টার' এর উপর ভিত্তি করে তৈরি হয়েছে, তবে উজানে চলে গেছে।

সমাধান: গিট শাখা - আনসেট আপ আপস্ট্রিম


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

0

কমান্ড অনুসরণ করে আপনার স্থানীয় শাখা মুছুন

git branch -d branch_name

আপনি করতে পারেন

git branch -D branch_name 

যা মূলত মুছতে বাধ্য করে (স্থানীয় উত্সে একীভূত না হলেও)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.