গিট চেকআউট - ট্র্যাকের উত্স / শাখা এবং গিট চেকআউট-বি শাখার উত্স / শাখার মধ্যে পার্থক্য


208

দূরবর্তী শাখাটি স্যুইচ করতে ও ট্র্যাক করতে এই দুটি কমান্ডের মধ্যে পার্থক্য কি কেউ জানেন?

git checkout -b branch origin/branch
git checkout --track origin/branch

আমি মনে করি উভয়ই দূরবর্তী শাখার উপর নজর রাখে যাতে আমি আমার পরিবর্তনগুলিকে উত্সের শাখায় ঠেলাতে পারি?

কোন ব্যবহারিক পার্থক্য আছে ??

ধন্যবাদ!

উত্তর:


281

দুটি আদেশের একই প্রভাব রয়েছে ( এটি নির্দেশ করার জন্য রবার্ট সিমারের উত্তরের জন্য ধন্যবাদ )।

স্থানীয় শাখাটি ভিন্নভাবে ব্যবহার করার সময় ব্যবহারিক পার্থক্য আসে :

  • git checkout -b mybranch origin/abranchতৈরি mybranchএবং ট্র্যাক করবেorigin/abranch
  • git checkout --track origin/abranchকেবলমাত্র ' abranch' তৈরি করবে , ভিন্ন নামের শাখা নয়।

(অর্থাৎ, যেমন মন্তব্য দ্বারা সেবাস্টিয়ান গ্রাফ যদি স্থানীয় শাখা করেছিলেন না ইতিমধ্যেই বিদ্যমান।
যদি তা, আপনি প্রয়োজন হবে git checkout -B abranch origin/abranch)


দ্রষ্টব্য: গিট 2.23 (Q3 2019) সহ, এটি নতুন আদেশটিgit switch ব্যবহার করবে :

git switch -c <branch> --track <remote>/<branch>

যদি শাখাটি একাধিক রিমোটে উপস্থিত থাকে এবং সেগুলির একটির নামকরণ checkout.defaultRemoteকনফিগারেশন ভেরিয়েবল দ্বারা করা হয়, তবে আমরা সেইটিকে অসম্পূর্ণতার উদ্দেশ্যে ব্যবহার করব, এমনকি <branch>সমস্ত দূরবর্তী অঞ্চলে অনন্য না হলেও ।
এটি স্থাপন করুন উদাহরণস্বরূপ checkout.defaultRemote=originসেখান থেকে দূরবর্তী শাখাগুলি <branch>অস্পষ্ট থাকলেও 'উত্স' দূরবর্তীটিতে উপস্থিত থাকলে চেকআউট করতে ।

এখানে ' -c' নতুন ' -b'।


প্রথমত, কিছু ব্যাকগ্রাউন্ড: ট্র্যাকিংয়ের অর্থ একটি স্থানীয় শাখার প্রত্যন্ত শাখায় সেট আপ হয়েছে:

# git config branch.<branch-name>.remote origin
# git config branch.<branch-name>.merge refs/heads/branch

git checkout -b branch origin/branch ইচ্ছাশক্তি:

  • branchরেফারেন্স করা পয়েন্টটিতে তৈরি / পুনরায় সেট করুন origin/branch
  • শাখাটি তৈরি করুন branch(সহ git branch) এবং দূরবর্তী ট্র্যাকিং শাখাকে ট্র্যাক করুন origin/branch

কোনও স্থানীয় শাখা যখন রিমোট-ট্র্যাকিং শাখা থেকে শুরু করা হয়, গিট শাখাটি স্থাপন করে (বিশেষত branch.<name>.remoteএবং branch.<name>.mergeকনফিগারেশন এন্ট্রি) যাতে git pullযথাযথভাবে দূরবর্তী ট্র্যাকিং শাখা থেকে মার্জ হয়ে যায়।
এই আচরণটি বিশ্বব্যাপী branch.autosetupmergeকনফিগারেশন পতাকা মাধ্যমে পরিবর্তন করা যেতে পারে । এই সেটিংটি বিকল্পগুলি --trackএবং --no-trackবিকল্পগুলি ব্যবহার করে ওভাররাইড করা যেতে পারে এবং পরে গিট শাখা ব্যবহার করে পরিবর্তিত হতে পারে --set-upstream-to


