كيف ترتبط بالاسكواش في تصحيح واحد باستخدام GIT Format-Patch؟
-
03-07-2019 - |
سؤال
لقد حصلت على ثمانية ارتباطات في فرع أود إرسال بريد إلكتروني إلى بعض الأشخاص الذين ليسوا مستنيرين ، حتى الآن. حتى الآن ، يعطيني كل شيء أفعله إما 8 ملفات تصحيح ، أو يبدأ في إعطائي ملفات التصحيح لكل التزام في تاريخ الفرع ، منذ بداية الوقت. لقد استخدمت git rebase -التفاعلية لسكان الالتزامات ، ولكن الآن كل ما أحاوله يعطيني زيليون من البقع من بداية الوقت. ما الخطأ الذي افعله؟
git format-patch master HEAD # yields zillions of patches, even though there's
# only one commit since master
المحلول
أوصي بالقيام بذلك في فرع رمي على النحو التالي. إذا كانت عمالك في فرع "الخطوط الجديدة" وقمت بالرجوع إلى فرع "Master" الخاص بك بالفعل ، فيجب أن يقوم هذا بالخدعة:
[adam@mbp2600 example (master)]$ git checkout -b tmpsquash
Switched to a new branch "tmpsquash"
[adam@mbp2600 example (tmpsquash)]$ git merge --squash newlines
Updating 4d2de39..b6768b2
Fast forward
Squash commit -- not updating HEAD
test.txt | 2 ++
1 files changed, 2 insertions(+), 0 deletions(-)
[adam@mbp2600 example (tmpsquash)]$ git commit -a -m "My squashed commits"
[tmpsquash]: created 75b0a89: "My squashed commits"
1 files changed, 2 insertions(+), 0 deletions(-)
[adam@mbp2600 example (tmpsquash)]$ git format-patch master
0001-My-squashed-commits.patch
أتمنى أن يساعدك هذا!
نصائح أخرى
فقط لإضافة حل آخر إلى الوعاء: إذا كنت تستخدم هذا بدلاً من ذلك:
git format-patch master --stdout > my_new_patch.diff
بعد ذلك ، سيظل 8 تصحيحات ... لكنهم سيكونون جميعًا في ملف واحد وسيتم تطبيقه كأحد:
git am < my_new_patch.diff
أستخدم دائمًا Git Diff ، لذا في مثالك ، شيء مثل
git diff master > patch.txt
هذا هو تكييف إجابة آدم ألكساندر ، في حالة وجود تغييراتك في فرع الماجستير. هذا يفعل ما يلي:
- يخلق فرعًا جديدًا جديدًا "TMPSquash" من النقطة التي نريدها (ابحث عن مفتاح SHA الذي يعمل "Git -log" أو مع GITG. حدد الالتزام الذي تريد أن تكون TMPSquash Head يرتكب السحق).
- يدمج التغييرات من Master إلى TMPSquash.
- يرتكب التغييرات المختصرة إلى TMPSquash.
- يخلق التصحيح مع الالتزامات سحق.
- يعود إلى Master Branch
laura@rune:~/example (master)$ git branch tmpsquash ba3c498878054e25afc5e22e207d62eb40ff1f38
laura@rune:~/example (master)$ git checkout tmpsquash
Switched to branch 'tmpsquash'
laura@rune:~/example (tmpsquash)$ git merge --squash master
Updating ba3c498..40386b8
Fast-forward
Squash commit -- not updating HEAD
[snip, changed files]
11 files changed, 212 insertions(+), 59 deletions(-)
laura@rune:~/example (tmpsquash)$ git commit -a -m "My squashed commits"
[test2 6127e5c] My squashed commits
11 files changed, 212 insertions(+), 59 deletions(-)
laura@rune:~/example (tmpsquash)$ git format-patch master
0001-My-squashed-commits.patch
laura@rune:~/example (tmpsquash)$ git checkout master
Switched to branch 'master'
laura@rune:~/example (master)$
كما تعلم بالفعل ، أ git format-patch -8 HEAD
سوف يعطيك ثماني بقع.
إذا كنت تريد أن تظهر الالتزامات الثمانية الخاصة بك كواحدة ، ولا تمانع في إعادة كتابة تاريخ فرعك (o-o-X-A-B-C-D-E-F-G-H
)، يمكنك :
git rebase -i
// squash A, B, C, D, E ,F, G into H
أو ، وسيكون حلاً أفضل ، إعادة تشغيل كل ما تبذلونه من 8 ارتباطات من X
(الالتزام قبل الالتزام 8) في فرع جديد
git branch delivery X
git checkout delivery
git merge --squash master
git format-patch HEAD
وبهذه الطريقة ، لديك التزام واحد فقط بفرع "التسليم" ، ويمثل كل ما تبذلونه من 8 ارتباطات
تنسيق بين علامتين:
git checkout <source-tag>
git checkout -b <tmpsquash>
git merge --squash <target-tag>
git commit -a -m "<message>"
git format-patch <source-tag>
أسهل طريقة للاستخدام git diff
, وأضف في git log
إذا كنت تريد رسالة الالتزام المشتركة بأن طريقة الاسكواش ستخرج. على سبيل المثال ، لإنشاء التصحيح بين الالتزام abcd
و 1234
:
git diff abcd..1234 > patch.diff
git log abcd..1234 > patchmsg.txt
ثم عند تطبيق التصحيح:
git apply patch.diff
git add -A
git reset patch.diff patchmsg.txt
git commit -F patchmsg.txt
لا تنسى --binary
حجة ل git diff
عند التعامل مع الملفات غير النصية ، مثل الصور أو مقاطع الفيديو.
بناءً على إجابة آدم ألكساندر:
git checkout newlines
## must be rebased to master
git checkout -b temporary
# squash the commits
git rebase -i master
git format-patch master