পরিবর্তনগুলি উপরিভাগে উপস্থিত থাকলে গিট স্ট্যাটাস শো শাখা কেন আপ টু ডেট থাকে?


226

পরিবর্তনগুলি একটি ট্র্যাক করা শাখায় আপস্ট্রিমে বিদ্যমান, তবে আমি যখন git statusএটি টাইপ করি তখন ইঙ্গিত দেয় যে আমার স্থানীয় শাখাটি আপ টু ডেট। এই নতুন আচরণ, আমি কি একটি কনফিগার সেটিংস পরিবর্তন করেছি, বা কিছু ভুল?

সাহায্যের জন্য ধন্যবাদ.

ubuntu@host:/my/repo# git status
On branch master
Your branch is up-to-date with 'origin/master'.

nothing to commit, working directory clean


ubuntu@host:/my/repo# git pull
remote: Counting objects: 11, done.
remote: Compressing objects: 100% (11/11), done.
remote: Total 11 (delta 6), reused 0 (delta 0)
Unpacking objects: 100% (11/11), done.
From bitbucket.org:my/repo
   1234567..abcdefg  master     -> origin/master
Updating 1234567..abcdefg
Fast-forward
 file1        |  1 -
 file2        | 43 +++++++++++++++++++++++++++++++++++++++++++
 file3        | 21 ++++++++++++---------
 file4        | 21 ++++++++++++---------
 4 files changed, 67 insertions(+), 19 deletions(-)
 create mode 100644 file5

উত্তর:


274

স্ট্যাটাসটি আপনাকে যা বলছে তা হ'ল আপনি রেফ নামক রেফের পিছনে origin/master যা আপনার স্থানীয় রেপোতে স্থানীয় রেফoriginএক্ষেত্রে যে রেফটি কিছু দূরবর্তী অঞ্চলে একটি শাখা ট্র্যাক করতে দেখা যায়, বলা হয় , কিন্তু স্থিতিটি আপনাকে রিমোটের শাখা সম্পর্কে কিছুই বলছে না। এটি আপনাকে রেফ সম্পর্কে বলছে, যা আপনার স্থানীয় ফাইল সিস্টেমে সঞ্চিত কেবল একটি প্রতিশ্রুতি আইডি (এই ক্ষেত্রে এটি সাধারণত .git/refs/remotes/origin/masterআপনার স্থানীয় রেপোতে ডাকা একটি ফাইলের মধ্যে থাকে)।

git pullদুটি অপারেশন করে; প্রথমে এটি git fetchরিমোট রেপোতে (যা origin/masterআপনার স্থানীয় রেপোতে রেফ আপডেট করে ) কমিটের সাথে আপ টু ডেট করার চেষ্টা করে , তারপরে এটি git mergeসেই কমিটগুলি বর্তমান শাখায় মার্জ করার জন্য একটি কাজ করে।

আপনি এই fetchপদক্ষেপটি না করা পর্যন্ত (নিজেরাই বা এর মাধ্যমে git pull) আপনার স্থানীয় রেপোটি জানার কোনও উপায় নেই যে উপরের দিকে অতিরিক্ত কমিট রয়েছে এবং git statusকেবল আপনার স্থানীয় origin/masterরেফের দিকে তাকান।

যখন git statusআপ-টু-ডেট বলে, এর অর্থ "বর্তমান শাখা যে শাখাকে ট্র্যাক করে সেই শাখার সাথে আপ টু ডেট" যার অর্থ এই ক্ষেত্রে "স্থানীয় রেফ বলা হয় origin/master" সাথে আপ-টু-ডেট "। এটি কেবলমাত্র "প্রবাহের fetchসর্বশেষ লাইভ স্ট্যাটাসের সাথে আপ-টু-ডেট" সমান নয় এমন "প্রবাহের সর্বশেষ লাইভ স্ট্যাটাসের সাথে আপ-টু-ডেট" সমান নয় এমন " প্রবাহের স্থিতির সাথে সাম্প্রতিক সময়ের সমাপ্তি যেটি আমরা গতবার করেছি " stream

কেন এটি এভাবে কাজ করে? ভাল fetchধাপটি একটি সম্ভাব্য ধীর এবং ব্যয়বহুল নেটওয়ার্ক অপারেশন। গিট (এবং অন্যান্য বিতরণিত সংস্করণ নিয়ন্ত্রণ ব্যবস্থা ) এর নকশাটি অপ্রয়োজনীয় যখন নেটওয়ার্ক ক্রিয়াকলাপ এড়ানোর জন্য, এবং সাধারণ ক্লায়েন্ট-সার্ভার সিস্টেমের সম্পূর্ণ ভিন্ন মডেল হিসাবে অনেক লোক ব্যবহৃত হয় (যদিও নীচের মন্তব্যে উল্লেখ করা হয়েছে, গিটের ধারণাটি একটি "রিমোট ট্র্যাকিং শাখা" এর ফলে এখানে বিভ্রান্তির সৃষ্টি হয় সমস্ত ডিভিসিএস শেয়ার করে না)। কোনও কেন্দ্রীয়ীকৃত সার্ভারের সাথে কোনও সংযোগ না রেখে গিট অফলাইনে ব্যবহার করা সম্পূর্ণভাবে সম্ভব এবং এর আউটপুট এটি git statusপ্রতিফলিত করে।

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


