আমাকে কেন "গিট পুশ - সেট-আপস্ট্রিম উত্স <ব্র্যাঙ্ক>" করতে হবে?


146

সোলারিস এবং সান স্টুডিওতে পরীক্ষা করার জন্য আমি একটি স্থানীয় শাখা তৈরি করেছি। আমি তখন শাখাটি উজানের দিকে ঠেলে দিলাম। পরিবর্তন করার পরে এবং পরিবর্তনগুলি ধাক্কা দেওয়ার চেষ্টা করার পরে:

$ git commit blake2.cpp -m "Add workaround for missing _mm_set_epi64x"
[solaris 7ad22ff] Add workaround for missing _mm_set_epi64x
 1 file changed, 5 insertions(+)
$ git push
fatal: The current branch solaris has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin solaris

আমাকে কেন এই জন্য বিশেষ কিছু করতে হবে?

এমন কোনও যুক্তিসঙ্গত ব্যবহারের কেস রয়েছে যেখানে কেউ তৈরি করবে <branch>, <branch>দূরবর্তী স্থানে চাপ দেবে , এবং তারপরে কোনও প্রতিশ্রুতি দাবি করবে যা তার জন্য করা <branch>উচিত নয় <branch>?


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


ভিন্ন মেশিনে এখানে দেখুন। শাখাটি স্পষ্টভাবে বিদ্যমান, সুতরাং এটি তৈরি এবং ধাক্কা দেওয়া হয়েছিল:

$ git branch -a
  alignas
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/alignas
  remotes/origin/arm-neon
  remotes/origin/det-sig
  remotes/origin/master
  remotes/origin/solaris


2
ধন্যবাদ @ অ্যালেক্সি। দুর্ভাগ্যক্রমে, উদ্ধৃত ডুপটি সেই হাস্যকর ব্যবহারের ক্ষেত্রে ব্যাখ্যা দেয় না যা ডিফল্টরূপে প্রতিনিধিত্ব করা হচ্ছে। (এগুলি বক্তব্যমূলক প্রশ্ন নয়। আমি ইউএক্স ডিজাইনের কারণ সম্পর্কে সত্যই আগ্রহী)।
jww

1
মনে রাখবেন এটি কনফিগারযোগ্য। আপনি যদি তা করেন git config --add push.default currentতবে গিট পুশ প্রয়োজনে স্বয়ংক্রিয়ভাবে দূরবর্তী রেপোতে শাখা তৈরি করবে।
Gogowitsch

উত্তর:


271

টি এল; ডিআর: git branch --set-upstream-to origin/solaris


প্রশ্ন আপনাকে জিজ্ঞাসা যা আমি একটু ভিন্নভাবে প্রকাশ করব যেমন -is "আমি একটি আপস্ট্রিম সেট করতে না" উত্তর: না, আপনি না আছে এ সব একটি আপস্ট্রিম সেট করতে।

আপনার যদি বর্তমান শাখার উপরিভাগ না থাকে তবে গিট এর আচরণ git pushএবং অন্য কমান্ডগুলিতেও তার আচরণ পরিবর্তন করে ।

এখানে সম্পূর্ণ পুশ স্টোরিটি দীর্ঘ এবং বিরক্তিকর এবং ইতিহাসে গিট সংস্করণ 1.5 এর আগে ফিরে যায়। এটি পুরোপুরি সংক্ষিপ্ত করার জন্য, git pushখারাপভাবে প্রয়োগ করা হয়েছিল। 1 গিট সংস্করণ ২.০ হিসাবে, গিতে এখন একটি কনফিগারেশন নোব বানানো রয়েছে push.defaultযা এখন ডিফল্ট simple। ২.০ এর আগে ও পরে গীতের বেশ কয়েকটি সংস্করণের জন্য, প্রতিবার আপনি যখন ছুটেছেন git push, গিট আপনাকে push.defaultকেবল git pushচুপ করে থাকার জন্য সেট করতে রাজি করার প্রচেষ্টার সাথে প্রচুর শব্দ করবে w

