বিদ্যমান, আনপিশড কমিট ম্যাসেজগুলি কীভাবে সংশোধন করবেন?


7664

আমি একটি প্রতিশ্রুত বার্তায় ভুল জিনিস লিখেছি।

আমি কীভাবে বার্তা পরিবর্তন করতে পারি? প্রতিশ্রুতি এখনও ধাক্কা হয় নি।


868
গিটে কিছুটা নতুন যারা তাদের জন্য: এখনও ঠেলাঠেলি না করার বিষয়ে লরির বক্তব্য গুরুত্বপূর্ণ। প্রতারণার মতো, এটি ইতিহাস পরিবর্তন করছে। যদি কেউ আপনার রেপো থেকে মূল এবং পুনর্লিখনের ইতিহাসের মধ্যে ক্লোন / টান করেছে তবে তারা পুনরায় লেখার পরে (সেই শাখার জন্য) টানতে পারবে না।
প্যাট নটজ

উত্তর:


16119

অতি সাম্প্রতিক প্রতিশ্রুতি বার্তা সংশোধন করা

git commit --amend

আপনার সম্পাদকটি খুলবে, আপনাকে সর্বাধিক সাম্প্রতিক প্রতিশ্রুতিবদ্ধ প্রতিশ্রুতি পরিবর্তন করার অনুমতি দেয়। অতিরিক্তভাবে, আপনি কমান্ড লাইনে সরাসরি এই বার্তাটি সেট করতে পারেন:

git commit --amend -m "New commit message"

… তবে, এটি বহু-লাইন প্রতিশ্রুতিবদ্ধ বার্তাগুলি বা ছোট সংশোধনগুলিকে প্রবেশ করতে আরও জটিল করে তুলতে পারে।

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

আপনি ইতিমধ্যে আপনার প্রত্যন্ত শাখায় ঠেলে দিয়েছেন এমন প্রতিশ্রুতির বার্তা পরিবর্তন করা

যদি আপনি ইতিমধ্যে আপনার প্রতিশ্রুতিটি আপনার প্রত্যন্ত শাখায় ঠেলে দিয়ে থাকেন, তবে - স্থানীয়ভাবে আপনার প্রতিশ্রুতি সংশোধন করার পরে (উপরে বর্ণিত) - আপনাকেও প্রতিশ্রুতিটি চাপিয়ে দিতে বাধ্য করতে হবে :

git push <remote> <branch> --force
# Or
git push <remote> <branch> -f

সতর্কতা: জোর করে চাপানো আপনার স্থানীয় অবস্থার সাথে দূরবর্তী শাখাকে ওভাররাইট করে । দূরবর্তী ডালে করে আছে আপনার স্থানীয় শাখায় না থাকে তাহলে, আপনি হবে যারা করে হারান।

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


একটি ইন্টারেক্টিভ রিবেস সম্পাদন করুন

আর একটি বিকল্প ইন্টারেক্টিভ রিবেস ব্যবহার করা হয়। এটি আপনাকে সর্বশেষতম বার্তা না হলেও আপনি আপডেট করতে চান এমন কোনও বার্তা সম্পাদনা করার অনুমতি দেয়।

গিট স্কোয়াশ করতে, এই পদক্ষেপগুলি অনুসরণ করুন:

// n is the number of commits up to the last commit you want to be able to edit
git rebase -i HEAD~n

একবার আপনি আপনার প্রতিশ্রুতি স্কোয়াশ করে দিলে - e/rবার্তা সম্পাদনা করার জন্য চয়ন করুন :

এখানে চিত্র বিবরণ লিখুন

ইন্টারেক্টিভ রিবেস সম্পর্কে গুরুত্বপূর্ণ নোট

আপনি যখন ব্যবহার করবেন তখন কমিটের চেয়েও বেশিgit rebase -i HEAD~n কিছু হতে পারে । গিট শেষ এনটি কমিট করে সমস্ত কমিটিকে "সংগ্রহ" করবে এবং যদি এই সীমার মধ্যে কোথাও একত্রিত হয় তবে আপনি সমস্ত কমিটগুলি দেখতে পাবেন, সুতরাং ফলাফলটি এন + হবে।

ভালো পরামর্শ:

যদি আপনাকে এটি একটি একক শাখার বেশি করার জন্য করতে হয় git rerereএবং সামগ্রী সংশোধন করার সময় আপনি বিবাদগুলির মুখোমুখি হতে পারেন, সেট আপ করুন এবং গিটকে আপনার জন্য স্বয়ংক্রিয়ভাবে এই দ্বন্দ্বগুলি সমাধান করতে দিন।


নথিপত্র


257
তবে git commit --amendহিসাবে শক্তিশালী না git rebase -i
জেফ্রি জোসে

76
@ জেফজোজ, এটি অবশ্যই হওয়ার দরকার নেই। এছাড়াও, git commit --amend(ক?) মাস্টার কমিট ঠিক করতে পারে।
স্টারগার

116
আপনি যদি ইতিমধ্যে ঠেলাঠেলি করে থাকেন তবে কেবল আবার চাপ দিন:git push -f origin branchname
হিউজেস

177
@ হিউজেস git push -fকিছুটা বিপজ্জনক নয় যদি অন্য লোকেরা একই ভান্ডার ব্যবহার করে?
আরমান্ড

91
আপনি যদি পুরো প্রতিশ্রুতি বার্তাটি আবার লিখতে চান না, তবে যান git commit --amend -c HEAD। এটি সম্পাদকটি আপনার পুরানো প্রতিশ্রুতি বার্তার সাহায্যে প্রাক-জনসম্মুখে খোলে যা আপনি এটি পরিবর্তন করতে পারবেন।
স্যাম

2506
git commit --amend -m "your new message"

7
আমি গিট কমিট করেছি - যেমন - নতুন "নতুন বার্তা", তবে গিথুবকে ঠেলে "আবার চাপ দেওয়ার আগে দূরবর্তী পরিবর্তনগুলি মার্জ করুন" তৈরি হয়েছিল। টানা, প্রতিশ্রুতিবদ্ধ - এবং পুনরায় চাপ দেওয়ার পরে, নতুন বার্তা উপস্থিত হবে না। পরিবর্তে আমার কাছে "গিথুব ডটকম :ેલিমিরিপো] এর মার্জ শাখা 'মাস্টার' আছে"
ডেভ এভারিট

8
@ ডেভইভারিট সম্ভবত আপনি এটি সম্পাদন করার আগে আপনার প্রতিশ্রুতিটিকে উজানে প্রবাহিত করেছেন।
থরবজর্ন রাভন অ্যান্ডারসন

12
পছন্দ করেছেন ব্যাশে আপনি সহজেই আপনার কাজ শেষ না হওয়া অবধি উদ্ধৃতি বন্ধ না করে মাল্টলাইন প্রতিশ্রুতি বার্তা রচনা করতে পারেন (উদ্ধৃতিগুলির মধ্যে প্রতিটি লাইনের শেষে প্রত্যাবর্তন)।
hobs

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