এবং git checkout --track origin/branchএকই হিসাবে করবে git branch --set-upstream-to):

 # or, since 1.7.0
 git branch --set-upstream upstream/branch branch
 # or, since 1.8.0 (October 2012)
 git branch --set-upstream-to upstream/branch branch
 # the short version remains the same:
 git branch -u upstream/branch branch

এটি ' branch' এর জন্যও প্রবাহ স্থাপন করবে ।

(দ্রষ্টব্য: git1.8.0 git branch --set-upstreamএটিকে অবমূল্যায়ন করবে এবং এর সাথে প্রতিস্থাপন করবে git branch -u|--set-upstream-to: git1.8.0-rc1 ঘোষণা দেখুন )


স্থানীয় শাখার জন্য নিবন্ধিত একটি উজানের শাখাটি হবে:

  • দুটি শাখার মধ্যে git statusএবং এর মধ্যে সম্পর্ক দেখানোর জন্যgit branch -v গিটকে বলুন ।
  • নতুন শাখাটি চেক আউট করা হলে আপস্রোম থেকে টানা git pull যুক্তি ছাড়াই নির্দেশনা দেয়

আরও তথ্যের জন্য " আপনি কীভাবে বিদ্যমান গিট শাখা ট্র্যাকটি দূরবর্তী শাখাকে ট্র্যাক করবেন? " দেখুন।


1
@ ভনসি আমি সেই সামান্য বিশদটি খুঁজছিলাম যা আপনি অতিরিক্ত তথ্য হিসাবে উল্লেখ করেছেন। আমার ক্ষেত্রে, আমি কৌতূহল ছিলাম কেন আমার কিছু শাখা আমাকে প্রবেশের অনুমতি দিয়েছিল git pull, তবে কিছু শাখাগুলি একটি প্রত্যন্ত শাখা থেকে টানতে বলবে। দেখা যাচ্ছে যে আপনি যদি প্রথমবারের মতো, আপনার branch.<BNAME>.remote=originপিয়ারটি তৈরি করে এমন কোনও দূরবর্তী শাখা পরীক্ষা করে দেখেন, গিটটি চলে যায় এবং স্থানীয় গিটকনফাইগে যুক্ত হয়। যা আপনাকে ইস্যু করার অনুমতি দেয় git pull। তবে, আপনি যদি সেই শাখা তৈরি করছেন git checkout -b BNAMEতবে গিট-কোর্স- জানেন না। সুতরাং আপনি এর দূরবর্তী নির্দিষ্ট করা উচিত।
ব্যাটেলিক

@ ব্যাটিলক "এটি প্রমাণিত হয়েছে যে আপনি যদি প্রথমবারের মতো, আপনার পিয়ারের তৈরি একটি দূরবর্তী শাখা পরীক্ষা করে দেখেন,"; হ্যাঁ, পড়া git-scm.com/docs/git-checkout , আমি দেখতে: " If <branch>পাওয়া না গেলে কিন্তু ঠিক দূরবর্তী এক একটি ট্র্যাকিং শাখা (এটা কল কোন অস্তিত্ব নেই <remote>একটি মানানসই নাম, সমতূল্য যেমন আচরণ সহ) $ git checkout -b <branch> --track <remote>/<branch>"
VonC

@ ভনসি আমি এর জন্য আরও ভাল কনফিগারেশন পেয়েছি। স্থাপনের branch.autoSetupMergeজন্য alwaysকেবল সঞ্চালিত আমরা যে বিষয়ে কথা হয়। এই সেটিংটি ডিফল্ট true, যার অর্থ ট্র্যাকিং কেবলমাত্র একটি দূরবর্তী শাখা পরীক্ষা করে দেখানো হবে। trueস্থানীয়ভাবে তৈরি শাখাগুলির জন্য ট্র্যাকিং সেটআপ করে না।
ব্যাটেলিক

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

1
"গিট ব্রাঞ্চ --set-upstream-to শাখা আপ স্ট্রিম / শাখা" সঠিক বাক্য গঠন নয়। এটি হওয়া উচিত: "গিট শাখা - সেট-আপ
স্ট্রিম থেকে টু আপস্ট्रीम

33

কোনও পার্থক্য নেই!

1) git checkout -b branch origin/branch

যদি কোন হয় --trackএবং কোন --no-track, --trackডিফল্ট হিসাবে অধিকৃত হয়। ডিফল্টটি সেটিংসের মাধ্যমে পরিবর্তন করা যেতে পারে branch.autosetupmerge

