Sokan Academy

مقایسه ی تغییرات با git diff

مقایسه کردن، عملیاتی است که تفاوت میان دو داده ی ورودی را نشان می دهد. git diff یک دستور با چند کاربرد در git است که با اجرای آن مقایسه ای بین منبع های git انجام می شود. این منبع ها می توانند Commit، شاخه، فایل و... باشند. در این مطلب به استفاده های معمول git diff و شیوه ی کار با آن می پردازیم. دستور git diff معمولا به همراه git status و git log برای بررسی وضعیت فعلی یک مخزن Git استفاده می شود.

خواندن خروجی مقایسه ها

خروجی خام

مثال های پیش رو در یک مخزن ساده اجرا می شوند. مخزن مورد نظر را با دستور های زیر می سازیم.

mkdir diff_test_repo
cd diff_test_repotouch diff_test.txtecho "this is a git diff test example for sokanacademy course" > diff_test.txtgit init .git add diff_test.txtgit commit -am"add diff test file"

اگر git diff را در این مرحله اجرا کنیم، هیچ خروجی ای نخواهد داشت. از آن جایی که هیچ تغییری در مخزن برای مقایسه وجود ندارد، نداشتن خروجی بدیهی است. پس از ایجاد مخزن و اضافه کردن فایل diff_test.txt می توانیم محتوای آن را تغییر دهیم تا خروجی git diff را مشاهده کنیم.

echo "this is a diff example" > diff_test.txt

اجرای این دستور محتویات فایل diff_test.txt را تغییر می دهد. پس از تغییر محتوا می توانیم یک مقایسه انجام دهیم و خروجی را بررسی کنیم. اکنون اجرای دستور git diff خروجی زیر را خواهد داشت.

diff --git a/diff_test.txt b/diff_test.txt

index a9efc53..91f7b12 100644

--- a/diff_test.txt

+++ b/diff_test.txt

@@ -1 +1 @@

-"this is a git diff test example for sokanacademy course"

+"this is a diff example"

اکنون به بررسی دقیق تر خروجی مقایسه می پردازیم.

ورودی مقایسه

diff --git a/diff_test.txt b/diff_test.txt

این خط منابع ورودی مقایسه را نشان می دهد. می توانیم ببینیم که a/diff_test.txt و b/diff_test.txt برای مقایسه به عنوان ورودی داده شده اند.

Meta data

index a9efc53..91f7b12 100644

این خط برخی از Meta data ی درونی Git را نشان می دهد. معمولا به این اطلاعات نیازی پیدا نمی کنیم.

نشانه های تغییر

--- a/diff_test.txt

+++ b/diff_test.txt

این خط ها به هر کدام از ورودی های مقایسه نشانه هایی را می دهند. در این مثال تغییرات a/diff_test.txt با --- و تغییرات b/diff_test.txt با +++ نشانه گذاری شده است.

 بخش های مقایسه

خروجی باقی مانده از مقایسه، لیستی شامل بخش های متفاوت است. git diff تنها بخش هایی از فایل که تغییر کرده است را نشان می دهد. از آنجایی که مثال ما ساده است تنها یک بخش متفاوت دارد. بخش های مقایسه، خروجی خاص خود را دارند.

@@ -1 +1 @@

-"this is a git diff test example for sokanacademy course"

+"this is a diff example"

اولین خط سر برگ، بخش مقایسه است. هر بخش دارای سربرگی است که با نشانه ی @@ در بر گرفته می شود. محتوای این سربرگ خلاصه ای از تغییرات صورت گرفته در فایل است. در مثال ساده ی ما این خلاصه -1 +1 است. به این معنا که خط اول تغییراتی دارد. در یک مقایسه واقعی تر سر برگی مانند زیر خواهید دید:

@@ -34,6 +34,8 @@

در این سربرگ 6 خط از خط شماره 34 به بعد حذف شده است  و 8 خط از خط شماره 34 به بعد اضافه شده.

محتوای باقی مانده از بخش مقایسه، تغییرات اخیر را نشان می دهد. هر خط دارای تغییر با نشانه + یا – در خروجی آورده می شود. همان طور که قبل تر اشاره شد، - تغییر های a/diff_test.txt و + تغییر های b/diff_test.txt را نشان می دهد.

مشخص کردن تغییرات

1-git diff –color-words

git diff یک حالت ویژه برای مشخص کردن تغییرات با جزئیات بیشتر دارد: --color-words. این حالت خط های اضافه شده و حذف شده را بر اساس فاصله، بخش بندی می کند و سپس بین آن ها مقایسه انجام می دهد.

diff --git a/diff_test.txt b/diff_test.txt

index a9efc53..91f7b12 100644

--- a/diff_test.txt

+++ b/diff_test.txt

