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ď č. 1Zdá 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 ofmaster
(a označtespecific_feature
pobočka akotmp
) - zlúčiť
Y
(poslednýnew_feature
záväzok, ktorý bol zlúčený vspecifc_feature
) do novéhospecific_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.