গিট কেন আমার মাস্টার শাখাটি না থাকলেও "ইতিমধ্যে আপ টু ডেট" আছে?


118

বেসিক সমস্যা

আমি কেবলমাত্র আমার প্রকল্পের একটি ফাইল থেকে সমস্ত কোড মুছে ফেলেছি এবং আমার স্থানীয় গিটের (পরিবর্তিত উদ্দেশ্যে) প্রতিশ্রুতিবদ্ধ করেছি। আমি করেছিলাম

git pull upstream master

আপস্ট্রিম থেকে আনতে এবং মার্জ করতে (সুতরাং তত্ত্ব অনুসারে যে মোছা কোডটি ফিরে আসবে)।

গিট আমাকে বলে যে সবকিছু আপ টু ডেট।

সবকিছু অবশ্যই আপ টু ডেট নয় - সমস্ত মোছা কোডটি এখনও মুছে ফেলা হয়েছে।

অন্যান্য সম্পর্কিত তথ্য

আমার কেবল "মাস্টার" নামে একটি শাখা রয়েছে।

আমি সম্প্রতি এর মতো প্রবাহকে ট্র্যাক করতে "মাস্টার" সেট আপ করেছি:

প্রবাহ থেকে দূরবর্তী শাখা মাস্টার ট্র্যাক করার জন্য শাখা মাস্টার সেট আপ করা হয়েছে।

আদেশটি git branch -vvফল দেয়:

* master 7cfcb29 [upstream/master: ahead 9] deletion test

কেন এমন হচ্ছে কেন? আমি আমার প্রজেক্ট ম্যানেজারকে আমার কোডে আমি যে কোনও পরিবর্তন করি তা কেবল ইমেল করার প্রান্তে।

হালনাগাদ

আমি ভেবেছিলাম এটি সুস্পষ্ট, তবে যাইহোক এটি আমার লক্ষ্য:

আমার সিস্টেমে সবচেয়ে সাম্প্রতিক কোডটি পান।

এখানে আমার রাগ ক্ষমা করুন, তবে এত সাধারণ কাজটি কেন এত কঠিন হতে পারে?


1
এটা সুস্পষ্ট যে আপনি যদি আপনার উত্সটি মুছে ফেলে থাকেন তবে সরল "টান" দিয়ে টানতে চেষ্টা করুন যা গিটটি আপনার স্থানীয় পরিবর্তনগুলিকে ওভাররাইড করতে চায় না তা নিশ্চিত করেই আপনার স্থানীয় পরিবর্তনগুলি (এই ক্ষেত্রে আপনার মুছে ফেলা) ওভাররাইড করবে না। প্রথম উত্তরটি ঠিক কীভাবে আপনি এটি সম্পর্কে যেতে পারেন তা ব্যাখ্যা করে।
ক্যাশকো

উত্তর:


208

আমার মনে হয় এখানে আপনার মূল সমস্যাটি হ'ল আপনি ভুল ব্যাখ্যা করছেন এবং / অথবা গিট কী করে এবং কেন এটি করে তা ভুল বোঝাবুঝি।

আপনি যখন অন্য কোনও সংগ্রহস্থল ক্লোন করেন, গিট "ওদিকে" যা আছে তার একটি অনুলিপি তৈরি করে। এটি "তাদের" শাখার লেবেলগুলিও গ্রহণ করে, যেমন master, এবং সেই লেবেলের একটি অনুলিপি তৈরি করে যার আপনার গিট গাছে "সম্পূর্ণ নাম" (সাধারণত) remotes/origin/master(তবে আপনার ক্ষেত্রে, remotes/upstream/master)। বেশিরভাগ সময় আপনি সেই remotes/অংশটি বাদ দিতে পারেন, যাতে আপনি সেই মূল অনুলিপিটি হিসাবে উল্লেখ করতে পারেন upstream/master

