Dacă vă defalcăm problema, trebuie să:
- Split 4 (E,F,G,H) comite din Foo în 2 ramuri, Foo va avea doar: E, G, dar Bar va avea toate 4, E -> G -> F -> H.
- Eliminați unele comiteri: adică pe Foo, eliminați comiterea F și H.
- Nu sunt sigur dacă doriți să „reordonați” comenzile pe bara de ramură, adică să aveți E,G,F,H --> Presupun că acest lucru nu rezolvă niciun scop, așa că o voi lăsa din răspunsul meu.
Există multe moduri de a face acest lucru, dar o voi menține în cel mai simplu flux la care mă pot gândi, deoarece sunteți nou în git. deci, să ne uităm la împărțirea ramurii:
Din Foo actual (cap = H) faceți git checkout -b Bar
Acest lucru va crea bara de ramură cu comite E, F, G, H
Acum, există două moduri prin care vă puteți reseta sucursala Foo:
#1 Aruncați Foo și recreați-l git branch -D Foo
(pentru a șterge din local) git push origin :Foo
(pentru a șterge de la distanță, dacă ați făcut deja a împins-o)
Apoi trebuie să creați un nou Foo din comiterea „C” a maestrului dumneavoastră:
git checkout -b Foo <CommitIdShaForC>
Apoi puteți alege cherry-commit-urile E și G fie din git gui făcând gitk Bar
și apoi făcând clic dreapta pe commit și alegând cherry-pick, fie din consolă:
git cherry-pick <Commit Id for E> <Commit Id for G>
În cazul problemelor legate de îmbinare, consultați acest răspuns
#2 Anulați comiterile de la Foo Dacă nu vă deranjează să aveți istoricul F și H în foo, puteți pur și simplu să le anulați în git, în esență, git creează un patch invers al comenzilor dvs. F și H și le aplică ca noi comiteri:
- Ești pe ramura
Foo
și are E -> F -> G -> H
git revert F
- Ramura dvs. ar trebui să arate acum
E -> F -> G -> H -> F'
unde F' anulează ceea ce a adăugat commit-ul F
git revert H
ar duce la: E -> F -> G -> H -> F' -> H'
al cărui rezultat final în codul sursă ar fi: la fel ca a avea doar comite E și G.
Ca alternativă, puteți folosi indicatorul --no-commit pe git revert pentru a reveni atât F, cât și H într-o comitere:
git revert --no-commit F
git revert --no-commit H
git commit -a -m "reverting commits F and H"
Aceasta ar duce la:
E -> F -> G -> H -> I
unde I este commit-ul care anulează F și H
#Actualizare 1 După ce am scris un răspuns lung, văd că OP dorește să aibă „o parte din comisioane” în câteva ramuri. Pentru acest caz, aș recomanda cu căldură o rebază interactivă, astfel încât commit-urile să poată fi împărțite. Consultați documentația oficială despre git rebase, în special secțiunea despre „ Împărțirea comisiilor”. De asemenea, cred că veți găsi această întrebare deosebit de utilă
person
dubes
schedule
23.05.2016
Foo
, iar G H sa mutat înBar
? - person choroba   schedule 23.05.2016git --cherry-pick
pentru asta - person Vishwanath   schedule 23.05.2016git checkout Foo;git reset E --hard;git cherry-pick G;git checkout -b Bar Foo;git cherry-pick F;git cherry pick H
Foo este ABCEG', Bar este ABCEG'F'H'. - person ElpieKay   schedule 23.05.2016