segunda-feira, 13 de junho de 2016

2.4 Bazoj de Git - Malfarante Aĵoj

2.4 Bazoj de Git - Malfarante Aĵoj

Pereaj Aĵoj

En iu stadio, eble vi volas malfari ion. Tie, ni revizii kelkaj bazaj iloj por malfarante ŝanĝoj kiujn vi faris. Estu zorgema, ĉar vi ne povas ĉiam restarigu iuj de tiuj undos. Tiu estas unu el la malmultaj areoj en Git kie vi povas perdi iun laboron se vi faras ĝin malĝuste.

Ŝanĝi Via Lasta Transdonu

Unu el la komunaj undos okazas kiam vi faras tro frua kaj eble forgesis aldoni kelkajn dosierojn, aŭ vi fuŝas vian commit mesaĝo. Se vi volas provi ke fari denove, vi povos kuri fari kun la --amend eblo:
 $ git commit --amend 
Tiu komando prenas vian surscenigo areo kaj uzas ĝin por la commit. Se vi faris neniun ŝanĝojn ekde via lasta faras (ekzemple, vi kuri ĉi komando tuj post via antaŭa faris), tiam via instantánea aspektos precize la samaj kaj ĉiuj vi ŝanĝas estas via commit mesaĝo.
Tion transdonu-mesaĝo redaktoro fajroj, sed ĝi jam enhavas la mesaĝon de via antaŭa fari. Vi povas redakti la mesaĝon la sama kiel ĉiam, sed overwrites via antaŭa fari.
Kiel ekzemplo, se vi faras kaj tiam rimarkas vi forgesis enscenigi la ŝanĝojn en dosiero vi volis aldoni al ĉi fari, Vi povas fari ion kiel jene:
 $ git commit -m 'initial commit' $ git add forgotten_file $ git commit --amend 
Post tiuj tri komandojn, vi finos kun sola fari - la dua faras anstataŭas la rezultoj de la unua.

Unstaging enscenigita Dosiero

La venontaj du sekcioj pruvi kiel disputados via surscenigo spaco kaj laborante dosierujo ŝanĝoj. La bela parto estas ke la komando uzas por determini la staton de tiuj du areoj ankaŭ memorigas vin kiel malfari ŝanĝojn al ili. Ekzemple, diru vi ŝanĝis du dosierojn kaj volas fari ilin kiel du apartaj ŝanĝoj, sed vi hazarde tajpi git add * kaj enscenigi ilin ambaŭ. Kiel vi unstage unu el la du? La git status komando memorigas vin:
 $ git add . $ git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # modified: README.txt # modified: benchmarks.rb # 
Dekstra sub la "Ŝanĝoj esti internigita" teksto, ĝi diras "uzo git reset HEAD <file>... al unstage". Do, ni uzas tiun konsilon al unstage la benchmarks.rb dosieron:
 $ git reset HEAD benchmarks.rb benchmarks.rb: locally modified $ git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # modified: README.txt # # Changes not staged for commit: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: benchmarks.rb # 
La komando estas iom stranga, sed ĝi funkcias. La benchmarks.rb dosiero estas modifita sed refoje unstaged.

Unmodifying modifita Dosiero

Kio, se vi rimarkas ke vi ne volas konservi viajn ŝanĝojn al la benchmarks.rb dosieron? Kiel vi povas facile unmodify ĝin - restarigu ĝin reen al kio ĝi aspektis kiel kiam vi laste faris (aŭ komence klonita, aŭ tamen vi havas ĝin en via labordosierujon)? Feliĉe, git status diras vin kiel fari tion ankaŭ. En la lasta ekzemplo eligo, la unstaged spaco aspektas jene:
 # Changes not staged for commit: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: benchmarks.rb # 
Ĝi diras vin bela eksplicite kiel forĵeti la ŝanĝojn vi faris (almenaŭ, la pli novaj versioj de Git, 1.6.1 kaj poste, do tio - se vi havas malnovan version, ni forte rekomendas altgradiganta ĝi akiri iuj de ĉi tiuj agrabla usabilidad karakterizaĵoj). Ni faras kion ĝi diras:
 $ git checkout -- benchmarks.rb $ git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # modified: README.txt # 