79
একটি দেরী মন্তব্য কিন্তু আমি একই পরিস্থিতিতে দৌড়ে। আমি বুঝতে পারি কেন আনার আগে গিটের পরিবর্তন সম্পর্কে জানার কোনও উপায় নেই। তবে তারপরে এটি "আপ টু ডেট" বলা উচিত নয় যা কেবল সত্য নয়। এটি আরও ভাল করে বলা উচিত "দূরবর্তী সময়ে কী ঘটেছে তা কোনও ধারণা" "
Droidum

31
সম্ভবত এটি কঠোরভাবে যৌক্তিক, তবে এটি মোটেই মানব-যুক্তিসঙ্গত নয়। আপনি কেন এটি আনার জন্য ডিজাইন করবেন না এবং তারপরে এটি আপডেট আছে কিনা তা ঘোষণা করবেন? বা বার্তাটি এটি কী করেছে তা বলার জন্য পরিবর্তন করুন, যেমন "branch টাইমস্ট্যাম্প at এ শেষবার যখন পরীক্ষা করা হয়েছিল তখন আপনার শাখা 'উত্স / মাস্টার' দিয়ে আপ টু ডেট ছিল? অথবা এমনকি কেবল এটিই বলুন, "আপনার শাখাটি আপ টু ডেট আছে কিনা তা খুঁজে পেতে কোনও আনতে চান"?
কলিন মে

25
"আপনার শাখাটি আপ টু ডেট" বার্তাটি দেখানো কেন বিরক্ত করবেন? আমি উত্স / মাস্টারের স্থিতি জানার কোনও বিন্দু দেখতে পাচ্ছি না, এবং যদি এটি মূল রিমোটে প্রকৃত মাস্টার শাখার প্রতিনিধিত্ব করার কথা মনে হয়, তবে এর স্পষ্টভাবে কোনও ধারণা নেই।
whiterook6

2
@ পেস্টুল্লো, সুতরাং একটি উপনাম তৈরি করুন।
জোনাথন ওয়াকলি

23
এটি গিটের ভয়াবহ ব্যবহারের যথাযথ উদাহরণ। আমি এর শক্তি এবং নমনীয়তা পছন্দ করি তবে কেবল "আপনার শাখাটি 'উত্স / মাস্টার' এর স্থানীয় সংস্করণের সাথে আপ-টু-ডেট like একটি বিশাল উন্নতি হবে। এখানে বিভ্রান্তি হ'ল স্থানীয় শাখার উত্স / মাস্টার (আপনি যে রিমোট / শাখাগুলি ব্যবহার করছেন তার সাথে প্যাটার্ন ম্যাচ) যা কোনও দূরবর্তী শাখা ট্র্যাক করে।
ম্যাথহেচামিং516

35

এটি কারণ আপনার স্থানীয় রেপো আপস্ট্রিম রিমোটগুলি সাথে চেক ইন করে নি। এই কাজ আপনি এটা আশা করছি হিসেবে পেয়ে, ব্যবহার git fetchতারপর একটি চালানোর git statusআবার।


7

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

git remote show origin

এটি যা করে তা হ'ল সমস্ত বর্তমান ট্র্যাক করা শাখাগুলি ফিরিয়ে দেওয়া এবং সর্বাপেক্ষা গুরুত্বপূর্ণ - তথ্যটি সেগুলি আপ টু ডেট, দূরবর্তী উত্সের পিছনে বা পিছনে রয়েছে কিনা। উপরের কমান্ডের পরে, এটি কী ফিরে আসে তার উদাহরণ:

  * remote origin
  Fetch URL: https://github.com/xxxx/xxxx.git
  Push  URL: https://github.com/xxxx/xxxx.git
  HEAD branch: master
  Remote branches:
    master      tracked
    no-payments tracked
  Local branches configured for 'git pull':
    master      merges with remote master
    no-payments merges with remote no-payments
  Local refs configured for 'git push':
    master      pushes to master      (local out of date)
    no-payments pushes to no-payments (local out of date)

আশা করি এটি কাউকে সাহায্য করবে।


0

"উত্স / মাস্টার" শাখার "উত্স / মাস্টার" এর হেড কমিটের রেটিংটি রেফারেন্সকে বোঝায়। একটি রেফারেন্স হ'ল গিট অবজেক্টের একটি মানব-বান্ধব এলিফ নাম, সাধারণত কমিট অবজেক্ট। আপনি যখন git pushআপনার দূরবর্তী ( http://git-scm.com/book/en/v2/Git-Internals-Git-References#Remotes ) তে যান তখনই "উত্স / মাস্টার" রেফারেন্স আপডেট হয় ।

