একাধিক গিট কমিটস কীভাবে ফিরে যাবে?


981

আমার কাছে গিটের সংগ্রহস্থল রয়েছে যা দেখতে এটির মতো দেখাচ্ছে:

A -> B -> C -> D -> HEAD

আমি শাখার প্রধানকে A তে নির্দেশ করতে চাই, আমি চাই বি, সি, ডি, এবং হেড অদৃশ্য হয়ে যায় এবং আমি মাথাটি এ এর ​​সমার্থক হতে চাই want

মনে হচ্ছে আমি হয় পুনরায় রিবেস করার চেষ্টা করতে পারি (প্রযোজ্য হয় না, যেহেতু আমি এর মধ্যে পরিবর্তনগুলি ঠেলে দিয়েছি) বা প্রত্যাবর্তন করতে পারি। তবে আমি কীভাবে একাধিক প্রতিশ্রুতি ফিরিয়ে দেব? আমি কি একবারে একটিকে ফিরিয়ে দেব? আদেশ কি গুরুত্বপূর্ণ?


3
আপনি যদি কেবল রিমোটটি পুনরায় সেট করতে চান তবে আপনি যেকোন কিছু দিয়ে এটি ক্লোবার করতে পারেন! তবে আসুন আমরা চতুর্থ প্রতিশ্রুতিটি আগে ব্যবহার করি: git push -f HEAD~4:master(দূরবর্তী শাখাটি মাস্টার হিসাবে ধরে নিচ্ছি)। হ্যাঁ, আপনি যে কোনও প্রতিশ্রুতি ঠেলে দিতে পারেন।
u0b34a0f6ae

21
লোকেরা যদি টানতে থাকে তবে আপনাকে এমন একটি প্রতিশ্রুতিবদ্ধ করতে হবে যা ব্যবহার করে পরিবর্তনগুলি উল্টে দেয় git revert
জাকুব নরবস্কি

1
আপনি রিমোট থেকে ডানদিকে চাপ দিচ্ছেন তা নিশ্চিত করতে গিট শো হেড ~ 4 ব্যবহার করুন
ম্যাট ফ্রিম্যান


5
"আদেশ কি গুরুত্বপূর্ণ?" হ্যাঁ, যদি কমিটগুলি একই ফাইলগুলিতে একই লাইনগুলিকে প্রভাবিত করে। তারপরে আপনার সর্বাধিক সাম্প্রতিক প্রতিশ্রুতি ফিরিয়ে দেওয়া শুরু করা উচিত এবং ফিরে আসার পথে কাজ করা উচিত।
আভান্দুরসন

উত্তর:


1332

আমি একটি মন্তব্যে যা লিখেছি তা প্রসারিত করছি

সাধারণ নিয়মটি হ'ল আপনি প্রকাশিত ইতিহাস পুনর্লিখন (পরিবর্তন) করা উচিত নয়, কারণ এটির উপর কারও কারও ভিত্তি তৈরি হতে পারে। আপনি যদি ইতিহাস পুনর্লিখন (পরিবর্তন) করেন তবে আপনি তাদের পরিবর্তনগুলি মার্জ করে এবং তাদের আপডেট করার ক্ষেত্রে সমস্যা তৈরি করবেন।

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

আপনার নিম্নলিখিত পরিস্থিতি রয়েছে:

এ <- বি <- সি <- ডি <- মাস্টার <- হেড

(এখানে তীরগুলি নির্দেশকের দিক নির্দেশ করে: কমিটের ক্ষেত্রে "পিতামাতা" রেফারেন্স, শাখা প্রধানের (শাখা রেফ) ক্ষেত্রে শীর্ষ প্রতিশ্রুতি এবং হেড রেফারেন্সের ক্ষেত্রে শাখার নাম)।

আপনার যা তৈরি করতে হবে তা হ'ল:

এ <- বি <- সি <- ডি <- [(বিসিডি) ^ - 1] <- মাস্টার <- হেড

