GIT-ABSORB(1) git absorb GIT-ABSORB(1)
نام (NAME)
git-absorb - ادغام خودکار تغییرات در کامیتهای قبلی متناظر
خلاصه دستور (SYNOPSIS)
git absorb [FLAGS] [OPTIONS]
توضیحات (DESCRIPTION)
شما یک شاخهٔ ویژگی با چند کامیت دارید. همتیمی شما شاخه را بررسی کرده و
چند باگ را مشخص کرده است. شما اصلاحاتی برای این باگها دارید، اما
نمیخواهید همهٔ آنها را در یک کامیت مبهم با پیام «fixes» قرار دهید، زیرا
به کامیتهای اتمیک (atomic commits) باور دارید. به جای یافتن دستی هشهای
SHA کامیتها برای git commit --fixup یا اجرای دستی یک rebase تعاملی، این
کار را انجام دهید:
$ git add $FILES_YOU_FIXED
$ git absorb --and-rebase
(or)
$ git absorb
$ git rebase -i --autosquash master
دستور git absorb بهطور خودکار تشخیص میدهد که کدام کامیتها برای تغییر
ایمن هستند و کدام تغییرات نمایهبندیشده (indexed changes) به هر یک از آن
کامیتها تعلق دارند. سپس برای هر یک از آن تغییرات، کامیتهای fixup!
مینویسد. در صورتی که به آن اطمینان کامل ندارید، میتوانید خروجی آن را
بهصورت دستی بررسی کنید و سپس با قابلیت درونساخت autosquash در گیت،
کامیتهای اصلاحی را در شاخهٔ ویژگی خود ادغام نمایید.
فلگها (FLAGS)
-r, --and-rebase
در صورت موفقیتآمیز بودن، rebase را اجرا میکند. همچنین بخش
REBASE_OPTIONS را در ادامه ببینید.
-n, --dry-run
هیچ تغییر واقعی اعمال نمیکند (اجرای آزمایشی).
--no-limit
محدودیت پشتهٔ جذب (absorb stack) را حذف میکند. در صورت استفاده همراه
با --base بیاثر است.
این گزینه تمام کامیتها را تا رسیدن به کامیت ریشه (root)، کامیت
ادغام (merge) یا کامیتی از نویسندهای دیگر (مگر اینکه از
--force-author استفاده شود) در نظر میگیرد.
به همین دلیل هنگام استفاده از این پرچم باید احتیاط کنید.
--force-author
تولید fixup برای کامیتهایی که توسط شما ایجاد نشدهاند.
--force-detach
تولید fixup حتی زمانی که HEAD روی یک شاخه نیست (وضعیت جداشده یا
detached HEAD).
-F, --one-fixup-per-commit
تنها یک کامیت fixup به ازای هر کامیت تولید میکند.
-f, --force
تمام بررسیهای ایمنی را نادیده میگیرد؛ گویی تمام پرچمهای --force-*
مشخص شدهاند. برای درک اثر کامل استفاده از --force توضیحات آن پرچمها
را مطالعه کنید.
-s, --squash
به جای کامیتهای fixup، کامیتهای squash ایجاد میکند.
هنگامی که این پرچم استفاده میشود، در سراسر این مستندات عبارت «کامیت
fixup» میتواند به صورت «کامیت squash» خوانده شود. تمام تنظیمات
مربوط به کامیتهای fixup در این حالت برای کامیتهای squash اعمال
خواهد شد.
-w, --whole-file
اولین کامیتی را که فایلی یکسان با تکهکد (hunk) جاری را تغییر داده
است مطابقت میدهد. از این گزینه با احتیاط استفاده کنید!
-h, --help
اطلاعات راهنما را چاپ میکند.
-V, --version
اطلاعات نسخه را چاپ میکند.
-v, --verbose
نمایش خروجی با جزئیات بیشتر.
گزینهها (OPTIONS)
-b , --base
استفاده از این کامیت به عنوان پایهٔ پشتهٔ جذب (absorb stack).
-m , --message
یک متن ساده برای بدنهٔ پیام کامیت که برای all (همهٔ) کامیتهای fixup
تولیدشده به کار خواهد رفت.
--gen-completions
تولید تکمیل خودکار برای پوسته [مقادیر ممکن: bash, fish, nushell,
zsh, powershell, elvish]
--
گزینههایی که پس از تولید کامیتها به git rebase ارسال میشوند. باید
آخرین آرگومانها باشند و علامت -- الزاماً باید وجود داشته باشد. تنها
زمانی معتبر است که --and-rebase استفاده شده باشد.
نحوه استفاده (USAGE)
1. تغییراتی را که میخواهید جذب شوند با git add اضافه کنید. بر اساس
طراحی، دستور git absorb تنها محتوای موجود در نمایه (index) گیت را
در نظر میگیرد.
2. دستور git absorb را اجرا کنید. این کار توالیای از کامیتها را روی
HEAD ایجاد میکند. هر کامیت دارای یک پیام fixup! خواهد بود که
نشاندهندهٔ پیام (در صورت یکتا بودن) یا SHA کامیتی است که باید در آن
ادغام (squash) شود.
3. اگر از خروجی رضایت دارید، دستور git rebase -i --autosquash را اجرا
کنید تا کامیتهای fixup! در کامیتهای پیشین خود ادغام شوند. در صورتی
که نیازی به ویرایش پروندهٔ TODO مربوط به rebase ندارید، میتوانید
متغیر محیطی GIT_SEQUENCE_EDITOR را تنظیم کنید.
4. اگر راضی نیستید (یا اگر اتفاق نامطلوبی رخ داده است)، با دستور git
reset --soft PRE_ABSORB_HEAD به کامیت پیش از جذب بازگردید تا وضعیت
پیشین خود را بازیابی کنید. (همچنین میتوانید کامیت مورد نظر را با
دستور git reflog پیدا کنید.) و اگر فکر میکنید git absorb دچار خطا
شده است، لطفاً یک گزارش اشکال (issue) ثبت کنید.
پیکربندی (CONFIGURATION)
اندازه پشته (STACK SIZE)
هنگامی که بدون --base اجرا شود، git-absorb کامیتهای کاندید برای fixup
را تنها درون یک محدودهٔ معین (بهطور پیشفرض ۱۰) جستجو میکند. اگر با خطایی
مشابه زیر روبرو شدید:
WARN stack limit reached, limit: 10
پروندهٔ .gitconfig محلی یا سراسری خود را ویرایش کرده و بخش زیر را اضافه
نمایید:
[absorb]
maxStack=50 # Or any other reasonable value for your project
اندازهٔ پشته همچنین میتواند بهطور موقت برای یک دستور غیرفعال شود (به
--no-limit مراجعه کنید).
یک FIXUP به ازای هر کامیت قابل اصلاح (ONE FIXUP PER FIXABLE COMMIT)
بهطور پیشفرض، git-absorb برای هر تکه کد (hunk) قابل جذب، کامیتهای fixup
جداگانهای تولید میکند. برای اینکه همیشه تنها ۱ کامیت fixup برای تمام
تکههایی که در یک کامیت یکسان جذب میشوند تولید شود، پروندهٔ .gitconfig
محلی یا سراسری خود را ویرایش کرده و بخش زیر را اضافه کنید:
[absorb]
oneFixupPerCommit = true
مرحلهبندی خودکار تمام تغییرات در صورت عدم وجود تغییرات در نمایه (AUTO-STAGE
ALL CHANGES IF NOTHING STAGED)
بهطور پیشفرض، git-absorb تنها پروندههایی را در نظر میگیرد که آنها را با
git add در نمایه (index) مرحلهبندی کرده باشید. با این حال، گاهی فرد
میخواهد عملیات جذب را روی تمامی تغییرات انجام دهد، که نیازمند مرحلهبندی
اولیهٔ آنها با دستور git add . است. برای اجتناب از این مرحلهٔ اضافی،
مقدار زیر را تنظیم کنید:
[absorb]
autoStageIfNothingStaged = true
این تنظیم به git-absorb اعلام میکند که در صورت عدم وجود تغییرات
مرحلهبندیشده، همهٔ تغییرات را بهطور خودکار مرحلهبندی کرده، در صورت امکان
کامیتهای fixup بسازد و مابقی تغییرات را از حالت مرحلهبندی خارج
(unstage) کند.
هدف FIXUP همیشه هش SHA باشد (FIXUP TARGET ALWAYS SHA)
بهطور پیشفرض، git-absorb کامیتهای fixup را طوری میسازد که پیام آنها به
خلاصهٔ پیام کامیت مقصد اشاره داشته باشد و در صورت وجود پیامهای تکراری،
به SHA کامیت مقصد متوسل میشود. در عوض، میتوانید مشخص کنید که همیشه به
SHA کامیت مقصد اشاره کند از طریق:
[absorb]
fixupTargetAlwaysSHA = true
تولید FIXUP برای کامیتهای نوشتهشده توسط دیگران (GENERATE FIXUPS FOR COMMITS
NOT AUTHORED BY YOU)
بهطور پیشفرض، git-absorb تنها برای کامیتهایی که توسط خود شما ثبت شدهاند
کامیت fixup تولید میکند. برای تولید همیشگی fixup برای کامیتهای هر
نویسندهای، پروندهٔ .gitconfig محلی یا سراسری خود را ویرایش نموده و بخش
زیر را اضافه کنید:
[absorb]
forceAuthor = true
تولید FIXUP در وضعیت HEAD جداشده (GENERATE FIXUPS ON DETACHED HEAD)
بهطور پیشفرض، زمانی که HEAD روی یک شاخه نیست (وضعیت «جداشده» یا
detached)، دستور git-absorb اقدام به ساخت کامیتهای fixup نمیکند. برای
تولید همیشگی fixup در وضعیت HEAD جداشده، پروندهٔ .gitconfig محلی یا
سراسری خود را ویرایش کرده و بخش زیر را اضافه کنید:
[absorb]
forceDetach = true
تولید کامیتهای SQUASH به جای FIXUP (GENERATE SQUASH COMMITS INSTEAD OF
FIXUPS)
بهطور پیشفرض، git-absorb کامیتهای fixup ایجاد میکند. برای ایجاد
کامیتهای squash به جای آن، پروندهٔ .gitconfig محلی یا سراسری خود را
ویرایش کرده و بخش زیر را اضافه کنید:
[absorb]
createSquashCommits = true
هنگامی که این گزینه فعال باشد، عبارت «کامیت fixup» در سرتاسر مستندات
میتواند به عنوان «کامیت squash» تلقی شود. تمام پیکربندیهای مربوط به
کامیتهای fixup در این حالت برای کامیتهای squash اعمال خواهد شد.
پروژه گیتهاب (GITHUB PROJECT)
https://github.com/tummychow/git-absorb
نویسنده (AUTHOR)
Stephen Jung
همچنین ببینید (SEE ALSO)
git(1), git-rebase(1), git-commit(1)
git-absorb 03/27/2026 GIT-ABSORB(1)