গিটের সাম্প্রতিক স্থানীয় কমিটগুলি আমি কীভাবে পূর্বাবস্থাপন করব?


21042

আমি দুর্ঘটনাক্রমে গিটের কাছে ভুল ফাইলগুলি প্রতিশ্রুতিবদ্ধ করেছি , তবে আমি এখনও এই প্রতিশ্রুতিটি সার্ভারের কাছে ঠেকিয়েছি না।

স্থানীয় সংগ্রহস্থল থেকে আমি কীভাবে এই কমিটগুলি পূর্বাবস্থায় ফিরিয়ে আনতে পারি?


136
আপনি একটি নতুন উত্তর পোস্ট করার আগে, ইতিমধ্যে এই প্রশ্নের 65+ উত্তর রয়েছে তা বিবেচনা করুন। আপনার উত্তরটি বিদ্যমান উত্তরের মধ্যে যা নয় তা অবদান রাখার বিষয়টি নিশ্চিত করুন।
সাজ্জাদ হিছাইন খান

87
আপনি জানেন কি গিট দরকার? git undo, এটাই. তারপরে আমাদের দ্বারা করা ভুলগুলি পরিচালনা করার জন্য খ্যাতি গিটটি নিখুঁতভাবে প্রাণবন্ত হয়ে যায়। কোনও gitকমান্ড কার্যকর করার আগে গিট স্ট্যাকের উপর বর্তমান অবস্থাটিকে চাপ দিয়ে প্রয়োগ করুন। এটি কার্য সম্পাদনকে প্রভাবিত করবে, তাই এটি সক্ষম করতে হবে কিনা তা হিসাবে কনফিগার পতাকা যুক্ত করা ভাল।
ইয়িমিন রং

11
@ ইয়িমিনরং এটি গিটের aliasবৈশিষ্ট্য সহ করা যেতে পারে : git-scm.com/book/en/v2/Git-Basics-Git-Aliases
এড্রিক

2
@ রোমাইনভ্যালারি - একইভাবে অন্যত্র যে কোনও জায়গায় কাজ করা যায়।
ইয়িমিন রং

1
@ YiminRong এটি কিনছে না। লোকেদের এখনও পদচারণা হবে এবং জিনিসগুলি পূর্বাবস্থায় ফেরানো হবে না। তবে আরও গুরুত্বপূর্ণ বিষয়টি, git reflogআপনি যা বর্ণনা করেছেন তার কাছে এটি ইতিমধ্যে খুব কাছাকাছি, তবে ব্যবহারকারীকে কী (আন) করা হবে তার আরও নিয়ন্ত্রণ দেয়। তবে দয়া করে, না, "পূর্বাবস্থা" সর্বত্র একই কাজ করে না, এবং বৈশিষ্ট্যটি অর্জনের জন্য লোকেরা বিভিন্ন ধরণের জিনিস প্রত্যাশা করবে । শেষ প্রতিশ্রুতি পূর্বাবস্থা? শেষ কর্মটি পূর্বাবস্থায় ফিরবেন? যদি শেষ ক্রিয়াটি একটি ধাক্কা ছিল, ঠিক কীভাবে পূর্বাবস্থায় ফিরে যান, (রিসেট এবং ধাক্কা) বা (রিভার্ট এবং ধাক্কা)?
রোমান ভ্যালারি

উত্তর:


22844

কোনও প্রতিশ্রুতি পূর্বাবস্থায় ফিরুন এবং পুনরায় করুন

