আমাকে কেন একটি নতুন শাখা স্পষ্টভাবে ধাক্কা দেওয়া দরকার?


180

আমি নতুন gitএবং আমি অনুশীলন করছি। আমি একটি স্থানীয় শাখা তৈরি করেছি কিন্তু আমি দেখেছি যখন git pushআমার শাখাটি সংগ্রহস্থলে আপলোড করা হয়নি । আমি আসলে কি ছিল: git push -u origin --all
কেন? কোনও শাখাটি কি ডিফল্টরূপে ধাক্কা দেওয়ার জন্য একটি নতুন পরিবর্তন নয়? আমার দ্বিতীয় কমান্ড চালানোর দরকার নেই কেন?


15
নোট করুন যে এটি কনফিগারযোগ্য (সেটিং push.default, দেখুন man git-config)। আপনি যদি তা করেন git config --add push.default currentতবে প্রয়োজনে git pushস্বয়ংক্রিয়ভাবে দূরবর্তী রেপোতে শাখা তৈরি করবে। কেন এটি ডিফল্ট নয় তা উত্তরে ব্যাখ্যা করা হয়েছে।
স্লেসকে

@ স্লেসকে আমি সম্মত অন্যান্য নীতিগুলি ' current' এবং ' upstream' এর জন্য আমার পুরানো উত্তর দেখুন stackoverflow.com/a/13751847/6309
ভনসি

কেন একটি উত্তর গ্রহণ করবেন না?
laike9 মি

উত্তর:


224

আসল কারণটি হ'ল, একটি নতুন রেপোতে (গিট ইন), কোনও শাখা নেই (না master, কোনও শাখা নেই, শূন্য শাখা)

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

এবং:

উভয় ক্ষেত্রেই যেহেতু উজানের খালি রেপোর কোনও শাখা নেই:

  • নামকরণ করা শাখা এখনও নেই
  • মোটামুটি কোনও উজানের শাখা নেই (একই নামের সাথে বা ছাড়া! ট্র্যাকিং বা না)

এর অর্থ আপনার স্থানীয় প্রথম ধাকের কোনও ধারণা নেই:

  • যেখানে ধাক্কা
  • কী ধাক্কা দেবে (যেহেতু এটি কোনও প্রবাহ শাখাটি দূরবর্তী ট্র্যাকিং শাখা হিসাবে রেকর্ড করা এবং / বা একই নামটি পাচ্ছে না)

সুতরাং আপনার কমপক্ষে একটি করতে হবে:

git push origin master

তবে আপনি যদি কেবল এটি করেন তবে আপনি:

  • প্রবাহে একটি প্রবাহ masterশাখা তৈরি করবে (এখন খালি খালি রেপো): ভাল।
  • স্থানীয় শাখা ' ' উজান ( ) ' ' (আপস্ট्रीम শাখা) এ ধাক্কা দেওয়া দরকার: রেকর্ড করবে না badmasteroriginmaster

এজন্যই প্রথম ধাক্কা দেওয়ার জন্য এটি করার পরামর্শ দেওয়া হচ্ছে:

git push -u origin master

যে রেকর্ড করব origin/masterহিসেবে দূরবর্তী ট্র্যাকিং শাখা , এবং স্বয়ংক্রিয়ভাবে ধাক্কা পরবর্তী ধাক্কা সক্ষম করবে masterকরার origin/master

git checkout master
git push

এবং এটি পুশ নীতি ' current' বা ' upstream' নিয়েও কাজ করবে ।
প্রতিটি ক্ষেত্রে, প্রাথমিকের পরে git push -u origin master, ডান উজানের শাখায় মাস্টারকে ঠেলাঠেলি চালিয়ে যাওয়ার জন্য একটি সাধারণ গিট পুশ যথেষ্ট be


2
এই বিন্দু পরে, পরবর্তী git pushএছাড়াও শাখা ইতিমধ্যে বিদ্যমান প্রত্যাশা?
ক্র্যাটিলাস

2
হ্যাঁ. এটি ব্রাঞ্চের যে কোনও আপডেটগুলিকে আপ স্ট্রিমের সংগ্রহস্থলগুলিতে চাপ দেবে।
রাইপেক

@ ক্র্যাটিলাস হ্যাঁ, কারণ নতুন ডিফল্ট পুশ নীতি ' simple': যে কোনও রেকর্ডড আপ স্ট্রিম শাখায় চাপ দিন, যদি সেই উজানের শাখার স্থানীয় নাম একই থাকে। একটি সরল git pushযথেষ্ট হবে।
ভনসি