যেখানে "[(বিসিডি) ^ - 1]" মানে সেই প্রতিশ্রুতি যা বি, সি, ডি পরিবর্তনের ক্ষেত্রে পরিবর্তিত হয় গণিত আমাদের বলে যে (বিসিডি) ^ - 1 = ডি ^ -1 সি ^ -1 বি ^ -1, সুতরাং আপনি নিম্নলিখিত কমান্ডগুলি ব্যবহার করে প্রয়োজনীয় পরিস্থিতি পেতে পারেন:

$ git revert --no-commit D
$ git revert --no-commit C
$ git revert --no-commit B
$ git commit -m "the commit message"

বিকল্প সমাধান হ'ল প্রতিশ্রুতি A এর সামগ্রীগুলি চেকআউট করা এবং এই রাষ্ট্রটি প্রতিশ্রুতিবদ্ধ:

$ git checkout -f A -- .
$ git commit -a

তাহলে আপনার নিম্নলিখিত পরিস্থিতি হবে:

এ <- বি <- সি <- ডি <- এ '<- মাস্টার <- হেড

কমিট এ'র কমিট এ এর ​​মতো একই বিষয়বস্তু রয়েছে তবে এটি একটি আলাদা কমিট (কমিট বার্তা, পিতামাতাদের, কমিটের তারিখ)।

জেফ Ferland দ্বারা সমাধান চার্লস বেইলি দ্বারা পরিবর্তন একই ধারণা উপর তৈরী করে, কিন্তু ব্যবহার Git রিসেট :

$ git reset --hard A
$ git reset --soft @{1}  # (or ORIG_HEAD), which is D
$ git commit

40
আপনি যদি বি, সি বা ডি-তে ফাইলগুলি যুক্ত করেন তবে git checkout -f A -- .এগুলি মুছবে না, আপনাকে এটি ম্যানুয়ালি করতে হবে। আমি এই কৌশলটি এখনই প্রয়োগ করেছি, ধন্যবাদ জাকুব
ওমা

18
সেগুলি সমাধান সমতুল্য নয়। প্রথমটি নতুন তৈরি হওয়া ফাইলগুলি মুছবে না।
m33lky

10
@ জেরি: এর git checkout fooঅর্থ হতে পারে চেকআউট শাখা foo ( শাখায় স্যুইচ) বা চেকআউট ফাইল ফু (সূচী থেকে)। --অসম্পূর্ণ করতে ব্যবহৃত হয়, উদাহরণস্বরূপ git checkout -- fooফাইল সম্পর্কে সর্বদা।
জাকুব নরবস্কি

87
দুর্দান্ত উত্তর ছাড়াও। এই শর্টহ্যান্ডটি আমার পক্ষে কাজ করেgit revert --no-commit D C B
welldan97

9
@ ওয়েলডান ৯7: মন্তব্যের জন্য ধন্যবাদ। এই উত্তরটি লেখার সময় git revertএকাধিক প্রতিশ্রুতি গ্রহণ করা হয়নি; এটি বেশ নতুন সংযোজন।
জাকুব নরবস্কি

246

পরিষ্কার উপায় যা আমি দরকারী বলে মনে করি

git revert --no-commit HEAD~3..

এই কমান্ডটি কেবলমাত্র একটি প্রতিশ্রুতি নিয়ে সর্বশেষ 3 টি প্রতিশ্রুতি ফিরিয়ে দেয়।

ইতিহাস পুনর্লিখন করে না।


16
এটি সহজ এবং সর্বোত্তম উত্তর
জুলিয়ান ডেনিয়াউ

3
@ জনলিটল এটি পরিবর্তনগুলি পর্যায়ায়িত করে। git commitসেখান থেকে আসলে কমিট করবে।
x1a4

14
যদি কিছু কমিটগুলি মার্জ কমিট করে তবে এটি কাজ করবে না।
মেগাএএমএএনএক্স

5
শেষে দুটি বিন্দু কি করবে?
এলাচি

5
@ কার্ডডম এগুলি একটি ব্যাপ্তি নির্দিষ্ট করে। HEAD~3..হিসাবে একইHEAD~3..HEAD
Toine এইচ

238