$ git commit -m "Something terribly misguided"             # (1)
$ git reset HEAD~                                          # (2)
<< edit files as necessary >>                              # (3)
$ git add ...                                              # (4)
$ git commit -c ORIG_HEAD                                  # (5)
  1. এটিই আপনি পূর্বাবস্থায় ফিরে যেতে চান।
  2. এটি আপনার কার্যকারী গাছের (ডিস্কে থাকা আপনার ফাইলগুলির অবস্থা) কিছুই করে না, তবে প্রতিশ্রুতিবদ্ধতাটিকে পূর্বাবস্থায় ফেলেছে এবং আপনি যে পরিবর্তনগুলি অবিচ্ছিন্নভাবে রেখেছেন তা ছেড়ে দেয় (যাতে তারা "প্রতিশ্রুতিবদ্ধ না এমন পরিবর্তন হিসাবে প্রদর্শিত হবে git status, যাতে আপনার প্রয়োজন হবে) প্রতিশ্রুতিবদ্ধ হওয়ার আগে তাদের আবার যুক্ত করুন)। আপনি যদি কেবল পূর্বের প্রতিশ্রুতিতে আরও পরিবর্তন যুক্ত করতে চান বা প্রতিশ্রুতি বার্তা 1 পরিবর্তন করতে চান তবে আপনি পরিবর্তে এটি ব্যবহার করতে পারেন যা 2 এর মতো তবে আপনার বিদ্যমান পরিবর্তনগুলি মঞ্চস্থ করে ফেলে।git reset --soft HEAD~git reset HEAD~
  3. ট্রি ট্রি ফাইলগুলিতে সংশোধন করুন।
  4. git add আপনার নতুন প্রতিশ্রুতিতে আপনি অন্তর্ভুক্ত করতে চান এমন কিছু
  5. পুরানো প্রতিশ্রুতি বার্তা পুনরায় ব্যবহার করে পরিবর্তনগুলি প্রতিশ্রুতিবদ্ধ। resetপুরানো মাথা নকল .git/ORIG_HEAD; commitএর সাথে -c ORIG_HEADএকটি সম্পাদক খুলবে, যা প্রাথমিকভাবে পুরানো প্রতিশ্রুতি থেকে লগ বার্তা ধারণ করে এবং আপনাকে এটি সম্পাদনা করার অনুমতি দেয়। আপনার যদি বার্তাটি সম্পাদনা করার প্রয়োজন না হয় তবে আপনি -Cবিকল্পটি ব্যবহার করতে পারেন ।

তবে সাবধান থাকুন যে আপনি যদি সূচকে কোনও নতুন পরিবর্তন commit --amendযুক্ত করে থাকেন তবে তা ব্যবহার করে সেগুলি আপনার আগের প্রতিশ্রুতিতে যুক্ত করবে।

কোডটি যদি ইতিমধ্যে আপনার সার্ভারে ঠেলাঠেলি করে থাকে এবং আপনার কাছে ইতিহাসের পুনর্লিখনের অনুমতি রয়েছে (পুনরায়) তবে:

git push origin master --force

আপনি এই উত্তরটিও দেখতে পারেন:

কীভাবে আমি হেডকে আগের জায়গায় ফিরে যেতে পারি? (বিচ্ছিন্ন মাথা) এবং পূর্বাবস্থায় ফিরে যান

উপরের উত্তরটি আপনাকে দেখাবে git reflog,যে SHA-1 কী, যা আপনি ফিরে যেতে চান তা জানার জন্য কোনটি ব্যবহৃত হয়। উপরে বর্ণিত আদেশ অনুসারে আপনি যে বিন্দুটি পূর্বাবস্থায় ফিরে যেতে চান তা খুঁজে পেয়েছেন।


1 দ্রষ্টব্য, তবে আপনি যদি আপনার প্রতিশ্রুতি বার্তায় স্রেফ ভুল করে থাকেন তবে আপনাকে পূর্বের প্রতিশ্রুতিতে পুনরায় সেট করার দরকার নেই । সহজ বিকল্পটি হ'ল git reset(তারপরে যে কোনও পরিবর্তন আনস্টেজ করা) এবং তারপরে git commit --amend, যা আপনার পূর্বনির্ধারিত কমিট বার্তা সম্পাদকটি সর্বশেষ প্রতিশ্রুতি বার্তার সাথে প্রাক-জনবহুল খুলবে।

2 HEAD~ হিসাবে একই HEAD~1। এছাড়াও, দেখুন গিট মধ্যে শিরোনাম কি? । আপনি যদি একাধিক কমিটি বাতিল করতে চান তবে এটি সহায়ক।


472
এবং যদি প্রতিশ্রুতিটি ভুল শাখায় ছিল, আপনি git checkout theRightBranchসমস্ত পরিবর্তনগুলির পর্যায়ে থাকতে পারেন । যেমনটা আমাকে করতে হয়েছিল।
ফ্রাঙ্ক শায়ারার

489
আপনি যদি ডস-এ কাজ করছেন তবে এর পরিবর্তে git reset --soft HEAD^আপনার ব্যবহার করা দরকার git reset --soft HEAD~1। OS ডসের একটি ধারাবাহিকতা চরিত্র তাই এটি সঠিকভাবে কাজ করবে না। এছাড়াও, --softএটি ডিফল্ট, তাই আপনি যদি পছন্দ করেন এবং কেবল বলেন তবে এটি বাদ দিতে পারেন git reset HEAD~1
রায়ান লুন্ডি

118
zsh ব্যবহারকারীরা পেতে পারেন: zsh: no matches found: HEAD^- আপনার পালাতে হবে ^ যেমনgit reset --soft HEAD\^
tnajdek

7
উত্তরটি সঠিক নয়, যদি দুর্ঘটনাক্রমে বলা হয়, git commit -aজারি করা -aউচিত ছিল যখন ছেড়ে দেওয়া উচিত ছিল। কোন ক্ষেত্রে এটি ভাল না ছেড়ে --soft(যার ফলস্বরূপ --mixedযেটি ডিফল্ট হবে) এবং তারপরে আপনি যে প্রতিশ্রুতি দিয়েছিলেন তা পরিবর্তন করতে পারবেন age
dmansfield

6
@ আইসিবিআরকি গিট অ্যাড একটি কমান্ড। git add [--verbose | -v] [--dry-run | -n] [--force | -f] [--interactive | -i] [--patch | -p] [--edit | -e] [--[no-]all | --[no-]ignore-removal | [--update | -u]] [--intent-to-add | -N] [--refresh] [--ignore-errors] [--ignore-missing] [--chmod=(+|-)x] [--] [<pathspec>…​]
আশরাফ.শাক 786

10728

কোনও প্রতিশ্রুতি পূর্বাবস্থায় ফেরা কিছুটা ভীতিজনক যদি আপনি জানেন না যে এটি কীভাবে কাজ করে। তবে আপনি যদি বুঝতে পারেন তবে এটি আশ্চর্যরকম সহজ।

বলুন আপনার এটি আছে, যেখানে সি হ'ল আপনার হেড এবং (ফ) আপনার ফাইলের অবস্থা।

   (F)
A-B-C
    ↑
  master

আপনি সি কমিট করতে চান এবং এটি আর কখনও দেখতে পাবেন না এবং স্থানীয়ভাবে পরিবর্তিত ফাইলগুলির সমস্ত পরিবর্তন হারাতে চান । তুমি এটা করো:

git reset --hard HEAD~1

ফলাফল হলো:

 (F)
A-B
  ↑
master

এখন বি হেড। যেহেতু আপনি ব্যবহার করেছেন --hard, আপনার ফাইলগুলি প্রতিশ্রুতি বিতে তাদের রাজ্যে পুনরায় সেট করা হয়েছে B.

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

   (F)
A-B-C
    ↑
  master

আপনি বন্ধ রেখে এটা করতে পারেন, --hard:

git reset HEAD~1

এই ক্ষেত্রে ফলাফল:

   (F)
A-B-C
  ↑
master

উভয় ক্ষেত্রেই হেড সর্বশেষতম প্রতিশ্রুতির একমাত্র পয়েন্টার। আপনি যখন একটি করেন git reset HEAD~1, আপনি গিটকে হেড পয়েন্টারটিকে একটি প্রতিশ্রুতি ফিরিয়ে আনতে বলুন। তবে (আপনি যদি না ব্যবহার করেন --hard) তবে আপনার ফাইলগুলি যেমন ছিল তেমন ছেড়ে যান। সুতরাং এখন git statusআপনি সিটিতে পরীক্ষা করে দেখেছেন যে পরিবর্তনগুলি দেখায় আপনি কোনও জিনিস হারান নি!

হালকা টাচের জন্য, আপনি এমনকি করতে পারেন আপনার কমিট কিন্তু আপনার ফাইল এবং আপনার ছেড়ে পূর্বাবস্থা সূচক :

git reset --soft HEAD~1

এটি কেবল আপনার ফাইলগুলিকেই একা ছেড়ে দেয় না, এমনকি এটি আপনার সূচককে একা ফেলে দেয়। আপনি যখন করবেন git status, আপনি দেখতে পাবেন যে একই ফাইলগুলি আগের মতোই সূচীতে রয়েছে। প্রকৃতপক্ষে, এই আদেশের ঠিক পরে, আপনি করতে পারেন git commitএবং আপনি ঠিক যেমন প্রতিশ্রুতি করেছিলেন তা পুনরায় করা হবে।

আরও একটি জিনিস: ধরুন আপনি প্রথম উদাহরণের মতো একটি প্রতিশ্রুতি নষ্ট করেছেন, তবে তারপরে আবিষ্কার করেন যে এটির পরেও আপনার এটির দরকার ছিল ? শক্ত ভাগ্য, তাই না?

নাহ, এটি ফিরে পাওয়ার এখনও একটি উপায় আছে। টাইপ করুন git reflogএবং আপনি (আংশিক) কমিট শের একটি তালিকা দেখতে পাবেন (যা হ্যাশগুলি) যা আপনি চারপাশে চলে এসেছেন you আপনি যে প্রতিশ্রুতি নষ্ট করেছেন তা সন্ধান করুন এবং এটি করুন:

git checkout -b someNewBranchName shaYouDestroyed

আপনি এখন সেই প্রতিশ্রুতি পুনরুত্থিত করেছেন। গিটে প্রায় 90 দিনের জন্য কমিটগুলি আসলে ধ্বংস হয় না, তাই আপনি সাধারণত ফিরে যেতে পারেন এবং এমন একটিটিকে উদ্ধার করতে পারেন যা আপনি পরিত্রাণ পেতে চাননি।


15
হুঁশিয়ার! আপনার ভুল প্রতিশ্রুতিটি (ফাস্ট-ফরোয়ার্ড) একীভূত হলে এটি আপনি যা প্রত্যাশা করেছিলেন তা করতে পারে না! যদি আপনার মাথাটি মার্জ কমিটে থাকে (উদা: মেশিনে মার্জ করা শাখা বৈশিষ্ট্য), git reset --hard~1তবে মাস্টার শাখাটি বৈশিষ্ট্য শাখার অভ্যন্তরে শেষ প্রতিশ্রুতিতে নির্দেশ করবে। এক্ষেত্রে নির্দিষ্ট কমিট আইডিটি আপেক্ষিক কমান্ডের পরিবর্তে ব্যবহার করা উচিত।
ক্রিস কেরিকস

89
একটি গুরুত্বপূর্ণ বিষয় অনুপস্থিত: যদি এই প্রতিশ্রুতি পূর্বে প্রত্যন্ত অঞ্চলে 'ধাক্কা' দেওয়া হত, তবে কোনও 'পূর্বাবস্থায়' অপারেশন, যতই সহজ সরল হোক না কেন, তাদের স্থানীয় অনুলিপিতে এই প্রতিশ্রুতিবদ্ধ বাকী ব্যবহারকারীদের জন্য প্রচুর ব্যথা এবং যন্ত্রণার কারণ হবে, ভবিষ্যতে যখন তারা 'গিট টান' করেন। সুতরাং, যদি প্রতিশ্রুতিটি ইতিমধ্যে 'ধাক্কা' দেওয়া হয়, তার পরিবর্তে এটি করুন: গিট রিভার্ট্ <
বিড

12
@ ফ্র্যাক্টালস্পেস, এটি "প্রচুর ব্যথা এবং যন্ত্রণা" সৃষ্টি করবে না। একটি দলের সাথে গিট ব্যবহার করার সময় আমি কয়েকটা জোর ধাক্কা দিয়েছি। এটি যা লাগে তা হল যোগাযোগ।
রায়ান লন্ডি

13
@ কেরলেসা আমার কর্মক্ষেত্রে পুরো টিমের কর্মপ্রবাহকে জগাখিচুড়ি করে এবং তারপরে কীভাবে sh * টি ঠিক করতে হবে তাদের বলাকে 'যোগাযোগ' বলা হয় না। গিট ইতিহাস পুনরায় লেখাই একটি ধ্বংসাত্মক ক্রিয়াকলাপ, যার ফলশ্রুতিতে রেপুর অংশগুলি ট্র্যাশ হয়ে যায়। এর ব্যবহারের উপর জোর দেওয়া, যদিও পরিষ্কার এবং নিরাপদ বিকল্পগুলি পাওয়া যায় তা কেবল দায়বদ্ধ।
ফ্র্যাক্টালস্পেস

14
আমি কোনও প্রতিশ্রুতি রক্ষা করতে এবং এটি আর কখনও দেখতে চাইনি। আমি আপনার উদাহরণটি ব্যবহার করেছিলাম --hardতবে যা আমি বুঝতে পারি নি তা হ'ল আমার কার্যকরী গাছের সমস্ত অস্থির পরিবর্তনগুলিও কমে যায়! আমি পরে এই প্রতিশ্রুতি হিসাবে এই ফাইলগুলি প্রতিশ্রুতিবদ্ধ করতে যাচ্ছি। এখন এই ফাইলগুলি ফিরে পাওয়া অসম্ভব বলে মনে হচ্ছে - আপনি পোস্ট করা সমাধানটিও চেষ্টা করেছিলাম reflogতবে এটি পূর্ববর্তী-অ-অচলিত পরিবর্তনগুলি পুনরুদ্ধার করতে পারেনি।
অ্যাডাম

2128

আপনি ইতিমধ্যে আপনার প্রতিশ্রুতি জনসমক্ষে করেছেন কিনা তার উপর নির্ভর করে আপনার শেষ প্রতিশ্রুতি "পূর্বাবস্থায় ফেলার" দুটি উপায় রয়েছে (আপনার দূরবর্তী সংগ্রহস্থলে চাপ দেওয়া হয়েছে):

স্থানীয় প্রতিশ্রুতিটি কীভাবে পূর্বাবস্থাপন করবেন

ধরা যাক আমি স্থানীয়ভাবে প্রতিশ্রুতিবদ্ধ, কিন্তু এখন আমি সেই প্রতিশ্রুতিটি সরাতে চাই।

git log
    commit 101: bad commit    # Latest commit. This would be called 'HEAD'.
    commit 100: good commit   # Second to last commit. This is the one we want.

এটি ছিল পথ শেষ করার পূর্বে কমিট সবকিছু ফিরে পুনরুদ্ধার করতে, আমাদের প্রয়োজন resetসামনে সমর্পণ করতে HEAD:

git reset --soft HEAD^     # Use --soft if you want to keep your changes
git reset --hard HEAD^     # Use --hard if you don't care about keeping the changes you made

এখন git logদেখানো হবে যে আমাদের শেষ প্রতিশ্রুতি অপসারণ করা হয়েছে।

কীভাবে জনসমর্থন পূর্বাবস্থায় ফেরাবেন to

যদি আপনি ইতিমধ্যে আপনার প্রতিশ্রুতিগুলি সর্বজনীন করে ফেলেছেন তবে আপনি একটি নতুন প্রতিশ্রুতি তৈরি করতে চাইবেন যা আপনার পূর্ববর্তী প্রতিশ্রুতি (বর্তমান হেড) এ পরিবর্তনগুলি "প্রত্যাবর্তন" করবে।

git revert HEAD

আপনার পরিবর্তনগুলি এখন উল্টানো হবে এবং আপনাকে প্রতিশ্রুতিবদ্ধ করার জন্য প্রস্তুত:

git commit -m 'restoring the file I removed by accident'
git log
    commit 102: restoring the file I removed by accident
    commit 101: removing a file we don't need
    commit 100: adding a file that we need

আরও তথ্যের জন্য, গিট বেসিকগুলি - পূর্বাবস্থায় ফেরা বিষয়গুলি দেখুন


101
আমি এই উত্তরটি সবচেয়ে পরিষ্কার খুঁজে পেয়েছি। git revert HEAD^আগেরটি নয়, আগেরটির আগেরটি। আমি করেছি: git revert HEADএবং তারপরে আবার ঠেলাঠেলি করুন এবং এটি কাজ করেছে :)
nacho4d