7
@ অমলমুরালি, ভাল। আমার বক্তব্যটি প্রশ্নের জনপ্রিয়তা, বা উত্তরটির ইউটিলিটি সম্পর্কে এতটা ছিল না। তবে এই নির্দিষ্ট উত্তরটি সবচেয়ে পুরানো উত্তর নয়, এটি গ্রহণযোগ্য উত্তর সম্পর্কে আরও অন্তর্দৃষ্টি দেয় না। এটি গৃহীত উত্তরের একটি বিভাগের অনুলিপি হিসাবে উপস্থিত বলে মনে হচ্ছে। আমার বক্তব্য ছিল। চিয়ার্স!
শুভ কোডার

2376

আপনি যে প্রতিশ্রুতিটি ঠিক করতে চান সেটি যদি সাম্প্রতিকতম না হয়:

  1. git rebase --interactive $parent_of_flawed_commit

    আপনি যদি বেশ কয়েকটি ত্রুটিযুক্ত কমিটগুলি ঠিক করতে চান তবে তাদের মধ্যে সবচেয়ে পুরানো পিতামাতাকে পাস করুন।

  2. আপনি যেটি দিয়েছেন তার থেকে সমস্ত কমিটের একটি তালিকা সহ একজন সম্পাদক আসবেন।

    1. পরিবর্তন pickকরার জন্য reword(অথবা পুরানো গীত এর সংস্করণ উপর edit) কোন করে আপনি ঠিক করতে চান সামনে।
    2. একবার সংরক্ষণ করার পরে, গিট তালিকাবদ্ধ কমিটগুলি পুনরায় খেলবে।

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

    1. আপনার পছন্দ মতো কোনওভাবে প্রতিশ্রুতি পরিবর্তন করুন।
    2. git commit --amend
    3. git rebase --continue

এই ক্রমটির বেশিরভাগটি আপনাকে বিভিন্ন কমান্ডের আউটপুট দ্বারা আপনাকে যাওয়ার সময় ব্যাখ্যা করবে। এটা খুব সহজ; আপনার এটি মুখস্ত করার দরকার নেই - কেবল মনে রাখবেন যে git rebase --interactiveতারা যতদিন আগেই হোক না কেন কমিটগুলি সংশোধন করতে দেয়।


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


39
কেউ কি প্রথম প্রতিশ্রুতির বার্তা পরিবর্তন করতে পারে (যার পিতামাতা নেই)?
13রে

27
এটি অন্য উত্তরের একটিতে উল্লেখ করা হয়েছে তবে আমি এখানে এটির একটি নোট রাখব। গিট 1.6.6 যেহেতু আপনি লগ বার্তা সম্পাদনা করার rewordজায়গায় ব্যবহার করতে পারেন pick
মিটমারো

89
ঘটনাচক্রে, $parent_of_flawed_commitসমতুল্য $flawed_commit^
Peeja

67
আপনি ইতিমধ্যে উজানের দিকে ধাক্কা দিলে কখনও কখনও এটি করবেন না (বা সাধারণভাবে রিবেস করুন)!
ড্যানিয়েল রিন্সার

20
ত্রুটিযুক্ত প্রতিশ্রুতিবদ্ধতার পরে যদি একত্রীকরণ হয় তবে ব্যবহার করুন -p( --preserve-merges)।
এহভেন

778

পূর্ববর্তী প্রতিশ্রুতি সংশোধন করতে, আপনি চান পরিবর্তনগুলি করুন এবং সেই পরিবর্তনগুলি মঞ্চ করুন এবং তারপরে চালান

git commit --amend

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

পূর্বের প্রতিশ্রুতি সংশোধন করতে এবং একই লগ বার্তা রাখতে, চালান

git commit --amend -C HEAD

পূর্ববর্তী প্রতিশ্রুতিটি সম্পূর্ণরূপে সরিয়ে ফিক্স করতে, চালান

git reset --hard HEAD^

আপনি যদি একাধিক প্রতিশ্রুতি বার্তা সম্পাদনা করতে চান তবে চালান

git rebase -i HEAD~commit_count

( আপনি সম্পাদনা করতে চান এমন কমিটের সংখ্যার সাথে কমিট_কাউন্টটি প্রতিস্থাপন করুন )) এই আদেশটি আপনার সম্পাদককে প্রবর্তন করে। "বাছাই" না করে "সম্পাদনা" হিসাবে প্রথম প্রতিশ্রুতি (আপনি যেটিকে পরিবর্তন করতে চান) চিহ্নিত করুন, তারপরে সংরক্ষণ করুন এবং আপনার সম্পাদকটি প্রস্থান করুন। আপনি যে পরিবর্তনটি করতে চান তা করুন এবং তারপরে চালান

git commit --amend
git rebase --continue

দ্রষ্টব্য: খোলার সম্পাদক থেকে আপনি "আপনার নিজের পছন্দ পরিবর্তন করুন" করতে পারেন git commit --amend


18
git rebase -i HEAD~commit_countআপনি চয়ন করেছেন এমন অনেকগুলি কমিটের প্রতিশ্রুতিবদ্ধ বার্তাগুলি পরিবর্তন করতেও আপনাকে অনুমতি দেবে। কেবল নির্বাচিত কমিটগুলি "বাছাই" এর পরিবর্তে "শব্দ" হিসাবে চিহ্নিত করুন
জো

2
আপনি যদি রিবেস করতে না চান? আপনি কেবল একটি পুরানো বার্তা পরিবর্তন করতে চান?
সুপারউবারডুপার

3
git reset --hardনির্বিঘ্নিত পরিবর্তনকে নির্মূল করে। --hardসঙ্গে প্রতিস্থাপন করুন --soft
ইয়েল ghEEz

1
সম্মত, git reset --hardএকটি নিখুঁত বৈধ আদেশ, কিন্তু প্রশ্নটি প্রদান করে এটি বিভ্রান্তিকর। আপনি --hardযদি প্রতিশ্রুতিবদ্ধ পরিবর্তনগুলি দূরে নিক্ষেপ করতে চান তবে আপনি ব্যবহার করুন, যদি আপনি প্রতিশ্রুতি বার্তায় টাইপ করেন না!
সোরেন জর্নস্ট্যাড

398

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

git commit -a --amend -m "My new commit message"

4
এবং আপনি যদি সমস্ত কিছু যুক্ত করতে না চান, আপনি প্রথমে কেবল git add file.extতখনই করতে পারেনgit commit --amend
ম্যালকমমিশন

358

আপনি এটির জন্যও ব্যবহার করতে পারেন git filter-branch

git filter-branch -f --msg-filter "sed 's/errror/error/'" $flawed_commit..HEAD