আপনি গিটের কোন সংস্করণটি চালাচ্ছেন বা আপনি কনফিগার করেছেন কিনা তা আপনি উল্লেখ করেন না push.default, সুতরাং আমাদের অবশ্যই অনুমান করতে হবে। আমার ধারণা আপনি গিট সংস্করণ 2-পয়েন্ট-কিছু ব্যবহার করছেন এবং এটি বন্ধ হয়ে push.defaultযাওয়ার simpleজন্য আপনি সেট করে রেখেছেন। অবিকল গীত কোন সংস্করণটি আপনি আছে, এবং কিছু আপনি কি যদি push.defaultসেট করা থাকে, না যে দীর্ঘ ও বিরক্তিকর ইতিহাস কারণে ব্যাপার, কিন্তু শেষ পর্যন্ত, আসলে আপনি পেয়ে থাকেন যা এখনও গীত থেকে অন্য আর একটি অভিযোগ ইঙ্গিত করে যে আপনার Git হয় অতীত থেকে একটি ভুল এড়ানোর জন্য কনফিগার করা হয়েছে।

একটি প্রবাহ কি?

একটি প্রবাহটি কেবলমাত্র একটি অন্য শাখার নাম, সাধারণত একটি (নিয়মিত, স্থানীয়) শাখার সাথে সম্পর্কিত একটি দূরবর্তী ট্র্যাকিং শাখা।

প্রতিটি শাখায় একটি (1) প্রবাহ সেট থাকার বিকল্প রয়েছে। অর্থাত, প্রতিটি শাখার হয় একটি উজান থাকে, বা একটি প্রবাহ থাকে না। কোনও শাখায় একাধিক উজান থাকতে পারে না।

প্রবাহটি একটি বৈধ শাখা হওয়া উচিত , তবে তা হওয়া উচিত নয় (দূরবর্তী ট্র্যাকিংয়ের মতো হোক বা স্থানীয় পছন্দ হোক )। এটি হ'ল, যদি বর্তমান শাখা বি এর উজান প্রান্ত U থাকে , কাজ করা উচিত । যদি এটি কাজ না করে - যদি এটি অভিযোগ করে যে ইউটির অস্তিত্ব নেই — তবে বেশিরভাগ গিট কাজ করে যেমন প্রবাহটি একেবারেই সেট করা থাকে না। কয়েকটি কমান্ড, যেমন , প্রবাহের সেটিংটি দেখায় তবে এটিকে "চলে গেছে" হিসাবে চিহ্নিত করবে।origin/Bmastergit rev-parse U git branch -vv

একটি প্রবাহিত ভাল কি?

যদি আপনার push.defaultসেট করা থাকে simpleবা upstream, প্রবাহের সেটিংটি git pushকোনও অতিরিক্ত যুক্তি ছাড়াই ব্যবহৃত হবে , কেবল কাজ করবে।

এটাই — এটাই কেবল এটিই করে git push। তবে এটি মোটামুটি তাৎপর্যপূর্ণ, যেহেতু git pushএকটি সাধারণ টাইপোর ফলে মাথাব্যথার কারণ হয়।

আপনার push.defaultযদি সেট করা থাকে nothing, matchingবা current, একটি স্ট্রিম সেট করা মোটেও কিছুই করে না git push