যদি গিট আপনাকে "আরও?" আপনি যখন এই আদেশগুলি চেষ্টা করেন, তখন এই উত্তরের বিকল্প বাক্য গঠনটি
টার

1745

আপনার পছন্দ মতো জিনিসগুলি পেতে ফাইলগুলি যুক্ত / সরান:

git rm classdir
git add sourcedir

তারপরে প্রতিশ্রুতি সংশোধন করুন:

git commit --amend

পূর্ববর্তী, ভ্রান্ত প্রতিশ্রুতি সম্পাদিত হবে নতুন সূচক রাজ্যের প্রতিফলন করার জন্য - অন্য কথায়, এটি এমন হবে যে আপনি প্রথম স্থানে ভুল করেন নি।

মনে রাখবেন যে আপনি যদি এখনও চাপ না দিয়ে থাকেন তবে আপনার কেবল এটি করা উচিত। আপনি যদি ধাক্কা দিয়ে থাকেন, তবে আপনাকে কেবল স্বাভাবিকভাবেই একটি সংশোধন করতে হবে।


2
এফওয়াইআই: এটি আমার সমস্ত ফাইল সরিয়ে দেয় এবং আমি পরিবর্তনগুলি হারিয়েছি।
egorlitvinenko

ইউপিডি: তবে, আমি এটি রিফ্লগ ব্যবহার করে পুনরুদ্ধার করেছি। তবে প্রাপ্তি প্রাথমিক প্রতিশ্রুতিবদ্ধতার জন্য কাজ করে নি।
egorlitvinenko