এটি একটি তুচ্ছ হিসাবে সহজ নয় git commit --amend, তবে এটি বিশেষত কার্যকর, যদি আপনার ভ্রান্ত প্রতিশ্রুতি বার্তার পরে ইতিমধ্যে কিছু সংহত হয়ে থাকে।

নোট করুন যে এটি প্রতিটি প্রতিশ্রুতি HEADএবং ত্রুটিযুক্ত প্রতিশ্রুতিগুলির মধ্যে পুনর্লিখনের চেষ্টা করবে , সুতরাং আপনার msg-filterআদেশটি খুব বিজ্ঞতার সাথে বেছে নেওয়া উচিত ;-)


4
এর কি এমন কোনও সংস্করণ আছে যা রেইজেক্স কিছু না পেয়ে প্রতিশ্রুতি পরিবর্তন করে না?
sjakubowski

3
আফাইক ফিল্টার-শাখা - এমএসজি-ফিল্টার যে কোনও ক্ষেত্রে নতুন কমিট তৈরি করবে। যাইহোক, আপনি _ _ ফিল্টারটির মধ্যে পরীক্ষা করতে পারেন, যদি সেড সফল হয় এবং ফিল্টার-শাখার ক্রিয়াকলাপটি আপনার গাছকে পুনরায় / মূলে পুনরায় সেট করার জন্য এই তথ্যটি ব্যবহার করে।
চিহ্নিত করুন

4
@ ডেভিডহোগ ফিল্টার-শাখা পদ্ধতি ব্যবহার করার সময় এটি কেবল সত্য। পরিবর্তিত প্রতিশ্রুতি অনুসারে কমিট আইডিগুলি পরিবর্তন হয় না যদি আপনি ইন্টারেক্টিভ রিবেস ব্যবহার করেন।
চিহ্নিত করুন

6
@ মার্ক হ্যাঁ তারা করেন, তাদের প্রয়োজন হয়। কমিট আইডিগুলি পূর্বের কমিটগুলির উপর নির্ভরশীল। যদি তারা পরিবর্তন না করে তবে গিটটি অকেজো হবে।
মাইলস রাউন্ড

2
আপনার দরকার $flawed_commit^..HEAD, দরকার নেই $flawed_commit..HEAD। ম্যান পেজ অনুসারে বলা হয়েছে: command কমান্ডটি কেবলমাত্র কমান্ড লাইনে উল্লিখিত ইতিবাচক রেফগুলি পুনরায় লিখবে (উদাহরণস্বরূপ যদি আপনি a..b পাস করেন তবে কেবল খ পুনর্লিখন হবে)। »
আঞ্জেল

319

আমি এইভাবে পছন্দ করি:

git commit --amend -c <commit ID>

অন্যথায়, নতুন কমিট আইডি সহ একটি নতুন প্রতিশ্রুতি থাকবে।


7
আমার জন্য, উপরে আপনার কমান্ডটি ব্যবহার করে একটি নতুন প্রতিশ্রুতিবদ্ধ আইডি প্লাস একটি অতিরিক্ত কমিটকে ডিফল্ট প্রতিশ্রুতি বার্তা হিসাবে "মার্জ শাখা" বলে একটি নতুন প্রতিশ্রুতি তৈরি করে।
জানুয়ারী

46
সংশোধন করা সর্বদা একটি নতুন কমিট আইডি দিয়ে একটি নতুন প্রতিশ্রুতি তৈরি করে। কমিট আইডি হ'ল কমিটমেন্টের সামগ্রীর এসএইচএ হ্যাশ, প্রতিশ্রুতি বার্তা এবং লেখক / প্রতিশ্রুতিবদ্ধ টাইমস্ট্যাম্প সহ। এটি গিতের একটি বৈশিষ্ট্য যা হ্যাশের সংঘর্ষকে বাদ দিয়ে নিশ্চিত করে যে একই আইডির সাথে দুটি কমিট ঠিক একই বিষয়বস্তু, ইতিহাস ইত্যাদির সাথে হুবহু একই রকম প্রতিশ্রুতিবদ্ধ।
এমিল লুন্ডবার্গ

7
এমিলের সাথে একমত। অতিরিক্তভাবে, ডকগুলি পড়া - দেখে মনে হয় যে সমস্ত "-c" করে তা আপনার নতুন প্রতিশ্রুতিটির জন্য ডিফল্ট / টেম্পলেট হিসাবে কোন প্রতিশ্রুতিবদ্ধ বার্তাটি বলে তা বলা হয় .. সাধারণত এটি ইতিমধ্যে ডিফল্টরূপে "-c <কমিট আইডি>" করতে চলেছে সুতরাং এটি নির্দিষ্ট করার দরকার নেই।
গাল

2
-cকিছু বিষয় আছে। এটি ডিফল্টরূপে পুরানো বার্তাটি ব্যবহার করে তবে এটি লেখক সম্পর্কিত তথ্য (ব্যক্তি এবং সময়) অনুলিপি করে। -Cএটি আপনাকে বার্তা সম্পাদনা করতে বলবে না except একই জিনিসটি করে।
জোসেফ কে স্ট্রস

1
@ সন্তানুডির মতো, এটি আমার পক্ষে কার্যকর হয়নি। আমি পেয়েছিfatal: Option -m cannot be combined with -c/-C/-F/--fixup.
অ্যান্ড্রু গ্রিম

312

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

বা কনসোল / টার্মিনাল থেকে এই আদেশটি ব্যবহার করুন:

git commit -a --amend -m "My new commit message"

4
এই উত্তরটি আক্ষরিক অর্থে এই পুরানোটির সাথে একরকম । আপনি অন্য উত্তর সরবরাহ করার আগে বিদ্যমান উত্তরগুলি পরীক্ষা করেছেন?
ড্যান ড্যাসক্লেস্কু

284

আপনি গিট রিবেসিং ব্যবহার করতে পারেন । উদাহরণস্বরূপ, আপনি বিবিসি 3৪৩ সিডির প্রতিশ্রুতিবদ্ধ করতে যদি আবার পরিবর্তন করতে চান তবে চালান run

$ git rebase bbc643cd^ --interactive

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

$ git add <filepattern>

এখন আপনি ব্যবহার করতে পারেন

$ git commit --amend

প্রতিশ্রুতি পরিবর্তন করতে এবং তারপরে

$ git rebase --continue

আগের মাথা প্রতিশ্রুতি ফিরে।


1
আপনি যদি নিশ্চিত করতে চান যে আপনার পরিবর্তনটি git commit --amendপ্রভাবিত হয়েছে আপনি এটি ব্যবহার করতে পারেন git showএবং এটি নতুন বার্তাটি প্রদর্শন করবে।
স্টিভ তৌবার

