segunda-feira, 13 de junho de 2016

2.2 Bazoj de Git - registri ŝanĝojn en la deponejo

2.2 Bazoj de Git - registri ŝanĝojn en la deponejo

Vi havas oston fidatan Git-deponejon KAJ elprenon AU laborkopion de La dosieroj Bonvolu ke Tiu Projekto. Vi bezonas Fari iujn ŝanĝojn KAJ enmeti momentbildojn de tiuj ŝanĝoj en Vian deponejon ĉiufoje KIAM la Projekto atingas Staton kiun vi volas registri.
Memoru Ke CiU dosiero eo tra labordosierujo povas Esti eo Unu el du statoj: sekvata au nesekvata. Sekvataj dosieroj is dosieroj kiuj estIS eo La antaŭa momentbildo; Aŭ povas Esti neŝanĝitaj, ŝanĝitaj, au preparataj. Nesekvataj dosieroj is ĉio alie - ĉiuj dosieroj eo tra labordosierujo kiuj ne estIS eo tra Lasta momentbildo KAJ kiuj ne is eo tra preparejo. KIAM VI Unue klonas deponejon, ĉiuj viaj dosieroj estos sekvataj KAJ neŝanĝitaj ĉar-vi jus elprenis Ilin KAJ Nenion redaktis.
Kiel redakti dosierojn, Git vidas ilin kiel modifita, ĉar vi ŝanĝis ilin ekde via lasta faras. Vi enscenigi tiujn modifita dosierojn kaj tiam fari vian tutan enscenigita ŝanĝojn, kaj la ciklo ripetas. Tiu ciklo de vivo estas ilustrita en Figuro 2-1.

Figuro 2-1. La ciklo de vivo de la statuso de via dosierojn.

Kontrolanta la Statuso de Via Dosieroj

La ĉefa ilo uzas por determini kiu dosieroj estas en kio stato estas la git status komando. Se vi kuri ĉi komando rekte post klono, vi devus vidi ion tiel:
 $ git status # On branch master nothing to commit, working directory clean 
Tiu signifas ke vi havas puran labordosierujon - alivorte, ne spurita dosieroj modifita. Git ankaŭ ne vidas ian senspura dosierojn, aŭ ili estus listigitaj tie. Fine, la ordono diras vin kio branĉo vi estas sur. Nuntempe, kiu ĉiam master , kiu estas la defaŭlta; Vi ne maltrankviliĝu pri tio ĉi tie. La sekva ĉapitro iros branĉoj kaj referencoj detale.
Imagu ke vi aldonas novan dosieron al via projekto, simpla README dosiero. Se la dosiero ne ekzistis antaŭ kaj vi kuros git status , komprenu vian senspura dosiero kiel tia:
 $ vim README $ git status # On branch master # Untracked files: # (use "git add <file>..." to include in what will be committed) # # README nothing added to commit but untracked files present (use "git add" to track) 
Vi povas vidi ke via nova README dosiero estas senspura, ĉar ĝi estas sub la "senspura dosierojn" rubriko en via statuso eligo. Senspura esence signifas ke Git vidas dosieron vi ne havis en la antaŭa instantánea (commit); Git ne komencos inkluzivanta ĝin en via commit instantáneas ĝis vi eksplicite sciigi tion fari. Ĝi ĉi tiel vi ne hazarde komenci inkluzive generita binarajn dosierojn aŭ aliajn dosierojn kiujn vi ne intencis inkluzivi. Vi volas komenci inkluzive README, do ni komencu spuras la dosiero.

Spuranta Novaj dosieroj

Por komenci spuri nova dosiero, vi uzu la komandon git add . Komenci spuri la README dosiero, vi povas kuri ĉi:
 $ git add README 
Se vi kuras vian statuson komando denove, vi povas vidi ke via README dosiero estas nun spuritaj kaj enscenigis:
 $ git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # new file: README # 
Vi povas diri ke ĝi estas enscenigita ĉar ĝi estas sub la "Ŝanĝoj esti internigita" rubriko. Se vi fari en ĉi tiu punkto, la versio de la dosiero je la tempo vi kuris git add estas kio estos en la historia instantánea. Vi eble memoras, ke kiam vi kuris git init antaŭe, vi tiam kuris git add (files) - kiuj estis komenci spuri dosierojn en via dosierujo. La git add komando prenas vojon nomo por ĉu dosiero aŭ dosierujo; se ĝi estas dosierujo, la komando aldonas ĉiujn dosierojn en tiu dosierujo rekursie.