আপনার প্রকল্পের মূলের মধ্যে থেকে, চালান:

cat .git/refs/remotes/origin/master

প্রদর্শিত কমিট আইডি এর সাথে তুলনা করুন:

cat .git/refs/heads/master

তাদের একই হওয়া উচিত এবং এ কারণেই গিট বলেছেন যে masterএটি আপ-টু-ডেট origin/master

আপনি যখন দৌড়াবেন

git fetch origin master

এটি .git / অবজেক্ট ফোল্ডারের অধীনে স্থানীয়ভাবে নতুন গিট বস্তু পুনরুদ্ধার করে। এবং গিট আপডেট .git / FETCH_HEAD যাতে এখন, এটি আনীত শাখার সর্বশেষ প্রতিশ্রুতি নির্দেশ করে।

সুতরাং আপনার বর্তমান স্থানীয় শাখার মধ্যে পার্থক্য এবং শাখাটি উজান থেকে প্রাপ্ত শাখাটি দেখতে আপনি চালাতে পারেন

git diff HEAD FETCH_HEAD

1
.Git ডিরেক্টরিতে আপনার বিড়াল আইটেমগুলি করা উচিত নয়, এটি প্যাকিং রেফগুলির সাথে কাজ করবে না। এছাড়াও আপনি বর্ণিত আনার আচরণটি গিটের পুরানো সংস্করণগুলির জন্য।
অ্যান্ড্রু সি

origin/masterরেফ এছাড়াও একটি আনয়ন, পাশাপাশি একটি ধাক্কা দ্বারা আপডেট হয় না ?
জোনাথন ওয়েকেলি

সঠিক। আমি এখন পর্যন্ত গিট 1.8.3 ব্যবহার করছিলাম। আমি প্রকৃতপক্ষে ২.২.১ সংস্করণটি লক্ষ্য করতে পারি, ফেচচএইচএইড আনার সময় আপডেট হয়। এছাড়াও যখন "আপনার শাখাটি আপ টু ডেট রয়েছে ..." বা "আপনার শাখাটি পিছনে রয়েছে ... এক্স দ্বারা করা হয়েছে" বার্তাটি আসে তখন আপনার স্থানীয় শাখা একটি প্রদত্ত প্রত্যন্ত শাখা ট্র্যাক করে তবেই এটি প্রদর্শিত হয়। উত্স / মাস্টার ট্র্যাক করার জন্য মাস্টারকে শাখা মাস্টার থেকে গিট শাখা -u উত্স / মাস্টার চালাতে হবে must যদি কোনও ট্র্যাকিং না থাকে তবে আপনার এখনও গিট ডিফ চালাতে হবে।
মেরেক স্ট্যানলি

ঠিক আছে তবে আমি আপনাকে এই পরামর্শটি সঠিক করতে পরামর্শ দিচ্ছি যে '' উত্স / মাস্টার '' রেফারেন্সটি কেবল তখনই আপডেট হয় যখন আপনি আপনার দূরবর্তী দিকে ধাক্কা দিয়ে যান '
জোনাথন ওয়েকেলি

0

যদি যাচাই করার জন্য একটি নমুনা Git রেপো যাক your branch (master)হয় up to dateসঙ্গে origin/master

স্থানীয় মাস্টার উত্স / মাস্টার ট্র্যাক করছে তা যাচাই করুন:

$ git branch -vv
* master a357df1eb [origin/master] This is a commit message

স্থানীয় মাস্টার শাখা সম্পর্কে আরও তথ্য:

$ git show --summary
commit a357df1eb941beb5cac3601153f063dae7faf5a8 (HEAD -> master, tag: 2.8.0, origin/master, origin/HEAD)
Author: ...
Date:   Tue Dec 11 14:25:52 2018 +0100

    Another commit message

উত্স / মাস্টার একই প্রতিশ্রুতিবদ্ধ কিনা তা যাচাই করুন:

$ cat .git/packed-refs | grep origin/master
a357df1eb941beb5cac3601153f063dae7faf5a8 refs/remotes/origin/master

আমরা চারপাশে একই হ্যাশ দেখতে পাচ্ছি, এবং শাখাটি কমপক্ষে বর্তমান গিট রেপোতে, দূরবর্তীটির সাথে সামঞ্জস্যপূর্ণ বলে বলা নিরাপদ।



0

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

এটি শেষ হয় যে ফাইলটি .gitignore ফাইলের সাথে একটি প্যাটার্নের সাথে মেলে।


0

এই ক্ষেত্রে গিট অ্যাড ব্যবহার করুন এবং সমস্ত মুলতুবি ফাইলগুলিকে সংহত করুন এবং তারপরে গিট কমিট এবং তারপরে গিট পুশ ব্যবহার করুন

গিট অ্যাড - সমস্ত প্যাডেন্ট ফাইল একীভূত করুন

গিট কমিট - কমিট সংরক্ষণ করুন

গিট পুশ - সংরক্ষণাগারে সংরক্ষণ করুন

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