it-swarm.asia

كيفية تعديل رسائل الالتزام الحالية غير المصرح بها؟

كتبت الشيء الخطأ في رسالة الالتزام.

كيف يمكنني تغيير الرسالة؟ لم يتم دفع الالتزام بعد.

7673
Laurie Young
git commit --amend -m "your new message"
2458
lfx_cool

إذا كان الالتزام الذي تريد إصلاحه ليس هو الأحدث:

  1. git rebase --interactive $parent_of_flawed_commit

    إذا كنت ترغب في إصلاح العديد من الإرشادات الخاطئة ، فقم بتمرير أحد الوالدين الأقدم.

  2. سيظهر المحرر ، مع قائمة بجميع التعهدات منذ الالتزام الذي قدمته.

    1. قم بتغيير pick إلى reword (أو على الإصدارات القديمة من Git ، إلى edit) أمام أي التزامات تريد إصلاحها.
    2. بمجرد الحفظ ، سيعيد Git إعادة تنفيذ الالتزامات المدرجة.

  3. لكل التزام تريد reword ، سوف يعيدك Git إلى محررك. لكل التزام تريد تحرير ، ينقلك Git إلى Shell. إذا كنت في شل:

    1. تغيير الالتزام بأي طريقة تريد.
    2. git commit --amend
    3. git rebase --continue

سيتم شرح معظم هذا التسلسل لك من خلال إخراج مختلف الأوامر كما تذهب. إنه أمر سهل للغاية ، لا تحتاج إلى حفظه - فقط تذكر أن git rebase --interactive يتيح لك تصحيح الالتزامات بغض النظر عن المدة التي مضت فيها.


لاحظ أنك لن ترغب في تغيير الالتزامات التي دفعتها بالفعل. أو ربما تفعل ذلك ، ولكن في هذه الحالة ، سيتعين عليك أن تتوخى الحذر الشديد للتواصل مع أي شخص ربما يكون قد سحب تعهداتك وقام بالعمل عليها. كيف يمكنني استعادة/إعادة المزامنة بعد أن يقوم شخص ما بدفع rebase أو إعادة التعيين إلى فرع منشور؟

2330
Aristotle Pagaltzis

لتعديل الالتزام السابق ، قم بإجراء التغييرات التي تريدها وقم بإجراء تلك التغييرات ، ثم قم بتشغيلها

git commit --amend

سيؤدي هذا إلى فتح ملف في محرر النصوص الخاص بك يمثل رسالة الالتزام الجديدة. يبدأ بالسكان مع النص من رسالة الالتزام القديمة. قم بتغيير رسالة الالتزام كما تريد ، ثم احفظ الملف ثم قم بإنهاء برنامج التحرير حتى ينتهي.

لتعديل الالتزام السابق والحفاظ على نفس رسالة السجل ، قم بتشغيل

git commit --amend -C HEAD

لإصلاح الالتزام السابق بإزالته بالكامل ، قم بتشغيل

git reset --hard HEAD^

إذا كنت ترغب في تحرير أكثر من رسالة التزام واحدة ، فقم بتشغيل

git rebase -i HEAD~commit_count

(يحل محل commit_count بعدد الالتزامات التي تريد تحريرها.) يقوم هذا الأمر بتشغيل المحرر الخاص بك. حدد الالتزام الأول (الالتزام الذي تريد تغييره) على أنه "تحرير" بدلاً من "اختيار" ، ثم احفظ محررك واخرج منه. قم بإجراء التغيير الذي تريد الالتزام به ثم قم بتشغيله

git commit --amend
git rebase --continue

ملاحظة: يمكنك أيضًا "إجراء التغيير الذي تريده" أيضًا من المحرر المفتوح بواسطة git commit --amend

762
Fatih

كما ذكرنا سابقًا ، git commit --amend هي الطريقة لاستبدال الالتزام الأخير. ملاحظة واحدة: إذا كنت ترغب أيضًا في الكتابة فوق الملفات ، فسيكون الأمر

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

يمكنك أيضًا استخدام git filter-branch لذلك.

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

الأمر ليس سهلاً مثل git commit --amend التافه ، لكنه مفيد بشكل خاص ، إذا كان لديك بالفعل بعض الدمج بعد رسالة الالتزام الخاطئة.

لاحظ أن هذا سيحاول إعادة كتابة كل التزام بين HEAD والالتزام الخاطئ ، لذلك يجب عليك اختيار أمر msg-filter الخاص بك حكيم ؛-)