1
@ বাটলবাটকাস আপনাকে ধন্যবাদ আমি লিঙ্কটি পুনরুদ্ধার করেছি।
ভনসি

3
প্রশ্নকারীর একটি নতুন শাখা 'নতুন_ ব্রাঞ্চ' এর আরও সাধারণ ক্ষেত্রে, আপনি git push --set-upstream origin new_branchবা git push -u origin new_branchসংক্ষেপে ব্যবহার করতে পারেন । -allযে প্রশ্নকারী সব শাখা অন্তর্ভুক্ত করে একটি নির্দিষ্ট নতুন শাখা নামকরণ বাইপাস ব্যবহৃত। এটি তার উত্তরে ক্লাস মেলবোর্ন দ্বারা আচ্ছাদিত।
পল মাস্রি-স্টোন

106

আপনি না, নীচে দেখুন

আমি এই 'বৈশিষ্ট্যটি' বরং বিরক্তিকর বলে মনে করি যেহেতু আমি চাঁদে রকেট চালানোর চেষ্টা করছি না, কেবল আমার অভিহিত শাখাটি ধাক্কা। আপনি সম্ভবত খুব করেন বা অন্যথায় আপনি এখানে না!

এখানে ফিক্সটি দেওয়া হচ্ছে: আপনি যদি চান যে এটি শাখাটি মূলত বিদ্যমান এই শাখার পক্ষে নির্বিশেষে চাপ দিতে চায় তবে এই শাখাটি কেবলমাত্র এই কমান্ডটি একবার জারি করে এবং আপনাকে আর কোথাও আর করতে হবে না :

git config --global push.default current

সুতরাং আপনি যদি এর মতো শাখা তৈরি করেন:

git checkout -b my-new-branch

এবং তারপরে কিছু কমিট করুন এবং তারপরে একটি করুন

git push -u

এগুলিকে উত্সাহিত করতে (সেই শাখায় থাকা) এবং এটি উপস্থিত না থাকলে এটি আপনার জন্য বলা শাখা তৈরি করবে।

নোট-বিটটি নিশ্চিত করে তোলে যে আপনি পরে যুক্ত শাখা থেকে টানতে চাইলে সেগুলি সংযুক্ত রয়েছে। আপনার যদি পরে ব্রাঞ্চটি টানানোর কোনও পরিকল্পনা নেই (বা যদি আপনি করেন তবে অন্য একটি লাইনারের সাথে ঠিক আছে) -উ প্রয়োজন হয় না।