Vi povas vidi ke la ŝanĝoj estas revertido. Vi devus ankaŭ rimarkas ke ĉi tiu estas danĝera komando: ĉiuj ŝanĝoj vi faris al tiu dosiero estas for - vi ĵus kopiis alian dosieron pri ĝi. Ne ĉiam uzas tiun komandon se vi absolute scias ke vi ne volas la dosiero. Se vi nur bezonos akiri ĝin de la vojo, ni transiru stashing kaj branĉantaj en la sekva ĉapitro; tiuj estas ĝenerale pli bone manieroj iri.
Memoru, ion kiu estas farita en Git povas preskaŭ ĉiam esti rekuperita. Eĉ faras kiuj estis sur branĉoj kiuj forigita aŭ interna kiuj anstataŭigataj per --amend devigu eblas rekuperita (vidu Ĉapitro 9 por datumoj reakiro). Tamen, ion perdas, kiu estis neniam farita versxajne neniam esti vidita denove.

2.3 Bazoj de Git - Rigardante la Transdona Historio

2.3 Bazoj de Git - Rigardante la Transdona Historio

Montrante kiel Transdoni Historion

Post vi kreis plurajn interna, aŭ se vi klonita deponejo kun ekzistanta fari historion, vi probable volas rerigardi vidi kio okazis. La plej baza kaj potenca ilo por fari ĉi estas la git log komando.
Tiuj ekzemploj uzas tre simpla projekto nomita simplegit ke mi ofte uzas por manifestacioj. Akiri la projekto, kuri
 git clone git://github.com/schacon/simplegit-progit.git 
Kiam vi kuros git log en tiu projekto, vi devus akiri eliron kiu aspektas io tiamaniere:
 $ git log commit ca82a6dff817ec66f44342007202690a93763949 Author: Scott Chacon <schacon@gee-mail.com> Date: Mon Mar 17 21:52:11 2008 -0700 changed the version number commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 Author: Scott Chacon <schacon@gee-mail.com> Date: Sat Mar 15 16:40:33 2008 -0700 removed unnecessary test code commit a11bef06a3f659402fe7563abf99ad00de2209e6 Author: Scott Chacon <schacon@gee-mail.com> Date: Sat Mar 15 10:31:28 2008 -0700 first commit 
Defaŭlte, sen argumentoj, git log listigas la interna farita en tiu deponejo en inversa kronologia ordo. Tio estas, la plej lastatempa interna aperas unue. Kiel vi povas vidi, ĉi komando listoj ĉiu faras kun lia SHA-1 checksum, la aŭtora nomo kaj retpoŝto, la dato skribita kaj commit mesaĝo.
Grandega kvanto kaj vario de ebloj al la git log komando estas havebla montri vin ĝuste kio vi estas serĉanta. Tie, ni montros al vi kelkajn el la plej uzataj opcioj.
Unu el la pli utilaj ebloj estas -p , kiu montras la malsamoj enkondukitaj en ĉiu faras. Vi povas ankaŭ uzi -2 , kiu limigas la produktadon al nur la lastaj du eniroj:
 $ git log -p -2 commit ca82a6dff817ec66f44342007202690a93763949 Author: Scott Chacon <schacon@gee-mail.com> Date: Mon Mar 17 21:52:11 2008 -0700 changed the version number diff --git a/Rakefile b/Rakefile index a874b73..8f94139 100644 --- a/Rakefile +++ b/Rakefile @@ -5,5 +5,5 @@ require 'rake/gempackagetask' spec = Gem::Specification.new do |s| s.name = "simplegit" - s.version = "0.1.0" + s.version = "0.1.1" s.author = "Scott Chacon" s.email = "schacon@gee-mail.com commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 Author: Scott Chacon <schacon@gee-mail.com> Date: Sat Mar 15 16:40:33 2008 -0700 removed unnecessary test code diff --git a/lib/simplegit.rb b/lib/simplegit.rb index a0a60ae..47c6340 100644 --- a/lib/simplegit.rb +++ b/lib/simplegit.rb @@ -18,8 +18,3 @@ class SimpleGit end end - -if $0 == __FILE__ - git = SimpleGit.new - puts git.show -end \ No newline at end of file 