Enscenigante Modifita dosieroj

Ni ŝanĝas dosieron kiu estis jam spurita. Se vi ŝanĝas antaŭe spurita dosiero nomata benchmarks.rb kaj poste ekzekuti vian status komando denove, vi ricevas iun kiu aspektas kiel ĉi:
 $ git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # new file: README # # Changes not staged for commit: # (use "git add <file>..." to update what will be committed) # # modified: benchmarks.rb # 
La benchmarks.rb dosiero aperas sub sekcion nomita "Ŝanĝoj ne enscenigita por fari" - kio signifas ke dosiero ke estas spurita estis modifita en la laboranta dosierujo sed ankoraŭ enscenigita. Enscenigi ĝin, vi kuras la git add komandon (estas ĝeneralvalida komando - vi uzas ĝin por komenci spuri novajn dosierojn, enscenigi dosierojn, kaj fari aliajn aferojn kiel markiloj kunfandi-konfliktis dosieroj kiel solvitaj). Ni kuras git add nun enscenigi la benchmarks.rb dosiero kaj poste ekzekuti git status denove:
 $ git add benchmarks.rb $ git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # new file: README # modified: benchmarks.rb # 
Ambaŭ dosieroj estas enscenigita kaj iros en vian proksima commit. Ĉe tiu punkto, supozas vi memoras unu malgranda ŝanĝo kiu vi deziras fari en benchmarks.rb antaŭ kompromiti ŝin. Vi malfermas ĝin denove kaj fari ke ŝanĝo, kaj vi pretas fari. Tamen, ni kuros git status pli tempo:
 $ vim benchmarks.rb $ git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # new file: README # modified: benchmarks.rb # # Changes not staged for commit: # (use "git add <file>..." to update what will be committed) # # modified: benchmarks.rb # 
Kio diable? Nun benchmarks.rb estas listigita kiel kaj enscenigis kaj unstaged. Kiel tio eblas? Ĝi rezultas ke Git enscenigas dosiero precize kiel ĝi estas kiam vi kuros la git add komandon. Se vi faras nun, la versio de benchmarks.rb kiel ĝi estis kiam vi laste kuris la git add komando estas kiel iros en la commit, ne la versio de la dosiero tiam aspektas en via laboranta dosierujo kiam vi kuros git commit . Se vi modifas dosieron post vi kuras git add , vi devas kuri git add denove por enscenigi la lasta versio de la dosiero:
 $ git add benchmarks.rb $ git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # new file: README # modified: benchmarks.rb # 

ignorante Dosieroj

Ofte, vi havos klason de dosieroj kiujn vi ne volas Git por aŭtomate aldoni aŭ eĉ montri vin kiel estante senspura. Tiuj estas ĝenerale aŭtomate generita dosieroj kiel log dosierojn aŭ dosierojn produktita de via muntaĵo sistemo. En tiaj kazoj, Vi povas krei dosieron printi ŝablonoj parigi ilin nomis .gitignore . Jen ekzemplo .gitignore dosieron:
 $ cat .gitignore *.[oa] *~ 
La unua linio diras Git ignori neniun dosieroj finiĝantaj je .o.a - objekto kaj arkivo dosierojn kiuj povas esti la produkto de konstruado via kodo. La dua linio diras Git ignori ĉiuj dosieroj kiuj finiĝas per tildo ( ~ ), kiu estas uzita de multaj eldonistoj de teksto kiel Emakso marki temporal dosierojn. Vi ankaŭ povas inkluzivi log , tmp , aŭ pid dosierujo; aŭtomata dokumentado; kaj tiel plu. Starigante .gitignore dosieron antaŭ vi akiri iron estas ĝenerale bona ideo do vi ne hazarde faras dosierojn kiuj vi vere ne volas en via Git-deponejo.
La reguloj por la ŝablonoj vi povas meti en la .gitignore dosiero estas kiel sekvas:
  • Malplenajn liniojn aŭ linioj komencante kun # estas ignoritaj.
  • Norma glob ŝablonoj labori.
  • Vi povas fini ŝablonoj kun antaŭen oblikvo ( / ) specifi dosierujon.
  • Vi povas nei mastro komencante ĝin kun krio punkto ( ! ).
