আমি কীভাবে 1 টি প্রতিশ্রুতি ফিরিয়ে আনতে পারি?


127

আমার 2 টি কমিট রয়েছে যা আমি চাপ দিইনি:

$ git status
# On branch master
# Your branch is ahead of 'faves/master' by 2 commits.

আমি কীভাবে আমার প্রথমটিকে (প্রাচীনতম) পিছনে ফিরিয়ে আনতে পারি, তবে দ্বিতীয়টিকে কীভাবে রাখতে পারি?

 $ git log
commit 3368e1c5b8a47135a34169c885e8dd5ba01af5bb
...

commit baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e
...

এখান থেকে:

http://friendfeed.com/harijay/742631ff/git-question-how-do-i-rollback-commit-just-want

আমার কি কেবল দরকার:

git reset --hard baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e

এটাই?


3
এই প্রশ্নটি অফ-টপিক হিসাবে উপস্থিত বলে মনে হচ্ছে কারণ এটি একটি প্রোগ্রামিং সরঞ্জাম সম্পর্কিত। এটি স্ট্যাক ওভারফ্লোতে অন্তর্ভুক্ত।
পিটার মর্টেনসেন

@ পিটারমোরটেনসেন সম্মত হয়েছেন। এটি সুপার ইউজারের জন্য সুযোগ
কলব ক্যানিয়ন

উত্তর:


95

যাওয়ার সবচেয়ে নিরাপদ এবং সম্ভবত সবচেয়ে পরিষ্কার উপায় হল ইন্টারেক্টিভভাবে রিবেস করা।

git rebase -i HEAD^^

অথবা,

git rebase -i baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e^

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

আপনি এর সাথে প্রতিশ্রুতি প্রত্যাহার করতে পারেন git revertতবে এটি ইতিহাসে আরও প্রতিশ্রুতি বার্তা যুক্ত করতে চলেছে, যা অনাকাঙ্ক্ষিত হতে পারে। -nগিটকে এখনই রিভার্টটি কমিট না করতে বলার জন্য প্যারামিটারটি ব্যবহার করুন । আপনি ইন্টারেক্টিভভাবে রিবায়েস করতে পারেন এবং জিনিস পরিষ্কার রাখার জন্য পূর্ববর্তী কমিট পর্যন্ত তাদের স্কোয়াশ করতে পারেন।

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

এর সাথে সংগ্রহস্থলটিকে git reset --hardপুনরায় সেট করা যত্ন সহকারে করা উচিত, কারণ এটি পূর্বাবস্থায় ফেরা যায় না।

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


'গিট রিবেস' চলাকালীন আমি কীভাবে কোনও প্রতিশ্রুতি মুছতে পারি? এখানে কেবল 3 টি কমান্ড রয়েছে: চয়ন করুন, সম্পাদনা করুন, স্কোয়াশ। আফাইককে কোনও মুছুনা নেই।
n179911

8
সম্পূর্ণরূপে তালিকা থেকে লাইনটি মুছুন, এবং এটি যে প্রতিশ্রুতি মুছে
ফেলবে

আমি যখন পরিবর্তনটি ফিরিয়ে নিতে চেয়েছিলাম তখন আমি এর কোনও চিহ্নই ছাড়তে চাইনি। আপনি যদি নিজের বিবর্তনের কোনও চিহ্নও ছাড়তে চান না তবে এটি করার সর্বোত্তম উপায়।
ফিলিপ হিলান

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

আমি rebaseযতটা সম্ভব কম ব্যবহারের পরামর্শ দেব । আপনি যদি অন্যের সাথে কাজ করেন তবে ঠিক করুন revert
বোল্ডনিক 24

52

এটি যদি http://nakkaya.com/2009/09/24/git-delete-last-commit/ থেকে হয় এবং এটি আমার পক্ষে কাজ করে

গিট ডিলিট লাস্ট কমিট

গভীর রাতে একবার যখন আমি কফি খেয়ে চলে আসি, আমি এমন জিনিসপত্র দিয়ে থাকি যা আমার উচিত ছিল না। তারপরে আমি পরবর্তী 10 - 15 মিনিট গুগল করে কাটিয়েছি কীভাবে আমার করা শেষ প্রতিশ্রুতি সরিয়ে ফেলা যায়। সুতরাং তৃতীয়বারের পরে আমি এটির একটি রেকর্ড তৈরি করতে চেয়েছিলাম যাতে আমি পরে এটি উল্লেখ করতে পারি।

যদি আপনি জঞ্জাল করে থাকেন তবে ধাক্কা না দিয়ে থাকেন,

git reset --hard HEAD~1

মাথা before 1 শিরোনামের আগে কমিট করার শর্টহ্যান্ড। বিকল্পভাবে আপনি যে হ্যাশটিতে পুনরায় সেট করতে চান তার SHA-1 উল্লেখ করতে পারেন। মনে রাখবেন যে --হার্ড ব্যবহারের সময় কার্যক্ষেত্রের গাছের ট্র্যাক করা ফাইলগুলিতে যে কোনও পরিবর্তন হয়, যেহেতু মাথা নষ্ট হওয়ার আগে প্রতিশ্রুতিবদ্ধ হয়।

