How to use exclamation mark in git commit message

شاید برای شما هم پیش اومده باشه که بخواهید توی پیغام commit مربوط به  git از کاراکتر "!" (علامت تعجب) استفاده کنید. اما وقتی این کاراکتر رو استفاده کنید با پیغام خطایی مواجه خواهید شد که در زیر نشون دادم :
 
git commit -m "frmHelp added!"
bash: !": event not found

این به خاطر وجود شلی هست که دستورات git رو توی اون وارد میکنیم. درواقع وقتی از bash یا shell لینوکس استفاده میشه این اتفاق میفته.
اگر کاربر ویندوز باشید و Cygwin Terminal رو نصب کرده باشید و یا تو همون bash مربوط به git دستور زیر رو وارد کنید همون پیغام خطا رو خواهید گرفت:

 echo "hello!"

خوب برای استفاده از کاراکتر "!"  چند راه وجود داره:
استفاده از single quotes مثل دستور زیر
git commit -m 'frmHelp added!'
یا استفاده ادغام  single quotes و double quotes:
git commit -m "frmHelp added"'!'
یا استفاده از "\"  :
git commit -m "frmHelp added\!"

اگه بخواهیم که کلا از شر این کارا راحت بشیم باید چیکار کنیم؟
اول باید کمی درباره بعضی دستورات لینوکس توضیح بدم و با history شروع میکنم. دستور history باعث میشه که دستوراتی که در شل زدید رو بهتون نمایش بده. برای مثال دستور history در شل من به صورت زیر هستش :

Ahmad@Chehre ~
$ history
    1  pwd
    2  cd e:pwd
    3  cd e:pwd
    4  cd e:
    5  pwd
    6  ls
    7  exit
    8  pwd
    9  ls
   10  ps
   11  history

حالا اگر بخواهیم دستور شماره 5 دوباره اجرا بشه، خیلی راحت میتونیم از دستور زیر استفاده کنیم:
$ !5
یا برای اجرای دستور قبلی از دستور زیراستفاده میکنیم
$ !! 

این دو دستور نمونه هایی بودن از کاربردهای کاراکتر "!" در bash. خوب این امکانات رو  history expansion مربوط به bash برای ما به ارمغان میاره  و برای فعال کردن اون میتونید از از دستورات زیر استفاده کنید:
$ set -H
$ set -o histexpand

البته histexpand به صورت پیشفرض فعال هست و در راهنمای bash اینطور گفته شده:

-H  Enable ! style history substitution. This option is on
    by default when the shell is interactive.

برای غیر فعال کردن هم میتونید از دستورات زیر استفاده کنید:
$ set +H
$ set +o histexpand

در آخر برای اینکه تست کنیم که ببینیم حالا میتونیم از کاراکتر "!" استفاده کنیم، از دستور زیر استفاده می کنیم:

echo "hello!"

و در آخر باید بگم که خود من روش اول رو میپسندم چون نمیخوام امکانات history expansion رو از دست بدم.

Undoing git reset


همین دیروز بود که دیدم یک قسمتی از برنامه ای که نوشتم کار نمیکنه. اول فکر کردم شاید اشکال از آپدیت پکیج های برنامه باشه، چون آخرین کاری که انجام دادم همین کار بود. تنها کاری که باید انجام میدادم این بود که پروژه رو به قبل از آپدیت برگردونم.خوب این هم کاری نداشت برای کسی که از Version Control استفاده میکنه. و چون من از Git استفاده میکردم دستور زیر رو تو شل وارد کردم:
git reset --hard HEAD
بله، با همین دستور بود که کل برنامه رو فرستادم رو هوا چون در آخر دستور از HEAD استفاده کردم و Git هم نامردی نکرد و کاملا منو به 3 هفته پیش که پروژه رو استارت زده بودم برگردوند!
خوب از اونجا که خود Git همه کار ها رو لاگ میکنه حتی همین ریست کردن رو، پس کافی بود تا با دستور git reflog کامیت ها و ریست های خودم رو ببینم.
قسمتی از نتیجه reflog برای پروژه من:
$  git reflog
1eb15db HEAD@{0}: commit:
733bfe2 HEAD@{1}: commit:
023ef5d HEAD@{2}: reset:
13bfb8c HEAD@{3}: commit:
ce6557e HEAD@{4}: commit:
023ef5d HEAD@{5}: reset:
f99c553 HEAD@{6}: reset:
023ef5d HEAD@{7}: commit:
f99c553 HEAD@{8}: commit:
968f297 HEAD@{9}: commit
خوب حالا راحت میشه با دستور زیر
$ git reset --hard 1eb15db
همه چی رو به آخرین کامیت برگردوند و من هم همین کار رو انجام دادم :)

جستجو