গিটের সাম্প্রতিক সংস্করণে কীভাবে ফিরে আসবেন?


303

আমি সম্প্রতি এসভিএন থেকে গিতে চলে এসেছি এবং কিছু সম্পর্কে কিছুটা বিভ্রান্ত হয়ে পড়েছি। আমার কোনও স্ক্রিপ্টের পূর্ববর্তী সংস্করণটি একটি ডিবাগারের মাধ্যমে চালানো দরকার, তাই আমার git checkout <previous version hash>যা করা দরকার তা করেছি এবং করেছি।

এখন আমি নতুন সংস্করণে ফিরে যেতে চাই, তবে আমি এটির জন্য হ্যাশ জানি না। আমি যখন টাইপ করি তখন git logতা দেখতে পাই না।

কিভাবে আমি এটি করতে পারব? এছাড়াও, হ্যাশগুলি লিখে টাইপ করার চেয়ে সংস্করণগুলি পরিবর্তনের আরও সহজ কোনও উপায় রয়েছে - "দুটি সংস্করণ ফিরে যান" বা "সবচেয়ে কালানুক্রমিকভাবে সাম্প্রতিককালে যান" এর মতো কিছু?

উত্তর:


371

git checkout masterকৌতুক করা উচিত। দুটি সংস্করণ ফিরে যেতে, আপনি এর মতো কিছু বলতে পারেন git checkout HEAD~2, তবে সেই সময়ের উপর ভিত্তি করে একটি অস্থায়ী শাখা তৈরি করা ভালgit checkout -b temp_branch HEAD~2


7
শান্ত! git checkout masterঠিক কিভাবে আমি একটি শাখা থেকে ফিরে। সুতরাং এর মানে কি এই নয় যে আমি যখন পূর্ববর্তী সংস্করণটি পরীক্ষা করে দেখি, আমি মূলত একটি শাখা তৈরি করছি?
নাথান লং

4
@ নাথান: গিটের মধ্যে একটি শাখা সত্যিকার অর্থে বেশিরভাগ নির্দিষ্ট সংশোধনের দিকে চলমান পয়েন্টার। সুতরাং ধারণাগতভাবে, আপনি একটি শাখা তৈরির সাজানোর কাজ করছেন, কিন্তু এই অর্থে নয় যে গিট শাখাগুলি সম্পর্কে চিন্তা করে।
ডিএলএইচ

2
সহজতম ক্ষেত্রে, যেখানে আমি একগুচ্ছ রৈখিক পরিবর্তন পেয়েছি, যখন আমি পূর্ববর্তী সংশোধনটি চেকআউট করি, আমি সেখানে হেড পয়েন্টারটি সরিয়ে নিয়ে যাচ্ছি যার অর্থ git logসেই বিন্দুটির তুলনায় প্রদর্শিত হবে? এবং আমি যখন মাস্টার চেকআউট করব, আমি পয়েন্টারটি মাস্টার শাখার সর্বশেষ সংস্করণে সরিয়ে দেব?
নাথান লং

7
@ নাথান: হুবহু শিরোনামকে প্রতীকী রেফ বলা হয় - এটি সাধারণত অন্য রেফের কাছে পয়েন্টার (বর্তমানে পরীক্ষা করা শাখা)। git checkoutহেডকে চারপাশে সরানোর এক উপায়। আপনি যখন হেডকে আলাদা করেন, আপনি সরাসরি প্রদত্ত প্রতিশ্রুতিতে এটি নির্দেশ করেছেন; আপনি আবার মাস্টার পরীক্ষা করে যখন এটি মাস্টার ফিরে। (এবং অনেকগুলি কমান্ডের মতো git logআসলে একটি সংশোধনী পরিসীমা নেওয়া হয় যা হেডের ডিফল্ট হয়))
ক্যাসাবেল

3
হ্যাঁ - হেড হ'ল "সর্বনাম" যা "কার্যকরী ডিরেক্টরিতে থাকা কোডটির সংস্করণ" উল্লেখ করতে ব্যবহৃত হয়। এটি "আপনি পরবর্তী যে প্রতিশ্রুতিবদ্ধ তার পিতামাতা"
আনা বেটস