Glob padronoj estas kiel simpligita regulesprimoj ke konkoj uzi. Asterisko ( * ) egalas nulo aŭ pli karakteroj; [abc] egalas ajnan karakteron ene la krampoj (en tiu kazo a , b , aŭ c ); demandosigno ( ? ) egalas sola karaktero; kaj krampoj enmetanta karakteroj apartigitaj per streketo ( [0-9] ) egalas ajnan karakteron en la gamo (en tiu kazo 0 tra 9).
Jen alia ekzemplo .gitignore dosieron:
 # a comment - this is ignored # no .a files *.a # but do track lib.a, even though you're ignoring .a files above !lib.a # only ignore the root TODO file, not subdir/TODO /TODO # ignore all files in the build/ directory build/ # ignore doc/notes.txt, but not doc/server/arch.txt doc/*.txt # ignore all .txt files in the doc/ directory doc/**/*.txt 
A **/ padrono estas havebla en Git ekde versio 1.8.2.

Rigardas Via enscenigita kaj Unstaged Ŝanĝoj

Se la git status komando estas tro pigraj por vi - vi volas scii ĝuste kion vi ŝanĝiĝis, ne nur kiu dosieroj estis ŝanĝita - vi povas uzi la git diff komando. Ni kovras git diff en pli detalo poste; sed vi verŝajne uzi ĝin plej ofte por respondi tiujn du demandojn: Kion vi ŝanĝiĝis sed ankoraŭ enscenigita? Kaj kion vi enscenigita ke vi intencas fari? Kvankam git status respondas tiuj demandoj tre ĝenerale, git diff montras la ĝusta linioj aldonitaj kaj forigitaj - la diakilo, kiel ĝi estis.
Imagu ke vi redaktu kaj enscenigi la README dosiero denove kaj tiam redakti la benchmarks.rb dosiero sen enscenigante ĝin. Se vi kuras vian status komando, vi denove vidos ion kiel jene:
 $ git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # new file: README # # Changes not staged for commit: # (use "git add <file>..." to update what will be committed) # # modified: benchmarks.rb # 
Vidi kion vi ŝanĝis sed ankoraŭ enscenigita, tipo git diff sen aliaj argumentoj:
 $ git diff diff --git a/benchmarks.rb b/benchmarks.rb index 3cb747f..da65585 100644 --- a/benchmarks.rb +++ b/benchmarks.rb @@ -36,6 +36,10 @@ def main @commit.parents[0].parents[0].parents[0] end + run_code(x, 'commits 1') do + git.commits.size + end + run_code(x, 'commits 2') do log = git.commits('master', 15) log.size 
Ke komando komparas kio estas en via labordosierujon kun kio estas en via surscenigo areo. La rezulto diras vin la ŝanĝojn vi faris ke vi ankoraŭ ne enscenigis.
Se vi deziras vidi kion vi enscenigita kiu iros en vian proksima commit, vi povas uzi git diff --cached . (En Git versioj 1.6.1 kaj poste, vi povas uzi ankaŭ git diff --staged , kiu povas esti facile memori.) Tiu komando komparas vian enscenigita ŝanĝojn lasta faras:
 $ git diff --cached diff --git a/README b/README new file mode 100644 index 0000000..03902a1 --- /dev/null +++ b/README2 @@ -0,0 +1,5 @@ +grit + by Tom Preston-Werner, Chris Wanstrath + http://github.com/mojombo/grit + +Grit is a Ruby library for extracting information from a Git repository 
Estas grave noti, ke git diff per sin ne montras ĉiuj ŝanĝoj faritaj post via lasta commit - nur ŝanĝojn kiuj estas ankoraŭ unstaged. Tio povas esti konfuza, ĉar se vi enscenigita ĉiujn viajn ŝanĝojn, git diff donos vin nenian eliron.
Por alia ekzemplo, se vi enscenigi la benchmarks.rb dosieron kaj poste redakti ĝin, vi povas uzi git diff vidi la ŝanĝojn en la dosiero, kiu estas enscenigita kaj la ŝanĝoj kiuj unstaged:
 $ git add benchmarks.rb $ echo '# test line' >> benchmarks.rb $ git status # On branch master # # Changes to be committed: # # modified: benchmarks.rb # # Changes not staged for commit: # # modified: benchmarks.rb # 