3
যখন আমি এটি করি, আমি যদি গিট টান করি, ততক্ষনে - দুটি শাখা লিঙ্কযুক্ত নয়। :(
এলিসো

এটিই হ'ল একমাত্র উত্তর যা আমার সমস্যাটিকে স্থির করেছে।
রেমন্ড চেনন

2
তাদের লিঙ্ক করতে, ব্যবহার করুনgit push -u
বেন ক্র্যাসি

ধন্যবাদ! এই উত্তরটি দ্রুত এবং 'ডার্টি' সমাধান হিসাবে গ্রহণ করা উচিত। আমি নিশ্চিত যে এটি ওপির অভিপ্রায়গুলির নিকটতম।
অল্প বয়স্ক

3
> আমি চাঁদে রকেট চালানোর চেষ্টা করছি না। -- হ্যাঁ.
ভিসাভালো

39

git pushএকটি নতুন শাখা ঠেলা যখন আউটপুট

> git checkout -b new_branch
Switched to a new branch 'new_branch'
> git push
fatal: The current branch new_branch has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin new_branch

একটি সাধারণ git pushঅনুমান করে যে ইতিমধ্যে একটি দূরবর্তী শাখা বিদ্যমান রয়েছে যা বর্তমান স্থানীয় শাখা ট্র্যাক করছে। যদি এমন কোনও দূরবর্তী শাখা উপস্থিত না থাকে এবং আপনি এটি তৈরি করতে চান তবে আপনাকে অবশ্যই তা -u(সংক্ষিপ্ত রূপ --set-upstream) পতাকা ব্যবহার করে নির্দিষ্ট করতে হবে ।

কেন এমন হয়? আমার ধারণা, বাস্তবায়নকারীরা অনুভব করেছিলেন যে রিমোটে একটি শাখা তৈরি করা এত বড় পদক্ষেপ যা ভুল করে এটি করা শক্ত হওয়া উচিত। git pushএমন কিছু যা আপনি সব সময় করেন।

"কোনও শাখাটি কি ডিফল্টরূপে ধাক্কা দেওয়ার জন্য একটি নতুন পরিবর্তন নয়?" আমি বলব যে গিতে "একটি পরিবর্তন" প্রতিশ্রুতিবদ্ধ। একটি শাখা অঙ্গীকারের নির্দেশক is আমার কাছে এটি একটি ধাক্কা এমন কিছু হিসাবে মনে হয় যা অন্য স্টোরগুলির মধ্যে চাপ দেয়। কোনটি ধাক্কা দেয় তা নির্ধারণ করা হয় আপনি কোন শাখায় আছেন এবং সেই শাখার ট্র্যাকিং সম্পর্কটি রিমোটের শাখাগুলির সাথে।

প্রো গিট বইয়ের রিমোট শাখা অধ্যায়টিতে আপনি শাখাগুলি ট্র্যাকিং সম্পর্কে আরও পড়তে পারেন ।


আমি একটি পাইনি fatalতবে আমি ইতিমধ্যে শাখায় একটি প্রতিশ্রুতিবদ্ধ হয়েছি this এই বিষয়টি কি?
ক্র্যাটিলাস

@ ক্র্যাটিলাস কোনও বিষয় নয়। প্রতিশ্রুতিটি আপনার ভাণ্ডারগুলিতে নিরাপদ এবং git push -u originএটিকে অনুলিপি করা হয়েছে ory
ক্লাস মেলবোর্ন

না, আমি fatalএই অর্থটি বোঝাতে চাইছি যে আপনি উত্তরটিতে উল্লেখ করেছেন তার মতো একটি চিত্র আমি পেলাম না this এই পার্থক্যটি কি আমি শাখায় কিছু প্রতিশ্রুতিবদ্ধ এই সত্যের উপর নির্ভর করে?
ক্র্যাটিলাস

@ ক্র্যাটিলাস আপনি জানেন না কেন আপনি fatalবার্তাটি পেলেন না । আমি অনুমান করব যে পার্থক্যটি আপনি কী গিট প্রয়োগ করছেন ঠিক তার উপর নির্ভর করে। আমার আউটপুটটি 1.8.1.msysgit.1 থেকে উইন্ডোজ 8 এ চলছে
ক্লাস মেলবর্ন

আমার একই সংস্করণ আছে তবে ভিস্টায়
ক্র্যাটিলাস

4

আমি এটির মূল বিকাশকারীদের দ্বারা দ্রুত কোনও যুক্তি খুঁজে পাইনি, তবে কয়েক বছরের গিটের অভিজ্ঞতার ভিত্তিতে আমি আপনাকে একটি শিক্ষিত অনুমান দিতে পারি।

না, প্রতিটি শাখা এমন কিছু নয় যা আপনি বাইরের বিশ্বে ধাক্কা দিতে চান। এটি কোনও ব্যক্তিগত পরীক্ষার প্রতিনিধিত্ব করতে পারে।

তদুপরি, কোথায় git pushসব শাখা পাঠাতে হবে? গিট একাধিক রিমোটের সাথে কাজ করতে পারে এবং আপনি প্রতিটি শাখায় বিভিন্ন সেট রাখতে চাইতে পারেন। যেমন একটি কেন্দ্রীয় প্রকল্প গিটহাব রেপোতে রিলিজ শাখা থাকতে পারে; একটি গিটহাব কাঁটাচামচ পর্যালোচনার জন্য বিষয় শাখা থাকতে পারে; এবং স্থানীয় গিট সার্ভারে স্থানীয় কনফিগারেশনযুক্ত শাখা থাকতে পারে। যদি git pushবর্তমান শাখাটি ট্র্যাক করে এমন সমস্ত শাখাকে দূরবর্তী স্থানে ঠেলে দেয়, তবে এই জাতীয় স্কিমটি সহজেই স্ক্রু আপ করা সহজ।


1) It might represent a private experiment.ওক কিন্তু বড় ব্যাপারটি কী? "মূল" শাখা যে প্রত্যেকে কাজ করছে masterতা প্রভাবিত হয় না। যদি না আপনি উত্স কোডটি গোপন রাখতে চান 2) git push, without a remote, pushes to the current branch's remoteআমি আপনাকে এখানে হারিয়েছি :(
ক্রেটিলাস