আপনি যদি এখন কিছু ফাইল (গুলি) এর কিছু ফাইল (গুলি) করে এবং প্রতিশ্রুতিবদ্ধ হন তবে আপনি সেই পরিবর্তনগুলির সাথে একমাত্র হন। এদিকে অন্যান্য লোকেরা অন্যান্য ক্লোন তৈরি করতে এবং সেই ক্লোনগুলি পরিবর্তন করতে আসল সংগ্রহস্থল (যেখান থেকে আপনি আপনার ক্লোন তৈরি করেছিলেন) ব্যবহার করতে পারেন। অবশ্যই তাদের পরিবর্তনগুলি অবশ্যই তারাই। শেষ পর্যন্ত যদিও কারওর পরিবর্তিত পরিবর্তন হতে পারে তারা মূল মালিককে ("ধাক্কা" বা প্যাচগুলি বা যে কোনও কিছু দিয়ে) ফেরত পাঠায়।

git pullকমান্ড বেশিরভাগই ঠিক সাধারণভাবে সংক্ষেপে হয় git fetchদ্বারা অনুসরণ git merge। এটি গুরুত্বপূর্ণ কারণ এর অর্থ এই যে দুটি অপারেশন আসলে কী করে আপনার বুঝতে হবে।

দ্য git fetchকমান্ড আপনি যেখানেই থাকুন না থেকে ক্লোন (অথবা অন্যথায় থেকে সংগ্রহ করার স্থান হিসেবে স্থাপন করেছি) এবং "নতুন কাপড় অন্য কেউ যোগ অথবা পরিবর্তন করুন বা সরান" খুঁজে ফিরে যেতে বলেছেন। এই পরিবর্তনগুলি অনুলিপি করা হয় এবং আপনি তাদের কাছ থেকে যা পেয়েছিলেন তার অনুলিপিটিতে প্রয়োগ করা হয় । এগুলি আপনার নিজের কাজে প্রয়োগ করা হয় না , কেবল তাদের জন্য।

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

আপনি এখন যে পরিস্থিতিটির মুখোমুখি হচ্ছেন সেটি হ'ল আপনি যা পরিবর্তন করেছেন এবং তাদের প্রতিশ্রুতি দিয়েছেন - নয় বার, বাস্তবে, "এগিয়ে 9" - এবং তারা কোনও পদক্ষেপ নেননি পরিবর্তন করেন নি। সুতরাং, fetchকর্তব্যবশতভাবে কিছুই mergeএনেছে না এবং তারপরে তাদের অভাব-পরিবর্তনগুলি গ্রহণ করে এবং কিছুই করে না।

আপনি যা চান তা হ'ল কোডের সংস্করণ "তাদের" সংস্করণটি দেখতে বা সম্ভবত "রিসেট" করতে হবে।

আপনি যদি কেবল এটি দেখতে চান তবে আপনি কেবল সেই সংস্করণটি পরীক্ষা করে দেখতে পারেন:

git checkout upstream/master

এটি গিটকে বলে যে আপনি বর্তমান ডিরেক্টরিটি ব্রাঞ্চে স্থানান্তরিত করতে চান যার পুরো নাম প্রকৃতপক্ষে remotes/upstream/master। আপনি শেষ বার দৌড়ে যাওয়ার সময় হিসাবে তাদের কোড দেখতে পাবেনgit fetch এবং তাদের সর্বশেষতম কোডটি পেয়ে ।

আপনি যদি নিজের সমস্ত পরিবর্তন ত্যাগ করতে চান তবে আপনাকে যা করতে হবে তা হল গিটের ধারণাটি পরিবর্তন করা যা আপনার লেবেলটি পুনর্বিবেচনা masterকরবে, নাম দেওয়া উচিত name বর্তমানে এটি আপনার সাম্প্রতিক প্রতিশ্রুতিগুলির নাম দেয়। আপনি যদি সেই শাখায় ফিরে যান:

git checkout master

তারপরে git resetকমান্ডটি আপনাকে "লেবেলটি সরিয়ে ফেলতে" অনুমতি দেবে, যেমনটি ছিল। কেবলমাত্র অবশিষ্ট সমস্যা (ধরে নেওয়া উচিত যে আপনি যা কিছু করেছেন তা ত্যাগ করার জন্য আপনি সত্যই প্রস্তুত আছেন) লেবেলটি কোথায় নির্দেশ করা উচিত তা সন্ধান করছে।

git logআপনাকে সংখ্যাসূচক নামগুলি সন্ধান করতে দেবে — এই জিনিসগুলি যেমন 7cfcb29স্থায়ী (কখনই পরিবর্তন হয় না) এবং এগুলির নাম দেওয়ার জন্য অন্যান্য উপায়ের একটি হাস্যকর সংখ্যা রয়েছে তবে এই ক্ষেত্রে আপনি কেবল নামটি চান upstream/master

লেবেলটি সরাতে, আপনার নিজের পরিবর্তনগুলি মুছে ফেলুন (আপনি যে কোনও প্রতিশ্রুতি দিয়েছিলেন তা আসলে বেশ কিছু সময়ের জন্য পুনরুদ্ধারযোগ্য তবে এটির পরে এটি আরও শক্ততর তাই খুব নিশ্চিত হন):

git reset --hard upstream/master

--hardআপনি যা করছেন তা মুছে ফেলতে, বর্তমান শাখার লেবেলটি সরিয়ে ফেলুন এবং তারপরে প্রদত্ত প্রতিশ্রুতিটি দেখুন The

সত্যিই চাওয়া git reset --hardএবং একগুচ্ছ কাজ মুছে ফেলা খুব সাধারণ বিষয় নয় । একটি নিরাপদ পদ্ধতি (যদি আপনি সিদ্ধান্ত নেন যে এর কিছুটি সার্থক হয়েছিল তবে আপনি যদি সেই কাজটি পুনরুদ্ধার করা খুব সহজ করে তোলে) আপনার বিদ্যমান শাখার নাম পরিবর্তন করা:

git branch -m master bunchofhacks

এবং তারপরে masterসেই "ট্র্যাকস" নামে একটি নতুন স্থানীয় শাখা তৈরি করুন (আমি এই শব্দটিকে সত্যই পছন্দ করি না কারণ আমি মনে করি এটি মানুষকে বিভ্রান্ত করে তবে এটি গিট শব্দটি :-)) মূল (বা প্রবাহ) মাস্টার:

git branch -t master upstream/master

যার পরে আপনি নিজের সাথে এটি পেতে পারেন:

git checkout master

শেষ তিনটি কমান্ড কী করে (এটিতে কেবল দুটি কমান্ড তৈরি করার শর্টকাট রয়েছে) হ'ল বিদ্যমান লেবেলে আটকানো নাম পরিবর্তন করা, একটি নতুন লেবেল তৈরি করা, তারপরে এতে স্যুইচ করুন:

কিছু করার আগে:

C0 -    "remotes/upstream/master"
    \
     \- C1 --- C2 --- C3 --- C4 --- C5 --- C6 --- C7 --- C8 --- C9    "master"

পরে git branch -m:

C0 -    "remotes/upstream/master"
    \
     \- C1 --- C2 --- C3 --- C4 --- C5 --- C6 --- C7 --- C8 --- C9    "bunchofhacks"

পরে git branch -t master upstream/master:

C0 -    "remotes/upstream/master", "master"
    \
     \- C1 --- C2 --- C3 --- C4 --- C5 --- C6 --- C7 --- C8 --- C9    "bunchofhacks"

এখানে C0সর্বশেষ প্রতিশ্রুতি দেওয়া (একটি সম্পূর্ণ উত্স ট্রি) যা আপনি প্রথমটি করেছিলেন যখন আপনি পেয়েছিলেন git clone। সি 1 এর মাধ্যমে সি 1 আপনার কমিটগুলি।

