| GIT-PULL(1) | دستورات عمومی کاربر | GIT-PULL(1) |
نام (NAME)
git-pull - دریافت و ادغام تغییرات از یک مخزن دیگر یا یک شاخه محلی
خلاصه دستور (SYNOPSIS)
git pull [<options>] [<repository> [<refspec>...]]
توضیحات (DESCRIPTION)
تغییرات را از یک مخزن دوردست در شاخه فعلی ادغام میکند.
ابتدا، git pull دستور git fetch را با همان آرگومانها (بهجز گزینههای ادغام) برای واکشی شاخه(های) دوردست اجرا میکند. سپس تصمیم میگیرد که کدام شاخه دوردست را ادغام کند: اگر git pull را بدون هیچ آرگومانی اجرا کنید، این مورد بهطور پیشفرض شاخه بالادست (upstream) برای شاخه فعلی خواهد بود. سپس آن شاخه را در شاخه فعلی ادغام میکند.
برای ادغام شاخه دوردست، ۴ گزینه اصلی وجود دارد:
همچنین میتوانید گزینههای پیکربندی pull.rebase، pull.squash یا pull.ff را با رفتار مورد نظر خود تنظیم کنید.
اگر در طول ادغام یا ریبیس با یک تداخل ادغام مواجه شدید که نمیخواهید آن را مدیریت کنید، میتوانید با خیال راحت آن را با git merge --abort یا git rebase --abort لغو کنید.
گزینهها (OPTIONS)
<repository>
پیشفرض آن بالادست پیکربندیشده برای شاخه کنونی، یا origin است. برای اطلاعات بیشتر در مورد نحوه پیکربندی بالادستها، بخش UPSTREAM BRANCHES در زیر را ببینید.
<refspec>
این میتواند یک شاخه، تگ یا مجموعه دیگری از ارجاع(ها) باشد. برای نحو کامل، <refspec> در زیر تحت عنوان «گزینههای مربوط به واکشی» را ببینید، و برای نحوه استفاده git pull از این آرگومان جهت تعیین شاخه دوردستی که باید ادغام شود، بخش DEFAULT BEHAVIOUR در زیر را مشاهده کنید.
-q, --quiet
-v, --verbose
--recurse-submodules[=(yes|on-demand|no)], --no-recurse-submodules
اگر بررسی و تحویل (checkout) از طریق ریبیس انجام شود، کامیتهای محلی زیرماژول نیز ریبیس میشوند.
اگر بهروزرسانی از طریق ادغام انجام شود، تداخلهای زیرماژول حل و دریافت (checked out) میشوند.
گزینههای مربوط به ادغام (Options related to merging)
--commit, --no-commit
با --no-commit ادغام را انجام داده و درست پیش از ایجاد کامیت ادغام متوقف میشود، تا به کاربر فرصت بازبینی و تغییر بیشتر نتیجه ادغام پیش از کامیت کردن داده شود.
توجه داشته باشید که بهروزرسانیهای فستفوروارد کامیت ادغام ایجاد نمیکنند و بنابراین راهی برای متوقف کردن آن ادغامها با --no-commit وجود ندارد. از این رو، اگر میخواهید مطمئن شوید که شاخه شما توسط دستور ادغام تغییر یا بهروزرسانی نمیشود، از --no-ff همراه با --no-commit استفاده کنید.
--edit, -e, --no-edit
اسکریپتهای قدیمیتر ممکن است به رفتار تاریخی عدم اجازه به کاربر برای ویرایش پیام لاگ ادغام وابسته باشند. آنها هنگام اجرای git merge باز شدن یک ویرایشگر را خواهند دید. برای آسانتر کردن تطبیق چنین اسکریپتهایی با رفتار بهروزرسانیشده، متغیر محیطی GIT_MERGE_AUTOEDIT میتواند در ابتدای آنها روی no تنظیم شود.
--cleanup=<mode>
--ff-only
--ff, --no-ff
با --ff، در صورت امکان ادغام را بهصورت فستفوروارد حل میکند (تنها اشارهگر شاخه را مطابق با شاخه ادغامشده بهروزرسانی میکند؛ کامیت ادغام ایجاد نمیکند). در صورت عدم امکان (زمانی که تاریخچه ادغامشده از نوادگان تاریخچه کنونی نباشد)، یک کامیت ادغام ایجاد میکند.
با --no-ff، در تمام موارد یک کامیت ادغام ایجاد میکند، حتی زمانی که ادغام میتوانست بهصورت فستفوروارد حل شود.
-S[<key-id>], --gpg-sign[=<key-id>], --no-gpg-sign
--log[=<n>], --no-log
با --no-log توضیحات یکخطی کامیتهای واقعی در حال ادغام را فهرست نمیکند.
--signoff, --no-signoff
گزینه --no-signoff میتواند برای باطل کردن گزینه قبلی --signoff در خط فرمان استفاده شود.
گیت یک متغیر پیکربندی برای فعال کردن گزینه خط فرمان --signoff به صورت پیشفرض ندارد (و نخواهد داشت)؛ برای جزئیات بیشتر ورودی commit.signoff را در gitfaq(7) ببینید.
--stat, -n, --no-stat
با -n یا --no-stat در پایان ادغام diffstat نشان داده نمیشود.
--compact-summary
--squash, --no-squash
با --no-squash ادغام را انجام داده و نتیجه را کامیت میکند. از این گزینه میتوان برای لغو --squash استفاده کرد.
با --squash، استفاده از --commit مجاز نبوده و ناموفق خواهد بود.
فقط هنگام ادغام کاربرد دارد.
--verify, --no-verify
-s <strategy>, --strategy=<strategy>
-X <option>, --strategy-option=<option>
--verify-signatures, --no-verify-signatures
فقط هنگام ادغام کاربرد دارد.
--summary, --no-summary
--autostash, --no-autostash
--allow-unrelated-histories
فقط هنگام ادغام کاربرد دارد.
-r, --rebase[=(true|merges|false|interactive)]
true
merges
false
interactive
اگر میخواهید کاری کنید که git pull همواره به جای ادغام از --rebase استفاده کند، pull.rebase، branch.<name>.rebase و branch.autoSetupRebase را در git-config(1) ببینید.
نکته
این یک حالت عملیاتی بالقوه خطرناک است. این حالت تاریخچه را بازنویسی میکند، که در صورت انتشار قبلی آن تاریخچه اصلاً خوشایند نخواهد بود. از این گزینه استفاده نکنید مگر اینکه git-rebase(1) را با دقت مطالعه کرده باشید.
--no-rebase
گزینههای مربوط به واکشی (Options related to fetching)
--all, --no-all
-a, --append
--atomic
--depth=<depth>
--deepen=<depth>
--shallow-since=<date>
--shallow-exclude=<ref>
--unshallow
اگر مخزن مبدأ کمعمق باشد، تا حد امکان دادهها را واکشی میکند تا مخزن فعلی همان تاریخچه مخزن مبدأ را داشته باشد.
--update-shallow
--negotiation-restrict=(<commit>|<glob>), --negotiation-tip=(<commit>|<glob>)
--negotiation-restrict نام ترجیحی برای این گزینه است؛ --negotiation-tip بهعنوان یک مترادف پذیرفته میشود.
این گزینه ممکن است بیش از یک بار مشخص شود؛ در این صورت، گیت کامیتهای قابل دسترس از هر یک از کامیتهای دادهشده را گزارش خواهد داد.
آرگومان این گزینه میتواند یک الگوی جستجو (glob) روی نام مراجع، یک مشخصه مرجع یا SHA-1 (احتمالاً کوتاهشده) یک کامیت باشد. مشخص کردن یک الگو معادل تعیین این گزینه به دفعات متعدد است، یکی به ازای هر نام مرجع منطبق.
همچنین متغیرهای پیکربندی fetch.negotiationAlgorithm و push.negotiate مستندشده در git-config(1)، و گزینه --negotiate-only در زیر را ببینید.
--negotiation-include=(<commit>|<glob>)
این گزینه ممکن است بیش از یک بار مشخص شود؛ در این صورت، هر کامیت بدون قید و شرط ارسال میشود.
آرگومان میتواند یک نام دقیق مرجع (مانند refs/heads/release)، یک هش شیء یا یک الگوی glob (مانند refs/heads/release/{asterisk}) باشد. نحو الگو مانند --negotiation-restrict است.
اگر --negotiation-restrict استفاده شود، مجموعه have ابتدا توسط آن گزینه محدود شده و سپس گسترش مییابد تا شامل نوکهای مشخصشده با --negotiation-include شود.
اگر این گزینه در خط فرمان مشخص نشده باشد، هرگونه مقادیر پیکربندی remote.<name>.negotiationInclude برای مخزن دوردست فعلی به جای آن استفاده میشود.
--negotiate-only
این گزینه با --recurse-submodules=(yes|on-demand) ناسازگار است. در داخل گیت، از این گزینه برای پیادهسازی گزینه push.negotiate استفاده میشود، نگاه کنید به git-config(1).
--dry-run
--porcelain
این گزینه با --recurse-submodules=(yes|on-demand) ناسازگار است و بر گزینه پیکربندی fetch.output اولویت دارد.
--filter=<filter-spec>
اگر --filter=auto استفاده شود، مشخصات فیلتر بهطور خودکار با ترکیب مشخصات فیلتر اعلامشده توسط سرور برای مخازن دوردست ضامن (promisor remotes) که کلاینت میپذیرد تعیین میشود (نگاه کنید به gitprotocol-v2(5) و گزینه پیکربندی promisor.acceptFromServer در git-config(1)).
برای جزئیات مربوط به تمام مشخصات فیلتر موجود دیگر، گزینه --filter=<filter-spec> در git-rev-list(1) را ببینید.
برای نمونه، --filter=blob:none تمام blobها (محتویات فایلها) را تا زمانی که گیت به آنها نیاز پیدا کند فیلتر میکند. همچنین، --filter=blob:limit=<size> تمام blobهای با اندازه دستکم <size> را فیلتر میکند.
-f, --force
-k, --keep
--prefetch
-p, --prune
--no-tags
--refmap=<refspec>
-t, --tags
-j <n>, --jobs=<n>
مقدار 0 از یک پیشفرض معقول استفاده خواهد کرد.
اگر گزینه --multiple مشخص شده باشد، مخازن دوردست مختلف بهطور موازی واکشی خواهند شد. اگر چندین زیرماژول واکشی شوند، آنها نیز بهطور موازی واکشی خواهند شد. برای کنترل مستقل آنها، از تنظیمات پیکربندی fetch.parallel و submodule.fetchJobs استفاده کنید (نگاه کنید به git-config(1)).
بهطور معمول، واکشیهای بازگشتی موازی و چندمخزنه سریعتر خواهند بود. بهطور پیشفرض واکشیها بهصورت متوالی و نه موازی انجام میشوند.
--set-upstream
--upload-pack <upload-pack>
--progress
-o <option>, --server-option=<option>
--show-forced-updates
--no-show-forced-updates
-4, --ipv4
-6, --ipv6
<repository>
<refspec>
قالب یک پارامتر <refspec> بهصورت یک علامت مثبت اختیاری +، بهدنبال آن منبع <src>، بهدنبال آن یک دو نقطه :، و بهدنبال آن مقصد <dst> است. زمانی که <dst> خالی باشد میتوان از دو نقطه صرفنظر کرد. <src> معمولاً یک مرجع (ref) یا یک الگوی سراسری (glob) با یک * منفرد است که برای تطبیق مجموعهای از مراجع استفاده میشود، اما میتواند یک نام شیء هگزادسیمال کاملاً نوشتهشده نیز باشد.
یک <refspec> میتواند حاوی یک * در <src> خود باشد تا تطبیق الگوی ساده را نشان دهد. چنین مشخصه مرجعی مانند یک glob عمل میکند که با هر مرجع دارای آن الگو مطابقت دارد. یک <refspec> الگویی باید دقیقاً یک * در هر دو بخش <src> و <dst> داشته باشد. این الگو با جایگزین کردن * با محتوای تطبیقیافته از منبع، مراجع را به مقصد نگاشت میکند.
اگر پیشوند ^ به یک refspec اضافه شود، بهعنوان یک refspec منفی تفسیر میشود. چنین refspecی بهجای تعیین اینکه کدام مراجع باید واکشی شوند یا کدام مراجع محلی باید بهروزرسانی گردند، مراجع مورد نظر برای مستثنی شدن را مشخص میکند. یک مرجع در صورتی منطبق در نظر گرفته میشود که حداقل با یک refspec مثبت مطابقت داشته باشد و با هیچ refspec منفی مطابقت نداشته باشد. مشخصههای مرجع منفی میتوانند برای محدود کردن دامنه یک refspec الگویی مفید باشند تا شامل مراجع خاصی نشود. خود refspecهای منفی نیز میتوانند refspecهای الگویی باشند. با این حال، آنها فقط میتوانند شامل یک <src> باشند و مقصدی (<dst>) مشخص نمیکنند. همچنین نامهای شیء هگزادسیمال کامل پشتیبانی نمیشوند.
عبارت tag <tag> همانند refs/tags/<tag>:refs/tags/<tag> است؛ این دستور درخواست واکشی همهچیز تا برچسب دادهشده را دارد.
مرجع دوردستی که با <src> مطابقت دارد واکشی میشود، و اگر <dst> یک رشته خالی نباشد، تلاشی برای بهروزرسانی مرجع محلی منطبق با آن انجام میگیرد.
اینکه آیا این بهروزرسانی بدون گزینه --force مجاز است یا خیر، به فضای نام مرجعی که به آن واکشی میشود، نوع شیء در حال واکشی، و اینکه آیا بهروزرسانی یک فستفوروارد محسوب میشود یا خیر بستگی دارد. بهطور کلی، همان قوانینی که برای push اعمال میشوند در واکشی نیز برقرارند؛ برای مشاهده این قوانین، به بخش <refspec>... در git-push(1) مراجعه کنید. استثنائات این قوانین که مختص git fetch هستند در زیر ذکر شدهاند.
تا نسخه ۲.۲۰ گیت، و برخلاف ارسال با git-push(1)، هرگونه بهروزرسانی در refs/tags/* بدون علامت + در refspec (یا --force) پذیرفته میشد. هنگام واکشی، ما تمام بهروزرسانیهای برچسب از مخزن دوردست را بدون تفکیک بهعنوان واکشیهای اجباری در نظر میگرفتیم. از نسخه ۲.۲۰ گیت، واکشی برای بهروزرسانی refs/tags/* به همان روش ارسال کار میکند. یعنی هرگونه بهروزرسانی بدون + در refspec (یا --force) رد خواهد شد.
برخلاف ارسال با git-push(1)، هرگونه بهروزرسانی خارج از refs/{tags,heads}/* بدون + در refspec (یا --force) پذیرفته میشود؛ خواه این کار مثلاً جابجایی یک شیء درخت با یک blob باشد، یا جابجایی یک کامیت با کامیت دیگری که کامیت قبلی را بهعنوان والد خود ندارد، و غیره.
برخلاف ارسال با git-push(1)، هیچ پیکربندیای برای تغییر این قوانین وجود ندارد، و هیچ چیزی شبیه به قلاب pre-fetch مشابه قلاب pre-receive وجود ندارد.
همانند ارسال با git-push(1)، تمام قوانین ذکرشده در بالا در مورد مواردی که بهعنوان بهروزرسانی مجاز نیستند، میتوانند با افزودن یک + اختیاری در ابتدای یک refspec (یا استفاده از گزینه خط فرمان --force) لغو شوند. تنها استثنا این است که هیچ مقداری از اجبار باعث نمیشود که فضای نام refs/heads/* یک شیء غیرکامیت را بپذیرد.
نکته
هنگامی که مشخص است شاخه دوردستی که میخواهید واکشی کنید بهطور منظم بازپیچی (rewind) و ریبیس میشود، انتظار میرود که سرشاخه جدید آن از سرشاخه قبلی آن (همانطور که در آخرین باری که واکشی کردید در شاخه ردگیری دوردست شما ذخیره شده بود) منشعب نشده باشد. در چنین شاخههایی بهتر است از علامت + استفاده کنید تا نشان دهید که برای آنها بهروزرسانیهای غیرفستفوروارد لازم خواهد بود. هیچ راهی برای تشخیص یا اعلام اینکه شاخهای در یک مخزن با این رفتار در دسترس قرار خواهد گرفت وجود ندارد؛ کاربر دریافتکننده صرفاً باید بداند که این الگوی استفاده مورد انتظار برای آن شاخه است.
نکته
تفاوتی وجود دارد میان فهرست کردن چندین <refspec> بهطور مستقیم در خط فرمان git pull و داشتن چندین مدخل remote.<repository>.fetch در پیکربندی شما برای یک <repository> و اجرای یک دستور git pull بدون هیچ پارامتر صریح <refspec>. موارد <refspec> که بهصورت صریح در خط فرمان فهرست شدهاند، همیشه پس از واکشی در شاخه جاری ادغام میشوند. به عبارت دیگر، اگر بیش از یک مرجع دوردست را فهرست کنید، git pull یک ادغام هشتپا (Octopus merge) ایجاد خواهد کرد. از سوی دیگر، اگر هیچ پارامتر صریح <refspec> در خط فرمان فهرست نکنید، git pull تمام <refspec>هایی را که در پیکربندی remote.<repository>.fetch مییابد واکشی میکند و فقط اولین <refspec> یافتشده را در شاخه جاری ادغام مینماید. دلیل این امر این است که ایجاد یک ادغام Octopus از مراجع دوردست بهندرت انجام میشود، در حالی که ردیابی چندین سرشاخه دوردست بهصورت یکجا با واکشی بیش از یک مرجع معمولاً مفید است.
بهطور کلی، نشانیها (URL) حاوی اطلاعاتی درباره پروتکل انتقال، نشانی سرور دوردست و مسیر مخزن هستند. بسته به پروتکل انتقال، ممکن است برخی از این اطلاعات وجود نداشته باشند.
گیت از پروتکلهای ssh، git، http و https پشتیبانی میکند (علاوه بر این، ftp و ftps میتوانند برای واکشی استفاده شوند، اما این کار ناکارآمد و منسوخ است؛ از آنها استفاده نکنید).
انتقال بومی (یعنی نشانی git://) هیچگونه احراز هویتی انجام نمیدهد و باید در شبکههای ناامن با احتیاط استفاده شود.
قالبهای ساختاری زیر میتوانند با آنها استفاده شوند:
همچنین میتوان یک نحو جایگزین شبیه scp را با پروتکل ssh استفاده کرد:
این نحو تنها در صورتی تشخیص داده میشود که هیچ اسلشی قبل از اولین دونقطه نباشد. این امر به تمایز مسیر محلی که حاوی دونقطه است کمک میکند. برای نمونه، مسیر محلی foo:bar میتواند بهصورت یک مسیر مطلق یا ./foo:bar مشخص شود تا از تفسیر نادرست آن بهعنوان یک نشانی ssh جلوگیری شود.
پروتکلهای ssh و git علاوه بر این از بسط ~<username> پشتیبانی میکنند:
برای مخازن محلی، که بهطور بومی توسط گیت نیز پشتیبانی میشوند، میتوان از نحوهای زیر استفاده کرد:
این دو نحو عمدتاً معادل هستند، به جز هنگام کلون کردن که اولی متضمن گزینه --local است. برای جزئیات به git-clone(1) مراجعه کنید.
دستورهای git clone، git fetch و git pull (اما نه git push) یک فایل باندل مناسب را نیز میپذیرند. به git-bundle(1) مراجعه کنید.
هنگامی که گیت روش کار با یک پروتکل انتقال معین را نمیداند، تلاش میکند از دستیار دوردست remote-<transport> در صورت وجود استفاده کند. برای درخواست صریح یک دستیار دوردست، میتوان از نحو زیر استفاده کرد:
که در آن <address> میتواند یک مسیر، یک سرور و مسیر، یا یک رشته دلخواه شبیه نشانی باشد که توسط دستیار دوردست مربوطه فراخوانیشده شناسایی میشود. برای جزئیات به gitremote-helpers(7) مراجعه کنید.
اگر تعداد زیادی مخزن دوردست با نامهای مشابه وجود دارد و میخواهید قالب متفاوتی برای آنها استفاده کنید (به گونهای که نشانیهای مورداستفاده شما به نشانیهایی که کار میکنند بازنویسی شوند)، میتوانید یک بخش پیکربندی به این شکل بسازید:
[url "<actual-url-base>"]
insteadOf = <other-url-base>
برای نمونه، با این تنظیم:
[url "git://git.host.xz/"]
insteadOf = host.xz:/path/to/
insteadOf = work:
یک نشانی مانند "work:repo.git" یا مانند "host.xz:/path/to/repo.git" در هر زمینهای که یک نشانی میپذیرد به "git://git.host.xz/repo.git" بازنویسی خواهد شد.
اگر میخواهید نشانیها را فقط برای ارسال (push) بازنویسی کنید، میتوانید یک بخش پیکربندی به این شکل بسازید:
[url "<actual-url-base>"]
pushInsteadOf = <other-url-base>
برای نمونه، با این تنظیم:
[url "ssh://example.org/"]
pushInsteadOf = git://example.org/
یک نشانی مانند "git://example.org/path/to/repo.git" برای ارسالها به "ssh://example.org/path/to/repo.git" بازنویسی میشود، اما دریافتها (pull) همچنان از نشانی اصلی استفاده خواهند کرد..SH "مخازن دوردست (REMOTES)"
میتوان از نام یکی از موارد زیر بهجای نشانی (URL) بهعنوان آرگومان <repository> استفاده کرد:
تمامی این موارد همچنین به شما امکان میدهند که مشخصه مرجع (refspec) را از خط فرمان حذف کنید زیرا هر یک شامل یک refspec هستند که گیت بهطور پیشفرض از آن استفاده خواهد کرد.
مخزن نامگذاریشده در فایل پیکربندی (Named remote in configuration file)
میتوانید نام مخزن دوردستی را ارائه دهید که پیشتر با استفاده از git-remote(1)، git-config(1) یا حتی با ویرایش دستی فایل $GIT_DIR/config پیکربندی کردهاید. نشانی (URL) این مخزن دوردست برای دسترسی به مخزن استفاده خواهد شد. هنگامی که یک مشخصه مرجع (refspec) در خط فرمان ارائه ندهید، refspec این مخزن دوردست بهطور پیشفرض استفاده میشود. مدخل موجود در فایل پیکربندی به این شکل خواهد بود:
[remote "<name>"]
url = <URL>
pushurl = <pushurl>
push = <refspec>
fetch = <refspec>
شناسه <pushurl> فقط برای ارسالها (push) استفاده میشود. این شناسه اختیاری است و پیشفرض آن <URL> است. ارسال به یک مخزن دوردست بر روی تمامی pushurlهای تعریفشده، یا در صورت تعریف نشدن pushurl، بر روی تمامی urlهای تعریفشده اعمال میشود. با این حال، در صورت تعریف چندین url، عملیات واکشی (fetch) فقط از اولین url تعریفشده واکشی میکند.
فایل نامگذاریشده در $GIT_DIR/remotes (Named file in $GIT_DIR/remotes)
میتوانید نام فایلی را در $GIT_DIR/remotes ارائه دهید. نشانی موجود در این فایل برای دسترسی به مخزن استفاده خواهد شد. هنگامی که در خط فرمان refspec ارائه ندهید، refspec موجود در این فایل بهعنوان پیشفرض استفاده خواهد شد. این فایل باید دارای قالب زیر باشد:
URL: one of the above URL formats Push: <refspec> Pull: <refspec>
خطوط Push: توسط git push و خطوط Pull: توسط git pull و git fetch استفاده میشوند. برای نگاشت شاخههای اضافی میتوان چندین خط Push: و Pull: مشخص کرد.
فایل نامگذاریشده در $GIT_DIR/branches (Named file in $GIT_DIR/branches)
میتوانید نام فایلی را در $GIT_DIR/branches ارائه دهید. نشانی موجود در این فایل برای دسترسی به مخزن استفاده خواهد شد. این فایل باید دارای قالب زیر باشد:
<URL>#<head>
شناسه <URL> الزامی است؛ #<head> اختیاری است.
بسته به نوع عملیات، اگر refspecی در خط فرمان ارائه ندهید، گیت از یکی از refspecهای زیر استفاده میکند. عبارت <branch> نام این فایل در $GIT_DIR/branches است و <head> بهطور پیشفرض برابر master است.
دستور git fetch استفاده میکند از:
refs/heads/<head>:refs/heads/<branch>
دستور git push استفاده میکند از:
HEAD:refs/heads/<head>
شاخههای بالادست (UPSTREAM BRANCHES)
شاخهها در گیت میتوانند بهصورت اختیاری یک شاخه دوردست بالادست داشته باشند. گیت بهطور پیشفرض از شاخه بالادست برای عملیاتهای راه دور استفاده میکند، برای نمونه:
اطلاعات بالادست در .git/config، در فیلدهای "remote" و "merge" ذخیره میشود. برای نمونه، اگر شاخه بالادست main برابر با origin/main باشد:
[branch "main"] remote = origin merge = refs/heads/main
میتوانید با دستور git push --set-upstream <remote> <branch> یک شاخه بالادست را بهطور صریح تنظیم کنید، اما گیت اغلب بالادست را بهطور خودکار برای شما تنظیم میکند، برای نمونه:
نکته
از شاخههای بالادست گاهی با عنوان «اطلاعات ردگیری» (tracking information) یاد میشود، مانند "تنظیم اطلاعات ردگیری شاخه".
سازوکار ادغام (دستورات git merge و git pull) امکان انتخاب استراتژیهای ادغام پسزمینه را با گزینه -s فراهم میکند. برخی از استراتژیها همچنین میتوانند گزینههای ویژه خود را دریافت کنند که میتوان آنها را با دادن آرگومانهای -X<option> به git merge و/یا git pull ارسال کرد.
ort
در حالتی که مسیر مورد نظر یک زیرماژول است، اگر کامیت زیرماژول استفادهشده در یک طرف ادغام، نواده (descendant) کامیت زیرماژول استفادهشده در طرف دیگر ادغام باشد، گیت تلاش میکند تا به آن نواده فستفوروارد کند. در غیر این صورت، گیت این حالت را بهعنوان یک تعارض در نظر میگیرد و کامیت زیرماژولی را که نواده کامیتهای دارای تعارض است (در صورت وجود) بهعنوان راهحل پیشنهاد میکند.
استراتژی ort میتواند گزینههای زیر را بپذیرد:
ours
این گزینه نباید با استراتژی ادغام ours اشتباه گرفته شود؛ آن استراتژی اصلاً به آنچه درخت دیگر شامل میشود نگاه نمیکند و هر کاری را که درخت دیگر انجام داده دور میاندازد و اعلام میکند که تاریخچه ما شامل تمام رویدادهایی است که در آن رخ داده است.
theirs
ignore-space-change, ignore-all-space, ignore-space-at-eol, ignore-cr-at-eol
renormalize
no-renormalize
find-renames[=<n>]
rename-threshold=<n>
no-renames
histogram
patience
diff-algorithm=(histogram|minimal|myers|patience)
subtree[=<path>]
recursive
resolve
octopus
ours
subtree
در استراتژیهایی که از ادغام ۳-طرفه استفاده میکنند (از جمله گزینه پیشفرض، ort)، اگر تغییری در هر دو شاخه ایجاد شود اما بعداً در یکی از شاخهها بازگردانی (revert) شود، آن تغییر در نتیجه ادغام وجود خواهد داشت؛ برخی این رفتار را گیجکننده میدانند. این حالت رخ میدهد زیرا هنگام انجام ادغام، فقط سرشاخهها و پایه ادغام (merge base) در نظر گرفته میشوند، نه تکتک کامیتها. بنابراین الگوریتم ادغام، تغییر بازگرداندهشده را اصلاً بهعنوان هیچ تغییری در نظر نمیگیرد و در عوض نسخه تغییریافته را جایگزین میکند..SH "رفتار پیشفرض (DEFAULT BEHAVIOUR)"
اغلب افراد از git pull بدون دادن هیچ پارامتری استفاده میکنند. از گذشته، این کار معادل اجرای git pull origin بوده است. با این حال، زمانی که در شاخه <name> هستید و پیکربندی branch.<name>.remote وجود داشته باشد، آن مقدار بهجای origin استفاده میشود.
به منظور تعیین اینکه از چه نشانیای برای واکشی استفاده شود، مقدار متغیر پیکربندی remote.<origin>.url بررسی میشود و اگر چنین متغیری وجود نداشته باشد، مقدار خط URL: در $GIT_DIR/remotes/<origin> استفاده میگردد.
به منظور تعیین اینکه هنگام اجرای دستور بدون هیچ پارامتر مشخصه مرجع (refspec) در خط فرمان، کدام شاخههای دوردست باید واکشی شوند (و بهصورت اختیاری در شاخههای ردگیری دوردست ذخیره گردند)، مقادیر متغیر پیکربندی remote.<origin>.fetch بررسی میشوند، و اگر مقداری وجود نداشته باشد، $GIT_DIR/remotes/<origin> بررسی شده و خطوط Pull: آن استفاده میشوند. علاوه بر قالبهای refspec شرحدادهشده در بخش گزینهها، میتوانید یک refspec با تطبیق الگو (globbing) داشته باشید که به این شکل است:
refs/heads/*:refs/remotes/origin/*
یک refspec الگویی باید سمت راست (RHS) غیرخالی داشته باشد (یعنی باید آنچه را که واکشی شده در شاخههای ردگیری دوردست ذخیره کند)، و سمت چپ و راست آن باید به /* ختم شوند. عبارت بالا مشخص میکند که تمام شاخههای دوردست با استفاده از شاخههای ردگیری دوردست در سلسلهمراتب refs/remotes/origin/ تحت همان نام ردگیری میشوند.
قاعده تعیین اینکه کدام شاخه دوردست باید پس از واکشی ادغام شود، به منظور حفظ سازگاری با نسخههای پیشین کمی پیچیده است.
اگر مشخصههای مرجع (refspecها) بهطور صریح در خط فرمان git pull داده شده باشند، همگی آنها ادغام میشوند.
هنگامی که هیچ refspecی در خط فرمان داده نشده باشد، git pull از refspec موجود در پیکربندی یا $GIT_DIR/remotes/<origin> استفاده میکند. در چنین مواردی، قواعد زیر اعمال میشوند:
مثالها (EXAMPLES)
$ git pull $ git pull origin
بهطور معمول، شاخهای که ادغام میشود همان HEAD مخزن دوردست است، اما این انتخاب توسط گزینههای branch.<name>.remote و branch.<name>.merge تعیین میشود؛ برای جزئیات به git-config(1) مراجعه کنید.
$ git pull origin next
این دستور یک کپی از next را بهطور موقت در FETCH_HEAD قرار میدهد و شاخه ردگیری دوردست origin/next را بهروزرسانی میکند. همین کار را میتوان با فراخوانی fetch و merge انجام داد:
$ git fetch origin $ git merge origin/next
اگر یک عملیات دریافت (pull) انجام دادید که منجر به تعارضهای پیچیده شد و مایلید از اول شروع کنید، میتوانید با git reset وضعیت را بازیابی نمایید.
امنیت (SECURITY)
پروتکلهای fetch و push طوری طراحی نشدهاند که از سرقت دادههای مخزن دیگر که قصد اشتراکگذاری آنها وجود نداشته جلوگیری کنند. اگر دادههای خصوصی دارید که باید از یک همتای (peer) مخرب محافظت شوند، بهترین گزینه این است که آنها را در مخزن دیگری ذخیره کنید. این مورد هم برای کلاینتها و هم برای سرورها صدق میکند. بهویژه، فضاهای نام روی یک سرور برای کنترل دسترسی خواندن مؤثر نیستند؛ شما باید فقط به کلاینتهایی دسترسی خواندن به یک فضای نام را بدهید که برای دسترسی خواندن به کل مخزن به آنها اعتماد دارید.
بردارهای حمله شناختهشده به شرح زیر هستند:
اشکالات (BUGS)
در حال حاضر استفاده از --recurse-submodules فقط میتواند کامیتهای جدید را در زیرماژولهایی که از قبل دریافت (check out) شدهاند واکشی کند. هنگامی که مثلاً بالادست یک زیرماژول جدید را در کامیتهای تازه واکشیشده پروژه اصلی اضافه کرده باشد، خود زیرماژول نمیتواند واکشی شود و این امر دریافت آن زیرماژول را بعداً بدون نیاز به انجام مجدد واکشی غیرممکن میسازد. انتظار میرود این مشکل در نسخه آینده گیت برطرف شود.
همچنین ببینید (SEE ALSO)
گیت (GIT)
بخشی از مجموعه git(1)
| 2026-06-29 | Git 2.55.0 |