Am comis într-o ramură, dar ar fi trebuit să comit în alta; cum să mut aceste comiteri în ramura corectă?
A. Ramura corectă încă nu există, adică fără a pierde din generalitate, putem considera că avem următoarea situație
(A) -- (B) -- (C) -- (D)
|
<ramura0>
|
HEAD
când de fapt ar fi trebuit să fie astfel:
+ -- (C) -- (D)
/ |
(A) -- (B) |
| |
<ramura0> <ramura1>
|
HEAD
Pentru a muta comiterile (C) și (D) în ramura <ramura1> trebuie în primul rând să creăm o ramură fără a ne comuta la ea:
git branch <ramura1>
apoi să excludem comiterile (C) și (D) din <ramura1> mutând capul pe părintele comiterii (C):
git reset --hard (B)
și în final trecem la ramura nou creată:
git checkout <ramura1>
B. Ramura corectă există, adică avem următoarea situație
+ -- (U) -- (V) -- (W) -- (X)
/ |
(A) -- (B) -- (C) -- (D) |
| |
<ramura0> <ramura1>
|
HEAD
când de fapt ar fi trebuit să fie astfel
+ -- (U) -- (V) -- (W) -- (X) -- (C) -- (D)
/ |
(A) -- (B) |
| |
<ramura0> <ramura1>
|
HEAD
Pentru a muta comiterile (C) și (D) în ramura <ramura1> trebuie să trecem în această ramură:
git checkout <ramura1>
și să integrăm modificările din ramura <ramura0> în ramura <ramura1>:
git merge <ramura0>
apoi să trecem în ramura <ramura0>:
git checkout <ramura1>
și să ‘’aruncăm’’ comiterile (C) și (D) din ramură mutând capul pe părintele comiterii (C):
git reset --hard <comiterea B>
după aceste operații putem trece la ramura <ramura1> pentru a continua lucrul:
git checkout <ramura1>
C. Ramura corectă există, dar nu putem integra direct ramura greșită în cea corectă
Putem presupune că avem următoarea situație
+ -- (U) -- (V) -- (W) --------- (X)
/ |
(A) -- (B) -- (C) -- (D) |
| |
<ramura0> <ramura1>
|
HEAD
când de fapt ar fi trebuit să fie astfel
+ -- (U) -- (V) -- (W) -- (X) -- (C) -- (D)
/ |
(A) -- (B) |
| |
<ramura0> <ramura1>
|
HEAD
Respectiv nu ne putem permite să integrăm ramura <ramura0> în ramura <ramura1> deoarece în rezultat comiterea (B) va nimeri în ramura <ramura1>.
Pentru a muta doar comiterile (C) și (D) în ramura <ramura1> trebuie să trecem în această ramură:
git checkout <ramura1>
și să integrăm doar comiterile (B) și (C):
git cherry-pick (B)
git cherry-pick --continue
git cherry-pick (C)
git cherry-pick --continue
apoi să trecem în ramura <ramura0>:
git checkout <ramura1>
și să ‘’aruncăm’’ comiterile (C) și (D) din ramură mutând capul pe părintele comiterii (C):
git reset --hard <comiterea B>
după aceste operații putem trece la ramura <ramura1> pentru a continua lucrul:
git checkout <ramura1>
Redenumirea unei ramuri se poate realiza folosind comanda:
git branch -m <denumirea veche> <denumirea nouă>
Dacă ramura cu denumirea veche a fost deja încărcată pe server, adică nu este prezentă doar local, va fi nevoie de a finaliza operațiile de mai sus cu încărcarea ramurii noi pe server:
git push origin [--set-upstream] <denumirea nouă>
și ștergerea celei vechi de pe server:
git push origin :<denumirea veche>
sau (începând cu versiunea 1.7.0 a lui Git) ștergerea ramurii vechi de pe server mai poate fi realizată și astfel:
git push origin --delete <denumirea veche>
A. Ștergerea unei ramuri locale
git branch -d <ramura locală>
B. Ștergerea unei ramuri pe server
git push origin :<ramura de pe server>
sau (începând cu versiunea 1.7.0 a lui Git) ștergerea ramurii vechi de pe server mai poate fi realizată și astfel:
git push origin --delete <ramura de pe server>
git push --all origin
Treceți pe ramura destinație (în care doriți să integrați):
git checkout <ramura destinație>
apoi rulați:
git merge <ramura sursă>
în caz de conflicte de integrare va afișat mesajul corespunzător care se va sfârși cu următoarea propoziție:
Automatic merge failed; fix conflicts and then commit the result.
și va trebui să înlăturați conflictele pentru a finaliza integrarea.