عرض التزامات Git غير المدفوعة
سؤال
كيف يمكنني عرض أي التزامات محلية قمت بها، ولم يتم دفعها بعد إلى المستودع البعيد؟أحياناً، git status
ستتم طباعة أن الفرع الخاص بي هو X الذي يلتزم به مسبقًا origin/master
, ، لكن ليس دائما.
هل هذا خطأ في تثبيت Git الخاص بي، أم أنني أفتقد شيئًا ما؟
المحلول
git log origin/master..HEAD
يمكنك أيضا عرض DIFF باستخدام بناء الجملة
git diff origin/master..HEAD
نصائح أخرى
إذا كنت ترغب في رؤية كل ارتكاب جميع الفروع التي لم يتم دفعها بعد، فقد تبحث عن شيء مثل هذا:
git log --branches --not --remotes
وإذا كنت ترغب فقط في رؤية أحدث الالتزام على كل فرع، وأسماء الفرع، هذا:
git log --branches --not --remotes --simplify-by-decoration --decorate --oneline
يمكنك إظهار كل يرتكب لديك محليا ولكن ليس المنبع مع
git log @{u}..
@{u}
أو @{upstream}
يعني فرع المنبع للفرع الحالي (انظر git rev-parse --help
أو git help revisions
للتفاصيل).
هذا عملت بالنسبة لي:
git cherry -v
كما هو مبين في بوابة: انظر جميع ارتكاب كل شيء غير واضح أو يرتكب ذلك ليس في فرع آخر.
يمكنك القيام بذلك مع git log
:
git log origin..
افترض أن origin
هو اسم المنبع الخاص بك، وإخراج أي اسم مراجعة بعد ..
يدل HEAD
, التي تسرد الالتزام الجديد الذي لم يتم دفعه.
مفيد جيت الاسم المستعار للبحث عن اختلاف تيار فرع:
alias unpushed = !GIT_CURRENT_BRANCH=$(git name-rev --name-only HEAD) && git log origin/$GIT_CURRENT_BRANCH..$GIT_CURRENT_BRANCH --oneline
ما يفعل هذا أساسا:
git log origin/branch..branch
ولكن أيضا يحدد اسم الفرع الحالي.
جميع الإجابات الأخرى تتحدث عن "المنبع" (الفرع الذي تسحب منه).
لكن أ الفرع المحلي يستطيع يدفع إلى أ مختلف فرع من الذي يسحب منه.
master
قد لا يتم الدفع إلى فرع التتبع عن بعد "origin/master
".
ال المنبع فرع ل master
قد يكون origin/master
, ، ولكن يمكن أن يدفع إلى فرع التتبع عن بعد origin/xxx
او حتى anotherUpstreamRepo/yyy
.
يتم تعيين تلك بواسطة branch.*.pushremote
للفرع الحالي جنبا إلى جنب مع global remote.pushDefault
قيمة.
إنها الذي - التي فرع التتبع عن بعد والذي يتم احتسابه عند البحث عن الالتزامات غير المدفوعة:الذي يتتبع branch at the remote
أين ال الفرع المحلي سيتم دفعه إلى.
ال branch at the remote
يمكن أن يكون، مرة أخرى، origin/xxx
او حتى anotherUpstreamRepo/yyy
.
يقدم Git 2.5+ (الربع الثاني من عام 2015) اختصارًا جديدًا لذلك: <branch>@{push}
يرى ارتكاب 29bc885, ارتكاب 3dbe9db, ارتكاب adfe5d0, ارتكاب 48c5847, ارتكاب a1ad0eb, ارتكاب e291c75, ارتكاب 979cb24, ارتكاب 1ca41a1, ارتكاب 3a429d0, ارتكاب a9f9f8c, ارتكاب 8770e6f, ارتكاب da66b27, ارتكاب f052154, ارتكاب 9e3751d, الالتزام ee2499f [الكل من 21 مايو 2015]، و ارتكاب e41bf35 [01 مايو 2015] بواسطة جيف كينغ (peff
).
(تم الدمج بواسطة جونيو سي هامانو -- gitster
-- في ارتكاب c4a8354, ، 05 يونيو 2015)
ارتكاب adfe5d0 يشرح:
sha1_name
:ينفذ@{push}
الاختزالفي سير العمل الثلاثي، قد يكون لكل فرع نقطتين مميزتين من الاهتمام:ال
@{upstream}
التي تنسحب منها عادةً، والوجهة التي تدفع إليها عادةً.ليس هناك اختصار للأخير، ولكن من المفيد أن يكون لديك.على سبيل المثال، قد ترغب في معرفة الالتزامات التي لم تدفعها بعد:
git log @{push}..
أو كمثال أكثر تعقيدا، تخيل أنك عادة تسحب التغييرات من
origin/master
(الذي قمت بتعيينه كـ@{upstream}
)، ودفع التغييرات إلى مفترقك الشخصي (على سبيل المثال، مثلmyfork/topic
).
يمكنك الدفع إلى شوكتك من أجهزة متعددة، مما يتطلب منك ذلك دمج التغييرات من وجهة الدفع، بدلاً من المنبع.
مع هذا التصحيح، يمكنك فقط القيام بما يلي:
git rebase @{push}
بدلاً من كتابة الاسم الكامل.
ارتكاب 29bc885 يضيف:
for-each-ref
:يقبل "%(push)
" شكلتماما كما لدينا "
%(upstream)
" للإبلاغ عن "@{upstream}
"لكل مرجع، يضيف هذا التصحيح"%(push)
" كثيرا "@{push}
".
وهو يدعم نفس معدّلات تنسيق التتبع مثل المنبع (لأن قد ترغب في معرفة، على سبيل المثال، ما هي الفروع التي يجب دفعها).
إذا كنت تريد معرفة عدد فروعك المحلية أمام / خلف مقارنة بالفرع الذي تدفع إليه:
git for-each-ref --format="%(refname:short) %(push:track)" refs/heads
بامكانك ان تحاول....
gitk
أعلم أنه ليس خيارا لسطر أمر نقي ولكن إذا كنت قد قمت بتثبيته وهناك على نظام واجهة المستخدم الرسومية، فهذه طريقة رائعة لرؤية ما تبحث عنه بالضبط بالإضافة إلى أكثر بكثير.
(أنا فعلا نوع من فاجأ لا أحد ذكره حتى الآن.)
git branch -v
سوف تظهر، لكل فرع محلي، سواء كان "قدما" أم لا.
يمكنني استخدام الاسم المستعار التالي للحصول على قائمة الملفات (والحالة) التي تم ارتكابها ولكنها لم يتم دفعها (للفرع الحالي)
git config --global alias.unpushed \
"diff origin/$(git name-rev --name-only HEAD)..HEAD --name-status"
ثم فقط تفعل:
git unpushed
كان لدي ارتكاب فعلت سابقا، لم يتم دفعها إلى أي فرع، ولا عن بعد ولا محلي. فقط الالتزام. لا شيء من الإجابات الأخرى عملت لي، ولكن مع:
git reflog
هناك وجدت ارتكابي.
أعتقد أن الطريقة الأكثر نموذجية للقيام بذلك هي تشغيل شيء مثل:
git cherry --abbrev=7 -v @{upstream}
ومع ذلك، أنا شخصيا أفضل تشغيل:
git log --graph --decorate --pretty=oneline --abbrev-commit --all @{upstream}^..
مما يدل على ارتكاب الكل الفروع التي لم يتم دمجها في المنبع، بالإضافة إلى آخر الالتزام في المنبع (الذي يظهر كعقدة جذرية لجميع الجميلات الأخرى). أنا استخدمه في كثير من الأحيان أنني قمت بإنشاء الاسم المستعار noup
لذلك.
git config --global alias.noup \
'log --graph --decorate --pretty=oneline --abbrev-commit --all @{upstream}^..'
أنها ليست علة. ما تراه ربما هو حالة GIT بعد دمج تلقائي فاشل حيث يتم جلب التغييرات من جهاز التحكم عن بعد ولكن لم يتم دمجها بعد.
لرؤية الالتزام بين الريبو المحلي والبعيدة القيام بذلك:
git fetch
هذه آمنة بنسبة 100٪ ولن تسخر نسخة عملك. إذا كانت هناك تغييرات git status
ويل تظهر X commits ahead of origin/master
.
يمكنك الآن إظهار سجل الالتزام الموجود في جهاز التحكم عن بعد ولكن ليس في المحلي:
git log HEAD..origin
أقترح عليك أن ترى البرنامج النصي https://github.com/badele/gitcheck., لقد ترميز هذا البرنامج النصي للتحقق في واحدة تمرير جميع مستودعاتك البذرة، ويعرض من لم يرتكب والذين لم يدفع / سحبوا.
هنا نتيجة عينة
git cherry -v
سيؤدي ذلك إلى سرد هذا تاريخ تعليقك المحلي (لم يدفع بعد) مع الرسالة المقابلة
هناك أداة اسمه غير مخطئ الذي يقوم بمسح جميع Repos GIT و Mercurial و Subversion في دليل العمل المحدد ويبين قائمة الملفات UCommited و ارتكب غير مخطئ. التثبيت بسيط تحت لينكس:
$ easy_install --user unpushed
أو
$ sudo easy_install unpushed
لتثبيت على مستوى النظام.
الاستخدام بسيط جدا:
$ unpushed ~/workspace
* /home/nailgun/workspace/unpushed uncommitted (Git)
* /home/nailgun/workspace/unpushed:master unpushed (Git)
* /home/nailgun/workspace/python:new-syntax unpushed (Git)
يرى unpushed --help
أو الوصف الرسمي للمزيد من المعلومات. كما أن لديها سيناريو كرونجوب unpushed-notify
للإخطار على الشاشة للتغيرات غير المرنة وغير المنفصلة.
هذا عمل أفضل بالنسبة لي:
git log --oneline @{upstream}..
أو:
git log --oneline origin/(remotebranch)..
مماثلة: عرض الفروع غير المكتسب:
git branch --all --no-merged
يمكن أن تكون المشتبه فيها ولكني أوصي بالإجابة من قبل CXREG
لإدراج جميع الالتزام غير المنفصلين في جميع الفروع يمكنك بسهولة استخدام هذا الأمر:
git log --branches @{u}..
إذا كان عدد الالتزام الذي لم يتم دفعه هو رقم واحد رقم واحد، فغالبا ما يكون هو أسهل طريقة:
$ git checkout
يستجيب GIT من خلال إخبارك بأنك "قدما N ارتكب" نسبية أصلك. حتى الآن فقط احتفظ بهذا الرقم في الاعتبار عند عرض سجلات. إذا كنت "قدما بنسبة 3 ارتكب"، فإن أعلى 3 ارتكب في التاريخ لا يزال خاصا.
إحدى طرق القيام بالأشياء هي قائمة ارتكابها متوفرة على فرع واحد ولكن ليس آخر.
git log ^origin/master master
إليك حلا محموتي (SHELT SCRIPT الذي يعمل على Windows أيضا بدون تثبيت إضافي) يظهر الاختلافات من الأصل لجميع الفروع: git-fetch-log
مثال على الإخراج:
==== branch [behind 1]
> commit 652b883 (origin/branch)
| Author: BimbaLaszlo <bimbalaszlo@gmail.com>
| Date: 2016-03-10 09:11:11 +0100
|
| Commit on remote
|
o commit 2304667 (branch)
Author: BimbaLaszlo <bimbalaszlo@gmail.com>
Date: 2015-08-28 13:21:13 +0200
Commit on local
==== master [ahead 1]
< commit 280ccf8 (master)
| Author: BimbaLaszlo <bimbalaszlo@gmail.com>
| Date: 2016-03-25 21:42:55 +0100
|
| Commit on local
|
o commit 2369465 (origin/master, origin/HEAD)
Author: BimbaLaszlo <bimbalaszlo@gmail.com>
Date: 2016-03-10 09:02:52 +0100
Commit on remote
==== test [ahead 1, behind 1]
< commit 83a3161 (test)
| Author: BimbaLaszlo <bimbalaszlo@gmail.com>
| Date: 2016-03-25 22:50:00 +0100
|
| Diverged from remote
|
| > commit 4aafec7 (origin/test)
|/ Author: BimbaLaszlo <bimbalaszlo@gmail.com>
| Date: 2016-03-14 10:34:28 +0100
|
| Pushed remote
|
o commit 0fccef3
Author: BimbaLaszlo <bimbalaszlo@gmail.com>
Date: 2015-09-03 10:33:39 +0200
Last common commit
معلمات مرت لسجل، على سبيل المثال --oneline
أو --patch
يمكن استعماله.
git show
سوف تظهر كل الضتبئ في ارتكاب المحلي الخاص بك.
git show --name-only
سوف تظهر معرف الالتزام المحلي واسم الالتزام.
git diff origin
على افتراض أن فرعك تم إعداده لتتبع الأصل، ثم يجب أن يظهر لك الاختلافات.
git log origin
سوف تعطيك ملخص ارتكاب.