1
git rm --cachedফাইল সিস্টেমে ফাইলগুলি রাখার জন্য ব্যবহার করুন এবং সেগুলি কেবল গিট সূচক থেকে মুছুন!
xuiqzy

1014
git rm yourfiles/*.class
git commit -a -m "deleted all class files in folder 'yourfiles'"

অথবা

git reset --hard HEAD~1

সতর্কতা: উপরোক্ত কমান্ডটি আপনি যে .javaফাইলগুলি সম্পাদন করতে চেয়েছিলেন সেগুলি (এবং অন্য কোনও ফাইল) র স্থায়ীভাবে মুছে ফেলবে ।

hard resetথেকে HEAD-1এর কমিট আপনার ভুল কমিট আগে অবস্থায় আপনি কাজ কপি সেট হবে।


19
git commit -a -m ""বা git commit -am ""স্বাভাবিকভাবে! :]
ট্রেন্ডার

স্ট্যাশ এর আরেকটি 'শর্টকাট' ব্যবহার; আপনি যদি সমস্ত কিছু আনস্টেজ করতে চান (গিট অ্যাডটি পূর্বাবস্থান করুন), ঠিক git stashতখনইgit stash pop
seanriordan08

778

শেষ প্রতিশ্রুতি পরিবর্তন

সূচীতে ফাইলগুলি প্রতিস্থাপন করুন:

git rm --cached *.class
git add *.java

তারপরে, এটি কোনও বেসরকারী শাখা হলে, অঙ্গীকারটি সংশোধন করুন:

git commit --amend

বা এটি যদি একটি ভাগ করা শাখা হয় তবে একটি নতুন অঙ্গীকার করুন:

git commit -m 'Replace .class files with .java files'


( পূর্ববর্তী প্রতিশ্রুতি পরিবর্তন করতে, দুর্দান্ত ইন্টারেক্টিভ রিবেস ব্যবহার করুন ))


ProTip ™: যোগ *.classএকটি থেকে gitignore আবার এই ঘটছে থামাতে।


প্রতিশ্রুতি ফিরে

যদি আপনি শেষ পরিবর্তন কমিট প্রয়োজন, কিন্তু একটি সাধারণ সমাধান সংশোধনের একটি কমিট আদর্শ সমাধান reset

আপনি যে কোনও প্রতিশ্রুতিতে গিটটি পুনরায় সেট করতে পারেন:

git reset @~N

Nআগে কমিটের সংখ্যাটি কোথায় HEADএবং @~পূর্বের প্রতিশ্রুতিতে পুনরায় সেট করে।

সুতরাং, প্রতিশ্রুতি সংশোধন করার পরিবর্তে আপনি ব্যবহার করতে পারেন:

git reset @~
git add *.java
git commit -m "Add .java files"

এটি কী করে তার আরও ভাল বোঝার জন্য git help reset, বিশেষত বিভাগগুলি --soft --mixedএবং দেখুন Check--hard

Reflog

আপনি যদি বিশৃঙ্খলা সৃষ্টি করেন তবে আপনি সর্বদা বাদ পড়া প্রতিশ্রুতিগুলি অনুসন্ধান করতে রিফ্লগটি ব্যবহার করতে পারেন:

$ git reset @~
$ git reflog
c4f708b HEAD@{0}: reset: moving to @~
2c52489 HEAD@{1}: commit: added some .class files
$ git reset 2c52489
... and you're back where you started



2
ভবিষ্যতে যারা পড়ছেন তাদের জন্য - দয়া করে নোট করুন এটি git revertএকটি পৃথক কমান্ড - যা মূলত একক কমিটকে 'পুনরায় সেট' করে।
বিকেএসপুরগাঁও

680

ব্যবহার git revert <commit-id>

কমিট আইডি পেতে, কেবল ব্যবহার করুন git log


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

আমি সবেমাত্র মনোযোগের git revert commit-idমতো কাজে লাগিয়েছি। অবশ্যই আপনার নিজের পরিবর্তনগুলি ঠেলাতে হবে।
কেসি রবিনসন

8
আমি বিশ্বাস করি এটি git cherry-pick <<erroneous-commit-sha>>@ অ্যাস্ট্রোনোমার্ডেভে হবে। থেকে, মিঃ প্রায়-2-বছর-দেরিতে-থেকে-পার্টি।
টম হাওয়ার্ড

@ ক্রিস: চেরি-পিকের ব্যবহারের পুনরায় ব্যবহারের পরিবর্তে। কারণ এটি চেরি-বাছাই করা উন্নত
ইউজেন কনকভ

আমি যদি আমার প্রতিশ্রুতিটি ইতিমধ্যে ঠেলে দিই তবে আমি রিভার্ট ব্যবহার করব। অন্যথায়, পুনরায় সেট করা একটি ভাল বিকল্প। মনে রাখবেন না যে রিভার্ট একটি নতুন প্রতিশ্রুতি তৈরি করে এবং সাধারণত এটি লক্ষ্য নয় not
হোলা সোয় এদু ফেলিজ নাভিদাদ

532

আপনি যদি কোনও স্থানীয় কমিটিকে পুরোপুরি পূর্বাবস্থায় ফিরিয়ে আনার পরিকল্পনা করে থাকেন তবে আপনি যে কোনও পরিবর্তনই প্রতিশ্রুতিতে করেছেন এবং যদি আপনি সে সম্পর্কে কিছু চিন্তা না করেন তবে কেবল নীচের আদেশটি করুন।

git reset --hard HEAD^1

(এই আদেশটি আপনার সম্পূর্ণ প্রতিশ্রুতি উপেক্ষা করবে এবং আপনার পরিবর্তনগুলি আপনার স্থানীয় কার্যনির্বাহী গাছ থেকে সম্পূর্ণরূপে হারিয়ে যাবে)। যদি আপনি নিজের প্রতিশ্রুতিটি পূর্বাবস্থায় ফেরাতে চান তবে আপনি মঞ্চ অঞ্চলে আপনার পরিবর্তনগুলি চান (ঠিক আগের মতো প্রতিশ্রুতি দেওয়ার আগে git add) তবে নিম্নলিখিত কমান্ডটি করুন।

git reset --soft HEAD^1

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

git reset HEAD

এখন প্রতিশ্রুত ফাইলগুলি স্টেজেড অঞ্চল থেকে অচঞ্চল অঞ্চলে আসতে। এখন ফাইলগুলি সম্পাদনা করার জন্য প্রস্তুত, সুতরাং আপনি যা কিছু পরিবর্তন করুন না কেন আপনি সম্পাদনা করে এটিকে যুক্ত করতে এবং একটি নতুন / নতুন প্রতিশ্রুতিবদ্ধ করতে চান।

অধিক


13
@ এসএমআর, আপনার উদাহরণে, সমস্তই কেবল বর্তমান হেডের দিকে নির্দেশ করছে। হেড ^ = হেড ^ 1। পাশাপাশি হেড ^ 1 = হেড ~ 1। আপনি যখন হেড ~ 2 ব্যবহার করেন তখন ~ এবং ols চিহ্নগুলির মধ্যে পার্থক্য থাকে। আপনি যদি ~ 2 এর অর্থ "প্রথম পিতামাতার প্রথম পিতামাতা" বা "দাদা-পিতা" ব্যবহার করেন।
মাধন আইয়াসামি

501

আপনার যদি গিট অতিরিক্ত ইনস্টল git undoকরা থাকে তবে আপনি সর্বশেষ প্রতিশ্রুতি পূর্বাবস্থায় ফেরাতে পারেন । git undo 3শেষ তিনটি কমিট পূর্বাবস্থায় ফিরে আসবে।


470

আমি আমাদের ভাগ করা ভান্ডারগুলিতে সর্বশেষ পাঁচটি কমিট পূর্বাবস্থায় ফিরতে চেয়েছিলাম। আমি যে সংশোধন আইডিটিতে রোলব্যাক করতে চেয়েছিলাম তা সন্ধান করলাম। তারপরে আমি নীচে টাইপ করেছি।

prompt> git reset --hard 5a7404742c85
HEAD is now at 5a74047 Added one more page to catalogue
prompt> git push origin master --force
Total 0 (delta 0), reused 0 (delta 0)
remote: bb/acl: neoneye is allowed. accepted payload.
To git@bitbucket.org:thecompany/prometheus.git
 + 09a6480...5a74047 master -> master (forced update)
prompt>

25
ভাগ করা সংগ্রহস্থলে পুনরায় লেখার ইতিহাস সাধারণত খুব খারাপ ধারণা। আমি ধরে নিচ্ছি আপনি কী করছেন তা আমি জানি, আমি কেবল ভবিষ্যতের পাঠকরাও আশা করি।
ব্র্যাড কোচ

হ্যাঁ রোলব্যাক বিপজ্জনক। আপনার চাপ দেওয়ার আগে আপনার কাজের অনুলিপি পছন্দসই অবস্থায় রয়েছে তা নিশ্চিত করুন। চাপ দেওয়ার পরে অযাচিত কমিটগুলি স্থায়ীভাবে মুছে ফেলা হবে।
নিউইনি

6
"সত্যিকারের বিশ্বের মতো, আপনি যদি ইতিহাস পুনর্লিখন করতে চান তবে আপনার একটি ষড়যন্ত্রের দরকার: প্রত্যেককে ষড়যন্ত্রের বিষয়ে 'অন্তর্ভুক্ত' থাকতে হবে (অন্তত ইতিহাস সম্পর্কে যারা জানেন, বা যারা শাখা থেকে বেরিয়ে এসেছেন প্রত্যেকে) । " উত্স: stackoverflow.com/a/2046748/334451
Mikko Rantalainen

440

আমি git rebase -iএই কাজের জন্য ব্যবহার করতে পছন্দ করি কারণ একটি দুর্দান্ত তালিকা পপ আপ হয় যেখানে আমি পরিত্রাণ পেতে কমিটগুলি বেছে নিতে পারি। এটি এখানে অন্য কয়েকটি উত্তরের মতো সরাসরি নাও হতে পারে তবে এটি সঠিক বলে মনে হচ্ছে

আপনি কয়টি কমিটের তালিকাবদ্ধ করতে চান তা চয়ন করুন, তারপরে এইভাবে প্রার্থনা করুন (শেষ তিনটি তালিকাভুক্ত করতে)

git rebase -i HEAD~3

নমুনা তালিকা

pick aa28ba7 Sanity check for RtmpSrv port
pick c26c541 RtmpSrv version option
pick 58d6909 Better URL decoding support

তারপরে গিট আপনার দ্বারা সরানো যে কোনও লাইনের কমিটস সরিয়ে দেবে।


422

কীভাবে আগের স্থানীয় কমিট ঠিক করবেন

একটি সম্পাদন করতে গিট-গুই (বা অনুরূপ) ব্যবহার করুন git commit --amend। জিইউআই থেকে আপনি কমিট থেকে পৃথক ফাইলগুলি যুক্ত করতে বা সরাতে পারেন। আপনি প্রতিশ্রুতি বার্তা পরিবর্তন করতে পারেন।

কীভাবে পূর্ববর্তী স্থানীয় প্রতিশ্রুতি পূর্বাবস্থাপন করবেন

কেবলমাত্র আপনার শাখাটি পূর্ববর্তী স্থানে পুনরায় সেট করুন (উদাহরণস্বরূপ, ব্যবহার gitkবা ব্যবহার করুন git rebase)। তারপরে সংরক্ষিত অনুলিপি থেকে আপনার পরিবর্তনগুলি পুনরায় প্রয়োগ করুন। আপনার স্থানীয় সংগ্রহশালায় আবর্জনা সংগ্রহের পরে, এটি অযাচিত প্রতিশ্রুতির মতো হবে never একক কমান্ডে সে সব করতে, ব্যবহার করুন git reset HEAD~1

সতর্কতার শব্দ : আপনার কাজকৃত git resetঅনুলিপিটিকে বিভ্রান্তিকর অবস্থায় পাওয়ার জন্য অযত্ন ব্যবহার a আমি পরামর্শ দিচ্ছি যে গিট নোভিসরা তারা পারলে এটি এড়াতে পারেন।

কীভাবে জনসমর্থন পূর্বাবস্থায় ফেরাবেন to

পরিবর্তনগুলি পূর্বাবস্থায় ফেরানোর জন্য একটি বিপরীত চেরি পিক ( গিট-রিভার্ট ) করুন।

আপনি যদি এখনও নিজের শাখায় অন্যান্য পরিবর্তনগুলি না নিয়ে থাকেন তবে আপনি কেবল ...

git revert --no-edit HEAD

তারপরে আপনার আপডেট হওয়া শাখাটি ভাগ করে নেওয়া ভাণ্ডারগুলিতে চাপুন।

প্রতিশ্রুতিবদ্ধ ইতিহাস পৃথক পৃথক পৃথক উভয়ই কমিট প্রদর্শন করবে


উন্নত: সরকারী ভাণ্ডারে ব্যক্তিগত শাখার সংশোধন

এটি বিপজ্জনক হতে পারে - নিশ্চিত করুন আপনার কাছে পুনরায় চাপ দেওয়ার জন্য শাখার স্থানীয় কপি রয়েছে।

আরও মনে রাখবেন: অন্য কেউ যদি শাখায় কাজ করছেন তবে আপনি এটি করতে চাইবেন না।

git push --delete (branch_name) ## remove public version of branch

স্থানীয়ভাবে আপনার শাখাটি পরিষ্কার করুন এবং পুনরায় চাপুন ...

git push origin (branch_name)

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


8
gitk --all $(git reflog | cut -c1-7)&আপনি যদি '--amend' কমিট পূর্বাবস্থায় ফিরিয়ে নিতে চান তবে পূর্ববর্তী সংশোধনটি সন্ধানের জন্য সহায়ক হতে পারে।
নোবার

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

আমি মনে করি যে 'ব্যক্তিগত' / 'পাবলিক' আরও সঠিকভাবে 'স্থানীয়' / 'দূরবর্তী' হবে।
নোটার

দূরবর্তী সংগ্রহস্থলটিতে একটি বেসরকারী শাখা সংশোধন করা git push origin (branch_name) --force
সহজভাবেও

335

আপনি যদি স্থায়ীভাবে এটিকে পূর্বাবস্থায় ফিরিয়ে আনতে চান এবং আপনি কিছু ভাণ্ডার ক্লোন করেছেন

কমিট আইডি দ্বারা দেখা যেতে পারে

git log 

তাহলে আপনি করতে পারেন -

git reset --hard <commit_id>

git push origin <branch_name> -f

আপনি যদি "<কমিট_আইডি>" ব্যবহার না করেন এবং কেবল "গিট রিসেট --হাড়্ড" ব্যবহার করেন? আমি সাধারণত আমার সর্বশেষ আপডেটগুলি থেকে মুক্তি পেতে চাই যা আমি এখনও প্রতিশ্রুতিবদ্ধ হই নি এবং আমার করা সর্বশেষ প্রতিশ্রুতি ফিরে পেয়েছি এবং আমি সর্বদা "গিট রিসেট --হার্ড" ব্যবহার করি।
জাইমে মন্টোয়া

3
@ জাইমমনটায় সর্বশেষ পরিবর্তনগুলি আপনি ব্যবহার করতে পারেন তা পূর্বাবস্থায় ফেলার জন্য git reset --hard, তবে আপনাকে শেষ "এন"
কমিটস

334

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

git reset --soft HEAD~1

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

এর পরিবর্তে মাথা ব্যবহারের আগে কমিট করার পরে কমপ্লেটিভ ট্রি থেকে ট্র্যাক করা ফাইলগুলিতে যে কোনও পরিবর্তন থেকে মুক্তি পেতে চান " hard

অথবা

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

git revert HEAD

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


আমি ২ য় ক্ষেত্রে আছি, তবে যখন আমি "গিট রিভার্ট হেড" করি তখন এটি বলে যে "ত্রুটি: কমিট [আইডি] একীভূত হলেও কোনও-এম বিকল্প দেওয়া হয়নি। মারাত্মক: রিভার্ট ব্যর্থ হয়েছে"। কোন পরামর্শ?
মেটাফোরজ

2
সম্ভবত এটির উল্লেখযোগ্য যে আপনার পরিবর্তে HEAD~1প্রকৃত হ্যাশটি প্রদর্শিত git log --statবা দ্বারা কার্যকর হিসাবে ব্যবহৃত হতে পারে git reflog- যখন আপনাকে একাধিক প্রতিশ্রুতিবদ্ধতা 'পূর্বাবস্থায়' লাগানোর প্রয়োজন হয়।
সিসিপিজ্জা

284

উপর SourceTree (GitHub ব্যবস্থার GUI), আপনি কমিট এবং একটি 'বিপরীত কমিট' do ডান-ক্লিক করতে পারেন। এটি আপনার পরিবর্তনগুলি পূর্বাবস্থায় ফেলা উচিত।

টার্মিনালে:

আপনি বিকল্পভাবে ব্যবহার করতে পারেন:

git revert

বা:

git reset --soft HEAD^ # Use --soft if you want to keep your changes.
git reset --hard HEAD^ # Use --hard if you don't care about keeping your changes.

263

একটি একক আদেশ:

git reset --soft 'HEAD^' 

সর্বশেষ স্থানীয় প্রতিশ্রুতি পূর্বাবস্থায় ফিরতে এটি দুর্দান্ত কাজ করে!


11
আমাকে গিট রিসেট লিখতে হবে - ডাবল কোট সহ "হেড ^" সাফ করুন, কারণ আমি এটি উইন্ডোজ কমান্ড প্রম্পট থেকে লিখি।
এনা

253

কেবল নীচের কমান্ডটি ব্যবহার করে এটি পুনরায় সেট করুন git:

git reset --soft HEAD~1

ব্যাখ্যা করুন: কী git resetকরে, এটি মূলত resetআপনি যে কোনও প্রতিশ্রুতিতে ফিরে যেতে চান তা হ'ল, তবে আপনি যদি এটি --softকী এর সাথে একত্রিত করেন তবে তা ফিরে যাবে, তবে আপনার ফাইল (গুলি) এ পরিবর্তনগুলি রাখবে, তাই আপনি আবার মঞ্চে ফিরে আসুন ফাইলটি সবেমাত্র যুক্ত করা হয়েছে, HEADশাখার প্রধান এবং আপনি যদি এটির সাথে মিলিত হন ~1(এই ক্ষেত্রে আপনি এটিও ব্যবহার করেন HEAD^) তবে এটি কেবল একটি প্রতিশ্রুতি ফিরে পাবে যা আপনি চান ...

আমি আপনার জন্য আরও বিশদে নীচে চিত্রের ধাপগুলি তৈরি করেছি, বাস্তব পরিস্থিতিতে ঘটতে পারে এমন সমস্ত পদক্ষেপ এবং কোড প্রতিশ্রুতি সহ:

গিটের সর্বশেষ কমিটগুলি কীভাবে পূর্বাবস্থাপন করবেন?


239

কিভাবে শেষ গিট কমিট পূর্বাবস্থায়?

সর্বশেষ প্রতিশ্রুতি হওয়ার আগে যেমন ছিল তেমন সবকিছু পুনরুদ্ধার করতে আমাদের হেডের আগে প্রতিশ্রুতিতে পুনরায় সেট করতে হবে।

  1. আপনি নিজের পরিবর্তনগুলি যদি রাখতে চান না:

    git reset --hard HEAD^
    
  2. আপনি যদি নিজের পরিবর্তনগুলি রাখতে চান:

    git reset --soft HEAD^
    

এখন আপনার গিট লগ চেক করুন। এটি দেখায় যে আমাদের শেষ প্রতিশ্রুতি অপসারণ করা হয়েছে।


192

"কার্যনির্বাহী গাছটিকে শেষ প্রতিশ্রুতিতে পুনরায় সেট করুন"

git reset --hard HEAD^ 

"কার্যকারী গাছ থেকে অজানা ফাইলগুলি পরিষ্কার করুন"

git clean    

দেখুন - গিট কুইক রেফারেন্স

দ্রষ্টব্য: এই আদেশটি আপনার পূর্ববর্তী প্রতিশ্রুতি মুছে ফেলবে, তাই সতর্কতার সাথে ব্যবহার করুন! git reset --hardনিরাপদ।


190

একটি সঠিক অবস্থা সন্ধান করতে রিফ্লগ ব্যবহার করুন

git reflog

আগে রিফ্লগ রিসেটের আগে রিফ্লাগ করুন

সঠিক রিফ্লগ নির্বাচন করুন (আমার ক্ষেত্রে f3cb6e2) এবং টাইপ করুন

git reset --hard f3cb6e2

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

অবশেষে রিফ্লগটি নীচের ছবির মতো দেখাচ্ছে

রিফ্লগ পরে ফাইনাল রিফ্লোগ করুন


164

প্রথম রান:

git reflog

এটি আপনাকে আপনার সংগ্রহস্থলের উপর সম্পাদিত সমস্ত সম্ভাব্য ক্রিয়া প্রদর্শন করবে, উদাহরণস্বরূপ, প্রতিশ্রুতিবদ্ধ, মার্জ, টান, ইত্যাদি actions

তারপরে:

git reset --hard ActionIdFromRefLog

155

শেষ প্রতিশ্রুতি বাতিল করুন:

git reset --soft HEAD^ অথবা git reset --soft HEAD~

এটি শেষ প্রতিশ্রুতি পূর্বাবস্থায় ফিরে আসবে।

এখানে --softমঞ্চে পুনরায় সেট করার অর্থ।

HEAD~বা এর HEAD^মানে হ'ল আগে প্রতিশ্রুতিবদ্ধ করা।


নতুন প্রতিশ্রুতিতে সর্বশেষ প্রতিশ্রুতি প্রতিস্থাপন করুন:

git commit --amend -m "message"

এটি নতুন প্রতিশ্রুতি দিয়ে শেষ প্রতিশ্রুতি প্রতিস্থাপন করবে।


153

অন্য উপায়:

আপনি যে শাখায় ফিরে যেতে চান তার চেকআউট করুন, তারপরে আপনার স্থানীয় ওয়ার্কিং কপিটি রিমোট সার্ভারের সর্বশেষতম হতে চান এমন প্রতিশ্রুতিতে পুনরায় সেট করুন (এটির পরে সমস্ত কিছু বিদায় নিবে)। এটি করতে, সোর্সট্রি-তে আমি ডান ক্লিক করেছি এবং "এই প্রতিশ্রুতিতে BRANCHNAME পুনরায় সেট করুন" নির্বাচন করেছি।

তারপরে আপনার সংগ্রহস্থলের স্থানীয় ডিরেক্টরিতে নেভিগেট করুন এবং এই আদেশটি চালান:

git -c diff.mnemonicprefix=false -c core.quotepath=false push -v -f --tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME

এটি আপনার স্থানীয় সংগ্রহস্থলে বর্তমানের পরে সমস্ত কমান্ড মুছে ফেলবে তবে কেবলমাত্র সেই শাখার জন্য।



139

আমার ক্ষেত্রে আমি দুর্ঘটনাক্রমে কিছু ফাইল সংঘবদ্ধ করেছিলাম যা আমি চাইনি। সুতরাং আমি নিম্নলিখিতগুলি করেছি এবং এটি কাজ করেছে:

git reset --soft HEAD^
git rm --cached [files you do not need]
git add [files you need]
git commit -c ORIG_HEAD

গিটক বা গিট লগ - স্ট্যাট সহ ফলাফলগুলি যাচাই করুন


133

সরল, আপনার কমান্ড লাইনে এটি চালান:

git reset --soft HEAD~ 

126

এটি করার বিভিন্ন উপায় রয়েছে:

শেষ প্রতিশ্রুতি / পূর্ববর্তী অঙ্গীকারগুলি পূর্বাবস্থায় ফেলার জন্য গিট কমান্ড:

সতর্কতা: আপনি কী করছেন তা যদি না জানেন তবে - ব্যবহার করবেন না hard --হার্ড খুব বিপজ্জনক , এবং এটি আপনার ফাইলগুলি মুছতে পারে

গিটের প্রতিশ্রুতি ফিরিয়ে আনার প্রাথমিক কমান্ডটি হ'ল:

$ git reset --hard <COMMIT -ID>

অথবা

$ git reset --hard HEAD~<n>

কমিট আইডি : প্রতিশ্রুতি জন্য আইডি

এন: আপনি প্রত্যাবর্তন করতে চান এমন সর্বশেষ কমিটের সংখ্যা

নীচে প্রদর্শিত হিসাবে আপনি প্রতিশ্রুতি আইডি পেতে পারেন:

$ **git log --oneline**

d81d3f1 function to subtract two numbers

be20eb8 function to add two numbers

bedgfgg function to mulitply two numbers

যেখানে d81d3f1 এবং be20eb8 কমিট আইডি।

এখন কিছু ঘটনা দেখুন:

মনে করুন আপনি শেষ প্রতিশ্রুতি 'd81d3f1' ফিরিয়ে দিতে চান। এখানে দুটি বিকল্প রয়েছে:

$ git reset --hard d81d3f1

অথবা

$ git reset --hard HEAD~1

মনে করুন আপনি 'be20eb8' প্রতিশ্রুতিটি ফিরিয়ে দিতে চান:

$ git reset --hard be20eb8

আরও বিশদ তথ্যের জন্য আপনি নির্দিষ্ট অবস্থানে মাথা পুনর্নির্মাণের জন্য আরও কিছু কমান্ড উল্লেখ করতে এবং চেষ্টা করতে পারেন:

$ git reset --help

5
git reset --hard HEAD~1হয় খুবই বিপদজনক ! এটি কেবল 'শেষ প্রতিশ্রুতি বাতিল' করবে না, তবে রেপোটিকে পুরোপুরি পূর্ববর্তী প্রতিশ্রুতিতে ফিরিয়ে দেবে। সুতরাং আপনি সর্বশেষ প্রতিশ্রুতিবদ্ধ প্রতিশ্রুতিবদ্ধ সমস্ত পরিবর্তনগুলি হারাবেন!
অরনিস জুরাগা

আপনি ঠিক বলেছেন, এটিকে পূর্বাবস্থায় রাখতে আপনি ব্যবহার করতে পারেনgit push -f <remote> HEAD@{1}:<branch>
বেনি

দুর্ভাগ্যক্রমে, আমি --hard ব্যবহার করি, এবং আমার ফাইলগুলি মুছে ফেলা হয়! আমি মন্তব্যটি প্রথমে চেক করিনি কারণ এটি ধসে পড়েছে। আপনি কী করছেন তা যদি আপনি না জানেন তবে - ব্যবহার করবেন না!
বেনামে

125

একটি স্থানীয় কমিট জন্য

git reset --soft HEAD~1

বা এটি ঠিক কোনটি প্রতিশ্রুতিবদ্ধ তা ঠিক মনে না থাকলে আপনি ব্যবহার করতে পারেন

git rm --cached <file>

একটি ধাক্কা কমিট জন্য

সংগ্রহস্থলের ইতিহাস থেকে ফাইলগুলি সরানোর সঠিক উপায়টি ব্যবহার করা হচ্ছে git filter-branch। এটাই,

git filter-branch --index-filter 'git rm --cached <file>' HEAD

তবে আমি আপনাকে এই আদেশটি যত্ন সহকারে ব্যবহার করতে চাই। গিট-ফিল্টার-শাখায় আরও পড়ুন (1) ম্যানুয়াল পৃষ্ঠা


125

দুটি প্রধান দৃশ্য আছে

আপনি এখনও প্রতিশ্রুতিবদ্ধ হন নি

সমস্যাটি যদি আপনি অতিরিক্ত ফাইল করেন (এবং আপনি যে সংগ্রহস্থলগুলিতে চান না) থাকেন তবে আপনি সেগুলি ব্যবহার করে মুছে ফেলতে git rmএবং তারপরে কমিট করতে পারেন--amend

git rm <pathToFile>

এছাড়াও আপনি সঙ্গে সমগ্র ডিরেক্টরি অপসারণ করতে পারেন -r, অথবা এমনকি অপরের সাথে মেশা ব্যাশ কমান্ড

git rm -r <pathToDirectory>
git rm $(find -name '*.class')

ফাইলগুলি অপসারণের পরে, --amend বিকল্পের সাহায্যে আপনি কমিট করতে পারেন

git commit --amend -C HEAD # the -C option is to use the same commit message

এটি অতিরিক্ত ফাইলগুলি মুছে ফেলার জন্য আপনার সাম্প্রতিক স্থানীয় প্রতিশ্রুতি পুনর্লিখন করবে, সুতরাং, এই ফাইলগুলি কখনও ধাক্কায় পাঠানো হবে না এবং এটিও আপনার স্থানীয় .git সংগ্রহস্থল থেকে জিসি দ্বারা সরানো হবে।

আপনি ইতিমধ্যে প্রতিশ্রুতি ধাক্কা

আপনি অন্যান্য দৃশ্যের একই সমাধানটি প্রয়োগ করতে পারেন এবং তারপরে অপশনটি git pushদিয়ে কাজ করতে পারেন -fতবে এটি প্রস্তাবিত নয় যেহেতু এটি দূরবর্তী ইতিহাসকে বিচ্ছিন্ন পরিবর্তনের সাথে ওভাররাইট করে (এটি আপনার সংগ্রহস্থলকে গোলমাল করতে পারে)।

পরিবর্তে, আপনাকে প্রতিশ্রুতি ছাড়াই করতে হবে --amend( এটি সম্পর্কে মনে রাখবেন: - এই বিকল্পটি শেষ প্রতিশ্রুতিতে ইতিহাস পুনর্লিখন করে)।


125

পূর্ববর্তী পুনর্বিবেচনায় পুনরায় সেট করতে স্থায়ীভাবে সমস্ত আপত্তিহীন পরিবর্তনগুলি মুছুন:

git reset --hard HEAD~1

23
হতে পারে আপনি কোনও নোট / সতর্কবাণীতে বলতে পারেন যে তাঁর আদেশটি আরও কিছু জিজ্ঞাসা না করে কমিট এবং কার্যনির্বাহী ডিরেক্টরিতে পরিবর্তনগুলি ফেলে দেবে throw
cr7pt0gr4ph7

6
আপনি যদি দুর্ঘটনাক্রমে এটি করতে যান তবে সমস্তটি হারাবে না। দেখুন stackoverflow.com/questions/10099258/... , stackoverflow.com/questions/15479501/... এবং stackoverflow.com/questions/7374069/undo-git-reset-hard/7376959
cr7pt0gr4ph7

13
ব্যবহারের --softহিসাবে আপনার পরিবর্তনগুলি রাখার uncommitted changes, --hardnuke সম্পূর্ণভাবে এবং একের পর প্রত্যাবর্তন ফিরে কমিট। শুধুমাত্র পরিবর্তনগুলিতে এ জাতীয় অপারেশনগুলি মনে রাখবেন, এগুলি এখনও ঠেলা হয় না।
ইউনূস নেদিম মেহেল

@ জাজ: আপনি ঠিক বলেছেন; সম্ভবত আমার এটা স্পষ্ট করা উচিত ছিল। কেবলমাত্র ফাইল / পরিবর্তনগুলি যা হয় সূচকে যুক্ত হয়েছে (/ পর্যায়ক্রমে) বা প্রতিশ্রুতিবদ্ধ হয়েছে সম্ভবত পুনরুদ্ধার করা যেতে পারে। মুক্ত, unstaged পরিবর্তন হয় , যেমন তুমি বলেছিলে, সম্পূর্ণ দূরে দ্বারা নিক্ষিপ্ত git reset --hard
cr7pt0gr4ph7

1
সাইডেনোট হিসাবে: যতবারই কোনও ফাইল মঞ্চস্থ হয়, gitএর বিষয়বস্তুগুলি তার অবজেক্ট ডাটাবেসে সংরক্ষণ করে। জঞ্জাল সংগ্রহ কার্যকর হলেই সঞ্চিত সামগ্রীগুলি সরিয়ে ফেলা হয়। অতএব কোনও ফাইলের শেষ পর্যায়ের সংস্করণটি পুনরুদ্ধার করা সম্ভব যা বর্তমানে মঞ্চস্থ হয়নিgit reset --hard মৃত্যুদন্ড কার্যকর করার হয় নি (আরও তথ্যের জন্য উপরের লিঙ্কযুক্ত পোস্টগুলি দেখুন)।
cr7pt0gr4ph7
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.