كيف "git show" دمج دمج مع إخراج فرق مشترك حتى عندما يتفق كل ملف تغيير مع أحد الوالدين؟


Answers

انظر إلى رسالة الالتزام:

commit 0e1329e551a5700614a2a34d8101e92fd9f2cad6 (HEAD, master)
Merge: fc17405 ee2de56
Author: Tilman Vogel <email@email>
Date:   Tue Feb 22 00:27:17 2011 +0100

Merge branch 'testing' into master

لاحظ الخط:

Merge: fc17405 ee2de56

أخذ هذين الهويتين وعكسها. لذلك من أجل الحصول على الفرق الذي تريده ، ستفعل:

git diff ee2de56..fc17405

لإظهار أسماء الملفات التي تم تغييرها فقط:

git diff --name-only ee2de56..fc17405

واستخراجها ، يمكنك إضافة هذا إلى gitconfig الخاص بك:

exportfiles = !sh -c 'git diff $0 --name-only | "while read files; do mkdir -p \"$1/$(dirname $files)\"; cp -vf $files $1/$(dirname $files); done"'

ثم استخدمها عن طريق العمل:

git exportfiles ee2de56..fc17405 /c/temp/myproject
Question

بعد إجراء دمج "بسيط" (واحد بدون تعارضات) ، عادةً ما يعرض git show شيئًا مثل

commit 0e1329e551a5700614a2a34d8101e92fd9f2cad6 (HEAD, master)
Merge: fc17405 ee2de56
Author: Tilman Vogel <email@email>
Date:   Tue Feb 22 00:27:17 2011 +0100

Merge branch 'testing' into master

هذا لأنه ، بالنسبة إلى عمليات الدمج ، يستخدم git show تنسيق diff المركب الذي يغفل الملفات التي تتوافق مع أيٍّ من الإصدارين الأصليين.

هل هناك طريقة لإجبار بوابة لا تزال تظهر جميع الاختلافات في وضع فرق مشترك؟

git show -m " الاختلافات (باستخدام الاختلافات الزوجية بين الإصدارات الأصلية وجميع الإصدارات الأصلية على التوالي) ، لكنني أفضل أن يكون ذلك مع الاختلافات التي تم تمييزها بـ +/- في الأعمدة المعنية مثل في الوضع المركب.




يمكنك إنشاء فرع مع HEAD لتعيين التزام واحد قبل الدمج. بعد ذلك ، يمكنك القيام بما يلي:

git merge --squash testing

سيتم دمج هذا ، ولكن لا يلتزم. ثم:

git diff



يبدو أن الإجابة هنا هي: http://thread.gmane.org/gmane.comp.version-control.git/191553/focus=191557

هكذا بطريقة مماثلة ، على التوالي

$ git diff --cc $ M $ M ^ 1 $ M ^ 2 $ (git merge-base $ M ^ 1 $ M ^ 2)

يجب أن يظهر تصحيحًا مدمجًا يشرح الحالة عند $ M بالنسبة إلى الولايات المسجلة في والديها وقاعدة الدمج.




لقد قمت ببناء مقاربة للأغراض العامة للقيام بعمليات مختلفة في عمليات الدمج.

الخطوة الأولى : إضافة اسم مستعار للدخول عن طريق تحرير ~/.gitconfig :

[alias]
  range = "!. ~/.githelpers && run_on_merge_range"

الخطوة الثانية : في ~/.githelpers ، حدد وظيفة bash:

run_on_merge_range() {
  cmd=$1; shift
  commit=$1; shift
  range=$(git show $commit | grep Merge: | awk '{print $2 "..." $3}')
  echo "git $cmd $range $@"
  if [ -z $range ]; then
    echo "No merge detected"
    exit 1
  fi
  git $cmd $range $@
}

الخطوة الثالثة : الربح!

git range log <merge SHA> --oneline
git range diff <merge SHA> --reverse -p
git range diff <merge SHA> --name-only

ربما هناك الكثير من مجال للتحسين هنا ، أنا فقط هذا الجلد معا لتجاوز موقف مزعج. لا تتردد في هز بناء جملة bash و / أو المنطق.