Cum pot merge fara probleme divergente caracteristică ramuri?

0

Problema

Am un PR de pe o ramură numită feature-b care va fi în curând au fuzionat pentru a main. Cu toate acestea, l-am scris pentru a-mi susține feature-a ramură, care este în curs de desfășurare. Vreau să continue să lucreze pe feature-a si levier-am facut la feature-b înainte de a fi fuzionat pentru a main.

Ceea ce este cel mai bun mod pentru mine să fac asta? Nostru se unește cu main sunt strivit, așa că toți se angajează pe feature-b va fi rescris ca un singur comite atunci când este fuzionat pentru a main. Prin urmare, rebasing feature-a pe feature-b acum va duce în viitor conflict de durere când am merge feature-a pentru a main pentru că aceleași modificări au fost făcute în diferite se angajează.

Ceea ce este cel mai bun mod pentru mine de a include modificările făcute în feature-b în feature-a filiala timp ce minimizarea viitorul durere, atunci când am în cele din urmă merge feature-a pentru a main?

UPDATE

Am mers mai departe și:

  1. Resetează feature-a pe feature-b
  2. A făcut mai multe schimbări (doar 1 comite) să feature-a în timp feature-b a fost revizuit
  3. Squash-au fuzionat feature-b odată ce a fost aprobat (nu mai modificările necesare, astfel încât feature-a deja are exact codul care a fost fuzionat)
  4. A tras mai recente main și indexate feature-a pe partea de sus a acesteia

Cum era de temut, git se plânge că mai multe fișiere sunt "ambele modificate" sau "adăugate". Numai acest lucru ar fi un pic enervant, dar simplu pentru a repara. Ceea ce o face extrem de confuz, mai ales dacă orice trecere de timp a trecut - este fuzionare comentarii în fișiere.

Chiar dacă ambele main și feature-a ramurile au exact același cod , în toate fișierele, devin foarte enervant comportament:

  1. Pentru "ambele adăugat" fișiere, merge comentariile sunt adăugate pentru "CAP (Schimbarea Curentă)" și "părinte al #HASH (comite mesaj)". Eu sunt obligat să aleagă una sau alta, chiar dacă ele sunt exact la fel!
  2. Pentru "ambele modificate" de fișiere, este chiar mai rău. "CAPUL (Curent de Schimbare)", arată codul corect. Cu toate acestea, "părinte al #HASH (comite mesaj)" secțiune prezintă jumătate din cod. Din nou, deși ambele ramuri au tot codul!! Nu glumesc, acceptarea "primite schimbare" (ca etichetate cu VS Cod) va elimina codul care este, în ambele ramuri!

Dacă nu aș fi făcut aceste schimbări în succesiune rapidă, aș fi fost iremediabil pierdut și confuz despre ceea ce git dă-mi. Care are într-adevăr s-a întâmplat de mai multe ori în trecut, dar nu am putut pune degetul pe ceea ce se întâmplă. Acum, că am reprodus acest lucru și verificate de comportament, sunt complet consternat de ceea ce git este de a face și cum sunt oamenii de-a face cu acest scenariu.

UPDATE 2

OK, am un fel de a vedea de ce a fost de gând pentru a elimina codul acum. Pentru că schimbările făcute în feature-b au fost în mai multe comite, și cei comite sfârșit prin a fi strivit atunci când merge la main a avut loc. Aceasta este, fără îndoială sursa de durere și de ce încerc să-mi dau seama un flux de lucru mai sănătos.

git
2021-11-23 23:26:24
1

Cel mai bun răspuns

0

Nu sunt convins final fuziona/de squash va fi murdar. Dacă aceeași schimbare se face în diferite se angajează, poate Git poate detecta și de a fi fericit cu ea.

Dacă tu crezi că va fi murdar, deși, ce-ai putea face este:

  1. Rebazare ta feature-a ramură cu feature-b acum, așa că feature-a ramură include acum finalizat caracteristică B și în curs caracteristică a, care este ceea ce ai nevoie pentru a face munca ta.
  2. După feature-b devine fuzionat în main ramură, rebazare feature-a pe comită imediat înainte de a strivit comite că au făcut pentru caracteristica B. Acest lucru ar trebui să meargă fără probleme.
  3. Pe feature-a ramură, utilizare git reset --soft X în cazul în care X este comite hash pentru a strivit comis-au făcut pentru caracteristica B. Apoi utilizați git commit pentru a face o comite. Acum ai un strivit comite al căror conținut este egală cu starea actuală de lucru pe caracteristica A. Dar asta a comis-mamă este cea care comite adăugat caracteristică B la filiala principală, astfel încât aceasta comite e dif cu care părinte va numai conțin caracteristica A. este bine să continue să lucreze pe O caracteristică în acest moment, sau doar cere o îmbinare.

Apropo, eu sunt destul de sigur ca lucrurile nu ar trebuie să fie așa de murdar dacă organizația dvs. utilizează fuzionează în loc de rebases pentru a adăuga lucruri la ramura principală. Și atunci nu ar fi beneficiul de a conserva istoria reală a codului ați fost de lucru pe, în loc de doar păstrarea acestei artificiale istorie.

2021-11-23 23:52:54

Să fie clar, noi nu folosim rebases - vom folosi strivit comite. Si eu sunt 99% sigur că lucrurile vor fi murdar cum am încercat acest lucru în trecut. Git devine îngrozitor de confuz de distincte se angajează de a face aceleași modificări. Sunt dispus să încerc din nou și să raporteze înapoi :)
me--

@eu ... eu sunt destul de sigur strivit comite este o rebazare
evolutionxbox

Rebasing înseamnă mișcare ramura deci, începe un alt punct, care rescrie istoria cum a fost creat. Strivești înseamnă schimbarea întreagă ramură în doar un comis-o, aruncând istorie a modului în care acesta a fost dezvoltat cu excepția pentru rezultatul final.
David Grayson

@DavidGrayson vă Rugăm să-mi văd actualizat întrebare pentru o explicație a comportamentului vad de la git.
me--

OK. Pas 4 ("Tras mai recente principal și indexate caracteristică-o pe partea de sus de ea") este ceea ce a cauzat atâta durere deci nu e ceva ce aș recomanda să faci. În loc de a face acest pas 4 în întrebarea dumneavoastră, încercați pașii 2 și 3 din răspunsul meu.
David Grayson

Multumesc @DavidGrayson. Se pare ca da . . . laborios
me--

Așa cum am spus în răspunsul meu, problema este cauzat de persoana care face toate astea lectură și strivești în loc de pur și simplu absorbit.
David Grayson

În alte limbi

Această pagină este în alte limbi

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................