Tiu opcio vidigas la saman informon sed kun malsamoj rekte sekvante ĉiu eniro. Tiu estas tre helpema por kodo revizio aŭ por rapide navigi kio okazis dum serio de interna ke kunlaboranto aldonis.
Foje ĝi estas pli facile revizii ŝanĝojn sur la vorto nivelo prefere ol sur la linio nivelo. Estas --word-diff opcion havebla en Git, ke vi povas postglui al la git log -p komando akiri vorto malsamoj anstataŭ normala linio por linio malsamoj. Vorto malsamoj formato estas sufiĉe senutila kiam aplikita al fontkodon, sed venas en oportuna kiam aplikita al grandaj arkivoj de teksto, kiel libroj aŭ via disertacio. Jen ekzemplo:
 $ git log -U1 --word-diff commit ca82a6dff817ec66f44342007202690a93763949 Author: Scott Chacon <schacon@gee-mail.com> Date: Mon Mar 17 21:52:11 2008 -0700 changed the version number diff --git a/Rakefile b/Rakefile index a874b73..8f94139 100644 --- a/Rakefile +++ b/Rakefile @@ -7,3 +7,3 @@ spec = Gem::Specification.new do |s| s.name = "simplegit" s.version = [-"0.1.0"-]{+"0.1.1"+} s.author = "Scott Chacon" 
Kiel vi povas vidi, ke estas neniu aldonita kaj forigita linioj en tiu eligo kiel en normala malsamoj. Ŝanĝoj estas inline anstataŭe. Vi povas vidi la aldonita vorto enfermita en {+ +} kaj forigis unu enfermita en [- -] . Vi povas ankaŭ volas redukti la kutimajn tri linioj kuntekston malsamoj eligo al nur unu linion, kiel la kunteksto estas nun vortoj, ne linioj. Vi povas fari tion kun -U1 kiel ni faris en la ekzemplo supre.
Vi povas ankaŭ uzi serion de resumanta ebloj kun git log . Ekzemple, se vi volas vidi iom mallongigita statistikojn por ĉiu faras, vi povas uzi la --stat eblo:
 $ git log --stat commit ca82a6dff817ec66f44342007202690a93763949 Author: Scott Chacon <schacon@gee-mail.com> Date: Mon Mar 17 21:52:11 2008 -0700 changed the version number Rakefile | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 Author: Scott Chacon <schacon@gee-mail.com> Date: Sat Mar 15 16:40:33 2008 -0700 removed unnecessary test code lib/simplegit.rb | 5 ----- 1 files changed, 0 insertions(+), 5 deletions(-) commit a11bef06a3f659402fe7563abf99ad00de2209e6 Author: Scott Chacon <schacon@gee-mail.com> Date: Sat Mar 15 10:31:28 2008 -0700 first commit README | 6 ++++++ Rakefile | 23 +++++++++++++++++++++++ lib/simplegit.rb | 25 +++++++++++++++++++++++++ 3 files changed, 54 insertions(+), 0 deletions(-) 
Kiel vi povas vidi, la --stat opcion presaĵoj sub ĉiu faras eniro listo de modifita dosierojn, kiom da dosieroj estis ŝanĝita, kaj kiom da linioj en tiuj dosieroj estis aldonitaj kaj forigitaj. Ĝi ankaŭ metas resumon de la informoj ĉe la fino. Alia vere utila eblo estas --pretty . Tiu opcio ŝanĝas la logo eligo formatoj aliaj ol defaŭltajn. Kelkaj prebuilt ebloj estas disponebla por vi uzi. La oneline opcion presaĵoj ĉiu faras sur ununura linio, kiu estas utila se vi rigardas multajn interna. Krome, la short , full , kaj fuller ebloj montras la eligo en malglate la sama formato, sed kun malpli aŭ pli da informoj, respektive:
 $ git log --pretty=oneline ca82a6dff817ec66f44342007202690a93763949 changed the version number 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 removed unnecessary test code a11bef06a3f659402fe7563abf99ad00de2209e6 first commit 
La plej interesa eblo estas format , kiu permesas vin specifi vian propran log eligo formato. Tio estas aparte utila kiam vi generante eligo por maŝino analiza - ĉar vi specifas la formaton eksplicite, vi scias ke tio ne ŝanĝas kun ĝisdatigoj al Git:
 $ git log --pretty=format:"%h - %an, %ar : %s" ca82a6d - Scott Chacon, 11 months ago : changed the version number 085bb3b - Scott Chacon, 11 months ago : removed unnecessary test code a11bef0 - Scott Chacon, 11 months ago : first commit 