আপনি যদি নিজের কাজটি মুছে ফেলতে না চান তবে আপনি এমন --softবিকল্প ব্যবহার করতে পারেন যা প্রতিশ্রুতি মুছে ফেলবে তবে এটি আপনার সমস্ত পরিবর্তিত ফাইলগুলিকে "প্রতিশ্রুতিবদ্ধ হওয়ার পরিবর্তনগুলি" ছেড়ে দেবে, যেমন গিট স্ট্যাটাসটি এতে রাখে।

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

git revert HEAD

এটি একটি নতুন প্রতিশ্রুতি তৈরি করবে যা দুর্ঘটনাজনিত প্রতিশ্রুতি দ্বারা প্রবর্তিত সমস্ত কিছুকে বিপরীত করে।


2
--Soft বিকল্পের সাহায্যে আপনি যেখানে কোনও ফাইলের নাম পরিবর্তন করেন এবং দুর্ঘটনাক্রমে প্রথমে "গিট অ্যাড" ব্যবহার না করে "গিট কমিট-এ" এর জন্য এটি উপযুক্ত।
হারুন হারুন

8

নাঃ। গিট-রিসেট - ইতিহাস আপনাকে ইতিহাসে ফিরিয়ে আনবে। আপনি যা সন্ধান করছেন তা হ'ল গিট রিভার্ট, যা কোনও প্রতিশ্রুতি পূর্বাবস্থায় ফিরিয়ে আনবে।


4
ঠিক আছে, এটি কাজ করে কিন্তু এটি আপনাকে লগতে প্রতিশ্রুতি দেয়। যদি এই কমিটগুলি ইতিমধ্যে ধাক্কা / টান না দেওয়া হয় তবে ইন্টারেক্টিভ রিবেস দিয়ে এগুলি পরিষ্কার করা ভাল। ইতিহাস পরিবর্তন করার ক্ষমতা অন্যান্য সংস্করণ নিয়ন্ত্রণ সিস্টেমের চেয়ে গিটের অন্যতম প্রধান সুবিধা।
নভ

6

আমি সবেমাত্র এটি করেছি:

git rebase -i HEAD^^

আমি এটি স্ক্রু আপ তাই আমি করেছি

git rebase --abort

তারপরে আবার করল। তারপরে আমাকে এইভাবে চাপ দিতে হয়েছিল:

git push origin master -f

এবং এটি যে প্রতিশ্রুতিতে ফিরে গিয়েছিলাম তার চেয়ে কমিটগুলিকে আরও নষ্ট করে দিয়েছে। দুর্দান্ত কাজ করেছেন


4

না, প্রতিশ্রুতি git reset --hard baf8d5eমুছে ফেলা 3368e1cহবে এবং হেড baf8d5eপরে হবে।

আপনি যদি 3368e1cপ্রতিশ্রুতিবদ্ধ রাখতে চান এবং প্রতিশ্রুতি মুছতে চান তবে bad8d5eসবচেয়ে সহজ সমাধানটি " git rebase -i HEAD~2" করা (যেমন শেষ দুটি কমিটির ইন্টারেক্টিভ রিবেস) করা। এই কমান্ডটি আপনার প্রতিশ্রুতি বার্তা সম্পাদক চালু করবে এবং আপনি সর্বশেষ দুটি কমিটের জন্য একটি লাইন দেখতে পাবেন। সেখানে আপনি কেবল bad8d5eপ্রতিশ্রুতিবদ্ধ রেখাটি মুছুন এবং সংরক্ষণ করুন। গিটটি আপনার ইতিহাসটি পুনরায় লিখবে এবং ২ য় প্রতিশ্রুতি চলে যাবে।

অন্যান্য দরকারী কমান্ড তোমার মত কমিট বার্তা সম্পাদকে ব্যবহার করতে পারেন squash, editইত্যাদি ইন্টারেক্টিভ রি-বেসের ফলে খুব শক্তিশালী হয়!

যদি ইতিমধ্যে কেউ এই কমিটগুলি দেখে (আপনার ভান্ডার থেকে চাপুন বা টানুন) দেখে থাকেন তবে এটি করবেন না!



1
git reset --hard {ref}

রেপোতে অন্য একটি কমিট থাকলে (যেমন প্রাথমিক কমিট এবং আরও 1) কমিটিকে পূর্বাবস্থায় ফেলার একমাত্র উপায়। বাকি উপায়গুলি (রিভার্ট, রিবেস) কাজ করতে অস্বীকার করে, কমপক্ষে গিট 1.7.5.1 হিসাবে।

আপনাকে অনুসরণ তাহলে git resetএকটি সঙ্গে git gcতারপর Git আসলে মুছে ফেলবে পুরাতন সম্পূর্ণরূপে রেপো থেকে ডেটা কমিট।


1
git checkout <treeish> -- /path/to/dir

এটি / পাথ / টু / দির জন্য প্রদত্ত "বৃক্ষবিশেষ" থেকে ডিরেক্টরিটি ফিরিয়ে আনবে


0

আমি সংগ্রহস্থল ফোল্ডারের অভ্যন্তরে হেড ফাইল থেকে সর্বশেষ কমিটগুলির হ্যাশ কোডগুলি সম্পাদনা করে এটি কাজ করতে পেরেছি:

"centralRepository\refs\heads\master"
"centralRepository\refs\heads\branch2"

তার আগে, আমি স্থানীয়ভাবে করা UNMERGE অপারেশনগুলিকে উত্সাহিত করতে কখনই সক্ষম হইনি। এটি সেন্ট্রাল রিপোজিটরিতে "কিছু রেফ চাপতে ব্যর্থ" বলে চলেছে।

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