মনে রাখবেন আপনি যদি git checkout bunchofhacksএবং তখন থাকেন তবে git reset --hard HEAD^^এটি শেষ ছবিটি এতে পরিবর্তন করবে:

C0 -    "remotes/upstream/master", "master"
    \
     \- C1 --- C2 --- C3 --- C4 --- C5 --- C6 --- C7 -    "bunchofhacks"
                                                      \
                                                       \- C8 --- C9

কারণটি হ'ল HEAD^^বর্তমান শাখার প্রধান থেকে পুনর্বিবেচনাটির নামকরণ (যা পুনরায় সেট করার ঠিক আগে bunchofhacks) এবং reset --hardতারপরে লেবেলটি সরিয়ে দেয়। কমিটস সি 8 এবং সি 9 এখন বেশিরভাগ অদৃশ্য (আপনি রিফ্লগের মতো জিনিসগুলি ব্যবহার করতে পারেন এবং সেগুলি সন্ধান করতে পারেন git fsckতবে এটি আর তুচ্ছ নয়)। আপনার লেবেলগুলি আপনার পছন্দ মতো সরিয়ে নেওয়ার জন্য আপনার। fetchকমান্ড বেশী যে দিয়ে শুরু যত্ন নেয় remotes/। এটি "তাদের" সাথে "নিজের" সাথে মিলিত হওয়ার জন্য প্রচলিত রয়েছে (সুতরাং তাদের যদি remotes/origin/mauveআপনার নামও থাকে mauveতবে) তবে আপনি যখনই নামটি দেখতে চান / "কমেন্টস" দেখতে চান তখনই আপনি "তাদের" টাইপ করতে পারেন। (মনে রাখবেন যে "একটি প্রতিশ্রুতিবদ্ধ" একটি সম্পূর্ণ উত্স ট্রি You git showউদাহরণস্বরূপ, আপনি একটি প্রতিশ্রুতি থেকে একটি নির্দিষ্ট ফাইল বাছাই করতে পারেন ,


12
আপনার চমৎকার উত্তর থেকে আমি অনেক কিছু শিখেছি। তবে আমি কেন এই গিট স্থিতি বার্তাটি পেয়েছি তা সম্পর্কে এখনও আমি বিভ্রান্ত: আমি গিট টান দিয়ে আপ টু ডেট পেতে পারি, তবে আমি কীভাবে জানব যে বার্তাটি আমি আপ টু ডেট করছি যদি আমাকে টানতে হবে?
ক্রিস্টোফার ভার্বি

@ ক্রিস্টোফারওয়ারবি: মনে হচ্ছে আপনি git mergeকমান্ড-লাইন কমান্ড হিসাবে চালাচ্ছেন (যা আমি নিজে যা করি এটি একটি যুক্তিযুক্ত পদ্ধতি)। দ্রষ্টব্য, যদিও এটি git pullপ্রথম চলমান দ্বারা শুরু হয় git fetch, তারপরে দৌড় git merge(বা git rebaseআপনি যদি এটি পরিবর্তে এটি করতে বলছেন)। এটি আনার পদক্ষেপ যা বাস্তবে একত্রিত হওয়ার জন্য নতুন প্রতিশ্রুতি নিয়ে আসে (বা কেবলমাত্র রিবেসড)।
টরেক