279
  1. আপনি যদি কেবলমাত্র আপনার শেষ প্রতিশ্রুতি বার্তাটি পরিবর্তন করতে চান তবে করুন:

    git commit --amend
    

এটি আপনাকে আপনার পাঠ্য সম্পাদকের মধ্যে ফেলে দেবে এবং আপনাকে শেষ প্রতিশ্রুতি বার্তাটি পরিবর্তন করতে দেবে।

  1. আপনি যদি শেষ তিনটি প্রতিশ্রুতি বার্তা বা সেই বিন্দু অবধি কোনও প্রতিশ্রুতিবদ্ধ বার্তা পরিবর্তন করতে চান HEAD~3তবে git rebase -iকমান্ডটি সরবরাহ করুন :

    git rebase -i HEAD~3
    

6
এই তার আগে উত্তর ইতিমধ্যে বলছেন যে আপনি ব্যবহার করতে পারেন git commit --amend, এবং এটা বলছেন যে আপনি ব্যবহার করতে পারেন git rebase -i HEAD~commit_count, সব তুমি করেছ মধ্যে প্লাগ ছিল 3জন্য commit_count

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

261

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

git filter-branch -f --msg-filter \
'sed "s/<old message>/<new message>/g"' -- --all

গিটটি পুনরায় লেখার জন্য এবং এর মধ্যে পুরানো রেফারেন্সগুলিকে ব্যাকআপ করার জন্য একটি অস্থায়ী ডিরেক্টরি তৈরি করবে refs/original/

  • -fঅপারেশন কার্যকর করা কার্যকর করবে। অস্থায়ী ডিরেক্টরি ইতিমধ্যে উপস্থিত থাকলে বা যদি ইতিমধ্যে অধীন সঞ্চিত রেফারেন্স থাকে তবে এটি প্রয়োজনীয় refs/original। যদি এটি না হয় তবে আপনি এই পতাকাটি ফেলে দিতে পারেন।

  • -- ফিল্টার-শাখা বিকল্পগুলি পুনর্বিবেচনার বিকল্পগুলি থেকে পৃথক করে।

  • --allসমস্ত শাখা এবং ট্যাগগুলি নতুন করে লেখা হয়েছে তা নিশ্চিত করবে ।

আপনার পুরানো রেফারেন্সগুলির ব্যাকআপের কারণে আপনি কমান্ডটি কার্যকর করার আগে সহজেই রাজ্যে ফিরে যেতে পারেন।

বলুন, আপনি আপনার মাস্টারকে পুনরুদ্ধার করতে এবং শাখায় এটি অ্যাক্সেস করতে চান old_master:

git checkout -b old_master refs/original/refs/heads/master

3
এই উত্তরটি ওপি-র প্রশ্নের সমাধান করে না, কারণ তারা কেবল সবেমাত্র সম্পাদিত একটি প্রতিশ্রুতি সংশোধন করতে খাঁটি আগ্রহী। আমি নিয়মিত git commit --amendমন্তব্যগুলি ঠিক করতে বা আমি ভুলে যাওয়া ফাইলগুলি যুক্ত করতে ব্যবহার করি git addতবে আমি সম্পাদনার আগে কখনওgit push । আমি git filter-branchযখন সংস্করণ ইতিহাসের সাথে পুরোপুরি গণ্ডগোল করতে চাই তখন আমি এটিও ব্যবহার করি, তবে ওপি এটি চায় না, সুতরাং এই উত্তরের জন্য একটি বড় স্বাস্থ্যের সতর্কতা দরকার - ঘরে এটি চেষ্টা করবেন না, উঁকি দিচ্ছে !!
কেব্রো

226

ব্যবহার

git commit --amend

এটি বিশদটি বুঝতে, একটি দুর্দান্ত পোস্ট হ'ল 4 গিট ইতিহাসের পুনর্লিখন । এটি কখন ব্যবহার করবেন না সে সম্পর্কেও কথা বলে git commit --amend


2
ইতিমধ্যে কোনও সার্বজনীন ভাণ্ডারে প্রতিশ্রুতিবদ্ধ বার্তাগুলি ঠিক করার কোনও ভাল উপায় আছে কি? এ পর্যন্ত আমি এই সিদ্ধান্তে পৌঁছেছি যে একবার ধাক্কা পরে আমার প্রতিশ্রুতিবদ্ধ বার্তা টাইপস এবং থিঙ্কোদের চিরকাল বেঁচে থাকতে হবে।
stackunderflow

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

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

1
git commit --amendউত্তর ইতিমধ্যে (বেশ কয়েক বার) দেওয়া হয়েছে আগে আপনি পুলিশের লিখেছিলেন। আপনি কেন আবার পোস্ট করলেন? আপনি যদি "পুনর্লিখন গীতের ইতিহাস" এ একটি লিঙ্ক যুক্ত করতে চান তবে আপনি বিদ্যমান উত্তরগুলির মধ্যে একটি সম্পাদনা করতে বা মন্তব্য করতে পারেন।
ড্যান ড্যাসক্লেস্কু

199

সংশোধন করা

আপনার কাছে এখানে বেশ কয়েকটি বিকল্প রয়েছে। আপনি করতে পারেন

git commit --amend

যতক্ষণ না এটি আপনার শেষ প্রতিশ্রুতি

ইন্টারেক্টিভ রিবেস

অন্যথায়, এটি যদি আপনার শেষ প্রতিশ্রুতি না হয় তবে আপনি একটি ইন্টারেক্টিভ রিবেস করতে পারেন,

git rebase -i [branched_from] [hash before commit]

তারপরে ইন্টারেক্টিভ রিবেসের অভ্যন্তরে আপনি কেবল সেই প্রতিশ্রুতিতে সম্পাদনা যুক্ত করুন। যখন এটি আসে, একটি করুন git commit --amendএবং প্রতিশ্রুতি বার্তাটি সংশোধন করুন। যদি আপনি এই প্রতিশ্রুতিবদ্ধ বিন্দুর আগে ফিরে যেতে চান, আপনি এটি ব্যবহার করতে git reflogএবং কেবল সেই প্রতিশ্রুতি মুছতে পারেন। তারপরে আপনি git commitআবার কিছু করবেন।


191

এটি যদি আপনার শেষ প্রতিশ্রুতি থাকে তবে কেবল প্রতিশ্রুতি সংশোধন করুন:

git commit --amend -o -m "New commit message"

( আপনি কেবল প্রতিশ্রুতি বার্তা পরিবর্তন করেছেন তা নিশ্চিত করতে -o( --only) পতাকা ব্যবহার করে )


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

git rebase -i @~9   # Show the last 9 commits in a text editor

কমিট আপনি চান, পরিবর্তন খুঁজুন pickকরার r( reword), এবং সংরক্ষণ করুন এবং বন্ধ ফাইল। সম্পন্ন!