কার্যত, 1) এর মতো আচরণ করে git checkout -b branch --track origin/branch

2) git checkout --track origin/branch

"সুবিধার্থ হিসাবে", ইঙ্গিত --trackছাড়াই এবং যুক্তিটিকে "শাখা" হিসাবে অনুমান করা হয়। অনুমানটি কনফিগারেশন ভেরিয়েবল দ্বারা চালিত হয় ।-b-b-bremote.origin.fetch

কার্যত, 2) এর মতো আচরণ করে git checkout -b branch --track origin/branch

যেমন আপনি দেখতে পাচ্ছেন: কোনও পার্থক্য নেই।

কিন্তু এটা আরও ভাল পায়:

3) git checkout branch

git checkout -b branch --track origin/branch"শাখা" এখনও বিদ্যমান না থাকলেও এটির সমতুল্য তবে "উত্স / শাখা" 1 করে


তিনটি কমান্ডই "শাখা" এর "উজানের" সেট করে "উত্স / শাখা" (বা তারা ব্যর্থ হয়েছে)।

আপস্ট্রিম এর রেফারেন্স পয়েন্ট হিসেবে ব্যবহার করা হয় যুক্তি-কম git status, git push, git mergeএবং এইভাবে git pull(যে মত কনফিগার করেন (যা ডিফল্টভাবে বা প্রায় ডিফল্ট))।

উদাহরণস্বরূপ git status, যদি আপনি কনফিগার করা থাকে তবে আপনি উজানের পক্ষে কতটা পিছনে বা এগিয়ে আছেন tells

git pushডিফল্টরূপে বর্তমান শাখা মূল প্রজেক্টের ধাক্কা কনফিগার করা 2 Git 2.0 থেকে।

1 ... এবং যদি "উৎপত্তি" শুধুমাত্র দূরবর্তী থাকার "শাখা" হয়
2 ডিফল্ট (নামে "সরল") এছাড়াও enforces উভয় শাখা নাম সমান হতে জন্য


5

বইটি মনে করে যে এই আদেশগুলি একই প্রভাব দেয়:

সহজ ঘটনাটি হ'ল উদাহরণটি যা আপনি সবে দেখলেন, চালানো গিট চেকআউট-বি [শাখা] [রিমোটনাম] / [শাখা]। আপনার যদি গিট সংস্করণ ১.6.২ বা তার পরে থাকে তবে আপনি - ট্র্যাক শর্টহ্যান্ড ব্যবহার করতে পারেন:

$ git checkout --track origin/serverfix 
Branch serverfix set up to track remote branch serverfix from origin. 
Switched to a new branch 'serverfix' 

দূরবর্তী শাখার চেয়ে আলাদা নামের সাথে স্থানীয় একটি শাখা স্থাপন করতে, আপনি সহজেই আলাদা স্থানীয় শাখার নাম সহ প্রথম সংস্করণটি ব্যবহার করতে পারেন:

$ git checkout -b sf origin/serverfix

আপনার ব্যাশ বা ওহ-মাই-জিএসএস গিট পরিপূর্ণতাগুলি origin/serverfixআপনার জন্য নাম টানতে সক্ষম হয় - এটি কেবল যুক্ত করুন --track(বা -t) এবং আপনি নিজের পথে চলেছেন তা বিশেষভাবে সহজ ।


-1

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

git checkout --track origin/branch

আপনার যদি এমন পরিবর্তন হয় যা মঞ্চস্থ হয় না।

এখানে উদাহরণ:

$ git status
On branch master
Your branch is up to date with 'origin/master'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   src/App.js

no changes added to commit (use "git add" and/or "git commit -a")

// TRY TO CREATE:

$ git checkout --track origin/new-branch
fatal: 'origin/new-branch' is not a commit and a branch 'new-branch' cannot be created from it

তবে আপনি git checkout -bকমান্ডের সাহায্যে আন-স্টেজড পরিবর্তন সহ সহজেই একটি নতুন শাখা তৈরি করতে পারেন :

$ git checkout -b new-branch
Switched to a new branch 'new-branch'
M       src/App.js

মনে রাখবেন যে প্রশ্নের দুটি কমান্ডই একটি বিদ্যমান দূরবর্তী শাখা ( origin/branch)
ইয়র্ক

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