(এই সবগুলি ধরেই আপনার গিট সংস্করণ কমপক্ষে 2.0 হয় 2.0

উজান প্রভাবিত করে git fetch

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

প্রবাহটি প্রভাবিত করে git mergeএবং git rebaseখুব বেশি

আপনি যদি চালনা করেন git mergeবা git rebaseকোনও অতিরিক্ত যুক্তি ছাড়াই, গিট বর্তমান শাখার উজান ব্যবহার করে। সুতরাং এটি এই দুটি কমান্ডের ব্যবহারকে ছোট করে।

উজান প্রভাবিত করে git pull

আপনার কখনই 2 ব্যবহার করা উচিত নয় git pull, তবে আপনি যদি করেন তবে git pullকোন রিমোটটি আনতে হবে তা নির্ধারণ করতে এবং তার পরে কোন শাখাটি একত্রীকরণ বা পুনরায় চালু করতে হবে সেজন্য প্রবাহের সেটিংটি ব্যবহার করে। অর্থাৎ git pullএকই জিনিস করে git fetch-because এটা আসলে চালায় git fetch -আর তারপর একই জিনিস করে git mergeবা git rebase, কারণ এটি আসলে চালায় git merge অথবা git rebase

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

উজান প্রভাবিত করে git status

এটি আসলে সবচেয়ে গুরুত্বপূর্ণ হতে পারে। আপনার একবার একটি প্রবাহ সেট হয়ে গেলে,git status ক্ষেত্রে আপনার বর্তমান শাখা এবং এর প্রবাহের মধ্যে পার্থক্যটি রিপোর্ট করতে পারেন।

যদি, সাধারণ হিসাবে, আপনি Bতার শাখাটিতে এর প্রবাহ সেট করে রেখেছেন এবং আপনি দৌড়াদৌড়ি করেন , আপনি অবিলম্বে দেখতে পাবেন যে আপনি যে ধাক্কা খেতে পারেন, এবং / অথবা কমিট করে আপনি মার্জ করতে বা পুনর্বাসনা করতে পারবেন কি না।origin/Bgit status

এটি কারণ git statusরান:

  • git rev-list --count @{u}..HEAD: আপনার যে কতগুলি কমিট Bচলছে তা চালু নেই ?origin/B
  • git rev-list --count HEAD..@{u}: আপনার যে কতগুলি কমিট চলছে তা চালু নেই ?origin/BB

একটি স্ট্রিম সেট করা আপনাকে এই সমস্ত জিনিস দেয়।

কিভাবে masterইতিমধ্যে একটি আপ স্ট্রিম সেট আছে?

আপনি যখন কোনও দূরবর্তী থেকে প্রথম ক্লোন করেন, তখন:

$ git clone git://some.host/path/to/repo.git

বা অনুরূপ, গিটের শেষ পদক্ষেপটি মূলত git checkout master,। এটি আপনার স্থানীয় শাখাটি পরীক্ষা করে master— কেবলমাত্র আপনার কাছে কোনও স্থানীয় শাখা নেই master

অন্যদিকে, আপনার কাছে একটি রিমোট ট্র্যাকিং শাখা রয়েছে origin/master, কারণ আপনি কেবল এটি ক্লোন করেছেন।

গিট অনুমান করে বলেছে যে আপনার অবশ্যই বোঝাতে হবে: "আমাকে একটি নতুন স্থানীয় করুন masterযা দূরবর্তী ট্র্যাকিংয়ের মতো একই প্রতিশ্রুতিতে নির্দেশ করে origin/masterএবং আপনি যখন এখান থেকে masterযান তখন আপস্রোমে সেট আপ করুন origin/master" "

আপনার প্রতিটি শাখার ক্ষেত্রে এটি ঘটে git checkoutযা আপনার কাছে ইতিমধ্যে নেই। Git শাখা তৈরি করে এবং এটি "ট্র্যাক" (একটি আপস্ট্রিম যেমন আছে) সংশ্লিষ্ট দূরবর্তী-ট্র্যাকিং শাখা তোলে।

তবে এটি নতুন শাখাগুলির জন্য কাজ করে না , যেমন কোনও রিমোট-ট্র্যাকিং শাখা নেই branches

আপনি যদি একটি নতুন শাখা তৈরি করেন :

$ git checkout -b solaris

এখনও আছে, না origin/solaris। আপনার স্থানীয় দূরবর্তী ট্র্যাকিং শাখা ট্র্যাক solaris করতে পারে নাorigin/solaris কারণ এটি বিদ্যমান নেই।

আপনি যখন প্রথম নতুন শাখাটি চাপবেন:

$ git push origin solaris

এটি তৈরি solaris করে originএবং তাই origin/solarisআপনার নিজস্ব গিট সংগ্রহস্থলেও তৈরি করে । কিন্তু এটা খুব দেরি হয়ে গেছে: আপনি ইতোমধ্যে একটি স্থানীয় আছে solarisযে কোন মূল প্রজেক্টের হয়েছে3

গিটকে কেবল এখনই স্বয়ংক্রিয়ভাবে প্রবাহ হিসাবে সেট করা উচিত নয়?

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

আসল বিষয়টি হ'ল এটি আজ নয়, আপনি যদি ব্যবহার না করেন --set-upstreamবা ব্যবহারের -uসময় না করেন git push। বার্তাটি আপনাকে এটাই বলছে।

আপনাকে এটির মতো করতে হবে না। ঠিক আছে, আমরা উপরে উল্লিখিত হিসাবে, আপনি এটি মোটেও করতে হবে না, তবে যাক আপনি একটি প্রবাহ চান । আপনি ইতিমধ্যে শাখা তৈরি করেছেন solarisউপর originআগের ধাক্কা মাধ্যমে, এবং আপনার যেমন git branchআউটপুট শো, আপনি ইতিমধ্যে আছে origin/solaris আপনার স্থানীয় সংগ্রহস্থলের মধ্যে।

আপনি কেবল এটির জন্য প্রবাহ হিসাবে সেট করেন নি solaris

এটি এখন সেট করতে, প্রথম ধাক্কা দেওয়ার সময় ব্যবহার না করে git branch --set-upstream-to--set-upstream-toসাব-কমান্ড যেমন যেকোনো বিদ্যমান শাখার নাম নেয় origin/solaris, এবং যে অন্যান্য শাখা বর্তমান শাখা এর মূল প্রজেক্টের সেট করে।

এটাই — এগুলিই ঘটে — তবে এটির উপরে উল্লিখিত সমস্ত প্রভাব রয়েছে। এর অর্থ আপনি কেবল দৌড়াতে পারবেন git fetch, তারপরে চারপাশ দেখতে পারবেন , তারপরে দৌড়াতে git mergeবা git rebaseযথাযথ হিসাবে, তারপরে নতুন কমিট করে চালাবেন git push, গুচ্ছ গুচ্ছ অতিরিক্ত কিছু না করে।


1 ন্যায়সঙ্গতভাবে, এটি প্রাথমিক বাস্তবায়নটি ত্রুটি-প্রবণ ছিল তা তখন পরিষ্কার ছিল না। এটি তখনই স্পষ্ট হয়ে উঠল যখন প্রতিটি নতুন ব্যবহারকারী প্রতিবার একই ভুল করে। এটি এখন "কম দরিদ্র", যা "দুর্দান্ত" বলার অপেক্ষা রাখে না।

2 "কখনই" কিছুটা শক্তিশালী না, তবে আমি দেখতে পেলাম যে আমি যখন পদক্ষেপগুলি আলাদা করি, বিশেষত যখন আমি git fetchআসলে তাদের কী প্রদর্শন করতে পারি এবং তখন তারা কী করবে git mergeবা কী git rebaseকরবে তা তারা দেখতে পাবে গিট নবাবিরা বিষয়টি আরও অনেক ভাল বোঝে ।

3 আপনি যদি প্রথমটিকে —ie git pushহিসাবে চালান git push -u origin solaris, আপনি -uপতাকা যুক্ত করলে — গিটটি origin/solarisআপনার বর্তমান শাখার জন্য প্রবাহ হিসাবে সেট হবে যদি (এবং কেবলমাত্র) ধাক্কা সফল হয়। সুতরাং আপনি প্রথম ধাক্কা সরবরাহ -uকরা উচিত । প্রকৃতপক্ষে, আপনি এটি পরবর্তী কোনও ধাক্কায় সরবরাহ করতে পারেন এবং এটি সেই প্রান্তে প্রবাহটি সেট বা পরিবর্তন করবে। তবে আমি মনে করি সহজ, যদি আপনি ভুলে যান।git branch --set-upstream-to

4 যাইহোক, কেবল "এক মিলিল-ইউএন" বলার অস্টিন শক্তি / ডাঃ এভিল পদ্ধতি দ্বারা পরিমাপ করা।


2
যদি সাধারণ ক্ষেত্রে branch শাখা / পুশ শাখা / ব্যবহার শাখা তৈরি করা} হয়, তবে কোনও নতুন স্থানীয় শাখাকে কোনও রিমোট গিট সংগ্রহস্থলে পুশ করার চেষ্টা করা উচিত নয় এবং এটিও ট্র্যাক করা উচিত যা আসলে কাজ করে না? এবং যদি কেউ {শাখা তৈরি / পুশ শাখা / শাখা ব্যবহার না করে wants চান, তবে তাদের মতো বিশেষ কিছু করা উচিত নয় --set-upstream /dev/null? বোঝাটি সাধারণ ক্ষেত্রে কেন চাপানো হয়? এই প্রকৌশল এবং ব্যবহারের সিদ্ধান্তগুলি আমি সত্যিই বুঝতে পারি না।
jww

1
@ ভনসি: ঠিক আছে, এটিই মূল বিষয় git push -u, তবে এটি এখনও সত্যিই মনে হচ্ছে git push -uডিফল্ট হওয়া উচিত, বা কমপক্ষে ডিফল্ট হওয়া উচিত যদি এখনও কোনও প্রবাহ নেই , এবং সেখানে একটি প্রবাহ থাকতে হবে git push --no-set-upstreamযখন বর্তমানে কোনও প্রবাহ নেই এবং আপনি রাখতে চান এটি সেভাবে (যাই হোক না কেন বোধগম্য কারণে :-))।
টেরিক

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

