আমার মনে হয় এখানে আপনার মূল সমস্যাটি হ'ল আপনি ভুল ব্যাখ্যা করছেন এবং / অথবা গিট কী করে এবং কেন এটি করে তা ভুল বোঝাবুঝি।
আপনি যখন অন্য কোনও সংগ্রহস্থল ক্লোন করেন, গিট "ওদিকে" যা আছে তার একটি অনুলিপি তৈরি করে। এটি "তাদের" শাখার লেবেলগুলিও গ্রহণ করে, যেমন 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
উদাহরণস্বরূপ, আপনি একটি প্রতিশ্রুতি থেকে একটি নির্দিষ্ট ফাইল বাছাই করতে পারেন ,