এটি করার জন্য আপনাকে কেবল রিভার্ট কমান্ডটি ব্যবহার করতে হবে , আপনি যে প্রত্যাহারগুলি প্রত্যাবর্তন করতে চান তার সীমা নির্দিষ্ট করে।

আপনার উদাহরণ বিবেচনা করে, আপনাকে এটি করতে হবে (ধরে নিবেন আপনি শাখা 'মাস্টার' তে রয়েছেন):

git revert master~3..master

এটি বি, সি এবং ডি এর বিপরীতমুখী প্রতিশ্রুতি দিয়ে আপনার স্থানীয় ক্ষেত্রে একটি নতুন প্রতিশ্রুতি তৈরি করবে (এর অর্থ এটি এই কমিটিগুলির দ্বারা প্রবর্তিত পরিবর্তনগুলি পূর্বাবস্থায়িত করবে):

A <- B <- C <- D <- BCD' <- HEAD

129
git revert --no-commit HEAD~2..এটি করার জন্য কিছুটা অলঙ্কৃত উপায়। আপনি যদি মাস্টার শাখায় থাকেন তবে আর মাস্টার নির্দিষ্ট করার দরকার নেই। --no-commitবিকল্প যত্র তত্র আবর্জনা ফেলার একাধিক সঙ্গে ইতিহাসের পরিবর্তে, একবারে সব করে প্রত্যাবর্তন করতে Git চেষ্টা করা যাক revert commit ...বার্তা (অভিমানী কি আপনি চান যে)।
কুবি

6
@ ভিক্টর আমি আপনার প্রতিশ্রুতি সীমাটি স্থির করেছি। ব্যাপ্তির শুরুটি একচেটিয়া, যার অর্থ এটি অন্তর্ভুক্ত নয়। সুতরাং আপনি যদি শেষ 3 টি প্রতিশ্রুতি ফিরিয়ে দিতে চান তবে আপনার তৃতীয় প্রতিশ্রুতি অর্থাত্‍ পিতামাতার কাছ থেকে রেঞ্জটি শুরু করা দরকার master~3

2
@ কুবি কি কোনও প্রতিশ্রুতিবদ্ধ বার্তায় এসএইচএগুলি অন্তর্ভুক্ত করার কোনও উপায় নেই? (একাই কমিট ব্যবহার করে আপনার পদ্ধতিটি কিন্তু পুনরায় উল্লিখিত কমিটিতে ম্যানুয়ালি প্রবেশ না করে)?
ক্রিস এস

@ ক্রিসস আমার প্রথম চিন্তাটি ব্যবহার না করার জন্য হবে --no-commit(যাতে আপনি প্রতিটি প্রত্যাবর্তনের জন্য পৃথক প্রতিশ্রুতি পান), এবং তারপরে একটি ইন্টারেক্টিভ রিবেসে একসাথে সমস্তকে স্কোয়াশ করুন। সম্মিলিত কমিট ম্যাসেজে সমস্ত এসএএচএ থাকবে এবং আপনি আপনার পছন্দসই কমিট ম্যাসেজ এডিটরটি ব্যবহার করতে চাইলে সেগুলি সাজিয়ে রাখতে পারেন।
রেডন রোজবারো

71

জাকুবের উত্তরের অনুরূপ, এটি আপনাকে সহজেই প্রত্যাবর্তনের জন্য ক্রমাগত কমিটগুলি নির্বাচন করতে দেয় allows

# revert all commits from B to HEAD, inclusively
$ git revert --no-commit B..HEAD  
$ git commit -m 'message'

9
আপনার সমাধানটি আমার পক্ষে ভাল কাজ করেছে, তবে সামান্য পরিবর্তন নিয়ে। যদি আমাদের এই ক্ষেত্রে Z -> এ -> বি -> সি -> ডি -> হেড হয় এবং আমি যদি এ রাজ্যে ফিরে আসতে চাই, তবে অদ্ভুতভাবে আমাকে গিট রিভার্ট করতে হবে - না-কমিট জেড .. প্রধান
বোগদান

3
@ বোগদানের সাথে সম্মত হোন, রিভার্ট রেঞ্জটি এমন: SHA_TO_REVERT_TO..HEAD
ভাদিয়াম তায়মিরভ