@ ক্র্যাটিলাস: ১) এমন কয়েকজন বিকাশকারীকে নিয়ে একটি প্রকল্পে যা সমস্ত শাখায় বিজ্ঞাপন দেয়, আপনি খুব অগোছালো রেপো পাবেন। আমি এই জাতীয় প্রকল্পগুলিতে কাজ করি এবং আমি git fetchপ্রতিবার শত শত অর্ধ-কর্মক্ষম শাখায় চাই না । 2) আমি git pushএর ডিফল্ট আচরণের কথা উল্লেখ করছি । এটি রিমোটে ধাক্কা দেয় যে বর্তমান শাখা ট্র্যাক করছে, যদি থাকে তবে।
ফ্রেড ফু

3

হেড বর্তমান শাখার জন্য সংক্ষিপ্ত, সুতরাং গিট পুশ-ইউ উত্স হেড কাজ করে। এখন এই টাইপটি এড়াতে প্রতিবার আমি ওরফে ব্যবহার করি:

গিট কনফিগার - গ্লোবাল ওরফে.পি 'পুশ-ইউ উত্স'

এর পরে, প্রতিবারই আমি গিট-বি শাখার মাধ্যমে তৈরি শাখাটি পুশ করতে চাই আমি এটি ব্যবহার করে এটি টিপতে পারি:

গিট পিপি

আশা করি এটি কারও জন্য সময় বাঁচায়!


2

প্রথম চেক

ধাপ 1: git remote -v
// যদি গিটটি আরম্ভ হয় তবে পদক্ষেপ -২ সরিয়ে ফেলুন বা এড়িয়ে যান

ধাপ ২: git remote rm origin
// তারপরে আপনার ইমেল ঠিকানাটি বিশ্বব্যাপী গিট কনফিগার করুন

ধাপ 3: git config --global user.email "youremail@example.com"

ধাপ -4: git initial

ধাপ -5: git commit -m "Initial Project"
// যদি ইতিমধ্যে প্রকল্পের রেপো যোগ করেন তবে পদক্ষেপ -6 এ যান

স্টেপ-6: git remote add origin %repo link from bitbucket.org%

স্টেপ-7: git push -u origin master


1

আমি এই সমস্যাটির আরও একটি অনুমানের অভিজ্ঞতা পেয়েছি।

আমার একটি শাখা ছিল feat/XYZ-1234-some-descriptionকারণ আমি জিরা ইস্যুতে 1234 ইস্যুতে কাজ করছিলাম। কাজের সময় আমি একটি ছোট ছোট কাজ ট্র্যাক করার জন্য একটি নতুন জিরা ইস্যু তৈরি করেছি এবং যখন আমি চাপ দিতে এসেছি তখন আমি এই নতুন ইস্যু নম্বর সহ একটি শাখার নামটি ঠেকানোর সিদ্ধান্ত নিয়েছি ভিতরে:

git push -u origin feat/XYZ-5678-a-different-description # failed

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

git branch -m feat/XYZ-1234-some-description feat/XYZ-5678-a-different-description
git push -u origin feat/XYZ-5678-a-different-description # now works

একটি বিট আরো প্রায় আমি উপলব্ধি আমি সেট করেছেন করতে পারে যে পড়ার পর srcউপর git push, নয়তো, বা শুধু বর্তমান শাখার নাম HEADযদি উপযুক্ত:

git push -u origin feat/XYZ-1234-some-description:feat/XYZ-5678-a-different-description # also works

-1

আপনি যদি প্রথমবার নতুন শাখা থেকে নতুন পরিবর্তনগুলি সক্রিয় করতে সক্ষম হন। এবং ত্রুটি নীচে পেয়ে:

*git push -f
fatal: The current branch Coding_Preparation has no upstream branch.

বর্তমান শাখাটি পুশ করতে এবং রিমোটটি আপ স্ট্রিম হিসাবে সেট করতে, ব্যবহার করুন

git push -u origin new_branch_name


** Successful Result:** 
 git push -u origin Coding_Preparation
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 4 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 599 bytes | 599.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote:
remote: Create a pull request for 'Coding_Preparation' on GitHub by visiting: ...
 * [new branch]      Coding_Preparation -> Coding_Preparation
Branch 'Coding_Preparation' set up to track remote branch 'Coding_Preparation' from 'origin'.
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.