@@ -1 +1 @@

"this is agit diff test example for sokanacademy course"example"

اکنون خروجی شامل کلمه های رنگ شده ای است که تغییر کرده اند.

2-git diff-highlight

اگر source گیت را clone کنید یک پوشه به نام contrib پیدا خواهید کرد. این پوشه چند ابزار مرتبط با git و بخش های جالبی که هنوز به هسته ی git اضافه نشده اند را در خود نگه می دارد. یکی از آن ها اسکریپتی به زبان Perl با نام diff-highlight است. این اسکریپت خط های مطابق خروجی مقایسه را با یک دیگر جفت می کند و بخش هایی از هر کلمه که تغییر کرده است را مشخص می کند. در صورتی که source گیت را در سیستم خود دارید می توانید با دستور زیر این مقایسه را انجام دهید.

git diff | /your/local/path/to/git-core/contrib/diff-highlight/diff-highlight

diff --git a/diff_test.txt b/diff_test.txt

اکنون عملیات مقایسه به کوچک ترین تغییر ممکن تجزیه شده است.

مقایسه ی فایل ها: git diff file

به دستور git diff می توان مسیر فایل را به صورت آشکار به عنوان ورودی داد تا عملیات مقایسه ی گیت تنها به فایل مشخص شده محدود شود. مثال زیر این مورد را نشان می دهد.

git diff HEAD ./path/to/file

این مثال به مسیر   ./path/to/file محدود شده است. به طور پیش فرض گیت مقایسه را نسبت به HEAD انجام می دهد و ننوشتن HEAD در مثال بالا نتیجه یکسانی خواهد داشت.

git diff --cached ./path/to/file

هنگامی که git diff با گزینه –cached اجرا می شود، بین تغییرات stage شده و مخزن local، مقایسه انجام می شود. گزینه –cached با –staged تفاوتی ندارند.

مقایسه ی تمام تغییرات

اجرای git diff بدون مسیر فایل، تغییرات را در تمام مخزن مقایسه می کند. مثال های بالا که مسیر خاصی داشتند می توانستند همان نتیجه را برای تمام فایل های مخزن نشان بدهند.

تغییرات نسبت به آخرین commit

به طور پیش فرض git diff ، Commit نشده ای را نسبت به آخرین Commit نشان می دهد.

git diff

مقایسه ی فایل ها بین دو Commit

می توانیم به دستور git diff مرجع های Git را برای مقایسه بدهیم. برخی مرجع ها عبارت اند از HEAD، تگ ها و نام شاخه ها. هر Commit در Git یک شناسه دارد که می توان آن را با دستور git log دریافت کرد. شناسه ی Commit ها را هم می توان به دستور git diff داد.

git log --pretty=onelinefbda0989a6fcd012e784a57e8ecaa5ddaaac8278 (HEAD -> master) add diff test filegit diff fbda0989a6fcd012e784a57e8ecaa5ddaaac8278

مقایسه ی شاخه ها

مقایسه ی دو شاخه

شاخه ها مانند سایر مرجع ها به عنوان ورودی به دستور git diff داده می شوند.

git diff branch1..other-feature-branch

این مثال عملگر نقطه را معرفی می کند. دو نقطه در این مثال نشان می دهد که ورودی مقایسه، head هر دو شاخه است. در صورتی که به جای نقطه ها یک فاصله قرار دهیم، همان نتیجه را خواهد داشت.

یک عملگر سه نقطه هم وجود دارد:

git diff branch1...other-feature-branch

عملگر سه نقطه مقایسه را با تغییر اولین ورودی (branch1) انجام می دهد. در مثال ما این عملگر brach1 را به مرجع مشترک دو شاخه داده شده تغییر می دهد. مقایسه همچنان بین head شاخه ها اتفاق می افتد.

مقایسه ی فایل ها در دو شاخه

برای مقایسه ی یک فایل خاص بین شاخه ها، مسیر فایل را به عنوان سومین ورودی به دستور git diff  بدهید.

git diff master new_branch ./diff_test.txt

خلاصه

در این بخش فرایند مقایسه در Git و دستور git diff توضیح داده شد. در مورد چگونگی خواندن خروجی git diff و داده های مختلفی که در خروجی به ما می دهد صحبت شد و مثال هایی برای تغییر خروجی این دستور آورده شد. همچنین استراتژی های مختلف مقایسه مانند مقایسه بین فایل ها، شاخه ها و Commit ها نیز مطرح شد. علاوه بر این از دستور git log هم استفاده کردیم.

gitکنترل نسخهکنترل پروژهگیت‌لبگیت

sokan-academy-footer-logo
کلیه حقوق مادی و معنوی این وب‌سایت متعلق به سکان آکادمی می باشد.