مع git، كيف يمكنني ارتكاب بعض التغييرات في نسخة العمل إلى فرع مختلف؟
سؤال
أنا أعمل في فرع، وحصلت على نسخة عمل مع غير نظيفة حقا. عند النظر من خلال التغييرات في الالتزام، أردت أن تلتزم عدد قليل من إصلاحات Oneliner ب master
فرع شجرة.
في هذه الحالة، باستخدام git stash
لا يساعد حقا، لأن نسختي العملية لديها الكثير من التغييرات الأخرى التي لن تندمج مع ماجستير حتى الآن.
هل هناك طريقة أكثر كفاءة لإصلاح هذا الموقف؟ (على سبيل المثال إجراء الالتزام، وتحريك الوالد؟)
المحلول 5
بناء على الاقتراحات السابقة، هذا هو الحل الذي جئت مع:
الحل 1 مع اختيار الكرز
فقط ارتكب التغيير الفردي في الفرع نفسه:
git add --patch <files> # record every change to move to master
git commit
الانتقال إلى ماجستير، واختيار الكرز
git stash
git checkout master
git cherry-pick <commitid>
مرة أخرى في الفرع، يمكن remeded.
git checkout <branch>
git rebase master
لكل ارتكاب مكررة، سوف تتم مطالبتك بالكتابة:
git rebase --skip
يتم تصفية المرتكبات المكررة من مجموعة التصحيح في الفرع، والسجل نظيف. الاخير git merge
لا يزال يمكن أن يكون سريع إلى الأمام بعد كل شيء.
الحل 2، دون الحاجة إلى الالتزام في الفرع أولا
أول استخراج كل شيء للانتقال إلى ماجستير:
git add --patch <files> # record every change to move to master
ثم التبديل إلى إتقان الالتزام:
git stash --keep-index # clear the working copy only
git checkout master -m # merge the index.
git commit
والعودة في الفرع، يمكن إعادة بيعها مباشرة إلى طرف السيد:
git checkout <branchname>
git rebase master # move to branch start to the tip of master.
git stash apply # restore working copy, auto merges the changes
الحل 3، وجعل استنساخ فرع الماجستير الحالي
في حال كنت لا تمانع في الحصول على نسخ عمل متعددة (كنت دائما فعلت هذا مع SVN في الواقع)، هناك حل ثالث:
mkdir ../newrepos
cd ../newrepos
git init
git remote add origin /path/to/your/repository
git fetch master:remotes/origin/master # fetch remote master to local remotes/origin/master
git checkout -t origin/master # make new "master" branch, link to remote, checkout.
git commit
git push origin master # inject the change in the original repository.
يتم إعداد استنساخ يدويا هنا ل git clone
المستنسخة دائما الفرع النشط حاليا.
لمزيد من المواقف المعقدة، هناك دائما حارس آمن إضافي git diff > to-master.patch
و git apply to-master.patch
. وبعد هذا يتيح لك المزيد من الحرية لإعادة تعيين كل شيء، وتجربة حتى تحصل على الأمور بشكل صحيح.
في هذه الحالة، نتعامل مع إصلاح خط واحد في ملف موجود في كل من الفروع. هذا لن يعطي أي صراعات دمج، وتسمح ببعض الاختصارات مثل checkout -m
.
نصائح أخرى
يمكنك استخدام git add -i
لاستخدام الوضع التفاعلي. هناك يمكنك تحديد ما يرتكبه وماذا تخطيه.
بهذه الطريقة يمكنك ارتكاب Oneliners الخاص بك يرتكب منفصلة. باستخدام git cherry-pick
يمكنك دمجها على سيدتك، في وقت لاحق.
يستخدم git add -i
لاختيار ما تريد الالتزام بهذا الفرع، ثم يتغير إلى إتقان وارتكاب الباقي.
مع add -i
يمكنك اختيار أجزاء من الملفات التي تريد تحضيرها للالتزام ثم ارتكابها، مع ترك أجزاء أخرى من نفس الملفات من الالتزام.
git add -p
سوف يسقطك مباشرة في وضع التصحيح لمتابعة العملية @ arkaitz-jimenez توصي بشكل صحيح.
لا أعرف ما إذا كان هذا هو ما تريد، لكنني سأحقق فقط من الفرع الآخر (الذي لا يفقد تغييرات غير ملتزم بها)، ثم تحقق بشكل انتقائي في التغييرات التي تريد ارتكابها.
بدلا من استخدام git add -i
/ git add -p
يمكنك أيضا استخدام وضع إضافة تفاعلي من git gui
(ربما توجد واجهات رسومية جيت الأخرى، وهي في أداة ارتكاب Clude، مثل QGIT، لديك هذه الميزة)