"গিট কমিট - এ্যামেন্ড" কীভাবে "গিট কমিট" এর পরিবর্তে করা যায়


1293

আমি দুর্ঘটনাক্রমে আমার আগের প্রতিশ্রুতি সংশোধন করেছি। আমি একটি নির্দিষ্ট ফাইলে যে পরিবর্তন করেছি সেগুলির ইতিহাস রাখার জন্য অঙ্গীকারটি আলাদা হওয়া উচিত ছিল।

শেষ প্রতিশ্রুতিটি পূর্বাবস্থায় নেওয়ার কোনও উপায় আছে? আমি যদি এমন কিছু করি git reset --hard HEAD^তবে প্রথম প্রতিশ্রুতিও পূর্বাবস্থায় ফিরে আসেনি।

(আমি এখনও কোনও দূরবর্তী ডিরেক্টরিতে ঠেলিনি)

উত্তর:


2285

আপনাকে যা করতে হবে তা হল বর্তমান HEADপ্রতিশ্রুতি হিসাবে একই বিবরণ সহ একটি নতুন প্রতিশ্রুতি তৈরি করা , তবে পূর্ববর্তী সংস্করণ হিসাবে পিতামাতার সাথে HEADgit reset --softব্রাঞ্চ পয়েন্টারটি সরানো হবে যাতে পরবর্তী কমিট একটি পৃথক কমিটের শীর্ষে ঘটে যেখানে এখনকার শাখার প্রধান এখন।

# Move the current head so that it's pointing at the old commit
# Leave the index intact for redoing the commit.
# HEAD@{1} gives you "the commit that HEAD pointed at before 
# it was moved to where it currently points at". Note that this is
# different from HEAD~1, which gives you "the commit that is the
# parent node of the commit that HEAD is currently pointing to."
git reset --soft HEAD@{1}

# commit the current tree using the commit details of the previous
# HEAD commit. (Note that HEAD@{1} is pointing somewhere different from the
# previous command. It's now pointing at the erroneously amended commit.)
git commit -C HEAD@{1}

32
খুব দুর্দান্ত, +1। এমনকি আমি এটি দ্বিতীয় শেষ সংশোধন ভিউ দিয়েও git reflogসঠিক নম্বরটি খুঁজতে {2}
জেজেডি

177
কেবল স্পষ্ট করে বলতে গেলে, প্রথম কমান্ডটি একটি সত্য "পূর্বাবস্থা" হয়। এটি হেড, ওয়ার্কিং ডিরেক্টরি (অপরিবর্তিত) এবং এর পূর্বে সূচকের অবস্থা তৈরি করে git commit --amend। ২ য়টি একটি নতুন প্রতিশ্রুতিতে "পুনরায়"। এগুলি কারও জন্যই git commit, কেবল নয় --amend
cdunn2001

60
সুতরাং যদি আপনি কোনও নতুন প্রতিশ্রুতি বার্তাটি সংশোধন না করেন যা আপনাকে উদ্ধার করতে হবে, দ্বিতীয় অংশটি কেবল নিয়মিত হতে পারে git commit
ম্যাট মন্টাগ

18
কিছু কারণে, আমি একটি ত্রুটি চলমান পেয়ে ছিল git reset --soft HEAD@{1}: fatal: ambiguous argument 'HEAD@1': unknown revision or path not in the working tree. Use '--' to separate paths from revisions। আমি যখন HEAD@{1}দেখানো সমমানের কমিট হ্যাশটির সাথে প্রতিস্থাপন করেছি git reflog(ধন্যবাদ জেজেডি!), এই উত্তরটি দুর্দান্তভাবে কাজ করেছে!
টিম কেম্বার