Nun vi povas uzi git diff vidi kio estas ankoraŭ unstaged
 $ git diff diff --git a/benchmarks.rb b/benchmarks.rb index e445e28..86b2f7c 100644 --- a/benchmarks.rb +++ b/benchmarks.rb @@ -127,3 +127,4 @@ end main() ##pp Grit::GitRuby.cache_client.stats +# test line 
kaj git diff --cached vidi kion vi enscenigita ĝis nun:
 $ git diff --cached diff --git a/benchmarks.rb b/benchmarks.rb index 3cb747f..e445e28 100644 --- a/benchmarks.rb +++ b/benchmarks.rb @@ -36,6 +36,10 @@ def main @commit.parents[0].parents[0].parents[0] end + run_code(x, 'commits 1') do + git.commits.size + end + run_code(x, 'commits 2') do log = git.commits('master', 15) log.size 

Farado Via Ŝanĝoj

Nun ke via surscenigo areo estas starigita la vojo vi deziras ĝin, vi povas fari viajn ŝanĝojn. Memoru ke io, kio estas ankoraŭ unstaged - ajna dosierojn vi kreis aŭ modifis ke vi ne kuras git add sur ĉar vi redaktis ilin - ne iros en tiun faris. Ili restos kiel modifita dosierojn sur via disko. En tiu kazo, la lasta tempo vi kuris git status , vi vidis ke ĉio estis enscenigitaj, tiel vi pretas fari viajn ŝanĝojn. La plej simpla maniero por fari estas tajpi git commit :
 $ git commit 
Faranta ĵetas via redaktoro de elekto. (Tiu estas fiksita de via ŝelo de $EDITOR Mediovariablo - kutime vim aux emacs, kvankam vi povas agordi ĝin kun kio ajn vi volas uzi la git config --global core.editor komando kiel vi vidis en ĉapitro 1).
La redaktilo montras la sekvan tekston (tiu ekzemplo estas Vim ekrano):
 # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # new file: README # modified: benchmarks.rb ~ ~ ~ ".git/COMMIT_EDITMSG" 10L, 283C 
Vi povas vidi ke la defaŭlta commit mesaĝo enhavas la lastan produktadon de la git status komando komentis ekstere kaj unu malplena linio supre. Vi povas forigi tiujn komentojn kaj tajpi vian commit mesaĝon, aŭ vi povas lasi ilin tie por helpi vin memori kion vi faras. (Por eĉ pli eksplicitaj recordatorio de kio vi jam redaktita, vi povas pasi la -v eblon git commit . Farante tiel ankaŭ metas la malsamoj de via ŝanĝo en la redaktilo tiel vi povas vidi ĝuste kion vi faris.) Kiam vi eliro la redaktoro, Git kreas vian kompromiti kun kiuj faras mesaĝo (kun la komentoj kaj malsamoj senvestigis eksteren).
Alternative, vi povas tajpi vian commit mesaĝon inline kun la commit komando por preciziganta ĝin post -m flago, tiel:
 $ git commit -m "Story 182: Fix benchmarks for speed" [master]: created 463dc4f: "Fix benchmarks for speed" 2 files changed, 3 insertions(+), 0 deletions(-) create mode 100644 README 
Nun vi kreis vian unuan faras! Vi povas vidi ke la commit donis vin kelkaj eligo pri si: kiu branĉo vi faris al ( master ), kio SHA-1 checksum la commit havas ( 463dc4f ), kiom da dosieroj estis ŝanĝita, kaj statistikon pri linioj aldonitaj kaj forigitaj en la fari.
Memoru ke la commit rekordojn la instantánea vi instalis en via surscenigo areo. Io vi ne enscenigi ankoraŭ tie sidis modifita; Vi povas fari alian fari aldoni ĝin al via historio. Ĉiufoje vi elfari commit, vi registrado ekrankopion de via projekto kiu povas restarigu aux kompari al posta.

Saltante la Staging Area

Kvankam povas esti mirinde utila por crafting interna ekzakte kiel vi volas ilin, la surscenigo areo estas kelkfoje iom pli kompleksa ol vi bezonas en via laborfluo. Se vi volas salti la surscenigo areo, Git provizas simplan serĉpeton. Havigante la -a eblo la git commit komando faras Git aŭtomate enscenigi ĉiu dosiero kiu jam spurita antaŭ fari la commit, lasanta vi saltas la git add parto:
 $ git status # On branch master # # Changes not staged for commit: # # modified: benchmarks.rb # $ git commit -a -m 'added new benchmarks' [master 83e38c7] added new benchmarks 1 files changed, 5 insertions(+), 0 deletions(-) 
