কীভাবে তারিখে গিটে চেকআউট করবেন?


314

আমি সোর্স কোডে একটি রিগ্রেশন নিয়ে কাজ করছি। আমি গিটকে বলতে চাই: "প্যারামিটারাইজড তারিখ / সময়ের ভিত্তিতে উত্সটি চেকআউট করুন"। এটা কি সম্ভব?

আমি আমার বর্তমান দৃশ্যে এমন পরিবর্তনও করেছি যা আমি হারাতে চাই না। আদর্শভাবে, আমি বর্তমান উত্সের মধ্যে এবং পিছনে টগল করতে চাই এবং কিছু সংস্করণ আমি আগের তারিখের ভিত্তিতে আগ্রহী interested


9
যদি আপনি এটি সম্পর্কে জানেন না, তবে গিট বিসেক্টটি রিগ্রেশনগুলি সন্ধানের জন্য দুর্দান্ত। আমি বলব, অ্যান্ডির বলে মত} 1 বছর পূর্বে} সিনট্যাক্সটি ব্যবহার করুন, একটি জ্ঞাত-ভাল প্রতিশ্রুতি সন্ধান করতে, তারপর এটিটিকে আপনার প্রাথমিক git bisect goodবিন্দু হিসাবে ব্যবহার করুন ।
ম্যাট্রিক্সফ্রাগ

আমি মনে করি এটি ভাল ব্যবহারের ক্ষেত্রে tags
জেস

উত্তর:


365

আপনার বর্তমান পরিবর্তনগুলি রাখা

আপনি আপনার কাজ দূরে stashed রাখতে পারবেন না, এটা commiting ছাড়াই git stash। আপনি git stash popএটি ফিরে পেতে ব্যবহার করতে চাই। অথবা আপনি ( Carleeto বলেছিলেন) git commitএটি একটি পৃথক শাখায় করতে পারেন।

রেভ-পার্স ব্যবহার করে তারিখ অনুসারে চেকআউট

আপনি এটি ব্যবহার করে নির্দিষ্ট তারিখের মাধ্যমে একটি প্রতিশ্রুতি চেকআউট করতে পারেন rev-parse:

git checkout 'master@{1979-02-26 18:30:00}'

উপলব্ধ বিকল্পগুলি সম্পর্কে আরও বিশদটি পাওয়া যাবে git-rev-parse

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

রেভ-তালিকা ব্যবহার করে তারিখ অনুসারে চেকআউট করুন

অন্য বিকল্পটি, যা রিফ্লগ ব্যবহার করে না, তা হল নির্দিষ্ট সময়টিতে প্রতিশ্রুতি অর্জনের জন্য ব্যবহার rev-listকরা:

git checkout `git rev-list -n 1 --first-parent --before="2009-07-27 13:37" master`

যদি আপনি কেবল নিজের ইতিহাস চান এবং কোনও সংশ্লেষ দ্বারা আনা সংস্করণগুলি না চান তবে - প্রথম-পিতামাতার নোট করুন । আপনি সাধারণত এটি চান


2
@ রকি আপনি কি আমাদের আরও বিস্তারিত রকি দিতে পারেন? আপনি কমান্ড লাইনে কী প্রবেশ করছেন এবং আপনি কেন বলছেন যে এটি কাজ করছে না? আপনি একটি ত্রুটির বার্তা পাচ্ছেন?
অ্যান্ডি

8
@ রকি: সমস্যাটি হ'ল প্যারামিটারটি উদ্ধৃতিতে আবদ্ধ হওয়া দরকার, অন্যথায় বাশ স্পেসে যুক্তিগুলি পৃথক করে। ব্যবহার করে দেখুন git co 'master@{2 days ago}'
মার্ক ওয়াইল্ডেন

13
দ্রষ্টব্য: আপনি কতটা পিছনে যাবেন তার উপর নির্ভর করে এটি কাজ করতে পারে না কারণ এটি রিফলগ ব্যবহার করে (যা কিছু সময়ের পরে শেষ হয়)। আপনি দেখতে পাবেন 'সতর্কতা:' মাস্টার 'এর জন্য লগইন কেবল ফিরে যায় ...'। রকির সমাধানটি সর্বদা কাজ করবে। গিট চেকআউটgit rev-list -n 1 --before="2009-07-27 13:37" master
নদিগ

3
আমি আপনার উত্তরটি সম্পাদনা করেছি কারণ ব্যাকটিকগুলি অবচিত এবং পড়া কঠিন। সাবসেলগুলি $(...)পছন্দসই।
আমেদী ভ্যান গ্যাস

1
@ অ্যান্ডি 40 তম জন্মদিনে শুভ, অ্যান্ডি! (ধরে নিলাম 1979-02-26 এর অর্থ যা ছিল :))
ডেভিড

122

অ্যান্ডির সমাধান আমার পক্ষে কাজ করে না। এখানে আমি অন্য উপায় খুঁজে পেয়েছি:

git checkout `git rev-list -n 1 --before="2009-07-27 13:37" master`

গিট: তারিখ অনুসারে চেকআউট