11
পরিসরটি ভুল। এটি হওয়া উচিত B^..HEAD, অন্যথায় বি বাদ দেওয়া হয়।
টেসাস

3
@ টেসাসের সাথে সম্মত হন, তাই সঠিক কাজটি হ'ল: git revert --no-commit B^..HEADবাgit revert --no-commit A..HEAD
ইয়াহো

64
git reset --hard a
git reset --mixed d
git commit

এটি একবারে তাদের সবার জন্য একটি বিপরীত হিসাবে কাজ করবে। একটি ভাল প্রতিশ্রুতি বার্তা দিন।


4
তিনি যদি HEADদেখতে চান Aতবে তিনি সম্ভবত সূচকটি মেলাতে চান এটি git reset --soft Dসম্ভবত আরও উপযুক্ত।
সিবি বেইলি

2
--সোফেট রিসেটিং সূচকটি সরিয়ে দেয় না, সুতরাং যখন সে প্রতিশ্রুতি দেয় তখন মনে হয় কমিটটি ডি থেকে পরিবর্তে সরাসরি এসেছিল যা শাখাটি বিভক্ত করবে। - মিক্সড পরিবর্তনগুলি ছেড়ে দেয়, তবে সূচক পয়েন্টারকে সরিয়ে দেয়, তাই ডি প্যারেন্ট কমিট হয়ে উঠবে।
জেফ ফেরল্যান্ড

5
হ্যাঁ, আমি মনে করি গিট রিসেট - আমার উপরের জিনিসগুলি হ'ল রক্ষণাবেক্ষণ। এটি ২০১০ সালের এপ্রিলে প্রকাশিত 1.7.1 সংস্করণে প্রকাশিত হয়েছিল, সুতরাং উত্তরটি তখন প্রায় ছিল না।
জেফ ফেরল্যান্ড

git checkout Aতারপরে git commitউপরেরটি আমার পক্ষে কাজ করে নি, তবে এই উত্তরটি করেছে।
সিম্পলজি

কেন git reset --mixed Dপ্রয়োজন? বিশেষত কেন reset? এটি কি কারণ ডি-তে রিসেট না করেই, হেড এ-তে নির্দেশ করবে, যার ফলে বি, সি, এবং ডি "ঝোলা" এবং আবর্জনা-সংগৃহীত হয়েছিল - যা তিনি চান না? তবে কেন --mixed? আপনি ইতিমধ্যে জবাব দিয়েছেন " --softপুনরায় সেট করা সূচকটি সরায় না ..." সুতরাং সূচী সরিয়ে দিয়ে এর অর্থ সূচকটির ডি এর পরিবর্তনগুলি থাকবে, যখন ওয়ার্কিং ডিরেক্টরিতে এ এর ​​পরিবর্তনগুলি থাকবে - এইভাবে একটি git statusবা git diff(যা সূচকের সাথে [ডি] তুলনা করে) ওয়ার্কিং ডিরেক্টরি [এ]) পদার্থটি প্রদর্শন করবে; যে ব্যবহারকারী ডি থেকে ফিরে যাচ্ছেন?
লাল মটর

39

প্রথমে নিশ্চিত হয়ে নিন যে আপনার কাজের অনুলিপিটি সংশোধিত হয়নি। তারপর:

git diff HEAD commit_sha_you_want_to_revert_to | git apply

এবং তারপর কেবল প্রতিশ্রুতিবদ্ধ। প্রত্যাবর্তনের কারণ কী তা নথিভুক্ত করতে ভুলবেন না।


1
আমার জন্য কাজ! বৈশিষ্ট্য শাখাটি বিকাশকারী শাখায় কিছু পরিবর্তন (কিছু বাগ ফিক্স) পরিবর্তন করে, যাতে বৈশিষ্ট্য শাখার বিকাশে সমস্ত পরিবর্তন (কিছু ফাইল মুছে ফেলা সহ) রচনাগুলি মুছে ফেলাতে সমস্যা হয়েছিল।
নীরবতা

1
বাইনারি ফাইলগুলির সাথে কাজ করবে না:error: cannot apply binary patch to 'some/image.png' without full index line error: some/image.png: patch does not apply
গ্যাবলেউক্স