Rimarku kiel vi ne devas kuri git add sur la benchmarks.rb dosiero tiukaze antaŭ kompromiti.

forigante dosieroj

Forigi dosiero de Git, vi devas forigi ĝin de via spuritaj dosierojn (pli precize, forigi ĝin de via surscenigo areo) kaj poste fari. La git rm komando faras tion kaj ankaŭ forigas la dosieron el via laboro dosierujo do vi ne vidas kiel senspura dosiero venontan fojon ĉirkaŭe.
Se vi simple forigas la dosieron el via laboro dosierujo, ĝi aperas sub la "Ŝanĝoj ne enscenigita por fari" (te unstaged) areo de via git status eligo:
 $ rm grit.gemspec $ git status # On branch master # # Changes not staged for commit: # (use "git add/rm <file>..." to update what will be committed) # # deleted: grit.gemspec # 
Tiam, se vi kuros git rm , ĝi enscenigas la dosiero forigo:
 $ git rm grit.gemspec rm 'grit.gemspec' $ git status # On branch master # # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # deleted: grit.gemspec # 
La sekvanta tempo vi faras, la dosiero estos irita kaj ne plu spurita. Se vi modifis la dosieron kaj aldonis ĝin al la indekso jam, vi devas devigi la forigon de la -f opcion. Jen sekureco karakterizaĵo por preventi akcidentan forigo de datumoj kiuj ne jam estas registrita en instantánea kaj kiu ne povas esti reakirita de Git.
Alia utila afero vi eble volas fari estas teni la dosieron en via laboranta arbo sed forigi ĝin de via surscenigo areo. Alivorte, vi eble volas konservi la dosieron en via malmola disko sed ne havas Git spuri ĝin anymore. Ĉi tio estas aparte utila se vi forgesis aldoni ion al via .gitignore dosieron kaj hazarde enscenigis ĝin, kiel granda efikado aŭ faskon de .a kompilita dosierojn. Por fari tion, uzu la --cached eblo:
 $ git rm --cached readme.txt 
Vi povas pasi dosieroj, dosierujoj, kaj dosier-glob padronoj al la git rm komando. Tio signifas ke vi povas fari aferojn kiel
 $ git rm log/\*.log 
Notu la backslash ( \ ) antaŭ la * . Tio estas necesa ĉar Git faras lian propran dosiernomo ekspansio krom via ŝelo la dosiernomo ekspansio. Sur Vindozo kun la sistemo konzolo, la backslash devas esti preterlasita. Tiu komando forigas ĉiujn dosierojn kiuj havas la .log etendo en la log/ dosierujo. Aŭ vi povas fari ion kiel jene:
 $ git rm \*~ 
Tiu komando forigas ĉiujn dosierojn kiuj finiĝas per ~ .

moviĝanta Dosieroj

Malkiel multaj aliaj VCS sistemoj, Git ne eksplicite spuri dosiero movado. Se vi renomi dosiero en Git, neniu metadatenoj estas stokita en Git kiu rakontas lin al vi renomis la dosieron. Tamen, Git estas sufiĉe inteligenta pri imagante ke post la fakto - ni trakti detekti dosiero movado iom poste.
Tiel ĝi estas iom malklara ke Git havas mv komando. Se vi volas renomi dosiero en Git, vi povas kuri kvazaux
 $ git mv file_from file_to 
kaj ĝi funkcias bone. Fakte, se vi kuri io tiamaniere kaj rigardi la statuson, vi vidos ke Git konsideras ĝin renomita dosieron:
 $ git mv README.txt README $ git status # On branch master # Your branch is ahead of 'origin/master' by 1 commit. # # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # renamed: README.txt -> README # 
Tamen, ĉi tiu estas ekvivalento al kuri io tiamaniere:
 $ mv README.txt README $ git rm README.txt $ git add README 
Git figuroj el kiuj ĝi estas renomi implice, do ne gravas se vi alinomi dosieron kiu maniero aŭ kun la mv komando. La nura reala diferenco estas ke mv estas unu komando anstataŭ tri - ĝi estas oportuno funkcio. Pli grava, oni povas uzi ajnan ilon vi ŝatus alinomi dosieron, kaj trakti la add / rm poste, antaŭ kompromiti.

Nenhum comentário:

Postar um comentário