'গিট পুল অরিজিন মাইব্র্যাঞ্চ' স্থানীয় মাইব্র্যাচ এন উত্সের আগে কমিট করে। কেন?


92

আমি সবেমাত্র অদ্ভুত কিছু পর্যবেক্ষণ করেছি git pull, যা আমি বুঝতে পারি না।

শুক্রবার, আমি একটি স্থানীয় শাখায় কাজ করেছি। আসুন এটি কল mybranch। অফিস ছেড়ে যাওয়ার আগে আমি এটা উৎপত্তি পর্যন্ত পিছিয়ে দেয় (যা আমার GitHub রেপো হয়): git push origin mybranch

গতকাল বাড়িতে, আমি pullআমার ল্যাপটপে মাইব্র্যাঞ্চ এড করেছি, আরও কিছু কোডিং করেছি এবং তারপরে আমার পরিবর্তনগুলি গিথুব (উত্স) এর দিকে ফিরিয়ে দিয়েছি।

এখন আমি আবার কাজে আছি, এবং গতকাল থেকে আমার কাজের মেশিনে পরিবর্তনগুলি টানতে চেষ্টা করেছি (সপ্তাহের শেষের দিকে আমি আমার কাজের জায়গার স্থানীয় রেপোতে কোনও পরিবর্তন করি নি):

git pull origin mybranch

এটি দ্রুত ফরোয়ার্ড একীভূত করেছিল, যা ভাল। আমি তখন একটি করেছি git statusএবং এটি বলেছে:

# On branch mybranch
# Your branch is ahead of 'origin/mybranch' by 6 commits.
#
nothing to commit (working directory clean)

হাহ? যখন আমি সাপ্তাহিক ছুটির সময়েও এটি স্পর্শ করি নি, এবং কেবলমাত্র উত্স থেকে টানছি তখন এটি কীভাবে 6 টি প্রতিশ্রুতি পেতে পারে? সুতরাং আমি একটি দৌড়েছি git diff origin/mybranchএবং ভিন্নতাগুলি ঠিক আমি রিমোট থেকে টানা 6 টি পরিবর্তন ছিল।

আমি কেবল এটি চালিয়ে "ঠিক" করতে পারলাম git fetch origin:

From git@github.com:me/project
af8be00..88b0738  mybranch -> origin/mybranch

স্পষ্টতই, আমার স্থানীয় রেপোতে কিছু রেফারেন্স অবজেক্টগুলি অনুপস্থিত ছিল, তবে কীভাবে তা হতে পারে? আমি বলতে চাইছি, একটি টান ইতিমধ্যে আনতে পেরেছিল এবং আমি সেই শাখা ব্যতীত কোনও কিছুর উপরে কাজ করি নি, সুতরাং ক git fetch originএবং git fetch origin mybranchএকই ফলাফল হওয়া উচিত?

আমি সবসময় git pull originপরিবর্তে ব্যবহার করা উচিত git pull origin branchname?

আমি বিভ্রান্ত


আমি এটাও লক্ষ্য করেছি; একটি git pushএটি সমাধানের জন্য (প্রতিবেদন "সব আপ টু ডেট") বলে মনে হবে।
বেন জেমস

4
git config --get-regexp br.*আপনার কনফিগারেশনের
এএএ

4
আপনি কি git config branch.master.remote yourGitHubRepo.gitনিজের ওয়ার্কে টাইপ করতে git pull originপারেন এবং স্থিতিটি 'সামনের' সতর্কতা অবলম্বন করে থাকলে (পরের দিকে ) পরীক্ষা করতে পারেন?
ভনসি

এটি সেট করা হয়নি (খালি আউটপুট)। তবে git remote show originআমাকে দেখায় যে উত্সটি আমার গিটহাবের সংগ্রহস্থলের দিকে নির্দেশ করে, তাই আমার অনুমান করা কি ঠিক হবে?
ম্যাথিয়াস

4
গিট রিমোট একা (গিটহাব রেপোর জন্য সঠিক ঠিকানা দেখাচ্ছে) যথেষ্ট নয় । একটি "থাকার এড়াতে Your branch is ahead" একটি পর সতর্কতামূলক বার্তা git pull, আপনাকে প্রথমে প্রয়োজন এছাড়াও একটি শাখা জন্য দূরবর্তী নাম সংজ্ঞায়িত । সুতরাং আমার পরামর্শ: টাইপ করুন git config branch.master.remote yourGitHubRepo.git, তারপরে a git pullএবং a চেষ্টা করে git statusদেখুন এবং সমস্যাটি রয়ে গেছে কিনা।
ভোনসি

