আমি কীভাবে গিটে একটি ভুল প্রতিশ্রুতি বার্তা সম্পাদনা করব (যে আমি ঠেলে দিয়েছি)?


152

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

আমি কীভাবে প্রতিশ্রুতি বার্তা পরিবর্তন করব? এটা কি সম্ভব?

উত্তর:


125

লিনাস টরভাল্ডসের বার্তাটি আপনার প্রশ্নের উত্তর দিতে পারে:

পুরানো প্রতিশ্রুতি বার্তা পরিবর্তন / সম্পাদনা করুন

সংক্ষিপ্ত উত্তর: আপনি পারবেন না (যদি চাপ দেওয়া হয়)।


নিষ্কাশন (লিনাস বিটকিপারকে বি কে হিসাবে উল্লেখ করে):

পার্শ্ব নোট, historicalতিহাসিক আগ্রহের বাইরে: বিকে আপনি করতে পারেন।

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

আমিও একই কাজ করতে পারি কেবল প্রতিশ্রুতি বার্তাটিকে নামের অংশ হিসাবে না করা এবং ইতিহাসের অনুচ্চারিত হওয়ার গ্যারান্টি দিয়ে দেওয়া এবং "পরে মন্তব্যগুলি ঠিক করার" অনুমতি দেওয়া যথেষ্ট সহজ হত।

কিন্তু আমি তা করিনি।

এর অংশটি খাঁটি "অভ্যন্তরীণ ধারাবাহিকতা"। গিট হ'ল SHA1- সুরক্ষিত এবং সমস্ত বস্তুকে একইরূপে বিবেচনা করা হচ্ছে, বস্তুর ধরণের নির্বিশেষে সবকিছুর জন্য একইভাবে একটি ক্লিনার সিস্টেম ধন্যবাদ। হ্যাঁ, এখানে চারটি বিভিন্ন ধরণের অবজেক্ট রয়েছে এবং এগুলি সবই আলাদা and এবং এগুলি একই পদ্ধতিতে ব্যবহার করা যায় না, তবে একই সাথে, যদি তাদের এনকোডিংটি ডিস্কে পৃথক হতে পারে তবে ধারণাগতভাবে তারা সমস্ত ঠিকঠাক কাজ করে একই.

তবে অভ্যন্তরীণ ধারাবাহিকতা প্রকৃতপক্ষে জটিলতার জন্য অজুহাত নয় এবং স্পষ্টতই এটি খুব নমনীয় হবে যদি আমরা তাদের ভুল হওয়ার পরে কেবল সমাধান করতে পারি। সুতরাং এটি একটি সত্যই দৃ strong় যুক্তি নয়।

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


সম্পূর্ণ হবে, আপনি পারে কি আপনি চান, যেমন প্রতিফলিত করার জন্য আপনার স্থানীয় কমিট ইতিহাস পুনর্লিখন sykora দ্বারা প্রস্তাবিত (কিছু রি-বেসের ফলে এবং --hard পুনরায় সেট করুন, খাবি!)

যাইহোক, আপনি একবার আপনার সংশোধিত ইতিহাস পুনরায় প্রকাশ করুন (এ সহ git push origin +master:master, +একটি "দ্রুত-ফরওয়ার্ড" প্রতিশ্রুতি না দেওয়ার পরেও এই চাপটি চাপতে বাধ্য করে এমন সাইন) ... আপনি কিছুটা সমস্যায় পড়তে পারেন

এই অন্যান্য এসও প্রশ্ন থেকে নিষ্কাশন:

আমি একবার gif.git সংগ্রহস্থল - ফোর্স দিয়ে ধাক্কা দিয়ে লিনাস বিগ টাইম দ্বারা বদনাম পেয়েছিলাম। এটি অন্যান্য মানুষের জন্য প্রচুর সমস্যা তৈরি করবে। একটি সহজ উত্তর "এটি করবেন না"।


ভাল উত্তর. আপনি কি জানেন যে আপনি যদি ইতিমধ্যে গিটের নতুন সংস্করণগুলিতে ইতিমধ্যে ধাক্কা খাওয়া প্রতিশ্রুতিগুলি পরিবর্তন করতে সক্ষম হন? '09-এ পোস্ট হওয়ার পরে কি কিছু পরিবর্তন হয়েছে?
ডেভিড ওয়েস্ট

