গিট দিয়ে প্রতিশ্রুতিবদ্ধ অংশ পুনরায় করা হচ্ছে


143

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

এর সাথে কি এমন কোনও দৃষ্টিভঙ্গি রয়েছে git add --patchযা আমাকে কোনও প্রতিশ্রুতিবদ্ধ অংশের কোন অংশটিকে প্রত্যাবর্তনের সিদ্ধান্ত নেওয়ার জন্য বাছাই করে আলাদাভাবে সম্পাদনা করার অনুমতি দেবে?


এখানে আরও সমাধান , তবে নির্দিষ্ট ফাইলগুলিতে আংশিক প্রত্যাবর্তন সীমাবদ্ধ করার দিকে দৃষ্টি নিবদ্ধ করা।
এনটিসি 2

উত্তর:


225

--no-commit( -n) বিকল্পটি ব্যবহার করুন git revert, তারপরে পরিবর্তনগুলি আনস্টেজ করুন, তারপরে ব্যবহার করুন git add --patch:

$ git revert -n $bad_commit    # Revert the commit, but don't commit the changes
$ git reset HEAD .             # Unstage the changes
$ git add --patch .            # Add whatever changes you want
$ git commit                   # Commit those changes

দ্রষ্টব্য: আপনি গিট অ্যাড - প্যাচ ব্যবহার করে যে ফাইলগুলি যুক্ত করেন তা হ'ল আপনি যে ফাইলগুলি ফিরিয়ে রাখতে চান তা নয়, আপনি যে ফাইলগুলি রাখতে চান তা নয়।


13
চূড়ান্তভাবে এতটা পরিচিত না তাদের জন্য চূড়ান্ত প্রয়োজনীয় কমান্ডটি যুক্ত করার উপযুক্ত হতে পারে: প্রতিশ্রুতি দেওয়ার পরে, git reset --hardআপনি যে পরিবর্তনগুলি ফিরিয়ে নিতে চাননি তা বাতিল করতে।
কাঁপুনি

15
git reset --hardনবীনদের জন্য বিপজ্জনক, কারণ এটি পছন্দসই সম্পাদনাগুলি looseিলতে পারে। পরিবর্তে অভ্যস্ত হয়ে উঠুন, জিনিসগুলি আরও সুরক্ষিতভাবে ফিরিয়ে আনতে git statusইঙ্গিত করুন git checkout -- FILE..
টিনো

কি এক ফাঁক ফোকর git; git revertশুধু একটি --patchযুক্তি নেওয়া উচিত ।
কাজ

@ কাজ: git revertপুরো কমিটগুলি ফেরত দেওয়ার জন্য ব্যবহৃত হয়। git checkout -pপ্রত্যাবর্তনের জন্য আপনি বিটগুলি ইন্টারেক্টিভভাবে বেছে নিতে ব্যবহার করতে পারেন ।
মিপাদি

1
আমি স্পষ্টত (সম্ভবত) যুক্ত করতে চাই যা প্রথমে আপনার কাজটি সংরক্ষণ করবে । হয় commitআগে, বা stash, তারপর চেষ্টা করুন revert
ফিলিপ আলভারেজ

39

আমি নিম্নলিখিতটি সফলভাবে ব্যবহার করেছি।

প্রথমে পূর্ণ প্রতিশ্রুতিটি প্রত্যাহার করুন (এটি সূচকে রাখে) তবে প্রতিশ্রুতিবদ্ধ করবেন না।

git revert -n <sha1>  # -n is short for --no-commit

তারপরে ইন্টারেক্টিভভাবে সূচি থেকে উলটে দেওয়া ভাল পরিবর্তনগুলি সরান

git reset -p          # -p is short for --patch  

তারপরে খারাপ পরিবর্তনের বিপরীত প্রতিশ্রুতিবদ্ধ

git commit -m "Partially revert <sha1>..."

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

git reset --hard

5
এটি কী গ্রহণযোগ্য উত্তরের (যা ব্যবহার করে reset HEAD .) সর্বোত্তম বিকল্প নয় , কারণ এটির জন্য কাজ করার চূড়ান্ত পরিচ্ছন্নতার প্রয়োজন হয় না?
স্টিভেন লু

2
এই উত্তরটি উচ্চতর, কারণ অনুসরণের reset -pচেয়ে ছোট । তবে এটি এখনও পরিষ্কার করতে হবে, যেহেতু পুনরায় সেট করা "ভাল" কুকুরগুলি কমিটের পরেও কার্যকরী ডিরেক্টরিতে রয়েছে। reset HEADadd -p
চিয়েল দশ ব্রিনকে

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

5

ব্যক্তিগতভাবে, আমি এই সংস্করণটিকে পছন্দ করি, যা স্বয়ংক্রিয়ভাবে উত্পন্ন প্রতিশ্রুতি বার্তাটি পুনরায় ব্যবহার করে এবং ব্যবহারকারীকে অবশেষে প্রতিশ্রুতি দেওয়ার আগে "আংশিক" শব্দটি সম্পাদনা এবং আটকে রাখার সুযোগ দেয়।

# generate a revert commit
# note the hash printed to console on success
git revert --no-edit <hash to revert>

# undo that commit, but not its changes to the working tree
# (reset index to commit-before-last; that is, one graph entry up from HEAD)
git reset HEAD~1

# interactively add reversions
git add -p

# commit with pre-filled message
git commit -c <hash from revert commit, printed to console after first command>

# reset the rest of the current directory's working tree to match git
# this will reapply the excluded parts of the reversion to the working tree
# you may need to change the paths to be checked out
# be careful not to accidentally overwrite unsaved work
git checkout -- .

4

সমাধান:

git revert --no-commit <commit hash>
git reset -p        # every time choose 'y' if you want keep the change, otherwise choose 'n'
git commit -m "Revert ..."
git checkout -- .   # Don't forget to use it.

আপনি যদি বলেন যে এটি গৃহীত সমাধানের চেয়ে কীভাবে আলাদা হয়
চার্জবি

1
@ ক্রিজিসটফ কেন শেষে চেকআউটটি গুরুত্বপূর্ণ এবং কেন এই সমাধানটি ব্যবহারকারী 1338062 এর থেকে আলাদা?
মার্টিন

3

আরেকটি বিকল্প (যদি আপনি যে ফাইলটির বর্তমান সংস্করণটি ফিরিয়ে আনার চেষ্টা করছেন তার থেকে খুব বেশি দূরে না থাকে) হ'ল আপনি আংশিকভাবে ফিরে যেতে চান (এর থেকে ) তার আগেই কমিটের হ্যাশ পাওয়া get git logতারপরে আপনার আদেশটি হয়ে যায়:

$ git checkout -p <hash_preceding_commit_to_revert> -- file/you/want/to/fix.ext

এটি আপনার কার্যকরী গাছের ফাইলগুলিকে পরিবর্তন করে তবে কোনও প্রতিশ্রুতি তৈরি করে না, তাই যদি আপনি সত্যিই স্টাফ করেন তবে আপনি আবার শুরু করতে পারেন git reset --hard -- file/you/want/to/fix.ext


1

আপনি গিট-রিভার্ট -n ব্যবহার করতে পারেন, এবং তারপরে হানস নির্বাচন করতে অ্যাড - প্যাচ ব্যবহার করতে পারেন।

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