2
এটি গৃহীত উত্তরের চেয়ে অনেক বেশি নমনীয় সমাধান। ধন্যবাদ!
ব্রায়ান কুং

2
পুনরায়: বাইনারি ফাইলগুলিgit diff --binary HEAD commit_sha_you_want_to_revert_to | git apply
weenerk

2
আপনি মার্জ কমিটস অন্তর্ভুক্ত এমন অনেকগুলি কমিটকে ফিরিয়ে দিতে চাইলেও এটি কাজ করবে। আপনি যখন git revert A..Zযাবেনerror: commit X is a merge but no -m option was given.
জুলিউসজ গোনেরা

35

আমি এতটাই হতাশ যে এই প্রশ্নের উত্তর দেওয়া যায় না। অন্য প্রতিটি প্রশ্ন কীভাবে সঠিকভাবে ফিরে যাবে এবং ইতিহাস সংরক্ষণ করবে সে সম্পর্কিত serve এই প্রশ্নটি বলছে "আমি শাখার প্রধানকে A এর দিকে নির্দেশ করতে চাই, আমি চাই বি, সি, ডি এবং হেড অদৃশ্য হয়ে যেতে এবং আমি মাথাটি এ এর ​​সমার্থক হতে চাই।"

git checkout <branch_name>
git reset --hard <commit Hash for A>
git push -f

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

git checkout testing
git reset --hard abc1234
git push -f

আমি এই রেপোতে কাজ করা অন্য 5 জন ছেলাকে বলেছিলাম যে তারা গত কয়েক ঘন্টা ধরে তাদের পরিবর্তনগুলি এবং সর্বশেষ পরীক্ষা থেকে মুছা / পুনরায় শাখাটি ভালভাবে নোট করে। গল্পের শেষ.


2
আমি কমিটগুলি প্রকাশ করি নি, সুতরাং আমার এই উত্তরটির প্রয়োজন ছিল। ধন্যবাদ, @ সুমের
টম ব্যারন

এই কাজ করতে ভাল উপায় নেই git push --force-with-leaseযা ইতিহাস পুনর্লিখন হবে শুধুমাত্র যদি কেউ অন্য পরে অথবা করে এর পরিসীমা মধ্যে শাখায় প্রতিশ্রুতি দিয়েছে vapourize চাপ দিতে থাকেন। অন্য লোকেরা যদি শাখাটি ব্যবহার করে থাকে তবে এর ইতিহাস কখনই আবার লেখা উচিত নয় এবং প্রতিশ্রুতিবদ্ধভাবে দৃশ্যমানভাবে ফিরে যেতে হবে।
ফ্রেন্ড্রয়েড 16

1
@ ফ্রেন্ড্রয়েড "ইতিহাস কখনই নতুন করে লেখা উচিত নয়", কেবলমাত্র বিস্মৃততার মধ্যে এই চুক্তি। এই থ্রেডের প্রশ্ন এবং আমার উত্তরের বিষয়টি ঠিক একটি নির্দিষ্ট দৃশ্যের জন্য সমস্ত ইতিহাস মুছে ফেলা উচিত।
সুমেরে

@ সুমের শিওর, এটাই প্রশ্ন। তবে আপনার উত্তরে অন্যান্য ছেলেদের কী বলার কথা উল্লেখ করা হয়েছে, সমস্যা হওয়ার সম্ভাবনা রয়েছে। ব্যক্তিগত অভিজ্ঞতা থেকে, আপনি যদি মুছার চেষ্টা করছেন তার পরে যদি অন্য লোকেরা প্রতিশ্রুতিবদ্ধ হয় তবে আপনার কোড-বেসটি ধাক্কা দিতে পারে - পুশ-এফ আপনার কোড-বেসকে জবাবদিহি করতে পারে। - ফোর্স-উইজ-ইজারা একই ফলাফল অর্জন করে, আপনি যদি আপনার রেপোতে গোলমাল করতে চলেছিলেন তবে এটি আপনার পাছাটিকে বাঁচায়। কেন চান্স? যদি --ফোর্স-সহ-ইজারা ব্যর্থ হয় তবে আপনি দেখতে পাচ্ছেন যে কোন প্রতিশ্রুতিটি কীভাবে পায়, সঠিকভাবে মূল্যায়ন করুন, সামঞ্জস্য করুন এবং আবার চেষ্টা করুন।
ফ্রেন্ড্রয়েড

