آشنایی با Git: مباحث پیشرفته‌تر (ضمیمه 1)

(Introduction to Git: More Advanced Topics (Appendix 1

25 بهمن 1399
درسنامه درس 5 از سری آشنایی با Git
آشنایی با Git: مباحث پیشرفته تر

در این قسمت از آموزش گیت می خواهیم دستورات و تکنیک های پیشرفته تری را بررسی کنیم که به احتمال زیاد بعدها به دردتان خواهند خورد. بنابراین بدون مقدمه شروع می کنیم!

بررسی تفاوت های موجود بین دو commit

هر commit دارای id خاص خود است که به شکل رشته ای از اعداد و حروف می باشد. برای نمایش لیست کاملی از تمام commit ها و id هایشان می توانید از دستور git log استفاده کنید:

$ git log
commit 01475e36099237fdca74c4e5886bbb8dc8f52b2f (HEAD -> master, origin/master)
Author: Amir-Zouerami
Date:   Fri Aug 30 20:10:16 2019 +0430

    new feature added

commit d73b530561625a8c3d5ce8f3da7b1645aecde9f1
Author: Amir-Zouerami
Date:   Fri Aug 30 20:08:08 2019 +0430

    test text added

commit a39c94fc9cb15f04cc416c2c9dcabbfce608bdc7
Author: Amir-Zouerami
Date:   Fri Aug 30 19:55:25 2019 +0430

    New feature complete.

commit 47cb17ae80ca69151a26280c6a7eebd588a1d419
Author: Amir-Zouerami 
Date:   Thu Aug 29 11:53:25 2019 +0430

    initial commit

من چند commit دیگر به فایل خود اضافه کردم بنابراین چنین چیزی را می بینید. واضح است که نتایج شما بسته به نام، ایمیل، تاریخ ایجاد تغییرات و... متفاوت خواهد بود. همانطور که می بینید id های commit ها بسیار طولانی هستند اما در هنگام کار با آن ها معمولا چندین کاراکتر اول کافی هستند و نیازی به کپی کردن تمام رشته نیست (البته اگر می خواهید محکم کاری کنید می توانید تمام رشته را نیز کپی کنید).

به طور مثال برای نمایش چیزهای جدیدی که درون یک commit وجود دارد می توانیم از دستور git show [commit] استفاده کنیم:

$ git show b10cc123

commit b10cc1238e355c02a044ef9f9860811ff605c9b4
Author: Amir-Zouerami
Date:   Fri Aug 30 20:08:08 2019 +0430

    Added content to hello.txt

diff --git a/hello.txt b/hello.txt
index e69de29..b546a21 100644
--- a/hello.txt
+++ b/hello.txt
@@ -0,0 +1 @@
+Nice weather today, isn't it?

همچنین با استفاده از ساختار زیر می توانیم تفاوت بین دو commit مختلف را مشاهده کنیم:

git diff [commit-from]..[commit-to]

باید به جای commit-from آیدی commit اول و به جای commit-to آیدی commit دوم را قرار دهید تا تفاوت بین این دو نمایش داده شود. به طور مثال:

$ git diff 09bd8cc..ba25c0ff

diff --git a/feature.txt b/feature.txt
new file mode 100644
index 0000000..e69de29
diff --git a/hello.txt b/hello.txt
index e69de29..b546a21 100644
--- a/hello.txt
+++ b/hello.txt
@@ -0,0 +1 @@
+Nice weather today, isn't it?

در اینجا اولین commit را با آخرین commit مقایسه کرده ایم؛ بدین صورت می توانیم تمام تغییراتی که از ابتدا تا انتها ایجاد شده اند را مشاهده کنیم.

برگرداندن یک فایل به نسخه قبلی

git به ما اجازه می دهد که هر فایلی را به نسخه قبلی خود در یک commit مشخص برگردانیم. این کار با استفاده از دستور آشنای git checkout انجام می شود؛ قبلا از این دستور برای جا به جایی بین شاخه ها استفاده کردیم اما می توانیم از آن برای جابجایی بین commit ها نیز استفاده کنیم. برای مثال فایل hello.txt را گرفته و آن را به اولین نسخه آن (اولین commit) برمی گردانیم. برای این کار باید id مربوط به آن commit و آدرس کامل فایل خود را نیز داشته باشیم:

$ git checkout 09bd8cc1 hello.txt

از آنجا که فایل ما در همین پوشه بوده است، آدرس کامل همان نام فایل می شود.

تصحیح commit ها

اگر commit ای را ثبت کردید و سپس متوجه شدید که درون پیام آن اشتباه تایپی دارید، یا به طور کل می خواهید پیام commit آن را تغییر دهید، یا می خواهید یک فایل را به آن اضافه کنید باید از دستور git commit --amend استفاده کنید (فقط برای آخرین commit کاربرد دارد). این دستور همه چیز را از commit قبل گرفته و به staging area می برد، سپس سعی می کند یک commit جدید بر اساس آن بسازد. بدین صورت می توانید commit ثبت شده را اصلاح کنید.

به طور مثال برای اصلاح پیام ثبت شده می توانید مستقیما بگویید:

git commit --amend

این کد باید ویرایشگر متنی شما را باز کند تا کارتان را انجام دهید و پیام را ویرایش کنید. همچنین می توانید به جای کد بالا بدین روش عمل کنید:

git commit --amend -m "an updated commit message"

با این روش می توانید به صورت مستقیم پیام Commit خود را ویرایش کنید.

اما برای اضافه کردن فایل هایی که فراموش کردیم چطور؟

فرض کنید دو فایل hello.py و main.py را دارید، آن ها را تغییر داده اید اما فراموش کرده اید یکی از آن ها را Add کنید:

git add hello.py
git commit

در چنین حالتی می توانید بگویید:

git add main.py
git commit --amend --no-edit

بدین صورت این commit جدید با commit قبلی ادغام می شود و دیگر نیازی به ثبت commit جدید نخواهد بود. قسمت no-edit یعنی نمی خواهید پیام commit را تغییر دهید.

هشدار: لطفا به یاد داشته باشید که دستور amend-- فقط برای تصحیح آخرین commit استفاده می شود. اگر می خواهید commit های قبل از آن را ویرایش کنید باید از دستور rebase و ساختار خاص آن استفاده کنید.

برای موارد پیچیده تر که می خواهید تمام پروژه به قبل از commit خاصی برگردد که آخرین commit نیست می توانید از git revert نیز استفاده کنید. این دستور تمام تغییرات یک commit را برگردانده و یک commit جدید می سازد. می توانید با کلیدواژه HEAD به آخرین commit دسترسی داشته باشید:

$ git revert HEAD

برای دیگر commit ها (که آخرین commit نیستند) بهتر است از id خاص خودشان استفاده کنیم:

$ git revert b10cc123

البته استفاده از دستور revert برای این فایل ها ممکن است باعث بروز مشکلاتی هم بشود؛ به طور مثال شما فایلی را در یک commit قدیمی تغییر داده اید اما آن فایل در یک commit جدید تر نیز تغییر کرده است! در این صورت git نمی تواند تشخیص دهد که کدام یک را باید تغییر دهد و کدام خطوط، خطوط درست هستند.

در قسمت بعد برایتان توضیح خواهم داد که در صورت بروز چنین خطایی چه کار می توان کرد.

تمام فصل‌های سری ترتیبی که روکسو برای مطالعه‌ی دروس سری آشنایی با Git توصیه می‌کند:
نویسنده شوید
دیدگاه‌های شما

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.