3
যখন আমি উপরের কমান্ডটি কার্যকর করি তখন আমি error: unknown switch `n'কীভাবে কোনও ধারণা পেতে পারি এটি কীভাবে পেতে পারি?
টিম

15

দেখে মনে হচ্ছে আপনার এই লাইনের সাথে কিছু দরকার: তারিখের ভিত্তিতে গিট চেকআউট

অন্য কথায়, আপনি rev-listপ্রতিশ্রুতি সন্ধান করতে এবং তারপর এটি পেতে চেকআউট ব্যবহার করেন use

আপনি যদি নিজের পর্যায়িত পরিবর্তনগুলি হারাতে না চান তবে সবচেয়ে সহজ জিনিসটি হ'ল একটি নতুন শাখা তৈরি করা এবং তাদের সেই শাখায় প্রতিশ্রুতিবদ্ধ করা। আপনি সবসময় শাখাগুলির মধ্যে পিছনে পিছনে স্যুইচ করতে পারেন।

সম্পাদনা করুন: লিঙ্কটি নিচে রয়েছে, সুতরাং আদেশটি এখানে:

git checkout `git rev-list -n 1 --before="2009-07-27 13:37" master`

2
দুর্দান্ত লিঙ্ক! তাই git checkout branch@{date}স্টপ কাজ যখন reflog মেয়াদ শেষ, কিন্তু আপনি ব্যবহার করতে পারেন git checkout `git rev-list -n 1 --before="2009-07-27 13:37" master`
cdunn2001


9

আমার ক্ষেত্রে -n 1বিকল্পটি কাজ করে না। উইন্ডোজে আমি খুঁজে পেয়েছি যে কমান্ডগুলির নিম্নলিখিত ক্রমটি ভাল কাজ করে:

git rev-list -1 --before="2012-01-15 12:00" master

এটি প্রদত্ত তারিখের জন্য উপযুক্ত কমিটের এসএইচএ প্রদান করে এবং তারপরে:

git checkout SHA

4

git rev-parseসমাধান @Andy দ্বারা প্রস্তাবিত কাজ করে জরিমানা যদি তারিখ আপনি আগ্রহী হয় কমিট তারিখ । যদি তবে আপনি এর উপর ভিত্তি করে চেকআউট করতে চান লেখকের তারিখ , rev-parseকাজ না, কারণ এটি একটি বিকল্প অফার করে না এই তারিখের করে নির্বাচনের জন্য ব্যবহার করতে হবে। পরিবর্তে, আপনি নিম্নলিখিত ব্যবহার করতে পারেন।

git checkout $(
  git log --reverse --author-date-order --pretty=format:'%ai %H' master |
  awk '{hash = $4} $1 >= "2016-04-12" {print hash; exit 0 }
)

(আপনি যদি এইজ প্রিকেক্টে সময় ব্যবহার নির্দিষ্ট করতে চান $1 >= "2016-04-12" && $2 >= "11:37"তবে ।)


3

rev-listবিকল্পটির সাথে আরও এগিয়ে যেতে চাইলে আপনি যদি সর্বাধিক সাম্প্রতিকতম সংজ্ঞাটি আপনার মাস্টার শাখা থেকে আপনার উত্পাদন শাখায় (খাঁটি অনুমানমূলক উদাহরণ হিসাবে) সন্ধান করতে চান:

git checkout `git rev-list -n 1 --merges --first-parent --before="2012-01-01" production`

আমার একটি নির্দিষ্ট তারিখ হিসাবে প্রডাকশন সার্ভারে থাকা কোডটি সন্ধান করা দরকার। এটি আমার জন্য এটি খুঁজে পেয়েছে।


2

আপনি কোনও বিল্ড করার সময় আপনি যদি সংগ্রহস্থলের সুনির্দিষ্ট সংস্করণে ফিরে আসতে সক্ষম হতে চান তবে আপনি যে কমিটটি থেকে বিল্ডটি তৈরি করেন তা ট্যাগ করা ভাল।

অন্যান্য উত্তরগুলি নির্দিষ্ট সময়ের মতো একটি শাখায় সর্বাধিক সাম্প্রতিক প্রতিশ্রুতিতে সংগ্রহস্থল ফেরত দেওয়ার কৌশল সরবরাহ করে - তবে সেগুলি সর্বদা যথেষ্ট না। উদাহরণস্বরূপ, আপনি যদি একটি শাখা থেকে তৈরি করেন, এবং পরে শাখাটি মুছে ফেলেন বা একটি শাখা যা পরে পুনর্বাসিত করা হয় সেগুলি তৈরি করে, আপনি যে কমিটটি তৈরি করেছেন তা কোনও বর্তমান শাখা থেকে গিটে "পৌঁছনীয়" হয়ে উঠতে পারে। সংগ্রহস্থলটি সংক্ষিপ্ত করা হলে গিটের অলঙ্ঘনযোগ্য অবজেক্টগুলি অবশেষে অপসারণ করা যেতে পারে।

প্রতিশ্রুতিতে একটি ট্যাগ রাখার অর্থ এটি কখনই অ্যাক্সেসযোগ্য হয় না, এর পরে আপনি শাখাগুলি দিয়ে যা করেন তা নয় (ট্যাগটি সরিয়ে বাদ দিয়ে)।


যদিও এটি আমার কাছে সন্ধান করা উত্তরটি দেয় না, তবে এখনও অবধি উল্লেখ করা হয়নি এমন দিকটি উল্লেখ করার জন্য এটি একটি ভাল উল্লেখের দাবিদার। এটি সমস্যার উত্স হতে পারে যা আপনাকে সঠিক সংস্করণে পৌঁছাতে বাধা দেয়।
ম্যানুয়েলভিগার্চিয়া

1
git rev-list -n 1 --before="2009-07-27 13:37" origin/master

মুদ্রিত স্ট্রিং নিন (উদাহরণস্বরূপ XXXX) এবং করুন:

git checkout XXXX

2
এটি কি @ বার্টোসজেকপি উত্তরের সদৃশ নয়? শুধুমাত্র উত্সের রেফারেন্স যুক্ত করা, অন্য উত্তরের একটি মন্তব্য হওয়া উচিত ...
ম্যানুয়েলভিগার্চিয়া

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