تنسيق التصحيح يعمل بشكل جيد بشكل معقول، يبحث عن طريقة أفضل

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

  •  13-09-2019
  •  | 
  •  

سؤال

لدي فرعين مختلفان بما فيه الكفاية بحيث يبدو أن Rebasing لا يعمل - أو لا أعرف كيف أفعل ذلك.

لدي فرع "عام" مع مجموعة من الملفات التي تمت إزالتها (باستخدام فرع المرشح). على الرغم من أن معظم يرتكب المباراة من حيث دلتا، فإن معرفات الالتزام مختلفة. لقد حاولت بضع طرق لسحب التغييرات من فرع Dev الخاص بي إلى فرعي العام ... أجد صعوبة في الاعتقاد بأنه يمكن أن يفعل ما أريده القيام به - لكنني أظن أنني فقط لا أعرف كيف أعرف كيف افعلها. في أي حال، هذا يعمل بشكل جيد، ولكن يبدو خطأ.

git checkout dev
git format-patch --stdout last_sync_tag > catchup.mbox
git checkout public
git am catchup.mbox
git --skip # talks about a missing file
git --skip # talks about a missing file
git --skip # talks about a missing file

أي نصائح أو اقتراحات، والتي من المحتمل أن تتضمن عدم تصفية الملفات التي لا تريدها في الفرع العام (على الرغم من ذلك، كيف تتخلص منها؟)، مرحب بها.

تبدو شجرة (أشجار) الخاصة بي أكثر أو أقل مثل هذا:

dev: a-b-c-d-e-f-g-h-i-j-k
pub: t-u-v-w-x

T ≅ a، u ≅ c، v ≅ d، w ≅ e، x ≅ g. أنا، ي، ك هي بقع جديدة أود التحرك.

checkout pub
rebase --onto pub i  # I really expected this to work
هل كانت مفيدة؟

المحلول

بوابة cherry-pick قد يكون الأمر مفيدا. لم أستخدمها في وضعك ولكني أعتقد أنه يجب أن تعمل. الألم الوحيد هو أنه غير مصمم للعمل على مجموعة من الالتزام، لذلك إذا كنت ترغب في البرنامج النصي / أتمتة ذلك، سيتعين عليك استخدام شيء مثل git rev-list.

مرة أخرى، لم أحاول ذلك ولكن النصي باش مثل هذا قد يمنحك نقطة انطلاق جيدة

GIT Checkout Public للقمر في $ (GIT Rev-List --Reverse last_sync_tag..dev)؛ هل جيت الكرز اختيار $ Rev && git tag -f last_sync_tag $ rev || الخروج 1

نصائح أخرى

هل تحافظ بانتظام على الملفات على فرع Dev الخاص بك والتي ليست علنية؟ أم أنها تعلق فقط؟

إذا كنت لا تميل إلى إجراء تغييرات عليها، فأنت موافق مع إعادة كتابة التاريخ قليلا، فما الذي يمكنك فعله هو الترتيب لإنشاءها كتزام واحد بناء على الفرع العام الخاص بك؛ ودمج ذلك مرة أخرى في الأماكن العامة ولكن مع "-s لنا" لمنعهم بالفعل الدخول. (إجابة سابقة حول Git Merge -)

شيء مثل:

git checkout -b dev public
git am create-dev-only-files.patch
git checkout public
git merge -s ours dev
git checkout dev
# write more dev patches...
git checkout public
git merge dev
# and this should merge in the patches without bringing in the
#  dev-only files

لذلك إذا قمت بعد ذلك بإجراء تغييرات لاحقة على فرع Dev الخاص بك ودمجها في الأماكن العامة، إذا لم تكن تغيير هذه الملفات التي ليست عامة، فسيطبق كل شيء آخر عليه. ولكن إذا كانت مجموعة الملفات التي تريد قمعها على التغييرات العامة، فقد يكون هذا صعبا. يمكنك محاولة منعها عن طريق إضافة ربط ما قبل الالتزام إلى ملفات معينة غير محددة قبل البدء في أي ارتكاب على الفرع العام، على سبيل المثال.

لأنك استخدمت "Filter-branch"، ستحصل على مساعدة GIT في العثور على الالتزام الصحيح لأداء Rebase على.

سأظل أعتقد هنا، ولكن من المفترض أن يكون لديك ارتكاب مشترك "تقريبا يحتوي على نسختين، ورئيس فرعك العام والمكان في فرع Dev الخاص بك أن هذا الالتزام يتوافق مع (Un-Filtered). استدعاء ارتكاب الرأس العام <PH> والتطوير يلتزم أن هذا يتوافق مع (قبل التصفية) <DevPH>.

مع فحص فرع Dev، تريد أن تفعل شيئا مثل هذا:

git rebase --onto <PH> <DevPH>

هذا يخبر Rebase أن تأخذ الرقع المقدمة من كل ارتكاب منذ ذلك الحين <DevPH> على الفرع الحالي وتطبيق هذه الجميلات <PH>. وبعد أعتقد أن هذا هو ما تحتاجه.

يحرر:

يوضح التحديث الخاص بك بالسؤال أن H يعادل رئيس الدفق العام على فرع Dev وأنك ترغب في زرع كل شيء من هنا فصاعدا على فرع Dev On the Public Franch. إذا كان الأمر كذلك الأمر هو

git rebase --onto pub h

حسنا، إذا كنت لا أريد أراضي ملفات مع .gitignore. ربما يكون التكوين وليس الرمز الحقيقي لذلك لا يحتاج إلى تتبع على الإطلاق.

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