352
Mark

انا افضل بهذه الطريقة.

git commit --amend -c <commit ID>

وإلا ، سيكون هناك التزام جديد بمعرف التزام جديد

312
krevedko

إذا كنت تستخدم أداة Git GUI ، فهناك زر يسمى تعديل الالتزام الأخير. انقر على هذا الزر ، وبعد ذلك سيعرض آخر ملفات الالتزام والرسالة. فقط قم بتحرير تلك الرسالة ويمكنك الالتزام بها برسالة التزام جديدة.

أو استخدم هذا الأمر من وحدة التحكم/المحطة الطرفية:

git commit -a --amend -m "My new commit message"
310
Akhilraj N S

يمكنك استخدام Git rebasing . على سبيل المثال ، إذا كنت ترغب في تعديل مرة أخرى للالتزام bbc643cd ، فقم بتشغيل

$ git rebase bbc643cd^ --interactive

في المحرر الافتراضي ، قم بتعديل "اختيار" إلى "تحرير" في السطر الذي تريد تعديل التزامه. قم بإجراء التغييرات الخاصة بك ، ثم قم بتشغيلها

$ git add <filepattern>

الآن يمكنك استخدام

$ git commit --amend

لتعديل الالتزام ، وبعد ذلك

$ git rebase --continue

للعودة مرة أخرى إلى ارتكاب رئيس السابق.

282
Shoaib Ud-Din
  1. إذا كنت تريد فقط تعديل آخر رسالة التزام ، فقم بما يلي:

    git commit --amend
    

    سيؤدي ذلك إلى إسقاطك إلى exitor النص الخاص بك ويتيح لك تغيير آخر رسالة الالتزام.

  2. إذا كنت ترغب في تغيير آخر 3 رسائل التزام أو أي من رسائل الالتزام حتى هذه النقطة ، فقم بتزويد HEAD~3 إلى الأمر git rebase -i:

    git rebase -i HEAD~3
    
275
Heena Hussain

إذا كان عليك تغيير رسالة التزام قديمة عبر فروع متعددة (أي ، الالتزام بالرسالة الخاطئة موجود في فروع متعددة) قد ترغب في استخدامها:

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

سيقوم Git بإنشاء دليل مؤقت لإعادة الكتابة والنسخ الاحتياطي للمراجع القديمة في refs/original/.

  • -f سوف يفرض تنفيذ العملية. يعد هذا ضروريًا إذا كان الدليل المؤقت موجودًا بالفعل أو إذا كانت هناك مراجع مخزنة بالفعل تحت refs/original. إذا لم يكن الأمر كذلك ، يمكنك إسقاط هذه العلامة.

  • يفصل -- خيارات فرع التصفية عن خيارات المراجعة.

  • --all سوف تتأكد من إعادة كتابة جميع الفروع و العلامات .

بسبب النسخ الاحتياطي لمراجعك القديمة ، يمكنك العودة بسهولة إلى الحالة قبل تنفيذ الأمر.

لنفترض أنك تريد استرداد سيدك والوصول إليه في الفرع old_master:

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

استعمال

git commit --amend