@ ডেভিড ওয়েস্ট একই নীতি ধারণ করে: আপনি নিজের ইতিহাস পুনর্লিখন করতে পারেন এবং একটি চাপ দিতে বাধ্য করতে পারেন।
ভনসি

2
বিষয়গুলিকে আরও সুনির্দিষ্ট করে তুলতে, যদি আপনি সংশোধন / পুনর্বাসনের অঙ্গীকারগুলি সম্পাদন করেন তবে তাদের প্রতিশ্রুতিবদ্ধ শনাক্তকারীরা (গিট ইনডেক্সে হেক্সাডেসিমাল হ্যাশগুলি) অবশ্যম্ভাবীভাবে পরিবর্তন হয়; এর অর্থ হ'ল সম্পাদিত কমিটগুলি গিট ভিসিএসের ইতিহাসে তাদের পুরানো কমিটগুলি থেকে আলাদা আচরণ করা হয়। এটি বলা হয়েছে, যদি আপনার দেব দলের সদস্যরা দুর্ভাগ্যক্রমে ইতিমধ্যে পুরানো কমিটগুলি টানেন, তারা সম্পাদিত, নতুন কমিটগুলি টানতে এবং তাদের স্থানীয় কাজের অনুলিপিগুলিতে পুরানো এবং নতুনের মধ্যে একত্রিত করতে বাধ্য।
শিগেরেলো

1
আপনার সহকর্মীদের সুবিধার জন্য সম্পাদিত প্রতিশ্রুতিগুলি নতুনভাবে ঠেলে দেওয়া আরও ভাল, এইভাবে সহকর্মীদের কাজের অনুলিপিগুলিতে মার্জের প্রয়োজনীয়তা অনুকূলভাবে সরিয়ে ফেলুন।
শিগেরেলো

28

বর্তমানে একটি গিট প্রতিস্থাপন কৌশলটি করতে পারে।

বিস্তারিত: একটি অস্থায়ী কাজের শাখা তৈরি করুন

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

সম্পন্ন.


11
@ জোনাঃ আমি যখন প্রত্যন্ত শাখায় ধাক্কা দেওয়ার চেষ্টা করি তখন আমি একটি "সমস্ত কিছু আপ-টু-ডেট" বার্তা পাচ্ছি
সাইমন কাগভি

1
অন্য উত্তরে যেমন উল্লেখ করা হয়েছে: পুনর্নির্মাণের সাথে রিবেস -i ব্যবহার করুন। এবং এটি ইতিহাস আবার লিখবে।
সিলভাইন

আমি যে সমাধানটির সন্ধান করছিলাম তার জন্য আপনাকে ধন্যবাদ। তুমি আমার সময় বাঁচাও!
টমাসজ কুটার

1
@ জোনাঃ - আমার একটি সমস্যা আছে ... আপনার সমাধানটি স্থানীয়ভাবে আমার কমিট লগগুলি আপডেট করেছে, তবে দূর থেকে নয়। তাদের সেখানে কীভাবে ঠেলাবেন?
টমাসজ কুটার

1
@ টমাসকুটার, আপনার মত আমারও একই সমস্যা ছিল। আমার প্রতিশ্রুতি বার্তা দূর থেকে আপডেট করা হয়নি। আমি গিটহাবের নিম্নলিখিত সহায়তা ব্যবহার করে এটি সমাধান করেছি: হেল্প . github.com/articles/changing-a-commit-message । অনুসরণ করুন: পুরানো বা একাধিক প্রতিশ্রুতি বার্তা বিভাগের বার্তা সংশোধন করে। এটি ব্যবহারকারী987419 দ্বারা প্রদত্ত নীচে থেকে মূলত উত্তরটি হয়েছে যদি আপনি ইতিমধ্যে প্রতিশ্রুতি বার্তা পরিবর্তন করে থাকেন তবে আপনি এটি আবার পরিবর্তন না করে বাছাই করতে এবং সংরক্ষণ করতে পারেন।
evaldeslacasa