@ টোরেক ছাড়াও কি আরও কিছু কমান্ড রয়েছে git statusযা আমি দেখতে দেখতে ব্যবহার করতে পারি যে আপস্ট্রিম রেপো আমার বর্তমান রেপোর চেয়ে এগিয়ে আছে কিনা? আমি যে বার্তাটি পাই তার সাথে git statusবলা হয়েছে "" আপনার শাখাটি 'উত্স / মাস্টার' এর সাথে আপ-টু-ডেট রয়েছে "আমাকে এই ভেবে বিভ্রান্ত করে যে আমি সর্বশেষ পরিবর্তনগুলি পেয়েছি, যখন আমি না করি। কখনও কখনও, আমি একটি বার্তা পাই যা কিছু বলে যে "উত্স / মাস্টার আপনার শাখার আগে 5 কমিট" (প্যারাফ্রেসিং)। তবে এটি ধারাবাহিক নয়।
ক্রিস্টোফার ওয়ার্বি

1
এটি এখনও জবাব দেয় না কেন git status"আপনার শাখা আপ টু ডেট" বলে যখন তখনই তাত্ক্ষণিকভাবে git fetchএকটি শতাধিক বস্তু নিচে টান দেয় এবং প্রায় শতাধিক ডেল্টা সমাধান করে, বেশ কয়েকটি নতুন শাখা এবং কয়েকটি নতুন ট্যাগ উল্লেখ করে এবং মূলটি (দূরবর্তী) পরিবর্তন করে ট্র্যাকিং) শাখা প্রধান প্রতিশ্রুতিবদ্ধ - এবং তারপরে আরও একটি গিটের অবস্থা প্রফুল্লভাবে, এবং স্বল্পতার সাথে এখনও বলেছে "আপনার শাখা আপ টু ডেট"। স্পষ্টতই উত্স থেকে অনেকটা নেমে এসেছিল তবে শাখাটি "উত্সের সাথে আধুনিকীকরণের" আগে এবং পরে উভয়ই ছিল?
নীলজি

1
git pullরান git fetchপ্রথম, তারপর git merge(অথবা আপনার পছন্দের অন্যান্য দ্বিতীয় কমান্ড)। git fetchধাপ আপডেট আপনার এর গীত স্মৃতিতে তাদের আপ কল করে গীত স্থিতি তাদের গীত এবং তাদের থেকে নতুন কিছু পেয়ে। আপনি git statusকেবল তাদের গিটের গিটের স্মৃতি চেক করেন।
torek

18

আপনার মতো সমস্যাও আমার ছিল।

আমি করেছি git status git fetch git pull, তবে আমার শাখাটি এখনও উত্সের পিছনে ছিল। আমার ফোল্ডার এবং ফাইলগুলি রিমোটে ঠেলেছিল এবং আমি ওয়েবে ফাইলগুলি দেখেছি, তবে আমার লোকালগুলিতে সেগুলি অনুপস্থিত ছিল।

অবশেষে, এই আদেশগুলি আমার স্থানীয় সমস্ত ফাইল এবং ফোল্ডার আপডেট করেছে:

git fetch --all
git reset --hard origin/master 

অথবা আপনি যদি একটি শাখা চান

git checkout your_branch_name_here
git reset --hard origin/your_branch_name_here

1
ধন্যবাদ! এটি আসলে কাজ করে। মনে রাখবেন যে শাখার নামগুলি কেস সংবেদনশীল!
আন্দ্রে র্যামন

4

আপনার সমস্ত প্রকল্প ফাইল মুছে ফেলার মতো আপনি যে কোনও পরিবর্তন করেন তা এখনও একটি টানার পরে থাকবে। সমস্ত টানই অন্য কোথাও থেকে সর্বশেষ পরিবর্তনগুলি আপনার নিজস্ব শাখায় মার্জ করা হবে এবং যদি আপনার শাখাটি সমস্ত কিছু মুছে ফেলেছে তবে সর্বোপরি আপনি যখন মুছে ফেলা ফাইলগুলিকে প্রভাবিত করবেন তখন সর্বোত্তমভাবে আপনি মার্জ সংঘাত পেয়ে যাবেন। সুতরাং, সংক্ষেপে, হ্যাঁ সবকিছু আপ টু ডেট।