মিনিয়েচার ভিম টিউটোরিয়াল (বা, কীভাবে কেবল 8 টি কীস্ট্রোক দিয়ে রিবেস করবেন 3jcwrEscZZ):

  • vimtutorসময় পেলে দৌড়াও
  • hjkl আন্দোলনের কীগুলির সাথে সমান
  • সমস্ত কমান্ড একটি "রেঞ্জ" দিয়ে উপসর্গ করা যেতে পারে, উদাহরণস্বরূপ 3jতিনটি রেখা নিচে সরানো
  • i সন্নিবেশ মোডে প্রবেশ করতে - আপনার টাইপ করা পাঠ্যটি ফাইলটিতে উপস্থিত হবে
  • Escবা Ctrlcসন্নিবেশ মোড থেকে প্রস্থান করতে এবং "স্বাভাবিক" মোডে ফিরে যেতে
  • u পূর্বাবস্থা
  • Ctrlr আবার করা
  • dd, dw, dlএকটি লাইন, শব্দ, বা চিঠি যথাক্রমে মুছে ফেলতে
  • cc, cw, clএকটি লাইন, শব্দ, বা চিঠি যথাক্রমে পরিবর্তন করতে (হিসাবে একই ddi)
  • yy, yw, yl( "Yank"), যথাক্রমে কপি করতে একটি লাইন, শব্দ, বা চিঠি
  • pবা Pযথাক্রমে বর্তমান অবস্থানের পরে বা পরে আটকানো
  • :wEnter একটি ফাইল সংরক্ষণ (লিখতে)
  • :q!Enter সংরক্ষণ না করে প্রস্থান করা
  • :wqEnterবা ZZসংরক্ষণ এবং ছেড়ে দিতে

আপনি যদি অনেকগুলি পাঠ্য সম্পাদনা করেন, তবে ডিভোরাক কীবোর্ড বিন্যাসে স্যুইচ করুন , টাচ-টাইপ করতে শিখুন এবং ভিম শিখুন। এটি কি মূল্যবান? হ্যাঁ.



প্রোটিপ ™: ইতিহাসকে পুনর্লিখন করে এমন "বিপজ্জনক" আদেশগুলি নিয়ে পরীক্ষা করতে ভয় করবেন না - গিট ডিফল্টরূপে 90 দিনের জন্য আপনার কমিটগুলি মুছে দেয় না; আপনি এগুলি রিফ্লগে খুঁজে পেতে পারেন:

$ git reset @~3   # Go back three commits
$ git reflog
c4f708b HEAD@{0}: reset: moving to @~3
2c52489 HEAD@{1}: commit: more changes
4a5246d HEAD@{2}: commit: make important changes
e8571e4 HEAD@{3}: commit: make some changes
... earlier commits ...
$ git reset 2c52489
... and you're back where you started

* যেমন --hardএবং --forceযদিও বিকল্পগুলি দেখুন - তারা ডেটা বাতিল করতে পারে। * এছাড়াও, আপনি সহযোগিতা করছেন এমন কোনও শাখায় ইতিহাস পুনর্লিখন করবেন না।


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

1
@ ড্যানডাসকলেস্কু: কারণ ন্যানো ব্যবহার করে বেশ কয়েকটি রিবায়েস সম্পাদন করার চেয়ে উপরের নির্দেশাবলী ব্যবহার করে ভিম শিখানো তত দ্রুত। গিটটি কোনও পাঠ্য সম্পাদক খোলে এবং রিবাইজের জন্য এটির নিজস্ব ইন্টারফেস নয়, কারণ ভিম বিদ্যমান: এটি হালকা ওজনের, বেশিরভাগ সিস্টেমে ডিফল্টরূপে ইনস্টলড এবং খুব সহজেই একটি রিবেস সম্পাদন করার জন্য যথেষ্ট শিখতে খুব সহজ: যেমন ddjjpZZএকটি প্রতিশ্রুতি 2 টি সরান moves বেসিক ভিম জ্ঞান সম্পর্কে আরকেন কিছুই নেই; ন্যানোর চেয়ে ভিমের সাথে আরও স্বাচ্ছন্দ্য বোধ করতে 10 মিনিট সময় লাগে।
জাজ

185

আপনি যদি গিট জিইউআই ব্যবহার করে থাকেন তবে আপনি শেষ প্রতিশ্রুতিটি সংশোধন করতে পারেন যা ইতিবাচক নয়:

Commit/Amend Last Commit

168

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

সেই বাক্সটি টিক দিন

এছাড়াও, git rebase -i origin/masterএটি একটি দুর্দান্ত মন্ত্র যা সর্বদা আপনাকে মাস্টারের শীর্ষে করা কমিটগুলির সাথে উপস্থিত করে তোলে এবং আপনাকে সংশোধন, মুছে ফেলা, পুনর্বিন্যাস বা স্কোয়াশের বিকল্প দেয়। প্রথমে সেই হ্যাশটি ধরে রাখার দরকার নেই।


4
আপনি আপনার উদাহরণটিতে প্রদর্শিত সেই পর্দায় কীভাবে যাব?
মারওয়ান مروان

2
এটি উইন্ডোজ গিট গুই এর নীচের ডান অংশ। টগল করে কেবল 'সংশোধন করা শেষ প্রতিশ্রুতি' নির্বাচন করুন এবং এটি সর্বশেষতম প্রতিশ্রুতিবদ্ধ তথ্যের সাথে বিশিষ্ট হবে।
wbdarby

138

বাহ, সুতরাং এটি করার অনেকগুলি উপায় রয়েছে।

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

git reset --soft HEAD~1
git commit -m 'New and corrected commit message'

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

--softপরিবর্তে নির্দিষ্ট করতে মনে রাখবেন--hard , অন্যথায় আপনি এই প্রতিশ্রুতি পুরোপুরি হারাবেন।


5
এটি git commit --amend2-পদক্ষেপের প্রক্রিয়া ব্যতীত ঠিক একই জিনিসটি করে।
জোসেফ কে স্ট্রস

3
@ জোসেফকে। স্ট্রাউস আমি বিশ্বাস করি যে এই প্রতিশ্রুতি সংশোধন করা নতুন প্রতিশ্রুতিবদ্ধ ও তারিখের তথ্য পৃথকভাবে রাখার মাধ্যমে মূল প্রতিশ্রুতিবদ্ধ লেখক এবং তারিখের তথ্য রাখে। আমি নিশ্চিত নই যে এই পদ্ধতিটি এটি করে।
এভেল্টন

4
আপনি ঠিক আছেন --amendলেখকের তথ্য রাখবে, তবে প্রশ্নটি কেবল বার্তাটি পরিবর্তন করতে বলে।
জোসেফ কে স্ট্রাউস

131