54

আপনি যখন নির্দিষ্ট প্রতিশ্রুতিতে চেকআউট করেন, গিটটি একটি বিচ্ছিন্ন শাখা তৈরি করে। সুতরাং, যদি আপনি কল করেন:

$ git branch 

আপনি এরকম কিছু দেখতে পাবেন:

* (detached from 3i4j25)
  master
  other_branch

মাস্টার ব্রাঞ্চের মাথায় ফিরে আসতে আপনাকে আবার আপনার মাস্টার শাখায় চেকআউট করতে হবে:

$ git checkout master

এই কমান্ডটি স্বয়ংক্রিয়ভাবে বিচ্ছিন্ন শাখাটি মুছে ফেলবে।

যদি git checkoutকাজ না করে আপনি সম্ভবত শাখাগুলির মধ্যে বিরোধী ফাইলগুলি সংশোধন করেছেন। কোড গিটটি হারাতে আপনাকে রোধ করতে আপনার এই ফাইলগুলি মোকাবেলা করতে হবে। আপনার কাছে তিনটি বিকল্প রয়েছে:

  1. আপনার পরিবর্তনগুলি সংরক্ষণ করুন (আপনি এগুলি পরে পপ করতে পারেন):

    $ git stash
    
  2. বিচ্ছিন্ন শাখাকে পুনরায় সেট করে পরিবর্তনগুলি বাতিল করুন:

    $ git reset --hard
    
  3. পূর্ববর্তী পরিবর্তনগুলি সহ একটি নতুন শাখা তৈরি করুন এবং তাদের প্রতিশ্রুতিবদ্ধ:

    $ git checkout -b my_new_branch
    $ git add my_file.ext
    $ git commit -m "My cool msg"
    

এর পরে আপনি আপনার মাস্টার শাখায় ফিরে যেতে পারেন (অতি সাম্প্রতিক সংস্করণ):

$ git checkout master

36

এটি আমার জন্য কৌশলটি করেছে (আমি এখনও মাস্টার শাখায় ছিলাম):

git reset --hard origin/master

34
পুনরায় সেট করুন - হাড় একটি ওভারকিল এবং এটি দেখায় যে আপনি যে পরিবর্তনগুলি করেছেন সে সম্পর্কে আপনি অবগত নন। এর ফলে এটি কোড হারাতে পারে।
থোমিও

1
আমার ক্ষেত্রে আমি দুর্ঘটনাক্রমে প্রতিশ্রুতিবদ্ধ পরিবর্তনগুলি থেকে মুক্তি পেতে চেয়েছিলাম। আমি জানি যে এটি অর্জনের জন্য অন্যান্য পদ্ধতিও থাকতে পারে। আমি সম্মত হন যদি আপনি আপনার চাপমুক্ত প্রতিশ্রুতিবদ্ধ পরিবর্তনগুলি আলগা করতে না চান তবে এটি ডেটা হ্রাস।
সিএসবা তোথ


7

আপনি একটি জিনিসের জন্য শাখার নাম ব্যবহার করে চেক আউট করতে পারেন।

আমি জানি হেডকে চারপাশে সরানোর বিভিন্ন উপায় রয়েছে তবে আমি তাদের গণনার জন্য এটিকে গিট বিশেষজ্ঞের কাছে রেখে দেব।

আমি কেবল প্রস্তাব দিতে চেয়েছিলাম gitk --all- গিট দিয়ে শুরু করার সময় আমি এটি অত্যন্ত সহায়ক বলে মনে করেছি।


7

আমি শুধু Git গভীরে শুরু করছি, তাই নিশ্চিত না হলে আমি সঠিকভাবে বুঝি, কিন্তু আমি মনে করি ওপি প্রশ্নের সঠিক উত্তর যে আপনি চালাতে পারেন হয় git log --allএই মত একটি বিন্যাসে স্পেসিফিকেশনের সঙ্গে: git log --all --pretty=format:'%h: %s %d'। এটি বর্তমানের চেক আউট সংস্করণটিকে চিহ্নিত করে (HEAD)এবং আপনি কেবলমাত্র তালিকা থেকে পরবর্তীটি দখল করতে পারেন।

