مع git، كيف يمكنني ارتكاب بعض التغييرات في نسخة العمل إلى فرع مختلف؟

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

  •  12-09-2019
  •  | 
  •  

سؤال

أنا أعمل في فرع، وحصلت على نسخة عمل مع غير نظيفة حقا. عند النظر من خلال التغييرات في الالتزام، أردت أن تلتزم عدد قليل من إصلاحات 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، لديك هذه الميزة)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top