Jak mohu bezbolestně sloučit rozdílné funkce větve?

0

Otázka

Mám otevřenou PR na větvi tzv. feature-b to bude brzy být sloučeny main. Nicméně, psal jsem to na podporu své feature-a větev, která právě probíhá. Chci pokračovat v práci na feature-a a pákový práci, kterou jsem udělal v feature-b před tím, než byl sloučen do main.

Co je nejlepší způsob, jak pro mě udělat? Naše sloučí do main jsou zmáčknutý, takže všechny commity na feature-b bude přepsána jako jeden spáchat, když je spojil, aby main. Proto, rebasing feature-a na feature-b teď bude mít v budoucnu konflikt bolest, když jsem sloučit feature-a k main protože stejné změny byly provedeny v různých zavazuje.

Co je nejlepší způsob, jak pro mě, aby zahrnovala změny provedené v feature-b v mém feature-a větev, přičemž minimalizuje budoucí bolest, když jsem se nakonec sloučit feature-a k main?

AKTUALIZACE

Šel jsem do toho a:

  1. Rebased feature-a na feature-b
  2. Udělal více změn (pouze 1 commit) feature-a zatímco feature-b byla přezkoumána
  3. Squash-spojil feature-b jakmile byl schválen (žádné další změny nutné, takže feature-a už má přesný kód, který byl sloučen)
  4. Vytáhl poslední main a rebased feature-a na vrcholu to

Jak se obával, git si stěžuje, že některé soubory jsou "oba upravené" nebo "jak kdy". To samo o sobě by být trochu nepříjemné, ale jednoduché to opravit. To, co dělá to neuvěřitelně matoucí - zejména pokud některý plynutí času uplynulo - je sloučit poznámky do souborů.

I když oba main a feature-a větve mají stejný kód ve všech souborech, jsem si super otravné chování:

  1. "Jak kdy" soubory, sloučit komentáře jsou přidány pro "HLAVU (Aktuální Změny)" a "rodič #HASH (commit message)". Jsem nucen vybrat jedno nebo druhé, i když jsou přesně stejné!
  2. "Oba upravené" soubory, je to ještě horší. "HLAVA (Aktuální Změny)" ukazuje správný kód. Nicméně, "rodič #HASH (commit message)" oddíl ukazuje, polovina kódu. Znovu, i když obě větve mají všechny kód!! Já vám kluk ne, přijetí "příchozí změnit" (jako označené pomocí VS Code) bude odstranit kód, který je v obou pobočkách!

Kdybych udělal tyto změny v rychlém sledu za sebou, byl bych beznadějně ztracený a zmatený o tom, co git je mi ukazoval. To se skutečně stalo několikrát v minulosti, ale já jsem nemohl dát prst na to, co bylo špatně. Teď, když jsem se reprodukovat to a ověřil chování, jsem z toho úplně vedle sebe jako toho, co git dělá a jak se lidé vyrovnávají s tímto scénářem.

AKTUALIZACE 2

OK, chápu, proč to bude odstranit kód. Je to proto, že změny, které jsem provedl v feature-b byly v několika zavazuje, a ti se zavazuje skončil mačkán, když je sloučit, aby main došlo. To je bezpochyby zdrojem bolesti a důvod, proč se snažím zjistit, zdravější workflow.

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

Nejlepší odpověď

0

Já nejsem přesvědčen, že konečné sloučení/squash bude chaotický. Pokud se stejná změna se provádí v různých zavazuje, možná Git, můžete zjistit, že a být šťastný s ním.

Pokud si myslíte, že to bude chaotický, i když, co byste mohli udělat, je:

  1. Rebase vaše feature-a pobočky s feature-b nyní, tak, že vaše feature-a pobočka nyní zahrnuje dokončena funkce B a v-pokrok funkce, což je to, co potřebujete, aby dělat svou práci.
  2. Po feature-b dostane sloučeny do main větev, rebase feature-a na odevzdání bezprostředně před rozmačkaní se zavazují, že oni dělali pro funkci, B. To by mělo jít hladce.
  3. Na své feature-a větev, použijte git reset --soft X kde X je commit hash pro zmáčknutý spáchat udělali pro funkci B. Pak použijte git commit aby se spáchat. Teď máš zmáčknutý spáchat, jehož obsah se rovná aktuální stav vaší práce na funkce A. Ale to spáchat rodič je zavázat se, že přidané funkce B do hlavní větve, takže toto odevzdání je diff se, že rodič bude pouze obsahovat funkce,. A. To je v pořádku, aby i nadále pracovat na funkce v tomto bodě, nebo jen požádat o sloučení.

Mimochodem, jsem si naprosto jistý, že věci nemusí být tento chaotický pokud vaše organizace používá spojuje místo rebases přidat věci do hlavní větve. A pak tam by byl ve prospěch zachování skutečné historie kódu jsi pracoval, místo toho jen zachování této umělé historie.

2021-11-23 23:52:54

Aby bylo jasno, nechceme používat rebases - používáme zmáčknutý zavazuje. A jsem si na 99% jistý, že věci se být chaotický, jak jsem to zkoušel v minulosti. Git dostane strašně zmatený odlišné zavazuje dělat stejné změny. Jsem ochoten zkusit to znovu, a když hlásit :)
me--

@mi. jsem si jistý, zmáčknutý zavazuje je rebase
evolutionxbox

Rebasing znamená, pohybující se větve tak, že začíná jiný bod, který přepisuje historii, jak byl vyvinut. Rozdrcení znamená změnit celou větev do jen jeden commit, odhazovat historii, jak to bylo vyvinuto až na konečný výsledek.
David Grayson

@DavidGrayson viz můj aktualizované otázky pro vysvětlení chování vidím z git.
me--

OK. Svůj krok 4 ("Vytáhl poslední hlavní a rebased funkce-na to") je to, co ti způsobil bolest, takže to není něco, co bych doporučil dělat. Místo toho krok 4 ve své otázce, opakujte kroky 2 a 3 od moji odpověď.
David Grayson

Díky @DavidGrayson. Zdá se, že tak . . . pracné
me--

Jak jsem řekl ve své odpovědi, problém je způsoben tím, že člověk dělá vše čtení a stlačuje místo toho, aby prostě slučování.
David Grayson

V jiných jazycích

Tato stránka je v jiných jazycích

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