Tabelo 2-1 listigas iujn de la pli utilaj ebloj kiujn formato prenas.
eblo Priskribo de Eligo
%H Transdonu hash
%h Mallongigita fari hash
%T arbo hash
%t Mallongigita arbo hash
%P gepatro hashes
%p Mallongigita gepatro hashes
%an aŭtora nomo
%ae Aŭtoro retpoŝto
%ad Aŭtoro dato (formato respektas la --date = opcio)
%ar Aŭtoro dato, parenco
%cn Committer nomon
%ce Committer retpoŝto
%cd Committer daton
%cr Committer dato, parenco
%s subjekto
Vi povas demandi kion la diferenco estas inter aŭtoro kaj committer. La aŭtoro estas la persono kiu origine skribis la diakilo, dum la committer estas la persono kiu lasta aplikita la diakilo. Do, se vi sendas en diakilo al projekto kaj unu el la kernaj membroj aplikas la diakilo, ambaŭ de vi akiri kredito - vi kiel la aŭtoro kaj la kerna membro kiel la committer. Ni kovras ĉi distingo iom pli en Ĉapitro 5.
La oneline kaj format ebloj estas aparte utila kun alia log eblon nomita --graph . Tiu opcio aldonas belan ASCII grafeo montranta vian branĉo kaj kunfandi historio, kiun ni povas vidi en nia ekzemplero de la Grit projekto deponejo:
 $ git log --pretty=format:"%h %s" --graph * 2d3acf9 ignore errors from SIGCHLD on trap * 5e3ee11 Merge branch 'master' of git://github.com/dustin/grit |\ | * 420eac9 Added a method for getting the current branch. * | 30e367c timeout code and tests * | 5a09431 add timeout protection to grit * | e1193f8 support for heads with slashes in them |/ * d6016bc require time for xmlschema * 11d191e Merge branch 'defunkt' into local 
Tiuj estas nur kelkaj simplaj eligo-formataj opcioj al git log - estas multaj pli. Tabelo 2-2 listigas la ebloj ni kovrita ĝis nun kaj iuj aliaj komunaj formatado ebloj kiuj povas esti utilaj, kune kun kiel ili ŝanĝas la eligo de la log komando.
eblo priskribo
-p Montri la diakilo enkondukita kun ĉiu faras.
--word-diff Montri la diakilo en vorto malsamoj formato.
--stat Montri statistikon por dosieroj modifita en ĉiu faras.
--shortstat Aperigi nur la ŝanĝita / inserciones / forigoj linio de la --stat komando.
--name-only Montri la liston de dosieroj modifita post la commit informo.
--name-status Montri la liston de dosieroj tuŝita kun aldonita / redaktita / forigita informo tiel.
--abbrev-commit Montri nur la unuajn signojn de la SHA-1 checksum anstataŭ ĉiuj 40.
--relative-date Montri la daton en relativa formato (ekzemple, "2 semajnoj") anstataŭ uzi la plenan daton formaton.
--graph Montri ASCII grafikaĵo de la branĉo kaj kunfandi historio apud la log eligo.
--pretty Montri kompromitas en alternativa formato. Ebloj inkludas oneline, mallonga, plena, plena kaj formato (kie vi specifas vian propran formaton).
--oneline A oportuneco opcion mallongigo --pretty=oneline --abbrev-commit .

Limiganta Ensalutu Eligo

Krom eligo-formataj opcioj, git log prenas kelkajn utilajn limiganta ebloj - te ebloj kiuj permesas vin montri nur subaro de interna. Vi vidis unu tia eblo jam - la -2 eblo, kiu montras nur la lastajn du interna. Fakte, vi povas fari -<n> , kie n estas ajna entjero montri la lastan n kompromitas. En realo, vi estas neverŝajna uzi ke ofte, ĉar Git defaŭlte pipoj ĉiuj eligo tra pager do komprenu nur unu paĝon el ŝtipo eligo samtempe.
Tamen, la tempo-limiganta eblojn kiel --since kaj --until estas tre utila. Ekzemple, tiu komando ricevas la lerta de interna faris en la lastaj du semajnoj:
 $ git log --since=2.weeks 