لفهمها بالتفصيل ، المشاركة الممتازة هي {4. إعادة كتابة Git History. يتحدث أيضًا عن عند عدم استخدام git commit --amend.

221
skin

تعديل

لديك بضع خيارات هنا. يمكنك ان تفعل

git commit --amend

طالما انها ارتكاب الماضي الخاص بك.

Rebase التفاعلية

خلاف ذلك ، إذا لم يكن الالتزام الأخير الخاص بك ، فيمكنك القيام بإعادة تحليل تفاعلية ،

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

ثم داخل rebase التفاعلية ، يمكنك ببساطة إضافة تعديل إلى هذا الالتزام. عندما يتعلق الأمر ، قم بعمل git commit --amend وعدّل رسالة الالتزام. إذا كنت تريد التراجع قبل نقطة الالتزام هذه ، فيمكنك أيضًا استخدام git reflog وحذف هذا الالتزام فقط. بعد ذلك ، تقوم فقط بـ git commit مرة أخرى.

195
wallerjake

إذا كنت تستخدم Git GUI ، فيمكنك تعديل الالتزام الأخير الذي لم يتم دفعه باستخدام:

Commit/Amend Last Commit
183
gulchrider

إذا كان الالتزام الأخير الخاص بك ، فقط يعدل الالتزام:

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

(باستخدام علامة -o (--only) للتأكد من تغيير رسالة الالتزام فقط)


إذا كان التزامًا مدفونًا ، فاستخدم rebase rebase التفاعلية :

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

ابحث عن الالتزام الذي تريده ، وقم بتغيير pickإلى r(rewordname__) ، واحفظ وأغلق الملف. فعله!



مصغرة vim تعليمي (أو ، كيفية rebase مع 8 ضربات المفاتيح فقط 3jcwname__rname__EscZZname__):

  • شغّل vimtutorإذا كان لديك وقت
  • hname__jname__kname__lname__ تتوافق مع مفاتيح الحركة 
  • يمكن بادئة جميع الأوامر بـ "نطاق" ، على سبيل المثال 3j يتحرك لأسفل 3 خطوط
  • iname__ للدخول في وضع الإدراج - سيظهر النص الذي تكتبه في الملف
  • Esc أو Ctrlcname__ للخروج من وضع الإدراج والعودة إلى الوضع "العادي"
  • uname__ للتراجع
  • Ctrlrname__ لإعادة
  • ddname__، dwname__، dlname__ لحذف خط أو كلمة أو حرف ، على التوالي
  • ccname__، cwname__، clname__ لتغيير خط أو كلمة أو حرف ، على التوالي (نفس ddname__iname__)
  • yyname__، ywname__، ylname__ لنسخ ("yank") خط أو Word أو حرف ، على التوالي
  • pname__ أو Pname__ للصق بعد ، أو قبل الوضع الحالي ، على التوالي
  • :wEnter لحفظ (كتابة) ملف
  • :q!Enter لإنهاء دون حفظ
  • :wqEnter أو ZZname__ لحفظ وإنهاء

إذا قمت بتحرير النص كثيرًا ، فانتقل إلى تخطيط لوحة المفاتيح Dvorak وتعلم الكتابة باللمس وتعلم vim. هل يستحق كل هذا الجهد؟ نعم.



ProTip ™: لا تخف من تجربة الأوامر "الخطيرة" التي تعيد كتابة السجل * - Git لا يحذف التزاماتك لمدة 90 يومًا افتراضيًا ؛ يمكنك العثور عليها في reflog:

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

* احترس من الخيارات مثل --hard و --force رغم ذلك - يمكنهم تجاهل البيانات.
* أيضًا ، لا تعيد كتابة السجل في أي فروع تتعاون معها.

172
Zaz

يمكنني استخدام Git GUI بقدر ما أستطيع ، وهذا يمنحك خيار تعديل الالتزام الأخير:

Tick that box

أيضًا ، git rebase -i Origin/master هي تعويذة لطيفة ستقدم لك دائمًا الالتزامات التي قمت بها على رأس المعلم ، وتمنحك خيار التعديل أو الحذف أو إعادة الترتيب أو الاسكواش. لا حاجة للحصول على هذا التجزئة أولاً.

165
Havard Graff

واو ، لذلك هناك الكثير من الطرق للقيام بذلك.

هناك طريقة أخرى للقيام بذلك وهي حذف الالتزام الأخير ، مع الاحتفاظ بتغييراته حتى لا تفقد عملك. يمكنك بعد ذلك الالتزام الآخر بالرسالة المصححة. قد يبدو هذا مثل هذا:

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

أفعل هذا دائمًا إذا نسيت إضافة ملف أو إجراء تغيير.

تذكر لتحديد --soft بدلاً من --hard ، وإلا فستفقد هذا الالتزام بالكامل.

135
Radu Murzea

لأي شخص يبحث عن واجهة المستخدم الرسومية لنظام Windows/Mac للمساعدة في تحرير الرسائل القديمة (أي ليس آخر رسالة فقط) ، أوصي SourceTree . الخطوات الواجب اتباعها أدناه.

SourceTree interactive rebase

بالنسبة للتعهدات التي لم يتم دفعها بعد إلى جهاز التحكم عن بعد:

  1. تأكد من أنك ارتكبت أو خبأت جميع التغييرات الحالية (أي أنه لا توجد ملفات مدرجة في علامة التبويب "حالة الملف") - لن تعمل بطريقة أخرى.
  2. في علامة التبويب "السجل/السجل" ، انقر بزر الماوس الأيمن على الإدخال مع وجود خط مجاور في الرسم البياني واحد أدناه الالتزام (الالتزامات) التي ترغب في تعديلها وحدد "Rebase children of <الالتزام المرجع > بشكل تفاعلي ... "
  3. حدد الصف بالكامل لرسالة الالتزام التي ترغب في تغييرها (أي النقر فوق عمود "الرسالة").
  4. انقر فوق الزر "تحرير الرسالة".
  5. قم بتحرير الرسالة كما هو مطلوب في مربع الحوار الذي يظهر ، ثم انقر فوق "موافق".
  6. كرر الخطوات من 3-4 إذا كان هناك رسائل التزام أخرى للتغيير.
  7. انقر فوق "موافق": سيبدأ إعادة التثبيت. إذا كان كل شيء على ما يرام ، سينتهي الإخراج "اكتمل بنجاح".

... أو ... عن الإلتزامات التي تم دفعها بالفعل:

اتبع الخطوات الموضحة في هذه الإجابة ، والتي تشبه ما ورد أعلاه ولكنها تتطلب تشغيل أمر آخر من سطر الأوامر إلى إجبار الفرع على الضغط - اقرأها جميعًا واستخدم الحذر اللازم!

125
Steve Chambers

إذا كنت ترغب فقط في تعديل استخدام أحدث التزام:

git commit --amend

أو

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

ولكن إذا كنت تريد تحرير عدة عمليات متتالية فيجب عليك استخدام rebasing بدلاً من ذلك:

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

git rebase editing

في ملف مثل الملف أعلاه ، اكتب/e أو أحد الخيارات الأخرى واضغط على "حفظ" و "إنهاء".

الآن سوف تكون في أول التزام خاطئ. قم بإجراء تغييرات في الملفات ، وسيتم تشغيلها تلقائيًا لك. نوع

git commit --amend

حفظ والخروج من ذلك واكتب

git rebase --continue 

للانتقال إلى التحديد التالي حتى الانتهاء من جميع اختياراتك.

لاحظ أن هذه الأشياء تغير كل تجزؤك SHA بعد هذا الالتزام المحدد.

124
Shubham Chaudhary

إذا كنت ترغب فقط في تغيير رسالتك الأخيرة ، فيجب عليك استخدام العلامة --only أو اختصارها -o مع commit --amend:

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

هذا يضمن أنك لا تقوم بتعزيز التزامك بطريق الخطأ. بالطبع من الأفضل أن يكون لديك تكوين $EDITOR مناسب. بعد ذلك يمكنك ترك خيار -m بالخارج ، وسوف يقوم git بملء رسالة الالتزام مسبقًا بالرسالة القديمة. بهذه الطريقة يمكن تحريرها بسهولة.

123
David Ongaro

حدّث آخر رسالة التزام خاطئة برسالة التزام جديدة في سطر واحد:

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

أو ، حاول إعادة تعيين git مثل أدناه:

# 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 seperately 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"

لقد نجحت في كسر التزامك الأخير إلى قسمين.

99
przbadu

يوجد على هذا السؤال الكثير من الإجابات ، لكن لا أحد منها يوضح بتفاصيل فائقة كيفية تغيير رسائل الالتزام القديمة باستخدام VIM. لقد تعثرت في محاولة القيام بذلك بنفسي ، لذا سأكتب بالتفصيل كيف فعلت هذا خاصةً للأشخاص الذين ليس لديهم خبرة في VIM!

كنت أرغب في تغيير آخر خمس تعهدات قمت بدفعها بالفعل إلى الخادم. هذا سبب "خطير" تمامًا إذا قام شخص آخر بالانسحاب بالفعل من ذلك يمكنك تعطل الأمور عن طريق تغيير رسائل الالتزام. ومع ذلك ، عندما تعمل في فرع صغير خاص بك ولا تتأكد من أنه لم يقم أحد بسحبه ، يمكنك تغييره كما يلي:

لنفترض أنك تريد تغيير آخر خمس تعهدات ، ثم اكتبها في الجهاز:

git rebase -i HEAD~5 * حيث 5 هو عدد رسائل الالتزام التي تريد تغييرها. (لذلك ، إذا كنت تريد تغيير الالتزام العاشر الذي كتبته في آخر 10 سنوات)

سيأخذك هذا الأمر إلى VIM حيث يمكنك "تعديل" سجل الالتزام. سترى آخر 5 إقرارات في الأعلى مثل هذا:

pick <commit hash> commit message

بدلاً من pick ، تحتاج إلى كتابة reword. يمكنك القيام بذلك في VIM بكتابة i ، مما يجعلك تدخل إلى وضع INSERT. (ترى أنك في وضع الإدراج بواسطة Word INSERT في الأسفل) بالنسبة للتعهدات التي تريد تغييرها اكتب reword بدلاً من pick

ثم تحتاج إلى حفظ هذه الشاشة وإنهاءها ، فأنت تقوم بذلك عن طريق الدخول أولاً إلى "وضع الأوامر" عن طريق الضغط على زر esc. (يمكنك التحقق من أنك في وضع الأوامر إذا اختفى Word INSERT في الأسفل) ثم يمكنك كتابة أمر عن طريق كتابة : ، الأمر الذي يجب حفظه وإنهائه هو wq. لذا ، إذا كتبت :wq ، فأنت على الطريق الصحيح.

ثم VIM سوف تنتقل إلى كل رسالة التزام تريد إعادة صياغتها ، وهنا يمكنك بالفعل تغيير رسائل الالتزام. ستقوم بذلك عن طريق الدخول إلى وضع INSERT ، وتغيير رسالة الالتزام ، والانتقال إلى وضع الأوامر ، والحفظ والإنهاء. افعل ذلك 5 مرات وأنت خارج VIM!

ثم ، إذا كنت قد دفعت بالفعل التزاماتك الخاطئة ، فأنت بحاجة إلى git Push --force للكتابة فوقها. تذكر أن git Push --force يعد أمرًا خطيرًا ، لذا تأكد من عدم سحب أي شخص من الخادم منذ أن دفعت التزاماتك الخاطئة!

الآن قمت بتغيير رسائل الالتزام الخاصة بك!

(كما ترون ، فأنا لست من ذوي الخبرة في VIM لذا إذا استخدمت لغة خاطئة لشرح ما يحدث ، فلا تتردد في تصحيحي!)

82
Marijn

يمكنك استخدام git-rebase-reword

تم تصميمه لتعديل أي التزام (وليس الأخير فقط) بنفس طريقة commit --amend

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

تتم تسميته بعد الإجراء على rebase التفاعلية لتعديل الالتزام: "reword". انظر هذا المنصب و رجل قسم الوضع التفاعلي -

أمثلة:

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

لقد قمت بإضافة الاسم المستعار لـ reci ، recm لـ recommit (amend) ، يمكنك الآن القيام بذلك باستخدام git recm أو git recm -m.

$ vim ~/.gitconfig

[alias]

    ......
    cm = commit
    reci = commit --amend
    recm = commit --amend
    ......
76
Chu-Siang Lai

أدركت أنني قد دفعت الالتزام بخطأ مطبعي فيه. للتراجع ، قمت بما يلي:

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

تحذير: القوة التي تدفع تغييراتك ستحل محل الفرع البعيد بفرعك المحلي. تأكد من أنك لن تقوم بالكتابة فوق أي شيء تريد الاحتفاظ به. كن حذرًا أيضًا من فرض فرض الالتزام المعدل (المعاد كتابته) إذا قام أي شخص بمشاركة الفرع معك ، لأنهم سيحتاجون إلى إعادة كتابة تاريخهم إذا كان لديهم النسخة القديمة من الالتزام الذي قمت بإعادة كتابته للتو.

54
neoneye

أحب استخدام ما يلي:

  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>
49
Kedar Adhikari

إذا لم تدفع الرمز إلى فرعك البعيد ( GitHub / Bitbucket ) ، يمكنك تغيير رسالة الالتزام في سطر الأوامر على النحو التالي.

 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?

ملاحظة مهمة: عند استخدام القوة Push مباشرة ، قد ينتهي بك الأمر بمشكلات التعليمات البرمجية التي يعمل مطورو البرامج الآخرون على نفس الفرع. لتفادي هذه التعارضات ، تحتاج إلى سحب الكود من الفرع الخاص بك قبل إجراء فرض الضغط :

 git commit --amend -m "BRANCH-NAME : your new message"
 git pull Origin BRANCH-NAME
 git Push -f Origin BRANCH-NAME

هذا هو أفضل ممارسة عند تغيير رسالة الالتزام ، إذا تم دفعها بالفعل.

43
Prabhakar