পুরানো বার্তাগুলি সম্পাদনের জন্য উইন্ডোজ / ম্যাক জিইউয়ের সন্ধানের জন্য (যেমন কেবলমাত্র সর্বশেষতম বার্তা নয়), আমি উত্সট্রির পরামর্শ দেব । অনুসরণ করার পদক্ষেপগুলি নীচে রয়েছে।

সোর্সট্রি ইন্টারেক্টিভ রিবেস

যে প্রতিশ্রুতি এখনও রিমোটে ধাক্কা দেওয়া হয়নি:

  1. নিশ্চিত হয়ে নিন যে আপনি সমস্ত বর্তমান পরিবর্তন প্রতিশ্রুতিবদ্ধ বা স্ট্যাস করেছেন (যেমন, "ফাইলের স্থিতি" ট্যাবে কোনও ফাইল তালিকাভুক্ত নেই) - এটি অন্যথায় কাজ করবে না।
  2. "লগ / ইতিহাস" ট্যাবে, আপনি সম্পাদনা করতে চান এমন প্রতিশ্রুতিগুলির নীচে গ্রাফের একটি সংলগ্ন লাইন সহ এন্ট্রিটিতে ডান ক্লিক করুন এবং " <কম রেফারেট > এর বাচ্চাদের পুনঃনির্বাচিত ইন্টারেক্টিভ ..." নির্বাচন করুন
  3. আপনি পরিবর্তন করতে চান এমন প্রতিশ্রুতিবদ্ধ বার্তার জন্য পুরো সারিটি নির্বাচন করুন ("বার্তা" কলামে ক্লিক করুন)
  4. "বার্তা সম্পাদনা করুন" বোতামটি ক্লিক করুন।
  5. যে ডায়লগটি উপস্থিত হবে তাতে বার্তাটি পছন্দ মতো সম্পাদনা করুন এবং তারপরে ক্লিক করুন OK
  6. পরিবর্তনগুলির জন্য অন্য প্রতিশ্রুতিবদ্ধ বার্তা থাকলে 3-4 পদক্ষেপ পুনরাবৃত্তি করুন।
  7. ক্লিক করুন OK: রিবেসিং শুরু হবে। যদি সবকিছু ঠিকঠাক হয় তবে আউটপুটটি "সফলভাবে সম্পন্ন" শেষ হবে। দ্রষ্টব্য: একই সময়ে একাধিক প্রতিশ্রুতি বার্তাগুলি সংশোধন করার চেষ্টা করার সাথে আমি কখনও কখনও এটি ব্যর্থ হয়ে দেখেছি Unable to create 'project_path/.git/index.lock': File exists.। সমস্যাটি ঠিক কী তা নিশ্চিত নয়, এটি সোর্সট্রির ভবিষ্যতের সংস্করণে ঠিক করা হবে কিনা তা নিশ্চিত নয়, তবে যদি এটি ঘটে তবে এটি একবারে তাদেরকে মুক্তি দেওয়ার পরামর্শ দেয় (ধীর তবে আরও নির্ভরযোগ্য বলে মনে হয়)।

... বা ... এমন কমিটসগুলির জন্য যা ইতিমধ্যে ঠেলাঠেলি করা হয়েছে:

এই উত্তরের পদক্ষেপগুলি অনুসরণ করুন , যা উপরের মত একই, তবে git push origin <branch> -fশাখাটি জোর করে চাপানোর জন্য কমান্ড লাইন ( ) থেকে চালানোর জন্য আরও একটি কমান্ডের প্রয়োজন । আমি এটি সব পড়ার এবং প্রয়োজনীয় সতর্কতা প্রয়োগের সুপারিশ করব!


সমস্ত উত্তরের বাইরে - এটি সমস্ত গিট নববিদের জন্য সর্বাধিক উপযুক্ত ^^^ (একটি বিনামূল্যে প্রোগ্রাম সোর্স ট্রি ব্যবহার করুন এবং আপনি সম্পাদনা করতে চান তার আগে একটি প্রতিশ্রুতি "বাচ্চাদের পুনঃবাস" প্রয়োগ করুন)
পুনর্বিবেচনা করুন

127

আপনি যদি সর্বশেষতম প্রতিশ্রুতি সম্পাদনা করতে চান তবে ব্যবহার করুন:

git commit --amend

অথবা

git commit --amend -m 'one line message'

তবে আপনি যদি একের পর এক বেশ কয়েকটি কমিট সম্পাদনা করতে চান তবে আপনার পরিবর্তে রিবিসিং ব্যবহার করা উচিত:

git rebase -i <hash of one commit before the wrong commit>

গিট রিবেস সম্পাদনা

উপরের মত একটি ফাইলে, edit/eঅন্য বিকল্পগুলির মধ্যে একটি বা লিখুন এবং সংরক্ষণ করুন এবং প্রস্থানটি চাপুন।

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

git commit --amend

সংরক্ষণ করুন এবং প্রস্থান করুন এবং টাইপ করুন

git rebase --continue

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

দ্রষ্টব্য যে এই বিষয়গুলি সেই বিশেষ অঙ্গীকারের পরে আপনার সমস্ত SHA হ্যাশগুলিকে পরিবর্তন করে।


2
গিট রিবেস -i <ভুল প্রতিশ্রুতি দেওয়ার আগে একটি হ্যাশ এর কাজ> আমার জন্য কাজ করে। ধন্যবাদ।
বিরাথ

127

আপনি ব্যবহার করা উচিত আপনি শুধুমাত্র আপনার শেষ বার্তা পরিবর্তন করতে চান --onlyপতাকা বা তার শর্টকাট -oদিয়ে commit --amend:

git commit --amend -o -m "New commit message"

এটি নিশ্চিত করে যে আপনি দুর্ঘটনাক্রমে স্টেজ স্টাফগুলির সাথে আপনার প্রতিশ্রুতি বাড়িয়ে তুলবেন না। অবশ্যই একটি সঠিক $EDITORকনফিগারেশন থাকা ভাল। তারপরে আপনি -mবিকল্পটি ছেড়ে দিতে পারেন , এবং গিট পুরানোটির সাথে প্রতিশ্রুতি বার্তাটি পূর্বে পূরণ করবে। এইভাবে এটি সহজেই সম্পাদনা করা যায়।


1
"শীর্ষ" উত্তর প্রশ্নের উত্তর দেয় না। এটি কেবল একটি সাধারণ ভূমিকা দেয় git commit --amend। প্রশ্নটি খুব নির্দিষ্ট, তাই দীর্ঘতর! = আরও ভাল। -oপতাকাটির নির্ধারিত উল্লেখ সম্ভবত অন্যান্য তথ্যের মধ্যে সমাধিস্থ করা হবে। ইতিমধ্যে অনেক ভোট রয়েছে এমন উত্তরে আমি সম্পাদনা করতেও স্বাচ্ছন্দ্য বোধ করি না।
ডেভিড ওঙ্গারো