1
@ সুমের আপনাকে ধন্যবাদ! আমি সম্মত হয়েছি প্রশ্নটি পরিষ্কারভাবে জানিয়েছে যে এটি ইতিহাস পুনর্লিখন করতে চায়। আমি আপনার মতো পরিস্থিতিতে আছি এবং আমি ওপিটি অনুমান করছি যে কেউ দুর্ঘটনাক্রমে (যখন আমি ছুটিতে ছিলাম) কয়েক ডজন কুৎসিত রিভার্ট এবং বিজোড় প্রতিশ্রুতিবদ্ধ হয়েছিল এবং রাষ্ট্রটিকে ফিরিয়ে দেওয়া দরকার। একটি ভাল স্বাস্থ্যকর সতর্কতার সাথে যে কোনও ইভেন্টে এটির গ্রহণযোগ্য উত্তর হওয়া উচিত।
লি রিচার্ডসন

9

এটি যাকুব এর উত্তরে প্রদত্ত সমাধানগুলির একটির একটি সম্প্রসারণ

আমার এমন পরিস্থিতির মুখোমুখি হয়েছিল যেখানে আমার ফিরে আসতে হবে এমন কমিটগুলি কিছুটা জটিল ছিল, বেশ কয়েকটি কমিটগুলি একীভূত হয়ে কমিট করার সাথে সাথে আমার পুনর্লিখনের ইতিহাস এড়াতে হবে। আমি একটি সিরিজ ব্যবহার করতে সক্ষম ছিল নাgit revert কমান্ড কারণ শেষ পর্যন্ত আমি বিবর্তনের পরিবর্তনগুলি যুক্ত হওয়ার পরে দ্বন্দ্বের মধ্যে পড়েছিলাম। আমি নিম্নলিখিত পদক্ষেপগুলি ব্যবহার করে শেষ করেছি।

প্রথমে, শাখার ডগায় হেড রেখে যাওয়ার সময় লক্ষ্যবদ্ধ প্রতিশ্রুতিগুলির বিষয়বস্তুগুলি দেখুন:

$ git checkout -f <target-commit> -- .

(- - নিশ্চিত করে তোলে <target-commit> যে কোনও ফাইলের পরিবর্তে প্রতিশ্রুতি হিসাবে ব্যাখ্যা করা হয়েছে; বর্তমান ডিরেক্টরিটিকে বোঝায়))

তারপরে, কমিটগুলিতে পিছনে ঘুরিয়ে দেওয়ার সময় কোন ফাইলগুলি যুক্ত হয়েছিল তা নির্ধারণ করুন এবং এভাবে মুছে ফেলা দরকার:

$ git diff --name-status --cached <target-commit>

যুক্ত করা ফাইলগুলি লাইনের শুরুতে একটি "এ" দিয়ে দেখা উচিত এবং অন্য কোনও পার্থক্য থাকতে হবে না। এখন, যদি কোনও ফাইল সরানোর প্রয়োজন হয়, অপসারণের জন্য এই ফাইলগুলি মঞ্চ করুন:

$ git rm <filespec>[ <filespec> ...]

অবশেষে, বিপরীত প্রতিশ্রুতিবদ্ধ:

$ git commit -m 'revert to <target-commit>'

যদি ইচ্ছা হয় তবে নিশ্চিত হয়ে নিন যে আমরা কাঙ্ক্ষিত অবস্থায় ফিরে এসেছি:

$git diff <target-commit> <current-commit>

কোন পার্থক্য থাকা উচিত।


আপনি কি gitকেবল শাখার ডগা দিয়েই মাথা উঁচু করতে পারবেন ?
সুমেরে

2
এটি আমার পক্ষে আরও ভাল সমাধান ছিল, যেহেতু আমার মধ্যেই আমি একীভূত হয়েছি।
সোভেম্প

