كيف يمكنني إنشاء فرق git لما تغير منذ آخر مرة قمت فيها بالسحب؟

StackOverflow https://stackoverflow.com/questions/61002

  •  09-06-2019
  •  | 
  •  

سؤال

أرغب في كتابة الإجراءات التالية، ويفضل أن يكون ذلك في Rake، في أمر واحد:

  1. احصل على إصدار مستودع git المحلي الخاص بي.
  2. Git سحب أحدث التعليمات البرمجية.
  3. يختلف Git عن الإصدار الذي استخرجته في الخطوة رقم 1 عما هو موجود الآن في مستودعي المحلي.

بمعنى آخر، أريد الحصول على أحدث التعليمات البرمجية من المستودع المركزي وإنشاء فرق على الفور لما تغير منذ آخر مرة قمت فيها بالسحب.

هل كانت مفيدة؟

المحلول

يمكنك القيام بذلك بكل بساطة باستخدام المراجع.

git pull origin
git diff @{1}..

سيعطيك ذلك اختلافًا عن الفرع الحالي كما كان قبل السحب وبعده.لاحظ أنه إذا لم تقم عملية السحب بتحديث الفرع الحالي فعليًا، فسيعطيك الفرق نتائج خاطئة.هناك خيار آخر يتمثل في تسجيل الإصدار الحالي بشكل صريح:

current=`git rev-parse HEAD`
git pull origin
git diff $current..

أنا شخصياً أستخدم اسمًا مستعارًا يُظهر لي ببساطة سجلاً بترتيب عكسي (أي:من الأقدم إلى الأحدث)، بدون عمليات دمج، لجميع الالتزامات منذ آخر عملية سحب قمت بها.أقوم بتشغيل هذا في كل مرة يقوم فيها السحب بتحديث الفرع:

git config --global alias.lcrev 'log --reverse --no-merges --stat @{1}..

نصائح أخرى

جريج يجب أن تعمل الطريقة (وليس لي، وغيرها جريج :P).فيما يتعلق بتعليقك، Origin هو متغير تكوين يتم تعيينه بواسطة Git عندما تقوم باستنساخ المستودع المركزي على جهازك المحلي.في الأساس، يتذكر مستودع Git مصدره.ومع ذلك، يمكنك تعيين هذه المتغيرات يدويًا إذا كنت بحاجة إلى استخدام git-config.

git config remote.origin.url <url>

حيث url هو المسار البعيد إلى مستودعك المركزي.

فيما يلي مثال لملف دفعي يجب أن يعمل (لم أختبره).

@ECHO off

:: Retrieve the changes, but don't merge them.
git fetch

:: Look at the new changes
git diff ...origin

:: Ask if you want to merge the new changes into HEAD
set /p PULL=Do you wish to pull the changes? (Y/N)
IF /I %PULL%==Y git pull

هذا مشابه جدًا للسؤال الذي طرحته كيفية الحصول على التغييرات على فرع في بوابة.لاحظ أن سلوك git diff vs.يختلف سجل git بشكل غير متسق عند استخدام نقطتين مقابل استخدام نقطتين.ثلاث نقاط.لكن بالنسبة لتطبيقك يمكنك استخدام:

git fetch
git diff ...origin

وبعد ذلك أ git pull سيتم دمج التغييرات في HEAD الخاص بك.

إذا قمت بإسقاط هذا في ملف تعريف bash الخاص بك، فستتمكن من تشغيل Grin (git Remote incoming) وGrowt (git Remote Outgoing) لرؤية اختلافات الالتزامات الواردة والصادرة لـ Origin master.

function parse_git_branch {
  git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'
}
function gd2 { 
 echo branch \($1\) has these commits and \($2\) does not 
 git log $2..$1 --no-merges --format='%h | Author:%an | Date:%ad | %s' --date=local
}
function grin {
 git fetch origin master
 gd2 FETCH_HEAD $(parse_git_branch)
}
function grout {
 git fetch origin master
 gd2 $(parse_git_branch) FETCH_HEAD
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top