Tiu komando laboras kun multaj formatoj - vi povas specifi specifa dato ( "2008-01-15") aŭ parenco daton kiel "2 jaroj 1 tago 3 minutoj".
Vi povas ankaŭ filtri la liston al interna kiuj kongruas iuj serĉo kriterioj. La --author opcio permesas filtri iun specifan aŭtoro kaj la --grep opcio ebligas serĉi ŝlosilvortoj en la commit mesaĝojn. (Notu, ke se vi volas specifi ambaŭ aŭtoro kaj grep ebloj, vi devas aldoni --all-match aŭ la komando kongruas kompromitas kun ĉu.)
La lasta vere utila eblo por pasi al git log kiel filtrilo estas vojo. Se vi specifas dosierujo aŭ dosiernomo, vi povas limigi la log eligo al interna kiu enkondukis ŝanĝon al tiuj dosieroj. Tio estas ĉiam la lasta elekto kaj estas ĝenerale antaŭita per duoblaj streketoj ( -- ) por apartigi la vojoj de la ebloj.
En Tabelo 2-3 ni listo tiuj kaj kelkaj aliaj komunaj ebloj por via referenco.
eblo priskribo
-(n) Montri nur la lasta n kompromitas
--since, --after Limigi la interna al tiuj faritaj post la specifa dato.
--until, --before Limigi la interna al tiuj faritaj antaŭ la specifa dato.
--author Nur spektaklo faras en kiu la aŭtoro eniro matĉojn specifata cxeno.
--committer Nur spektaklo faras en kiu la committer eniro matĉojn specifata cxeno.
Ekzemple, se vi volas vidi kion faras modifi testo dosierojn en la Git fontkodo historio estis farita de Junio ​​Hamano en la monato de oktobro de 2008 kaj ne kunigoj, vi povas kuri proksimume tia:
 $ git log --pretty="%h - %s" --author=gitster --since="2008-10-01" \ --before="2008-11-01" --no-merges -- t/ 5610e3b - Fix testcase failure when extended attribute acd3b9e - Enhance hold_lock_file_for_{update,append}() f563754 - demonstrate breakage of detached checkout wi d1a43f2 - reset --hard/read-tree --reset -u: remove un 51a94af - Fix "checkout --track -b newbranch" on detac b0ad11e - pull: allow "git pull origin $something:$cur 
De la preskaŭ 20.000 interna en la Git fontkodo historio, tiu komando montras la 6 ke kongruas tiujn kriteriojn.

Uzante GUI visualizar Historio

Se vi ŝatus uzi pli grafika ilo por visualizar vian commit historio, vi eble volas preni rigardon ĉe Tcl / Tk programo nomita gitk kiu distribuas kun Git. Gitk estas esence vidaj git log ilo, kaj ĝi akceptas preskaŭ ĉiuj filtrado opcioj kiujn git log faras. Se vi tajpas gitk la komandlinio en via projekto, vi devus vidi ion kiel Figuro 2-2.

Figuro 2-2. La gitk historio visualizador. Vi povas vidi la commit historio en la supra duono de la fenestro apud belan ascendencia grafeo. La malsamoj spektanton en la malsupera duono de la fenestro montras la ŝanĝoj enkondukitaj en ajna commit vi klakas.

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.

2.1 Bazoj de Git - Ekhavu Git-deponejon

2.1 Bazoj de Git - Ekhavu Git-deponejon

Du precipaj manieroj ekhavas je Git-projekton. La Unua prenas ekzistantan projekton KAJ importas Gin al Git. La dua klonas ekzistantan Git-deponejon de aliaj aĵoj servilo.

Komenci deponejon eo ekzistanta dosierujo

Se vi komencas sekvi ŝanĝojn de ekzistanta Projekto pere de Git, vi Devas iri alla dosierujo de La Projekto KAJ Tajpi
$ git init 
That kreas Novan subdosierujon with la la nomo .git Kiu enhavas ĉiujn esencajn deponejajn dosierojn - that is la skeleto de La Git-deponejo. Ci-Momente, nenio eo tra Projekto ankoraŭ is sekvata. (Rigardu eo Ĉapitro 9 Bonvolu more da informoj pri la ekzakta enhavo de la .git -dosierujo kiun vi jus Kreis.)
Se vi volas komenci versikontrolon de ekzistantaj dosieroj (kontraŭe al malplena dosierujo), vi devus verŝajne komenci sekvi tiujn dosierojn KAJ Fari unuan enmeton. Vi povas Fari tion with kelkaj git add kiuj specifigas la dosierojn kiujn vi volas sekvi, Kaj post tio simile git commit Bonvolu enmeti:
 $ git add *.c $ git add README $ git commit -m 'unua versio de la projekto' 
Baldaŭ ni klarigu kion ĈI tiuj komandoj Faras. Eo ĈI ke Tiu momento vi Havas Git-deponejon with sekvataj dosieroj KAJ unuan enmeton.

Kloni ekzistantan deponejon

