উত্তর:
লিনাস টরভাল্ডসের বার্তাটি আপনার প্রশ্নের উত্তর দিতে পারে:
পুরানো প্রতিশ্রুতি বার্তা পরিবর্তন / সম্পাদনা করুন
সংক্ষিপ্ত উত্তর: আপনি পারবেন না (যদি চাপ দেওয়া হয়)।
নিষ্কাশন (লিনাস বিটকিপারকে বি কে হিসাবে উল্লেখ করে):
পার্শ্ব নোট, historicalতিহাসিক আগ্রহের বাইরে: বিকে আপনি করতে পারেন।
এবং যদি আপনি এটির অভ্যস্ত হন (যেমন আমি ছিলাম) এটি সত্যিই বেশ ব্যবহারিক ছিল। আমি অ্যান্ড্রু থেকে একটি প্যাচ-বোমা প্রয়োগ করব, কিছু ভুল হয়েছে তা লক্ষ্য করুন, এবং এটি ধাক্কা দেওয়ার আগে এটি সম্পাদনা করুন।
আমিও একই কাজ করতে পারি কেবল প্রতিশ্রুতি বার্তাটিকে নামের অংশ হিসাবে না করা এবং ইতিহাসের অনুচ্চারিত হওয়ার গ্যারান্টি দিয়ে দেওয়া এবং "পরে মন্তব্যগুলি ঠিক করার" অনুমতি দেওয়া যথেষ্ট সহজ হত।
কিন্তু আমি তা করিনি।
এর অংশটি খাঁটি "অভ্যন্তরীণ ধারাবাহিকতা"। গিট হ'ল SHA1- সুরক্ষিত এবং সমস্ত বস্তুকে একইরূপে বিবেচনা করা হচ্ছে, বস্তুর ধরণের নির্বিশেষে সবকিছুর জন্য একইভাবে একটি ক্লিনার সিস্টেম ধন্যবাদ। হ্যাঁ, এখানে চারটি বিভিন্ন ধরণের অবজেক্ট রয়েছে এবং এগুলি সবই আলাদা and এবং এগুলি একই পদ্ধতিতে ব্যবহার করা যায় না, তবে একই সাথে, যদি তাদের এনকোডিংটি ডিস্কে পৃথক হতে পারে তবে ধারণাগতভাবে তারা সমস্ত ঠিকঠাক কাজ করে একই.
তবে অভ্যন্তরীণ ধারাবাহিকতা প্রকৃতপক্ষে জটিলতার জন্য অজুহাত নয় এবং স্পষ্টতই এটি খুব নমনীয় হবে যদি আমরা তাদের ভুল হওয়ার পরে কেবল সমাধান করতে পারি। সুতরাং এটি একটি সত্যই দৃ strong় যুক্তি নয়।
বাস্তব এই ভাবে, আপনি বার্তা বিশ্বাস করতে পারেন: REASON Git আপনি বার্তা শেষ পর্যন্ত খুব সহজ হচ্ছে কমিট পরিবর্তন করতে অনুমতি দেয় না। আপনি যদি লোকদের পরে তাদের পরিবর্তন করার অনুমতি দিয়ে থাকেন তবে বার্তাগুলি সহজাতভাবে খুব বিশ্বাসযোগ্য নয়।
সম্পূর্ণ হবে, আপনি পারে কি আপনি চান, যেমন প্রতিফলিত করার জন্য আপনার স্থানীয় কমিট ইতিহাস পুনর্লিখন sykora দ্বারা প্রস্তাবিত (কিছু রি-বেসের ফলে এবং --hard পুনরায় সেট করুন, খাবি!)
যাইহোক, আপনি একবার আপনার সংশোধিত ইতিহাস পুনরায় প্রকাশ করুন (এ সহ git push origin +master:master
, +
একটি "দ্রুত-ফরওয়ার্ড" প্রতিশ্রুতি না দেওয়ার পরেও এই চাপটি চাপতে বাধ্য করে এমন সাইন) ... আপনি কিছুটা সমস্যায় পড়তে পারেন ।
এই অন্যান্য এসও প্রশ্ন থেকে নিষ্কাশন:
আমি একবার gif.git সংগ্রহস্থল - ফোর্স দিয়ে ধাক্কা দিয়ে লিনাস বিগ টাইম দ্বারা বদনাম পেয়েছিলাম। এটি অন্যান্য মানুষের জন্য প্রচুর সমস্যা তৈরি করবে। একটি সহজ উত্তর "এটি করবেন না"।
বর্তমানে একটি গিট প্রতিস্থাপন কৌশলটি করতে পারে।
বিস্তারিত: একটি অস্থায়ী কাজের শাখা তৈরি করুন
git checkout -b temp
প্রতিস্থাপন করতে প্রতিশ্রুতি পুনরায় সেট করুন
git reset --hard <sha1>
সঠিক বার্তা দিয়ে কমিট সংশোধন করুন
git commit --amend -m "<right message>"
পুরানো প্রতিশ্রুতিটি নতুনটির সাথে প্রতিস্থাপন করুন
git replace <old commit sha1> <new commit sha1>
আপনি যেখানে ছিলেন সেই শাখায় ফিরে যান
git checkout <branch>
টেম্প শাখা অপসারণ
git branch -D temp
ধাক্কা
guess
সম্পন্ন.
git rebase -i
ইন্টারেক্টিভের জন্য আপনি 'আমি' (আপনি যে শাখা থেকে ব্রাঞ্চ করেছিলেন সেই শাখার বিরুদ্ধে) ব্যবহার করতে পারেন ।
pick
আপনি r
(বা reword
) দিয়ে পরিবর্তন করতে চান এমন প্রতিশ্রুতিবদ্ধ মন্তব্যের পরবর্তী প্রতিস্থাপন করুন , সংরক্ষণ করুন এবং প্রস্থান করুন এবং এটি করার পরে আপনি সম্পাদনা করতে সক্ষম হবেন।
git push
আবার একবার এবং আপনি শেষ!
-p
যুক্তিটি ব্যবহার করে দেখুন । rebase
p
ধরুন আপনার মতো গাছ আছে:
dd2e86 - 946992 - 9143a9 - a6fd86 - 5a6057 [master]
প্রথমত, checkout
একটি অস্থায়ী শাখা:
git checkout -b temp
উপর temp
শাখা, reset --hard
একটি কমিট আপনি (উদাহরণস্বরূপ, যে কমিট তার বার্তা পরিবর্তন করতে চান 946992
):
git reset --hard 946992
amend
বার্তা পরিবর্তন করতে ব্যবহার করুন :
git commit --amend -m "<new_message>"
তারপরে গাছটি দেখতে দেখতে এইরকম হবে:
dd2e86 - 946992 - 9143a9 - a6fd86 - 5a6057 [master]
\
b886a0 [temp]
তারপর, cherry-pick
সব কমিট যে দূরে রয়েছে 946992
থেকে master
থেকে temp
এবং তাদের কমিট, ব্যবহার amend
আপনি ভাল হিসাবে তাদের বার্তা পরিবর্তন করতে চান তাহলে:
git cherry-pick 9143a9
git commit --amend -m "<new_message>
...
git cherry-pick 5a6057
git commit --amend -m "<new_message>
গাছটি এখন এইরকম দেখাচ্ছে:
dd2e86 - 946992 - 9143a9 - a6fd86 - 5a6057 [master]
\
b886a0 - 41ab2c - 6c2a3s - 7c88c9 [temp]
এখন জোর করে টেম্প শাখাটিকে দূরবর্তী স্থানে চাপ দিন:
git push --force origin temp:master
চূড়ান্ত পদক্ষেপ, সার্ভার থেকে শাখা টানতে master
স্থানীয়ভাবে শাখা মুছুন , তারপরে শাখায় স্যুইচ করুন এবং শাখাটি মুছুন ।git fetch origin
master
master
temp
এখন আপনার স্থানীয় এবং দূরবর্তী উভয়ই সমস্ত বার্তা আপডেট হবে।
আমাদের দোকানে, আমি ভুল বার্তাগুলির সাথে কমিটে স্বীকৃতভাবে নামযুক্ত টীকাগুলি যুক্ত করার এবং প্রতিস্থাপন হিসাবে টীকাটি ব্যবহার করার কনভেনশনটি চালু করেছিলাম।
যদিও এটি নৈমিত্তিক "গিট লগ" কমান্ড চালিয়ে যাওয়া লোকদের সহায়তা করে না, তবুও এটি আমাদের মন্তব্যগুলিতে ভুল বাগ ট্র্যাকার উল্লেখগুলি ঠিক করার একটি উপায় সরবরাহ করে এবং আমার সমস্ত বিল্ড এবং প্রকাশের সরঞ্জামগুলি কনভেনশনটি বুঝতে পারে।
এটি স্পষ্টতই জেনেরিক উত্তর নয়, তবে এটি কিছু লোক হতে পারে যা নির্দিষ্ট সম্প্রদায়ের মধ্যে গ্রহণ করতে পারে। আমি নিশ্চিত যদি এটি বৃহত্তর আকারে ব্যবহার করা হয় তবে এর জন্য কোনও প্রকারের চীনামাটির বাসন সহায়তা ক্রপ হয়ে যেতে পারে, শেষ পর্যন্ত ...
( Http://git.or.cz/gitwiki/GitTips#head-9f87cd21bcdf081a61c29985604ff4be35a5e6c0 থেকে )
কীভাবে পরিবর্তন করবেন ইতিহাসের আরও গভীর প্রতিশ্রুতিবদ্ধ
যেহেতু গিটের ইতিহাস অপরিবর্তনীয়, সাম্প্রতিক কমিট ছাড়াও কিছু ঠিক করা (কমিট যা শাখার প্রধান নয়) প্রয়োজন যে পরিবর্তিত প্রতিশ্রুতি থেকে এবং ইতিহাসকে পুনরায় লেখার জন্য ইতিহাস প্রয়োজন।
আপনি এর জন্য স্টজিআইটি ব্যবহার করতে পারেন, প্রয়োজনে শাখা শুরু করুন, আপনি যে পরিবর্তন করতে চান তা আপত্তিহীন করে, প্রয়োজনে এটিতে পপ করুন, পরিবর্তন করুন তারপর প্যাচ রিফ্রেশ করুন (আপনি যদি কমিট বার্তা সংশোধন করতে চান তবে -e বিকল্প সহ), তারপরে চাপ দিন সবকিছু এবং স্ট্যান্ড কমিট।
অথবা আপনি এটি করতে পুনরায় ব্যবহার করতে পারেন। নতুন অস্থায়ী শাখা তৈরি করুন, গিট রিসেট --হার্ড ব্যবহার করে যে পরিবর্তনটি আপনি পরিবর্তন করতে চান তা রিইন্ড করুন, সেই প্রতিশ্রুতিটি পরিবর্তন করুন (এটি বর্তমান শীর্ষের শীর্ষস্থানীয় হবে), তারপরে গিট রিবেস --onto ব্যবহার করে পরিবর্তিত প্রতিশ্রুতি শীর্ষে শাখাটি রিবেস করুন।
অথবা আপনি গিট রিবেস - ইন্টারেক্টিভ ব্যবহার করতে পারেন, যা প্যাচ রি-অর্ডারিং, ধসে পড়া, ...
আমি মনে করি এটি আপনার প্রশ্নের উত্তর দেওয়া উচিত। তবে নোট করুন যে আপনি যদি কোডটি কোনও দূরবর্তী সংগ্রহস্থলের দিকে ঠেলে দিয়ে থাকেন এবং লোকেরা এটি থেকে সরিয়ে ফেলেছে, তবে এটি তাদের কোডের ইতিহাসগুলি এবং সেইসাথে তারা যে কাজ করেছে তাতে গণ্ডগোল সৃষ্টি করবে। সুতরাং সাবধানে এটি করুন।