3

অংশীদারি সংগ্রহস্থলগুলিতে একাধিক কমিটির প্রত্যাবর্তনের সহজ উপায় (যা লোকেরা ব্যবহার করে এবং আপনি ইতিহাস সংরক্ষণ করতে চান) git revertগিটের সাথে একযোগে ব্যবহার করাrev-list । পরেরটি আপনাকে কমিটগুলির একটি তালিকা সরবরাহ করবে, প্রাক্তনটি তার বিপরীতে নিজেই কাজ করবে।

এটি করার দুটি উপায় আছে। আপনি যদি একক প্রতিশ্রুতি ব্যবহারের ক্ষেত্রে প্রত্যাবর্তন একাধিক প্রতিশ্রুতি চান:

for i in `git rev-list <first-commit-sha>^..<last-commit-sha>`; do git revert -n $i; done

এটি আপনার প্রয়োজনীয় কমিটগুলির একটি দলকে ফিরিয়ে দেবে, তবে আপনার কার্যকারী গাছের সমস্ত পরিবর্তন ছেড়ে দেবে, আপনার যথারীতি সমস্ত কিছু করা উচিত।

অন্য বিকল্পটি হ'ল বিপরীত পরিবর্তনের জন্য একক প্রতিশ্রুতিবদ্ধ হওয়া:

for i in `git rev-list <first-commit-sha>^..<last-commit-sha>`; do git revert --no-edit -s $i; done

উদাহরণস্বরূপ, যদি আপনার কাছে কমিট ট্রি থাকে

 o---o---o---o---o---o--->    
fff eee ddd ccc bbb aaa

পরিবর্তনগুলি আইইবি থেকে বিবিবিতে ফিরিয়ে আনতে , চালান

for i in `git rev-list eee^..bbb`; do git revert --no-edit -s $i; done

সবেমাত্র এটি ব্যবহৃত। ধন্যবাদ!
রান বিরন

2

তাদের মধ্যে কেউই আমার পক্ষে কাজ করেনি, সুতরাং আমার কাছে তিনটি প্রতিশ্রুতি ফিরে যাওয়ার ছিল (শেষ তিনটি অঙ্গীকার), তাই আমি করেছি:

git revert HEAD
git revert HEAD~2
git revert HEAD~4
git rebase -i HEAD~3 # pick, squash, squash

কবজির মতো কাজ করেছেন :)


2
আপনার পরিবর্তনগুলি এখনও ধাক্কা না নিলে এটি কেবল একটি কার্যকর বিকল্প।
কেবুম

0

আমার মতে খুব সহজ ও পরিষ্কার উপায় হতে পারে:

এ এ ফিরে যান

git checkout -f A

পয়েন্ট মাস্টারের মাথা বর্তমান অবস্থায়

git symbolic-ref HEAD refs/heads/master

সংরক্ষণ

git commit

1
আপনি দয়া করে ডাউনটিভোটিংয়ের কারণ ব্যাখ্যা করতে পারেন?
নুল্ল

এটি কাজ করে। এই দরকারী উত্তরের জন্য ডাউনওয়েট দেওয়ার বিন্দু কী বা যে কোনওটি সেরা-অনুশীলন কী তা ব্যাখ্যা করতে পারে?
লেভেন্ট ডিভিলিওগ্লু

এটা কি একই git checkout master; git reset --hard A? বা না পারলে আপনি কি করেন এটি সম্পর্কে আরও কিছুটা ব্যাখ্যা করতে?
এমএম

শুধু কাজ করে, তবে প্রতীকী-রেফ হেড মনে হয় এটি একটি "নিরাপদ" কমান্ড নয়
সেরজিও

এরে আমি ফিক্স মাস্টার চাই না, আমি একটি শাখা ঠিক করতে চাই
সেরজিও

-6

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

এটা যেভাবে কাজ করে

git log - व्याख्या = অনলাইন | গ্রেপ 'বৈশিষ্ট্য_নাম' | কাট-ডি '' -ফ 1 | xargs -n1 গিট - না-সম্পাদনা

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