19

git rebase -iইন্টারেক্টিভের জন্য আপনি 'আমি' (আপনি যে শাখা থেকে ব্রাঞ্চ করেছিলেন সেই শাখার বিরুদ্ধে) ব্যবহার করতে পারেন ।

pickআপনি r(বা reword) দিয়ে পরিবর্তন করতে চান এমন প্রতিশ্রুতিবদ্ধ মন্তব্যের পরবর্তী প্রতিস্থাপন করুন , সংরক্ষণ করুন এবং প্রস্থান করুন এবং এটি করার পরে আপনি সম্পাদনা করতে সক্ষম হবেন।

git push আবার একবার এবং আপনি শেষ!


1
এটি মার্জ কমিটে বার্তাগুলি সম্পাদনা করার অনুমতি দেয় না। এই আদেশের কিছু বৈকল্পিক দিয়ে কি এটি সম্ভব?
অ্যান্ড্রু মাও

1
কোন রিজার্ভগুলি একত্রিত হয় তার -pযুক্তিটি ব্যবহার করে দেখুন । rebasep
ক্যাকটাস

3
আমি এই পদ্ধতিটি পছন্দ করি তবে প্রথমে উত্তরটি বেশ বুঝতে পারিনি। যদি কারও সাথে এটির সহায়তার প্রয়োজন হয় তবে, গিথুলব সহায়তা পৃষ্ঠাটি এ সম্পর্কে ভাল তথ্য সরবরাহ করে: help.github.com/articles/changing-a-commit-message
evaldeslacasa

15

ধরুন আপনার মতো গাছ আছে:

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 originmastermastertemp

এখন আপনার স্থানীয় এবং দূরবর্তী উভয়ই সমস্ত বার্তা আপডেট হবে।


5

আমাদের দোকানে, আমি ভুল বার্তাগুলির সাথে কমিটে স্বীকৃতভাবে নামযুক্ত টীকাগুলি যুক্ত করার এবং প্রতিস্থাপন হিসাবে টীকাটি ব্যবহার করার কনভেনশনটি চালু করেছিলাম।

যদিও এটি নৈমিত্তিক "গিট লগ" কমান্ড চালিয়ে যাওয়া লোকদের সহায়তা করে না, তবুও এটি আমাদের মন্তব্যগুলিতে ভুল বাগ ট্র্যাকার উল্লেখগুলি ঠিক করার একটি উপায় সরবরাহ করে এবং আমার সমস্ত বিল্ড এবং প্রকাশের সরঞ্জামগুলি কনভেনশনটি বুঝতে পারে।

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


3
"গিট নোটগুলি" অনুরূপ উদ্দেশ্যে পরিবেশন করতে পারে
খ্রিস্টান গেটজে

2

( Http://git.or.cz/gitwiki/GitTips#head-9f87cd21bcdf081a61c29985604ff4be35a5e6c0 থেকে )

কীভাবে পরিবর্তন করবেন ইতিহাসের আরও গভীর প্রতিশ্রুতিবদ্ধ

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

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

অথবা আপনি এটি করতে পুনরায় ব্যবহার করতে পারেন। নতুন অস্থায়ী শাখা তৈরি করুন, গিট রিসেট --হার্ড ব্যবহার করে যে পরিবর্তনটি আপনি পরিবর্তন করতে চান তা রিইন্ড করুন, সেই প্রতিশ্রুতিটি পরিবর্তন করুন (এটি বর্তমান শীর্ষের শীর্ষস্থানীয় হবে), তারপরে গিট রিবেস --onto ব্যবহার করে পরিবর্তিত প্রতিশ্রুতি শীর্ষে শাখাটি রিবেস করুন।

অথবা আপনি গিট রিবেস - ইন্টারেক্টিভ ব্যবহার করতে পারেন, যা প্যাচ রি-অর্ডারিং, ধসে পড়া, ...

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


তত্ত্ব ভাল উত্তর বাস্তবে মহৎ বিপজ্জনক: দেখুন stackoverflow.com/questions/253055#432518
VonC

0

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

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


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