"সমস্ত ফাইল মুছে ফেলা" এর পরিবর্তে আপনি কী পরিণতি পেতে চান তা যদি আপনি বর্ণনা করেন তবে হয়ত কেউ উপযুক্ত ক্রিয়াকলাপের পরামর্শ দিতে পারে।

হালনাগাদ:

আমার সিস্টেমে কোডটির সর্বাধিক ব্যয় পান

আপনি যা বোঝেন বলে মনে হয় না তা হল আপনার কাছে ইতিমধ্যে অতি সাম্প্রতিক কোড রয়েছে যা আপনার। আপনি যদি সত্যিই যা চান তা হ'ল মাস্টার ব্রাঞ্চে অন্য কারও কাজের সাম্প্রতিকতম কাজটি দেখার জন্য, কেবলমাত্র:

git fetch upstream
git checkout upstream/master

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


আমি আসলে আমার সিস্টেমে অন্য কারও কোডের সাম্প্রতিকতম সংস্করণটি চাই। যাইহোক, এই দুটি কমান্ড এটি করেনি। আমি যা পাই তা সবই "ইতোমধ্যে ব্রাঞ্চ মাস্টারে"। আমার ফাইলগুলির কোডটি অন্য ব্যক্তির কোডকে প্রতিফলিত করে না।
ব্যবহারকারী 1971506

দুঃখিত, করা উচিত ছিল upstream/master। আমার উত্তর আপডেট।
রায়ান স্টুয়ার্ট

3

অন্য পোস্টারগুলির হিসাবে, টান আপ স্ট্রিম থেকে আপনার ভান্ডারগুলিতে পরিবর্তনগুলি মার্জ করে। আপনি যদি আপনার ভাণ্ডারে থাকা জিনিসটিকে উজানের প্রবাহের সাথে প্রতিস্থাপন করতে চান তবে আপনার কাছে বেশ কয়েকটি বিকল্প রয়েছে। কাফ বন্ধ, আমি সঙ্গে যেতে হবে

git checkout HEAD^1  # Get off your repo's master.. doesn't matter where you go, so just go back one commit
git branch -d master  # Delete your repo's master branch
git checkout -t upstream/master  # Check out upstream's master into a local tracking branch of the same name

1

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

  1. মাস্টারে স্যুইচ করুন

    $ git checkout upstream master
    
  2. আপনার অযাচিত শাখা মুছুন। (দ্রষ্টব্য: এটি অবশ্যই স্বাভাবিক-ডি পতাকার পরিবর্তে -D থাকতে হবে কারণ আপনার শাখাটি মাস্টারের আগে অনেক কমিট করে its)

    $ git branch -d <branch_name>
    
  3. একটি নতুন শাখা তৈরি করুন

    $ git checkout -b <new_branch_name>
    

1

যদিও এই উত্তরগুলির কোনওটিই আমার পক্ষে কার্যকর হয়নি, আমি নিম্নলিখিত কমান্ডটি ব্যবহার করে সমস্যাটি সমাধান করতে সক্ষম হয়েছি।

git fetch origin

এটি আমার জন্য একটি কৌশল করেছে।


0

শুধু একটি বন্ধুত্বপূর্ণ অনুস্মারক যদি আপনি ফাইল স্থানীয়ভাবে যে GitHub নেই আছে এবং এখনও আপনার git statusবলছেন

আপনার শাখা 'উত্স / মাস্টার' দিয়ে আপ টু ডেট। কিছুই করার নেই, পরিশ্রমী গাছ পরিষ্কার

ফাইলগুলি থাকলে এটি ঘটতে পারে .gitignore

চালানোর চেষ্টা করুন

cat .gitignore 

এবং এই ফাইলগুলি সেখানে প্রদর্শিত হবে কিনা তা দেখে। এটি ব্যাখ্যা করবে কেন গিট তাদেরকে রিমোটে স্থানান্তর করতে চায় না।

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