20
@ টিমআরনল্ড আপনার শেলের উপর নির্ভর করে আপনার চারপাশে একক বা ডাবল উদ্ধৃতি লাগতে পারে HEAD@{1}। আমি echo HEAD@{1}উদাহরণস্বরূপ tcsh চালানো হয়, আউটপুট HEAD@1কারণ বন্ধনীগুলি tcsh দ্বারা ব্যাখ্যা করা হয়েছিল। আমি যদি একক উদ্ধৃতি ব্যবহার করি তবে বন্ধনীগুলি সংরক্ষণ করা হবে।
কেলভিন

136

রেফ-লগ ব্যবহার করুন :

git branch fixing-things HEAD@{1}
git reset fixing-things

তারপরে আপনার পূর্ববর্তী সমস্ত সংশোধিত পরিবর্তনগুলি কেবলমাত্র আপনার কার্যকরী অনুলিপিতে থাকা উচিত এবং এটি আবারও প্রতিশ্রুতিবদ্ধ

পূর্ববর্তী সূচকগুলির সম্পূর্ণ তালিকা দেখতে git reflog


7
এটি সূচকটিও মুছে দেয় - এখনও দরকারী, তবে একটি সাধারণ "পূর্বাবস্থায়িত" এর বাইরে চলে যায়।
cdunn2001

3
HEAD@{1}এবং এর মধ্যে কোন পার্থক্য আছে HEAD~1?
নিউউউজিক

15
@ নিউউউজিক: হ্যাঁ! HEAD~1হ'ল বর্তমান কমিটের পিতামাতার মতোই HEAD^এবং সনাক্তকারী । অন্যদিকে, শর্তটি বোঝায় যে প্রতিশ্রুতিটি শুরুর আগে এই শিরোনামটি ইঙ্গিত করেছিল, অর্থাত্ যখন আপনি একটি ভিন্ন শাখা চেক আউট করেন বা কোনও অঙ্গীকার সংশোধন করেন তখন তাদের অর্থ বিভিন্ন অঙ্গীকার। HEAD@{1}
নিটল

@ ক্নিটল হ্যাঁ অবাক হওয়ার কিছু নেই আমি ভাবিনি এর আগে এটি সম্ভব হয়েছিল, আবারও ধন্যবাদ, ভাল তথ্য
নিউউউজিক

9
মুষ্টি পদক্ষেপ অপ্রয়োজনীয়। সহজ git reset HEAD@{1}যথেষ্ট।
বাসিন্দা

79

আপনার সংশোধিত কমিটগুলি এর দ্বারা অনুসন্ধান করুন:

git log --reflog

দ্রষ্টব্য: আপনি --patchস্বচ্ছতার জন্য কমিটির বডি দেখতে যোগ করতে পারেন। হিসাবে একই git reflog

তারপরে আপনার হেডকে পূর্বের কোনও প্রতিশ্রুতিতে পুনরায় সেট করুন এমন বিন্দুতে:

git reset SHA1 --hard

দ্রষ্টব্য: আপনার প্রকৃত প্রতিশ্রুতি হ্যাশ দিয়ে SHA1 প্রতিস্থাপন করুন । আরও মনে রাখবেন যে এই কমান্ডটি কোনও আপত্তিহীন পরিবর্তনগুলি হারাবে , সুতরাং আপনি তাদের আগে স্ট্যাশ করতে পারেন। বিকল্পভাবে, সর্বশেষ পরিবর্তনগুলি ধরে রাখতে পরিবর্তে ব্যবহার --softকরুন এবং তারপরে তাদের প্রতিশ্রুতিবদ্ধ।

তারপরে চেরি-বাছাই করুন অন্যান্য প্রতিশ্রুতি যা আপনার এটির উপরে প্রয়োজন:

git cherry-pick SHA1

26
যদি আপনি তা করেন তবে আপনি git reset SHA1 --softসর্বশেষ পরিবর্তনগুলি ধরে রাখতে পারেন এবং তারপরে তাদের প্রতিশ্রুতিবদ্ধ করতে পারেন।
pravj

24

