/ / Zlúčiť rozdiel medzi dvoma vetvami s treťou vetvou - git, diff

Zlúčiť rozdiel medzi dvoma vetami do tretej vetvy - git, diff

Predpokladajme, že mám dve vetvy, master a new_feature

Mal som pracovať na konkrétnej funkcii, myslel som si, že táto funkcia bude súčasťou new_feature tak som sa odhlásil specific_feature vetva z new_feature filiálka, tak ako

git checkout -b specific_feature

Teraz som v tomto urobil veľa vývoja specific_feature pobočka, zlúčená upstream/new_feature do nej niekoľkokrát, aby ste dostali vzdialené zmeny.

Teraz prichádzam na to, že môj specific_feature malo byť rozdelené z master nie new_feature, (new_feature pobočka nie je pripravená na tlačenie)

Existuje spôsob, ako môžem vziať rozdiel medzi mojimi specific_feature pobočka a new_feature pobočka a aplikovať tieto zmeny na novú pobočku specific_feature_master (rozvetvené z pána)?

odpovede:

4 pre odpoveď č. 1

Zdá sa, že to je práca git rebase --onto:

git rebase --onto master new_feature specific_feature

To bude trvať iba na záväzkoch po new_feature až do specific_feature HLAVU a prehrajte ich do master.

Všimnite si, že potom budete musieť vynútiť push specific_feature proti prúdu (ak ste to už predtým tlačili): git push --force specific_feature.

To môže byť problém, ak už ostatní pobočku natiahli a pracujú na nej.


davidriod správne poukazuje na to, že:

Nemyslím si, že to bude fungovať, pretože OP bol zlúčený niekoľkokrát upstream/new_feature pobočka v pobočke specific_feature

ak new_feature nebol nikdy aktualizovaný (iba načítať, nikdy neťahať), potom to môže ešte fungovať.
ak new_feature bol aktualizovaný (načítať) a zlúčený do specific_feature, potom rebase --onto bude hrať iba niekoľko posledných záväzkov od posledného zlúčenia: iba tu z" potvrdia sa znova, nie prvý z.

x--x--x

y--y--Y--y--y (new_feature)
  
z--M--z"--z" (specific_feature)

Namiesto zberu čerešní by som:

  • urobiť specific_feature out of master (a označte specific_feature pobočka ako tmp)
  • zlúčiť Y (posledný new_feature záväzok, ktorý bol zlúčený v specifc_feature) do nového specific_feature vetva

to je:

git checkout -b tmp specific_feature
git checkout -B specific_feature master
git merge $(git merge-base tmp new_feature) # that merges Y

----------M (specific_feature)
/         /
x--x--x         /
       /
y--y--Y--y--y (new_feature)
  
z--M--z"--z" (tmp)

Potom rebase --onto môže používať toho istého spoločného predka Y ako správny základ:

git rebase --onto specific_feature $(git merge-base tmp new_feature) tmp
git branch -D tmp

----------M--z""--z"" (specific_feature)
/         /
x--x--x         /
       /
y--y--Y--y--y (new_feature)

1 pre odpoveď č. 2

Môžete použiť príkaz git cherry na získanie potvrdenia vykonaného vo vetve specific_feature, ktoré sa vo vetve origin / new_feature neobjaví.

git cherry origin/new_feature specific_feature

Potom môžete vytvoriť novú vetvu z hlavnej ačerešňa - vyberte všetky tieto záväzky. Ale ak máte závislosť medzi vývojom na specific_feature a origin / new_feature, žiadny scm to za vás nevyrieši.

git checkout -b specific_feature_master master
git cherry origin/new_feature specific_feature | egrep "^+" | awk "{print $2} | xargs git cherry-pick

Niečo také by malo slúžiť ako východiskový bod na vyriešenie vášho problému.