خلاصه: چشم‌پوشی و ignore یه سری فایل‌ها با قرار دادنشون در فایلِ gitignore.

البته برای اینکه این فایل ignore بشه و تغییراتش ردیابی نشه علاوه بر وجود در فایلِ gitignore. باید در staging area هم نباشه. برای اینکه فایل رو فقط از staging area پاکش کنیم (و نه از working dir) از دستورِ rm با آپشن‌هایِ زیر استفاده می‌کنیم.

git rm --cached -r bin/

تقریباً در هر پروژه ای ما باید به گیت بگیم که یک سری فایل‌ها و مسیرهای مشخص رو چشم‌پوشی کنه. برای مثال نمی‌خواهیم فایل‌هایِ log یا باینری که به عنوان نتیجه کامپایل کدمون هست رو شامل کنیم. چون افزودن این فایل‌ها فقط سایزِ ریپومون رو بدون هیچ امتیازِ مثبتی زیاد می‌کنه.

هر توسعه‌دهنده‌ای می‌تونه فایل‌هایِ log خودش رو داشته باشه درسته؟ لاگ فایل‌ها فایل‌هایی نیستن که بخوایم به اشتراک بذاریم و با بقیه اعضا سینک کنیم. برای این نمونه بیاین ی مسیر به نام logs بسازیم و بعدش ی فایل log اینجا داشته باشیم.

mkdir logs

دوباره، میتونیم از دستور echo برای نوشتن hello در logs/dev.log استفاده کنیم.

echo hello > logs/dew.log

حالا بیاین git status رو اجرا کنیم.

On branch master
Untracked files:
	(use "git add <file>..." to include in what will be committed)
		logs/

	nothing added to commit but untracked files present (use "git add" to track)

خب گیت میگه که یک فایل ناشناس در مسیر logs داریم. اما ما نمی‌خوایم که این رو به Staging area اضافه کنیم چون نمیخوایم این رو شناسایی و ردیابی کنه. پس برای جلوگیری از این ما باید یک فایلِ مخصوص به نام gitignore. بسازیم. این فایل هیچ نامی نداره و فقط یک پسوند داره و باید تو مسیر اصلی پروژتون باشه.

echo logs/ > .gitignore

بیاین حالا این فایل رو با وی‌اس‌کد باز کنیم (code .gitignore)

در این فایل یک نوشته یک خطی داریم /logs که نمایانگر یه مسیره. می‌تونیم هر چقدر که می‌خوایم فايل و مسیر اینجا لیست کنیم.

logs/
main.log
*.log

اگر git status روی بار دیگه اجرا کنین دیگه نمیگه یه مسیر جدید به نام logs داریم چون داره ازش چشم پوشی می‌کنه در عوض می‌گه که یک فایل جدید به نام gitignore داریم.

On branch master
Untracked files:
	(use "git add <file>..." to include in what will be committed)
		.gitignore

nothing added to commit but untracked files present (use "git add" to track)

خب بیاین این رو به staging area اضافه کنیم و بعدش کدمون رو کامیت کنیم.

خب add gitignore و اینجوری متیونیم از یه سری فایل‌ها و مسیر‌ها در گیت چشم‌پوشی کنیم.

git add .gitignore
git commit -m "Add gitignore"

فقط یادتون باشه که اگر تصادفاً یک فایل رو در ریپوتون اضافه کردین و بعدش gitignore رو اضافه کردین اون فایل رو ignore نخواهد کرد.

mkdir bin

تصور کنین که مسیر بالا شامل سورس کدِ کامپایل‌شده‌ی ماست. با کمک دستور echo عبارتِ hello در داخل bin/app.bin مینوسیم

echo hello > bin/app.bin

و حالا git status

On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
	bin/

nothing added to commit but untracked files present (use "git add" to track)

این رو به ریپومون کامیت کنیم.

git add .
git commit —m "Add bin."

بعدش میایم به کدمون. مشکل اینجاست هر موقع که کدمون رو کامپایل میکنیم گیت میگه که این فایل bin/app.bin تغییر داشته. پس چرا باید هر سری که برناممون رو کامپایل می‌کنیم این فایل رو commit کنیم.

برمیگردیم سراغ gitignore. و مسیر /bin رو هم اضافه کنیم.

برگردیم به ترمینال. بیاین دستور git status رو اجرا کنیم.

modified: .gitignore

خب ما gitignore. رو به صورت modified داریم. زیباست. حال بیاین این تغییر رو کامیت کنیم.

git add .
git commit —m "Include bin/ in gitignore."

حال در این مورد گیت این مسیر رو شناسایی و ردیابی کرده پس بیاین فایل bin رو با کدِ زیر تغییر بدیم.

echo helloworld > bin/app.bin

دستورِ git status رو می‌زنیم.

On branch master
Changes not staged for commit:
	(use "git add <file>..." to update what will be committed)
	(use "git restore <file>..." to discard changes in working directorY) 
		modified: bin/app.bin

no changes added to commit (use "git add" and/or "git commit —a")

گیت می‌گه که این فایل تغییر داده شده. این چیزی نیست که ما می‌خوایم. برای رفع این مشکل ما باید این فایل رو از Staging area پاک کنیم.

خب قبل‌تر درباره git ls-files صحبت کردیم می‌تونین ببینین مسیر یا فایل bin داخلِ staging area هست باید از اینجا پاکش کنیم. چطوری؟

git ls-files
.gitignore
bin/app.bin
file1.js

خب قبلاً راجع به دستور rm صحبت کردیم. بهتون گفتم که با این دستور می‌تونیم یک فایل و یا مسیر رو هم از مسیر کاری‌مون و هم از Staging area پاک کنیم. ولی می‌خوایم که این فایل رو فقط از Staging area پاک کنیم. چطوری؟

git rm --cached bin/

ولی با اجرایِ دستورِ بالا با خطایِ زیر مواجه می‌شیم.

fatal: not removing 'bin/' recursively without -r

چون می‌خواهیم کل مسیر bin رو از staging area پاک کنیم از دستورِ زیر استفاده می‌کنیم.

git rm --cached -r bin/

حالا کلِ مسیر /bin از staging area پاک شده. اگه git status کنیم خروجیِ زیر خواهیم داشت.

On branch master
Changes to be committed:
	(use "git restore ——staged <file>..." to unstage)
		deleted: bin/app bin

این تغییر رو کامیت می‌کنیم.

git commit —m "Remove the bin directory that was accidentally commited."

اوکی. از اینجا به بعد دیگه گیت قرار نیست تغییرات مسیرِ /bin رو ردیابی کنه.

در این آدرس می‌تونید فایل‌هایِ gitignore. رو برای زبان‌هایِ برنامه‌نویسیِ مختلف پیدا کنید.