2
এটি বলা হচ্ছে আপনি শীর্ষ উত্তর সম্পাদনা করতে মুক্ত, যেহেতু সত্যিকারের বিপদ রয়েছে যে লোকেরা এটিকে "সঠিক" উত্তর হিসাবে ব্যবহার করছে। মঞ্চযুক্ত জিনিসগুলির সাথে আপনার প্রতিশ্রুতি সংশোধন করার জন্য এটি সহজেই ঘটতে পারে - এটি আমার কাছে ঘটেছিল এবং আপনি যখন তা ঠেকানোর চেষ্টা করেন তখন সত্যিই বিরক্ত হয়। তবে এখনও, পরিমাণ সঠিকতার কোনও গ্যারান্টি নয়। উত্তরের সংখ্যা বা ভোটের সংখ্যাতেও নয়।
ডেভিড ওঙ্গারো

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

1
ন্যায়সঙ্গত হওয়ার জন্য: যদিও গিট 1.3.0 এর --onlyসাথে বিকল্পটি --amendপাওয়া যায় এটি 1.7.11.3 ( ea2d4ed35902ce15959965ab86d80527731a177c ) এ স্থির না হওয়া পর্যন্ত এটি সঠিকভাবে কাজ করে না । তাই 2008 সালে সঠিক উত্তর ফিরে সম্ভবত ভালো কিছু হত: git stash; git commit --amend; git stash pop
ডেভিড ওঙ্গারো

103

আপনার নতুন ভুল প্রতিশ্রুতি বার্তাটি একটি নতুন লাইনে নতুন প্রতিশ্রুতি বার্তাটি আপডেট করুন:

git commit --amend -m "your new commit message"

বা, নীচের মত গিট রিসেট চেষ্টা করুন:

# You can reset your head to n number of commit
# NOT a good idea for changing last commit message,
# but you can get an idea to split commit into multiple commits
git reset --soft HEAD^

# It will reset you last commit. Now, you
# can re-commit it with new commit message.

রিসেট ব্যবহার করে কমিটকে আরও কমিকে বিভক্ত করতে পুনরায় ব্যবহার করুন

git reset আপনাকে একাধিক অঙ্গীকারের প্রতিশ্রুতি ভঙ্গ করতেও সহায়তা করতে পারে:

# Reset your head. I am resetting to last commits:
git reset --soft HEAD^
# (You can reset multiple commit by doing HEAD~2(no. of commits)

# Now, reset your head for splitting it to multiple commits
git reset HEAD

# Add and commit your files separately to make multiple commits: e.g
git add app/
git commit -m "add all files in app directory"

git add config/
git commit -m "add all files in config directory"

এখানে আপনি সফলভাবে দুটি প্রতিশ্রুতিতে আপনার শেষ প্রতিশ্রুতি ভঙ্গ করেছেন।


3
যদি আপনি যা করতে চান তা হ'ল আপনার সর্বশেষ কমিটের বার্তাটি সম্পাদনা করা, সেই উদ্দেশ্যে একটি সফট রিসেট ব্যবহার করা হ'ল ওভার-কিল । শুধু ব্যবহার git commit --amend, ঠিক মত কিভাবে এটি বলেছেন শীর্ষ উত্তর ভোট দিয়েছেন । তদ্ব্যতীত, এই আগের উত্তরেgit reset --soft HEAD^ নরম পুনরায় সেট করার জন্য অভিন্নভাবে কাজ করে , কারণ তারা উভয়ই প্রথম পিতামাতার প্রতিশ্রুতিতে পুনরায় সেট হয়।

3
আমি কেবল git resetসমাধানের সাথে যুক্ত করতে বিরক্ত করি কেবল একটি প্রতিশ্রুতি বার্তাটিকে একাধিক কমিট বার্তায় বিভক্ত করার একটি ধারণা দিতে। কারণ, যখন আমি ব্যবহার শুরু করছিলাম তখন আমি এই সমস্যার মুখোমুখি হয়েছি git। কখনও কখনও, এটি সত্যিই সহায়ক হতে পারে। :)
przbadu

87

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

আমি আমার পাঁচটি সর্বশেষ প্রতিশ্রুতি পরিবর্তন করতে চেয়েছিলাম যা আমি ইতিমধ্যে সার্ভারে চাপিয়ে দিয়েছি। এটি বেশ 'বিপজ্জনক' কারণ কারণ ইতিমধ্যে অন্য কেউ যদি এ থেকে টানেন তবে আপনি প্রতিশ্রুতি বার্তাগুলি পরিবর্তন করে জিনিসগুলিকে গোলমাল করতে পারেন। তবে, আপনি যখন নিজের সামান্য শাখায় কাজ করছেন এবং নিশ্চিত হন যে কেউ এটিকে টানছেন না আপনি এটিকে এটি পরিবর্তন করতে পারবেন:

ধরা যাক আপনি আপনার সর্বশেষ পাঁচটি কমিট পরিবর্তন করতে চান এবং তারপরে আপনি এটি টার্মিনালে টাইপ করুন:

git rebase -i HEAD~5

* যেখানে আপনি পরিবর্তন করতে চান এমন প্রতিশ্রুত বার্তাগুলির সংখ্যা হ'ল 5 (তাই যদি আপনি দশমকে শেষ প্রতিশ্রুতিতে পরিবর্তন করতে চান তবে আপনি 10 তে টাইপ করুন)।

এই কমান্ডটি আপনাকে ভিমে নিয়ে যাবে সেখানে আপনি আপনার সম্পাদনার ইতিহাস 'সম্পাদনা' করতে পারবেন। আপনি আপনার শেষ পাঁচটি কমিটগুলি শীর্ষে দেখতে পাবেন:

pick <commit hash> commit message

পরিবর্তে pickআপনার লিখতে হবে reword। আপনি টাইপ করে ভিমে এটি করতে পারেন i। এটি আপনাকে সন্নিবেশ মোডে যেতে দেয় । (আপনি দেখতে পাচ্ছেন যে আপনি নীচে INSERT শব্দটি দ্বারা সন্নিবেশ মোডে রয়েছেন)) আপনি যে কমিটগুলি পরিবর্তন করতে চান rewordতার পরিবর্তে টাইপ করুনpick

তারপরে আপনাকে এই স্ক্রিনটি সংরক্ষণ এবং প্রস্থান করা দরকার। আপনি প্রথমে Escবোতাম টিপে 'কমান্ড-মোডে' গিয়ে ( নীচের অংশে INSERT শব্দটি অদৃশ্য হয়ে গেলে আপনি কমান্ড-মোডে আছেন কিনা তা পরীক্ষা করতে পারেন) do তারপরে আপনি টাইপ করে একটি কমান্ড টাইপ করতে পারেন :। সংরক্ষণ এবং প্রস্থান করার আদেশটি হ'ল wq। সুতরাং আপনি যদি টাইপ করেন তবে আপনি :wqসঠিক পথে রয়েছেন।

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

