আমার মাস্টারকে কোনও পুরানো প্রতিশ্রুতিতে পরিবর্তন করতে চান, আমি এটি কীভাবে করব?


92

আমি কোনও পূর্বের প্রতিশ্রুতিতে রোলব্যাক করতে চাই এবং তারপরে সেই কোডটি প্রকাশ করব, তারপরে সর্বশেষ প্রতিশ্রুতিতে ফিরে যেতে চাই।

অর্থাত্ আমার মাস্টার একটি পুরানো কমিট সংস্করণটির দিকে ইঙ্গিত করছেন ঠিক সেভাবেই আমি সেই সংস্করণটি সজ্জিত করতে পারি, তারপরে আমি সর্বশেষ প্রতিশ্রুতিতে ফিরে যেতে চাই যা আমি প্রথমদিকে ছিলাম।

কিভাবে আমি এটি করতে পারব?

উত্তর:


100

আপনি যদি এটি করতে চান এবং মাস্টারটিকে আগের প্রতিশ্রুতিতে ফিরিয়ে দিন:

git checkout master~1            # Checkout previous commit on master
git checkout -b new_master       # Create branch for new master
git branch -D master             # Delete old master
git branch -mv new_master master # Make new_master master

বিকল্পভাবে:

git reset --hard master~1        # Reset current branch to one commit ago on master

4
সুতরাং এক বছর পরে আমি এটি তাকিয়ে দেখছি এবং এটি এটি করার একটি ভয়ঙ্কর উপায় thinking ওহ ভাল অন্তত এটি বুঝতে কিছুটা সহজ।
টাইলার ব্রক

4
হ্যাঁ এই কারণেই আমি উপবিষ্ট হই, সহজেই বুঝতে পারি, সম্ভবত আপনার আরও ভাল কোনও লিঙ্ক উপস্থাপন করা উচিত ছিল?
অ্যান্ড্রু অ্যাটকিনসন

4
সোর্স ট্রি ব্যবহার করে আমাকেও একই কাজ করতে হয়েছিল। প্রক্রিয়াটিও একই রকম। 1) বর্তমান প্রধান রাষ্ট্রের জন্য নতুন শাখা তৈরি করুন, যাতে আপনি কোনও কিছু হারাবেন না। 2) মাস্টার মোছা 3) কাঙ্ক্ষিত কমিট নির্বাচন করে নতুন মাস্টার শাখা তৈরি করুন
ড্যানিলো গোমেস

এর পরে মাস্টার থেকে আমরা "অপসারণ" হয়ে যাওয়ার প্রতিশ্রুতিতে কী ঘটে?
আর্থার কলম্বিনি গুসমো 14

4
আপনার যদি রিমোট রেপো থাকে তবে এড়ানো উচিত। এটি যদি আপনি করেন তবে কিছু ত্রুটি ঘটায় কারণ প্রথম মাস্টারের ঠিকানাটি আপনি সম্প্রতি যে নতুন মাস্টার তৈরি করেছেন তার চেয়ে আলাদা।
MAChitgarha

60

আপনার প্রশ্নটি অস্পষ্ট। আমি মনে করি আপনি যা চাইছেন তা হ'ল:

git push -f origin $old_commit_id:master

এটা কি করবে? এটা ধাক্কা হবে $old_commit_idকমিট originনতুন প্রধান হিসেবে originএর masterশাখা।

আপনি যদি যা চেয়েছিলেন এটি যদি হয় তবে আপনার স্থানীয় masterশাখাটি স্পর্শ করার দরকার নেই ।


এটি master (non-fast-forward)আমার জন্য একটি ব্যর্থতার কারণ হয়েছিল। @jtdubs সমাধান কাজ করেছে।
ববি নরটন

4
-fএটিকে বাধ্য করার জন্য কেবল পাস করুন - যদিও এটি নিষিদ্ধ করার জন্য দূরবর্তী রেপো কনফিগার করা যেতে পারে। আমি উত্তর আপডেট করেছি।
অ্যারিস্টটল পাগাল্টজিস

আমার পক্ষে কাজ করে না, স্বীকৃত উত্তরটি যদিও দেয়
মোবাইলমন

আপনি যা চেয়েছিলেন বা কেন এটি কাজ করে নি ঠিক তা আপনি বলেননি তাই কেন এটি হয়নি এবং কীভাবে এটি তৈরি করা যেতে পারে তা আমি বলতে পারি না (যদি এটি থাকতে পারে)।
অ্যারিস্টটল প্যাগাল্টজিস

আপনি এই পদ্ধতির সাথে রিমোটে অতীত ইতিহাস হারিয়েছেন বলে মনে হয়, এটা আমার পক্ষে ভাল ছিল। শুধু এটি কল করে।
শান

43

ব্যবহার git reset --hard <old commit number>

এটি হেডকে এই পুরানো প্রতিশ্রুতিতে পুনরায় সেট করবে।

এছাড়াও, আপনাকে git push -f originদূরবর্তী রেপোও পরিবর্তন করতে হবে।


34

আপনি যদি জোর চাপ দেওয়া এড়াতে চান তবে এখানে কীভাবে আপনার রেপোটিকে পুরানো প্রতিশ্রুতিতে ফিরিয়ে দেওয়া যায় এবং সমস্ত হস্তক্ষেপমূলক কাজ সংরক্ষণ করা যায়:

git checkout 307a5cd        # check out the commit that you want to reset to 
git checkout -b fixy        # create a branch named fixy to do the work
git merge -s ours master    # merge master's history without changing any files
git checkout master         # switch back to master
git merge fixy              # and merge in the fixed branch
git push                    # done, no need to force push!

সম্পন্ন! আপনার রেপোতে আপনি যা চান প্রতিশ্রুতি দিয়ে 307a5cd প্রতিস্থাপন করুন।

(আমি জানি প্রথম দুটি লাইন একত্রিত করা যেতে পারে, তবে আমি মনে করি এটি কী চলছে তা কম পরিষ্কার করে)

এখানে এটি গ্রাফিকালি:

c1 -- c2 -- c3 -- c4 -- c2' -- c5 ...
        \              /
         '------------'

আপনি কার্যকরভাবে সি 3 এবং সি 4 মুছে ফেলুন এবং আপনার প্রকল্পটিকে আবার সি 2 এ সেট করুন। তবে আপনি যদি আবার কখনও দেখতে চান তবে সি 3 এবং সি 4 এখনও আপনার প্রকল্পের ইতিহাসে উপলব্ধ।


4
এই কোনও বাধা ছাড়াই কাজ করেছে! যদি আপনি এই জায়গায় এসে পড়ে থাকেন এবং এটি পড়তে থাকেন - তবে এটি গভীর প্রতিশ্রুতিতে মাস্টারকে ফিরিয়ে আনার সবচেয়ে পরিষ্কার উপায়।
ddisqq

এর জন্য আমি আপনাকে কতটা ভালবাসি তা বোঝাতে আমি শব্দগুলি খুঁজে পাচ্ছি না, আমি এমন কোনও কিছু ঠিক করতে পেরেছি যা আমাকে এখন 6 ঘন্টা বাগিয়েছিল এবং আমাকে এত মাথা ব্যথার কারণ করেছিল। ধন্যবাদ জনাব!!!!!!!
কোস্তাস সাকালিদিস

9

যেমন একটি কমিট গ্রাফ ধরে:

| (A) ---------> (B) ----------> (C)
|                                 ^
|                              (master)

আপনি প্রথমে চেকআউট করতে masterএবং একটি শাখা তৈরি করতে চান যা masterবর্তমানে কোথায় রয়েছে তা নির্দেশ করে:

git checkout master
git branch pointer master

এখন এই মত চেহারা উচিত:

| (A) ---------> (B) ----------> (C)
|                                 ^
|                       (HEAD, master, pointer)

এখন আপনি ইতিমধ্যে চালু হয়ে গেছে master, আমরা masterশাখাটিকে একটি প্রতিশ্রুতি পিছনে সরিয়ে নিতে বলব :

git reset master~1

এখন, masterএকটি স্থান ফিরে সরিয়ে নেওয়া উচিত, তবে pointerশাখাটি এখনও সাম্প্রতিক প্রতিশ্রুতিতে রয়েছে:

| (A) ---------> (B) ----------> (C)
|                 ^               ^
|           (HEAD, master)    (pointer)

এই মুহুর্তে, আপনি masterকোনও দূরবর্তী স্থানে যেতে পারেন বা যেখানে যেখানেই থাকতে পারেন, তারপরে দ্রুত ফরোয়ার্ড এটিকে আবার pointerশাখায় মার্জ করুন । আপনি pointerএই সময়ে শাখাটি হত্যা করতে পারেন :

git push origin master
git merge --ff-only pointer
git branch -D pointer

ফাইনাল:

| (A) ---------> (B) ----------> (C)
|                 ^               ^
|         [ origin/master ]    (HEAD, master)

4
যদি উত্স / মাস্টার সি তে git push origin masterথাকে তবে আপনার বর্তমান শাখার ডগাটি এটির প্রত্যন্ত অংশের পিছনে রয়েছে । আপনার একটি -f পতাকাও পাস করা উচিত।
সাসোস্পিককো

8

আপনি ঠিক করতে পারেন git checkout <commit-id>, আপনাকে যা করতে হবে তা করতে পারেন, তারপরে git checkout masterনতুন কোডটিতে ফিরে যেতে।

পুরানো কোডটি প্রকাশ করার জন্য যদি আপনাকে সত্যই প্রয়োজন হয় তবে আপনার সম্ভবত হওয়া উচিত:

git checkout -b my_release <commit-id>
... prepare code for release ...
... release code ...
git checkout master
git merge my_release

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


1

পূর্ববর্তী সংস্করণে যেতে:

git checkout <version hash>

এখানে আপনার কাজ করুন এবং এটি দিয়ে প্রতিশ্রুতিবদ্ধ

git commit --amend

মাস্টারে ফিরে যেতে :

git checkout master


4
যে কাজ করবে না। git reset --hardপুরানো প্রতিশ্রুতি ফিরে তার মাস্টার শাখা নির্দেশ, তাই git checkout masterকিছুই করবে না।
jtdubs

সত্য, সংশোধনের জন্য ধন্যবাদ। আপনার কাছে +1, আমার উত্তরটিও সরিয়ে ফেলবে তবে আমি মনে করি commit --amendপদক্ষেপটি যথেষ্ট কার্যকর
পাবলো ফার্নান্দেজ

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