ম্যানুয়াল থেকে আপনি সর্বদা একটি প্রতিশ্রুতি বিভক্ত করতে পারেন

  • গিট রিবেস -i কমিট with দিয়ে একটি ইন্টারেক্টিভ রিবেস শুরু করুন, যেখানে প্রতিশ্রুতিবদ্ধ প্রতিশ্রুতিটি আপনি বিভক্ত করতে চান। প্রকৃতপক্ষে, যে কোনও প্রতিশ্রুতি সীমাবদ্ধ থাকবে যতক্ষণ না এতে কমিট থাকে।
  • "সম্পাদনা" অ্যাকশনটি দিয়ে আপনি যে কমিট বিভক্ত করতে চান তা চিহ্নিত করুন।
  • যখন সেই প্রতিশ্রুতি সম্পাদনা করার কথা আসে তখন গিট রিসেট হেড exec সম্পাদন করুন ^ এর প্রভাবটি হ'ল হেড একের সাথে মিলে যায় এবং সূচকটি অনুসরণ করে। তবে কাজের গাছটি একই থাকে।
  • এখন সূচীতে পরিবর্তনগুলি যুক্ত করুন যা আপনি প্রথম প্রতিশ্রুতিতে রাখতে চান। আপনি এটি করতে গিট অ্যাড (সম্ভবত ইন্টারেক্টিভভাবে) বা গিট-গুই (বা উভয়) ব্যবহার করতে পারেন।
  • এখনই বর্তমান সূচীটি যে কোনও প্রতিশ্রুতিবদ্ধ বার্তাই উপযুক্ত Commit
  • আপনার কার্যকারী গাছ পরিষ্কার না হওয়া অবধি শেষ দুটি পদক্ষেপ পুনরাবৃত্তি করুন।
  • গিট রিবেস - অবিরত দিয়ে রিবেস চালিয়ে যান।

26
উপায় খুব জটিল। git reflogআপনার প্রয়োজন হয়
knittl

2
প্রচুর পদক্ষেপ হ্যাঁ, তবে প্রতিটি পদক্ষেপ জটিল এবং করা সহজ easy এটি আমার পক্ষে কাজ করেছে এবং আমার ভোট পেয়েছে।
ওজবন্দিত