তারপরে, আপনি যদি ইতিমধ্যে আপনার ভুল প্রতিশ্রুতিগুলি ধাক্কা দিয়ে থাকেন তবে git push --forceসেগুলি ওভাররাইট করা আপনার দরকার । মনে রাখবেন যে git push --forceএটি করা বেশ বিপজ্জনক জিনিস, সুতরাং আপনার ভুল প্রতিশ্রুতি দেওয়ার কারণে সার্ভার থেকে কেউ টানছেন না তা নিশ্চিত হয়ে নিন!

এখন আপনি আপনার প্রতিশ্রুতি বার্তা পরিবর্তন করেছেন!

(যেমন আপনি দেখতে পাচ্ছেন, আমি ভিমে তেমন অভিজ্ঞ নই, তাই কী ঘটছে তা বোঝাতে যদি আমি 'লিঙ্গো' ব্যবহার করি, তবে আমাকে সংশোধন করতে দ্বিধা বোধ করুন!)


4
<nitpick>স্ট্যাক ওভারফ্লোতে কোনও "থ্রেড" নেই, কারণ এটি কোনও আলোচনা ফোরাম নয়, কেবলমাত্র "প্রশ্ন", "উত্তর" এবং "পোস্ট" রয়েছে are </nitpick>। এছাড়াও, ভিমের সমস্ত সংস্করণ এক নয়, এগুলির সবগুলিই আপনাকে সন্নিবেশ মোডে অক্ষরগুলি মুছে ফেলতে দেবে না (একরকমভাবে বোঝায়, ডান?) আপনি যদি সবসময় ভিমে অক্ষর মুছতে সক্ষম হন Xএবং এটি xকরতে চান তবে ( xকার্সারের সামান্য অক্ষর মুছে ফেলা Xহবে , পিছনে মুছবে)। আপনি যদি ভুল uকরে থাকেন তবে আপনি পূর্বাবস্থায় ফিরে আসতে ব্যবহার করতে পারেন use অবশেষে, ইন্টারেক্টিভ রিবেস সম্পাদকটির rজন্য শর্টহ্যান্ড reword

1
ভিমে কোনও শব্দ পরিবর্তন করতে cwতার শুরুতে টাইপ করা হয় (যদিও প্রশ্নটি ভিম সম্পর্কে নয়, আমি সম্মত)।
ইয়ারোস্লাভ নিকিতেনকো

আপনার সেই ঘৃণা ব্যবহার করার দরকার নেই । আপনি আপনার গিটnano এডিটরটিকে বুদ্ধিমান এবং ব্যবহারকারী-বান্ধব কিছু, যেমন মিড মিডনাইট কমান্ডারের ম্যাসিট হিসাবে সেট করতে পারেন ।
ড্যান ড্যাসক্লেস্কু

79

আপনি গিট-রিবেস-রিওয়ার্ড ব্যবহার করতে পারেন

এটি কোনও প্রতিশ্রুতি (কেবল শেষ নয়) একইভাবে সম্পাদনা করার জন্য ডিজাইন করা হয়েছে commit --amend

$ git rebase-reword <commit-or-refname>

একটি প্রতিশ্রুতি সংশোধন করতে রিবেস ইন্টারেক্টিভের ক্রিয়া অনুসারে এর নামকরণ করা হয়েছে: "পুনর্নির্বাচন"। এই পোস্টটি দেখুন এবং ম্যান- সেকশন ইন্টারেক্টিভ মোড-

উদাহরণ:

$ git rebase-reword b68f560
$ git rebase-reword HEAD^

6
এর জন্য একটি বাহ্যিক প্রোগ্রাম ইনস্টল করা প্রয়োজন। আমার মতে, বিল্ট-ইন সরঞ্জামগুলি এবং উপকরণগুলি আরও কার্যকরভাবে ব্যবহার করা শিখাই ভাল হবে। আমি টাইপ করব:g c; g rb -i @~9 (কমিট এবং রি-বেসের ফলে), সরাতে নতুন যেখানে আমি এটি করতে চান কমিট, পরিবর্তন commitকরার জন্য f( fixup), এবং সংরক্ষণ করুন। আপনি যদি এর চেয়ে দ্রুত কিছু পেতে চান তবে আপনি git commit --fixup=<commit>; git rebase -i --autosquash <commit>^
উপন্যাসটি

79

আমি এলিয়াস reciএবং এর recmজন্য যুক্ত recommit (amend)করেছি। এখন আমি এটি দিয়ে git recmবা এটি করতে পারি git recm -m:

$ vim ~/.gitconfig

[alias]

    ......
    cm = commit
    reci = commit --amend
    recm = commit --amend
    ......

57

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

git commit --amend -m "T-1000, advanced prototype"
git push --force

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


7
গিটে কিছুই "ওভাররাইট" হয় না। এক্ষেত্রে শাখা পয়েন্টারটি আপনার নতুন প্রতিশ্রুতিতে সেট করা হবে এবং কোনও রেফারেন্স না রেখে পুরানো প্রতিশ্রুতিটি বাসি হয়ে যাবে এবং কয়েক সপ্তাহ পরে এটি পরিষ্কার হয়ে যেতে পারে। (ততক্ষণ পর্যন্ত অন্যরা এখনও এটি খুঁজে পেতে এবং এটি উল্লেখ করতে পারে, উদাহরণস্বরূপ রেজলগটি দেখে by)
ডেভিড ওঙ্গারো

51

আমি নিম্নলিখিত ব্যবহার করতে চান:

  1. git status
  2. git add --all
  3. git commit -am "message goes here about the change"
  4. git pull <origin master>
  5. git push <origin master>

46

যদি আপনি কোডটি আপনার দূরবর্তী শাখায় ( গিটহাব / বিটবকেট ) না ঠেলে থাকেন তবে আপনি নীচের মতো কমান্ড লাইনে প্রতিশ্রুতি বার্তাটি পরিবর্তন করতে পারেন।

 git commit --amend -m "Your new message"

আপনি যদি একটি নির্দিষ্ট শাখায় কাজ করছেন তবে এটি করুন:

git commit --amend -m "BRANCH-NAME: new message"

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

আমার সম্পূর্ণ উত্তরটি করার আগে দয়া করে পড়ুন।

git commit --amend -m "BRANCH-NAME : your new message"

git push -f origin BRANCH-NAME                # Not a best practice. Read below why?

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

 git commit --amend -m "BRANCH-NAME : your new message"
 git pull origin BRANCH-NAME
 git push -f origin BRANCH-NAME

প্রতিশ্রুতি বার্তা পরিবর্তন করার সময় এটি সর্বোত্তম অনুশীলন, যদি এটি ইতিমধ্যে ধাক্কা দেওয়া হয়।

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