4
@ টোরেক - আপনাকে ধন্যবাদ আপনার উত্তর অন্যথায় চমত্কার ছিল; সুচিন্তিত, সুগঠিত এবং অত্যন্ত তথ্যবহুল। :-)
স্টিভেন বয়েস

6
মনে রাখবেন এটি কনফিগারযোগ্য। আপনি যদি তা করেন git config --add push.default currentতবে গিট পুশ প্রয়োজনে স্বয়ংক্রিয়ভাবে দূরবর্তী রেপোতে শাখা তৈরি করবে।
Gogowitsch

31


git push origin <branch>
এবং এর মধ্যে পার্থক্য
git push --set-upstream origin <branch>
হ'ল তারা উভয় দূরবর্তী সংগ্রহস্থলের জন্য ঠিক জোর করে চাপ দেয় তবে আপনি যখন টানেন তখন আপনি এই পার্থক্যটি লক্ষ্য করেছেন।

আপনি যদি করেন:
git push origin <branch>
টান দেওয়ার সময়, আপনাকে যা করতে হবে:
git pull origin <branch>

তবে আপনি যদি করেন:
git push --set-upstream origin <branch>
তবে, টান দেওয়ার সময়, আপনাকে কেবল এটি করতে হবে:
git pull

সুতরাং আপনি যুক্ত --set-upstreamপ্রতিটি সময় থেকে আপনি যে শাখাটি টানতে চান তা নির্দিষ্ট না করার জন্য অনুমতিগুলিতে যুক্ত করার অনুমতি দেয় git pull


"গিট পুশ" এর দুটি সংস্করণের মধ্যে পার্থক্য যা আমি কেন জানি / সেগুলি ব্যবহার করতে চাই তা জানি না। অর্থহীন!
ফ্রাঙ্ক পাক

17

মূলত পুরো কমান্ডটি হ'ল git push <remote> <local_ref>:<remote_ref>। আপনি যদি ঠিক চালান git push, গিটটি ঠিক কী করতে হবে তা না জেনে আপনি যদি এমন কোনও কনফিগার তৈরি না করে যা গিটকে সিদ্ধান্ত নিতে সহায়তা করে। গিট রেপোতে, আমরা একাধিক রিমোট সেটআপ করতে পারি। এছাড়াও আমরা কোনও স্থানীয় রেফাকে যেকোন দূরবর্তী রেফারে চাপ দিতে পারি। পুরো কমান্ডটি একটি ধাক্কা দেওয়ার সবচেয়ে সহজ উপায়। আপনি যদি কম শব্দ টাইপ করতে চান তবে আপনাকে প্রথমে কনফিগার করতে হবে - যেমন --set-upstream।

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