5
অতিরিক্তভাবে, এই উত্তরটি আপনাকে ভুলক্রমে 'সংশোধিত' পরিবর্তনগুলি বেছে বেছে বেছে বেছে গিট রিসেটের জন্য কিছু অতিরিক্ত মান প্রদান করতে সহায়তা করে - s 1 হেড @ oft 1} পদ্ধতির (যা আমার সমস্যা
বিটিডব্লিউ

2
আপনি খুব সহজেই রিফ্লগ পদ্ধতিতে পরিবর্তনগুলি বেছে নিতে পারেন। শুধু git resetপরিবর্তে না git reset --soft, তারপর না git add --patch
geekofalltrades

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

20

সম্ভবত লক্ষণীয় যে আপনি যদি এখনও সম্পাদকের কাছে প্রতিশ্রুতি বার্তাটি সহ থাকেন তবে আপনি প্রতিশ্রুতি বার্তাটি মুছতে পারেন এবং এটি git commit --amendআদেশটি বাতিল করে দেবে ।


এটিই সেইটি.
এটিকেল

আমার তবে ^^ সংরক্ষণ করা
ইঞ্জিনিয়ারকোডিং

14

সম্ভবত git reflogসংশোধন করার আগে এবং সংশোধন করার পরে দুটি কমিট পেতে ব্যবহার করতে পারেন ।

তারপরে git diff before_commit_id after_commit_id > d.diffসংশোধন করার আগে এবং সংশোধন করার পরে পার্থক্য পেতে ব্যবহার করুন ।

git checkout before_commit_idপ্রতিশ্রুতিবদ্ধ করার আগে ফিরে ব্যবহার করুন

এবং git apply d.diffআসল পরিবর্তনটি আপনি প্রয়োগ করার জন্য সর্বশেষ ব্যবহার ।

এটি আমার সমস্যার সমাধান করে।


11

যদি আপনি প্রতিশ্রুতিটিকে দূরবর্তী স্থানে ঠেলে দেন এবং তারপরে ভুলের সাথে সেই প্রতিশ্রুতিতে পরিবর্তনগুলি সংশোধন করা আপনার সমস্যার সমাধান করবে। git logকমিটমেন্টের আগে এসএইচএ খুঁজতে একটি ইস্যু করুন । (এটি ধরে নেয় রিমোটটির নাম উত্স)। এখন এই SHA ব্যবহার করে এই কমান্ডটি জারি করুন।

git reset --soft <SHA BEFORE THE AMMEND>
#you now see all the changes in the commit and the amend undone

#save ALL the changes to the stash
git stash

git pull origin <your-branch> --ff-only
#if you issue git log you can see that you have the commit you didn't want to amend

git stash pop
#git status reveals only the changes you incorrectly amended

#now you can create your new unamended commit

3
এটি আরও সাধারণ প্রশ্নের একটি বিশেষ ক্ষেত্রে, তবে এটি আমার তাত্ক্ষণিক প্রয়োজনটি ঠিক ঠিক কভার করেছিল।
ডিএমকেই --- প্রাক্তন-মডারেটর বিড়ালছানা

8

আপনি নিজেরটি পূর্বাবস্থায় ফেরাতে নীচে করতে পারেন git commit —amend

  1. git reset --soft HEAD^
  2. git checkout files_from_old_commit_on_branch
  3. git pull origin your_branch_name

====================================

এখন আপনার পরিবর্তনগুলি আগের হিসাবে রয়েছে। সুতরাং আপনি পূর্বাবস্থায় ফিরে এসেছেনgit commit —amend

এখন আপনি git push origin <your_branch_name>শাখায় ঠেলাঠেলি করতে পারেন ।


3

এর প্রায় 9 বছর দেরীতে কিন্তু একই রকমটি সম্পন্ন করার কথা উল্লেখ করা এই প্রকরণটি দেখেনি (শীর্ষ জবাবের মতো এটি এর কয়েকটিটির সংমিশ্রণের মতো এটি ( https://stackoverflow.com/a/1459264/4642530 ) ।

শাখায় সমস্ত বিচ্ছিন্ন মাথা অনুসন্ধান করুন

git reflog show origin/BRANCH_NAME --date=relative

তারপরে SHA1 হ্যাশটি সন্ধান করুন

পুরানো SHA1 এ পুনরায় সেট করুন

git reset --hard SHA1

তারপরে এটিকে পিছনে ঠেলে দিন।

git push origin BRANCH_NAME

সম্পন্ন.

এটি আপনাকে পুরানো কমিটিকে পুরোপুরি ফিরিয়ে দেবে।

(পূর্বনির্ধারিত বিচ্ছিন্ন প্রতিশ্রুতি প্রধানের তারিখ সহ)


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

2
  1. শেষ প্রতিশ্রুতি সহ অস্থায়ী শাখায় চেকআউট করুন

    git branch temp HEAD@{1}

  2. শেষ প্রতিশ্রুতি পুনরায় সেট করুন

    git reset temp

  3. এখন, আপনার পূর্ববর্তী প্রতিশ্রুতিগুলির পাশাপাশি সমস্ত ফাইল থাকবে commit সমস্ত ফাইলের স্থিতি পরীক্ষা করুন।

    git status

  4. গিট স্টেজ থেকে আপনার কমিট ফাইলগুলি পুনরায় সেট করুন।

    git reset myfile1.js (শীঘ্রই)

  5. পুনরায় এই প্রতিশ্রুতিবদ্ধ

    git commit -C HEAD@{1}

  6. আপনার ফাইলগুলি নতুন প্রতিশ্রুতিতে যুক্ত করুন এবং প্রতিশ্রুতিবদ্ধ করুন।

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