باستخدام git كيف أجد تغييرات بين المحلية والجهاز البعيد
سؤال
إليك سؤالان مختلفان ولكن أعتقد أنهما مرتبطان.
عند استخدام GIT ، كيف أجد التغييرات التي ارتكبتها محليًا ، لكن لم أكن قد دفعت بعد إلى فرع بعيد؟ أنا أبحث عن شيء مشابه لأمر الزئبق
hg outgoing
.عند استخدام GIT ، كيف أجد ما الذي يغير الفرع البعيد قبل القيام بسحب؟ أنا أبحث عن شيء مشابه لأمر الزئبق
hg incoming
.
بالنسبة للثاني: هل هناك طريقة لمعرفة ما هو متاح ومن ثم تختار التغييرات التي أريد سحبها؟
المحلول
لا يمكن لـ GIT إرسال هذا النوع من المعلومات عبر الشبكة ، مثل HG CAN. لكن يمكنك الجري git fetch
(وهو أشبه hg pull
من hg fetch
) لجلب الالتزامات الجديدة من خوادمك عن بُعد.
لذا ، إذا كان لديك فرع يسمى master
ودعا جهاز التحكم عن بُعد origin
, ، بعد تشغيل git fetch
, ، يجب أن يكون لديك أيضًا فرع يسمى origin/master
. يمكنك بعد ذلك الحصول على ملف git log
من كل الالتزامات master
يجب أن تكون مجموعة كبيرة من origin/master
عن طريق القيام git log master..origin/master
. قلب هذين للحصول على العكس.
قام صديق لي ، ديفيد الدولار ، بإنشاء اثنين من البرامج النصية للقذيفة للمحاكاة لمحاكاة hg incoming/outgoing
. يمكنك العثور عليها في http://github.com/ddollar/git-utils.
نصائح أخرى
بدءًا من GIT 1.7.0 ، يوجد بناء جملة خاص يسمح لك بالرجوع بشكل عام إلى فرع المنبع: @{u}
أو @{upstream}
.
لتقليد hg incoming
:
git log ..@{u}
لتقليد hg outgoing
:
git log @{u}..
أنا استخدم ما يلي incoming
و outgoing
الأسماء المستعارة لجعل ما سبق أسهل في الاستخدام:
git config --global alias.incoming '!git remote update -p; git log ..@{u}'
git config --global alias.outgoing 'log @{u}..'
ليس إجابة كاملة ولكن جلب git سوف تسحب الريبو عن بُعد ولا يقوم بدمج. يمكنك بعد ذلك القيام
git diff master origin/master
استخدم "Git Log Origin..head"
استخدم "Git Fetch" تليها "Git Log Head..origin". يمكنك ارتكاب فرد Cherry-Pick باستخدام معرفات الالتزام المدرجة.
ما سبق يفترض ، بالطبع ، أن "الأصل" هو اسم فرع التتبع عن بُعد (وهو ما إذا كنت قد استخدمت استنساخ مع خيارات افتراضية).
هناك أيضًا هذا ، لمقارنة جميع الفروع:
git log --branches --not --remotes=origin
هذا ما تقوله صفحة Git Log Man حول هذا:
يظهر جميع الالتزامات الموجودة في أي من الفروع المحلية ولكن ليس في أي من فروع التتبع عن بُعد للأصل (لا يوجد لديك هذا الأصل).
ما سبق outgoing
. إلى عن على incoming
, ، فقط تبادل:
git log --remotes=origin --not --branches
أود أن تفعل
$ git fetch --dry-run
إلى عن على hg incoming
و
$ git push --dry-run
إلى عن على hg outgoing
.
git-out هو نص يحاكي hg outgoing
بدقة تماما. إنه يخلع إخراج "Push -N" ، بحيث ينتج إخراجًا دقيقًا إذا كنت بحاجة إلى تحديد وسيطات إضافية للدفع.
غيت واردة
$ git fetch && git log ..origin/master --stat
OR
$ git fetch && git log ..origin/master --patch
غيت المنتهية ولايته
$ git fetch && git log origin/master.. --stat
OR
$ git fetch && git log origin/master.. --patch
عندما أعطتني إجابات "GIT Log" و @{u} أخطاء "مراجعة غير معروفة" ، جربت اقتراح كريس/رومكينز git push --dry-run
.
ستحصل على إخراج مثل "5905..4878 Master-> Master". 5905 هو الالتزام الأخير الذي يتم فيه تطبيق جهاز التحكم عن بُعد ويرتكب (بما في ذلك) 4878 على جهاز التحكم عن بُعد.
يمكنك بعد ذلك استخدام 5905..4878 كوسائط لعدة أوامر GIT أخرى للحصول على مزيد من التفاصيل:
git diff 5905..4878 # Gives full code changes in diff style
git log --online 5905..4878 # Displays each commit's comment
عندما تقوم بإحضار GIT ، يتم تخزين جميع المحتويات بما في ذلك الفروع والعلامات (REFs) مؤقتًا في .git/fetch_head التي يمكن عرض محتواها مع الأمر: GIT log fetch_head ، سيتم كتابة محتوى Fetch_head بواسطة محتويات جديدة. من هذه المحتويات ، يمكنك عرض وتحديد الفرع الذي تريد دمجه إذا قمت بذلك أو يمكنك اختيار الكرز البسيط إذا كنت تريد فقط بضع ارتباطات مما تم جلبه بواسطة Fetch.