Malfari ŝanĝojn¶
Pli aŭ malpli frue vi volos reiri: forĵeti redakton, malprepari dosieron, aŭ
flankenmeti vian laboron por trakti ion urĝan. Git havas komandon por ĉiu kazo. Ĉi
tiu paĝo kovras la tri, kiujn vi vere bezonas — restore, reset kaj stash — kaj
gvidilon por elekti la ĝustan.
Kelkaj el ĉi tiuj forĵetas laboron
Forĵeti ŝanĝojn en la labordosierujo (git restore <dosiero>,
git reset --hard) definitive forigas tiujn ŝanĝojn: ili neniam estis
konfirmitaj, do Git ne povas revenigi ilin. Se vi dubas, preferu git stash,
kiu flankenmetas la laboron sen detrui ĝin.
git restore — forĵeti ŝanĝojn en la labordosierujo¶
Uzu restore por forĵeti redaktojn, kiujn vi ne konfirmis, kaj reiri al la
lasta konfirmita versio de dosiero.
$ git status
Changes not staged for commit:
modified: README.md
$ git restore README.md
$ git status
On branch main
nothing to commit, working tree clean
restore ankaŭ malpreparas dosieron (elprenas ĝin el la prepara zono, sed
konservas viajn redaktojn) per la opcio --staged:
git restore <dosiero>→ forĵeti nekonfirmitajn redaktojn de tiu dosiero.git restore --staged <dosiero>→ malprepari, sed konservi la redaktojn.
git reset — movi la montrilon de la branĉo¶
reset funkcias sur commit-oj kaj preparado, ne sur unuopaj redaktoj de
dosieroj. Ĝia plej ofta ĉiutaga uzo estas la mala direkto de add: malpreparado.
$ git add README.md
$ git reset README.md # malpreparas README.md (ekvivalentas al restore --staged)
Uzata kun commit, reset movas la montrilon de la nuna branĉo al pli frua
commit — forigante praktike de la branĉo la commit-ojn post ĝi. Kio okazas al la
ŝanĝoj en tiuj commit-oj dependas de la reĝimo:
| Reĝimo | Montrilo de branĉo | Prepara zono | Labordosierujo |
|---|---|---|---|
--soft |
retroiras | konserviĝas | konserviĝas |
--mixed (defaŭlta) |
retroiras | nuliĝas | konserviĝas |
--hard |
retroiras | nuliĝas | forĵetiĝas |
git reset --soft HEAD~1— malfaras la lastan commit-on sed konservas ĝiajn ŝanĝojn preparitaj, pretaj por rekonfirmo (bonega por korekti mesaĝon de commit aŭ dividi commit-on).git reset --mixed HEAD~1— malfaras la lastan commit-on kaj malpreparas ĝiajn ŝanĝojn, sed konservas ilin en viaj dosieroj.git reset --hard HEAD~1— malfaras la lastan commit-on kaj forĵetas ĝiajn ŝanĝojn. Rapida, kaj neinversigebla.
Ĉi tie HEAD~1 signifas "unu commit antaŭ la nuna".
--hard kaj kunhavigita historio
Neniam faru reset de commit-oj, kiujn vi jam puŝis kaj kunhavigis kun
aliaj: vi reskribas historion, kiun ili jam havas, kaj ilia sekva pull
konfliktos. Sur kunhavigitaj branĉoj, malfaru commit-on per git revert (kiu
registras novan commit-on, kiu malfaras malnovan) anstataŭe.
git stash — flankenmeti ŝanĝojn¶
Foje vi estas en la mezo de io, kiam vi bezonas puran labordosierujon tuj — por
fari pull, por ŝanĝi branĉon, aŭ por provi rapidan riparon. stash kaŝas viajn
nekonfirmitajn ŝanĝojn sekure kaj redonas al vi puran arbon.
$ git stash
Saved working directory and index state WIP on main: 92c1041 Add project skeleton
$ git status
On branch main
nothing to commit, working tree clean
Viaj ŝanĝoj ne perdiĝas — ili estas sur stako. Revenigu ilin kiam vi estas preta:
git stash→ konservi la ŝanĝojn kaj purigi la labordosierujon.git stash list→ vidi kion vi stash-is.git stash pop→ reapliki la lastan stash-on kaj forigi ĝin.git stash drop→ forĵeti stash-on sen apliki ĝin.
Male al reset --hard, stash estas sekura: nenio detruiĝas, do ĝi estas la
ĝusta unua reflekso kiam ajn vi nur bezonas parkumi vian laboron por momento.
Kiun mi bezonas?¶
| Via situacio | Komando |
|---|---|
| Mi redaktis dosieron kaj volas forĵeti la redakton | git restore <dosiero> |
| Mi preparis dosieron erare | git restore --staged <dosiero> (aŭ git reset <dosiero>) |
| Mi volas refari mian lastan commit-on (mesaĝon, aŭ aldoni dosieron) | git reset --soft HEAD~1 |
| Mi bezonas puran arbon tuj sed volas revenigi mian laboron poste | git stash → git stash pop |
| Mi volas malfari commit-on, kiun mi jam puŝis | git revert <commit> |
La ĝenerala regulo de sekureco antaŭ ĉio
Se la ŝanĝo estas konfirmita, vi preskaŭ ĉiam povas revenigi ĝin, do malfari
estas sekure. Se ĝi estas nekonfirmita, Git ne havas kopion — do faru
stash antaŭ ol fari ion detruan.
Kien iri poste¶
- Ekzemplo — kompleta trairo, kiu kunigas commit-ojn, branĉojn kaj kunfandojn.