كيف ترتبط بالاسكواش في تصحيح واحد باستخدام GIT Format-Patch؟

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

  •  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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top