আমি গিটের সাথে খেলতে শুরু করেছি এবং "উজান" এবং "ডাউন স্ট্রিম" শব্দটি পেয়েছি। আমি এগুলি আগে দেখেছি কিন্তু সেগুলি পুরোপুরি বুঝতে পারি নি। এসসিএম ( সফ্টওয়্যার কনফিগারেশন ম্যানেজমেন্ট সরঞ্জাম) এবং উত্স কোডের প্রসঙ্গে এই পদগুলির অর্থ কী ?
আমি গিটের সাথে খেলতে শুরু করেছি এবং "উজান" এবং "ডাউন স্ট্রিম" শব্দটি পেয়েছি। আমি এগুলি আগে দেখেছি কিন্তু সেগুলি পুরোপুরি বুঝতে পারি নি। এসসিএম ( সফ্টওয়্যার কনফিগারেশন ম্যানেজমেন্ট সরঞ্জাম) এবং উত্স কোডের প্রসঙ্গে এই পদগুলির অর্থ কী ?
উত্তর:
উত্স নিয়ন্ত্রণের ক্ষেত্রে, আপনি যখন কোনও সংগ্রহশালা থেকে অনুলিপি করেন (ক্লোন, চেকআউট, ইত্যাদি) আপনি " ডাউনস্ট্রিম " হন। তথ্য আপনার কাছে "ডাউন স্ট্রিম" প্রবাহিত করেছে।
আপনি যখন পরিবর্তনগুলি করেন, আপনি সাধারণত তাদের " আপস্ট্রিম " ফেরত পাঠাতে চান তাই তারা এটিকে সেই ভান্ডারে পরিণত করে যাতে একই উত্স থেকে টানা প্রত্যেকে সমস্ত একই পরিবর্তনগুলির সাথে কাজ করে। এটি বেশিরভাগ উত্স নিয়ন্ত্রণের প্রযুক্তিগত প্রয়োজনের চেয়ে কীভাবে প্রত্যেকে তাদের কাজের সমন্বয় করতে পারে তার একটি সামাজিক সমস্যা। আপনি মূল প্রকল্পে আপনার পরিবর্তনগুলি পেতে চান যাতে আপনি বিকাশের বিবিধ লাইনগুলি অনুসরণ করছেন না।
কখনও কখনও আপনি প্যাকেজ বা রিলিজ ম্যানেজার সম্পর্কে পড়বেন (লোক, সরঞ্জাম নয়) "আপস্ট্রিমে" পরিবর্তনগুলি জমা দেওয়ার বিষয়ে কথা বলবেন। এর অর্থ সাধারণত তাদের মূল উত্সগুলি সমন্বয় করতে হয়েছিল যাতে তারা তাদের সিস্টেমে একটি প্যাকেজ তৈরি করতে পারে। তারা এই পরিবর্তনগুলি চালিয়ে যেতে চায় না, তাই তারা যদি তাদের মূল উত্সটিতে "আপস্ট্রিম" প্রেরণ করে তবে তাদের পরবর্তী প্রকাশে একই সমস্যাটি মোকাবেলা করা উচিত নয়।
-uমত git push --set-upstream origin masterযদি এটি একটি নয় টেকনিকাল প্রয়োজন ? আমরা push -u originবা না push originপেরে পারি, সুতরাং এটি একটি প্রযুক্তি প্রয়োজন। তবে পার্থক্য কী?
আপনি git tagম্যান পৃষ্ঠাতে যখন পড়েন :
গিটের একটি গুরুত্বপূর্ণ বিষয় হ'ল এটি বিতরণ করা হয় এবং মূলত বিতরণ করার অর্থ সিস্টেমে কোনও অন্তর্নিহিত "আপস্ট्रीम" বা "ডাউনস্ট্রিম" নেই।
, এর সহজ অর্থ এখানে কোনও নিখুঁত আপস্ট্রিম রেপো বা ডাউনস্ট্রিম রেপো নেই।
এই ধারণাগুলি সর্বদা দুটি রেপের মধ্যে আপেক্ষিক এবং ডেটা প্রবাহিত করার পথে নির্ভর করে:
যদি "আপনাররেপো" "অন্যান্যরোপো" কে রিমোট হিসাবে ঘোষণা করেছে, তবে :
"থেকে" এবং "জন্য" নোট করুন: আপনি কেবল "ডাউনস্ট্রিম" নন, আপনি "ডাউন স্ট্রিম থেকে / ফর ", অতএব আপেক্ষিক দিকটি।
ডিভিসিএস (ডিস্ট্রিবিউটেড ভার্সন কন্ট্রোল সিস্টেম) টুইস্টটি হ'ল: আপনি যে রিমোট রেপো ঘোষনা করেছেন তার তুলনায় আপনার নিজের রেপোর পাশে ডাউনস্ট্রিম আসলে কী তা আপনার কোনও ধারণা নেই।
মূলত:
" ডেটা প্রবাহ " এর শর্তে , আপনার রেপো প্রবাহের রেপোস ("থেকে টানুন") থেকে আগত প্রবাহের নীচে ("ডাউনস্ট্রিম") থাকে এবং (একই বা অন্যান্য) প্রবাহের রেপোতে ফিরে যায় ("টু" )।
আপনি "ম্যানেজমেন্ট রিবাউস থেকে পুনরুদ্ধার" অনুচ্ছেদ সহ git-rebaseম্যান পৃষ্ঠাতে একটি চিত্র দেখতে পারেন :
এর অর্থ আপনি একটি "উজানের" রেপো থেকে টানছেন যেখানে একটি রিবেস হয়েছিল , এবং আপনি ("প্রবাহিত" রেপো) এর পরিণতিতে আটকে আছেন (বহু সদৃশ প্রতিশ্রুতিবদ্ধ, কারণ শাখাটি পুনর্বাসিত প্রবাহটি একই শাখার কমিটগুলি পুনরায় তৈরি করেছে আপনি স্থানীয়ভাবে আছে)।
এটি খারাপ কারণ একটি "আপ স্ট্রিম " রেপোর জন্য, অনেকগুলি ডাউন স্ট্রিম রেপো থাকতে পারে (যেমন রেপসেট শাখা সহ উজানের একটি থেকে টানা রেপোস), তাদের সকলেরই সদৃশ কমিটগুলি মোকাবেলা করার সম্ভাবনা রয়েছে।
আবার, "ডেটা ফ্লো" উপমা দিয়ে, ডিভিসিএসে, একটি খারাপ কমান্ড "আপস্ট্রিম" ডাউন স্ট্রিমের "রিপল ইফেক্ট " থাকতে পারে ।
দ্রষ্টব্য: এটি ডেটা সীমাবদ্ধ নয়।
এটি প্যারামিটারগুলিতেও প্রযোজ্য , যেমন গিট কমান্ডগুলি ("পোরসিলাইন" এর মতো) প্রায়শই অভ্যন্তরীণভাবে অন্যান্য গিট কমান্ডকে ("নদীর গভীরতানির্ণয়") ডাকে। rev-parseম্যান পৃষ্ঠা দেখুন :
অনেক গিট চীনামাটির বাসিন্দা কমান্ড পতাকাগুলির মিশ্রণ গ্রহণ করে (অর্থাত্ ড্যাশ '
-' দিয়ে শুরু হওয়া প্যারামিটারগুলি) এবং অন্তর্নিহিতgit rev-listকমান্ডের জন্য বোঝানো প্যারামিটারগুলি এবং অভ্যন্তরীণভাবে অভ্যন্তরীণভাবে ব্যবহৃত অন্যান্য কমান্ডগুলির জন্য পতাকা এবং পরামিতি ব্যবহার করেgit rev-list। এই আদেশটি তাদের মধ্যে পার্থক্য করার জন্য ব্যবহৃত হয়।
শব্দটি মূল প্রজেক্টের এছাড়াও, যেমন এলেবেলে সরঞ্জামের স্যুট আসে কিছু দ্ব্যর্থহীন অর্থ বিশেষত আপেক্ষিক ট্র্যাকিং
উদাহরণ স্বরূপ :
$git rev-list --count --left-right "@{upstream}"...HEAD >4 12এই স্থানীয় শাখার জন্য বর্তমানে ট্র্যাকিং দূরবর্তী শাখার সাথে সম্পর্কিত (বর্তমান যদি থাকে ) আপনার বর্তমান কার্যকারী শাখার পিছনে (বাম) এবং সামনের (ডানে) কমিটের সংখ্যা (শেষ ক্যাশেড মান) মুদ্রণ করবে । এটি অন্যথায় একটি ত্রুটি বার্তা মুদ্রণ করবে:
>error: No upstream branch found for ''
origin(আপনার ফোরকড রেপো চালু আছে) গিথুব) এবং upstream(গিথুবটির রেপো যেটি আপনি থেকে শুরু করেছেন)। এগুলি কেবলমাত্র বিনিময়যোগ্য নাম, কেবল 'গিট @ ...' ইউআরএল তাদের সনাক্ত করে।আপনার
.git/configপড়া:[remote "origin"] fetch = +refs/heads/*:refs/remotes/origin/* url = git@github.com:myusername/reponame.git [remote "upstream"] fetch = +refs/heads/*:refs/remotes/upstream/* url = git@github.com:authorname/reponame.git
এটি ' রিমোট' তে ' শাখা' (যদি থাকে) , যা আপনার 'স্থানীয় ভাণ্ডার' তে 'বর্তমান শাখা' ট্র্যাক করে ।
আপনি যখনই কোনও বিতর্ক ছাড়াই
git fetch/ কোনও সরল / ইস্যু করেন তখন এটি আপনি যে শাখাটি নিয়েছেন / টানবেন সেটাইgit pullএটি।
আসুন বলি যে আপনি যে স্থানীয় মাস্টার শাখাটি যাচাই করেছেন তা দূরবর্তী শাখার উত্স / মাস্টারকে ট্র্যাকিং শাখা হিসাবে সেট করতে চান। কেবল ইস্যু করুন:
$ git branch --set-upstream master origin/master > Branch master set up to track remote branch master from origin.এটি এতে 2 টি পরামিতি যুক্ত করে
.git/config:[branch "master"] remote = origin merge = refs/heads/masterএখন চেষ্টা করুন (সরবরাহিত 'আপস্ট्रीम' রিমোটটির একটি 'দেব' শাখা রয়েছে)
$ git branch --set-upstream master upstream/dev > Branch master set up to track remote branch dev from upstream.
.git/configএখন পড়ে:[branch "master"] remote = upstream merge = refs/heads/dev
git-push(1)ম্যানুয়াল পৃষ্ঠা :-u --set-upstreamআপ টু ডেট বা সফলভাবে ঠেলে দেওয়া প্রতিটি শাখার জন্য আপগ্রেম (ট্র্যাকিং) রেফারেন্স যুক্ত করুন, যুক্তি-কম গিট-পুল (1) এবং অন্যান্য কমান্ড দ্বারা ব্যবহৃত। আরও তথ্যের জন্য,
branch.<name>.mergeগিট কনফিগারেশন (1) এ দেখুন।
git-config(1)ম্যানুয়াল পৃষ্ঠা :branch.<name>.mergeসংজ্ঞায়িত, একসঙ্গে সঙ্গে
branch.<name>.remote, মূল প্রজেক্টের দেওয়া শাখা জন্য শাখা। এটি গিট ফেচ / গিট পুল / গিট রিবেসকে জানায় যে কোন শাখাটি মার্জ করা হবে এবং গিট পুশকেও প্রভাবিত করতে পারে (পুশ.ডিফল্ট দেখুন)। \ (...)branch.<name>.remoteযখন শাখা <নাম> এ থাকে, এটি গিট আনতে এবং গিট পুশকে বলে যে কোনটি দূরবর্তী থেকে / পুশতে আনতে হবে। কোনও রিমোট কনফিগার করা না থাকলে এটি উত্সকে ডিফল্ট করে। আপনি যদি কোনও শাখায় না থাকেন তবে উত্সও ব্যবহৃত হয়।
ম্যানুয়াল পৃষ্ঠাটি একবার দেখুনgit-config(1)
git config --global push.default upstream git config --global push.default tracking (deprecated)এটি এমন শাখাগুলিতে দুর্ঘটনাজনিত ধাক্কা ঠেকাতে যা আপনি এখনও চাপতে প্রস্তুত নন।
git branch --help2018 এর হিসাবে:As this option had confusing syntax, it is no longer supported. Please use --track or --set-upstream-to instead.
এটি কিছুটা অনানুষ্ঠানিক পরিভাষা।
যতদূর গিট সম্পর্কিত, অন্য প্রতিটি সংগ্রহস্থল কেবল একটি রিমোট।
সাধারণভাবে বলতে গেলে, উজানের অংশটি যেখানে আপনি (আদি) থেকে ক্লোন করেছেন। ডাউনস্ট্রিম এমন কোনও প্রকল্প যা আপনার কাজকে অন্যান্য কাজের সাথে সংহত করে।
পদগুলি গিট সংগ্রহস্থলের মধ্যে সীমাবদ্ধ নয়।
উদাহরণস্বরূপ, উবুন্টু একটি ডেবিয়ান ডেরিভেটিভ, সুতরাং ডেবিয়ান উবুন্টুর পক্ষে প্রবাহিত।
হায়, আফসোসের আরও একটি ব্যবহার যা এখানে অন্যান্য উত্তরগুলি পাচ্ছে না, যাহা কোনও রেপোর মধ্যে কমেন্টের পিতামাতার সাথে সম্পর্কের কথা উল্লেখ করা। প্রো গিট বইয়ের স্কট চ্যাকন বিশেষত এটির জন্য প্রবণ এবং ফলাফলগুলি দুর্ভাগ্যজনক। এইভাবে কথা বলার অনুকরণ করবেন না।
উদাহরণস্বরূপ, তিনি একীভূত হওয়ার বিষয়ে বলেছিলেন যে দ্রুতগতির ফলে এটি ঘটে because
আপনি যে শাখায় একীভূত হয়েছিলেন তার নির্দেশিত প্রতিশ্রুতিটি আপনি যে প্রতিশ্রুতিতে এসেছেন সেটির সরাসরি প্রবাহ ছিল
তিনি বলতে চান যে কমিট বি একমাত্র সন্তানের একমাত্র সন্তান ... কমিট এ এর একমাত্র সন্তানের, তাই বি কে এ-তে মিশ্রিত করা যথেষ্ট হবে রেফারেন্স এটিকে বি প্রতিশ্রুতিবদ্ধ করার জন্য সরানো যথেষ্ট কেন এই দিকটি কেন? "ডাউন স্ট্রিম" এর পরিবর্তে "উজান" বলা উচিত, বা কেন এইরকম খাঁটি সরলরেখার গ্রাফের জ্যামিতিটি "সরাসরি উজানে" বর্ণিত হওয়া উচিত, তা সম্পূর্ণ অস্পষ্ট এবং সম্ভবত নির্বিচারে। (ম্যান পেজ git-mergeএই সম্পর্কের ব্যাখ্যার চেয়ে আরও ভাল কাজ করে যখন বলা হয় যে "বর্তমান শাখার প্রধান নামকৃত অঙ্গীকারের পূর্বপুরুষ।" চকনকে এটাই বলা উচিত ছিল) "
প্রকৃতপক্ষে, চকন নিজেই পরে "ডাউনস্ট্রিম" ব্যবহার করে একই জিনিসটি বোঝাতে হাজির হন, যখন তিনি মুছে ফেলা সমস্ত প্রতিশ্রুতিতে সমস্ত শিশুর প্রতিশ্রুতি পুনর্লিখনের কথা বলেন:
আপনার গিট ইতিহাস থেকে এই ফাইলটিকে পুরোপুরি অপসারণ করতে আপনাকে অবশ্যই 6df76 থেকে সমস্ত সমঝোতা পুনর্লিখন করতে হবে
মূলত সময়ের সাথে কমিটস এর ইতিহাস উল্লেখ করার সময় "আপস্ট्रीम" এবং "ডাউন স্ট্রিম" বলতে কী বোঝায় সে সম্পর্কে তার পরিষ্কার ধারণা নেই বলে মনে হয়। এই ব্যবহারটি তখন অনানুষ্ঠানিক, এবং উত্সাহিত হওয়ার জন্য নয়, কারণ এটি কেবল বিভ্রান্তিকর।
এটি পুরোপুরি স্পষ্ট যে প্রতিটি প্রতিশ্রুতি (এক ব্যতীত) কমপক্ষে একজন পিতা বা মাতা থাকে এবং পিতামাতার পিতামাতারা এইভাবে পূর্বপুরুষ হন; এবং অন্যদিকে, প্রতিশ্রুতিবদ্ধদের সন্তান এবং বংশধর রয়েছে। এটি স্বীকৃত পরিভাষা, এবং গ্রাফের দিকনির্দেশকে নির্বিঘ্নভাবে বর্ণনা করে, সুতরাং কোনও রেপোর গ্রাফ জ্যামিতির মধ্যে কীভাবে একে অপরের সাথে সম্পর্কযুক্ত তা বর্ণনা করতে চাইলে কথা বলার উপায় এটি। এই পরিস্থিতিতে "উজান" বা "ডাউন স্ট্রিম" আলগাভাবে ব্যবহার করবেন না।
[অতিরিক্ত দ্রষ্টব্য: আমি উপরের প্রথম চকন বাক্যটি উদ্ধৃত করেছি এবং git-mergeম্যান পৃষ্ঠার মধ্যে সম্পর্ক সম্পর্কে ভাবছিলাম , এবং এটি আমার কাছে ঘটে যে পূর্ববর্তীটি পরবর্তীকালের একটি ভুল বোঝাবুঝির ভিত্তিতে হতে পারে। ম্যান পেজ এমন পরিস্থিতির বর্ণনা দেয় যেখানে "আপস্ট্রিম" ব্যবহার বৈধ হয়: দ্রুত-ফরওয়ার্ডিং প্রায়শই ঘটে যখন "আপনি একটি প্রবাহের সংগ্রহস্থলটি সন্ধান করছেন, আপনি কোনও স্থানীয় পরিবর্তন করেন নি, এবং এখন আপনি নতুনটিতে আপডেট করতে চান আপস্ট্রিম রিভিশন। " সুতরাং সম্ভবত চকন "উজান" ব্যবহার করেছেন কারণ তিনি এটি ম্যান পৃষ্ঠাতে দেখেছিলেন। তবে ম্যান পেজে একটি রিমোট রিপোজিটরি রয়েছে; চকন-এর দ্রুত-ফরওয়ার্ডিংয়ের উদ্ধৃত উদাহরণে কোনও দূরবর্তী সংগ্রহস্থল নেই, কেবল স্থানীয়ভাবে তৈরি কয়েকটি শাখা।]
<branch>।
git-rebaseডক্স থেকে এসেছিল কারণ আমি সম্পূর্ণ বিভ্রান্ত ছিলাম যে কোনও প্রতিশ্রুতিবদ্ধ রেফাকে কেন সেখানে "উজান" বলা হবে (আসলে, আমি নিজেকে আগে সন্দেহ করেছিলাম কারণ আমি এই পরিভাষাটি আগে দেখিনি)। জিনিসগুলি সাফ করার জন্য @ আউটস এবং @ ম্যাটকে ধন্যবাদ!