Se vi volas havigi al vi kopion de ekzistanta Git-deponejo - Ekzemple de Projekto Al Kiu vi volas kontribui - vi bezonos la komandon git clone . Se vi konas aliajn VCS-sistemojn, vi rimarkas Ke la Komando is clone KAJ ne checkout . That is Grava distingo - Git ricevas kopion de preskaŭ ĉiuj datumoj de la servilo. CiU version de CiU dosiero eo La Projekto is elŝutata KIAM VI uzas git clone . Verdire, se la disko de tra servilo rompiĝas, vi povas Uzi ajnan klonon eo ajna kliento Bonvolu remeti la servilon eo La Stato De KIAM ĜI estIS klonita (Vi povas perdi kelkajn servilflankajn hokojn KTP, ESTU ĉiuj datumaj versioj estus kravato - rigardu eo Ĉapitro 4 bonvolu more da Detaloj).
Oni klonas deponejon por git clone [url] . Ekzemple, se vi volas kloni la Git-bibliotekon Bonvolu Ruby nomata Grit, vi povas Fari Tiel:
 $ git clone git://github.com/schacon/grit.git 
That kreas dosierujon nomata grit , komencas dosierujon .git ene de gi, elŝutas ĉiujn datumojn de ke Tiu deponejo KAJ elprenas laborkopion de La Lasta version. Se vi eniras la Novan dosierujon grit , vi vidos la projektdosierojn kravato, pretaj Bonvolu Esti prilaborataj au uzataj. Se vi volas kloni la deponejon eo dosierujon with alie la nomo ol grit, vi povas specifigi tion Kiel la sekvan komandlinian Eblo:
 $ git clone git://github.com/schacon/grit.git mygrit 
Ke Tiu Komando Faras La Samon Kiel la antaŭa, ESTU la celdosierujo is nomata mygrit .
Git Havas IOM da diversaj transigaj normoj kiujn vi povas Uzi. La antaŭa ekzemplo uzas la normon git:// , ESTU VI ankaŭ povas Uzi http(s):// au user@server:/path.git , Kio uzas la transigan normon SSH. Ĉapitro 4 enkondukos ĉiujn haveblajn opciojn kiujn la servilo povas konfiguri bonvolu aliri Vian Git-deponejon, KAJ ligojn avantaĝojn KAJ malavantaĝojn.

Dua ĉapitro - Bazoj de Git

Dua ĉapitro - Bazoj de Git

Se vi nur povas legi unuan ĉapitron, bonvole ekuzu Git, jen GI. Ci ke Tiu ĉapitro pritraktas ĉiun Bazán komandon kiun vi bezonas bonvolu Fari la plimulton de la aferojn kiujnvi iam Faros po Git. Bona de ĈI ke Tiu ĉapitro, vi devus povi konfiguri KAJ komenci deponejon, komenci KAJ Cesi sekvi ŝanĝojn en dosieroj, KAJ preparmeti KAJ enmeti ŝanĝojn. Ni ankaŭ montros al vi Kiel agordi Git bonvolu ignori certajn dosierojn KAJ dosierskemojn, Kiel malfari erarojn rapide KAJ facile, Kiel foliumi la historion de tra Projekto KAJ Vidi ŝanĝojn inter enmetoj, KAJ Kiel puŝi KAJ tiri de distancaj deponejoj.

1.7 Ekkomenci - Resumo

1.7 Ekkomenci - Resumo

Vi devus havi bazan komprenon de kio Git estas kaj kiel ĝi estas malsama de la CVCS vi eble estis uzanta. Vi ankaŭ devus nun havi funkciantan version de Git en via sistemo kiu estas instalita kun via persona identeco. Ĝi estas nun tempo por lerni iun Git bazigxas.

1.6 Ekkomenci - Ricevi Helpon

1.6 Ekkomenci - Ricevi Helpon

Se vi iam bezonas helpon uzante Git, ekzistas tri manieroj akiri la manlibro paĝo (manpage) helpo por iu el la Git komandas:
$ git help <verb> $ git <verb> --help $ man git-<verb>
 
Ekzemple, vi povas akiri la manpage helpon por la agord komando de kurado
 $ git help config
 
Tiuj komandoj estas bela ĉar vi povas aliri ilin i.e., eĉ eksterreta. Se la manpages kaj tiu libro ne estas sufiĉa kaj vi bezonas en-personan helpon, vi povas provi la #git#github kanalo sur la Freenode IRC servilo (irc.freenode.net). Tiuj kanaloj estas regule plenigis kun centoj da personoj kiuj estas ĉiuj tre bone informita pri Git kaj ofte pretas helpi.