বেন জ্যাকসনের উত্তরটি প্রসারিত করতে , যা ঠিক আছে, আসল প্রশ্নটি ঘনিষ্ঠভাবে দেখি। ( কেন প্রশ্নগুলি বিরক্ত করার জন্য তার উত্তর দেখুন ; এটি কী চলছে তা সম্পর্কে আরও বেশি ))
আমি সংস্করণ নিয়ন্ত্রণে নতুন এবং আমি বুঝতে পারি যে "প্রতিশ্রুতিবদ্ধ" আপনি কী কাজ করছেন তার নতুন 'বর্তমান' সংস্করণটি আপডেট করার সময় মূলত একটি ব্যাকআপ তৈরি করছে।
এই নয় বেশ ঠিক আছে। ব্যাকআপ এবং সংস্করণ নিয়ন্ত্রণ অবশ্যই সম্পর্কিত — কিছুটা মতামত সম্পর্কিত বিষয়গুলির উপর ঠিক কতটা দৃ strongly়তার সাথে নির্ভর করে — তবে অবশ্যই কিছু পার্থক্য রয়েছে, যদি কেবল অভিপ্রায় হয়: ব্যাকআপগুলি সাধারণত বিপর্যয় পুনরুদ্ধারের জন্য ডিজাইন করা হয় (মেশিন ব্যর্থ হয়, আগুন ধ্বংস করে দেয়) সমস্ত স্টোরেজ মিডিয়া ইত্যাদি সহ পুরো বিল্ডিং) সংস্করণ নিয়ন্ত্রণ সাধারণত সূক্ষ্ম-দানাযুক্ত মিথস্ক্রিয়াগুলির জন্য ডিজাইন করা হয় এবং এমন বৈশিষ্ট্যগুলি সরবরাহ করে যা ব্যাকআপগুলি না করে। ব্যাকআপগুলি সাধারণত কিছু সময়ের জন্য সংরক্ষণ করা হয়, তারপরে "খুব পুরানো" হিসাবে জেটিসন করা হয়: একটি ফ্রেশার ব্যাকআপ হ'ল এটি গুরুত্বপূর্ণ। সংস্করণ নিয়ন্ত্রণ সাধারণত প্রতিটি প্রতিশ্রুতিবদ্ধ সংস্করণ চিরতরে সংরক্ষণ করে।
আমি যা বুঝতে পারি না তা হ'ল বাস্তবিক দৃষ্টিকোণ থেকে মঞ্চস্থকরণ কী। কেবল নামে বিদ্যমান এমন কিছু মঞ্চস্থ করা কি এটি কোনও উদ্দেশ্য করে? আপনি যখন প্রতিশ্রুতিবদ্ধ, এটি যাইহোক যাইহোক, প্রতিশ্রুতিবদ্ধ হবে?
হ্যা এবং না. গিটের ডিজাইন এখানে কিছুটা অদ্ভুত। সংস্করণ নিয়ন্ত্রণ সিস্টেম বিদ্যমান রয়েছে যার জন্য পৃথক স্টেজিং পদক্ষেপের প্রয়োজন হয় না । উদাহরণস্বরূপ, মার্চুরিয়াল, যা অন্যথায় ব্যবহারের দিক দিয়ে গিটের মতো অনেক বেশি, সম্পূর্ণ নতুন ফাইলটি প্রবর্তনকারী প্রথমটির বাইরে পৃথক পদক্ষেপের প্রয়োজন হয় নাhg add । মার্চুরিয়াল দিয়ে আপনি hgকমান্ডটি ব্যবহার করেন যা কিছু প্রতিশ্রুতি নির্বাচন করে, তারপরে আপনি আপনার কাজটি করেন, তারপরে আপনি দৌড়ে যান hg commitএবং আপনি সম্পন্ন হয়ে যান। গিট দিয়ে আপনি 1 ব্যবহার করেন git checkout, তারপরে আপনি আপনার কাজ করেন, তারপরে আপনি চালান এবং তারপরে । অতিরিক্ত পদক্ষেপ কেন ?git addgit commitgit add
এখানে গোপনীয়তা হ'ল গিট যা কল করে, বিভিন্নভাবে, সূচক বা মঞ্চ অঞ্চল , বা কখনও কখনও — বিরল এই দিনগুলিতে — ক্যাশে । এগুলি একই জিনিসটির জন্য সমস্ত নাম।
সম্পাদনা: আমি মনে করি আমি পরিভাষা গুলিয়ে ফেলছি। কোনও 'স্টেজড' ফাইল কি 'ট্র্যাকড' ফাইলের মতো একই জিনিস?
না, তবে এগুলি সম্পর্কিত। একটি ট্র্যাক করা ফাইল হ'ল গিটের সূচীতে। সূচকটি সঠিকভাবে বুঝতে, কমিটগুলি বোঝার সাথে শুরু করা ভাল।
গিট সংস্করণ ২.২৩ থেকে আপনি এর git switchপরিবর্তে ব্যবহার করতে পারেন git checkout। এই বিশেষ ক্ষেত্রে, এই দুটি কমান্ড ঠিক একই জিনিস করতে। নতুন কমান্ডটি উপস্থিত রয়েছে কারণ git checkoutঅনেকগুলি জিনিস দিয়ে অতিরিক্ত স্টাফ করা হয়েছে; তারা দুটি পৃথক কমান্ড ছড়িয়ে বিভক্ত করেছেন, git switchএবং git restore, এটা সহজ এবং নিরাপদ গীত ব্যবহার করতে হবে।
কমিট করে
গিট-এ, প্রতিশ্রুতিবদ্ধ হওয়া প্রতিটি ফাইলের পুরো স্ন্যাপশট সংরক্ষণ করে যা গিট জানে। (গিটটি কোন ফাইলগুলি সম্পর্কে জানে? আমরা পরবর্তী বিভাগে এটি দেখতে পাব)) এই স্ন্যাপশটগুলি একটি বিশেষ, কেবল পঠনযোগ্য, গিট-ওনালি, সংক্ষিপ্ত এবং ডি-নকল ফর্মায় সংরক্ষণ করা হয়, কেবলমাত্র গিট নিজেই পড়তে পারে । (প্রতিটি প্রতিশ্রুতিতে কেবল এই স্ন্যাপশটের চেয়ে আরও বেশি জিনিস রয়েছে , তবে আমরা এখানে কেবল আবরণ করব all)
ডি-সদৃশ স্থানটির সাথে সহায়তা করে: আমরা সাধারণত কেবলমাত্র কয়েকটি ফাইল পরিবর্তন করি, তারপরে একটি নতুন প্রতিশ্রুতিবদ্ধ। তাই সবচেয়ে একটি ফাইল কমিট বেশিরভাগই পূর্ববর্তী ফাইল কমিট মতই। কেবলমাত্র সেই ফাইলগুলি সরাসরি পুনরায় ব্যবহার করে গিট প্রচুর স্থান সাশ্রয় করে: আমরা যদি কেবল একটি ফাইল স্পর্শ করি তবে নতুন প্রতিশ্রুতি কেবলমাত্র একটি নতুন অনুলিপিটির জন্য স্থান নেয় । তারপরেও এটি সংকুচিত — কখনও কখনও খুব সংকুচিত হয়, যদিও এটি পরে ঘটে — যাতে কোনও .gitডিরেক্টরি সাধারণত প্রতিদিনের ফাইলগুলিতে প্রসারিত হয়ে যাওয়ার পরে ডিরেক্টরিটি এতে থাকা ফাইলগুলির চেয়ে ছোট হতে পারে। ডি-সদৃশ নিরাপদ কারণ প্রতিশ্রুতিবদ্ধ ফাইলগুলি সর্বকালের জন্য হিমশীতল। কেউ কোনও একটিতে যেতে পারে না, সুতরাং একে অপরের অনুলিপিগুলির উপর নির্ভর করে কমিট করার পক্ষে এটি নিরাপদ।
সঞ্চিত ফাইলগুলি এই বিশেষ, সর্বকালের জন্য হিমায়িত, গিট কেবলমাত্র বিন্যাসে রয়েছে যদিও গিটকে প্রতিটি ফাইলকে একটি সাধারণ দৈনন্দিন অনুলিপিতে প্রসারিত করতে হবে। এই সাধারণ অনুলিপি গিটের অনুলিপি নয়: এটি আপনার অনুলিপি, আপনার ইচ্ছামতো কাজ করা। আপনি যখন এটি করার কথা বলবেন তখন গিট এগুলি লিখবে, যাতে আপনার কপিগুলি কাজ করার জন্য থাকে। এই ব্যবহারযোগ্য অনুলিপিগুলি আপনার কার্যকারী গাছ বা কাজের গাছের মধ্যে রয়েছে ।
এর অর্থ হ'ল আপনি যখন কোনও নির্দিষ্ট প্রতিশ্রুতি পরীক্ষা করেন, তখন স্বয়ংক্রিয়ভাবে প্রতিটি ফাইলের দুটি কপি থাকে:
গিটের সর্বকালের জন্য হিমায়িত, বর্তমান প্রতিশ্রুতিতে গিট-আইয়েড অনুলিপি রয়েছে । আপনি এই অনুলিপিটি পরিবর্তন করতে পারবেন না (যদিও আপনি অবশ্যই আলাদা প্রতিশ্রুতি নির্বাচন করতে পারেন, বা একটি নতুন অঙ্গীকারবদ্ধ করতে পারেন)।
আপনার কার্যক্ষেত্রে একটি সাধারণ-ফর্ম্যাট কপি রয়েছে। আপনার কম্পিউটারে যে কোনও কমান্ড ব্যবহার করে আপনি এটি করতে ইচ্ছুক যে কোনও কিছু করতে পারেন।
এই দুটি অনুলিপি সহ অন্যান্য সংস্করণ নিয়ন্ত্রণ ব্যবস্থা (উপরে বর্ণিত মার্চুরিয়াল সহ) এখানে থামছে। আপনি কেবল আপনার কার্য-গাছের অনুলিপি পরিবর্তন করুন, তারপরে প্রতিশ্রুতিবদ্ধ। গিট ... না।
সূচক
এই দুটি অনুলির মধ্যে, গিট প্রতিটি ফাইলের তৃতীয় অনুলিপি 2 সঞ্চয় করে। এই তৃতীয় অনুলিপি হিমায়িত বিন্যাসে রয়েছে , তবে প্রতিশ্রুতিবদ্ধ হ'ল অনুলিপিটির বিপরীতে, আপনি এটিকে পরিবর্তন করতে পারেন । এটি পরিবর্তন করতে, আপনি ব্যবহার করুন git add।
git addকমান্ড মানে ফাইলের সূচক কপি কাজ-ট্রি কপি মেলে করা । এটি, আপনি গিটকে বলছেন: হ'ল হ'ল ফর্ম্যাটটি, ডি-ডুপ্লিকেট অনুলিপিটি এখন সূচকগুলিতে প্রতিস্থাপন করুন, আমার আপডেট ওয়ার্ক-ট্রি কপিটি সংকুচিত করে, এটিটিকে অনুলিপি করে, এবং এটি একটি নতুন প্রতিশ্রুতিতে হিমায়িত হওয়ার জন্য প্রস্তুত করে। আপনি যদি ব্যবহার না করেনgit add তবে সূচকটি বর্তমান কমিট থেকে হিমায়িত-বিন্যাসের অনুলিপিটি ধারণ করে।
যখন আপনি চালাতে git commit, গীত আপ প্যাকেজ যাই হোক না কেন সূচক হয় ডান তারপর নতুন স্ন্যাপশট হিসাবে ব্যবহার করার জন্য। যেহেতু এটি ইতিমধ্যে হিমায়িত বিন্যাসে রয়েছে এবং প্রাক-ডুপ্লিকেটেড, তাই গিটকে অতিরিক্ত অতিরিক্ত কাজ করতে হবে না।
এটি অন্রে্যাকড ফাইলগুলি কী কী তাও ব্যাখ্যা করে । একটি চিহ্নবিহীন ফাইল হ'ল এমন একটি ফাইল যা আপনার ওয়ার্ক-ট্রিতে রয়েছে তবে এখনই গিতের সূচীতে নেই । ফাইলটি এই অবস্থায় কীভাবে ক্ষতবিক্ষত হয় তা বিবেচ্য নয়। হতে পারে আপনি এটিকে আপনার কম্পিউটারের অন্য কোনও জায়গা থেকে আপনার কাজের গাছটিতে অনুলিপি করেছেন। আপনি এটি এখানে সতেজ তৈরি করতে পারেন। হয়তো ছিল গীত এর সূচীতে একটি কপি, কিন্তু আপনি যে কপি মুছে git rm --cached। এক উপায় বা অন্য কোনওভাবে, আপনার কার্য-বৃক্ষে এখানে একটি অনুলিপি রয়েছে, তবে গিটের সূচীতে কোনও অনুলিপি নেই। আপনি যদি এখনই নতুন প্রতিশ্রুতিবদ্ধ হন তবে সেই ফাইলটি নতুন প্রতিশ্রুতিতে থাকবে না ।
নোট করুন যে git checkoutপ্রাথমিকভাবে আপনি যে প্রতিশ্রুতিটি পরীক্ষা করেছেন তা গিটের সূচীতে পূর্ণ হয় । সুতরাং সূচকটি কমিটের সাথে মিলছে। এই একই উত্স থেকে গিট আপনার কার্য-বৃক্ষেও পূরণ করে। সুতরাং, প্রাথমিকভাবে, তিনটি ম্যাচ। আপনি যখন আপনার কার্য-বৃক্ষের ফাইল এবং git addসেগুলি পরিবর্তন করেন, ঠিক আছে, এখন সূচি এবং আপনার কাজের গাছের মিল রয়েছে match তারপরে আপনি দৌড়ে যান git commitএবং গিট সূচক থেকে একটি নতুন অঙ্গীকার করে এবং এখন আবার তিনটি ম্যাচ।
গিট সূচী থেকে নতুন কমিট করার কারণে, আমরা জিনিসগুলি এভাবে রাখতে পারি: গিটের সূচকটি আপনার পরবর্তী পরিকল্পনার কথা বলেছে । এটি বিতর্কিত একীকরণের সময় গিটের সূচক যে প্রসারিত ভূমিকা গ্রহণ করে তা উপেক্ষা করে, তবে আমরা এখনই এটিকে উপেক্ষা করতে চাই। :-)
এটুকুই আছে - তবে এটি এখনও বেশ জটিল! এটি বিশেষত জটিল কারণ গিটের সূচীতে ঠিক কী আছে তা দেখার সহজ উপায় নেই। 3 কিন্তু হয় একটি গীত কমান্ড যে আপনি বলে কি একটি উপায় চমত্কার উপযোগী এ, হচ্ছে, এবং যে কমান্ড git status।
2 প্রযুক্তিগতভাবে, এটি আসলে কোনও কপি নয়। পরিবর্তে, এটি গিট-আইয়েড ফাইল, প্রি-ডি-সদৃশ এবং সমস্ত কিছুর একটি উল্লেখ reference গিটকে দ্রুত এগিয়ে নিতে মোড, ফাইলের নাম, একটি স্টেজিং নম্বর এবং কিছু ক্যাশে ডেটার মতো এখানে আরও কিছু জিনিস রয়েছে। তবে আপনি গিটের নিম্ন-স্তরের কয়েকটি কমান্ড- git ls-files --stageএবং git update-indexবিশেষত - এর সাথে কাজ না করলে আপনি এটিকে একটি অনুলিপি হিসাবে ভাবতে পারেন।
3git ls-files --stage কমান্ড আপনাকে নাম এবং গীত এর সূচীতে যে ফাইলের উপস্থাপনকারী সংখ্যার দেখাবে, কিন্তু সাধারণত এই খুব দরকারী যাহাই হউক না কেন নয়।
git status
git statusকমান্ড আসলে দুটি পৃথক চলমান করে কাজ করে git diffআপনার জন্য কমান্ড (এবং যেমন আপনি কহন যা শাখা তুমি আছো যেমন, কিছু অন্যান্য দরকারী স্টাফ করছেন)।
প্রথমটি git diffবর্তমান কমিটের সাথে তুলনা করে - যা মনে রাখবেন, সর্বকালের জন্য হিমায়িত — গিটের সূচীতে যা আছে তার সাথে। ফাইলগুলি একই রকমের জন্য , গিট মোটেও কিছুই বলবে না। পৃথক পৃথক ফাইলগুলির জন্য , গিট আপনাকে বলবে যে এই ফাইলটি প্রতিশ্রুতিবদ্ধ হওয়ার জন্য মঞ্চস্থ হয়েছে । এই সম্পূর্ণ নতুন ফাইল-যদি কমিট নেই অন্তর্ভুক্ত sub.pyতাতে কিন্তু সূচক নেই আছে sub.pyতাতে, তারপর এই ফাইল যোগ-এবং করা হয় যে কোন সরানো ফাইল, যে ছিল (এবং হয়) কমিট কিন্তু নয় এমন সূচকটি আর ( git rmসম্ভবত))
দ্বিতীয়টি git diffগিটের সূচীর সমস্ত ফাইলকে আপনার কার্য-গাছের ফাইলগুলির সাথে তুলনা করে। একই ফাইলগুলির জন্য , গিট কিছুই বলেন না। পৃথক পৃথক ফাইলগুলির জন্য , গিট আপনাকে বলবে যে এই ফাইলটি কমিট করার জন্য মঞ্চস্থ করা হয়নি । প্রথম ডিফের বিপরীতে, এই নির্দিষ্ট তালিকার মধ্যে সমস্ত নতুন ফাইল অন্তর্ভুক্ত নেই : যদি ফাইলটি untrackedআপনার কার্য-বৃক্ষে উপস্থিত থাকে তবে গিতের সূচীতে না থাকে, গিট কেবল এটি তালিকৃত ফাইলের তালিকায় যুক্ত করে । ঘ
শেষে, এই তালিকায় থাকা ফাইলগুলিকে একটি তালিকায় জমা করে, সেই ফাইলগুলির নামগুলিও git statusঘোষণা করবে , তবে একটি বিশেষ ব্যতিক্রম রয়েছে: যদি কোনও ফাইলের কোনও ফাইলের নাম তালিকাভুক্ত থাকে, যা এই শেষ তালিকাটিকে দমন করে। নোট করুন যে একটি ট্র্যাক করা ফাইল তালিকাবদ্ধ করা - এটি একটি গিটের সূচীতে index এখানে একটি কার্যকারিতা নেই : ফাইলটি সূচীতে রয়েছে, সুতরাং এটি তুলনা করা যায় এবং প্রতিশ্রুতিবদ্ধ হয়, এমনকি এটি তালিকাভুক্ত থাকলেও । উপেক্ষা করা ফাইলটি কেবল "অচিহ্নযুক্ত ফাইল" অভিযোগ দমন করে। ৫.gitignore.gitignore.gitignore
4git status - সংক্ষিপ্ত সংস্করণটি ব্যবহার করার সময় git status -suntঅনেকে তালিকৃত ফাইলগুলি পৃথকীকরণের মতো নয়, তবে নীতিটি একই। এই জাতীয় ফাইলগুলিকে একত্রিত করার সাথে সাথে git statusকেবল কখনও কখনও কেবল নামের নাম মুদ্রণের মাধ্যমে অবরুদ্ধ ফাইলগুলির নামের একগুচ্ছ সংক্ষিপ্তসার করতে দেয় । সম্পূর্ণ তালিকা পেতে, ব্যবহার করুন git status -uallবা git status -u।
5 একটি ফাইল তালিকাবদ্ধকরণ en-masse করে অনেকগুলি ফাইল ক্রিয়াকলাপকে যুক্ত করে git add .বা git add *অচিহ্নযুক্ত ফাইলটি এড়িয়ে যায়। এই অংশটি খানিকটা জটিল হয়ে যায়, যেহেতু আপনি git add --forceসাধারণত এমন একটি ফাইল যুক্ত করতে পারেন যা এড়ানো যায়। কিছু অন্যান্য সাধারণ-ছোটখাট বিশেষ কেস রয়েছে, এর সবগুলিই এটিকে যুক্ত করে: ফাইলটি .gitignoreআরও সঠিকভাবে বলা হতে পারে .git-do-not-complain-about-these-untracked-files-and-do-not-auto-add-themবা সমানভাবে অপ্রতিরোধ্য কিছু হতে পারে । তবে এটি খুব হাস্যকর, তাই .gitignoreএটি।
git add -u, git commit -aইত্যাদি
এখানে জানার জন্য বেশ কয়েকটি সহজ শর্টকাট রয়েছে:
git add .বর্তমান ডিরেক্টরি এবং যে কোনও উপ ডিরেক্টরিতে সমস্ত আপডেট হওয়া ফাইল যুক্ত করবে । এটি সম্মান করে .gitignore, সুতরাং বর্তমানে যদি একটি ফাইল যা তালিকার চিহ্নবিহীন রয়েছে তার অভিযোগ না করা হয় git status, তবে এটি স্বয়ংক্রিয়ভাবে যুক্ত হবে না।
git add -uআপনার কার্য-গাছের যে কোনও জায়গায় সমস্ত আপডেট হওয়া ফাইল স্বয়ংক্রিয়ভাবে যুক্ত করবে । 6 এটি কেবল ট্র্যাক করা ফাইলগুলিকেই প্রভাবিত করে। মনে রাখবেন যদি আপনি থাকেন মুছে কাজ-ট্রি কপি, এটাও সূচক কপি মুছে ফেলা হবে ( এই তার অংশ হিসেবে নেই করতে সূচক কাজ-ট্রি মেলে জিনিস)।git add
git add -Aএটি git add .আপনার কাজের গাছের শীর্ষ স্তর থেকে দৌড়ানোর মতো (তবে পাদটীকা 6 দেখুন)।
এগুলি ছাড়াও, আপনি দৌড়াতে পারেন git commit -aযা মোটামুটি 7 রান করার সমান git add -uএবং তারপরে git commit। যে, এটি আপনাকে একই আচরণ দেয় যা মার্চুরিয়ালে সুবিধাজনক।
আমি সাধারণত git commit -aপ্যাটার্নের বিপরীতে পরামর্শ দিই: আমি দেখতে পাই যে git statusপ্রায়শই ব্যবহার করা ভাল হয় , আউটপুটটি ঘনিষ্ঠভাবে লক্ষ্য করা যায় এবং যদি আপনি যেটা প্রত্যাশা করেননি স্ট্যাটাসটি যদি তা না হয় তবে এটি কেন ঘটেছে তা খুঁজে বের করুন। ব্যবহার করে git commit -a, দুর্ঘটনাক্রমে কোনও ফাইল সংশোধন করা এবং আপনি যে প্রতিশ্রুতিবদ্ধ হতে চাননি এমন পরিবর্তন প্রতিশ্রুতিবদ্ধ তা খুব সহজ। তবে এটি বেশিরভাগ স্বাদ / মতামতের বিষয়।
6 আপনার Git সংস্করণ চেয়েও পুরনো তাহলে গীত 2.0 সাবধান এখানে: git add -uশুধুমাত্র বর্তমান ডিরেক্টরি ও উপ-ডিরেক্টরির কাজ করে, যার ফলে আপনি আপনার কাজ-গাছের শীর্ষ স্তরের প্রথম আরোহণ উচিত নয়। git add -Aবিকল্প একটি অনুরূপ সমস্যা হয়েছে।
7 আমি মোটামুটি সমতুল্য বলি কারণ git commit -aএকটি অতিরিক্ত সূচক তৈরি করে এবং প্রতিশ্রুতিবদ্ধ করতে অন্য সূচকটি ব্যবহার করে বাস্তবে কাজ করে। যদি প্রতিশ্রুতি কাজ করে তবে আপনি যেমন করছেন তেমন প্রভাব পান git add -u && git commit। যদি প্রতিশ্রুতিটি কার্যকর না হয় - যদি আপনি গিটটি যে কোনওভাবেই এটি করতে পারেন — তাহলে কোনও ফাইলই git addপরে তৈরি করা হয় না, কারণ গিট অস্থায়ী অতিরিক্ত সূচকটি ফেলে দেয় এবং মূল সূচকটি ব্যবহার করে ফিরে যায় ।
আপনি যদি git commit --onlyএখানে ব্যবহার করেন তবে অতিরিক্ত জটিলতা রয়েছে । এই ক্ষেত্রে, গিট একটি তৃতীয় সূচক তৈরি করে এবং জিনিসগুলি খুব জটিল হয়, বিশেষত যদি আপনি প্রাক-প্রতিশ্রুতি হুক ব্যবহার করেন। এটি আলাদা git addঅপারেশন ব্যবহার করার অন্য কারণ reason