উত্তর:


115

git pullgit fetchস্পষ্টতভাবে আনীত মাথাগুলি (বা যদি একীকরণের জন্য দূরবর্তী শাখা না হয়) বর্তমান শাখায় মার্জ করার আগে উপযুক্ত পরামিতিগুলির সাথে কল করে।

বাক্য গঠন: git fetch <repository> <ref>যেখানে <ref>কোনও কোলন সহ কেবল একটি শাখার নাম হ'ল 'এক শট' আনা যা নির্দিষ্ট দূরবর্তী সমস্ত ট্র্যাক করা শাখার একটি স্ট্যান্ডার্ড আনতে পারে না বরং পরিবর্তে কেবল নামকরণ করা শাখাটি এনে দেয় FETCH_HEAD

আপডেট: 1.8.4 সাল থেকে গিট সংস্করণগুলির জন্য, যদি এমন কোনও দূরবর্তী ট্র্যাকিং শাখা থাকে যা আপনি যে রেফটি আনতে বলেছিলেন তা ট্র্যাক করে তবে ট্র্যাকিং শাখাটি এখন আপডেট হবে fetch। পূর্ববর্তী আচরণ যে বিভ্রান্তি সৃষ্টি করেছিল তা এড়াতে এই পরিবর্তনটি বিশেষভাবে করা হয়েছে।

আপনি যখন সঞ্চালন করবেন git pull <repository> <ref>, FETCH_HEADউপরের মত আপডেট করা হবে, তারপরে আপনার চেক HEADআউটতে একীভূত হবে তবে দূরবর্তী সংগ্রহস্থলের মানক ট্র্যাকিং শাখাগুলির কোনওটিই আপডেট হবে না (গিট <1.8.4)। এর অর্থ স্থানীয়ভাবে দেখে মনে হচ্ছে আপনি দূরবর্তী শাখার চেয়ে এগিয়ে আছেন, যদিও বাস্তবে আপনি এটির সাথে আধুনিকীকরণ করছেন।

ব্যক্তিগতভাবে আমি সবসময় কি git fetchদ্বারা অনুসরণ git merge <remote>/<branch>কারণ আমি বাধ্য আপডেট সম্পর্কে কোনো টুইট দেখতে আগে আমি একত্রীকরণ পেতে, এবং আমি যা আমি মার্জ করছি পূর্বরূপ দেখতে পারেন। যদি আমি ব্যবহার git pullএকটি বিট আরো চেয়ে আমি কি, আমি একজন স্পষ্ট করতে হবে git pullকোন প্যারামিটার সঙ্গে সবচেয়ে সময়ের উপর নির্ভর করে branch.<branch>.remoteএবং branch.<branch>.merge'সঠিক কাজটি করতে'।


4
+1 এটি সত্যিই একটি ভাল ব্যাখ্যা! আমি জানতাম যে ব্যাখ্যাটি 'গিট হেল্প আনার' ভিতরে কোথাও লুকিয়ে রয়েছে তবে তা বের করতে পারেনি ...
স্টেফান নিউ

4
+1 গুড পোস্ট, অনুরূপ একটি পন্থা সঙ্গে gitster.livejournal.com/28309.html
VonC

4
সুতরাং would একটি git fetchপরে git pull <repository> <ref>ফিক্স যেহেতু বিষয়টি মান ট্র্যাকিং শাখা আপডেট হবে আনা? এছাড়াও, এই উত্তরটির জন্য ধন্যবাদ, ধারণাটি শুরু করে :)
বার্ট জেদ্রোচা

4
আমিও এই ইস্যুতে দৌড়েছি এবং আপনার git fetchঅনুসরণ করা দরকার git merge origin/master master
ব্যবহারকারী 1027169

3

git remote -v showএটি উত্স এ আসে কি ফিরে আসে?

যদি উত্সটি গিথুবকে নির্দেশ করে তবে স্ট্যাটাসটি আপ টু ডেট হওয়া উচিত এবং কোনও দূরবর্তী রেপোর চেয়ে এগিয়ে নয়। কমপক্ষে, গিট 1.6.5 দিয়ে আমি দ্রুত পরীক্ষার জন্য ব্যবহার করছি।

যাইহোক, এড়াতে, মাস্টার ব্রাঞ্চের দূরবর্তী রেপো স্পষ্টভাবে সংজ্ঞায়িত করুন:

$ git config branch.master.remote yourGitHubRepo.git

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


আমি এটি git1.6.5 দিয়ে পরীক্ষা করতে পারি:

প্রথমে আমি একটি ওয়ার্কেরপো তৈরি করি:

PS D:\git\tests> cd pullahead
PS D:\git\tests\pullahead> git init workrepo
Initialized empty Git repository in D:/git/tests/pullahead/workrepo/.git/
PS D:\git\tests\pullahead> cd workrepo
PS D:\git\tests\pullahead\workrepo> echo firstContent > afile.txt
PS D:\git\tests\pullahead\workrepo> git add -A 
PS D:\git\tests\pullahead\workrepo> git commit -m "first commit"

আমি একটি খালি রেপো তৈরি করে একটি গিটহাব রেপো অনুকরণ করি (যে কোনও জায়গা থেকে ধাক্কা পেতে পারে)

PS D:\git\tests\pullahead\workrepo> cd ..
PS D:\git\tests\pullahead> git clone --bare workrepo github

আমি আমার ওয়ার্কিং রেপোতে একটি মোডিফ যুক্ত করি, আমি গিথুব রেপোতে চাপ দিই (দূরবর্তী হিসাবে যুক্ত)

PS D:\git\tests\pullahead> cd workrepo
PS D:\git\tests\pullahead\workrepo> echo aModif >> afile.txt
PS D:\git\tests\pullahead\workrepo> git ci -a -m "a modif to send to github"
PS D:\git\tests\pullahead\workrepo> git remote add github d:/git/tests/pullahead/github
PS D:\git\tests\pullahead\workrepo> git push github

আমি একটি হোম রেপো তৈরি করেছি, গিটহাবের ক্লোন করেছি, যেখানে আমি গিটহাবের দিকে ধাক্কা দিয়ে বেশ কয়েকটি পরিবর্তন করেছি:

PS D:\git\tests\pullahead\workrepo> cd ..
PS D:\git\tests\pullahead> git clone github homerepo
PS D:\git\tests\pullahead> cd homerepo
PS D:\git\tests\pullahead\homerepo> type afile.txt
firstContent
aModif

PS D:\git\tests\pullahead\homerepo> echo aHomeModif1  >> afile.txt
PS D:\git\tests\pullahead\homerepo> git ci -a -m "a first home modif"
PS D:\git\tests\pullahead\homerepo> echo aHomeModif2  >> afile.txt
PS D:\git\tests\pullahead\homerepo> git ci -a -m "a second home modif"
PS D:\git\tests\pullahead\homerepo> git push github

আমি তখন প্রথম পরীক্ষার জন্য ওয়ার্কেরপো ক্লোন করেছি

PS D:\git\tests\pullahead\workrepo4> cd ..
PS D:\git\tests\pullahead> git clone workrepo workrepo2
Initialized empty Git repository in D:/git/tests/pullahead/workrepo2/.git/
PS D:\git\tests\pullahead> cd workrepo2
PS D:\git\tests\pullahead\workrepo2> git remote add github d:/git/tests/pullahead/github
PS D:\git\tests\pullahead\workrepo2> git pull github master
remote: Counting objects: 8, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 6 (delta 1), reused 0 (delta 0)
Unpacking objects: 100% (6/6), done.
From d:/git/tests/pullahead/github
 * branch            master     -> FETCH_HEAD
Updating c2763f2..75ad279
Fast forward
 afile.txt |  Bin 46 -> 98 bytes
 1 files changed, 0 insertions(+), 0 deletions(-)

সেই রেপোতে গিট স্ট্যাটাসে ' origin' এর আগে মাস্টার জিইংয়ের কথা বলা হয়েছে:

PS D:\git\tests\pullahead\workrepo5> git status
# On branch master
# Your branch is ahead of 'origin/master' by 2 commits.
#
nothing to commit (working directory clean)

তবে এটি কেবল originগিথুব নয়:

PS D:\git\tests\pullahead\workrepo2> git remote -v show
github  d:/git/tests/pullahead/github (fetch)
github  d:/git/tests/pullahead/github (push)
origin  D:/git/tests/pullahead/workrepo (fetch)
origin  D:/git/tests/pullahead/workrepo (push)

তবে আমি যদি কোনও রেপোতে ক্রমটির পুনরাবৃত্তি করি যার গিথুব (যার অর্থ কোনও উত্স নয়, কেবল একটি দূরবর্তী 'গিথুব' সংজ্ঞায়িত) থাকে তবে অবস্থান পরিষ্কার:

PS D:\git\tests\pullahead\workrepo2> cd ..
PS D:\git\tests\pullahead> git clone workrepo workrepo4
PS D:\git\tests\pullahead> cd workrepo4
PS D:\git\tests\pullahead\workrepo4> git remote rm origin
PS D:\git\tests\pullahead\workrepo4> git remote add github d:/git/tests/pullahead/github
PS D:\git\tests\pullahead\workrepo4> git pull github master
remote: Counting objects: 8, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 6 (delta 1), reused 0 (delta 0)
Unpacking objects: 100% (6/6), done.
From d:/git/tests/pullahead/github
 * branch            master     -> FETCH_HEAD
Updating c2763f2..75ad279
Fast forward
 afile.txt |  Bin 46 -> 98 bytes
 1 files changed, 0 insertions(+), 0 deletions(-)
PS D:\git\tests\pullahead\workrepo4> git status
# On branch master
nothing to commit (working directory clean)

যদি আমি শুধুমাত্র ছিল originউপর প্রতি নির্দেশ github, statusgit1.6.5 জন্য পরিষ্কার হবে।
এটি পূর্ববর্তী গিটের জন্য 'সামনের' সতর্কতার সাথে থাকতে পারে তবে যাইহোক, একটি git config branch.master.remote yourGitHubRepo.gitসংজ্ঞায়িতভাবে স্পষ্টভাবে গিটের প্রাথমিক সংস্করণগুলির সাথেও এটি যত্ন নিতে সক্ষম হওয়া উচিত।


এটি দেখার জন্য সময় দেওয়ার জন্য ধন্যবাদ। রিমোট রিমোটটি ইতিমধ্যে আমার গিটহাব রেপোকে নির্দেশ করেছে। আমি গিটিহাব ইউআরএল থেকে প্রকল্পটি ক্লোন করেছি এবং আমার স্থানীয় মাস্টার শাখাটি উত্স / মাস্টার ট্র্যাক করছে। মাইব্র্যাঞ্চ হিসাবে, আমি নিশ্চিত যে আমি এটিকে উত্স / মাইব্র্যাঞ্চ শাখা থেকে তৈরি করেছি, যা এটি স্বয়ংক্রিয়ভাবে ট্র্যাক করা উচিত। কিন্তু তবুও কি এই সমস্যা হতে পারে? যে স্থানীয় মাইক্রাঙ্কটি আসলে উত্স / মাইব্রাঞ্চ ট্র্যাক করে না? PS: আমি গিট 1.6.1 ব্যবহার করছি (ম্যাকপোর্টের মাধ্যমে)।
ম্যাথিয়াস

একটি গিট কমান্ড আছে যা আমাকে দেখতে দিন একটি স্থানীয় শাখা অন্য একটি শাখা ট্র্যাক করছে? ম্যান পেজে আমি এটি খুঁজে পাচ্ছি না।
ম্যাথিয়াস

আপনি দেখতে পাচ্ছেন কোন দূরবর্তী শাখাগুলি ট্র্যাক করা হয়েছে git remote show origin
টেড পার্সিভাল

2

আপনি কী ব্যবহার করে আপনার সমস্ত রিমোট ( originআপনার আসল ক্লোনটি নিয়ে আসে) বাদ দিয়ে সাবধান git remote add NAME URL? গিগ কনফিগারেশনে যখন এগুলি যুক্ত করা হয়েছে তখন আমি এই বাগটি দেখেছি।


রেপো ক্লোন করার সময় আমি এটি করেছি। তবে আমি প্রতিটি শাখা দিয়ে এটি করিনি didn't যেমন মাইব্র্যাঞ্চ আমি প্রথমে উত্স থেকে আনব, তারপরে git checkout -b mybranch origin/mybranch। গিট-ব্রাঞ্চের ম্যান পেজ অনুসারে, উৎপত্তি / মাইব্র্যাঞ্চ হ'ল সূচনা পয়েন্ট এবং তদতিরিক্ত, এটি ট্র্যাকের জন্যও বলেছে: "... আপনি যদি সর্বদা একই উজানের শাখা থেকে নতুন শাখায় টানেন তবে এটি ব্যবহার করুন এবং যদি আপনি স্পষ্টভাবে "গিট পুল <repository> <refspec>" ব্যবহার করতে না চান তবে শুরুর পয়েন্টটি যখন দূরবর্তী শাখা হয় তখন এই আচরণটি ডিফল্ট হয়। "
ম্যাথিয়াস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.