Stie cineva cum pot anula un git de rebazare?
Singurul mod în care îmi vine în minte este de a merge la manual:
În situația mea actuală va funcționa pentru că puteți fața locului cu ușurință comite din ambele ramuri (una a fost de lucrurile mele, celelalte mi-a fost coleg's chestii).
Cu toate acestea abordarea mea, mi se pare sub nivelul optim și predispuse la erori (let's a spus am avut doar indexat cu 2 de propria mea ramuri).
Orice idei?
Clarificare: am'm vorbit despre o schimbare de bază în care o grămadă de comite au fost reluate. Nu numai unul.
Cel mai simplu mod ar fi de a găsi capul comite de sucursala, care a fost imediat înainte de rebazare a început în reflog...
git reflog
și pentru a reseta ramura curentă la ea (cu limitări obișnuite despre a fi absolut sigur că înainte de resetarea cu greu
opțiune).
Să presupunem că vechiul comite fost CAPUL lui@{5}` în ref log:
git reset --hard HEAD@{5}
În Windows, aveți nevoie pentru a cita de referință:
git reset --hard "HEAD@{5}"
Puteți verifica istoricul de candidat vechi cap de a face doar un git log CAP@{5}
(Windows: git log "CAP@{5}"
).
Daca'am dezactivat pe ramură reflogs ar trebui să fie capabil de a face pur și simplu git reflog branchname@{1}
ca o rebazare se desprinde ramura cap înainte de reconectarea la final cap. Aș verificați acest lucru, deși am't verificat recent.
Implicit, toate reflogs sunt activate pentru non-goale centrale de tranzacții:
[core]
logAllRefUpdates = true
De fapt, rebazare salvează punct de plecare pentru a ORIG_HEAD
deci, acest lucru este, de obicei, la fel de simplu ca:
git reset --hard ORIG_HEAD
Cu toate acestea, reset
, schimbare de bază " și "merge tot salvați original" ȘEF " pointer în
ORIG_HEAD` deci, daca'am făcut oricare dintre aceste comenzi de la rebazare te're încercarea de a anula atunci'll trebuie să utilizați reflog.
Charles's a răspunde funcționează, dar poate doriți pentru a face acest lucru:
git rebase --abort
pentru a curăța după "reset".
În caz contrar, s-ar putea obține mesajul ""Interactiv" rebazare început deja`".
`git reflog vă va arăta toate schimbările înainte și după schimbare de bază, și vă va permite de a găsi dreptul de unul pentru a reseta. Dar eu'm-a surprins nimeni nu a menționat acest alt mod super-simplu încă aici:
De asemenea, după cum sa menționat deja aici, rebazare frunze vechi stat ca ORIG_HEAD
, astfel încât să puteți reveni la ultima schimbare de bază de funcționare:
git reset --hard ORIG_HEAD
Resetarea ramură de marionetă comite obiect de vechiul sfat este, desigur, cea mai bună soluție, pentru că se restabilește starea anterioară fără cheltuind orice efort. Dar dacă se întâmplă să am pierdut acele comite (f.ex. pentru că de gunoi colectate tău depozit în timp, sau e un nou clona), puteți întotdeauna rebazare ramura din nou. Cheia pentru aceasta este `--pe comutator.
Să spunem că ai avut un subiect ramură imaginativ numit "subiect", care-ai desprins de "stăpân" atunci când vârful de "maestru" a fost 0deadbeef
a comis-o. La un moment dat, în timp ce pe "subiect" de ramură, ai
git rebase --onto 0deadbeef master topic
Aceasta va lua toate se angajează pe "subiect" care nu sunt pe "stăpân" și de a le reda pe partea de sus a 0deadbeef
.
Cu `--pe, puteți rearanja în istoria destul de mult orice formă de orice fel.
Distreaza-te. :-)
De fapt, am pus un backup tag pe ramura înainte de a face orice trivial operare (cel mai rebases sunt banale, dar nu'd face că, dacă se pare oriunde complexe).
Apoi, restaurarea este la fel de ușor ca git reset ... e greu de REZERVĂ
.
În cazul în care te-a împins ramură la depozit la distanță (de obicei's de origine) și apoi'am făcut-o succes rebazare (fără îmbinare) (git rebazare --abandonați
dă "Nici o schimbare de bază în curs de desfășurare"), puteți cu ușurință reset ramură utilizarea
comanda:
git reset ... e greu de origine/{branchName}
Exemplu:
$ ~/work/projects/{ProjectName} $ git status
On branch {branchName}
Your branch is ahead of 'origin/{branchName}' by 135 commits.
(use "git push" to publish your local commits)
nothing to commit, working directory clean
$ ~/work/projects/{ProjectName} $ git reset --hard origin/{branchName}
HEAD is now at 6df5719 "Commit message".
$ ~/work/projects/{ProjectName} $ git status
On branch {branchName}
Your branch is up-to-date with 'origin/{branchName}.
nothing to commit, working directory clean
Folosind reflog
n't de lucru pentru mine.
Ceea ce a funcționat pentru mine a fost similară a cum este descris aici. Deschideți fișierul în .git/busteni/ref numit după ramura asta a fost indexat și de a găsi linia care conține "rebazare finsihed", ceva de genul:
5fce6b51 88552c8f Kris Leech <[email protected]> 1329744625 +0000 rebase finished: refs/heads/integrate onto 9e460878
Checkout cel de-al doilea comis listate pe linie.
git checkout 88552c8f
Odată confirmat acest cuprinse meu pierdut schimbări am ramificat și lăsa să iasă un oftat de ușurare.
git log
git checkout -b lost_changes
Pentru mai multe comite, amintiți-vă că orice comite referințe toată istoria de până atunci a comis-o. Deci, în Charles' răspunde, citește "vechiul comite" ca "cea mai veche comite". Dacă resetați la care se angajează, apoi toată istoria de până atunci a comis-va reapărea. Acest lucru ar trebui să faci ce vrei.
În urma soluție de @Allan și @Zearin, aș vrea să pot face pur și simplu un comentariu, deși, dar nu't suficient de reputație, așa că am folosit următoarea comandă:
În loc de a face git rebazare -eu ... abandonați
(nota -i) am avut de a face pur și simplu git rebazare --abandonați
(fără la -i).
Folosind ambele -i " și " --abandonați
în același timp, cauzele Git sa-mi arate o listă de utilizare/opțiuni.
Deci mele anterioare și actuale ramură de stare cu această soluție este:
matbhz@myPc /my/project/environment (branch-123|REBASE-i)
$ git rebase --abort
matbhz@myPc /my/project/environment (branch-123)
$
Dacă indexate cu succes împotriva ramură de la distanță și nu poate git rebazare --abandonați
tu încă mai pot face unele trucuri pentru a salva munca ta și don't au forțat împinge.
Să presupunem că dumneavoastră curentă ramură care a fost indexat de greșeală este numit ta-ramură și este de urmărire de origine a/ta-filiala
git branch -m-ți-filiala-indexat
# redenumi ramură de curentgit checkout origine/ta-filiala
# checkout pentru cele mai recente stat, care este cunoscut pentru origineagit checkout -b-ramură
git log-filiala-indexat
, se compara cu git log-ramură și definească se angajează ca lipsesc de la ta-filiala
git cherry-pick COMMIT_HASH pentru fiecare comite in
ta-filiala-indexat`Las's spun eu rebazare maestrul meu caracteristică ramură și am 30 de noi se angajează, care rupe ceva. Am'am constatat că de multe ori l's simplu pentru a elimina doar rău comite.
git rebase -i HEAD~31
Interactive rebazare pentru ultimele 31 de comite (nu't rănit dacă te iei prea multe).
Pur și simplu să ia angajează pe care doriți să scapi de și marcați-le cu "d" în loc de "alege". Acum se angajează sunt șterse în mod eficient anularea rebazare (dacă eliminați doar se angajează trebuie doar atunci când rebasing).
Pentru începători/cineva prea speriat să fac un hard reset, ai putea checkout comite din reflog, și apoi salvați-l ca o nouă ramură.
git reflog
Găsi comite chiar înainte de a începe rebasing. Poate fi necesar să derulați mai jos să-l găsească (apăsați Enter sau PageDown). Ia act de CAP de serie și înlocuiți 57:
git checkout HEAD@{57}
Revizuire sucursala/se angajează, dacă arată bine a crea o nouă ramură folosind acest CAP:
git checkout -b new_branch_name
Dacă sunteți pe o ramură puteți folosi:
git reset --hard @{1}
Nu există doar o referință jurnal pentru CAP (obținute prin git reflog
), există, de asemenea, reflogs pentru fiecare ramură (obținut prin git reflog <branch>
). Deci, dacă sunteți pe "maestru" apoi git reflog de master va lista toate modificările la această sucursală. Puteți face referire la faptul că modificările de
master@{1}", " maestrul@{2}`, etc.
`git rebazare va schimba, de obicei, CAPUL de mai multe ori, dar curentul de ramură va fi actualizat doar o singură dată.
@{1}
este pur și simplu o shortcut pentru actuala sucursală, deci's egal cu `maestrul@{1} dacă sunteți pe "maestru".
git reset ... e greu ORIG_HEAD
nu va funcționa dacă ați folosit git reset
în timpul unei interactiv rebazare
.
Ceea ce fac de obicei este
git reset #commit_hash
la ultimul comite unde cred rebazare a avut nici un efect.
apoi git pull
Acum ramură ar trebui să se potrivească exact ca maestru și indexate se angajează nu ar trebui să fie în ea.
Acum, se poate alege angajează pe această ramură.
Dacă ai ceva mizerie într-un git de rebazare, de exemplu, git rebazare --abandonați
, în timp ce aveți neangajate fișiere, acestea vor fi pierdute și git reflog
nu va ajuta. Acest lucru s-a întâmplat cu mine și va trebui să se gândească în afara caseta de aici. Dacă ești norocos ca mine și de a folosi IntelliJ Webstorm atunci click-dreapta->istoria locală și poate reveni la o stare anterioară de fișiere/foldere, indiferent ce greșeli ai făcut cu versiuni de software. Este întotdeauna bun pentru a avea un alt mecanism de siguranță de funcționare.