বিটিডাব্লু, আপনার .gitconfigআরও কিছুটা ভাল বিন্যাসের সাথে একটি উপনাম যুক্ত করুন এবং আপনি চালাতে পারেন git hist --all:

  hist = log --pretty=format:\"%h %ai | %s%d [%an]\" --graph

আপেক্ষিক সংস্করণগুলি সম্পর্কে, আমি এই পোস্টটি পেয়েছি , তবে এটি কেবল পুরানো সংস্করণ সম্পর্কে কথা বলে, সম্ভবত নতুন সংস্করণগুলি উল্লেখ করার মতো কিছুই নেই।


6

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

git checkout -

আপনাকে সেই শাখায় ফিরিয়ে আনবে যা আপনি আগে ছিলেন (তা নির্বিশেষে তারা মাস্টার ছিলেন বা না)।


কোনও শাখার প্রয়োজন নেই, এটি হেডকে নির্দেশ করবে যেখানে এটি আগে নির্দেশ করেছিল; যদি তুমি করেছ git checkout hash2পর git checkout hash1, git checkout -তোমার কাছে ফিরে নিতে হবে hash1
মিখাইল ভাসিন

3

আপনি যখন আগের সংস্করণে ফিরে যান,

$ git checkout HEAD~2
Previous HEAD position was 363a8d7... Fixed a bug #32

আপনি এই পরিস্থিতিতে এই কমান্ড দিয়ে আপনার বৈশিষ্ট্য লগ (হ্যাশ) দেখতে পারেন;

$ git log master --oneline -5
4b5f9c2 Fixed a bug #34
9820632 Fixed a bug #33
...

master অন্য শাখার নাম দিয়ে প্রতিস্থাপন করা যেতে পারে।

তারপরে এটি চেকআউট করুন, আপনি ফিচারটিতে ফিরে আসতে সক্ষম হবেন।

$ git checkout 4b5f9c2
HEAD is now at 4b5f9c2... Fixed a bug #34

1

গিট 2.23+ (আগস্ট 2019) এর সাথে, বিভ্রান্তিরgit switch পরিবর্তে ব্যবহার করা ভাল অনুশীলনgit checkout আদেশের ।

পুরানো সংস্করণের উপর ভিত্তি করে একটি নতুন শাখা তৈরি করতে:

git switch -c temp_branch HEAD~2

বর্তমান মাস্টার শাখায় ফিরে যেতে:

git switch master

0

আরও মার্জিত এবং সহজ সমাধান ব্যবহার করা হয়

git stash

এটি শাখার সর্বাধিক ক্ষোভের স্থানীয় সংস্করণে ফিরে আসবে এবং আপনার পরিবর্তনগুলি স্ট্যাশগুলিতেও সংরক্ষণ করবে, তাই আপনি যদি এই ক্রিয়াটি পূর্বাবস্থায় ফিরিয়ে নিতে চান তবে:

git stash apply

আমি জানি এটি অনেক পুরানো তবে আমাকে এ সম্পর্কে একটি মন্তব্য করতে হবে (যেহেতু আমি মনে করি যে এই সমাধানটি ব্যবহার করা উচিত নয়) - আমি এই সমাধানটি ব্যবহার করব না কারণ এটি এই সমস্যার সমাধান করে না তবে একটি ভিন্ন সমস্যা। এই স্ট্যাশ সমাধানের সাথে প্রতিবার যখন আপনি পূর্বের প্রতিশ্রুতিতে চেকআউট করতে চান আপনি আসলে "সংরক্ষণ" ডেটা যা এই ক্ষেত্রে খুব অপ্রয়োজনীয়। সঠিক এবং আরও মার্জিত উপায় হ'ল <ব্র্যাঙ্ক> চেকআউট করা (যেমন আগে বলা হয়েছে)।
মায়াও
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.