diff --git a/.gitignore b/.gitignore
index 7e09e6f2..26cf1373 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,12 @@
+*.log
+*.fo
+*.aux
+*.out
+*.pdf
+fop-zh*
/book*
/conf
-/fop*
-*.svn/*
+/fop/*
+.*
+*~
+.Rproj.user
diff --git a/Makefile b/Makefile
index 0e5515e3..0bcd1687 100644
--- a/Makefile
+++ b/Makefile
@@ -1,21 +1,14 @@
# The availaible translation languages.
# When starting a new translation, add a language code here.
-#
-# Vietnamese PDF generation fails, since DocBook lacks Vietnamese support.
-# I hope to work around this, or use another tool to generate a PDF from
-# AsciiDoc.
-#
-# For now, I've uploaded a PDF to the website; it was supplied by
-# Trần Ngọc Quân who used OpenOffice to convert HTML to PDF.
-TRANSLATIONS = de es fr ru uk vi zh_cn zh_tw
+
+TRANSLATIONS = de es fr ko pt_br ru uk vi zh_cn zh_tw it pl
LANGS = en $(TRANSLATIONS)
-SHELL := /bin/bash
-.PHONY: all clean sync public $(LANGS)
+.PHONY: all clean $(LANGS)
all: $(LANGS)
-$(LANGS): %: book-% book-%/default.css book-%.html book-%.pdf
+$(LANGS): %: book-% book-%/default.css book-%.html book-%.pdf book-%.epub
# The book consists of these text files in the following order:
@@ -62,19 +55,29 @@ $(foreach l,$(LANGS),book-$(l)/default.css): book-%/default.css: book.css
rsync book.css book-$*/default.css
$(foreach l,$(LANGS),book-$(l).html): book-%.html: book-%.xml
- xmlto -m custom-nochunks.xsl html-nochunks $^
- -tidy -utf8 -imq $@
+ pandoc -s -f docbook -t html5 -o $@ $^
-# Set SP_ENCODING to avoid "non SGML character" errors.
-# Can also do SP_ENCODING="UTF-8".
$(foreach l,$(LANGS),book-$(l).pdf): book-%.pdf: book-%.xml
- if [ $* = zh_cn -o $* = zh_tw ]; then \
- if ! [ -f fop-$*.xsl ]; then wget -q http://bestrecords.net/fop/fop-$*.xsl; fi; \
- if ! [ -f fop-$*.xconf ]; then wget -q http://bestrecords.net/fop/fop-$*.xconf; fi; \
- xmlto -m fop-$*.xsl --with-fop -p "-c `pwd`/fop-$*.xconf" pdf book-$*.xml ;\
- else \
- SP_ENCODING="XML" docbook2pdf book-$*.xml; \
- fi
+ pandoc -s -f docbook -o $@ --pdf-engine=xelatex $^
+
+book-ru.pdf: book-ru.xml
+ pandoc -s -f docbook -o $@ --pdf-engine xelatex -V mainfont='DejaVuSansMono' $^
+
+book-uk.pdf: book-uk.xml
+ pandoc -s -f docbook -o $@ --pdf-engine xelatex -V mainfont='DejaVuSansMono' $^
+
+book-ko.pdf: book-ko.xml
+ pandoc -s -f docbook -o $@ --pdf-engine xelatex -V CJKmainfont='NanumGothic' $^
+
+book-zh_cn.pdf: book-zh_cn.xml
+ pandoc -s -f docbook -o $@ --pdf-engine xelatex -V CJKmainfont='WenQuanYi Micro Hei Mono' $^
+
+book-zh_tw.pdf: book-zh_tw.xml
+ pandoc -s -f docbook -o $@ --pdf-engine xelatex -V CJKmainfont='WenQuanYi Micro Hei Mono' $^
+
+$(foreach l,$(LANGS),book-$(l).epub): book-%.epub: book-%.xml
+ pandoc -s -f docbook -o $@ $^
clean:
- -rm -rf $(foreach l,$(LANGS),book-$(l).pdf book-$(l).xml book-$(l).html book-$(l))
+ -rm -rf $(foreach l,$(LANGS),book-$(l).pdf book-$(l).xml book-$(l).html book-$(l)) \
+ *.fo *.log *.out *.aux conf
diff --git a/book.css b/book.css
index ed2fb1ae..b1a0cee9 100644
--- a/book.css
+++ b/book.css
@@ -1,6 +1,6 @@
body {
- font-size: 90%;
- font-family: verdana, arial, sans-serif;
+ font-size: 95%;
+ font-family: 'Open Sans', sans-serif;
}
tt, code, pre, .type {
diff --git a/custom-html.xsl b/custom-html.xsl
index 8ca69694..0753e78e 100644
--- a/custom-html.xsl
+++ b/custom-html.xsl
@@ -15,16 +15,16 @@
-
-
-
+
diff --git a/custom-nochunks.xsl b/custom-nochunks.xsl
deleted file mode 100644
index 8871c4b4..00000000
--- a/custom-nochunks.xsl
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/de/Makefile b/de/Makefile
deleted file mode 120000
index 0d2fefa1..00000000
--- a/de/Makefile
+++ /dev/null
@@ -1 +0,0 @@
-../po4gitmagic/Makefile
\ No newline at end of file
diff --git a/de/Makefile b/de/Makefile
new file mode 100644
index 00000000..0d2fefa1
--- /dev/null
+++ b/de/Makefile
@@ -0,0 +1 @@
+../po4gitmagic/Makefile
\ No newline at end of file
diff --git a/de/basic.txt b/de/basic.txt
index b6a80792..2c9b5983 100644
--- a/de/basic.txt
+++ b/de/basic.txt
@@ -1,13 +1,13 @@
== Erste Schritte ==
Bevor wir uns in ein Meer von Git-Befehlen stürzen, schauen wir uns ein paar
-einfache Beispiele an. Trotz ihrer Einfachheit, sind alle davon wichtig und
-nützlich. Um ehrlich zu sein, meine ersten Monate mit Git brauchte ich nicht
-mehr als in diesem Kapitel beschrieben steht.
+einfache Beispiele an. Trotz ihrer Einfachheit sind alle davon wichtig und
+nützlich. Um ehrlich zu sein, in meinen ersten Monaten mit Git brauchte ich nicht
+mehr, als in diesem Kapitel beschrieben steht.
=== Stand sichern ===
-Hast du gravierende Änderungen vor? Nur zu, aber speichere deinen aktuellen
+Hast Du gravierende Änderungen vor? Nur zu, aber speichere Deinen aktuellen
Stand vorher lieber nochmal ab:
$ git init
@@ -25,8 +25,8 @@ Um den neuen Stand zu sichern:
=== Hinzufügen, Löschen, Umbenennen ===
-Bisher kümmert sich Git nur um Dateien, die existierten, als du das erste
-Mal *git add* ausgeführt hast. Wenn du Dateien oder Verzeichnisse
+Bisher kümmert sich Git nur um Dateien, die existierten, als Du das erste
+Mal *git add* ausgeführt hast. Wenn Du Dateien oder Verzeichnisse
hinzufügst, musst du Git das mitteilen:
$ git add readme.txt Dokumentation
@@ -36,9 +36,9 @@ Ebenso, wenn Git Dateien vergessen soll:
$ git rm ramsch.h veraltet.c
$ git rm -r belastendes/material/
-Git löscht diese Dateien für dich, falls du es noch nicht getan hast.
+Git löscht diese Dateien für Dich, falls Du es noch nicht getan hast.
-Eine Datei umzubenennen ist das selbe wie sie zu löschen und unter neuem
+Eine Datei umzubenennen, ist das selbe, wie sie zu löschen und unter neuem
Namen hinzuzufügen. Git benutzt hierzu die Abkürzung *git mv*, welche die
gleiche Syntax wie *mv* hat. Zum Beispiel:
@@ -46,12 +46,12 @@ gleiche Syntax wie *mv* hat. Zum Beispiel:
=== Fortgeschrittenes Rückgängig machen/Wiederherstellen ===
-Manchmal möchtest du einfach zurück gehen und alle Änderungen ab einem
+Manchmal möchtest Du einfach zurückgehen und alle Änderungen ab einem
bestimmten Zeitpunkt verwerfen, weil sie falsch waren. Dann:
$ git log
-zeigt dir eine Liste der bisherigen 'Commits' und deren SHA1 Hashwerte:
+zeigt Dir eine Liste der bisherigen 'Commits' und deren SHA1 Hashwerte:
----------------------------------
commit 766f9881690d240ba334153047649b8b8f11c664
@@ -67,7 +67,7 @@ Date: Thu Jan 1 00:00:00 1970 +0000
Initial commit.
----------------------------------
-Die ersten paar Zeichen eines Hashwert reichen aus um einen 'Commit' zu
+Die ersten paar Zeichen eines Hashwert reichen aus, um einen 'Commit' zu
identifizieren; alternativ benutze kopieren und einfügen für den kompletten
Hashwert. Gib ein:
@@ -76,23 +76,23 @@ Hashwert. Gib ein:
um den Stand eines bestimmten 'Commits' wieder herzustellen und alle
nachfolgenden Änderungen für immer zu löschen.
-Ein anderes Mal willst du nur kurz zu einem älteren Stand springen. In
+Ein anderes Mal willst Du nur kurz zu einem älteren Stand springen. In
diesem Fall, gib folgendes ein:
$ git checkout 82f5
-Damit springst du in der Zeit zurück, behältst aber neuere Änderungen. Aber,
-wie bei Zeitreisen in einem Science-Fiction-Film, wenn du jetzt etwas
-änderst und 'commitest', gelangst du in ein alternative Realität, denn deine
+Damit springst Du in der Zeit zurück, behältst aber neuere Änderungen. Aber,
+wie bei Zeitreisen in einem Science-Fiction-Film, wenn Du jetzt etwas
+änderst und 'commitest', gelangst Du in eine alternative Realität, denn Deine
Änderungen sind anders als beim früheren 'Commit'.
-Diese alternative Realität heißt 'Branch' und <>. Für jetzt, merke dir
+Diese alternative Realität heißt 'Branch', und <>. Für jetzt merke Dir,
$ git checkout master
-bringt dich wieder in die Gegenwart. Um zu verhindern, dass sich Git
-beschwert, solltest du vor einem 'Checkout' alle Änderungen 'commiten' oder
+bringt Dich wieder in die Gegenwart. Um zu verhindern, dass sich Git
+beschwert, solltest Du vor einem 'Checkout' alle Änderungen 'commiten' oder
'reseten'.
Um wieder die Computerspielanalogie anzuwenden:
@@ -100,21 +100,21 @@ Um wieder die Computerspielanalogie anzuwenden:
- *`git reset --hard`*: Lade einen alten Stand und lösche alle Spielstände,
die neuer sind als der jetzt geladene.
-- *`git checkout`*: Lade einen alten Spielstand, aber wenn du weiterspielst,
+- *`git checkout`*: Lade einen alten Spielstand, aber wenn Du weiterspielst,
wird der Spielstand von den früher gesicherten Spielständen abweichen. Jeder
Spielstand, der ab jetzt gesichert wird, entsteht in dem separaten 'Branch',
-welcher der alternative Realität entspricht. <>.
-Du kannst auch nur einzelne Dateien oder Verzeichnisse wiederherstellen
-indem du sie an den Befehl anhängst:
+Du kannst auch nur einzelne Dateien oder Verzeichnisse wiederherstellen,
+indem Du sie an den Befehl anhängst:
$ git checkout 82f5 eine.datei andere.datei
-Sei Vorsichtig, diese Art des '*Checkout*' kann Dateien überschreiben, ohne
-dass du etwas merkst. Um Unfälle zu vermeiden solltest du immer 'commiten'
-bevor du ein 'Checkout' machst, besonders am Anfang wenn du Git noch
-erlernst. Allgemein gilt: Wenn du unsicher bist, egal ob ein Git Befehl oder
+Sei vorsichtig, diese Art des '*Checkout*' kann Dateien überschreiben, ohne
+dass Du etwas merkst. Um Unfälle zu vermeiden, solltest Du immer 'commiten'
+bevor Du ein 'Checkout' machst, besonders am Anfang, wenn Du Git noch
+erlernst. Allgemein gilt: Wenn Du unsicher bist, egal, ob ein Git Befehl oder
irgendeine andere Operation, führe zuerst *git commit -a* aus.
Du magst Kopieren und Einfügen von Hashes nicht? Dann nutze:
@@ -129,7 +129,7 @@ auch nach dem 5. letzten 'Commit' fragen:
=== Rückgängig machen ===
In einem Gerichtssaal können Ereignisse aus den Akten gelöscht
-werden. Ähnlich kannst du gezielt 'Commits' rückgängig machen.
+werden. Ähnlich kannst Du gezielt 'Commits' rückgängig machen.
$ git commit -a
$ git revert 1b6d
@@ -161,17 +161,17 @@ Es gibt gleich noch viel mehr über den 'clone' Befehl zu sagen.
=== Das Neueste vom Neuen ===
-Wenn du schon eine Kopie eines Projektes hast, kannst du es auf die neuste
+Wenn Du schon eine Kopie eines Projektes hast, kannst Du es auf die neuste
Version aktualisieren mit:
$ git pull
=== Einfaches Veröffentlichen ===
-Angenommen du hast ein Skript geschrieben und möchtest es anderen zugänglich
-machen. Du könntest sie einfach bitten es von deinem Computer
-herunterzuladen, aber falls sie das tun während du experimentierst oder das
-Skript verbesserst könnten sie in Schwierigkeiten geraten. Genau deswegen
+Angenommen Du hast ein Skript geschrieben und möchtest es anderen zugänglich
+machen. Du könntest sie einfach bitten, es von Deinem Computer
+herunterzuladen, aber falls sie das tun, während Du experimentierst oder das
+Skript verbesserst, könnten sie in Schwierigkeiten geraten. Genau deswegen
gibt es Releasezyklen. Entwickler arbeiten regelmäßig an einem Projekt,
veröffentlichen den Code aber nur, wenn sie ihn für vorzeigbar halten.
@@ -181,30 +181,30 @@ Um dies in Git zu tun, gehe ins Verzeichnis in dem das Skript liegt:
$ git add .
$ git commit -m "Erster Stand"
-Dann sage deinen Nutzern:
+Dann sage Deinen Nutzern:
$ git clone dein.computer:/pfad/zum/skript
-um dein Skript herunterzuladen. Das setzt voraus, dass sie einen SSH-Zugang
+um Dein Skript herunterzuladen. Das setzt voraus, dass sie einen SSH-Zugang
haben. Falls nicht, führe *git deamon* aus und sage den Nutzern folgendes:
$ git clone git://dein.computer/pfad/zum/skript
-Ab jetzt, immer wenn dein Skript reif für eine Veröffentlichung ist:
+Ab jetzt, immer wenn Dein Skript reif für eine Veröffentlichung ist:
$ git commit -a -m "Nächster Stand"
-und deine Nutzer können ihr Skript aktualisieren mit:
+und Deine Nutzer können ihr Skript aktualisieren mit:
$ git pull
-Deine Nutzer werden nie mit Versionen in Kontakt kommen, von denen du es
+Deine Nutzer werden nie mit Versionen in Kontakt kommen, von denen Du es
nicht willst. Natürlich funktioniert der Trick für fast alles, nicht nur
Skripts.
=== Was habe ich getan? ===
-Finde heraus was du seit dem letzten 'Commit' getan hast:
+Finde heraus, was Du seit dem letzten 'Commit' getan hast:
$ git diff
@@ -216,22 +216,22 @@ Oder zwischen irgendeiner Version und der vorvorletzten:
$ git diff 1b6d "master~2"
-Jedes mal ist die Ausgabe ein 'Patch' der mit *git apply* eingespielt werden
+Jedes mal ist die Ausgabe ein 'Patch', der mit *git apply* eingespielt werden
kann. Versuche auch:
$ git whatchanged --since="2 weeks ago"
-Um mir die Geschichte eines 'Repositories' anzuzeigen benutze ich häufig
+Um mir die Geschichte eines 'Repositories' anzuzeigen, benutze ich häufig
http://sourceforge.net/projects/qgit[qgit] da es eine schicke
Benutzeroberfläche hat, oder http://jonas.nitro.dk/tig/[tig], eine
Konsolenanwendung, die sehr gut über langsame Verbindungen
-funktioniert. Alternativ kannst du einen Webserver installieren mit *git
-instaweb*, dann kannst du mit jedem Webbrowser darauf zugreifen.
+funktioniert. Alternativ kannst Du einen Webserver installieren mit *git
+instaweb*, dann kannst Du mit jedem Webbrowser darauf zugreifen.
=== Übung ===
A, B, C, D sind 4 aufeinander folgende 'Commits'. B ist identisch mit A,
-außer dass einige Dateien gelöscht wurden. Wir möchten die Dateien in D
+außer, dass einige Dateien gelöscht wurden. Wir möchten die Dateien in D
wieder hinzufügen, aber nicht in B. Wie machen wir das?
Es gibt mindestens 3 Lösungen. Angenommen, wir sind bei D:
@@ -252,6 +252,6 @@ Es gibt mindestens 3 Lösungen. Angenommen, wir sind bei D:
$ git revert B
-Welche Lösung ist die beste? Die, welche dir am besten gefällt. Es ist
-einfach mit Git das zu bekommen was du willst und oft führen viele Wege zum
+Welche Lösung ist die beste? Die, welche Dir am besten gefällt. Es ist
+einfach, mit Git das zu bekommen, was Du willst und oft führen viele Wege zum
Ziel.
diff --git a/de/branch.txt b/de/branch.txt
index 315e8b70..43f91622 100644
--- a/de/branch.txt
+++ b/de/branch.txt
@@ -3,7 +3,7 @@
Unverzügliches 'Branchen' und 'Mergen' sind die hervorstechenden
Eigenschaften von Git.
-*Problem*: Externe Faktoren zwingen zum Wechsel des Kontext. Ein schwerwiegender Fehler in der veröffentlichten Version tritt ohne Vorwarnung auf. Die Frist für ein bestimmtes Leistungsmerkmal rückt näher. Ein Entwickler, dessen Unterstützung für eine Schlüsselstelle im Projekt wichtig ist, verlässt das Team. In allen Fällen musst du alles stehen und liegen lassen und dich auf eine komplett andere Aufgabe konzentrieren.
+*Problem*: Externe Faktoren zwingen zum Wechsel des Kontext. Ein schwerwiegender Fehler in der veröffentlichten Version tritt ohne Vorwarnung auf. Die Frist für ein bestimmtes Leistungsmerkmal rückt näher. Ein Entwickler, dessen Unterstützung für eine Schlüsselstelle im Projekt wichtig ist, verlässt das Team. In allen Fällen musst Du alles stehen und liegen lassen und Dich auf eine komplett andere Aufgabe konzentrieren.
Den Gedankengang zu unterbrechen ist schlecht für die Produktivität und je
komplizierter der Kontextwechsel ist, desto größer ist der Verlust. Mit
@@ -18,19 +18,19 @@ gesamten Projektdateien im neuen Arbeitsverzeichnis erstellt werden.
*Lösung*: Git hat ein besseres Werkzeug für diese Situationen, die wesentlich schneller und platzsparender als 'clonen' ist: *git branch*.
-Mit diesem Zauberwort verwandeln sich die Dateien in deinem
+Mit diesem Zauberwort verwandeln sich die Dateien in Deinem
Arbeitsverzeichnis plötzlich von einer Version in eine andere. Diese
Verwandlung kann mehr als nur in der Geschichte vor und zurück gehen. Deine
Dateien können sich verwandeln, vom aktuellsten Stand, zur experimentellen
-Version, zum neusten Entwicklungsstand, zur Version deines Freundes und so
+Version, zum neusten Entwicklungsstand, zur Version Deines Freundes und so
weiter.
=== Die Chef-Taste ===
-Hast du schon einmal ein Spiel gespielt, wo beim Drücken einer Taste (``der
+Hast Du schon einmal ein Spiel gespielt, wo beim Drücken einer Taste (``der
Chef-Taste''), der Monitor sofort ein Tabellenblatt oder etwas anderes
-angezeigt hat? Dass, wenn der Chef ins Büro spaziert, während du das Spiel
-spielst, du es schnell verstecken kannst?
+angezeigt hat? Dass, wenn der Chef ins Büro spaziert, während Du das Spiel
+spielst, Du es schnell verstecken kannst?
In irgendeinem Verzeichnis:
@@ -46,7 +46,7 @@ bestimmten Nachricht enthält. Nun gib ein:
$ echo "Mein Chef ist klüger als ich" > meinedatei.txt
$ git commit -a -m "Ein anderer Stand"
-Es sieht aus als hätten wir unsere Datei überschrieben und 'commitet'. Aber
+Es sieht aus, als hätten wir unsere Datei überschrieben und 'commitet'. Aber
es ist eine Illusion. Tippe:
$ git checkout master # wechsle zur Originalversion der Datei
@@ -61,55 +61,55 @@ kannst unabhängig voneinander in jeder Version Änderungen 'commiten'
=== Schmutzarbeit ===
-[[branch]] Sagen wir, du arbeitest an einer Funktion und du musst, warum
-auch immer, drei Versionen zurückgehen um ein paar print Anweisungen
-einzufügen, damit du siehst, wie etwas funktioniert. Dann:
+[[branch]] Sagen wir, Du arbeitest an einer Funktion und Du musst, warum
+auch immer, drei Versionen zurückgehen, um ein paar print Anweisungen
+einzufügen, damit Du siehst, wie etwas funktioniert. Dann:
$ git commit -a
$ git checkout HEAD~3
-Nun kannst du überall wild temporären Code hinzufügen. Du kannst diese
-Änderungen sogar 'commiten'. Wenn du fertig bist,
+Nun kannst Du überall wild temporären Code hinzufügen. Du kannst diese
+Änderungen sogar 'commiten'. Wenn Du fertig bist,
$ git checkout master
um zur ursprünglichen Arbeit zurückzukehren. Beachte, dass alle Änderungen,
-die nicht 'commitet' sind übernommen werden.
+die nicht 'commitet' sind, übernommen werden.
-Was, wenn du am Ende die temporären Änderungen sichern willst? Einfach:
+Was, wenn Du am Ende die temporären Änderungen sichern willst? Einfach:
$ git checkout -b schmutzig
-und 'commite' bevor du auf den 'Master Branch' zurückschaltest. Wann immer
-du zu deiner Schmutzarbeit zurückkehren willst, tippe einfach:
+und 'commite', bevor Du auf den 'Master Branch' zurückschaltest. Wann immer
+Du zu Deiner Schmutzarbeit zurückkehren willst, tippe einfach:
- $ git checkout schnmutzig
+ $ git checkout schmutzig
Wir sind mit dieser Anweisung schon in einem früheren Kapitel in Berührung
gekommen, als wir das Laden alter Stände besprochen haben. Nun können wir
die ganze Geschichte erzählen: Die Dateien ändern sich zu dem angeforderten
Stand, aber wir müssen den 'Master Branch' verlassen. Jeder 'Commit' ab
-jetzt führt deine Dateien auf einen anderen Weg, dem wir später noch einen
+jetzt führt Deine Dateien auf einen anderen Weg, dem wir später noch einen
Namen geben können.
-Mit anderen Worten, nach dem Abrufen eines alten Stands versetzt dich Git
+Mit anderen Worten, nach dem Abrufen eines alten Stands versetzt Dich Git
automatisch in einen neuen, unbenannten 'Branch', der mit *git checkout -b*
benannt und gesichert werden kann.
=== Schnelle Fehlerbehebung ===
-Du steckst mitten in der Arbeit, als es heißt alles fallen zu lassen um
+Du steckst mitten in der Arbeit, als es heißt, alles fallen zu lassen, um
einen neu entdeckten Fehler in 'Commit' `1b6d...` zu beheben:
$ git commit -a
$ git checkout -b fixes 1b6d
-Dann, wenn du den Fehler behoben hast:
+Dann, wenn Du den Fehler behoben hast:
$ git commit -a -m "Fehler behoben"
$ git checkout master
-und fahre mit deiner ursprünglichen Arbeit fort. Du kannst sogar die frisch
+und fahre mit Deiner ursprünglichen Arbeit fort. Du kannst sogar die frisch
gebackene Fehlerkorrektur auf Deinen aktuellen Stand übernehmen:
$ git merge fixes
@@ -118,14 +118,14 @@ gebackene Fehlerkorrektur auf Deinen aktuellen Stand übernehmen:
Mit einigen Versionsverwaltungssystemen ist das Erstellen eines 'Branch'
einfach, aber das Zusammenfügen ('Mergen') ist schwierig. Mit Git ist
-'Mergen' so einfach, dass du gar nicht merkst, wenn es passiert.
+'Mergen' so einfach, dass Du gar nicht merkst, wenn es passiert.
Tatsächlich sind wir dem 'Mergen' schon lange begegnet. Die *pull* Anweisung
holt ('fetch') eigentlich die 'Commits' und verschmilzt ('merged') diese
-dann mit dem aktuellen 'Branch'. Wenn du keine lokalen Änderungen hast, dann
+dann mit dem aktuellen 'Branch'. Wenn Du keine lokalen Änderungen hast, dann
ist 'merge' eine 'schnelle Weiterleitung', ein Ausnahmefall, ähnlich dem
Abrufen der letzten Version eines zentralen Versionsverwaltungssystems. Wenn
-du aber Änderungen hast, wird Git diese automatisch 'mergen' und dir
+Du aber Änderungen hast, wird Git diese automatisch 'mergen' und Dir
Konflikte melden.
Normalerweise hat ein 'Commit' genau einen Eltern-'Commit', nämlich den
@@ -136,8 +136,8 @@ Eltern haben, welchem folgen wir also?
Es stellt sich heraus, dass diese Notation immer den ersten Elternteil
wählt. Dies ist erstrebenswert, denn der aktuelle 'Branch' wird zum ersten
-Elternteil während eines 'Merge'; häufig bist du nur von Änderungen
-betroffen, die du im aktuellen 'Branch' gemacht hast, als von den Änderungen
+Elternteil während eines 'Merge'; häufig bist Du nur von Änderungen
+betroffen, die Du im aktuellen 'Branch' gemacht hast, als von den Änderungen,
die von anderen 'Branches' eingebracht wurden.
Du kannst einen bestimmten Elternteil mit einem Caret-Zeichen
@@ -160,7 +160,7 @@ Hashwert mit 1b6d beginnt.
=== Kontinuierlicher Arbeitsfluss ===
-In Herstellungsprozessen muss der zweiter Schritt eines Plans oft auf die
+In Herstellungsprozessen muss der zweite Schritt eines Plans oft auf die
Fertigstellung des ersten Schritt warten. Ein Auto, das repariert werden
soll, steht unbenutzt in der Garage bis ein Ersatzteil geliefert wird. Ein
Prototyp muss warten, bis ein Baustein fabriziert wurde, bevor die
@@ -168,22 +168,22 @@ Konstruktion fortgesetzt werden kann.
Bei Softwareprojekten kann das ähnlich sein. Der zweite Teil eines
Leistungsmerkmals muss warten, bis der erste Teil veröffentlicht und
-getestet wurde. Einige Projekte erfordern, dass dein Code überprüft werden
-muss bevor er akzeptiert wird, du musst also warten, bis der erste Teil
-geprüft wurde, bevor du mit dem zweiten Teil anfangen kannst.
+getestet wurde. Einige Projekte erfordern, dass Dein Code überprüft werden
+muss, bevor er akzeptiert wird; Du musst also warten, bis der erste Teil
+geprüft wurde, bevor Du mit dem zweiten Teil anfangen kannst.
Dank des schmerzlosen 'Branchen' und 'Mergen' können wir die Regeln beugen
und am Teil II arbeiten, bevor Teil I offiziell freigegeben
-wurde. Angenommen du hast Teil I 'commitet' und zur Prüfung
-eingereicht. Sagen wir du bist im `master` 'Branch'. Dann 'branche' zu Teil
+wurde. Angenommen Du hast Teil I 'commitet' und zur Prüfung
+eingereicht. Sagen wir, Du bist im `master` 'Branch'. Dann 'branche' zu Teil
II:
$ git checkout -b teil2
-Du arbeitest also an Teil II und 'commitest' deine Änderungen
-regelmäßig. Irren ist menschlich und so kann es vorkommen, dass du zurück zu
-Teil I willst um einen Fehler zu beheben. Wenn du Glück hast oder sehr gut
-bist, kannst du die nächsten Zeilen überspringen.
+Du arbeitest also an Teil II und 'commitest' Deine Änderungen
+regelmäßig. Irren ist menschlich und so kann es vorkommen, dass Du zurück zu
+Teil I willst, um einen Fehler zu beheben. Wenn Du Glück hast oder sehr gut
+bist, kannst Du die nächsten Zeilen überspringen.
$ git checkout master # Gehe zurück zu Teil I.
$ fix_problem
@@ -198,10 +198,10 @@ Schließlich, Teil I ist zugelassen:
$ git merge teil2 # 'Merge' in Teil II.
$ git branch -d teil2 # Lösche den Branch "teil2"
-Nun bist du wieder im `master` 'Branch', mit Teil II im Arbeitsverzeichnis.
+Nun bist Du wieder im `master` 'Branch', mit Teil II im Arbeitsverzeichnis.
Es ist einfach, diesen Trick auf eine beliebige Anzahl von Teilen zu
-erweitern. Es ist genauso einfach rückwirkend zu 'branchen': angenommen, du
+erweitern. Es ist genauso einfach, rückwirkend zu 'branchen': angenommen, Du
merkst zu spät, dass vor sieben 'Commits' ein 'Branch' erforderlich gewesen
wäre. Dann tippe:
@@ -209,7 +209,7 @@ wäre. Dann tippe:
$ git branch master HEAD~7 # Erstelle neuen "master", 7 Commits voraus
Der `master` Branch enthält nun Teil I, und der `teil2` Branch enthält den
-Rest. Wir befinden uns in letzterem Branch; wir haben `master` erzeugt ohne
+Rest. Wir befinden uns in letzterem Branch; wir haben `master` erzeugt, ohne
dorthin zu wechseln, denn wir wollen im `teil2` weiterarbeiten. Das ist
unüblich. Bisher haben wir unmittelbar nach dem Erstellen in einen 'Branch'
gewechselt, wie in:
@@ -218,33 +218,33 @@ gewechselt, wie in:
=== Mischmasch Reorganisieren ===
-Vielleicht magst du es, alle Aspekte eines Projekts im selben 'Branch'
-abzuarbeiten. Du willst deine laufenden Arbeiten für dich behalten und
-andere sollen deine 'Commits' nur sehen, wenn du sie hübsch organisiert
+Vielleicht magst Du es, alle Aspekte eines Projekts im selben 'Branch'
+abzuarbeiten. Du willst deine laufenden Arbeiten für Dich behalten und
+andere sollen Deine 'Commits' nur sehen, wenn Du sie hübsch organisiert
hast. Beginne ein paar 'Branches':
$ git branch sauber # Erzeuge einen Branch für gesäuberte Commits.
$ git checkout -b mischmasch # Erzeuge und wechsle in den Branch zum Arbeiten.
-Fahre fort alles zu bearbeiten: Behebe Fehler, füge Funktionen hinzu,
-erstelle temporären Code und so weiter und 'commite' deine Änderungen
+Fahre fort, alles zu bearbeiten: Behebe Fehler, füge Funktionen hinzu,
+erstelle temporären Code und so weiter und 'commite' Deine Änderungen
oft. Dann:
$ git checkout bereinigt
$ git cherry-pick mischmasch^^
wendet den Urahn des obersten 'Commit' des ``mischmasch'' 'Branch' auf den
-``bereinigt'' 'Branch' an. Durch das Herauspicken der Rosinen kannst du
+``bereinigt'' 'Branch' an. Durch das Herauspicken der Rosinen kannst Du
einen 'Branch' konstruieren, der nur endgültigen Code enthält und
zusammengehörige 'Commits' gruppiert hat.
=== 'Branches' verwalten ===
-Ein Liste aller 'Branches' bekommst du mit:
+Ein Liste aller 'Branches' bekommst Du mit:
$ git branch
-Standardmäßig beginnst du in einem 'Branch' namens ``master''. Einige
+Standardmäßig beginnst Du in einem 'Branch' namens ``master''. Einige
plädieren dafür, den ``master'' 'Branch' unangetastet zu lassen und für
seine Arbeit einen neuen 'Branch' anzulegen.
@@ -252,22 +252,22 @@ Die *-d* und *-m* Optionen erlauben dir 'Branches' zu löschen und zu
verschieben (umzubenennen). Siehe *git help branch*.
Der ``master'' 'Branch' ist ein nützlicher Brauch. Andere können davon
-ausgehen, dass dein 'Repository' einen 'Branch' mit diesem Namen hat und
-dass er die offizielle Version enthält. Auch wenn du den ``master'' 'Branch'
-umbenennen oder auslöschen könntest, kannst du diese Konvention aber auch
+ausgehen, dass Dein 'Repository' einen 'Branch' mit diesem Namen hat und
+dass er die offizielle Version enthält. Auch wenn Du den ``master'' 'Branch'
+umbenennen oder auslöschen könntest, kannst Du diese Konvention aber auch
respektieren.
=== Temporäre 'Branches' ===
-Nach einer Weile wirst du feststellen, dass du regelmäßig kurzlebige
+Nach einer Weile wirst Du feststellen, dass Du regelmäßig kurzlebige
'Branches' erzeugst, meist aus dem gleichen Grund: jeder neue 'Branch' dient
-lediglich dazu, den aktuellen Stand zu sichern, damit du kurz zu einem alten
-Stand zurück kannst um eine vorrangige Fehlerbehebung zu machen oder
+lediglich dazu, den aktuellen Stand zu sichern, damit Du kurz zu einem alten
+Stand zurück kannst, um eine vorrangige Fehlerbehebung zu machen oder
irgendetwas anderes.
-Es ist vergleichbar mit dem kurzzeitigen Umschalten des Fernsehkanals um zu
-sehen was auf dem anderen Kanal los ist. Doch anstelle ein paar Knöpfe zu
-drücken, machst du 'create', 'check out', 'merge' und 'delete' von
+Es ist vergleichbar mit dem kurzzeitigen Umschalten des Fernsehkanals, um zu
+sehen, was auf dem anderen Kanal los ist. Doch anstelle ein paar Knöpfe zu
+drücken, machst du 'create', 'checkout', 'merge' und 'delete' von
temporären 'Branches'. Glücklicherweise hat Git eine Abkürzung dafür, die
genauso komfortabel ist wie eine Fernbedienung:
@@ -275,30 +275,30 @@ genauso komfortabel ist wie eine Fernbedienung:
Das sichert den aktuellen Stand an einem temporären Ort ('stash'=Versteck)
und stellt den vorherigen Stand wieder her. Dein Arbeitsverzeichnis
-erscheint wieder exakt in dem Zustand wie es war, bevor du anfingst zu
-editieren. Nun kannst du Fehler beheben, Änderungen vom zentralen
-'Repository' holen ('pull') und so weiter. Wenn du wieder zurück zu deinen
+erscheint wieder exakt in dem Zustand, wie es war, bevor Du anfingst zu
+editieren. Nun kannst Du Fehler beheben, Änderungen vom zentralen
+'Repository' holen ('pull') und so weiter. Wenn Du wieder zurück zu Deinen
Änderungen willst, tippe:
- $ git stash apply # Es kann sein, dass du Konflikte auflösen musst.
+ $ git stash apply # Es kann sein, dass Du Konflikte auflösen musst.
Du kannst mehrere 'stashes' haben und diese unterschiedlich handhaben. Siehe
-*git help stash*. Wie du dir vielleicht schon gedacht hast, verwendet Git
-'Branches' im Hintergrund um diesen Zaubertrick durchzuführen.
+*git help stash*. Wie Du Dir vielleicht schon gedacht hast, verwendet Git
+'Branches' im Hintergrund, um diesen Zaubertrick durchzuführen.
-=== Arbeite wie du willst ===
+=== Arbeite, wie Du willst ===
-Du magst dich fragen, ob 'Branches' diesen Aufwand Wert sind. Immerhin sind
-'Clone' fast genauso schnell und du kannst mit *cd* anstelle von
+Du magst Dich fragen, ob 'Branches' diesen Aufwand wert sind. Immerhin sind
+'Clone' fast genauso schnell, und Du kannst mit *cd* anstelle von
esoterischen Git Befehlen zwischen ihnen wechseln.
Betrachten wir Webbrowser. Warum mehrere Tabs unterstützen und mehrere
-Fenster? Weil beides zu erlauben eine Vielzahl an Stilen unterstützt. Einige
+Fenster? Weil beides zu erlauben, eine Vielzahl an Stilen unterstützt. Einige
Anwender möchten nur ein Browserfenster geöffnet haben und benutzen Tabs für
unterschiedliche Webseiten. Andere bestehen auf dem anderen Extrem: mehrere
Fenster, ganz ohne Tabs. Wieder andere bevorzugen irgendetwas dazwischen.
-'Branchen' ist wie Tabs für dein Arbeitsverzeichnis und 'Clonen' ist wie das
+'Branchen' ist wie Tabs für dein Arbeitsverzeichnis, und 'Clonen' ist wie das
Öffnen eines neuen Browserfenster. Diese Operationen sind schnell und lokal,
-also warum nicht damit experimentieren um die beste Kombination für sich
-selbst zu finden? Git lässt dich genauso arbeiten, wie du es willst.
+also warum nicht damit experimentieren, um die beste Kombination für sich
+selbst zu finden? Git lässt Dich genauso arbeiten, wie Du es willst.
diff --git a/de/clone.txt b/de/clone.txt
index 9731db70..3f6f65e4 100644
--- a/de/clone.txt
+++ b/de/clone.txt
@@ -1,23 +1,23 @@
== Rund ums 'Clonen' ==
-In älteren Versionsverwaltungssystemen ist 'checkout' die Standardoperation
+In älteren Versionsverwaltungssystemen ist 'checkout' die Standardoperation,
um Dateien zu bekommen. Du bekommst einen Haufen Dateien eines bestimmten
Sicherungsstands.
In Git und anderen verteilten Versionsverwaltungssystemen ist 'clone' die
-Standardaktion. Um Dateien zu bekommen, erstellst du einen 'Clone' des
-gesamten 'Repository'. Oder anders gesagt, du spiegelst den zentralen
-Server. Alles, was man mit dem zentralen 'Repository' tun kann, kannst du
+Standardaktion. Um Dateien zu bekommen, erstellst Du einen 'Clone' des
+gesamten 'Repository'. Oder anders gesagt, Du spiegelst den zentralen
+Server. Alles, was man mit dem zentralen 'Repository' tun kann, kannst Du
auch mit deinem 'Clone' tun.
=== Computer synchronisieren ===
-Es ist akzeptabel, für Datensicherungen und einfaches Synchronisieren, mit
+Es ist akzeptabel, für Datensicherungen und einfaches Synchronisieren mit
'tarball' Archiven oder *rsync* zu arbeiten. Aber manchmal arbeite ich an
-meinem Laptop, dann an meinem Desktop-PC und die beiden haben sich
+meinem Laptop, dann an meinem Desktop-PC, und die beiden haben sich
inzwischen nicht austauschen können.
-Erstelle ein Git 'Repository' und 'commite' deine Dateien auf dem einen
+Erstelle ein Git 'Repository' und 'commite' Deine Dateien auf dem einen
Rechner. Dann auf dem anderen:
$ git clone anderer.computer:/pfad/zu/dateien
@@ -28,14 +28,14 @@ jetzt an wird
$ git commit -a
$ git pull anderer.computer:/pfad/zu/dateien HEAD
-den Zustand der Dateien des anderen Computer auf den übertragen, an dem du
-gerade arbeitest. Solltest du kürzlich konkurrierende Änderungen an der
-selben Datei vorgenommen haben, lässt Git dich das wissen und musst erneut
-'commiten' nachdem du die Konflikte aufgelöst hast.
+den Zustand der Dateien des anderen Computer auf den übertragen, an dem Du
+gerade arbeitest. Solltest Du kürzlich konkurrierende Änderungen an der
+selben Datei vorgenommen haben, lässt Git Dich das wissen, und Du musst erneut
+'commiten', nachdem Du die Konflikte aufgelöst hast.
=== Klassische Quellcodeverwaltung ===
-Erstelle ein Git 'Repository' für deine Dateien:
+Erstelle ein Git 'Repository' für Deine Dateien:
$ git init
$ git add .
@@ -61,7 +61,7 @@ Website aus.
$ git push zentraler.server/pfad/zu/proj.git HEAD
-Um die Quellcodes abzurufen gibt ein Entwickler folgendes ein:
+Um die Quellcodes abzurufen, gibt ein Entwickler folgendes ein:
$ git clone zentraler.server/pfad/zu/proj.git
@@ -83,7 +83,7 @@ Um die lokalen Änderungen in das zentrale 'Repository' zu übertragen:
$ git push
Wenn inzwischen neue Änderungen von anderen Entwicklern beim Hauptserver
-eingegangen sind, schlägt dein 'push' fehl. Aktualisiere das lokale
+eingegangen sind, schlägt Dein 'push' fehl. Aktualisiere das lokale
'Repository' erneut mit 'pull', löse eventuell aufgetretene
'Merge'-Konflikte und versuche es nochmal.
@@ -115,14 +115,14 @@ Geschichte eines Projekts, enthält aber niemals einen Auszug irgendeiner
beliebigen Version.
Ein 'bare Repository' übernimmt die Rolle des Hauptserver in einem
-zentralisierten Versionsverwaltungssystem: Das Zuhause deines
-Projekts. Entwickler 'clonen' dein Projekt davon und 'pushen' die letzten
+zentralisierten Versionsverwaltungssystem: Das Zuhause Deines
+Projekts. Entwickler 'clonen' Dein Projekt davon und 'pushen' die letzten
offiziellen Änderungen dort hin. Meistens befindet es sich auf einem Server,
der nicht viel tut außer Daten zu verbreiten. Die Entwicklung findet in den
'Clonen' statt, so kann das Heim-'Repository' ohne Arbeitsverzeichnis
auskommen.
-Viele Git Befehle funktionieren nicht in 'bare Repositories'. Es sei denn
+Viele Git Befehle funktionieren nicht in 'bare Repositories'. Es sei denn,
die `GIT_DIR` Umgebungsvariable wird auf das Arbeitsverzeichnis gesetzt,
oder die `--bare` Option wird übergeben.
@@ -143,16 +143,16 @@ Wie auch immer, abgesehen von diesem Fall, raten wir vom 'Pushen' in ein
Verwirrungen entstehen.
Kurzum, während du lernst mit Git umzugehen, 'pushe' nur, wenn das Ziel ein
-'bare Repository' ist; andernfalls benutze 'pull'.
+'bare Repository' ist, andernfalls benutze 'pull'.
=== 'Fork' eines Projekts ===
-Hast du es satt, wie sich ein Projekt entwickelt? Du denkst, du kannst das
+Hast Du es satt, wie sich ein Projekt entwickelt? Du denkst, Du kannst das
besser? Dann mache folgendes auf deinem Server:
$ git clone git://haupt.server/pfad/zu/dateien
-Dann erzähle jedem von deiner 'Fork' des Projekts auf deinem Server.
+Dann erzähle jedem von Deinem 'Fork' des Projekts auf Deinem Server.
Zu jedem späteren Zeitpunkt kannst du die Änderungen des Originalprojekts
'mergen' mit:
@@ -162,14 +162,14 @@ Zu jedem späteren Zeitpunkt kannst du die Änderungen des Originalprojekts
=== Ultimative Datensicherung ===
Du willst zahlreiche, vor Manipulation geschützte, redundante
-Datensicherungen an unterschiedlichen Orten? Wenn dein Projekt viele
-Entwickler hat, musst du nichts tun! Jeder 'Clone' deines Codes ist eine
-vollwertige Datensicherung. Nicht nur des aktuellen Stand, sondern der
-gesamten Geschichte. Wird irgendein 'Clone' beschädigt, wird dies dank des
-kryptographischen 'Hashing' sofort erkannt, sobald derjenige versucht mit
+Datensicherungen an unterschiedlichen Orten? Wenn Dein Projekt viele
+Entwickler hat, musst Du nichts tun! Jeder 'Clone' Deines Codes ist eine
+vollwertige Datensicherung. Nicht nur des aktuellen Stand, sondern die
+gesamte Geschichte. Wird irgendein 'Clone' beschädigt, wird dies dank des
+kryptographischen 'Hashing' sofort erkannt, sobald derjenige versucht, mit
anderen zu kommunizieren.
-Wenn dein Projekt nicht so bekannt ist, finde so viele Server wie du kannst
+Wenn Dein Projekt nicht so bekannt ist, finde so viele Server, wie Du kannst,
um dort einen 'Clone' zu platzieren.
Die wirklich Paranoiden sollten immer den letzten 20-Byte SHA1 Hash des
@@ -180,8 +180,8 @@ Zeitungskopie zu manipulieren.
=== Multitasking mit Lichtgeschwindigkeit ===
-Nehmen wir an du willst parallel an mehreren Funktionen arbeiten. Dann
-'commite' dein Projekt und gib ein:
+Nehmen wir an Du willst parallel an mehreren Funktionen arbeiten. Dann
+'commite' Dein Projekt und gib ein:
$ git clone . /irgendein/neuer/ordner
@@ -190,7 +190,7 @@ dass ein lokaler Klon weniger Zeit und Speicherplatz benötigt als eine
herkömmliche Datensicherung.
Du kannst nun an zwei unabhängigen Funktionen gleichzeitig arbeiten. Zum
-Beispiel kannst Du einen Klon bearbeiten, während der andere kompiliert
+Beispiel kannst Du an einen Klon bearbeiten, während der andere kompiliert
wird. Zu jeder Zeit kannst Du 'comitten' und die Änderungen des anderen Klon
'pullen'.
@@ -198,8 +198,8 @@ wird. Zu jeder Zeit kannst Du 'comitten' und die Änderungen des anderen Klon
=== Versionsverwaltung im Untergrund ===
-Arbeitest du an einem Projekt, das ein anderes Versionsverwaltungssystem
-nutzt und vermisst du Git? Dann erstelle ein Git 'Repository' in deinem
+Arbeitest Du an einem Projekt, das ein anderes Versionsverwaltungssystem
+nutzt und vermisst Du Git? Dann erstelle ein Git 'Repository' in deinem
Arbeitsverzeichnis:
$ git init
@@ -211,7 +211,7 @@ dann 'Clone' es:
$ git clone . /irgendein/neuer/ordner
Nun gehe in das neue Verzeichnis und arbeite dort mit Git nach
-Herzenslust. Irgendwann wirst du dann mit den anderen synchronisieren
+Herzenslust. Irgendwann wirst Du dann mit den anderen synchronisieren
wollen, dann gehe in das Originalverzeichnis, aktualisiere mit dem anderen
Versionsverwaltungssystem und gib ein:
@@ -223,16 +223,16 @@ Dann gehe wieder ins neue Verzeichnis und gib ein:
$ git commit -a -m "Beschreibung der Änderungen"
$ git pull
-Die Vorgehensweise, wie du deine Änderungen den anderen übergibst, hängt vom
+Die Vorgehensweise, wie Du Deine Änderungen den anderen übergibst, hängt vom
anderen Versionsverwaltungssystem ab. Das neue Verzeichnis enthält die
Dateien mit deinen Änderungen. Führe die Anweisungen des anderen
-Versionsverwaltungssystems aus, die nötig sind um die Dateien ins zentrale
+Versionsverwaltungssystems aus, die nötig sind, um die Dateien ins zentrale
'Repository' zu übertragen.
Subversion, vielleicht das beste zentralisierte Versionsverwaltungssystem,
wird von unzähligen Projekten benutzt. Der *git svn*-Befehl automatisiert
den zuvor genannten Ablauf für Subversion 'Repositories' und kann auch
-benutzt werden um
+benutzt werden, um
http://google-opensource.blogspot.com/2008/05/export-git-project-to-google-code.html[ein
Git Projekt in ein Subversion 'Repository' zu exportieren].
@@ -243,7 +243,7 @@ Git zusammenarbeiten kann. Mit der `hg-git`-Erweiterung kann ein Benutzer
von Mercurial verlustfrei in ein Git 'Repository' 'pushen' und daraus
'pullen'.
-Beschaffe dir die `hg-git`-Erweiterung mit Git:
+Beschaffe Dir die `hg-git`-Erweiterung mit Git:
$ git clone git://github.com/schacon/hg-git.git
@@ -269,7 +269,7 @@ Zum Konvertieren gib in einem leeren Verzeichnis ein:
$ git init
$ hg-fast-export.sh -r /hg/repo
-nachdem du das Skript zu deinem `$PATH` hinzugefügt hast.
+nachdem Du das Skript zu deinem `$PATH` hinzugefügt hast.
=== Bazaar ===
@@ -302,9 +302,9 @@ süchtig nach schellen Ausführungszeiten.
Ich dachte darüber nach, wie Git verbessert werden könnte, ging sogar so
weit, dass ich meine eigene Git-Ähnliche Anwendung schrieb, allerdings nur
als akademische Übungen. Hätte ich mein Projekt fertig gestellt, wäre ich
-trotzdem bei Git geblieben, denn die Verbesserungen wären zu gering gewesen
+trotzdem bei Git geblieben, denn die Verbesserungen wären zu gering gewesen,
um den Einsatz eines Eigenbrödler-Systems zu rechtfertigen.
-Natürlich können deine Bedürfnisse und Wünsche ganz anders sein und
-vielleicht bist du mit einem anderen System besser dran. Wie auch immer, mit
-Git kannst du nicht viel falsch machen.
+Natürlich können Deine Bedürfnisse und Wünsche ganz anders sein und
+vielleicht bist Du mit einem anderen System besser dran. Wie auch immer, mit
+Git kannst Du nicht viel falsch machen.
diff --git a/de/drawbacks.txt b/de/drawbacks.txt
index c74cf72d..ad0e5427 100644
--- a/de/drawbacks.txt
+++ b/de/drawbacks.txt
@@ -9,9 +9,9 @@ noch besser, anpacken und mithelfen.
=== SHA1 Schwäche ===
Mit der Zeit entdecken Kryptographen immer mehr Schwächen an SHA1. Schon
-heute wäre es technisch machbar für finanzkräftige Unternehmen
+heute wäre für finanzkräftige Unternehmen es technisch machbar,
Hash-Kollisionen zu finden. In ein paar Jahren hat vielleicht schon ein ganz
-normaler Heim-PC ausreichend Rechenleistung um ein Git 'Reopsitory'
+normaler Heim-PC ausreichend Rechenleistung, um ein Git 'Reopsitory'
unbemerkt zu korrumpieren.
Hoffentlich stellt Git auf eine bessere Hash Funktion um, bevor die
@@ -24,7 +24,7 @@ Git unter Microsoft Windows kann frustrierend sein:
- http://cygwin.com/[Cygwin], eine Linux ähnliche Umgebung für Windows,
enthält http://cygwin.com/packages/git/[eine Windows Portierung von Git].
-- http://code.google.com/p/msysgit/[Git unter MSys] ist eine Alternative,
+- https://gitforwindows.org/[Git für Windows] ist eine Alternative,
die sehr wenig Laufzeitunterstützung erfordert, jedoch bedürfen einige
Kommandos noch einer Überarbeitung.
@@ -43,7 +43,7 @@ willst.
=== Wer macht was? ===
-Einige Versionsverwaltungssysteme zwingen Dich explizit eine Datei auf
+Einige Versionsverwaltungssysteme zwingen Dich explizit, eine Datei auf
irgendeine Weise für die Bearbeitung zu kennzeichnen. Obwohl es extrem
lästig ist, wenn es die Kommunikation mit einem zentralen Server erfordert,
so hat es doch zwei Vorteile:
@@ -63,11 +63,11 @@ aufrufen, wenn sie eine Datei bearbeiten.
Da Git die Änderungen über das gesamte Projekt aufzeichnet, erfordert die
Rekonstruktion des Verlaufs einer einzelnen Datei mehr Aufwand als in
-Versionsverwaltungssystemen die einzelne Dateien überwachen.
+Versionsverwaltungssystemen, die einzelne Dateien überwachen.
Die Nachteile sind üblicherweise gering und werden gern in Kauf genommen, da
andere Operationen dafür unglaublich effizient sind. Zum Beispiel ist `git
-checkout` schneller als `cp -a` und projektweite Unterschiede sind besser zu
+checkout` schneller als `cp -a`, und projektweite Unterschiede sind besser zu
komprimieren als eine Sammlung von Änderungen auf Dateibasis.
=== Der erster Klon ===
@@ -77,7 +77,7 @@ Versionsverwaltungssystemen, wenn ein längerer Verlauf existiert.
Der initiale Aufwand lohnt sich aber auf längere Sicht, da die meisten
zukünftigen Operationen dann schnell und offline erfolgen. Trotzdem gibt es
-Situationen, in denen es besser ist einen oberflächlichen Klon mit der
+Situationen, in denen es besser ist, einen oberflächlichen Klon mit der
`--depth` Option zu erstellen. Das geht wesentlich schneller, aber der
resultierende Klon hat nur eingeschränkte Funktionalität.
@@ -104,11 +104,11 @@ gesucht, nicht ein Versionsverwaltungssystem. Ein Versionsverwaltungssystem
zum Beispiel ist eine ungeeignete Lösung um Fotos zu verwalten, die
periodisch von einer Webcam gemacht werden.
-Wenn die Dateien sich tatsächlich konstant verändern und sie wirklich
-versioniert werden müssen, ist es eine Möglichkeit Git in zentralisierter
+Wenn die Dateien sich tatsächlich konstant verändern, und sie wirklich
+versioniert werden müssen, ist es eine Möglichkeit, Git in zentralisierter
Form zu verwenden. Jeder kann oberflächliche Klone erstellen, die nur wenig
oder gar nichts vom Verlauf des Projekts enthalten. Natürlich sind dann
-viele Git Funktionen nicht verfügbar und Änderungen müssen als 'Patches'
+viele Git Funktionen nicht verfügbar, und Änderungen müssen als 'Patches'
übermittelt werden. Das funktioniert wahrscheinlich ganz gut, wenn auch
unklar ist, warum jemand die Versionsgeschichte von wahnsinnig instabilen
Dateien braucht.
@@ -121,7 +121,7 @@ unnötig auf.
In diesem Fall sollte der Quellcode der Firmware in einem Git 'Repository'
gehalten werden und die Binärdatei außerhalb des Projekts. Um das Leben zu
-vereinfachen, könnte jemand ein Skript erstellen, das Git benutzt um den
+vereinfachen, könnte jemand ein Skript erstellen, das Git benutzt, um den
Quellcode zu klonen und 'rsync' oder einen oberflächlichen Klon für die
Firmware.
@@ -143,7 +143,7 @@ alle relevant.
=== Leere Unterverzeichnisse ===
Leere Unterverzeichnisse können nicht überwacht werden. Erstelle eine
-Dummy-Datei um dieses Problem zu umgehen.
+Dummy-Datei, um dieses Problem zu umgehen.
Die aktuelle Implementierung von Git, weniger sein Design, ist
verantwortlich für diesen Pferdefuß. Mit etwas Glück, wenn Git's Verbreitung
@@ -165,8 +165,8 @@ dem Erstellen eines 'Repository' wird der 'HEAD' auf eine Zeichenfolge von
'Repositories'.
Würde dann zum Beispiel *git log* ausgeführt, würde der Anwender darüber
-informiert, daß noch keine 'Commits' gemacht wurden, anstelle mit einem
-fatalen Fehler zu beenden. Das gilt stellvertretenden für andere
+informiert, dass noch keine 'Commits' gemacht wurden, anstelle mit einem
+fatalen Fehler zu beenden. Das gilt stellvertretend für andere
Anweisungen.
Jeder initiale 'Commit' ist dann stillschweigend ein Abkömmling dieses
diff --git a/de/grandmaster.txt b/de/grandmaster.txt
index 40bc74fd..178c0ab7 100644
--- a/de/grandmaster.txt
+++ b/de/grandmaster.txt
@@ -41,7 +41,7 @@ hinzufügen.
=== Mein 'Commit' ist zu groß! ===
Hast Du es zu lange versäumt zu 'comitten'? Hast Du so versessen
-programmiert, daß Du darüber die Quellcodeverwaltung vergessen hast? Machst
+programmiert, dass Du darüber die Quellcodeverwaltung vergessen hast? Machst
Du eine Serie von unabhängigen Änderungen, weil es Dein Stil ist?
Keine Sorge, gib ein:
@@ -49,7 +49,7 @@ Keine Sorge, gib ein:
$ git add -p
Für jede Änderung, die Du gemacht hast, zeigt Git Dir die Codepassagen, die
-sich geändert haben und fragt ob sie Teil des nächsten 'Commit' sein
+sich geändert haben und fragt, ob sie Teil des nächsten 'Commit' sein
sollen. Antworte mit "y" für Ja oder "n" für Nein. Du hast auch noch andere
Optionen, z.B. den Aufschub der Entscheidung; drücke "?" um mehr zu
erfahren.
@@ -58,40 +58,40 @@ Wenn Du zufrieden bist, gib
$ git commit
-ein um exakt die ausgewählten Änderungen zu 'comitten' (die "inszenierten"
+ein, um exakt die ausgewählten Änderungen zu 'comitten' (die "inszenierten"
Änderungen). Achte darauf, nicht die Option *-a* einzusetzen, anderenfalls
wird Git alle Änderungen 'comitten'.
Was ist, wenn Du viele Dateien an verschiedenen Orten bearbeitet hast? Jede
-Datei einzeln nachzuprüfen ist frustrierend und ermüdend. In diesem Fall
+Datei einzeln nachzuprüfen, ist frustrierend und ermüdend. In diesem Fall
verwende *git add -i*, dessen Bedienung ist nicht ganz einfach, dafür aber
sehr flexibel. Mit ein paar Tastendrücken kannst Du mehrere geänderte
Dateien für den 'Commit' hinzufügen ('stage') oder entfernen ('unstage')
oder Änderungen einzelner Dateien nachprüfen und hinzufügen. Alternativ
kannst Du *git commit \--interactive* verwenden, was dann automatisch die
-ausgewählten Änderungen 'commited' nachdem Du fertig bist.
+ausgewählten Änderungen 'commited', nachdem Du fertig bist.
=== Der Index: Git's Bereitstellungsraum ===
Bis jetzt haben wir Git's berühmten 'Index' gemieden, aber nun müssen wir
-uns mit ihm auseinandersetzen um das bisherige zu erklären. Der Index ist
+uns mit ihm auseinandersetzen, um das bisherige zu erklären. Der Index ist
ein temporärer Bereitstellungsraum. Git tauscht selten Daten direkt zwischen
Deinem Projekt und seiner Versionsgeschichte aus. Vielmehr schreibt Git die
Daten zuerst in den Index, danach kopiert es die Daten aus dem Index an
ihren eigentlichen Bestimmungsort.
Zum Beispiel ist *commit -a* eigentlich ein zweistufiger Prozess. Der erste
-Schritt erstellt einen Schnappschuß des aktuellen Status jeder überwachten
-Datei im Index. Der zweite Schritt speichert dauerhaft den Schnappschuß, der
+Schritt erstellt einen Schnappschuss des aktuellen Status jeder überwachten
+Datei im Index. Der zweite Schritt speichert dauerhaft den Schnappschuss, der
sich nun im Index befindet. Ein 'Commit' ohne die *-a* Option führt nur den
zweiten Schritt aus und macht nur wirklich Sinn, wenn zuvor eine Anweisung
angewendet wurde, welche den Index verändert, wie zum Beispiel *git add*.
-Normalerweise können wir den Index ignorieren und so tun als würden wir
+Normalerweise können wir den Index ignorieren und so tun, als würden wir
direkt aus der Versionsgeschichte lesen oder in sie schreiben. In diesem
Fall wollen wir aber mehr Kontrolle, also manipulieren wir den Index. Wir
-erstellen einen Schnappschuß einiger, aber nicht aller unser Änderungen im
-Index und speichern dann diesen sorgfältig zusammengestellten Schnappschuß
+erstellen einen Schnappschuss einiger, aber nicht aller unser Änderungen im
+Index und speichern dann diesen sorgfältig zusammengestellten Schnappschuss
permanent.
=== Verliere nicht Deinen KOPF ===
@@ -103,8 +103,8 @@ Anweisungen lassen Dich ihn manipulieren. Zum Beispiel:
$ git reset HEAD~3
bewegt den HEAD Bezeichner drei 'Commits' zurück. Dadurch agieren nun alle
-Git Anweisungen als hätte es die drei letzten 'Commits' nicht gegeben,
-während deine Dateien unverändert erhalten bleiben. Siehe auf der Git
+Git Anweisungen, als hätte es die drei letzten 'Commits' nicht gegeben,
+während Deine Dateien unverändert erhalten bleiben. Siehe auf der Git
Hilfeseite für einige Anwendungsbeispiele.
Aber wie kannst Du zurück in die Zukunft? Die vergangenen 'Commits' wissen
@@ -123,11 +123,11 @@ ORIG_HEAD und Du kannst gesund und munter zurückkehren mit:
=== KOPF-Jagd ===
Möglicherweise reicht ORIG_HEAD nicht aus. Vielleicht hast Du gerade
-bemerkt, dass Du einen kapitalen Fehler gemacht hast und nun musst Du zu
+bemerkt, dass Du einen kapitalen Fehler gemacht hast, und nun musst Du zu
einem uralten 'Commit' in einem länst vergessenen 'Branch' zurück.
Standardmäßig behält Git einen 'Commit' für mindesten zwei Wochen, sogar
-wenn Du Git anweist den 'Branch' zu zerstören, in dem er enthalten ist. Das
+wenn Du Git anweist, den 'Branch' zu zerstören, in dem er enthalten ist. Das
Problem ist, den entsprechenden SHA1-Wert zu finden. Du kannst Dir alle
SHA1-Werte in `.git/objects` vornehmen und ausprobieren ob Du den gesuchten
'Commit' findest. Aber es gibt einen viel einfacheren Weg.
@@ -135,7 +135,7 @@ SHA1-Werte in `.git/objects` vornehmen und ausprobieren ob Du den gesuchten
Git speichert jeden errechneten SHA1-Wert eines 'Commits' in
`.git/logs`. Das Unterverzeichnis `refs` enthält den Verlauf aller
Aktivitäten auf allen 'Branches', während `HEAD` alle SHA1-Werte enthält,
-die jemals diese Bezeichnung hatten. Die letztere kann verwendet werden um
+die jemals diese Bezeichnung hatten. Die letztere kann verwendet werden, um
SHA1-Werte von 'Commits' zu finden, die sich in einem 'Branch' befanden, der
versehentlich gestutzt wurde.
@@ -181,7 +181,7 @@ sind nur winzige Skripte, wie Zwerge auf den Schultern von Riesen. Mit ein
bisschen Handarbeit kannst Du Git anpassen, damit es Deinen Anforderungen
entspricht.
-Ein einfacher Trick ist es die in Git integrierte Aliasfunktion zu verwenden
+Ein einfacher Trick ist es, die in Git integrierte Aliasfunktion zu verwenden,
um die am häufigsten benutzten Anweisungen zu verkürzen:
$ git config --global alias.co checkout
@@ -211,14 +211,14 @@ Versionsgeschichte mit dem original 'Repository' teilt:
$ git-new-workdir ein/existierendes/repo neues/verzeichnis
Das neue Verzeichnis und die Dateien darin kann man sich als 'Clone'
-vorstellen, mit dem Unterschied, dass durch die gemeinschaftliche
+vorstellen mit dem Unterschied, dass durch die gemeinschaftliche
Versionsgeschichte die beiden Versionen automatisch synchron bleiben. Eine
Synchronisierung mittels 'merge', 'push' oder 'pull' ist nicht notwendig.
=== Gewagte Kunststücke ===
-Heutzutage macht es Git dem Anwender schwer versehentlich Daten zu
-zerstören. Aber, wenn man weiß was man tut, kann man die Schutzmaßnahmen der
+Heutzutage macht es Git dem Anwender schwer, versehentlich Daten zu
+zerstören. Aber, wenn man weiß, was man tut, kann man die Schutzmaßnahmen der
häufigsten Anweisungen umgehen.
*Checkout*: Nicht versionierte Änderungen lassen 'checkout' scheitern. Um trotzdem die Änderungen zu zerstören und einen vorhandenen 'Commit' abzurufen, benutzen wir die 'force' Option:
@@ -226,7 +226,7 @@ häufigsten Anweisungen umgehen.
$ git checkout -f HEAD^
Auf der anderen Seite, wenn Du einen speziellen Pfad für 'checkout' angibst,
-gibt es keinen Sicherheitsüberprüfungen mehr. Der angegebene Pfad wird
+gibt es keine Sicherheitsüberprüfungen mehr. Der angegebene Pfad wird
stillschweigend überschrieben. Sei vorsichtig, wenn Du 'checkout' auf diese
Weise benutzt.
@@ -238,7 +238,7 @@ Weise benutzt.
$ git branch -D dead_branch # instead of -d
-Ebenso scheitert der Versuch einen 'Branch' durch ein 'move' zu
+Ebenso scheitert der Versuch, einen 'Branch' durch ein 'move' zu
überschreiben, wenn das einen Datenverlust zur Folge hat. Um das Verschieben
zu erzwingen, gib ein:
diff --git a/de/history.txt b/de/history.txt
index 6b9c8a64..25c0583e 100644
--- a/de/history.txt
+++ b/de/history.txt
@@ -1,28 +1,28 @@
== Geschichtsstunde ==
Eine Folge von Git's verteilter Natur ist, dass die Chronik einfach
-verändert werden kann. Aber, wenn du an der Vergangenheit manipulierst, sei
-vorsichtig: verändere nur den Teil der Chronik, den du ganz alleine hast. So
+verändert werden kann. Aber, wenn Du an der Vergangenheit manipulierst, sei
+vorsichtig: verändere nur den Teil der Chronik, den Du ganz alleine hast. So
wie Nationen ewig diskutieren, wer welche Greueltaten vollbracht hat, wirst
-du beim Abgleichen in Schwierigkeiten geraten, falls jemand einen 'Clone'
+Du beim Abgleichen in Schwierigkeiten geraten, falls jemand einen 'Clone'
mit abweichender Chronik hat und die Zweige sich austauschen sollen.
Einige Entwickler setzen sich nachhaltig für die Unantastbarkeit der Chronik
-ein, mit allen Fehlern, Nachteilen und Mängeln. Andere denken, daß Zweige
+ein, mit allen Fehlern, Nachteilen und Mängeln. Andere denken, dass Zweige
vorzeigbar gemacht werden sollten, bevor sie auf die Öffentlichkeit
losgelassen werden. Git versteht beide Gesichtspunkte. Wie 'Clonen',
'Branchen' und 'Mergen' ist das Umschreiben der Chronik lediglich eine
-weitere Stärke, die Git dir bietet. Es liegt an dir diese weise zu nutzen.
+weitere Stärke, die Git Dir bietet. Es liegt an Dir, diese Weise zu nutzen.
=== Ich nehme alles zurück ===
-Hast du gerade 'commitet', aber du hättest gerne eine andere Beschreibung
+Hast Du gerade 'commitet', aber Du hättest gerne eine andere Beschreibung
eingegeben? Dann gib ein:
$ git commit --amend
-um die letzte Beschreibung zu ändern. Du merkst, dass du vergessen hast eine
-Datei hinzuzufügen? Führe *git add* aus um sie hinzuzufügen und dann die
+um die letzte Beschreibung zu ändern. Du merkst, dass Du vergessen hast, eine
+Datei hinzuzufügen? Führe *git add* aus, um sie hinzuzufügen, und dann die
vorhergehende Anweisung.
Du willst noch ein paar Änderungen zu deinem letzten 'Commit' hinzufügen?
@@ -33,17 +33,17 @@ Dann mache diese Änderungen und gib ein:
=== ... und noch viel mehr ===
Nehmen wir jetzt an, das vorherige Problem ist zehnmal schlimmer. Nach einer
-längeren Sitzung hast du einen Haufen 'Commits' gemacht. Aber du bist mit
-der Art der Organisation nicht glücklich und einige 'Commits' könnten etwas
+längeren Sitzung hast Du einen Haufen 'Commits' gemacht. Aber Du bist mit
+der Art der Organisation nicht glücklich, und einige 'Commits' könnten etwas
umformuliert werden. Dann gib ein:
$ git rebase -i HEAD~10
-und die letzten zehn 'Commits' erscheinen in deinem bevorzugten
+und die letzten zehn 'Commits' erscheinen in Deinem bevorzugten
$EDITOR. Auszug aus einem Beispiel:
pick 5c6eb73 Link repo.or.cz hinzugefügt
- pick a311a64 Analogien in "Arbeite wie du willst" umorganisiert
+ pick a311a64 Analogien in "Arbeite wie Du willst" umorganisiert
pick 100834f Push-Ziel zum Makefile hinzugefügt
Dann:
@@ -51,12 +51,12 @@ Dann:
- Entferne 'Commits' durch das Löschen von Zeilen.
- Organisiere 'Commits' durch verschieben von Zeilen.
- Ersetze `pick` mit:
- * `edit` um einen 'Commit' für 'amends' zu markieren.
- * `reword` um die Log-Beschreibung zu ändern.
- * `squash` um einen 'Commit' mit dem vorhergehenden zu vereinen ('merge').
- * `fixup` um einen 'Commit' mit dem vorhergehenden zu vereinen ('merge') und die Log-Beschreibung zu verwerfen.
+ * `edit`, um einen 'Commit' für 'amends' zu markieren.
+ * `reword`, um die Log-Beschreibung zu ändern.
+ * `squash`, um einen 'Commit' mit dem vorhergehenden zu vereinen ('merge').
+ * `fixup`, um einen 'Commit' mit dem vorhergehenden zu vereinen ('merge') und die Log-Beschreibung zu verwerfen.
-Speichere und Beende. Wenn du einen 'Commit' mit 'edit' markiert hast, gib
+Speichere und Beende. Wenn Du einen 'Commit' mit 'edit' markiert hast, gib
ein:
$ git commit --amend
@@ -65,14 +65,14 @@ Ansonsten:
$ git rebase --continue
-Also 'commite' früh und oft: du kannst später mit 'rebase' aufräumen.
+Also 'commite' früh und oft: Du kannst später mit 'rebase' aufräumen.
-=== Lokale Änderungen zum Schluß ===
+=== Lokale Änderungen zum Schluss ===
Du arbeitest an einem aktiven Projekt. Über die Zeit haben sich einige
-lokale 'Commits' angesammelt und dann synchronisierst du mit einem 'Merge'
-mit dem offiziellen Zweig. Dieser Zyklus wiederholt sich ein paar Mal bevor
-du zum 'Pushen' in den zentralen Zweig bereit bist.
+lokale 'Commits' angesammelt und dann synchronisierst Du mit einem 'Merge'
+mit dem offiziellen Zweig. Dieser Zyklus wiederholt sich ein paar Mal, bevor
+Du zum 'Pushen' in den zentralen Zweig bereit bist.
Aber nun ist die Chronik in deinem lokalen Git-'Clone' ein chaotisches
Durcheinander deiner Änderungen und den Änderungen vom offiziellen Zweig. Du
@@ -80,7 +80,7 @@ willst alle Deine Änderungen lieber in einem fortlaufenden Abschnitt und
hinter den offiziellen Änderungen sehen.
Das ist eine Aufgabe für *git rebase*, wie oben beschrieben. In vielen
-Fällen kannst du den *--onto* Schalter benutzen um Interaktion zu vermeiden.
+Fällen kannst Du den *--onto* Schalter benutzen, um Interaktion zu vermeiden.
Siehe auch *git help rebase* für ausführliche Beispiele dieser erstaunlichen
Anweisung. Du kannst auch 'Commits' aufteilen. Du kannst sogar 'Branches' in
@@ -88,28 +88,28 @@ einem 'Repository' umorganisieren.
=== Chronik umschreiben ===
-Gelegentlich brauchst du Versionsverwaltung vergleichbar dem Wegretuschieren
+Gelegentlich brauchst Du Versionsverwaltung vergleichbar dem Wegretuschieren
von Personen aus einem offiziellen Foto, um diese in stalinistischer Art aus
-der Geschichte zu löschen. Stell dir zum Beispiel vor, du willst ein Projekt
+der Geschichte zu löschen. Stell Dir zum Beispiel vor, Du willst ein Projekt
veröffentlichen, aber es enthält eine Datei, die aus irgendwelchen Gründen
privat bleiben muss. Vielleicht habe ich meine Kreditkartennummer in einer
Textdatei notiert und diese versehentlich dem Projekt hinzugefügt. Die Datei
-zu löschen ist zwecklos, da über ältere 'Commits' auf sie zugegriffen werden
+zu löschen, ist zwecklos, da über ältere 'Commits' auf sie zugegriffen werden
könnte. Wir müssen die Datei aus allen 'Commits' entfernen:
$ git filter-branch --tree-filter 'rm sehr/geheime/Datei' HEAD
Siehe *git help filter-branch*, wo dieses Beispiel erklärt und eine
-schnellere Methode vorstellt wird. Allgemein, *filter-branch* lässt dich
+schnellere Methode vorstellt wird. Allgemein, *filter-branch* lässt Dich
große Bereiche der Chronik mit einer einzigen Anweisung verändern.
Danach beschreibt der Ordner +.git/refs/original+ den Zustand der Lage vor
-der Operation. Prüfe, ob die 'filter-branch' Anweisung getan hat was du
-wolltest, dann lösche dieses Verzeichnis bevor du weitere 'filter-branch'
+der Operation. Prüfe, ob die 'filter-branch' Anweisung getan hat, was Du
+wolltest, dann lösche dieses Verzeichnis, bevor Du weitere 'filter-branch'
Operationen durchführst.
-Zuletzt, ersetze alle 'Clones' deines Projekts mit deiner überarbeiteten
-Version, falls du später mit ihnen interagieren möchtest.
+Zuletzt, ersetze alle 'Clones' Deines Projekts mit Deiner überarbeiteten
+Version, falls Du später mit ihnen interagieren möchtest.
=== Geschichte machen ===
@@ -119,9 +119,9 @@ jemand ein Skript geschrieben hat, das die gesamte Chronik für Git
exportiert.
Anderenfalls, sieh dir *git fast-import* an, das Text in einem speziellen
-Format einliest um eine Git Chronik von Anfang an zu
+Format einliest, um eine Git Chronik von Anfang an zu
erstellen. Normalerweise wird ein Skript, das diese Anweisung benutzt,
-hastig zusammengeschustert und einmalig ausgeführt um das Projekt in einem
+hastig zusammengeschustert und einmalig ausgeführt, um das Projekt in einem
einzigen Lauf zu migrieren.
Erstelle zum Beispiel aus folgendem Listing eine temporäre Datei, z.B. `/tmp/history`:
@@ -157,40 +157,40 @@ Eingabe von:
$ mkdir project; cd project; git init
$ git fast-import --date-format=rfc2822 < /tmp/history
-Die aktuellste Version des Projekts kannst du abrufen ('checkout') mit:
+Die aktuellste Version des Projekts kannst Du abrufen ('checkout') mit:
$ git checkout master .
Die Anweisung *git fast-export* konvertiert jedes 'Repository' in das *git
-fast-import* Format, diese Ausgabe kannst du studieren um Exporteure zu
-schreiben und außerdem um 'Repositories' in Klartext zu übertragen.
-untersuchen wes you can study for writing exporters, and also to transport
-repositories in a human-readable format. Wirklich, diese Anweisung kann
-Klartext-'Repositories' über reine Textkanäle übertragen.
+fast-import* Format, dessen Ausgabe Du studieren kannst, um Exporte zu
+schreiben und außerdem, um 'Repositories' im menschenlesbaren Text zu übertragen.
+
+Tatsächlich können diese Anweisungen Klartext-'Repositories' über reine
+Textkanäle übertragen.
=== Wo ging alles schief? ===
-Du hast gerade ein Funktion in deiner Anwendung entdeckt, die nicht mehr
-funktioniert und du weißt sicher, dass sie vor ein paar Monaten noch
-ging. Argh! Wo kommt dieser Fehler her? Hättest du nur die Funktion während
+Du hast gerade eine Funktion in Deiner Anwendung entdeckt, die nicht mehr
+funktioniert und Du weißt sicher, dass sie vor ein paar Monaten noch
+ging. Argh! Wo kommt dieser Fehler her? Hättest Du nur die Funktion während
der Entwicklung getestet.
-Dafür ist es nun zu spät. Wie auch immer, vorausgesetzt du hast oft
-'comittet', kann Git dir sagen, wo das Problem liegt:
+Dafür ist es nun zu spät. Wie auch immer, vorausgesetzt Du hast oft
+'comittet', kann Git Dir sagen, wo das Problem liegt:
$ git bisect start
$ git bisect bad HEAD
$ git bisect good 1b6d
-Git ruft eine Stand ab, der genau dazwischen liegt. Teste die Funktion und
-wenn sich immer noch nicht funktioniert:
+Git ruft einen Stand ab, der genau dazwischen liegt. Teste die Funktion und
+wenn sie immer noch nicht funktioniert:
$ git bisect bad
-Wenn nicht, ersetzte "bad" mit "good". Git versetzt dich wieder auf einen
+Wenn nicht, ersetzte "bad" mit "good". Git versetzt Dich wieder auf einen
Stand genau zwischen den bekannten Versionen "good" und "bad" und reduziert
-so die Möglichkeiten. Nach ein paar Durchläufen wird dich diese binäre Suche
-zu dem 'Commit' führen, der die Probleme verursacht. Wenn du deine
+so die Möglichkeiten. Nach ein paar Durchläufen wird Dich diese binäre Suche
+zu dem 'Commit' führen, der die Probleme verursacht. Wenn Du deine
Ermittlungen abgeschlossen hast, kehre zum Originalstand zurück mit:
$ git bisect reset
@@ -209,7 +209,7 @@ zwischen 1 und 127 für 'bad'. Ein negativer Rückgabewert beendet die
Du kannst noch viel mehr machen: die Hilfe erklärt, wie man
'bisect'-Operationen visualisiert, das 'bisect'-Log untersucht oder
-wiedergibt und sicher unschuldige Änderungen ausschließt um die Suche zu
+wiedergibt und sicher unschuldige Änderungen ausschließt, um die Suche zu
beschleunigen.
=== Wer ist verantwortlich? ===
@@ -218,7 +218,7 @@ Wie viele andere Versionsverwaltungssysteme hat Git eine 'blame' Anweisung:
$ git blame bug.c
-das jede Zeile in der angegebenen Datei kommentiert um anzuzeigen, wer sie
+das jede Zeile in der angegebenen Datei kommentiert, um anzuzeigen, wer sie
zuletzt geändert hat und wann. Im Gegensatz zu vielen anderen
Versionsverwaltungssystemen funktioniert diese Operation offline, es wird
nur von der lokalen Festplatte gelesen.
@@ -230,10 +230,10 @@ Chronik eine schwierige Angelegenheit und den Administratoren
vorbehalten. 'Clonen', 'Branchen' und 'Mergen' sind unmöglich ohne
Netzwerkverbindung. Ebenso grundlegende Funktionen wie das Durchsuchen der
Chronik oder das 'comitten' einer Änderung. In manchen Systemen benötigt der
-Anwender schon eine Netzwerkverbindung nur um seine eigenen Änderungen zu
+Anwender schon eine Netzwerkverbindung, nur um seine eigenen Änderungen zu
sehen oder um eine Datei zum Bearbeiten zu öffnen.
-Zentralisierte Systeme schließen es aus offline zu arbeiten und benötigen
+Zentralisierte Systeme schließen es aus, offline zu arbeiten und benötigen
teurere Netzwerkinfrastruktur, vor allem, wenn die Zahl der Entwickler
steigt. Am wichtigsten ist, dass alle Operationen bis zu einem gewissen Grad
langsamer sind, in der Regel bis zu dem Punkt, wo Anwender erweiterte
@@ -249,21 +249,21 @@ selbstverständlich. Ich habe einfach vorausgesetzt, dass andere Systeme
ähnlich sind: die Auswahl eines Versionsverwaltungssystems sollte nicht
anders sein als die Auswahl eines Texteditors oder Internetbrowser.
-Ich war geschockt, als ich später gezwungen war ein zentralisiertes System
+Ich war geschockt, als ich später gezwungen war, ein zentralisiertes System
zu benutzen. Eine unzuverlässige Internetverbindung stört mit Git nicht
sehr, aber sie macht die Entwicklung unerträglich, wenn sie so zuverlässig
wie ein lokale Festplatte sein sollte. Zusätzlich habe ich mich dabei
ertappt, bestimmte Anweisungen zu vermeiden, um die damit verbundenen
-Wartezeiten zu vermeiden und das hat mich letztendlich davon abgehalten
+Wartezeiten zu vermeiden, und das hat mich letztendlich davon abgehalten,
meinem gewohnten Arbeitsablauf zu folgen.
Wenn ich eine langsame Anweisung auszuführen hatte, wurde durch die
Unterbrechung meiner Gedankengänge dem Arbeitsfluss ein unverhältnismäßiger
-Schaden zugefügt. Während dem Warten auf das Ende der Serverkommunikation
-tat ich etwas anderes um die Wartezeit zu überbrücken, zum Beispiel E-Mails
+Schaden zugefügt. Während des Wartens auf das Ende der Serverkommunikation
+tat ich etwas anderes, um die Wartezeit zu überbrücken, zum Beispiel E-Mails
lesen oder Dokumentation schreiben. Wenn ich zur ursprünglichen Arbeit
zurückkehrte, war die Operation längst beendet und ich vergeudete noch mehr
-Zeit beim Versuch mich zu erinnern was ich getan habe. Menschen sind nicht
+Zeit beim Versuch, mich zu erinnern, was ich getan habe. Menschen sind nicht
gut im Kontextwechsel.
Da war auch ein interessanter
@@ -271,5 +271,5 @@ http://de.wikipedia.org/wiki/Tragik_der_Allmende[Tragik-der-Allmende]
Effekt: Netzwerküberlastungen erahnend, verbrauchten einzelne Individuen für
diverse Operationen mehr Netzwerkbandbreite als erforderlich, um zukünftige
Engpässe zu vermeiden. Die Summe der Bemühungen verschlimmerte die
-Überlastungen, was einzelne wiederum ermutigte noch mehr Bandbreite zu
-verbrauchen um noch längere Wartezeiten zu verhindern.
+Überlastungen, was einzelne wiederum ermutigte, noch mehr Bandbreite zu
+verbrauchen, um noch längere Wartezeiten zu verhindern.
diff --git a/de/intro.txt b/de/intro.txt
index d21edf99..77c3f1e2 100644
--- a/de/intro.txt
+++ b/de/intro.txt
@@ -1,6 +1,6 @@
== Einleitung ==
-Ich benutze eine Analogie um in die Versionsverwaltung einzuführen. Für eine
+Ich benutze eine Analogie, um in die Versionsverwaltung einzuführen. Für eine
vernünftigere Erklärung siehe
http://de.wikipedia.org/wiki/Versionsverwaltung[den Wikipedia Artikel zur
Versionsverwaltung].
@@ -8,64 +8,64 @@ Versionsverwaltung].
=== Arbeit ist Spiel ===
Ich spiele Computerspiele schon fast mein ganzes Leben. Im Gegensatz dazu
-habe ich erst als Erwachsener damit begonnen Versionsverwaltungssysteme zu
-benutzen. Ich vermute, dass ich damit nicht alleine bin und der Vergleich
-hilft vielleicht dabei die Konzepte einfacher zu erklären und zu verstehen.
+habe ich erst als Erwachsener damit begonnen, Versionsverwaltungssysteme zu
+benutzen. Ich vermute, dass ich damit nicht alleine bin, und der Vergleich
+hilft vielleicht dabei, die Konzepte einfacher zu erklären und zu verstehen.
-Stelle dir das Bearbeiten deines Codes oder deiner Dokumente wie ein
-Computerspiel vor. Wenn du gut voran gekommen bist, willst du das Erreichte
-sichern. Um das zu tun, klickst du auf auf Speichern in deinem vertrauten
+Stelle Dir das Bearbeiten deines Codes oder Deiner Dokumente wie ein
+Computerspiel vor. Wenn Du gut vorangekommen bist, willst Du das Erreichte
+sichern. Um das zu tun, klickst Du auf auf Speichern in Deinem vertrauten
Editor.
-Aber, das überschreibt die vorherige Version. Das ist wie bei den Spielen
+Aber das überschreibt die vorherige Version. Das ist wie bei den Spielen
der alten Schule, die nur Speicherplatz für eine Sicherung hatten:
-sicherlich konntest du speichern, aber du konntest nie zu einem älteren
-Stand zurück. Das war eine Schande, denn vielleicht war deine vorherige
-Sicherung an einer außergewöhnlich spannenden Stelle des Spiels, zu der du
-später gerne noch einmal zurückkehren möchtest. Oder noch schlimmer, deine
-aktuelle Sicherung ist in einem nicht lösbaren Stand, dann musst du von ganz
+sicherlich konntest Du speichern, aber Du konntest nie zu einem älteren
+Stand zurück. Das war eine Schande, denn vielleicht war Deine vorherige
+Sicherung an einer außergewöhnlich spannenden Stelle des Spiels, zu der Du
+später gerne noch einmal zurückkehren möchtest. Oder noch schlimmer, Deine
+aktuelle Sicherung ist in einem nicht lösbaren Stand, dann musst Du von ganz
vorne beginnen.
=== Versionsverwaltung ===
-Beim Editieren kannst du deine Datei durch 'Speichern unter ...' mit einem
-neuen Namen abspeichern oder du kopierst sie vor dem Speichern irgendwo hin
-um die alte Version zu erhalten. Außerdem kannst du sie komprimieren um
+Beim Editieren kannst Du Deine Datei durch 'Speichern unter ...' mit einem
+neuen Namen abspeichern oder Du kopierst sie vor dem Speichern irgendwo hin,
+um die alte Version zu erhalten. Außerdem kannst Du sie komprimieren, um
Speicherplatz zu sparen. Das ist eine primitive und mühselige Form der
Versionsverwaltung. Computerspiele machten das lange Zeit so, viele von
ihnen hatten automatisch erstellte Sicherungspunkte mit Zeitstempel.
-Jetzt lass uns das Problem etwas komplizierter machen. Sagen wir, du hast
+Jetzt lass uns das Problem etwas komplizierter machen. Sagen wir, Du hast
einen Haufen Dateien, die zusammen gehören, z.B. Quellcodes für ein Projekt
-oder Dateien einer Website. Wenn du nun eine alte Version erhalten willst,
-musst du den ganzen Ordner archivieren. Viele Versionen auf diese Art zu
-archivieren ist mühselig und kann sehr schnell teuer werden.
+oder Dateien einer Website. Wenn Du nun eine alte Version erhalten willst,
+musst Du den ganzen Ordner archivieren. Viele Versionen auf diese Art zu
+archivieren, ist mühselig und kann sehr schnell teuer werden.
Bei einigen Computerspielen bestand ein gesicherter Stand wirklich aus einem
Ordner voller Dateien. Diese Spiele versteckten die Details vor dem Spieler
-und präsentierten eine bequeme Oberfläche um verschiedene Versionen des
+und präsentierten eine bequeme Oberfläche, um verschiedene Versionen des
Ordners zu verwalten.
Versionsverwaltungen sind nicht anders. Sie alle haben bequeme
-Schnittstellen um Ordner voller Dateien zu verwalten. Du kannst den Zustand
-des Ordners sichern so oft du willst und du kannst später jeden
+Schnittstellen, um Ordner voller Dateien zu verwalten. Du kannst den Zustand
+des Ordners sichern, so oft Du willst, und du kannst später jeden
Sicherungspunkt wieder herstellen. Im Gegensatz zu den meisten
-Computerspielen sind sie aber in der Regel dafür ausgelegt sparsam mit dem
+Computerspielen sind sie aber in der Regel dafür ausgelegt, sparsam mit dem
Speicherplatz umzugehen. Normalerweise ändern sich immer nur wenige Dateien
-zwischen zwei Versionen und die Änderungen selbst sind oft nicht groß. Die
+zwischen zwei Versionen, und die Änderungen selbst sind oft nicht groß. Die
Platzersparnis beruht auf dem Speichern der Unterschiede an Stelle einer
Kopie der ganzen Datei.
=== Verteilte Kontrolle ===
-Nun stell dir ein ganz kompliziertes Computerspiel vor. So schwierig zu
-lösen, dass viele erfahrene Spieler auf der ganzen Welt beschließen sich
-zusammen zu tun und ihre gespeicherten Spielstände auszutauschen um das
+Nun stell Dir ein ganz kompliziertes Computerspiel vor. So schwierig zu
+lösen, dass viele erfahrene Spieler auf der ganzen Welt beschließen, sich
+zusammen zu tun und ihre gespeicherten Spielstände auszutauschen, um das
Spiel zu beenden. 'Speedruns' sind Beispiele aus dem echten Leben: Spieler,
die sich in unterschiedlichen Spielebenen des selben Spiels spezialisiert
-haben, arbeiten zusammen um erstaunliche Ergebnisse zu erzielen.
+haben, arbeiten zusammen, um erstaunliche Ergebnisse zu erzielen.
-Wie würdest du ein System erstellen, bei dem jeder auf einfache Weise die
+Wie würdest Du ein System erstellen, bei dem jeder auf einfache Weise die
Sicherungen der anderen bekommt? Und eigene Sicherungen bereitstellt?
Früher nutzte jedes Projekt eine zentralisierte Versionsverwaltung. Irgendwo
@@ -77,12 +77,12 @@ wieder auf den Server laden, damit irgendjemand ihn nutzen kann.
Was, wenn ein Spieler aus irgendeinem Grund einen alten Spielstand will?
Vielleicht ist der aktuell gesicherte Spielstand nicht mehr lösbar, weil
-jemand in der dritten Ebene vergessen hat ein Objekt aufzunehmen und sie
-versuchen den letzten Spielstand zu finden, ab dem das Spiel wieder lösbar
-ist. Oder sie wollen zwei Spielstände vergleichen, um festzustellen wie viel
+jemand in der dritten Ebene vergessen hat, ein Objekt aufzunehmen und sie
+versuchen, den letzten Spielstand zu finden, ab dem das Spiel wieder lösbar
+ist. Oder sie wollen zwei Spielstände vergleichen, um festzustellen, wie viel
ein Spieler geleistet hat.
-Es gibt viele Gründe warum man einen älteren Stand sehen will, aber das
+Es gibt viele Gründe, warum man einen älteren Stand sehen will, aber das
Ergebnis ist das selbe. Man muss vom Hauptserver das alte gespeicherte Spiel
anfordern. Je mehr gespeicherte Spiele benötigt werden, desto mehr
Kommunikation ist erforderlich.
@@ -91,7 +91,7 @@ Die neue Generation der Versionsverwaltungssysteme, zu denen Git gehört,
werden verteilte Systeme genannt und können als eine Verallgemeinerung der
zentralisierten Systeme verstanden werden. Wenn Spieler vom Hauptserver
herunterladen, erhalten sie jedes gespeichertes Spiel, nicht nur das zuletzt
-gespeicherte. Es ist als ob der Hauptserver gespiegelt wird.
+gespeicherte. Es ist, als ob der Hauptserver gespiegelt wird.
Dieses erste 'Cloning' kann teuer sein, vor allem, wenn eine lange
Geschichte existiert, aber auf Dauer wird es sich lohnen. Ein unmittelbarer
@@ -103,10 +103,10 @@ keine Kommunikation mit dem Hauptserver notwendig.
Ein weit verbreitetes Missverständnis ist, dass verteilte System ungeeignet
sind für Projekte, die ein offizielles zentrales 'Repository'
benötigen. Nichts könnte weiter von der Wahrheit entfernt sein. Jemanden zu
-fotografieren stiehlt nicht dessen Seele. Genauso wenig setzt das 'Clonen'
+fotografieren, stiehlt nicht dessen Seele. Genauso wenig setzt das 'Clonen'
des zentralen 'Repository' dessen Bedeutung herab.
-Eine gute erste Annäherung ist, dass alles was eine zentralisierte
+Eine gute erste Annäherung ist, dass alles, was eine zentralisierte
Versionsverwaltung kann, ein gut durchdachtes verteiltes System besser
kann. Netzwerkressourcen sind einfach teurer als lokale Ressourcen. Auch
wenn wir später Nachteile beim verteilten Ansatz sehen werden, ist man mit
@@ -117,11 +117,11 @@ so ein System bietet. Aber deshalb ein einfacheres, schlecht erweiterbares
System zu benutzen, ist wie römische Ziffern zum Rechnen mit kleinen Zahlen
zu verwenden.
-Außerdem könnte dein Projekt weit über die ursprünglichen Erwartungen
+Außerdem könnte Dein Projekt weit über die ursprünglichen Erwartungen
hinauswachsen. Git von Anfang an zu benutzen, ist wie ein Schweizer
Taschenmesser mit sich zu tragen, auch wenn damit meistens nur Flaschen
-geöffnet werden. Eines Tages brauchst du vielleicht dringend einen
-Schraubendreher, dann bist du froh mehr als nur einen einfachen
+geöffnet werden. Eines Tages brauchst Du vielleicht dringend einen
+Schraubendreher, dann bist du froh, mehr als nur einen einfachen
Flaschenöffner bei dir zu haben.
=== 'Merge' Konflikte ===
@@ -134,8 +134,8 @@ Dateiende. Beide laden ihre Änderungen hoch. Die meisten Systeme wählen
automatisch eine vernünftige Vorgehensweise: akzeptiere beide Änderungen und
füge sie zusammen, damit fließen beide Änderungen in das Dokument mit ein.
-Nun stell dir vor beide, Alice und Bob, machen Änderungen in der selben
-Zeile. Dann ist es unmöglich ohne menschlichen Eingriff fortzufahren. Die
+Nun stell Dir vor beide, Alice und Bob, machen Änderungen in der selben
+Zeile. Dann ist es unmöglich, ohne menschlichen Eingriff fortzufahren. Die
zweite Person, welche die Datei hoch lädt, wird über einen _'Merge'
Konflikt_ informiert und muss entscheiden, welche Änderung übernommen wird
oder die ganze Zeile überarbeiten.
diff --git a/de/multiplayer.txt b/de/multiplayer.txt
index 7d53b77d..a1334602 100644
--- a/de/multiplayer.txt
+++ b/de/multiplayer.txt
@@ -13,18 +13,18 @@ ist das Git's Stärke und wohl auch seine Daseinsberechtigung.
=== Wer bin ich? ===
Jeder 'Commit' enthält Name und eMail-Adresse des Autors, welche mit *git
-log* angezeigt werden. Standardmäßig nutzt Git Systemeinstellungen um diese
+log* angezeigt werden. Standardmäßig nutzt Git Systemeinstellungen, um diese
Felder auszufüllen. Um diese Angaben explizit zu setzen, gib ein:
$ git config --global user.name "Max Mustermann"
$ git config --global user.email maxmustermann@beispiel.de
-Lasse den -global Schalter weg um diese Einstellungen für das aktuelle
+Lasse den -global Schalter weg, um diese Einstellungen für das aktuelle
'Repository' zu setzen.
=== Git über SSH, HTTP ===
-Angenommen, Du hast einen SSH-Zugang zu einem Webserver aber Git ist nicht
+Angenommen, Du hast einen SSH-Zugang zu einem Webserver, aber Git ist nicht
installiert. Wenn auch nicht so effizient wie mit dem systemeigenen
Protokoll, kann Git über HTTP kommunizieren.
@@ -56,7 +56,7 @@ Willst Du 'Repositories' ohne Server synchronisieren oder gar ohne
Netzwerkverbindung? Musst Du während eines Notfalls improvisieren? Wir haben
gesehen, dass man mit <>. Wir können solche Dateien hin und her schicken um Git
+zurück>>. Wir können solche Dateien hin und her schicken, um Git
'Repositories' über jedes beliebige Medium zu transportieren, aber ein
effizienteres Werkzeug ist *git bundle*.
@@ -74,7 +74,7 @@ die 'Commits' aus dem 'Bundle' durch Eingabe von:
Der Empfänger kann das sogar mit einem leeren 'Repository' tun. Trotz seiner
Größe, +einedatei+ enthält das komplette original Git 'Repository'.
-In größeren Projekten, vermeidest Du Datenmüll indem Du nur Änderungen
+In größeren Projekten vermeidest Du Datenmüll, indem Du nur Änderungen
'bundlest', die in den anderen 'Repositories' fehlen. Zum Beispiel, nehmen
wir an, der 'Commit' ``1b6d...'' ist der aktuellste, den beide Parteien
haben:
@@ -82,7 +82,7 @@ haben:
$ git bundle create einedatei HEAD ^1b6d
Macht man das regelmäßig, kann man leicht vergessen, welcher 'Commit'
-zuletzt gesendet wurde. Die Hilfeseiten schlagen vor 'Tags' zu benutzen um
+zuletzt gesendet wurde. Die Hilfeseiten schlagen vor, 'Tags' zu benutzen, um
dieses Problem zu lösen. Das heißt, nachdem Du ein 'Bundle' gesendet hast,
gib ein:
@@ -133,13 +133,13 @@ Auf der Empfängerseite speichere die eMail in eine Datei, dann gib ein:
Das wendet den eingegangenen 'Patch' an und erzeugt einen 'Commit',
inklusive der Informationen wie z.B. den Autor.
-Mit einer Webmail Anwendung musst Du eventuell ein Button anklicken um die
+Mit einer Webmail Anwendung musst Du eventuell ein Button anklicken, um die
eMail in ihrem rohen Originalformat anzuzeigen, bevor Du den 'Patch' in eine
Datei sicherst.
Es gibt geringfügige Unterschiede bei mbox-basierten eMail Anwendungen, aber
wenn Du eine davon benutzt, gehörst Du vermutlich zu der Gruppe Personen,
-die damit einfach umgehen können ohne Anleitungen zu lesen.!
+die damit einfach umgehen können, ohne Anleitungen zu lesen.!
=== Entschuldigung, wir sind umgezogen. ===
@@ -153,7 +153,7 @@ Blick riskieren:
Die +remote.origin.url+ Option kontrolliert die Quell-URL; ``origin'' ist
der Spitzname, der dem Quell-'Repository' gegeben wurde. Wie mit der
``master'' 'Branch' Konvention können wir diesen Spitznamen ändern oder
-löschen, aber es gibt für gewöhnlich keinen Grund dies zu tun.
+löschen, aber es gibt für gewöhnlich keinen Grund, dies zu tun.
Wenn das original 'Repository' verschoben wird, können wir die URL
aktualisieren mit:
@@ -161,10 +161,10 @@ aktualisieren mit:
$ git config remote.origin.url git://neue.url/proj.git
Die +branch.master.merge+ Option definiert den Standard-Remote-'Branch' bei
-einem *git pull*. Während dem ursprünglichen 'clonen', wird sie auf den
+einem *git pull*. Während des ursprünglichen 'Clonen' wird sie auf den
aktuellen 'Branch' des Quell-'Repository' gesetzt, so dass selbst dann, wenn
der 'HEAD' des Quell-'Repository' inzwischen auf einen anderen 'Branch'
-gewechselt hat, ein späterer 'pull' wird treu dem original 'Branch' folgen.
+gewechselt hat, ein späterer 'pull' treu dem original 'Branch' folgen wird.
Diese Option gilt nur für das 'Repository', von dem als erstes 'gecloned'
wurde, was in der Option +branch.master.remote+ hinterlegt ist. Bei einem
@@ -181,7 +181,7 @@ Beispielen keine Argumente hatten.
Wenn Du ein 'Repository' 'clonst', 'clonst' Du auch alle seine
'Branches'. Das hast Du vielleicht noch nicht bemerkt, denn Git versteckt
diese: Du musst speziell danach fragen. Das verhindert, dass 'Branches' vom
-entfernten 'Repository' Deine lokalen 'Branches' stören und es macht Git
+entfernten 'Repository' Deine lokalen 'Branches' stören, und es macht Git
einfacher für Anfänger.
Zeige die entfernten 'Branches' an mit:
@@ -198,7 +198,7 @@ Diese Liste zeigt die 'Branches' und den HEAD des entfernten 'Repository',
welche auch in regulären Git Anweisungen verwendet werden können. Zum
Beispiel, angenommen Du hast viele 'Commits' gemacht und möchtest einen
Vergleich zur letzten abgeholten Version machen. Du kannst die Logs nach dem
-entsprechenden SHA1 Hashwert durchsuchen, aber es ist viel einfacher
+entsprechenden SHA1 Hashwert durchsuchen, aber es ist viel einfacher,
folgendes einzugeben:
$ git diff origin/HEAD
@@ -209,7 +209,7 @@ Oder Du kannst schauen, was auf dem 'Branch' ``experimentell'' los war:
=== Mehrere 'Remotes' ===
-Angenommen, zwei andere Entwickler arbeiten an Deinem Projekt und wir wollen
+Angenommen, zwei andere Entwickler arbeiten an Deinem Projekt, und wir wollen
beide im Auge behalten. Wir können mehr als ein 'Repository' gleichzeitig
beobachten mit:
@@ -223,7 +223,7 @@ haben einfachen Zugriff auf alle 'Branches' von allen 'Repositories':
Aber was, wenn wir nur deren Änderungen vergleichen wollen, ohne unsere
eigene Arbeit zu beeinflussen? Mit anderen Worten, wir wollen ihre
-'Branches' untersuchen ohne dass deren Änderungen in unser
+'Branches' untersuchen, ohne dass deren Änderungen in unser
Arbeitsverzeichnis einfließen. Anstatt 'pull' benutzt Du dann:
$ git fetch # Fetch vom origin, der Standard.
@@ -234,11 +234,11 @@ bleibt, können wir nun jeden 'Branch' aus jedem 'Repository' in einer Git
Anweisung referenzieren, da wir eine lokale Kopie besitzen.
Erinnere Dich, dass ein 'Pull' hinter den Kulissen einfach ein *fetch*
-gefolgt von einem *merge* ist. Normalerweise machen wir einen *pull* weil
+gefolgt von einem *merge* ist. Normalerweise machen wir einen *pull*, weil
wir die letzten 'Commits' abrufen und einbinden wollen. Die beschriebene
Situation ist eine erwähnenswerte Ausnahme.
-Siehe *git help remote* um zu sehen wie man Remote-'Repositories' entfernt,
+Siehe *git help remote*, um zu sehen, wie man Remote-'Repositories' entfernt,
bestimmte 'Branches' ignoriert und mehr.
=== Meine Einstellungen ===
@@ -247,7 +247,7 @@ Für meine Projekte bevorzuge ich es, wenn Unterstützer 'Repositories'
vorbereiten, von denen ich 'pullen' kann. Verschiedene Git Hosting Anbieter
lassen Dich mit einem Klick deine eigene 'Fork' eines Projekts hosten.
-Nachdem ich einen Zweig abgerufen habe, benutze ich Git Anweisungen um durch
+Nachdem ich einen Zweig abgerufen habe, benutze ich Git Anweisungen, um durch
die Änderungen zu navigieren und zu untersuchen, die idealerweise gut
organisiert und dokumentiert sind. Ich 'merge' meine eigenen Änderungen und
führe eventuell weitere Änderungen durch. Wenn ich zufrieden bin, 'pushe'
@@ -258,8 +258,8 @@ sich auszahlt. Siehe
http://torvalds-family.blogspot.com/2009/06/happiness-is-warm-scm.html[diesen
Blog Beitrag von Linus Torvalds (englisch)].
-In der Git Welt zu bleiben ist etwas bequemer als 'Patch'-Dateien, denn es
-erspart mir sie in Git 'Commits' zu konvertieren. Außerdem kümmert sich Git
+In der Git Welt zu bleiben, ist etwas bequemer als 'Patch'-Dateien, denn es
+erspart mir, sie in Git 'Commits' zu konvertieren. Außerdem kümmert sich Git
um die Details wie Autorname und eMail-Adresse, genauso wie um Datum und
Uhrzeit und es fordert den Autor zum Beschreiben seiner eigenen Änderungen
auf.
diff --git a/de/pot/preface.po b/de/pot/preface.po
index f949c5d2..a6d735ec 100644
--- a/de/pot/preface.po
+++ b/de/pot/preface.po
@@ -85,11 +85,10 @@ msgstr ""
#: ../en/preface.txt:22
msgid ""
"link:/~blynn/gitmagic/intl/fr/[French]: by Alexandre Garel, Paul Gaborit, "
-"and Nicolas Deram. Also hosted at http://tutoriels.itaapy.com/[itaapy]."
+"and Nicolas Deram."
msgstr ""
"link:/~blynn/gitmagic/intl/fr/[Französich]: von Alexandre Garel, Paul "
-"Gaborit, und Nicolas Deram. Auch gehostet unter http://tutoriels.itaapy.com/"
-"[itaapy]."
+"Gaborit, und Nicolas Deram."
#. type: Bullet: ' - '
#: ../en/preface.txt:22
diff --git a/de/preface.txt b/de/preface.txt
index 990279bd..cae8949b 100644
--- a/de/preface.txt
+++ b/de/preface.txt
@@ -10,7 +10,7 @@ es schwierig zu erlernen macht, ganz zu schweigen davon, es zu meistern.
Wie Arthur C. Clarke festgestellt hat, ist jede hinreichend fortschrittliche
Technologie nicht von Magie zu unterscheiden. Das ist ein großartiger Ansatz,
um an Git heranzugehen: Anfänger können seine inneren Mechanismen ignorieren
-und Git als ein Ding ansehen, das mit seinen erstaunlichen Fähigkeiten
+und Git als ein Ding ansehen, dass mit seinen erstaunlichen Fähigkeiten
Freunde verzückt und Gegner zur Weißglut bringt.
Anstatt die Details aufzudecken, bieten wir grobe Anweisungen für die
@@ -24,11 +24,11 @@ Bedarf zuschneiden kannst.
Meng und JiangWei. Zu link:/~blynn/gitmagic/intl/zh_tw/[Traditionellem
Chinesisch] konvertiert via +cconv -f UTF8-CN -t UTF8-TW+.
- link:/~blynn/gitmagic/intl/fr/[Französich]: von Alexandre Garel, Paul
- Gaborit, und Nicolas Deram. Auch gehostet unter
- http://tutoriels.itaapy.com/[itaapy].
+ Gaborit, und Nicolas Deram.
- link:/~blynn/gitmagic/intl/de/[Deutsch]: von Benjamin Bellee und Armin
Stebich; Auch gehostet unter http://gitmagic.lordofbikes.de/[Armin's
Website].
+ - link:/~blynn/gitmagic/intl/it/[Italienisch]: von Mattia Rigotti.
- http://www.slideshare.net/slide_user/magia-git[Portugiesisch]: von
Leonardo Siqueira Rodrigues
[http://www.slideshare.net/slide_user/magia-git-verso-odt[ODT-Version]].
@@ -68,7 +68,7 @@ François Marier unterhält das Debian Packet, das ursprünglich von Daniel
Baumann erstellt wurde.
Meine Dankbarkeit gilt auch vielen anderen für deren Unterstützung und
-Lob. Ich war versucht, euch hier alle aufzuzählen, aber das könnte
+Lob. Ich war versucht, Euch hier alle aufzuzählen, aber das könnte
Erwartungen in unermesslichem Umfang wecken.
Wenn ich Dich versehentlich vergessen habe, sag' mir bitte Bescheid oder
diff --git a/de/secrets.txt b/de/secrets.txt
index fb006b63..0c262260 100644
--- a/de/secrets.txt
+++ b/de/secrets.txt
@@ -13,8 +13,8 @@ Wie kann Git so unauffällig sein? Abgesehen von gelegentlichen 'Commits' und
existieren. Das heißt, bis Du sie brauchst. Und das ist, wenn Du froh bist,
dass Git die ganze Zeit über Dich gewacht hat.
-Andere Versionsverwaltungssysteme zwingen Dich ständig Dich mit
-Verwaltungskram und Bürokratie herumzuschlagen. Dateien sind können
+Andere Versionsverwaltungssysteme zwingen Dich ständig, Dich mit
+Verwaltungskram und Bürokratie herumzuschlagen. Dateien können
schreibgeschützt sein, bis Du einem zentralen Server mitteilst, welche
Dateien Du gerne bearbeiten möchtest. Die einfachsten Befehle werden bis zum
Schneckentempo verlangsamt, wenn die Anzahl der Anwender steigt. Deine
@@ -31,7 +31,7 @@ Stand aus `.git` wiederherstellen.
=== Integrität ===
Die meisten Leute verbinden mit Kryptographie die Geheimhaltung von
-Informationen, aber ein genau so wichtiges Ziel ist es Informationen zu
+Informationen, aber ein genau so wichtiges Ziel ist es, Informationen zu
sichern. Die richtige Anwendung von kryptographischen Hash-Funktionen kann
einen versehentlichen oder bösartigen Datenverlust verhindern.
@@ -94,19 +94,19 @@ Historiker.
=== Die Objektdatenbank ===
-Jegliche Version Deiner Daten wird in der Objektdatenbank gehalten, welche
+Jegliche Versionen Deiner Daten wird in der Objektdatenbank gehalten, welche
im Unterverzeichnis `.git/objects` liegt; Die anderen Orte in `.git/`
enthalten weniger wichtige Daten: den Index, 'Branch' Namen, Bezeichner
('tags'), Konfigurationsoptionen, Logdateien, die Position des aktuellen
'HEAD Commit' und so weiter. Die Objektdatenbank ist einfach aber trotzdem
-elegant und sie ist die Quelle von Git's Macht.
+elegant, und sie ist die Quelle von Git's Macht.
Jede Datei in `.git/objects` ist ein 'Objekt'. Es gibt drei Arten von
-Objekten die uns betreffen: 'Blob'-, 'Tree'-, und 'Commit'-Objekte.
+Objekten, die uns betreffen: 'Blob'-, 'Tree'- und 'Commit'-Objekte.
=== Blobs ===
-Zuerst ein Zaubertrick. Suche Dir einen Dateinamen aus, irgendeinen. In
+Zuerst ein Zaubertrick. Suche Dir irgendeinen Dateinamen aus. In
einem leeren Verzeichnis:
$ echo sweet > DEIN_DATEINAME
@@ -123,11 +123,13 @@ SHA1-Hash-Wert von:
"blob" SP "6" NUL "sweet" LF
aa823728ea7d592acc69b36875a482cdf3fd5c8d ist. Wobei SP ein Leerzeichen ist,
-NUL ist ein Nullbyte und LF ist ein Zeilenumbruch. Das kannst Du
-kontrollieren, durch die Eingabe von:
+NUL ist ein Nullbyte und LF ist ein Zeilenumbruch. Das kannst Du durch die
+Eingabe von
$ printf "blob 6\000sweet\n" | sha1sum
+kontrollieren.
+
Git ist 'assoziativ': Dateien werden nicht nach Ihren Namen gespeichert,
sondern eher nach dem SHA1-Hash-Wert der Daten, welche sie enthalten, in
einer Datei, die wir als 'Blob'-Objekt bezeichnen. Wir können uns den
@@ -157,7 +159,7 @@ was Dir das Objekt im Klartext anzeigt.
=== 'Trees' ===
Aber wo sind die Dateinamen? Sie müssen irgendwo gespeichert sein. Git kommt
-beim 'Commit' dazu sich um die Dateinamen zu kümmern:
+beim 'Commit' dazu, sich um die Dateinamen zu kümmern:
$ git commit # Schreibe eine Bemerkung.
$ find .git/objects -type f
@@ -166,7 +168,7 @@ Du solltest nun drei Objekte sehen. Dieses mal kann ich Dir nicht sagen, wie
die zwei neuen Dateien heißen, weil es zum Teil vom gewählten Dateiname
abhängt, den Du ausgesucht hast. Fahren wir fort mit der Annahme, Du hast
eine Datei ``rose'' genannt. Wenn nicht, kannst Du den Verlauf so
-umschreiben, dass es so aussieht als hättest Du es:
+umschreiben, dass es so aussieht, als hättest Du es:
$ git filter-branch --tree-filter 'mv DEIN_DATEINAME rose'
$ find .git/objects -type f
@@ -182,7 +184,7 @@ Eingabe von:
$ echo 05b217bb859794d08bb9e4f7f04cbda4b207fbe9 | git cat-file --batch
-Mit zpipe, ist es einfach den SHA1-Hash-Wert zu prüfen:
+Mit zpipe ist es einfach, den SHA1-Hash-Wert zu prüfen:
$ zpipe -d < .git/objects/05/b217bb859794d08bb9e4f7f04cbda4b207fbe9 | sha1sum
@@ -191,7 +193,7 @@ Ausgabe mehr als die rohe unkomprimierte Objektdatei enthält.
Diese Datei ist ein 'Tree'-Objekt: eine Liste von Datensätzen, bestehend aus
dem Dateityp, dem Dateinamen und einem SHA1-Hash-Wert. In unserem Beispiel
-ist der Dateityp 100644, was bedeutet, dass `rose` eine normale Datei ist
+ist der Dateityp 100644, was bedeutet, dass `rose` eine normale Datei ist,
und der SHA1-Hash-Wert entspricht dem 'Blob'-Objekt, welches den Inhalt von
`rose` enthält. Andere mögliche Dateitypen sind ausführbare Programmdateien,
symbolische Links oder Verzeichnisse. Im letzten Fall zeigt der
@@ -241,7 +243,7 @@ finden, was dem SHA1-Hash-Wert seines Inhalts entspricht:
LF
"Shakespeare" LF
-Wie vorhin, kannst Du 'zpipe' oder 'cat-file' benutzen um es für Dich zu
+Wie vorhin kannst Du 'zpipe' oder 'cat-file' benutzen, um es für Dich zu
überprüfen.
Das ist der erste 'Commit' gewesen, deshalb gibt es keine
@@ -250,14 +252,14 @@ enthalten, die den Eltern-'Commit' identifiziert.
=== Von Magie nicht zu unterscheiden ===
-Git's Geheimnisse scheinen zu einfach. Es sieht so aus als müsste man nur
+Git's Geheimnisse scheinen zu einfach. Es sieht so aus, als müsste man nur
ein paar Kommandozeilenskripte zusammenmixen, einen Schuß C-Code hinzufügen
und innerhalb ein paar Stunden ist man fertig: eine Mischung von
grundlegenden Dateisystemoperationen und SHA1-Hash-Berechnungen, garniert
mit Sperrdateien und Synchronisation für Stabilität. Tatsächlich beschreibt
dies die früheste Version von Git. Nichtsdestotrotz, abgesehen von
-geschickten Verpackungstricks um Speicherplatz zu sparen und geschickten
-Indizierungstricks um Zeit zu sparen, wissen wir nun, wie Git gewandt ein
+geschickten Verpackungstricks, um Speicherplatz zu sparen, und geschickten
+Indizierungstricks, um Zeit zu sparen, wissen wir nun, wie Git gewandt ein
Dateisystem in eine Datenbank verwandelt, das perfekt für eine
Versionsverwaltung geeignet ist.
diff --git a/de/translate.txt b/de/translate.txt
index 4402fe27..97fb7635 100644
--- a/de/translate.txt
+++ b/de/translate.txt
@@ -1,6 +1,6 @@
== Anhang B: Diese Anleitung übersetzen ==
-Ich empfehle folgende Schritte um diese Anleitung zu übersetzen, damit meine
+Ich empfehle folgende Schritte, um diese Anleitung zu übersetzen, damit meine
Skripte einfach eine HTML- und PDF-Version erstellen können. Außerdem können
so alle Übersetzungen in einem 'Repository' existieren.
@@ -13,7 +13,7 @@ das neue Verzeichnis und übersetze diese.
Um zum Beispiel die Anleitung auf
http://de.wikipedia.org/wiki/Klingonische_Sprache[Klingonisch] zu
-übersetzen, mußt du folgendes machen:
+übersetzen, musst du folgendes machen:
$ git clone git://repo.or.cz/gitmagic.git
$ cd gitmagic
@@ -30,7 +30,7 @@ hinzu. Nun kannst Du Deine Arbeit jederzeit wie folgt überprüfen:
$ make tlh
$ firefox book-tlh/index.html
-'Committe' deine Änderungen oft und wenn du fertig bist, gib bitte
-Bescheid. GitHub hat eine Schnittstelle, die das erleichtert: Erzeuge deine
-eigene 'Fork' vom "gitmagic" Projekt, 'pushe' deine Änderungen, dann gib mir
-Bescheid, deine Änderungen zu 'mergen'.
+'Committe' Deine Änderungen oft, und wenn Du fertig bist, gib bitte
+Bescheid. GitHub hat eine Schnittstelle, die das erleichtert: Erzeuge Deinen
+eigene 'Fork' vom "gitmagic" Projekt, 'pushe' Deine Änderungen, dann gib mir
+Bescheid, Deine Änderungen zu 'mergen'.
diff --git a/en/drawbacks.txt b/en/drawbacks.txt
index eab26681..f2a8e2c9 100644
--- a/en/drawbacks.txt
+++ b/en/drawbacks.txt
@@ -18,7 +18,7 @@ Git on Microsoft Windows can be cumbersome:
- http://cygwin.com/[Cygwin], a Linux-like environment for Windows, contains http://cygwin.com/packages/git/[a Windows port of Git].
-- http://code.google.com/p/msysgit/[Git on MSys] is an alternative requiring minimal runtime support, though a few of the commands need some work.
+- https://gitforwindows.org/[Git for Windows] is an alternative requiring minimal runtime support, though a few of the commands need some work.
=== Unrelated Files ===
diff --git a/en/preface.txt b/en/preface.txt
index c9c7325f..904d82df 100644
--- a/en/preface.txt
+++ b/en/preface.txt
@@ -13,9 +13,12 @@ Rather than go into details, we provide rough instructions for particular effect
.Translations
- link:/\~blynn/gitmagic/intl/zh_cn/[Simplified Chinese]: by JunJie, Meng and JiangWei. Converted to link:/~blynn/gitmagic/intl/zh_tw/[Traditional Chinese] via +cconv -f UTF8-CN -t UTF8-TW+.
- - link:/~blynn/gitmagic/intl/fr/[French]: by Alexandre Garel, Paul Gaborit, and Nicolas Deram. Also hosted at http://tutoriels.itaapy.com/[itaapy].
+ - link:/~blynn/gitmagic/intl/fr/[French]: by Alexandre Garel, Paul Gaborit, and Nicolas Deram.
- link:/~blynn/gitmagic/intl/de/[German]: by Benjamin Bellee and Armin Stebich; also http://gitmagic.lordofbikes.de/[hosted on Armin's website].
- - http://www.slideshare.net/slide_user/magia-git[Portuguese]: by Leonardo Siqueira Rodrigues [http://www.slideshare.net/slide_user/magia-git-verso-odt[ODT version]].
+ - link:/~blynn/gitmagic/intl/it/[Italian]: by Mattia Rigotti.
+ - link:/~blynn/gitmagic/intl/ko/[Korean]: by Jung-Ho (John) Han; also https://sites.google.com/site/drinkhanjohn/useful-links/[hosted on John's website].
+ - link:/~blynn/gitmagic/intl/pl/[Polish]: by Damian Michna.
+ - link:/~blynn/gitmagic/intl/pt_br/[Brazilian Portuguese]: by José Inácio Serafini and Leonardo Siqueira Rodrigues.
- link:/~blynn/gitmagic/intl/ru/[Russian]: by Tikhon Tarnavsky, Mikhail Dymskov, and others.
- link:/~blynn/gitmagic/intl/es/[Spanish]: by Rodrigo Toledo and Ariset Llerena Tapia.
- link:/~blynn/gitmagic/intl/uk/[Ukrainian]: by Volodymyr Bodenchuk.
@@ -25,6 +28,7 @@ Rather than go into details, we provide rough instructions for particular effect
- link:book.html[Single webpage]: barebones HTML, with no CSS.
- link:book.pdf[PDF file]: printer-friendly.
+ - link:book.epub[EPUB file]: E-reader-friendly.
- http://packages.debian.org/gitmagic[Debian package], http://packages.ubuntu.com/gitmagic[Ubuntu package]: get a fast and local copy of this site. Handy http://csdcf.stanford.edu/status/[when this server is offline].
- http://www.amazon.com/Git-Magic-Ben-Lynn/dp/1451523343/[Physical book [Amazon.com]]: 64 pages, 15.24cm x 22.86cm, black and white. Handy when there is no electricity.
@@ -39,7 +43,6 @@ Dustin Sallings, Alberto Bertogli, James Cameron, Douglas Livingstone, Michael B
François Marier maintains the Debian package originally created by Daniel
Baumann.
-John Hinnegan bought the http://www.gitmagic.com/[gitmagic.com] domain.
My gratitude goes to many others for your support and praise. I'm tempted to
quote you here, but it might raise expectations to ridiculous heights.
@@ -48,16 +51,16 @@ If I've left you out by mistake, please tell me or just send me a patch!
=== License ===
-This guide is released under http://www.gnu.org/licenses/gpl-3.0.html[the GNU General Public License version 3]. Naturally, the source is kept in a Git
-repository, and can be obtained by typing:
+This guide is released under http://www.gnu.org/licenses/gpl-3.0.html[the GNU General Public License, version 3] or any later version published by the Free Software Foundation.
+
+Naturally, the source is kept in a Git repository, and can be obtained by
+typing:
$ git clone git://repo.or.cz/gitmagic.git # Creates "gitmagic" directory.
or from one of the mirrors:
$ git clone git://github.com/blynn/gitmagic.git
- $ git clone git://gitorious.org/gitmagic/mainline.git
- $ git clone https://code.google.com/p/gitmagic/
$ git clone git://git.assembla.com/gitmagic.git
$ git clone git@bitbucket.org:blynn/gitmagic.git
diff --git a/es/drawbacks.txt b/es/drawbacks.txt
index b66e955f..7698b15d 100644
--- a/es/drawbacks.txt
+++ b/es/drawbacks.txt
@@ -20,7 +20,7 @@ Git en Microsoft Windows puede ser engorroso:
- http://cygwin.com/[Cygwin], un ambiente similar a Linux para Windows, contiene http://cygwin.com/packages/git/[una versión de Git para Windows].
-- http://code.google.com/p/msysgit/[Git en MSys] es una alternativa que requiere un soporte mínimo para la ejecución, aunqeu algunos de los comandos necesitan cierto trabajo.
+- https://gitforwindows.org/[Git para Windows] es una alternativa que requiere un soporte mínimo para la ejecución, aunque algunos de los comandos necesitan cierto trabajo.
=== Archivos No Relacionados ===
@@ -124,7 +124,7 @@ comandos son poco amigables antes del commit inicial. Adicionalmente algunos cas
borde deben ser manejados de forma especial, como hacer rebase de una rama con
un commit inicial distinto.
-Git se beneficiaría al definiri el commit cero: tan pronto como se construye un
+Git se beneficiaría al definir el commit cero: tan pronto como se construye un
repositorio, HEAD debería ser un string conteniendo 20 bytes de 0. Este commit especial
representa un árbol vacío, sin padre, que en algún momento es parte de todos los repositorios de Git.
diff --git a/es/preface.txt b/es/preface.txt
index ca175be4..1ad9064a 100644
--- a/es/preface.txt
+++ b/es/preface.txt
@@ -12,7 +12,7 @@ En lugar de ser detallados, proveemos instrucciones generales para efectos parti
.Otras ediciones
- - http://docs.google.com/View?id=dfwthj68_675gz3bw8kj[Traducción al chino]: por JunJie, Meng y JiangWei.
+ - link:/~blynn/gitmagic/intl/zh_cn/[Traducción al chino]: por JunJie, Meng y JiangWei.
- link:book.html[Una única página]: HTML simple, sin CSS.
- link:book.pdf[Archivo PDF]: Listo para imprimir.
- http://packages.debian.org/search?searchon=names&keywords=gitmagic[Paquete gitmagic para Debian]: Consigue una copia rápida y local de este sitio. http://packages.ubuntu.com/jaunty/gitmagic[Paquete para Ubuntu (Jaunty Jackalope)] también disponible. Útil http://csdcf.stanford.edu/status/[cuando este servidor está offline para mantenimiento].
diff --git a/es/secrets.txt b/es/secrets.txt
new file mode 100644
index 00000000..3c89941a
--- /dev/null
+++ b/es/secrets.txt
@@ -0,0 +1,214 @@
+== Secretos Revelados ==
+
+Tomemos un vistazo bajo la mesa y expliquemos cómo realiza sus milagros. No escatimare sobre los detalles. Para descripciones detalladas referirse a http://schacon.github.com/git/user-manual.html[el manual de usuario].
+
+=== Invisibilidad ===
+
+¿Cómo puede ser Git tan discreto? Aparte de los "commit" y "merge" ocasionales, usted puede trabajar inconscientemente de que un control de versiones existe. Esto sucede hasta que usted lo necesita, y esto es cuando esta agradecido de que Git este viendo por usted todo el tiempo.
+
+Otros sistemas de control de versiones te fuerzan a luchar constantemente con cinta roja y burocracia. Los permisos de archivos podría ser de solo lectura a menos que usted explícitamente le diga a un servidor central cuales archivos intenta editar. Los comandos más básicos podrían retardarse al punto de arrastrarse cuando el número de usuarios se incrementa. El trabajo se paraliza cuando la red o el servidor central deja de funcionar.
+
+En contraste, Git simplemente mantiene la historia de su proyecto en el directorio '.git' ubicado en su directorio de trabajo. Ésta es su propia copia de la historia, de esta manera usted puede trabajar desconectado hasta que desee comunicarse con otros. Usted tiene control total del destino de sus archivos ya que Git puede fácilmente recrear un estado guardado de '.git' en cualquier momento.
+
+=== Integridad ===
+
+Muchas personas asocian criptografía con manterner la información secreta, pero otro objetivo importante es mantener la información segura. El uso apropiado de las funciones "hash" en criptografía puede prevenir corrupción de datos accidental o intencional.
+
+Un hash SHA1 puede pensarse como un identificador numérico único de 160-bit para cualquier linea de caracteres que usted pueda encontrar en su vida. Pero mas que eso: cualquier linea de caracteres que cualquier ser humano vaya a usar en muchas vidas.
+
+Como un "hash" SHA1 es una linea de "bytes", podemos dividir lineas de "bytes" que contienen otros "hash". Esta simple observación es sorpresivamente útil: buscar 'cadenas de "hash"'. Mas adelante veremos como Git lo utiliza para garantizar eficientemente la integridad de datos.
+
+Brevemente, Git mantiene sus datos en el subdirectorio '.git/objects', donde en lugar de archivos normales, usted encontrara solo identificadores. Al usar identificadores como nombres de archivos, asi como algunos trucos de bloqueo de archivos y sellos de tiempo, Git transforma cualquier humilde sistema de archivos en una eficiente y robusta base de datos.
+
+=== Inteligencia ===
+
+¿Cómo sabe Git que usted renombró un archivo, incluso pensando que usted nunca menciono el hecho explícitamente? Seguramente, usted podria haber ejecutado *git mv*, pero eso es exactamente lo mismo a *git rm* seguido de *git add*.
+
+Git heuristicamente averigua los cambios de nombre y copias entre versiones sucesivas. ¡De hecho, puede detectar pedazos de codigo que estan siendo movidos o copiados entre archivos! Al pensar que no puede cubrir todos los casos, realiza un trabajo decente, y esta caracteristica esta siendo mejorada constantemente. Si falla al trabajar por usted, intente habilitar deteccion de copias mas caras y considere actualizar.
+
+=== Indexacion ===
+
+Para cada archivo rastreado, Git guarda informacion como su tamano, fecha de creacion y ultima fecha de modificacion en un archivo conocido como 'index'. Para determinar cuando un archivo ha cambiado, Git compara su estado actual con lo que estan acumulados en el indice. Si son iguales, entonces Git omite leer el archivo nuevamente.
+
+Partiendo del hecho de que las llamadas de estado son considerablemente mas rapidas que leer archivos, si usted edita unicamente
+algunos archivos, Git puede actualizar su estado en casi nada de tiempo.
+
+Hemos insistido anteriormente que el indice es un area de escenificacion. ¿Porque un monton de estados
+de archivo es un area de escenificacion? Porque el comando "add" pone archivos en la based de datos de Git
+y actualiza los estados, mientras que el comando "commit", sin opciones, crea una
+actualizacion basada unicamente en estos estados y los archivos que ya estan en la base de datos.
+
+=== Los origenes de Git ===
+
+Esto http://lkml.org/lkml/2005/4/6/121[ anuncio: Lista de Correos de "Linux Kernel"] Describe la cadena de eventos que llevaron a Git. El hilo entero es un fascinante sitio para los historiadores de Git.
+
+=== La Base de Datos de Objetos ===
+
+Toda version de sus datos is mantenida en la "Base de Datos de Objetos", la cual vive en el
+subdirectorio 'git./objects'; los otros residentes de '.git' mantienen menos datos:
+el indice, nombres de ramas, etiquetas, opciones de configuracion, logs, la localizacion
+actual del primer "commit", y asi sucesivamente. La Base de Datos de Objetos is elemental pero
+elegante, y la fuente del poder de Git.
+
+Cada archivo que se encuentre en '.git/objects' es un 'objeto'. Existen 3 tipos de objetos
+que nos concierne: objetos 'blob', objetos 'tree', y objetos 'commit'.
+
+=== Blobs ===
+
+Primero, un truco magico. Elija un archivo, cualquier archivo. En un directorio vacio:
+
+$ echo sweet > NOMBRE_DE_ARCHIVO
+$ git init
+$ git add .
+$ find .git/objects -type f
+
+Usted podra ver +.git/objects/aa/823728ea7d592acc69b36875a482cdf3fd5c8d+.
+
+¿Cómo se esto sin saber el nombre del archivo? Es porque el
+"hash" SHA1 de:
+
+"blob" SP "6" NUL "sweet" LF
+
+es aa823728ea7d592acc69b36875a482cdf3fd5c8d,
+donde SP es un espacio, NUL es un "byte" zero y LF es un avance de linea. Usted puede verificar
+esto escribiendo:
+
+$ printf "blob 6\000sweet\n" | sha1sum
+
+Git es 'contenido-direccionable': los archivos no son almacenados de acuerdo con su nombre,
+sino mas por el "hash" de la informacion que contiene, dentro de un archivo llamamos al 'objeto
+"blob"'. Podemos pensar de un "hash" como el identificador del contenido de un archivo, asi
+que en un sentido estamos buscando archivos por su contenido. El "blob" inicial es
+meramente un encabezado que consiste en el typo del objeto y su tamaño en "bytes"; lo que
+simplifica la contabilidad interna.
+
+De esta manera yo puedo predecir fácilmente lo que usted vera. El nombre del archivo es irrelevante:
+solo la información interna es usada para construir el 'objeto "blob"'.
+
+Usted podría estarse preguntando qué sucede con archivos idénticos. Intente agregar copias de
+su archivo, con cualquier cosa de nombre. El contenido de +.git/objects+ se queda
+de la misma manera sin importar cuantos agregue. Git guarda la información solo una vez.
+
+Por cierto, los archivos ubicados en +.git/objects+ estan comprimidos con zlib asi que usted
+no debería poder verlos directamente. Filtrelos a través de
+http://www.zlib.net/zpipe.c[zpipe -d], o digite:
+
+$ git cat-file -p aa823728ea7d592acc69b36875a482cdf3fd5c8d
+
+lo que bellamente imprime el objeto dado.
+
+=== Árboles ===
+
+¿Pero dónde están los nombres de archivo? Ellos deberían estar almacenados en algún lugar en algún organizador.
+Git toma su turno para poner los nombres de archivo durante un "commit":
+
+$ git commit # Escribe algún mensaje.
+$ find .git/objects -type f
+
+Ahora debería poder ver 3 objetos. Esta vez no puedo decirte qué son esos 2 nuevos archivos, esto debende parcialmente del nombre de archivo que escogió. Procederemos asumiendo que eligió 'rose'. Si usted no lo hizo, podría reescribir la historia para hacer parecer que usted lo hizo:
+
+$ git filter-branch --tree-filter 'mv YOUR_FILENAME rose'
+$ find .git/objects -type f
+
+Ahora debería poder ver el archivo
++.git/objects/05/b217bb859794d08bb9e4f7f04cbda4b207fbe9+, porque este es el
+SHA1 "hash" de su contenido:
+
+"tree" SP "32" NUL "100644 rose" NUL 0xaa823728ea7d592acc69b36875a482cdf3fd5c8d
+
+Verifique que este archivo contiene verdaderamente lo anterior escribiendo:
+
+$ echo 05b217bb859794d08bb9e4f7f04cbda4b207fbe9 | git cat-file --batch
+
+Con zpipe, es fácil verificar el hash:
+
+$ zpipe -d < .git/objects/05/b217bb859794d08bb9e4f7f04cbda4b207fbe9 | sha1sum
+
+Las verficaciones de "hash" son mas difíciles utilizando cat-file porque su salida contiene más
+que la fuente del objeto del archivo descomprimido.
+
+Este archivo es un objeto "tree": una lista de tuplas de un tipo de
+archivo, un nombre de archivo, y un "hash". En nuestro ejemplo, el tipo de archivo es 100644, lo cual
+significa que 'rose' es un archivo normal, y el "hash" es el objeto "blob" que contiene
+los contenidos de 'rose'. Otro posible tipo de archivo son los ejecutables, enlaces simbólicos o
+los directorios. En el último caso, los punteros "hash" a un objeto 'tree'.
+
+Si usted ejecuta "filter-branch", obtendrá objetos viejos que ya no necesita. Aunque
+serán desechados automáticamente una vez que su periodo de gracia expire, nosotros
+los borraremos ahora para hacer nuestro ejemplo de prueba más fácil de seguir:
+
+$ rm -r .git/refs/original
+$ git reflog expire --expire=now --all
+$ git prune
+
+Para proyectos reales típicamente usted debería evitar comandos como este, ya que está
+destruyendo respaldos. Si usted quiere un repositorio limpio, usualmente es mejor crear
+un clon nuevo. También, tenga cuidado cuando está manipulando directamente +.git+: ¿qué pasaría si un proceso
+Git está corriendo al mismo tiempo, ó un corte eléctrico ocurre?
+En general, las referencias deberían ser eliminadas con *git update-ref -d*,
+pensando que usualmente es más seguro remover +refs/original+ a mano.
+
+=== "Commits" ===
+
+Hemos explicado 2 de 3 objetos. El tercero es un objeto '"commit"'. Sus
+contenidos dependen del mensaje del "commit" así como de la fecha en el que fué
+creado. Para contrastar lo que tenemos aquí, deberemos torcerlo un poco:
+
+$ git commit --amend -m Shakespeare # Change the commit message.
+$ git filter-branch --env-filter 'export
+ GIT_AUTHOR_DATE="Fri 13 Feb 2009 15:31:30 -0800"
+ GIT_AUTHOR_NAME="Alice"
+ GIT_AUTHOR_EMAIL="alice@example.com"
+ GIT_COMMITTER_DATE="Fri, 13 Feb 2009 15:31:30 -0800"
+ GIT_COMMITTER_NAME="Bob"
+ GIT_COMMITTER_EMAIL="bob@example.com"' # Rig timestamps and authors.
+$ find .git/objects -type f
+
+
++.git/objects/49/993fe130c4b3bf24857a15d7969c396b7bc187+
+
+
+ "commit 158" NUL
+ "tree 05b217bb859794d08bb9e4f7f04cbda4b207fbe9" LF
+ "author Alice 1234567890 -0800" LF
+ "committer Bob 1234567890 -0800" LF
+ LF
+ "Shakespeare" LF
+
+Como antes, usted puede correr zpipe ó cat-file para que vea por usted mismo.
+
+Este es el primer "commit", así que no existe un "commit" padre, pero "commit" sucesivos}
+siempre van a contener al menos una línea identificando el "commit" padre.
+
+=== Sin Distinción de la Magia ===
+
+Los secretos de Git parecen muy simples. Parece ser que usted podría unir algunos comandos y agregar una parte de código C para cocinar algo en cuestión de horas: una mezcla de operaciones básicas con archivos de sistema y SHA1 "hashing", adornado con archivos "lock" y "fsyncs" para robustez. De hecho, esto describe con exactitud las versiones anteriores de Git. Sin embargo, fuera de ingeniosos trucos de empaque para salvar espacio, e ingeniosos trucos de indexación para salvar tiempo, nosotros ahora sabemos definitivamente cómo Git cambia los sistemas de archivo en una base de datos perfecta para el control de versiones.
+
+Por ejemplo, si cualquier archivo dentro de la base de datos es corrompido por un error
+de disco, entonces su "hash" nunca más podrá ser emparejado, alertándonos del problema. Al
+crear un "hash" de otros "hash" de otros objetos, mantenemos la integridad a todos los niveles. Los "commit"
+son atómicos, eso es, un "commit" nunca puede guardar solamente partes de cambios: nosotros podemos
+únicamente calcular el "hash" de un "commit" y guardarlo en la base de datos después de que ya
+hemos guardado todos los árboles relevantes, los "blob" y los "commit" padres. La base de datos
+de objetos es inmune a interrupciones inesperadas como cortes de electricidad.
+
+Hemos derrotado inclusive al más tortuoso adversario. Suponga que alguien intenta
+modificar furtivamente los contenidos de un archivo en una versión anterior de un proyecto. Para
+mantener la base de datos de objetos sana, ellos deben cambiar también el "hash" del
+objeto "blob" correspondiente porque ahora es una cadena de bytes distinta. Esto
+significa que además tendrán que cambiar el "hash" de cualquier árbol de objetos referenciando el archivo,
+y por defecto cambiar todos los "hash" de todos los descendientes del árbol de ese "commit". Además
+de todos los "hash" de todos los descendientes de ese "commit".Esto implica que
+el "hash" de la cabeza oficial difiere a la del repositorio erróneo. Para
+seguir el curso de los "hash" que difieren podemos localizar el archivo mutilado,
+así como el "commit" en donde fue corrompido inicialmente.
+
+En corto tiempo, mientras que los 20 "byte" representando el último "commit" seguro,
+es imposible de manosear en un repositorio de Git.
+
+¿Qué sucede con las famosas características de Git? ¿Las ramas? ¿Las mezclas? ¿Los tags?
+Simples detalles. La cabeza actual es mantenida en el archivo +.git/HEAD+,
+la cual contiene un "hash" de un objeto "commit". El "hash" es actualizado durante un "commit"
+así como cualquier otro comando. Las ramas son casi lo mismo: son archivos en
++.git/refs/heads+. Las etiquetas también: se encuentran en +.git/refs/tags+ pero
+son actualizadas por un juego de comandos distintos.
diff --git a/fr/branch.txt b/fr/branch.txt
index 8d047871..1c2e7648 100644
--- a/fr/branch.txt
+++ b/fr/branch.txt
@@ -297,7 +297,7 @@ tout, des clones sont tout aussi rapides et vous pouvez basculer de l'un à
l'autre par un simple *cd* au lieu de commandes Git ésotériques.
Considérez les navigateurs Web. Pourquoi proposer plusieurs onglets ainsi que
-plusieurs fenêtres ? Parce proposer les deux permet de s'adapter à une large
+plusieurs fenêtres ? Parce que proposer les deux permet de s'adapter à une large
gamme d'utilisations. Certains préfèrent n'avoir qu'une seule fenêtre avec plein
d'onglets. D'autres font tout le contraire : plein de fenêtres avec un seul
onglet. D'autres encore mélangent un peu des deux.
diff --git a/fr/drawbacks.txt b/fr/drawbacks.txt
index 48244b35..8c06138f 100644
--- a/fr/drawbacks.txt
+++ b/fr/drawbacks.txt
@@ -11,11 +11,11 @@ main.
Avec le temps, les spécialistes de cryptographie découvrent de plus en plus de
faiblesses de SHA1. À ce jour, la découverte de collisions d'empreintes semble
-à la portée d'organisations bien dotée. Et d'ici quelques années, peut-être que
-même un simple PC aura assez de puissance de calcul pour corrompre de manière
-indétectable un dépôt Git.
+à la portée d'organisations bien dotées. Et d'ici quelques années, peut-être
+que même un simple PC aura assez de puissance de calcul pour corrompre de
+manière indétectable un dépôt Git.
-Heureusement Git aura migrer vers une fonction de calcul d'empreintes de
+Heureusement Git aura migré vers une fonction de calcul d'empreintes de
meilleure qualité avant que de futures recherches détruisent SHA1.
=== Microsoft Windows ===
@@ -25,7 +25,7 @@ Git sur Microsoft Windows peut être jugé encombrant :
- http://cygwin.com/[Cygwin] est un environnement de type Linux dans Windows
proposant http://cygwin.com/packages/git/[un portage de Git].
-- http://code.google.com/p/msysgit/[Git on MSys] est un autre choix nécessitant
+- https://gitforwindows.org/[Git pour Windows] est un autre choix nécessitant
beaucoup moins de place. Néanmoins quelques commandes doivent encore être
améliorées.
@@ -85,11 +85,11 @@ clone ainsi créé offre des fonctionnalités réduites.
Git a été conçu pour être rapide au regard de la taille des changements. Les
humains font de petits changement de version en version. Une correction de bug
en une ligne ici, une nouvelle fonctionnalité là, un commentaire amendé
-ailleurs... Mais si vous fichiers changent radicalement à chaque révision
+ailleurs... Mais si vos fichiers changent radicalement à chaque révision
alors, à chaque commit, votre historique grossit d'un poids équivalent à celui
de votre projet.
-Il n'y a rien que puisse faire un système de gestion de versions pour éviter
+Il n'y a rien qu'un système de gestion de versions puisse faire pour éviter
cela, mais les utilisateurs de Git en souffrent plus puisque chaque clone
contient habituellement l'historique complet.
@@ -97,8 +97,8 @@ Il faut rechercher les raisons de ces changements radicaux. Peut-être faut-il
changer les formats des fichiers. Des modifications mineures ne devraient
modifier que très peu de chose dans très peu de fichiers.
-Peut-être une base données ou une solution d'archivage est-elle plus adaptée
-solution qu'un système de gestion de versions. À titre d'exemple, un système de
+Peut-être qu'une base données ou une solution d'archivage est-elle plus adaptée
+comme solution qu'un système de gestion de versions. À titre d'exemple, un système de
gestion de versions n'est certainement pas bien taillé pour gérer des photos prises
périodiquement par une webcam.
diff --git a/fr/grandmaster.txt b/fr/grandmaster.txt
index 4ee69c00..6921be64 100644
--- a/fr/grandmaster.txt
+++ b/fr/grandmaster.txt
@@ -234,7 +234,7 @@ intégrées. Pour passer outre, faites :
$ git reset --hard 1b6d
*Branch* : la suppression de branches échoue si cela implique la perte de
-certains commits. Par forcer la suppression, tapez :
+certains commits. Pour forcer la suppression, tapez :
$ git branch -D branche_morte # à la place de -d
diff --git a/fr/intro.txt b/fr/intro.txt
index 3a8fbdf3..d7731ce3 100644
--- a/fr/intro.txt
+++ b/fr/intro.txt
@@ -32,7 +32,7 @@ versions, vous pouvez l'"Enregistrer Sous..." un nom de fichier différent ou le
recopier ailleurs avant de l'enregistrer. Vous pouvez même compresser ces
copies pour gagner de l'espace. C'est une forme primitive et laborieuse de
gestion de versions. Les jeux vidéo se sont améliorés sur ce point depuis
-longtemps pusique la plupart proposent différents emplacements de sauvegarde
+longtemps puisque la plupart proposent différents emplacements de sauvegarde
automatiquement horodatés.
Rendons le problème légèrement plus coriace. Imaginez que vous ayez un ensemble
diff --git a/fr/multiplayer.txt b/fr/multiplayer.txt
index 63139c91..2a8b388f 100644
--- a/fr/multiplayer.txt
+++ b/fr/multiplayer.txt
@@ -111,12 +111,12 @@ produit un patch qui peut être collé dans un mail. Dans un dépôt Git, tapez
pour appliquer le patch.
D'une manière plus formelle, lorsque le nom des auteurs et peut-être leur
-signature doit apparaître, générer tous les patches depuis un certain point en
+signature doit apparaître, générez tous les patches depuis un certain point en
tapant :
$ git format-patch 1b6d
-Les fichiers résultants peuvent être fournis à *git send-email* ou envoyez à la
+Les fichiers résultants peuvent être fournis à *git send-email* ou envoyés à la
main. Vous pouvez aussi spécifier un intervalle entre deux commits :
$ git format-patch 1b6d..HEAD^^
diff --git a/fr/preface.txt b/fr/preface.txt
index a6f6a8ff..5be7c8a3 100644
--- a/fr/preface.txt
+++ b/fr/preface.txt
@@ -23,17 +23,18 @@ recettes pour répondre à vos besoins.
.Traductions
- - http://docs.google.com/View?id=dfwthj68_675gz3bw8kj[Chinois
+ - link:/~blynn/gitmagic/intl/zh_cn/[Chinois
(Simplifié)] : par JunJie, Meng et JiangWei.
- link:/~blynn/gitmagic/intl/fr/[Française] : par Alexandre Garel, Paul
- Gaborit et Nicolas Deram. Hébergé aussi chez
- http://tutoriels.itaapy.com/[itaapy].
+ Gaborit et Nicolas Deram.
- link:/~blynn/gitmagic/intl/de/[Allemande] : par Benjamin Bellee et Armin
Stebich. Hébergé aussi sur http://gitmagic.lordofbikes.de/[le site web
d'Armin].
+ - link:/~blynn/gitmagic/intl/it/[Italien] : par Mattia Rigotti.
+
- http://www.slideshare.net/slide_user/magia-git[Portugaise] : par
Leonardo Siqueira Rodrigues
[http://www.slideshare.net/slide_user/magia-git-verso-odt[version ODT]].
diff --git a/fr/translate.txt b/fr/translate.txt
index 541e0e2a..0fa387e4 100644
--- a/fr/translate.txt
+++ b/fr/translate.txt
@@ -15,7 +15,7 @@ http://fr.wikipedia.org/wiki/Klingon%20(langue)[Klingon], vous devriez faire :
$ git clone git://repo.or.cz/gitmagic.git
$ cd gitmagic
- $ mkdir tlh # "tlh" et le code IETF de la langue Klingon.
+ $ mkdir tlh # "tlh" est le code IETF de la langue Klingon.
$ cd tlh
$ cp ../en/intro.txt .
$ edit intro.txt # Traduire le fichier.
diff --git a/gitmagic.Rproj b/gitmagic.Rproj
new file mode 100644
index 00000000..756002c3
--- /dev/null
+++ b/gitmagic.Rproj
@@ -0,0 +1,15 @@
+Version: 1.0
+
+RestoreWorkspace: Default
+SaveWorkspace: Default
+AlwaysSaveHistory: Default
+
+EnableCodeIndexing: Yes
+UseSpacesForTab: Yes
+NumSpacesForTab: 5
+Encoding: UTF-8
+
+RnwWeave: Sweave
+LaTeX: pdfLaTeX
+
+BuildType: Makefile
diff --git a/it/basic.txt b/it/basic.txt
new file mode 100644
index 00000000..5d5c8246
--- /dev/null
+++ b/it/basic.txt
@@ -0,0 +1,269 @@
+== Trucchi di base ==
+
+Piuttosto che immergerci nel mare di comandi di Git, bagniamoci un po' i
+piedi con i seguenti esempi elementari. Nonostante la loro semplicità,
+ognuno di loro è utile. In effetti, durante i miei mesi iniziali
+d'utilizzazione di Git, non mi sono mai avventurato al di là di del
+materiale in questo capitolo.
+
+=== Salvare lo stato corrente ===
+
+Siete sul punto di fare qualcosa di drastico? Prima di proseguire,
+catturate lo stato di tutti i file nella directory corrente:
+
+ $ git init
+ $ git add .
+ $ git commit -m "Il mio primo backup"
+
+Qualora le cose dovessero andare per il peggio, potrete sempre
+ripristinare la versione salvate:
+
+ $ git reset --hard
+
+Per salvare un nuovo state:
+
+ $ git commit -a -m "Un altro backup"
+
+=== Aggiungere, rimuovere e rinominare file ===
+
+Le istruzioni che abbiamo appena visto tengono traccia solo dei file
+ che erano presenti nel momento dell'esecuzione di *git add*. Ma se
+ aggiungete nuovi file o sottocartelle, dovrete dirlo a Git:
+
+ $ git add readme.txt Documentation
+
+Analogamente se volete che Git ignori alcuni file:
+
+ $ git rm kludge.h obsolete.c
+ $ git rm -r incriminating/evidence/
+
+Git rimuoverà questi file per voi, se non l'avete ancora fatto.
+
+Un file può essere rinominato rimuovendo il vecchio nome e aggiungendo
+il nuovo nome. È anche possibile usare la scorciatoia *git mv* che segue
+la stessa sintassi del comando *mv*. Ad esempio:
+
+ $ git mv bug.c feature.c
+
+=== Annullare/Ripristino avanzati ===
+
+A volte può capitare che vogliate solamente ritornare indietro e
+dimenticare le modifiche effettuate dopo un certo punto, perché sono
+tutte sbagliate. In quel caso:
+
+ $ git log
+
+vi nostra una lista dei commit più recenti, accompagnati dal loro
+codice SHA1:
+
+----------------------------------
+commit 766f9881690d240ba334153047649b8b8f11c664
+Author: Bob
+Date: Tue Mar 14 01:59:26 2000 -0800
+
+ Sostituzione di prinf() con write()
+
+commit 82f5ea346a2e651544956a8653c0f58dc151275c
+Author: Alice
+Date: Thu Jan 1 00:00:00 1970 +0000
+
+ Commit iniziale
+----------------------------------
+
+I primi caratteri del codice SHA1 sono sufficienti per specificare un
+commit; alternativamente copiate e incollate l'intero codice SHA1.
+Digitate:
+
+ $ git reset --hard 766f
+
+per reinstaurare lo stato corrispondente al commit corrente e
+permanentemente cancellare i commit più recenti.
+
+Altre volte potrebbe capitarvi di voler fare solo un breve salto in uno
+stato precedente. In questo caso eseguite:
+
+ $ git checkout 82f5
+
+Questo vi riporta indietro nel tempo, preservando i commit più recenti.
+Bisogna però sapere che, come in ogni viaggio nel tempo in un film di
+fantascienza, se ora modificate e sottomettete un commit vi ritroverete
+in una realtà alternativa, perché avrete fatto delle azioni differenti
+rispetto alla realtà originaria.
+
+Questa realtà parallela viene chiamata 'ramificazione' o 'branch', et
+<>. Per ora è abbastanza
+ricordare che
+
+ $ git checkout master
+
+vi riporta al presente. Inoltre, per evitare che Git si lamenti,
+ricordatevi di fare un commit o un reset delle vostre modifiche prima di
+fare un checkout.
+
+Per riprendere l'analogia con i videogiochi digitate:
+
+- *`git reset --hard`* : carica un vecchio salvataggio e cancella
+ tutte le partite salvate più recenti di quella appena caricata.
+
+- *`git checkout`* : carica una vecchia partita, ma se ci giocate, lo
+ stato della partita sarà diverso da quello dei salvataggi successivi
+ che avete fato inizialmente. Da ora in poi ogni volta che salvate una
+ partita finirete in un branch separata che rappresenta la realtà
+ parallela in cui siete entrati. <>.
+
+
+Potete scegliere di ripristinare file e sottocartelle particolari
+aggiungendoli alla fine del seguente comando:
+
+ $ git checkout 82f5 un.file un-altro.file
+
+Fate però attenzione: questa forma di *checkout* può sovrascrivere dei
+file senza avvertimenti. Per evitare incidenti, fate un commit prima di
+eseguire un comando di checkout, specialmente se siete alle prime armi
+con Git. In generale, ogni volta che non siete sicuri delle conseguenze
+di comando, che sia di Git o no, eseguite prima *git commit -a*.
+
+Non vi piace copiare e incollare codice hash? Allora utilizzate:
+
+ $ git checkout :/"Il mio primo b"
+
+per saltare direttamente al commit che inizia con quel messaggio. Potete
+anche chiedere, ad esempio, il quintultimo stato salvato:
+
+ $ git checkout master~5
+
+=== Annullare (revert) ===
+
+In una corte di giustizia, certi avvenimenti possono essere stralciati
+dal processo verbale. Analogamente, potete selezionare degli specifici
+commit da annullare.
+
+ $ git commit -a
+ $ git revert 1b6d
+
+annulla solo l'ultimo commit con il dato codice hash. Il revert viene
+registrato come un nuovo commit, fatto che potrete verificare eseguendo
+un *git log*.
+
+=== Generare un diario delle modifiche (changelog) ===
+
+Certi progetti richiedono un
+http://it.wikipedia.org/wiki/Changelog[changelog]. Createlo digitando:
+
+ $ git log > ChangeLog
+
+=== Scaricare dei files ===
+
+Fate una copia di un progetto gestito da Git digitando:
+
+ $ git clone git://server/percorso/verso/files
+
+Ad esempio, per ottenere tutti i file che ho usato per creare questo
+sito:
+
+ $ git clone git://git.or.cz/gitmagic.git
+
+Avremo molto da dire a proposito del comando *clone* tra poco.
+
+=== L'ultima versione ===
+
+Se avete già scaricato una copia di un progetto usando *git clone*,
+potete aggiornarla all'ultima versione con:
+
+ $ git pull
+
+=== Pubblicazione istantanea ===
+
+Immaginate di aver scritto uno script che volete condividere con altri.
+Potreste semplicemente dire loro di scaricarlo dal vostro computer, ma
+le fanno mentre state migliorando lo script o sperimentando con delle
+modifiche, potrebbero finire nei guai. Naturalmente, questo tipo di
+situazioni sono la ragione per cui esistono i cicli di rilascio. Gli
+sviluppatori possono lavorare frequentemente ad un progetto, ma
+rilasciano il codice solo quando hanno l'impressione che sia
+presentabile.
+
+Per fare questo con Git, nella cartella che contiene lo script eseguite:
+
+ $ git init
+ $ git add .
+ $ git commit -m "Prima versione"
+
+In seguito dite agli utenti di eseguire:
+
+ $ git clone il.vostro.computer:/percorso/verso/lo/script
+
+per scaricare il vostro script. Questo assume che tutti abbiamo accesso
+ssh al vostro computer. Se non fosse il caso, eseguite *git daemon* e
+dite ai vostri utenti di eseguire invece:
+
+ $ git clone git://il.vostro.computer/percorso/verso/lo/script
+
+A partire da questo momento, ogni volta che il vostro script è pronto
+per essere rilasciato, eseguite:
+
+ $ git commit -a -m "Nuova versione"
+
+e i vostri utenti potranno aggiornare la loro versione andando
+nella cartella che contiene lo script e digitando:
+
+ $ git pull
+
+I vostri utenti non si ritroveranno mai più con una versione del vostro
+script che non volete che vedano.
+
+=== Che cosa ho fatto? ===
+
+Ritroverete le modifiche fatte dall'ultimo commit con:
+
+ $ git diff
+
+Oppure quelle a partire da ieri con:
+
+ $ git diff "@{yesterday}"
+
+O tra una versione specifica e due versioni fa:
+
+ $ git diff 1b6d "master~2"
+
+In ogni caso il risultato è una patch che può essere applicata con *git
+apply*.
+Potete anche provare:
+
+ $ git whatchanged --since="2 weeks ago"
+
+Spesso esamino invece la storia dei commits con
+http://sourceforge.net/projects/qgit[qgit], per via della sua
+sfolgorante interfaccia, oppure http://jonas.nitro.dk/tig/[tig],
+un'interfaccia in modalità testo che funziona bene anche con le
+connessioni più lente. Alternativamente, installate un server web,
+lanciate *git instaweb* e lanciate il vostro browser.
+
+
+=== Esercizio ===
+
+
+Siano A, B, C, D quattro commit successivi, dove B è identico a A, con
+l'eccezione che alcuni file sono stati rimossi. Vogliamo rimettere i
+file in D. Come possiamo fare?
+
+Ci sono almeno tre soluzioni. Assumiamo che siamo in D:
+
+ 1. La differenza tra A e B sono i file rimossi. Possiamo creare una
+ patch che rappresenti la differenza e applicarla:
+
+ $ git diff B A | git apply
+
+ 2. Visto che i files in questioni sono presenti in A, possiamo
+ recuperarli:
+
+ $ git checkout A foo.c bar.h
+
+ 3. Possiamo anche pensare al passo da A a B come ad una modifica che
+ vogliamo annullare:
+
+ $ git revert B
+
+Quel è la scelta migliore? Quella che preferite! È facile ottenere
+quello che volete con Git, e spesso ci sono diversi modi di ottenerlo.
diff --git a/it/branch.txt b/it/branch.txt
new file mode 100644
index 00000000..8001a529
--- /dev/null
+++ b/it/branch.txt
@@ -0,0 +1,322 @@
+== La stregoneria delle branch ==
+
+Le funzioni di merge e di ramificazione (o 'branch') sono le migliori
+"killer features" di Git.
+
+*Problema*: Fattori esterni conducono inevitabilmente a cambiamenti di
+contesto. Un grave bug si manifesta inaspettatamente nella versione di
+release. La scadenza per una particolare funzionalità viene anticipata.
+Uno sviluppatore che doveva collaborare con voi su una parte delicata
+di un progetto non è più disponibile. In ogni caso, dovete bruscamente
+smettere quello che stavate facendo per concentrarvi su un compito
+completamente diverso.
+
+Interrompere il flusso dei vostri pensieri può essere controproducente
+e, più scomodo è il cambiamento di contesto, più grande è lo svantaggio.
+Con un sistema di controllo di versione centralizzato bisognerebbe
+scaricare una nuova copia del lavoro dal server centrale. Un sistema
+decentralizzato è migliore perché permette di clonare localmente la
+versione che si vuole.
+
+Ma clonare richiede comunque di copiare un'intera cartella di lavoro, in
+aggiunta all'intera storia fino al punto voluto. Anche se Git riduce i
+costi tramite la condivisione di file e gli hard link, i file di
+progetto stessi devono essere ricreati interamente nella nuova cartella
+di lavoro.
+
+*Soluzione*: Git ha un metodo migliore per queste situazioni che è molto
+migliore ed efficiente in termini di spazio che il clonaggio: il comando
+*git branch*.
+
+Grazie a questa parola magica i file nella directory si trasformano
+immediatamente da una versione a un'altra. Questa trasformazione può
+fare molto di più che portarvi avanti e indietro nella storia del
+progetto. I vostri file possono trasformarsi dall'ultima release alla
+versione corrente di sviluppo, alla versione di un vostro collega, ecc.
+
+=== Boss key ===
+
+Avete mai giocato ad uno di quei giochi che possiedono un tasto (il
+``boss key``) che nasconde immediatamente la schermata coprendola con
+qualcosa come una tabella di calcolo? In questo modo, se il vostro capo,
+entra nel vostro ufficio mentre state giocando potete nasconderlo
+rapidamente.
+
+In una cartella vuota eseguite:
+
+ $ echo "Sono più intelligente che il mio capo." > myfile.txt
+ $ git init
+ $ git add .
+ $ git commit -m "Commit iniziale"
+
+Avete appena creato un deposito Git che gestisce un file di testo che
+contiene un certo messaggio. Adesso digitate:
+
+ $ git checkout -b capo # niente sembra essere cambiato dopo questo
+ $ echo "Il mio capo è più intelligente di me." > myfile.txt
+ $ git commit -a -m "Un altro commit"
+
+Tutto sembra come se aveste semplicemente sovrascritto il vostro
+file e messo in commit le modifiche. Ma questo non è che un'illusione.
+Ora digitate:
+
+ $ git checkout master # Passa alla versione originale del file
+
+e voilà! Il file di testo è ritornato alla versione originale. E se il
+vostro capo si mettesse a curiosare in questa cartella eseguite:
+
+ $ git checkout capo # Passa alla versione accettabile dal capo
+
+Potete passare da una versione all'altra in qualsiasi momento, e mettere
+in commit le vostre modifiche per ognuna indipendentemente.
+
+=== Lavoro temporaneo ===
+
+[[branch]]
+Diciamo che state lavorando ad una funzionalità e, per qualche ragione,
+dovete ritornare a tre versioni precedenti e temporaneamente aggiungere
+qualche istruzione per vedere come funziona qualcosa. Fate:
+
+ $ git commit -a
+ $ git checkout HEAD~3
+
+Ora potete aggiungere codice temporaneo ovunque vogliate. Potete
+addirittura fare un commit dei cambiamenti. Quando avete finito
+eseguite:
+
+ $ git checkout master
+
+per ritornare al vostro lavoro originario. Ricordatevi che i cambiamenti
+non sottomessi ad un commit andranno persi.
+
+Che fare se nonostante tutto voleste salvare questi cambiamenti
+temporanei? Facile:
+
+ $ git checkout -b temporaneo
+
+e fate un commit prima di ritornare alla branch master. Qualora voleste
+ritornare ai cambiamenti temporanei, eseguite semplicemente:
+
+ $ git checkout temporaneo
+
+Abbiamo già parlato del comando _checkout_ in un capitolo precedente, mentre
+discutevamo il caricamento di vecchi stati. Ne parleremo ancora più
+avanti. Per ora ci basta sapere questo: i file vengono cambiati allo
+stato richiesto, ma bisogna lasciare la branch master. A partire da
+questo momento, tutti i commit porteranno i vostri file su una strada
+diversa che potrà essere nominata più avanti.
+
+In altre parole, dopo un checkout verso uno stato precedente, Git ci
+posiziona automaticamente in una nuova branch anonima che potrà essere
+nominata e salvata con *git checkout -b*.
+
+=== Correzioni rapide ===
+
+Diciamo che state lavorando su qualcosa e vi viene improvvisamente
+richiesto di lasciar perdere tutto per correggere un bug appena scoperto
+nella versione `1b6d...` :
+
+ $ git commit -a
+ $ git checkout -b correzioni 1b6d
+
+Poi, quando avete corretto il bug, eseguite:
+
+ $ git commit -a -m "Bug corretto"
+ $ git checkout master
+
+per riprendere il lavoro originario. Potete anche fare un 'merge' delle
+nuove correzioni del bug:
+
+ $ git merge correzioni
+
+=== Merge ===
+
+Con alcuni sistemi di controllo di versione creare delle branch è
+molto facile, ma fare un merge è difficile. Com Git, fare un merge è
+così facile che potreste anche non accorgervi che lo state facendo.
+
+Infatti abbiamo già incontrato il merge molto tempo fa. Il comando
+*pull* recupera, ('fetch') una serie di versioni e le incorpora
+('merge') nella branch corrente. Se non ci sono cambiamenti locali, il
+merge è un semplicemente salto in avanti (un _fast forward_), un caso
+degenere simile a ottenere la versione più recente in un sistema di
+controllo di versione centralizzato. Ma se ci sono cambiamenti locali,
+Git farà automaticamente un merge, riportando tutti i conflitti.
+
+Normalmente una versione ha una sola 'versione genitore', vale a dire la
+versione precedente. Fare un merge di brach produce una versione con
+almeno due genitori. Questo solleva la seguente domanda: a quale
+versione corrisponde `HEAD~10`? Visto che una versione può avere
+parecchi genitori, quali dobbiamo seguire?
+
+Si dà il caso che questa notazione si riferisce sempre al primo
+genitore. Questo è desiderabile perché la versione corrente diventa il
+primo genitore in un merge; e spesso si è più interessati ai cambiamenti
+fatti nella branch corrente, piuttosto che ai cambiamenti integrati
+dalle altre branch.
+
+Potete fare riferimento ad un genitore specifico con un accento
+circonflesso. Ad esempio, per vedere il log del secondo genitore:
+
+ $ git log HEAD^2
+
+Potete omettere il numero per il primo genitore. Ad esempio, per vedere
+le differenze con il primo genitore:
+
+ $ git diff HEAD^
+
+Potete combinare questa notazione con le altre. Ad esempio:
+
+ $ git checkout 1b6d^^2~10 -b ancient
+
+inizia la nuova branch ``ancient'' nello stato corrispondente a 10
+versioni precedenti il secondo genitore del primo genitore del commit il
+cui nome inizia con 1b6d.
+
+=== Flusso di lavoro ininterrotto ===
+
+Spesso in un progetto ``hardware'' la seconda tappa deve aspettare il
+completamento della prima. Un'automobile in riparazione deve rimanere
+bloccata in garage fino all'arrivo di una particolare parte di ricambio.
+Un prototipo deve aspettare la fabbricazione di un processore prima che
+la costruzione possa continuare.
+
+I progetti software possono essere simili. La seconda parte di una nuova
+funzionalità può dover aspettare fino a che la prima parte venga
+completata e testata. Alcuni progetti richiedono che il vostro codice
+sia rivisto prima di essere accettato. Siete quindi obbligati ad
+aspettare l'approvazione della prima parte prima di iniziare la seconda.
+
+Grazie alla facilità con cui si creano delle branch e si effettua un
+merge, si possono piegare le regole e lavorare sulla parte II prima che la parte I
+sia ufficialmente pronta. Supponiamo che avete fatto il commit della
+parte I e l'avete sottomessa per approvazione. Diciamo che siete nella
+branch `master`. Create allora una nuova branch così:
+
+ $ git checkout -b part2
+
+In seguito, lavorate sulla parte II, fate il commit dei cambiamenti
+quando necessario. Errare è umano, e spesso vorrete tornare indietro e
+aggiustare qualcosa nella parte I. Se siete fortunati, o molto bravi,
+potete saltare questo passaggio.
+
+ $ git checkout master # Ritorno alla parte 1
+ $ correzione_problemi
+ $ git commit -a # Commit delle correzioni.
+ $ git checkout part2 # Ritorno alla parte 2.
+ $ git merge master # Merge delle correzioni.
+
+Finalmente la parte I è approvata.
+
+ $ git checkout master # Ritorno alla parte I.
+ $ distribuzione files # Distribuzione in tutto il mondo!
+ $ git merge part2 # Merge della parte II
+ $ git branch -d part2 # Eliminazione della branch "part2"
+
+In questo momento siete di nuovo nella branch `master`, con la parte II
+nella vostra cartella di lavoro.
+
+È facile estendere questo trucco a qualsiasi numero di parti. È anche
+facile creare delle branch retroattivamente: supponiamo che ad un certo
+punto vi accorgete che avreste dovuto creare una branch 7 commit fa.
+Digitate allora:
+
+ $ git branch -m master part2 # Rinomina la branch "master" con il nome "part2".
+ $ git branch master HEAD~7 # Crea una nuova branch "master" 7 commits nel passato.
+
+La branch `master` contiene ora solo la parte I, e la branch `part2`
+contiene il resto. Noi siamo in questa seconda branch; abbiamo creato
+`master` senza spostarvici perché vogliamo continuare a lavorare su
+`part2`. Questo è inusuale. Fino ad ora spostavamo in una branch non
+appena la creavamo, come in:
+
+ $ git checkout HEAD~7 -b master # Crea una branch, e vi si sposta.
+
+=== Riorganizzare un pasticcio ===
+
+Magari vi piace lavorare su tutti gli aspetti di un progetto nella
+stessa branch. Volete che i vostri lavori in corso siano accessibili
+solo a voi stessi e volete che altri possano vedere le vostre versioni
+solo quando sono ben organizzate. Cominciamo creando due branch:
+
+ $ git branch ordine # Crea una branch per commit organizzati.
+ $ git checkout -b pasticcio # Crea e si sposta in una branch in cui lavorare
+
+In seguito lavorate su tutto quello che volete: correggere bugs,
+aggiungere funzionalità, aggiungere codice temporaneo, e così via,
+facendo commit quando necessario. Poi:
+
+ $ git checkout ordine
+ $ git cherry-pick pasticcio^^
+
+applica le modifiche della versione progenitore della corrente versione
+``pasticcio'' alla versione ``ordine''. Con i cherry-pick appropriati
+potete costruire una branch che contiene solo il codice permanente e
+che raggruppa tutti i commit collegati.
+
+=== Gestione di branch ===
+
+Per ottenere una lista di tutte le branch, digitate:
+
+ $ git branch
+
+Per default iniziate nella branch chiamata ``master''. Alcuni
+raccomandano di lasciare la branch ``master'' intatta e di creare nuove
+branch per le proprie modifiche.
+
+Le opzioni *-d* e *-m* permettono di cancellare e spostare (rinominare)
+le branch. Per più informazioni vedete *git help branch*.
+
+La branch ``master'' è una convenzione utile. Gli altri possono assumere
+che il vostro deposito ha una branch con quel nome, e che questa
+contiene la versione ufficiale del vostro progetto. Nonostante sia
+possibile rinominare o cancellare la branch ``master'', può essere utile
+rispettare le tradizioni.
+
+=== Branch temporanee ===
+
+Dopo un certo tempo d'utilizzo potreste accorgervi che create
+frequentemente branch temporanee per ragioni simili: vi servono
+solamente per salvare lo stato corrente così da rapidamente saltare ad
+uno stato precedente per correggere un bug prioritario o qualcosa di
+simile.
+
+È analogo a cambiare temporaneamente canale televisivo per vedere
+cos'altro c'è alla TV. Ma invece di premere un paio di bottoni, dovete
+creare, spostarvi, fare merge e cancellare branch temporanee.
+Fortunatamente Git possiede una scorciatoia che è altrettanto pratica
+che il telecomando del vostro televisore:
+
+ $ git stash
+
+Questo salva lo stato corrente in un posto temporaneo (uno 'stash') e
+ristabilisce lo stato precedente. La vostra cartella di lavoro appare
+esattamente com'era prima di fare le modifiche e potete correggere bugs,
+incorporare cambiamenti del deposito centrale (pull), e così via. Quando
+volete ritornare allo stato corrispondente al vostro 'stash', eseguite:
+
+ $ git stash apply # Potreste dover risolvere qualche conflitto.
+
+Potete avere stash multipli, e manipolarli in modi diversi. Vedere *git
+help stash* per avere più informazioni. Come avrete indovinato, Git
+mantiene delle branch dietro le quinte per realizzare questi trucchi
+magici.
+
+=== Lavorate come volete ===
+
+Potreste chiedervi se vale la pena usare delle branch. Dopotutto creare
+dei cloni è un processo altrettanto rapido e potete passare da uno
+all'altro con un semplice *cd*, invece che gli esoterici comandi di Git.
+
+Consideriamo un browser web. Perché supportare tabs multiple oltre a
+finestre multiple? Perché permettere entrambi accomoda una gamma
+d'utilizzazione più ampia. Ad alcuni utenti piace avere una sola
+finestra e usare tabs per multiple pagine web. Altri insistono con
+l'estremo opposto: multiple finestre senza tabs. Altri ancora
+preferiscono qualcosa a metà.
+
+Le branch sono come delle tabs per la vostra cartella di lavoro, e i
+cloni sono come nuove finestre del vostro browser. Queste operazioni
+sono tutte veloci e locali. Quindi perché non sperimentare per trovare
+la combinazione che più vi si addice? Con Git potete lavorare
+esattamente come volete.
diff --git a/it/clone.txt b/it/clone.txt
new file mode 100644
index 00000000..f4974144
--- /dev/null
+++ b/it/clone.txt
@@ -0,0 +1,309 @@
+== Cloniamo ==
+
+In vecchi sistemi di controllo di versione l'operazione standard per
+ottenere dei file era il checkout. Ottenete così un insieme di file
+corrispondenti a un particolare stato precedentemente salvato.
+
+In Git e altri sistemi distribuiti di controllo versione, l'operazione
+standard è il clonaggio. Per ottenere dei file si crea un 'clone' di
+tutto il deposito. In altre parole, diventate praticamente un
+http://it.wikipedia.org/wiki/Mirror_(informatica)[mirror] del server
+centrale. Tutto ciò che può fare il deposito centrale, potete farlo
+anche voi.
+
+=== Sincronizzazione tra computers ===
+
+Posso tollerare l'idea di creare degli archivi *tar* o di utilizzare
+*rsync* per backup di base. Ma a volte lavoro sul mio laptop, altre
+volte sul mio desktop, e può darsi che nel frattempo le due macchine non
+si siano parlate.
+
+Inizializzate un deposito Git e fate un *commit* dei vostri file su una
+macchina. Poi sull'altra eseguite:
+
+ $ git clone altro.computer:/percorso/verso/il/file
+
+per creare una seconda copia dei file in un deposito Git. Da adesso in
+avanti,
+
+ $ git commit -a
+ $ git pull altro.computer:/percorso/verso/il/file HEAD
+
+trasferirà lo stato dei file sull'altro computer aggiornando quello su
+cui state lavorando. Se avete recentemente fatto delle modifiche
+conflittuali dello stesso file, Git ve lo segnalerà e dovrete ripetere
+nuovamente il commit, dopo che avrete risolto il conflitto.
+
+=== Controllo classico di file sorgente ===
+
+Inizializzate il deposito Git dei vostri file:
+
+ $ git init
+ $ git add .
+ $ git commit -m "Commit iniziale"
+
+Sul server centrale inizializzate un 'deposito nudo' (*nudo* nella
+terminologia Git) in una cartella qualunque:
+
+ $ mkdir proj.git
+ $ cd proj.git
+ $ git init --bare
+ $ touch proj.git/git-daemon-export-ok
+
+Se necessario, lanciate il daemon:
+
+ $ git daemon --detach # potrebbe già essere in esecuzione
+
+Per servizi di hosting Git, seguite le istruzioni per il setup del
+deposito Git che inizialmente sarà vuoto. Tipicamente bisognerà riempire
+un formulario in una pagina web.
+
+Trasferite il vostro progetto sul server centrale con:
+
+ $ git push git://server.centrale/percorso/fino/a/proj.git HEAD
+
+Per ottenere i file sorgente, uno sviluppatore deve eseguire:
+
+ $ git clone git://server.centrale/percorso/fino/a/proj.git
+
+Dopo aver fatto delle modifiche, lo sviluppatore le salva in locale:
+
+ $ git commit -a
+
+Per aggiornare alla versione corrente:
+
+ $ git pull
+
+Tutti i conflitti nel momento del merge devono essere risolti e
+validati:
+
+ $ git commit -a
+
+Per inviare le modifiche locali al deposito centrale:
+
+ $ git push
+
+Se il server principale ha nuove modifiche introdotte da altri
+sviluppatori, il push fallisce et lo sviluppatore deve aggiornarsi
+all'ultima versione, risolvere eventuali conflitti , e provare di
+nuovo.
+
+Perché i comandi pull e push precedenti funzionino bisogna avere
+accesso SSH. Comunque, chiunque può vedere il codice sorgente digitando:
+
+ $ git clone git://server.centrale/percorso/fino/a/proj.git
+
+Il protocollo nativo git è come l'HTTP: non c'è nessuna autenticazione,
+così che tutti possono ottenere il progetto. Quindi, per default, push è
+proibito con protocollo git.
+
+=== File sorgente segreti ===
+
+Per un progetto chiuso, omettete il comando touch, e assicuratevi di mai
+creare un file chiamato `git-daemon-export-ok`. Il deposito in questo
+caso non potrà più essere ottenuto con il protocollo git; solo chi ha
+accesso SSH potrà vederlo. Se tutti i vostri deposito sono chiusi,
+lanciare il daemon git non è necessario perché la comunicazione avviene
+via SSH.
+
+=== Depositi nudi ===
+
+Un deposito nudo (*bare repository*) si chiama così perché non possiede
+una cartella di lavoro; contiene solo i file che sono solitamente
+nascosti nella sottocartella `.git`. In altre parole, mantiene
+unicamente la storia del progetto, e e non conserva nessuna versione.
+
+Un deposito nudo gioca un ruolo simile a quello di un server principale
+in un sistema di controllo di versione centralizzato: è dove è
+localizzato il vostro progetto. Altri sviluppatori clonano il nostro
+progetto da lì, e vi trasferiscono gli ultimi modifiche ufficiali.
+Tipicamente si trova su un server che non fa altro che distribuire dati.
+Lo sviluppo avviene nei cloni, così che il deposito principale non ha
+bisogno di una cartella di lavoro.
+
+Molti comandi git non funzionano per depositi nudi, a meno che la
+variabile globale `GIT_DIR` non viene definita con il percorso al
+deposito, o si utilizza l'opzione `--bare`.
+
+=== Push vs pull ===
+
+Perché abbiamo introdotto il comando `push`, invece di affidarci
+al più familiare comando `pull`? Prima di tutto il comando `pull` non
+funziona con depositi nudi: in questo caso bisogna invece usare `fetch`,
+un comando che discuteremo più tardi. Ma anche se avessimo un deposito
+normale sul server centrale, usare `pull` sarebbe sarebbe scomodo.
+Bisognerebbe per prima cosa connettersi al server e poi dare come
+argomento a `pull` l'indirizzo della macchina dalla quale vogliamo
+ottenere le modifiche. I firewalls potrebbero interferire nel processo,
+e cosa faremmo se non avessimo nemmeno accesso shell al server?
+
+In ogni caso, questo caso a parte, vi scoraggiamo l'uso di `push` per
+via della confusione che potrebbe generare quando la destinazione ha una
+cartella di lavoro.
+
+In conclusione, mentre state imparando ad usare Git, usate `push` solo
+se la destinazione è un deposito nudo; altrimenti usate `pull`.
+
+=== Fare il forking di un progetto ===
+
+Stufi del modo in cui un progetto è amministrato? Pensate che potreste
+fare un lavoro migliore? In questo caso, dal vostro server eseguite:
+
+ $ git clone git://server.principale/percorso/verso/i/files
+
+Informate ora tutti del vostro fork del progetto sul vostro server.
+
+In seguito potete includere le modifiche provenenti dal progetto
+originale con:
+
+ $ git pull
+
+=== Il sistema definitivo di salvataggio ===
+
+Volete degli archivi ridondanti e geograficamente distribuiti? Se il
+vostro progetto ha moti sviluppatori non c'è bisogno di fare niente!
+Ogni clone del vostro codice è effettivamente un backup. Non solo dello
+stato corrente, ma dell'intera storia del vostro progetto. Grazie al
+hashing crittografico, se qualcuno dovesse avere un clone corrotto,
+sarà individuato non appena si connetterà agli altri.
+
+Se il vostro progetto non è molto popolare, trovate il più alto numero
+possibile di server che possano ospitare dei cloni.
+
+Il vero paranoico dovrebbe anche sempre annotarsi l'ultimo codice SHA1
+dell'HEAD di 20 bytes in un posto sicuro. Deve essere sicuro, non
+privato. Ad esempio, pubblicarlo in un giornale funzionerebbe bene,
+visto che sarebbe difficile realizzare un attacco modificando tutte le
+copie del giornale.
+
+=== Multi-tasking alla velocità della luce ===
+
+Immaginiamo di voler lavorare simultaneamente su diverse funzionalità.
+In questo caso fate un commit del progetto e eseguite:
+
+ $ git clone . /una/nuova/cartella
+
+Grazie ai http://it.wikipedia.org/wiki/Collegamento_fisico[collegamenti
+fisici], i cloni locali richiedono meno tempo e spazio che i backup
+usuali.
+
+Potete ora lavorare simultaneamente su due funzionalità
+indipendentemente. Ad esempio, potete modificare un clone mentre l'altro
+sta compilando. Ad ogni modo, potete validare con 'commit' le vostre
+modifiche e importare con `pull` i cambiamenti dagli altri cloni:
+
+ $ git pull /il/mio/altro/clone HEAD
+
+=== Controllo di versione da battaglia ===
+
+State lavorando ad un progetto che usa qualche altro sistema di
+controllo di versione, e vi manca disperatamente Git? In tal caso,
+inizializzate un deposito Git nella vostra cartella di lavoro:
+
+ $ git init
+ $ git add .
+ $ git commit -m "Commit iniziale"
+
+poi clonatelo:
+
+ $ git clone . /una/nuva/cartella
+
+Ora navigate alla nuova cartella e lavorate da qua, utilizzando Git come
+volete. Di tanto in tanto, quando volete sincronizzarvi con gli altri,
+recatevi nella cartella originale, sincronizzate utilizzando l'altro
+sistema di controllo di gestione, e poi digitate:
+
+ $ git add .
+ $ git commit -m "Sincronizzazione con gli altri"
+
+Andate quindi nella nuova cartella e lanciate:
+
+ $ git commit -a -m "Descrizione delle mie modifiche"
+ $ git pull
+
+La procedura per condividere le vostre modifiche con gli altri dipende
+d'altro canto dall'altro sistema di controllo di versione. La nuova
+cartella contiene i file con i vostri cambiamenti. Lanciate qualsiasi
+comando dell'altro sistema di controllo di gestione sia necessario per
+inviarli al deposito centrale.
+
+Subversion, che è forse il migliore sistema di gestione di versione
+centralizzato, è utilizzato da innumerevoli progetti. Il comando *git
+svn* automatizza la procedura precedente per i depositi Subversion, e
+può anche essere usato per esportare un progetto Git in un deposito
+Subversion.
+
+=== Mercurial ===
+
+Mercurial è un sistema di controllo di versione che può funzionare
+in tandem con Git in modo quasi trasparente. Con il plugin `hg-git` un
+utente di Mercurial può, senza svantaggi, inviare a (push) e ottenere
+(pull) da un deposito Git.
+
+Scaricate il plugin `hg-git` con Git:
+
+ $ git clone git://github.com/schacon/hg-git.git
+
+o Mercurial:
+
+ $ hg clone http://bitbucket.org/durin42/hg-git/
+
+Sfortunatamente, non sembra ci sia un plugin analogo per Git. Per questa
+ragione, mi sembra preferibile utilizzare Git piuttosto che Mercurial
+per i depositi principali. Nel caso di un progetto Mercurial di solito
+un volontario mantiene in parallelo un deposito Git che accomoda utenti
+Git, mentre, grazie al plugin `hg-git`, un progetto Git accomoda
+automaticamente utenti Mercurial.
+
+Nonostante il plugin può convertire un deposito Mercurial in uno Git
+trasferendolo in un deposito vuoto, questo è più facile con lo script
+`hg-fast-export.sh`, ottenibile da:
+
+ $ git clone git://repo.or.cz/fast-export.git
+
+Per fare una conversione, in una nuovo cartella eseguite:
+
+ $ git init
+ $ hg-fast-export.sh -r /depot/hg
+
+dopo aver aggiunto lo script al vostro `$PATH`.
+
+=== Bazaar ===
+
+Menzioniamo brevemente Bazaar perché è il sistema di controllo di
+versione distribuito gratuito più popolare dopo Git e Mercurial.
+
+Bazaar ha il vantaggio del senno di poi, visto che è relativamente
+giovane; i suoi disegnatori hanno potuto imparare dagli errori commessi
+nel passato e evitare gli scogli storici. Inoltre, i suoi sviluppatori
+sono attenti a questioni come la portabilità e l'interoperabilità con
+altri sistemi di controllo di versione.
+
+Un plugin chiamato `bzr-git` permette agli utilizzatori di Bazaar di
+lavorare con depositi Git in una certa misura. Il programma `tailor`
+converte depositi Bazaar in depositi Git, e può farlo in maniera
+incrementale, mentre `bzr-fast-export` è fatto per le conversioni
+uniche.
+
+=== Perché utilizzo Git ===
+
+Ho originariamente scelto Git perché avevo sentito che era in grado di
+gestire l'inimmaginabilmente ingestibile sorgente del kernel Linux. Non
+ho mai sentito la necessità di cambiare. Git mi ha servito un servizio
+impeccabile, e non sono mai stato colto alla sprovvista dai suoi
+limiti. Siccome utilizzo primariamente Linux, i problemi che appaiono
+sulle altre piattaforme non mi concernono.
+
+In più preferisco programmi in C e scripts in bash rispetto agli
+eseguibili tipo gli scripts Python: ci sono meno dipendenze, e sono
+dipendente all'alta velocità di esecuzione.
+
+Ho riflettuto a come migliorare Git, arrivando fino al punto di scrivere
+la mia propria versione, ma solo come un esercizio accademico. Anche se
+avessi completato il mio progetto, sarei rimasto a Git comunque, visto
+che i vantaggi sarebbero stati minimi per giustificare l'utilizzazione
+di un sistema solitario.
+
+Naturalmente, i vostri bisogni e richieste probabilmente differiscono
+dai miei, e quindi potreste trovarvi meglio con un altro sistema.
+Nonostante ciò, non potete sbagliarvi scegliendo Git.
diff --git a/it/drawbacks.txt b/it/drawbacks.txt
new file mode 100644
index 00000000..29f4c280
--- /dev/null
+++ b/it/drawbacks.txt
@@ -0,0 +1,185 @@
+== Appendice A: Le lacune di Git ==
+
+Git presenta qualche problema che ho nascosto sotto il tappeto. Alcuni
+possono essere facilmente risolti con script e 'hook', altri richiedono
+di riorganizzare e ridefinire il progetto, e per le poche rimanenti
+seccature non vi rimarrà che attendere. O meglio ancora, contribuire
+con il vostro aiuto!
+
+=== Le debolezze di SHA1 ===
+
+Con il tempo, gli specialisti in crittografia continuano a scoprire
+debolezze di SHA1. È già possibile trovare collisioni hash (cioè
+sequenze di byte che risultano nello stesso codice hash), dati
+sufficienti mezzi. Fra qualche anno anche un normale PC potrebbe avere
+abbastanza potenza di calcolo per corrompere in maniera non rilevabile
+un deposito Git.
+
+Auspicabilmente Git sarà migrato verso un migliore sistema di funzioni
+hash prima che ulteriore ricerca distruggerà lo standard SHA1.
+
+=== Microsoft Windows ===
+
+Git per Microsoft Windows può essere piuttosto ingombrante:
+
+- http://cygwin.com/[Cygwin] è un ambiente di emulazione di Linux per
+ Windows che contiene http://cygwin.com/packages/git/[una versione di
+ Git per Windows].
+
+- https://gitforwindows.org/[Git per Windows] è un alternativa che
+ richiede meno risorse, anche se alcuni comandi necessitano ancora di
+ essere migliorati.
+
+=== File senza relazione ===
+
+Se il vostro progetto è molto grande e contiene molti file scorrelati
+che tendono a cambiare spesso, Git può essere in svantaggio rispetto ad
+altri sistemi perché file singoli non sono tenuti sotto controllo. Git
+tiene sotto controllo l'intero progetto, che normalmente è una strategia
+vantaggiosa.
+
+Una soluzione è di suddividere il vostro progetto in pezzi, ognuno
+consistente di gruppi di file correlati. Usate *git submodule* se volete
+poi comunque mantenere tutto in un deposito unico.
+
+=== Chi modifica cosa? ===
+
+Certi sistemi di controllo di versione vi obbligano a marcare
+esplicitamente un file prima di poterlo modificare. Mentre questo è
+particolarmente fastidioso perché implica comunicazioni addizionali con
+un server centrale, ha comunque due benefici:
+
+ 1. Il calcolo delle differenze è rapido, perché solo i file marcati
+ devono essere esaminati.
+
+ 2. Ognuno può sapere chi sta lavorando su un file chiedendo al server
+ centrale chi l'ha marcato per modifiche.
+
+Con qualche script appropriato, potete ottenere la stessa cosa con Git.
+Questo richiede cooperazione dagli altri programmatori, i quali devono
+eseguire script particolari prima di modificare un file.
+
+=== La storia di un file ===
+
+Perché Git registra modifiche in maniera globale al progetto, la
+ricostruzione della storia di un singolo file richiede più lavoro che in
+altri sistemi di controllo di versioni che si occupano di file
+individuali.
+
+Questo sovrappiù è generalmente trascurabile e ne vale la pena visto che
+permette altre operazioni di incredibile efficienza. Per esempio, `git
+checkout` è più rapido che `cp -a`, e una differenza di versione globale
+al progetto si comprime meglio che una collezione di differenze di file
+individuali.
+
+=== Il clone iniziale ===
+
+Creare un clone è più costoso che fare un checkout in altri sistemi di
+controllo di versione se il progetto ha una storia lunga.
+
+Il costo iniziale è un buon investimento, visto che operazioni future
+saranno più rapide e offline. Tuttavia, in alcune situazioni può essere
+preferibile creare un clone superficiale utilizzando l'opzione
+`--depth`. Questo è più rapido, ma il clone risultante ha funzionalità
+limitate.
+
+=== Progetti volatili ===
+
+Git è stato scritto per essere rapido rispetto alla dimensione dei
+cambiamenti. Normalmente si tende a fare piccole modifiche da una
+versione all'altra. La correzione di un bug in una linea qui, una nuova
+funzionalità là, commenti corretti, e così via. Ma se i vostri file
+cambiano radicalmente in revisioni successive, ad ogni commit la vostra
+storia crescerà necessariamente proporzionalmente alle dimensioni
+dell'intero progetto.
+
+Non c'è niente che nessun sistema di controllo di versione possa fare
+per evitare questo, ma gli utilizzatori di Git ne soffriranno di più
+perché ogni clone contiene normalmente la storia completa.
+
+Bisogna cercare la ragione per cui questi cambiamenti sono così grandi.
+Magari bisogna cambiare il formato dei file. Modifiche minori dovrebbero
+causare solo cambiamenti minori in solo pochi file.
+
+Magari un database o un sistema d'archivio sono invece una soluzione più
+adatta invece di un sistema di controllo di versione. Per esempio, un
+sistema di controllo di versione potrebbe non essere adatto per gestire
+fotografie prese periodicamente da una webcam.
+
+Se i file devono essere cambiare radicalmente e se devono essere gestite
+in versioni, una possibilità è di usare Git in maniera centralizzata. È
+possibile creare cloni superficiali che contengono solo una parte minore
+o addirittura inesistente della storia del progetto. Naturalmente in
+questo caso molti strumenti di Git non saranno più a disposizione, e
+correzioni dovranno essere fornite sotto forma di patch. Questo va
+probabilmente bene, visto che non sembrerebbe doverci essere nessun
+motivo per mantenere la storia di file ampiamente instabili.
+
+Un altro esempio è un progetto che dipende da un firmware che consiste
+in un enorme file binario. La storia di questo firmware non interessa
+agli utilizzatori, e gli aggiornamenti non sono molto compressibili, il
+che significa che le revisioni del firmware inflazionano inutilmente il
+deposito.
+
+In questo caso il codice sorgente dovrebbe essere salvato in un deposito
+Git, mentre i file binari dovrebbero essere tenuti separatamente. Per
+rendere la vita più facile, si potrebbe distribuire uno script che usa
+Git per clonare il codice sorgente, e rsync o un Git superficiale per il
+firmware.
+
+=== Contatore globale ===
+
+Alcuni sistemi di controllo di versione centralizzati mantengono un
+numero intero che aumenta quando un nuovo commit è accettato. Git fa
+riferimento ai cambiamenti tramite il loro codice hash, un metodo
+migliore in molte circostanze.
+
+Alcune persone vorrebbero però avere accesso a questo contatore.
+Fortunatamente è facile scrivere uno script che fa in maniera di
+aumentare un contatore nel deposito Git centrale ad ogni aggiornamento,
+magari grazie ad una tag associata con un hash dell'ultimo commit.
+
+Ogni clone potrebbe mantenere un tale contatore, ma questo sarebbe
+probabilmente inutile, visto che solo il contatore del deposito centrale
+è interessante per gli utenti.
+
+=== Sottocartelle vuote ===
+
+Sottocartelle vuote non possono essere gestite. Create dei file
+segnaposto per rimediare a questo problema.
+
+Queste limitazioni non sono dovute a come Git è concepito, ma piuttosto
+a come è correntemente implementato. Con un po' di fortuna, se
+abbastanza utilizzatori lo richiedono, questa funzionalità potrebbe
+essere implementata.
+
+=== Commit iniziale ===
+
+In informatico tipico conta a partire da 0, invece che da 1.
+Sfortunatamente, rispetto ai commit, Git non aderisce a questa
+convenzione. Molti comandi non funzionano prima del primo commit.
+Inoltre alcuni casi limite devono essere gestiti in maniera specifica:
+ad esempio, usare 'rebase' su una branch con commit iniziale diverso.
+
+Git beneficerebbe della definizione del commit numero zero: non appena
+un deposito è costruito, HEAD verrebbe assegnato ad una stringa
+consistente in 20 bytes zero. Questo commit speciale rappresenterebbe un
+tree vuoto, senza genitori, che sarebbe presente in tutti i depositi
+Git.
+
+In questo modo ad esempio l'esecuzione di 'git log' informerebbe
+l'utente che non sono ancora stati fatti commit, invece di terminare con
+un 'fatal error'. Una cosa simile varrebbe per altri comandi.
+
+Ogni commit iniziale sarebbe implicitamente discendente da questo commit
+zero.
+
+Ci sarebbero tuttavia casi problematici. Se diverse branch con commit
+iniziali diversi fossero fusi assieme con un merge, l'uso del comando
+'rebase' richiederebbe un sostanziale intervento manuale.
+
+=== Bizzarrie dell'interfaccia ===
+
+Dati due commit A e B, il significato delle espressioni "A..B" e "A...B"
+dipende da se il comando si attende due estremità o un intervallo.
+Vedete *git help diff* e *git help rev-parse*.
diff --git a/it/grandmaster.txt b/it/grandmaster.txt
new file mode 100644
index 00000000..02353034
--- /dev/null
+++ b/it/grandmaster.txt
@@ -0,0 +1,301 @@
+== Padroneggiare Git ==
+
+A questo punto dovreste essere capaci di navigare la guida *git help* e
+di capire quasi tutto (a condizione ovviamente di capire l'inglese).
+Nonostante ciò ritrovare il comando esatto richiesto per risolvere un
+particolare problema può essere tedioso. Magari posso aiutarvi a
+risparmiare un po' di tempo: qua sotto trovate qualcuna delle ricette di
+cui ho avuto bisogno in passato.
+
+=== Pubblicazione di codice sorgente ===
+
+Per i miei progetti Git gestisce esattamente i file che voglio
+archiviare e pubblicare. Per creare un archivio in formato tar del
+codice sorgente utilizzo:
+
+ $ git archive --format=tar --prefix=proj-1.2.3/ HEAD
+
+=== Commit dei cambiamenti ===
+
+Dire a Git quando avete aggiunto, cancellato o rinominato dei file può
+essere fastidioso per certi progetti. Invece potete eseguire:
+
+ $ git add .
+ $ git add -u
+
+Git cercherà i file della cartella corrente e gestirà tutti i dettagli
+automaticamente. Invece del secondo comando 'add', eseguite `git
+commit -a` se volete anche fare un commit. Guardate *git help ignore*
+per sapere come specificare i file che devono essere ignorati.
+
+Potete anche effettuare tutti i passi precedenti in un colpo solo con:
+
+ $ git ls-files -d -m -o -z | xargs -0 git update-index --add --remove
+
+Le opzioni *-z* e *-0* permettono di evitare effetti collaterali dovuti
+a file il cui nome contiene strani caratteri. Visto che questo comando
+aggiunge anche file che sono ignorati, potreste voler usare le opzioni
+`-x` o `-X`.
+
+=== Il mio commit è troppo grande! ===
+
+Vi siete trascurati da un po' di tempo di fare dei commit? Avete scritto
+codice furiosamente dimenticandovi di controllo di versione? Avete
+implementato una serie di cambiamenti indipendenti, perché è il vostro
+stile di lavoro?
+
+Non c'è problema. Eseguite:
+
+ $ git add -p
+
+Per ognuna delle modifiche che avete fatto, Git vi mostrerà la parte di
+codice che è stata cambiata e vi domanderà se dovrà fare parte del
+prossimo commit. Rispondete con "y" (sì) o con "n" (no). Avete anche
+altre opzioni, come di postporre la decisione; digitate "?" per saperne
+di più.
+
+Una volta soddisfatti, eseguite:
+
+ $ git commit
+
+per fare un commit che comprende esattamente le modifiche selezionate
+(le modifiche `nell'area di staging`, vedere dopo). Assicuratevi di
+omettere l'opzione *-a*, altrimenti Git farà un commit che includerà
+tutte le vostre modifiche.
+
+Che fare se avete modificato molti file in posti diversi? Verificare ogni
+cambiamento uno alla volta diviene allora rapidamente frustrante e
+noioso. In questo caso usate *git add -i*, la cui interfaccia è meno
+intuitiva ma più flessibile. Con qualche tasto potete aggiungere o
+togliere più file alla volta dall'area di staging, oppure anche rivedere
+e selezionare cambiamenti in file particolari. Altrimenti potete anche
+eseguire *git commit \--interactive* che effettuerà automaticamente un
+commit quando avrete finito.
+
+=== L'indice : l'area di staging ===
+
+Fino ad ora abbiamo evitato il famoso 'indice' di Git, ma adesso
+dobbiamo parlarne per capire meglio il paragrafo precedente. L'indice è
+un'area temporanea di cosiddetto 'staging'. Git trasferisce raramente dati
+direttamente dal vostro progetto alla sua storia. Invece, Git scrive
+prima i dati nell'indice, e poi copia tutti i dati dell'indice nella
+loro destinazione finale.
+
+Un *commit -a* è ad esempio in realtà un processo a due fasi. La prima
+fase stabilisce un'istantanea (un cosiddetto 'snapshot') dello stato
+corrente di ogni file in gestione e la ripone nell'indice. La seconda
+fase salva permanentemente questo snapshot. Effettuare un commit senza
+l'opzione *-a* esegue solamente la seconda fase, e ha quindi solo senso
+solo a seguito di un comando che modifica l'indice, come ad esempio *git
+add*.
+
+Normalmente possiamo ignorare l'indice e comportandoci effettivamente
+come se se stessimo scambiando dati direttamente nella storia. In altri
+casi come quello precedente vogliamo un controllo più fine e manipoliamo
+quindi l'indice. Inseriamo nell'indice uno snapshot di alcuni, ma non
+tutti i cambiamenti, e poi salviamo permanentemente questi snapshot
+accuratamente costruiti.
+
+=== Non perdete la "testa" ===
+
+La tag HEAD è come un cursore che normalmente punta all'ultimo commit,
+avanzando con ogni commit. Alcuni comandi di Git permettono di muoverla.
+Ad esempio:
+
+ $ git reset HEAD~3
+
+sposta HEAD tre commit indietro. Da qua via tutti i comandi Git agiscono
+come se non aveste fatto quegli ultimi tre commit, mentre i vostri file
+rimangono nello stato presente. Vedere la pagina di help per qualche
+applicazione interessante.
+
+Ma come fare per ritornare al futuro? I commit passati non sanno niente
+del futuro.
+
+Se conoscete il codice SHA1 dell'HEAD originario (diciamo 1b6d...),
+fate allora:
+
+ $ git reset 1b6d
+
+Ma come fare se non l'avete memorizzato? Non c'è problema: per comandi
+di questo genere Git salva l'HEAD originario in una tag chiamata
+ORIG_HEAD, e potete quindi ritornare al futuro sani e salvi con:
+
+ $ git reset ORIG_HEAD
+
+=== Cacciatore di "teste" ===
+
+ORIG_HEAD può non essere abbastanza. Diciamo che vi siete appena accorti
+di un monumentale errore e dovete ritornare ad un vecchio commit in una
+branch dimenticata da lungo tempo.
+
+Per default Git conserva un commit per almeno due settimane, anche se
+gli avete ordinato di distruggere la branch lo conteneva. La parte
+difficile è trovare il codice hash appropriato. Potete sempre far
+scorrere tutti i codici hash il `.git/objects` e trovare quello che
+cercate per tentativi. C'è però un modo molto più facile.
+
+Git registra ogni codice hash che incontra in `.git/logs`. La
+sottocartella `refs` contiene la storia dell'attività di tutte le
+branch, mentre il file `HEAD` mostra tutti i codici hash che HEAD ha
+assunto. Quest'ultimo può usato per trovare commit di una branch che è
+stata accidentalmente cancellata.
+
+Il comando *reflog* provvede un'interfaccia intuitiva per gestire questi
+file di log. Provate a eseguire:
+
+ $ git reflog
+
+Invece di copiare e incollare codici hash dal reflog, provate:
+
+ $ git checkout "@{10 minutes ago}"
+
+O date un'occhiata al quintultimo commit visitato con:
+
+ $ git checkout "@{5}"
+
+Vedete la sezione ``Specifying Revisions'' di *git help rev-parse* per
+avere più dettagli.
+
+Potreste voler configurare un periodo più lungo per la ritenzione dei
+commit da cancellare. Ad esempio:
+
+ $ git config gc.pruneexpire "30 days"
+
+significa che un commit cancellato sarà perso permanentemente eliminato
+solo 30 giorni più tardi, quando *git gc* sarà eseguito.
+
+Potete anche voler disabilitare l'esecuzione automatica di *git gc*:
+
+ $ git config gc.auto 0
+
+nel qual caso commit verranno solo effettivamente eliminati
+all'esecuzione manuale di *git gc*.
+
+=== Costruire sopra Git ===
+
+In vero stile UNIX, il design di Git ne permette l'utilizzo come
+componente a basso livello di altri programmi, come interfacce grafiche
+e web, interfacce di linea alternative, strumenti di gestione di patch,
+programmi di importazione e conversione, ecc. Infatti, alcuni comandi
+Git sono loro stessi script che fanno affidamento ad altri comandi di
+base. Con un po' di ritocchi potete voi stessi personalizzare Git in
+base alle vostre preferenze.
+
+Un facile trucco consiste nel creare degli alias di comandi Git per
+abbreviare le funzioni che utilizzate di frequente:
+
+ $ git config --global alias.co checkout
+ $ git config --global --get-regexp alias # mostra gli alias correnti
+ alias.co checkout
+ $ git co foo # equivalente a 'git checkout foo'
+
+Un altro trucco consiste nell'integrare il nome della branch corrente
+nella vostra linea di comando o nel titolo della finestra. L'invocazione
+di
+
+ $ git symbolic-ref HEAD
+
+mostra il nome completo della branch corrente. In pratica, vorrete
+probabilmente togliere "refs/heads/" e ignorare gli errori:
+
+ $ git symbolic-ref HEAD 2> /dev/null | cut -b 12-
+
+La sottocartella +contrib+ è uno scrigno di utili strumenti basati su
+Git. Un giorno alcuni di questi potrebbero essere promossi al rango di
+comandi ufficiali. Su Debian e Ubuntu questa cartella si trova in
++/usr/share/doc/git-core/contrib+.
+
+Uno dei più popolari tra questi script si trova in
++workdir/git-new-workdir+. Grazie ad un link simbolico intelligente,
+questo script crea una nuova cartella di lavoro la cui storia è
+condivisa con il deposito originario:
+
+ $ git-new-workdir un/deposito/esistente nuova/cartella
+
+La nuova cartella e i suoi file possono essere visti come dei cloni,
+salvo per il fatto che la storia è condivisa e quindi i rimane
+automaticamente sincronizzata. Non c'è quindi nessun bisogno di fare
+merge, push o pull.
+
+=== Acrobazie audaci ===
+
+Git fa in modo che sia difficile per un utilizzatore distruggere
+accidentalmente dei dati. Ma se sapete cosa state facendo, potete
+escludere le misure di sicurezza dei comandi più comuni.
+
+*Checkout*: 'Checkout' non funziona in caso di Modifiche non integrate
+con commit. Per distruggere i vostri cambiamenti ed effettuare comunque
+un certo checkout, usate la flag 'force':
+
+ $ git checkout -f HEAD^
+
+D'altro canto, se specificate un percorso particolare per il checkout,
+non ci sono controlli di sicurezza. I percorsi forniti sono
+silenziosamente sovrascritti. Siate cauti se utilizzate checkout in
+questa modalità.
+
+*Reset*: Anche 'reset' non funziona in presenza di cambiamenti non
+integrate con commit. Per forzare il comando, eseguite:
+
+ $ git reset --hard 1b6d
+
+*Branch*: Non si possono cancellare branch se questo risulta nella
+perdita di cambiamenti. Per forzare l'eliminazione scrivete:
+
+ $ git branch -D branch_da_cancellare # invece di -d
+
+Similmente, un tentativo di rinominare una branch con il nome di
+un'altra è bloccato se questo risulterebbe nella perdita di dati. Per
+forzare il cambiamento di nome scrivete:
+
+ $ git branch -M origine destinazione # à invece di -m
+
+Contrariamente ai casi di 'checkout' e 'reset', questi ultimi comandi
+non effettuano un'eliminazione immediata dell'informazione. I
+cambiamenti sono salvati nella sottocartella .git, e possono essere
+recuperati tramite il corrispondente codice hash in `.git/logs` (vedete
+"Cacciatore di ``teste''" precedentemente). Per default, sono conservati
+per almeno due settimane.
+
+*Clean*: Alcuni comandi Git si rifiutano di procedere per non rischiare
+di danneggiare file che non sono in gestione. Se siete certi che tutti
+questi file possono essere sacrificati, allora cancellateli senza pietà
+con:
+
+ $ git clean -f -d
+
+In seguito il comando precedentemente eccessivamente prudente
+funzionerà.
+
+=== Prevenire commit erronei ===
+
+Errori stupidi ingombrano i miei depositi. I peggiori sono quelli dovuti
+a file mancanti per via di un *git add* dimenticato. Altri errori meno
+gravi riguardano spazi bianchi dimenticati e conflitti di merge
+irrisolti: nonostante siano inoffensivi, vorrei che non apparissero nel
+registro pubblico.
+
+Se solo mi fossi premunito utilizzando dei controlli preliminari
+automatizzati, i cosiddetti _hook_, che mi avvisino di questi problemi
+comuni!
+
+ $ cd .git/hooks
+ $ cp pre-commit.sample pre-commit # Vecchie versioni di Git : chmod +x pre-commit
+
+Ora Git blocca un commit se si accorge di spazi inutili o se ci sono
+conflitti di merge non risolti.
+
+Per questa guida ho anche aggiunto le seguenti linee all'inizio del mio
+hook *pre-commit* per prevenire le mie distrazioni:
+
+ if git ls-files -o | grep '\.txt$'; then
+ echo FAIL! Untracked .txt files.
+ exit 1
+ fi
+
+Molte operazioni di Git accettano hook; vedete *git help hooks*. Abbiamo
+già utilizzato l'hook *post-update* in precedenza, quando abbiamo
+discusso Git via HTTP. Questo è eseguito ogni volta che l'HEAD cambia.
+Lo script post-update d'esempio aggiorna i file Git necessari per
+comunicare dati via canali come HTTP che sono agnostici di Git.
diff --git a/it/history.txt b/it/history.txt
new file mode 100644
index 00000000..6414ba96
--- /dev/null
+++ b/it/history.txt
@@ -0,0 +1,313 @@
+== Lezioni di storia ==
+
+Una delle conseguenze della natura distribuita di Git è che il corso
+storico può essere modificato facilmente. Ma se alterate il passato fate
+attenzione: riscrivete solo le parti di storia che riguardano solo voi.
+Nello stesso modo in cui nazioni dibattono le responsabilità di
+atrocità, se qualcun altro ha un clone la cui storia differisce dalla
+vostra, avrete problemi a riconciliare le vostre differenze.
+
+Certi sviluppatori insistono che la storia debba essere considerata
+immutabile, inclusi i difetti. Altri pensano invece che le strutture
+storiche debbano essere rese presentabili prima di essere presentate
+pubblicamente. Git è compatibile con entrambi i punti di vista. Come con
+l'uso di clone, branch e merge, riscrivere la storia è semplicemente un
+altra capacità che vi permette Git. Sta a voi farne buon uso.
+
+=== Mi correggo ===
+
+Avete appena fatto un commit, ma ora vi accorgete che avreste voluto
+scrivere un messaggio diverso? Allora eseguite:
+
+ $ git commit --amend
+
+per modificare l'ultimo messaggio. Vi siete accorti di aver dimenticato
+di aggiungere un file? Allora eseguite *git add* per aggiungerlo, e
+eseguite il comando precedente.
+
+Volete aggiungere qualche modifica supplementare nell'ultimo commit?
+Allora fatele e eseguite:
+
+ $ git commit --amend -a
+
+=== ... e ancora di più ===
+
+Supponiamo che il problema precedente è dieci volte peggio. Dopo una
+lunga seduta avete fatto parecchi commit. Ma non siete soddisfatto da
+come sono organizzati, e alcuni messaggi di commit potrebbero essere
+riscritti meglio. Allora digitate:
+
+ $ git rebase -i HEAD~10
+
+e gli ultimi 10 commit appariranno nel vostro $EDITOR di teso
+preferito. Ecco un piccolo estratto come esempio:
+
+ pick 5c6eb73 Added repo.or.cz link
+ pick a311a64 Reordered analogies in "Work How You Want"
+ pick 100834f Added push target to Makefile
+
+I commit più vecchi precedono quelli più recenti in questa lista, a
+differenza del comando `log`. Qua 5c6eb73 è il commit più vecchio e
+100834f è il più recente. In seguito:
+
+- Rimuovete un commit cancellando la sua linea. È simile al comando
+ revert, ma è come se il commit non fosse mai esistito.
+- Cambiate l'ordine dei commit cambiando l'ordine delle linee.
+- Sostituite `pick` con:
+ * `edit` per marcare il commit per essere modificato.
+ * `reword` per modificare il messaggio nel log.
+ * `squash` per fare un merge del commit con quello precedente.
+ * `fixup` per fare un merge di questo commit con quello precedente e rimuovere il messaggio nel log.
+
+Ad esempio, possiamo sostituire il secondo `pick` con `squash`:
+
+ pick 5c6eb73 Added repo.or.cz link
+ squash a311a64 Reordered analogies in "Work How 'ou Want"
+ pick 100834f Added push target to Makefile
+
+Dopo aver salvato ed essere usciti dal file, Git fa un merge di a311a64
+in 5c6eb73. Quindi *squash* fa un merge combinando le versioni nella
+versione precedente.
+
+Git quindi combina i loro messaggi e li presenta per eventuali
+modifiche. Il comando *fixup* salta questo passo; il messaggio log a cui
+viene applicato il comando viene semplicemente scartato.
+
+Se avete marcato un commit con *edit*, Git vi riporta nel passato, al
+commit più vecchio. Potete correggere il vecchio commit come descritto
+nella sezione precedente, e anche creare nuovi commit nella posizione
+corrente. Non appena siete soddisfatto con le rettifiche, ritornate in
+avanti nel tempo eseguendo:
+
+ $ git rebase --continue
+
+Git ripercorre i commit fino al prossimo *edit*, o fino al presente se
+non ne rimane nessuno.
+
+Potete anche abbandonare il vostro tentativo di cambiare la storia con
+'rebase' nel modo seguente:
+
+ $ git rebase --abort
+
+Quindi fate dei commit subito e spesso: potrete mettere tutto in ordine
+più tardi con 'rebse'.
+
+=== E cambiamenti locali per finire ===
+
+State lavorando ad un progetto attivo. Fate alcuni commit locali, e poi vi
+sincronizzate con il deposito ufficiale con un merge. Questo ciclo si
+ripete qualche volta fino a che siete pronti a integrare a vostra volta
+i vostri cambiamenti nel deposito centrale con 'push'.
+
+Ma a questo punto la storia del vostro clone Git locale è un confuso
+garbuglio di modifiche vostre e ufficiali. Preferireste vedere tutti i
+vostri cambiamenti in una sezione contigua, seguita dai cambiamenti
+ufficiali.
+
+Questo è un lavoro per *git rebase* come descritto precedentemente. In
+molti casi potete usare la flag *--onto* per evitare interazioni.
+
+Leggete *git help rebase* per degli esempi dettagliati di questo
+fantastico comando. Potete scindere dei commit. Potete anche
+riarrangiare delle branch di un deposito.
+
+State attenti: rebase è un comando potente. In casi complessi fate prima
+un backup con *git clone*.
+
+=== Riscrivere la storia ===
+
+Occasionalmente c'è bisogno di fare delle modifiche equivalenti a
+cancellare con persone da una foto ufficiale, cancellandole dalla storia
+in stile Stalinista. Per esempio, supponiamo che avete intenzione di
+pubblicare un progetto, ma che questo include un file che per qualche
+ragione volete tenere privato. Diciamo ad esempio che ho scritto il mio
+numero di carta di credito in un file che ho aggiunto per sbaglio al
+progetto. Cancellare il file non è abbastanza, visto che si può ancora
+recuperare accedendo ai vecchi commit. Quello che bisogna fare è
+rimuovere il file da tutti i commit:
+
+ $ git filter-branch --tree-filter 'rm file/segreto' HEAD
+
+Nella documentazione in *git help filter-branch* viene discusso questo
+esempio e dà anche un metodo più rapido. In generale, *filter-branch* vi
+permette di modificare intere sezioni della storia con un singolo
+comando.
+
+In seguito la cartella +.git/refs/original+ conterrà lo stato del vostro
+deposito prima dell'operazione. Verificate che il comando filter-branch
+abbia fatto quello che desiderate, e cancellate questa cartella se
+volete eseguire ulteriori comandi filter-branch.
+
+Infine rimpiazzate i cloni del vostro progetto con la versione
+revisionata se avete intenzione di interagire con loro più tardi.
+
+=== Fare la storia ===
+
+[[makinghistory]]
+Volete far migrare un progetto verso Git? Se è gestito con uno dei
+sistemi più diffusi, è molto probabile che qualcuno abbia già scritto
+uno script per esportare l'intera storia verso Git.
+
+Altrimenti, documentatevi sul comando *git fast-import* che legge un
+file di testo in un formato specifico per creare una storia Git a partire
+dal nulla. Tipicamente uno script che utilizza questo comando è uno
+script usa-e-getta scritto rapidamente e eseguito una volta sola per far
+migrare il progetto.
+
+Come esempio, incollate il testo seguente in un file temporaneo
+chiamato `/tmp/history`:
+----------------------------------
+commit refs/heads/master
+committer Alice Thu, 01 Jan 1970 00:00:00 +0000
+data <
+
+int main() {
+ printf("Hello, world!\n");
+ return 0;
+}
+EOT
+
+
+commit refs/heads/master
+committer Bob Tue, 14 Mar 2000 01:59:26 -0800
+data <
+
+int main() {
+ write(1, "Hello, world!\n", 14);
+ return 0;
+}
+EOT
+----------------------------------
+
+Poi create un deposito Git a partire da questo file temporaneo
+eseguendo:
+
+ $ mkdir project; cd project; git init
+ $ git fast-import --date-format=rfc2822 < /tmp/history
+
+Potete fare il checkout dell'ultima versione di questo progetto con:
+
+ $ git checkout master .
+
+Il comando *git fast-export* può convertire qualsiasi deposito Git nel
+formato *git fast-import*, che vi permette di studiare come funzionano
+gli script di esportazione, e vi permette anche di convertire un
+deposito in un formato facilmente leggibile. Questi comandi permettono
+anche di inviare un deposito attraverso canali che accettano solo
+formato testo.
+
+=== Dov'è che ho sbagliato? ===
+
+Avete appena scoperto un bug in una funzionalità del vostro programma
+che siete sicuri funzionasse qualche mese fa. Argh! Da dove viene questo
+bug? Se solo aveste testato questa funzionalità durante lo sviluppo!
+
+Ma è troppo tardi. D'altra parte, a condizione di aver fatto dei commit
+abbastanza spesso, Git può identificare il problema.
+
+ $ git bisect start
+ $ git bisect bad HEAD
+ $ git bisect good 1b6d
+
+Git estrae uno stato a metà strada di queste due versioni (HEAD e 1b6d).
+Testate la funzionalità e, se ancora non funziona:
+
+ $ git bisect bad
+
+Altrimenti rimpiazzate "bad" con "good". Git vi trasporta a un nuovo
+stato a metà strada tra le versioni "buone" e quelle "cattive",
+riducendo così le possibilità. Dopo qualche iterazione, questa ricerca
+binaria vi condurrà al commit che ha causato problemi. Una volta che la
+vostra ricerca è finita, ritornate allo stato originario digitando:
+
+ $ git bisect reset
+
+Invece di testare ogni cambiamento a mano, automatizzate la ricerca
+scrivendo:
+
+ $ git bisect run my_script
+
+Git usa il valore di ritorno dello script 'my_script' che avete passato
+per decidere se un cambiamento è buono o cattivo: my_script deve
+terminare con il valore 0 quando una versione è ok, 125 quando deve
+essere ignorata, o un valore tra 1 e 127 se ha un bug. Un valore di
+ritorno negativo abbandona il comando bisect.
+
+Ma potete fare molto di più: la pagina di help spiega come visualizzare
+le bisezioni, esaminare o rivedere il log di bisect, e eliminare noti
+cambiamenti innocui per accelerare la ricerca.
+
+=== Chi è che ha sbagliato? ===
+
+Come in molti altri sistemi di controllo di versione, Git ha un comando
+per assegnare una colpa:
+
+ $ git blame bug.c
+
+Questo comando annota ogni linea del file mostrando chi l'ha cambiata
+per ultimo e quando. A differenza di molti altri sistemi di controllo di
+versione, questa operazione è eseguita off-line, leggendo solo da disco
+locale.
+
+=== Esperienza personale ===
+
+In un sistema di controllo di versione centralizzato le modifiche della
+storia sono un'operazione difficile, che è solo disponibile agli
+amministratori. Creare un clone, una branch e fare un merge sono delle
+operazioni impossibili senza una connessione di rete. La stessa cosa
+vale per operazioni di base come ispezionare la storia, o fare il commit
+di un cambiamento. In alcuni sistemi, è necessaria una connessione di
+rete anche solo per vedere le proprie modifiche o per aprire un file con
+diritto di modifica.
+
+Sistemi centralizzati precludono il lavoro off-line, e necessitano
+infrastrutture di rete più ampie all'aumentare del numero di
+sviluppatori. Ancora più importante è il fatto che le operazioni sono a
+volte così lente da scoraggiare l'uso di alcune funzioni avanzate, a
+meno che non siano assolutamente necessarie. In casi estremi questo può
+valere addirittura per comandi di base. Quando gli utenti devono
+eseguire comandi lenti, la produttività viene compromessa per via delle
+continue interruzioni del flusso di lavoro.
+
+Ho sperimentato questi fenomeni personalmente. Git è stato il primo
+sistema di controllo di versione che ho utilizzato. Mi sono velocemente
+abituato al suo uso, dando per scontate molte funzionalità. Assumevo
+semplicemente che altri sistemi fossero simili: scegliere un sistema di
+controllo di versione non mi sembrava diverso da scegliere un editor di
+testo o un navigatore web.
+
+Sono rimasto molto sorpreso quando più tardi sono obbligato ad
+utilizzare un sistema centralizzato. Una connessione internet instabile
+ha poca importanza con Git, ma rende lo sviluppo quasi impossibile
+quando il sistema esige che sia tanto affidabile quanto il disco locale.
+Inoltre, mi sono trovato ad evitare l'uso di alcuni comandi per via
+delle latenze che comportavano, fatto che finalmente mi impediva di
+seguire il metodo di lavoro abituale.
+
+Quando dovevo eseguire un comando lento, le interruzioni influivano
+molto negativamente sulla mia concentrazione. Durante l'attesa della
+fine delle comunicazioni col server, facevo qualcos'altro per passare il
+tempo, come ad esempio controllare le email o scrivere della
+documentazione. Quando ritornavo al lavoro iniziale, il comando aveva
+terminato da tempo e mi ritrovare a dover cercare di ricordare che cosa
+stessi facendo. Gli esseri umani non sono bravi a passare da un contesto
+all'altro.
+
+C'erano anche interessanti effetti di tragedia dei beni comuni:
+prevedendo congestioni di rete, alcuni utenti consumavano più banda di
+rete che necessario per effettuare operazioni il cui scopo era di
+ridurre le loro attese future. Questi sforzi combinati risultavano ad
+aumentare ulteriormente le congestioni, incoraggiando a consumare ancora
+più larghezza di banda per cercare di evitare latenze sempre più lunghe.
diff --git a/it/intro.txt b/it/intro.txt
new file mode 100644
index 00000000..3e3b9519
--- /dev/null
+++ b/it/intro.txt
@@ -0,0 +1,157 @@
+== Introduzione ==
+
+Farò uso di un'analogia per introdurre il controllo di versione. Fate
+riferimento alla http://it.wikipedia.org/wiki/Controllo_versione[pagina
+wikipedia sul controllo di versione] per una spiegazione più sobria.
+
+=== Il lavoro è gioco ===
+
+Ho giocato ai videogiochi quasi tutta la mia vita. Per contro ho
+iniziato ad utilizzare sistemi di controllo di versione solo da adulto.
+Sospetto di non essere il solo, e il paragone tra i due può rendere
+alcuni concetti più facile da spiegare e comprendere.
+
+Pensate alla scrittura di codice o documenti come ad un videogioco.
+Non appena avete fatto progressi sostanziali, è desiderabile salvare il
+vostro lavoro. Per fare ciò cliccate sul pulsante 'Salva' del vostro
+fidato editor.
+
+Ma questo sovrascriverà la versione precedente del documento. È come
+quei vecchi videogiochi in cui si poteva salvare la partita, ma senza
+poter ritornare a uno stato precedente del gioco. Il che era un peccato,
+perché il vostro salvataggio precedente avrebbe potuto trovarsi ad un punto
+particolarmente divertente del gioco che avreste magari voluto
+rivisitare in futuro. O ancora peggio se il vostro salvataggio più
+recente si fosse rivelato essere uno stato da cui è impossibile vincere
+il gioco, obbligandovi a ricominciare la partita da zero.
+
+=== Controllo di versione ===
+
+Quando modificate un documento di cui volete conservare le vecchie
+versioni, potete 'Salvare come...' sotto un nome di file diverso, oppure
+copiare il file in un'altra cartella prima di salvarlo. Potreste anche
+comprimere queste copie del file, se volete risparmiare spazio su
+disco. Questa è una forma primitiva e inefficiente forma di controllo di
+versione. I videogiochi hanno migliorato questo punto molto tempo fa,
+provvedendo in molti casi multiple possibilità di salvataggio
+automaticamente ordinate temporalmente.
+
+Rendiamo il problema un po' più complicato. Immaginate di avere un
+un gruppo di file che vanno insieme, come il codice sorgente di un
+progetto o i file per un sito web. In questo caso se volete conservare
+una vecchia versione dovete archiviare una directory intera. Conservare
+diverse versioni a mano non è scomodo e diventa rapidamente
+impraticabile.
+
+Nel caso di alcuni videogiochi, il salvataggio di una partita consiste
+effettivamente in una directory contenente diversi file. Questi giochi
+nascondono questo dettaglio al giocatore e presentano una comoda
+interfaccia per gestire le diverse versioni di tale cartella.
+
+I sistemi di controllo di versione non sono niente più di questo. Hanno
+tutti una comoda interfaccia per gestire una directory piena di file.
+Potete salvare lo stato della directory di tanto in tanto, e più tardi
+potete caricare ognuno degli stati precedentemente salvati. A differenza
+della maggioranza di videogiochi, conservano in maniere intelligente lo
+spazio. Tipicamente, pochi file alla volta cambiano da una versione
+alla successiva. Si può quindi risparmiare spazio salvando le differenze
+invece di fare nuove copie complete.
+
+=== Controllo distribuito ===
+
+Immaginate ora un videogioco difficilissimo. Così difficile da terminare
+che molti esperti giocatori da tutto il mondo decidono di collaborare e
+condividere le loro partite salvate per cercare di venirne a capo.
+Gli http://it.wikipedia.org/wiki/Speedrun[Speedrun] sono un
+esempio concreto di questa pratica: dei giocatori si specializzano
+ognuno a giocare un livello dello stesso gioco nel miglior modo
+possibile, e collaborano così per ottenere dei risultati incredibili.
+
+Come costruireste un sistema che permetta loro di accedere facilmente ai
+salvataggi degli altri? E che permetta di caricarne di nuovi?
+
+Nel passato ogni progetto usava un sistema di controllo di versione
+centralizzato. Un server centrale unico da qualche parte manteneva tutte le partite
+salvate. Ogni giocatore conservava al massimo qualche salvataggio sul
+proprio computer. Quando un giocatore aveva intenzione di avanzare nel
+gioco, scaricava il salvataggio più recente dal server centrale, giocava
+per un po', salvava e ricaricava sul server i progressi ottenuti così
+che ognuno potesse usufruirne.
+
+Ma che cosa succedeva se un giocatore per qualche ragione voleva
+accedere ad una vecchia partita salvata? Forse perché la versione più
+attuale si trovava in uno stato da cui non era più possibile vincere il
+gioco perché qualcuno aveva dimenticato di raccogliere un oggetto al
+terzo livello, e ora era necessario ritrovare l'ultima partita salvata
+in un momento in cui la partita è ancora completabile. O magari si
+desiderava paragonare due partite salvate precedentemente per vedere
+quanto progresso avesse fatto un giocatore particolare.
+
+Potrebbero esserci molte ragioni per voler recuperare una vecchia
+versione, ma il risultato è sempre lo stesso: era necessario chiederla
+al server centrale. E più partite salvate erano necessarie, più dati era
+necessario trasmettere.
+
+La nuova generazione di sistemi di controllo di versione di cui Git fa
+parte sono detti sistemi distribuiti e possono essere pensati come una
+generalizzazione dei sistemi centralizzati. Quando i giocatori scaricano
+dal server centrale ricevono tutti i giochi salvati, non solo l'ultima.
+È come se fossero un
+http://it.wikipedia.org/wiki/Mirror_(informatica)[mirror] del server
+centrale.
+
+Questa operazione iniziale di clonaggio può essere costosa, soprattutto
+se c'è una lunga storia di salvataggi precedenti. Ma a lungo termine è
+una strategia che ripaga. Un beneficio immediato è che, quando per
+qualche ragione si desidera un salvataggio precedente, non è necessario
+comunicare con il server centrale.
+
+=== Una sciocca superstizione ===
+
+Una credenza popolare vuole che i sistemi distribuiti non siano adatti a
+progetti che richiedono un deposito centrale ufficiale. Niente potrebbe
+essere più lontano dalla verità. Fotografare qualcuno non ne ruba
+l'anima. Similarmente, clonare un deposito principale non ne diminuisce
+l'importanza.
+
+Una buona prima approssimazione è che tutto ciò che può fare un sistema
+di controllo di versione centralizzato può essere fatto meglio da un
+sistema distribuito ben concepito. Le risorse di rete sono semplicemente
+più costose che le risorse locali. Nonostante vedremo più in là che ci
+sono alcuni svantaggi associati agli approcci distribuiti, ci sono meno
+probabilità di fare paragoni sbagliate con questa approssimazione.
+
+Un piccolo progetto potrebbe non necessitare di tutte le funzionalità
+offerte da un tale sistema, ma il fatto di usare un sistema
+difficilmente estensibile per progetti piccoli è come usare il sistema
+di numerazione romano per calcoli con numeri piccoli.
+
+In aggiunta il vostro progetto potrebbe crescere al di là delle vostre
+previsioni iniziali. Usare Git dall'inizio è come avere sempre con se un
+coltellino svizzero, anche se lo utilizzate primariamente per aprire
+delle bottiglie. Quel giorno in cui avrete disperatamente bisogno un
+cacciavite sarete felici di avere più di un semplice apribottiglie.
+
+=== Merge di conflitti ===
+
+Per questo argomento la nostra analogia basata sui videogiochi inizia ad
+essere tirata per i capelli. Ritorniamo quindi invece al caso della
+formattazione di un documento.
+
+Immaginiamo che Alice inserisce una linea di codice all'inizio di un
+file, e Bob ne aggiunge una alla fine della propria copia. Entrambi
+caricano le loro modifiche nel deposito. La maggior parte dei sistemi
+decideranno una linea d'azione ragionevole: accettare e fondere (merge)
+entrambe le modifiche, così che sia le modifiche di Alice e Bob sono
+applicate.
+
+Ma supponiamo ora che Alice e Bob hanno fatto distinte modifiche alla
+stessa linea del documento. È impossibile procedere senza intervento
+umano. La seconda persona a caricare il file viene informata di un
+_conflitto di merge_, e bisogna scegliere una modifica piuttosto che un
+altra, oppure riscrivere interamente la riga.
+
+Situazioni più complesse possono presentarsi. Sistemi di controllo di
+versioni si possono occupare autonomamente dei casi più semplici, et
+lasciano i casi difficili all'intervento umano. Generalmente, questo
+comportamento è configurabile.
diff --git a/it/multiplayer.txt b/it/multiplayer.txt
new file mode 100644
index 00000000..5aa05ed1
--- /dev/null
+++ b/it/multiplayer.txt
@@ -0,0 +1,268 @@
+== Git multi-giocatore ==
+
+Inizialmente usavo Git per progetti privati dove ero l'unico
+sviluppatore. Tra i comandi legati alla natura distribuita di Git, avevo
+bisogno solamente di *pull* e *clone* così da tenere lo stesso progetto
+in posti diversi.
+
+Più tardi ho voluto pubblicare il mio codice tramite Git e includere
+modifiche di diversi contributori. Ho dovuto imparare a gestire progetti
+con multipli sviluppatori da tutto il mondo. Fortunatamente questo è il
+punto forte di Git, e probabilmente addirittura la sua ragion d'essere.
+
+=== Chi sono? ===
+
+Ogni commit ha il nome e l'indirizzo e-mail di un autore, i quali
+sono mostrati dal comando *git log*. Per default Git utilizza i valori
+di sistemamastery per definire questi campi. Per configurarli
+esplicitamente, digitate:
+
+ $ git config --global user.name "John Doe"
+ $ git config --global user.email johndoe@example.com
+
+Omettete l'opzione '--global' per configurare questi valori solo per il
+deposito corrente.
+
+=== Git via SSH e HTTP ===
+
+Supponiamo che avete un accesso SSH a un server web sul quale Git non è
+però installato. Anche se meno efficiente rispetto al suo protocollo
+nativo, Git può comunicare via HTTP.
+
+Scaricate, compilate e installate Git sul vostro conto, e create un
+deposito nella vostra cartella web:
+
+ $ GIT_DIR=proj.git git init
+ $ cd proj.git
+ $ git --bare update-server-info
+ $ cp hooks/post-update.sample hooks/post-update
+
+Con versioni meno recenti di Git il comando di copia non funziona e
+dovete eseguire:
+
+ $ chmod a+x hooks/post-update
+
+Ora potete trasmettere le vostre modifiche via SSH da qualsiasi clone:
+
+ $ git push web.server:/path/to/proj.git master
+
+e chiunque può ottenere il vostro progetto con:
+
+ $ git clone http://web.server/proj.git
+
+=== Git tramite qualsiasi canale ===
+
+Volete sincronizzare dei depositi senza server o addirittura senza
+connessione di rete? Avete bisogno di improvvisare durante un'emergenza?
+abbiamo già visto che<>. Possiamo quindi inviare questo tipo di file avanti e
+indietro per trasportare depositi Git attraverso un qualsiasi canale. Ma
+uno strumento più efficace è il comando *git bundle*.
+
+Il mittente crea un pacchetto, detto 'bundle':
+
+ $ git bundle create qualche_file HEAD
+
+poi trasmette il bundle, +qualche_file+, al destinatario attraverso
+qualsiasi metodo: email, chiave USB, stampa e riconoscimento caratteri,
+lettura di bit via telefono, segnali di funo, ecc. Il destinatario può
+recuperare i commit dal bundle digitando:
+
+ $ git pull qualche_file
+
+Il destinatario può effettuare ciò anche in deposito interamente vuoto.
+Malgrado la sua dimensione, +qualche_file+ contiene l'intero deposito
+Git originario.
+
+Nel caso di progetti grandi, riducete gli sprechi includendo nel bundle
+solo i cambiamenti che mancano nell'altro deposito. Per esempio,
+supponiamo che il commit ``1b6d...'' è il commit più recente che è
+condiviso dai due depositi. Possiamo ora eseguire:
+
+ $ git bundle create qualche_file HEAD ^1b6d
+
+Se fatta di frequente, potremmo facilmente dimenticare quale commit è
+stato mandato per ultimo. La pagina d'aiuto suggerisce di utilizzare
+delle 'tag' per risolvere questo problema. In pratica, appena dopo aver
+inviato il bundle, digitate:
+
+ $ git tag -f ultimo_bundle HEAD
+
+e create un nuovo bundle con:
+
+ $ git bundle create nuovo_bundle HEAD ^ultimo_bundle
+
+=== Le patch: la moneta di scambio globale ===
+
+Le patch sono delle rappresentazioni testuali dei vostri cambiamenti che
+possono essere facilmente comprensibili sia per computer che umani. È
+quello che le rende interessanti. Potete mandare una patch per email ad
+altri sviluppatori indipendentemente dal sistema di controllo di
+versione che utilizzano. A partire dal momento che possono leggere le
+loro email, possono vedere le vostre modifiche. Similarmente, da parte
+vostra non avete bisogno che di un indirizzo email: non c'è neanche
+bisogno di avere un deposito Git online
+
+Ricordatevi dal primo capitolo, il comando:
+
+ $ git diff 1b6d > my.patch
+
+produce una patch che può essere incollata in un'email per discussioni.
+In un deposito Git, eseguite:
+
+ $ git apply < my.patch
+
+per applicare la patch.
+
+In un contesto più formale, quando è il nome e magari la firma
+dell'autore devono essere presenti, generate le patch a partire da un
+certo punto digitando:
+
+ $ git format-patch 1b6d
+
+I file risultanti possono essere passati a *git-send-email*, o inviati
+a mano. Potete anche specificare un intervallo tra due commit:
+
+ $ git format-patch 1b6d..HEAD^^
+
+Dalla parte del destinatario salvate l'email in un file (diciamo
+'email.txt') e poi digitate:
+
+ $ git am < email.txt
+
+Questo applica le patch ricevute e crea inoltre un commit, includendo
+informazioni come il nome dell'autore.
+
+Se utilizzate un client email in un navigatore web potreste dover
+cercare il modo di vedere il messaggio nel suo formato "raw" originario
+prima di salvare la patch come file.
+
+Ci sono delle leggere differenze nel caso di client email che si basano
+sul formato mbox, ma se utilizzate uno di questi, siete probabilmente il
+tipo di persona che riesce a risolverle senza bisogno di leggere questo
+tutorial!
+
+=== Ci dispiace, abbiamo cambiato indirizzo ===
+
+Dopo aver conato un deposito, l'esecuzione di *git push* o *git pull*
+farà automaticamente riferimento all'URL del deposito d'origine. Come fa
+Git? Il segreto risiede nelle opzioni di configurazione create durante
+la clonazione. Diamoci un'occhiata:
+
+ $ git config --list
+
+L'opzione +remote.origin.url+ determina l'URL della sorgente;
+``origin'' è l'alias del deposito d'origina. Come per la convenzione di
+nominare ``master'' la branch principale, possiamo cambiare o cancellare
+questo alias ma non c'è normalmente nessuna ragione per farlo.
+
+Se l'indirizzo del deposito originario cambia, potete modificare il suo
+URL con:
+
+ $ git config remote.origin.url git://new.url/proj.git
+
+L'opzione +branch.master.merge+ specifica la branch di default
+utilizzata dal comando *git pull*. Al momento della clonazione iniziale
+il nome scelto è quello della branch corrente del deposito originario.
+Anche se l'HEAD del deposito d'origine è spostato verso un'altra branch,
+il comando pull continuerà a seguire fedelmente la branch iniziale.
+
+Quest'opzione si applicherà unicamente al deposito usato nel clonazione
+iniziale, cioè quello salvato nell'opzione +branch.master.remote+. Se
+effettuiamo un pull da un altro deposito dobbiamo indicare
+esplicitamente quale branch vogliamo:
+
+ $ git pull git://example.com/other.git master
+
+Questo spiega tra l'altro come mai alcuni dei precedenti esempi di
+'push' e 'pull' non avevano nessun argomento.
+
+=== Branch remote ===
+
+Quando cloniamo un deposito, cloniamo anche tutte le sue branch. Magari
+non ve ne siete accorti perché Git le nascondei: dovete chiedere
+esplicitamente di vederle. Questo impedisce alle branch del deposito
+remoto d'interferire con le vostre branch, e rende l'uso di Git più
+facile per i novizi.
+
+Per ottenere una lista delle branch remote eseguite:
+
+ $ git branch -r
+
+Dovreste ottenere qualcosa come:
+
+ origin/HEAD
+ origin/master
+ origin/experimental
+
+Questi sono le branch e l'HEAD del deposito remoto, e possono essere
+usati in normali comandi Git. Supponiamo per esempio di aver fatto molti
+commit e che ora volete paragonare le differenze con l'ultima versione
+ottenibile con fetch. Potreste cercare nel log il codice SHA1
+appropriato, ma è molto più semplice scrivere:
+
+ $ git diff origin/HEAD
+
+Oppure potete anche vedere che cosa sta succedendo nella branch
+``experimental':'
+
+ $ git log origin/experimental
+
+=== Depositi remoti multipli ===
+
+Supponiamo che due altri sviluppatori stanno lavorando sul vostro
+progetto, e che vogliate tenerli d'occhio entrambi. Possiamo seguire
+più depositi allo stesso tempo con:
+
+ $ git remote add altro git://example.com/un_deposito.git
+ $ git pull altro una_branch
+
+Ora abbiamo fatto un merge con una branch di un secondo deposito e
+possiamo avere facile accesso a tutte le branch di tutti i depositi:
+
+ $ git diff origin/experimental^ altro/una_branch~5
+
+Ma come fare se vogliamo solo paragonare i loro cambiamenti senza
+modificare il nostro lavoro? I altre parole, vogliamo esaminare le loro
+branch senza che le loro modifiche invadano la nostra cartella di
+lavoro. In questo caso, invece di fare un pull, eseguite:
+
+ $ git fetch # Fetch dal deposito d'origine, il default
+ $ git fetch altro # Fetch dal secondo programmatore.
+
+Questo fa un fetch solamente delle storie. Nonostante la cartella di
+lavoro rimane intatta, possiamo riferirci a qualsiasi branch in
+qualsiasi deposito con i comandi Git, perché ora abbiamo una copia
+locale.
+
+Ricordatevi che dietro le quinte, un *pull* è semplicemente un *fetch*
+seguito da un *merge*. Normalmente facciamo un *pull* perché vogliamo
+ottenere un merge delle ultime modifiche dopo aver fatto un fetch. La
+situazione precedente è una notevole eccezione.
+
+Guardate *git help remote* per sapere come eliminare depositi remoti,
+ignorare delle branch, e ancora di più.
+
+=== Le mie preferenze ===
+
+Per i miei progetti mi piace che i contributori preparino depositi dai
+quali posso fare in pull. Alcuni servizi di host Git permettono di
+creare i vostri cloni di un progetto con il click di un bottone.
+
+Dopo aver fatto il fetch di una serie di modifiche, utilizzo i comandi
+Git per navigare e esaminare queste modifiche che, idealmente, saranno ben
+organizzate e descritte. Faccio il merge dei miei cambiamenti, e forse
+qualche modifica in più. Una volta soddisfatto, faccio un push verso il
+deposito principale.
+
+Nonostante non riceva molto spesso dei contributi, credo che questo
+approccio scali bene. In proposito, vi consiglio di guardare
+http://torvalds-family.blogspot.com/2009/06/happiness-is-warm-scm.html[
+questo post di Linus Torvalds].
+
+Restare nel mondo di Git è un po' più pratiche che usare file di
+patch, visto che mi risparmia di doverli convertire in commit Git.
+Inoltre, Git gestisce direttamente dettagli come salvare il nome
+e l'indirizzo email dell'autore, così come la data e l'ora, e chiede
+anche all'autore di descrivere i cambiamenti fatti.
diff --git a/it/preface.txt b/it/preface.txt
new file mode 100644
index 00000000..1f44d526
--- /dev/null
+++ b/it/preface.txt
@@ -0,0 +1,100 @@
+= Git Magic =
+Ben Lynn
+Agosto 2007
+
+== Prefazione ==
+
+http://git.or.cz/[Git] è il coltellino svizzero per il controllo di
+versioni. Uno strumento per la gestione di revisioni affidabile,
+versatile e multifunzionale, ma la cui flessibilità ne rende difficile
+l'apprendimento, e ancora di più la padronanza.
+
+Come osserva Arthur C. Clarke, qualunque tecnologia sufficientemente
+avanzata è indistinguibile dalla magia. Questo è un buon atteggiamento
+con cui approcciare Git: i novizi possono ignorare i suoi meccanismi
+interni e utilizzare Git come fosse una bacchetta magica con cui
+meravigliare gli amici e far infuriare gli avversari.
+
+Invece di dilungarci nei dettagli, vedremo quali istruzioni vanno usate
+per ottenere risultati specifici. In seguito, grazie all'uso ripetuto,
+capiremo il funzionamento di ognuno dei trucchi, e come possono essere
+combinati per sopperire alle nostre necessità.
+
+.Traduzioni
+
+ - link:/\~blynn/gitmagic/intl/zh_cn/[Cinese semplificato]: JunJie, Meng
+ e JiangWei. Conversione in link:/~blynn/gitmagic/intl/zh_tw/[Cinese
+ tradizionale] tramite +cconv -f UTF7-CN -t UTF8-TW+.
+ - link:/~blynn/gitmagic/intl/fr/[Francese]: Alexandre Garel, Paul
+ Gaborit, e Nicolas Deram.
+ - link:/~blynn/gitmagic/intl/de/[Tedesco]: Benjamin Bellee e Armin
+ Stebich; anche scaricabile dal http://gitmagic.lordofbikes.de/[sito
+ web di Armin].
+ - link:/~blynn/gitmagic/intl/it/[Italiano]: Mattia Rigotti
+ - http://www.slideshare.net/slide_user/magia-git[Portoghese]: Leonardo
+ Siqueira Rodrigues
+ [http://www.slideshare.net/slide_user/magia-git-verso-odt[formato ODT]].
+ - link:/~blynn/gitmagic/intl/ru/[Russo]: Tikhon Tarnavsky, Mikhail
+ Dymskov, e altri.
+ - link:/~blynn/gitmagic/intl/es/[Spagnolo]: Rodrigo Toledo e Ariset Llerena Tapia.
+ - link:/~blynn/gitmagic/intl/uk/[Ucraino]: Volodymyr Bodenchuk.
+ - link:/~blynn/gitmagic/intl/vi/[Vietnamita]: Trần Ngọc Quân; anche
+ scaricabile dal http://vnwildman.users.sourceforge.net/gitmagic/[suo
+ sito web].
+ scaricabile dal suo sito
+
+.Altre edizioni
+
+ - link:book.html[Pagina web individuale] : simplice documento
+ HTML, senza CSS ;
+ - link:book.pdf[File PDF]: versione stampabile.
+ - http://packages.debian.org/gitmagic[Pacchetto Debian],
+ http:://packages.ubuntu.com/gitmagic[pacchetto Ubuntu]: ottenete
+ rapidamente una copia locale. Pratico quando
+ http://csdcf.stanford.edu/status/[questo server] non è raggiungibile.
+ - http://www.amazon.com/Git-Magic-Ben-Lynn/dp/1451523343/[Libro vero e
+ proprio [Amazon.com]]: 64 pagine, 15.24cm x 22.86cm, bianco e nero,
+ in inglese. Pratico in caso di mancanza di elettricità.
+
+=== Grazie! ===
+
+Voglio ringraziare le persone che hanno prestato il loro lavoro per
+tradurre queste pagine. Sono grato di poter raggiungere un numero più
+ampio di lettori grazie agli sforzi delle persone appena citate.
+
+Dustin Sallings, Alberto Bertogli, James Cameron, Douglas Livingstone, Michael
+Budde, Richard Albury, Tarmigan, Derek Mahar, Frode Aannevik, Keith Rarick,
+Andy Somerville, Ralf Recker, Øyvind A. Holm, Miklos Vajna, Sébastien Hinderer,
+Thomas Miedema, Joe Malin e Tyler Breisacher hanno contribuito con le
+loro correzioni e miglioramenti.
+
+François Marier mantiene il pacchetto Debian, creato originariamente da
+Daniel Baumarr.
+
+
+Sono anche grato a molti altri per i loro sostegno e incoraggiamenti.
+Sono tentato di menzionarvi qui, ma rischierei di alzare eccessivamente
+le vostre aspettative.
+
+Se per errore ho dimenticato di menzionare qualcuno, fatemelo per favore
+sapere, o mandatemi semplicemente una patch!
+
+=== Licenza ===
+
+Questo manuale è pubblicato sotto la licenza http://www.gnu.org/licenses/gpl-3.0.html[GNU
+General Public License version 3]. Naturalmente il codice sorgente è
+disponibile come deposito Git, e si può ottenere digitando:
+
+ $ git clone git://repo.or.cz/gitmagic.git # Crea la cartella
+ "gitmagic"
+
+oppure da altri server:
+
+ $ git clone git://github.com/blynn/gitmagic.git
+ $ git clone git://gitorious.org/gitmagic/mainline.git
+ $ git clone https://code.google.com/p/gitmagic/
+ $ git clone git://git.assembla.com/gitmagic.git
+ $ git clone git@bitbucket.org:blynn/gitmagic.git
+
+GitHub, Assembla, e Bitbucket supportano deposito privati, gli ultimi
+due sono gratuiti.
diff --git a/it/secrets.txt b/it/secrets.txt
new file mode 100644
index 00000000..51622db9
--- /dev/null
+++ b/it/secrets.txt
@@ -0,0 +1,297 @@
+== Segreti rivelati ==
+
+Diamo ora un'occhiata sotto il cofano e cerchiamo di capire come Git
+realizza i suoi miracoli. Per una descrizione approfondita fate
+riferimento al
+http://www.kernel.org/pub/software/scm/git/docs/user-manual.html[manuale
+utente].
+
+=== Invisibilità ===
+
+Come fa Git ad essere così discreto? A parte qualche commit o merge
+occasionale, potreste lavorare come se il controllo di versione non
+esistesse. Vale a dire fino a che non è necessario, nel qual caso sarete
+felici che Git stava tenendo tutto sotto controllo per tutto il tempo.
+
+Altri sistemi di controllo di versione vi forzano costantemente a
+confrontarvi con scartoffie e burocrazia. File possono essere solo
+acceduti in lettura, a meno che non dite esplicitamente al server
+centrale quali file intendete modificare. I comandi di base soffrono
+progressivamente di problemi di performance all'aumentare del numero
+utenti. Il lavoro si arresta quando la rete o il server centrale hanno
+problemi.
+
+In contrasto, Git conserva tutta la storia del vostro progetto nella
+sottocartella `.git` della vostra cartella di lavoro. Questa è la vostra
+copia personale della storia e potete quindi rimanere offline fino a che
+non volete comunicare con altri. Avete controllo totale sul fato dei
+vostri file perché Git può ricrearli ad ogni momento a partire da uno
+stato salvato in `.git`.
+
+=== Integrità ===
+
+La maggior parte della gente associa la crittografia con la
+conservazione di informazioni segrete ma un altro dei suoi importanti
+scopi è di conservare l'integrità di queste informazioni. Un uso
+appropriato di funzioni hash crittografiche può prevenire la corruzione
+accidentale e dolosa di dati.
+
+Un codice hash SHA1 può essere visto come un codice unico di
+identificazione di 160 bit per ogni stringa di byte concepibile.
+
+Visto che un codice SHA1 è lui stesso una stringa di byte, possiamo
+calcolare un codice hash di stringe di byte che contengono altri codici
+hash. Questa semplice osservazione è sorprendentemente utile: cercate ad
+esempio 'hash chains'. Più tardi vedremo come Git usa questa tecnica per
+garantire efficientemente l'integrità di dati.
+
+Brevemente, Git conserva i vostri dati nella sottocartella
+`.git/objects`, ma invece di normali nomi di file vi troverete solo dei
+codici. Utilizzando questi codici come nomi dei file, e grazie a qualche
+trucco basato sull'uso di 'lockfile' e 'timestamping', Git trasforma un
+semplice sistema di file in un database efficiente e robusto.
+
+=== Intelligenza ===
+
+Come fa Git a sapere che avete rinominato un file anche se non
+gliel'avete mai detto esplicitamente? È vero, magari avete usato *git
+mv*, ma questo è esattamente la stessa cosa che usare *git rm* seguito
+da *git add*.
+
+Git possiede dei metodi euristici stanare cambiamenti di nomi e copie
+tra versioni successive. Infatti, può addirittura identificare lo
+spostamento di parti di codice da un file ad un altro! Pur non potendo
+coprire tutti i casi, questo funziona molto bene e sta sempre
+costantemente migliorando. Se non dovesse funzionare per voi, provate
+le opzioni che attivano metodi di rilevamento di copie più impegnative,
+e considerate l'eventualità di fare un aggiornamento
+
+=== Indicizzazione ===
+
+Per ogni file in gestione, Git memorizza delle informazioni, come la sua
+taglia su disco, e le date di creazione e ultima modifica, un file detto
+'indice'. Per determinare su un file è stato cambiato, Git paragona il
+suo stato corrente con quello che è memorizzato nell'indice. Se le due
+fonti di informazione corrispondono Git non ha bisogno di rileggere il
+file.
+
+Visto che l'accesso all'indice è considerabilmente più che leggere file,
+se modificate solo qualche file, Git può aggiornare il suo stato quasi
+immediatamente.
+
+Prima abbiamo detto che l'indice si trova nell'area di staging. Com'è
+possibile che un semplice file contenente dati su altri file si trova
+nell'area di staging? Perché il comando 'add' aggiunge file nel database
+di Git e aggiorna queste informazioni, mentre il comando 'commit' senza
+opzioni crea un commit basato unicamente sull'indice e i file già
+inclusi nel database.
+
+=== Le origini di Git ===
+
+Questo http://lkml.org/lkml/2005/4/6/121[messaggio della mailing list
+del kernel di Linux] descrive la catena di eventi che hanno portato alla
+creazione di Git. L'intera discussione è un affascinante sito
+archeologico per gli storici di Git.
+
+=== Il database di oggetti ===
+
+Ognuna delle versioni dei vostri dati è conservata nel cosiddetto
+'database di oggetti' che si trova nella sottocartella `.git/objects`;
+il resto del contenuto di `.git/` rappresenta meno dati: l'indice, il
+nome delle branch, le tags, le opzioni di configurazione, i logs, la
+posizione attuale del commit HEAD, e così via. Il database di oggetti è
+semplice ma elegante, e è la fonte della potenza di Git.
+
+Ogni file in `.git/objects` è un 'oggetto'. Ci sono tre tipi di oggetti
+che ci riguardano: oggetti 'blob', oggetti 'albero' (o `tree`) e gli
+oggetti 'commit'.
+
+=== Oggetti 'blob' ===
+
+Prima di tutto un po' di magia. Scegliete un nome di file qualsiasi. In
+una cartella vuota eseguite:
+
+ $ echo sweet > VOSTRO_FILE
+ $ git init
+ $ git add .
+ $ find .git/objects -type f
+
+Vedrete +.git/objects/aa/823728ea7d592acc69b36875a482cdf3fd5c8d+.
+
+Come posso saperlo senza sapere il nome del file? Perché il codice hash
+SHA1 di:
+
+ "blob" SP "6" NUL "sweet" LF
+
+è aa823728ea7d592acc69b36875a482cdf3fd5c8d, dove SP è uno spazio, NUL è
+un carattere di zero byte e LF un passaggio a nuova linea. Potete
+verificare tutto ciò digitando:
+
+ $ printf "blob 6\000sweet\n" | sha1sum
+
+Git utilizza un sistema di classificazione per contenuti: i file non
+sono archiviati secondo il loro nome, ma secondo il codice hash del loro
+contenuto, in un file che chiamiamo un oggetto 'blob'. Possiamo vedere
+il codice hash come identificativo unico del contenuto del file. Quindi,
+in un certo senso, ci stiamo riferendo ai file rispetto al loro
+contenuto. L'iniziale `blob 6` è semplicemente un'intestazione che
+indica il tipo di oggetto e la sua lunghezza in bytes; serve a
+semplificare la gestione interna.
+
+Ecco come ho potuto predire il contenuto di .git. Il nome del file non
+conta: solo il suo contenuto è usato per costruire l'oggetto blob.
+
+Magari vi state chiedendo che cosa succede nel caso di file identici.
+Provate ad aggiungere copie del vostro file, con qualsiasi nome. Il
+contenuto di +.git/objects+ rimane lo stesso a prescindere del numero di
+copie aggiunte. Git salva i dati solo una volta.
+
+A proposito, i file in +.git/objects+ sono copressi con zlib e
+conseguentemente non potete visualizzarne direttamente il contenuto.
+Passatele attraverso il filtro http://www.zlib.net/zpipe.c[zpipe -d], o
+eseguite:
+
+ $ git cat-file -p aa823728ea7d592acc69b36875a482cdf3fd5c8d
+
+che visualizza appropriatamente l'oggetto scelto.
+
+=== Oggetti 'tree' ===
+
+Ma dove vanno a finire i nomi dei file? Devono essere salvati da qualche
+parte. Git si occupa dei nomi dei file in fase di commit:
+
+ $ git commit # Scrivete un messaggio
+ $ find .git/objects -type f
+
+Adesso dovreste avere tre oggetti. Ora non sono più in grado di predire
+il nome dei due nuovi file, perché dipenderà in parte dal nome che avete
+scelto. Procederemo assumendo che avete scelto ``rose''. Se questo non
+fosse il caso potete sempre riscrivere la storia per far sembrare che lo
+sia:
+
+ $ git filter-branch --tree-filter 'mv NOME_DEL_VOSTRO_FILE rose'
+ $ find .git/objects -type f
+
+Adesso dovreste vedere il file
++.git/objects/05/b217bb859794d08bb9e4f7f04cbda4b207fbe9+
+perché questo è il codice hash SHA1 del contenuto seguente:
+
+ "tree" SP "32" NUL "100644 rose" NUL 0xaa823728ea7d592acc69b36875a482cdf3fd5c8d
+
+Verificate che questo file contenga il contenuto precedente digitando:
+
+ $ echo 05b217bb859794d08bb9e4f7f04cbda4b207fbe9 | git cat-file --batch
+
+È più facile verificare il codice hash con zpipe:
+
+ $ zpipe -d < .git/objects/05/b217bb859794d08bb9e4f7f04cbda4b207fbe9 | sha1sum
+
+Verificare l'hash è più complicato con il comando cat-file perché il suo
+output contiene elementi ulteriori oltre al file decompresso.
+
+Questo file è un oggetto 'tree': una lista di elementi consistenti in un
+tipo di file, un nome di file, e un hash. Nel nostro esempio il tipo di
+file è 100644, che indica che `rose` è un file normale e il codice hash
+e il codice hash è quello di un oggetto di tipo 'blob' che contiene il
+contenuto di `rose`. Altri possibili tipi di file sono eseguibili, link
+simbolici e cartelle. Nell'ultimo caso il codice hash si riferisce ad un
+oggetto 'tree'.
+
+Se avete eseguito filter-branch avrete dei vecchi oggetti di cui non
+avete più bisogno. Anche se saranno cancellati automaticamente dopo il
+periodo di ritenzione automatica, ora li cancelleremo per rendere il
+nostro esempio più facile da seguire
+
+ $ rm -r .git/refs/original
+ $ git reflog expire --expire=now --all
+ $ git prune
+
+Nel caso di un vero progetto dovreste tipicamente evitare comandi del
+genere, visto che distruggono dei backup. Se volete un deposito più
+ordinato, è normalmente consigliabile creare un nuovo clone. Fate
+inoltre attenzione a manipolare direttamente il contenuto di +.git+: che
+cosa succederebbe se un comando Git è in esecuzione allo stesso tempo, o
+se se ci fosse un improvviso calo di corrente? In generale i refs
+dovrebbero essere cancellati con *git update-ref -d*, anche se spesso
+sembrerebbe sicuro cancella re +refs/original+ a mano.
+
+=== Oggetti 'commit' ===
+
+Abbiamo spiegato 2 dei 3 tipi di oggetto. Il terzo è l'oggetto
+'commit'. Il suo contenuto dipende dal messaggio di commit, come anche
+dalla data e l'ora in cui è stato creato. Perché far in maniera di
+ottenere la stessa cosa dobbiamo fare qualche ritocco:
+
+ $ git commit --amend -m Shakespeare # Cambiamento del messaggio di commit
+ $ git filter-branch --env-filter 'export
+ GIT_AUTHOR_DATE="Fri 13 Feb 2009 15:31:30 -0800"
+ GIT_AUTHOR_NAME="Alice"
+ GIT_AUTHOR_EMAIL="alice@example.com"
+ GIT_COMMITTER_DATE="Fri, 13 Feb 2009 15:31:30 -0800"
+ GIT_COMMITTER_NAME="Bob"
+ GIT_COMMITTER_EMAIL="bob@example.com"' # Ritocco della data di creazione e degli autori
+ $ find .git/objects -type f
+
+Dovreste ora vedere il file +.git/objects/49/993fe130c4b3bf24857a15d7969c396b7bc187+
+che è il codice hash SHA1 del suo contenuto:
+
+ "commit 158" NUL
+ "tree 05b217bb859794d08bb9e4f7f04cbda4b207fbe9" LF
+ "author Alice 1234567890 -0800" LF
+ "committer Bob 1234567890 -0800" LF
+ LF
+ "Shakespeare" LF
+
+Come prima potete utilizzare zpipe o cat-file per verificare voi stessi.
+
+Questo è il primo commi, non ci sono quindi commit genitori. Ma i commit
+seguenti conterranno sempre almeno una linea che identifica un commit
+genitore.
+
+=== Indistinguibile dalla magia ===
+
+I segreti di Git sembrano troppo semplici. Sembra che basterebbe
+mescolare assieme qualche script shell e aggiungere un pizzico di codice
+C per preparare un sistema del genere in qualche ora: una combinazione
+di operazioni di filesystem di base e hashing SHA1, guarnito con
+lockfile e file di sincronizzazione per avere un po' di robustezza.
+Infatti questaè un descrizione accurata le prime versioni di Git.
+Malgrado ciò, a parte qualche astuta tecnica di compressione per
+risparmiare spazio e di indicizzazione per risparmiare tempo, ora
+sappiamo come Git cambia abilmente un sistema di file in un perfetto
+database per il controllo di versione.
+
+Ad esempio, se un file nel database degli oggetti è corrotto da un errore
+sul disco i codici hash non corrisponderanno più e verremo informati del
+problema. Calcolando il codice hash del codice hash di altri oggetti è
+possibile garantire integrità a tutti i livelli. I commit sono atomici,
+nel senso che un commit non può memorizzare modifiche parziali: possiamo
+calcolare il codice hash di un commit e salvarlo in un database dopo
+aver creato i relativi oggetti 'tree', 'blob' e 'commit'. Il database
+degli oggetti è immune da interruzioni inaspettate dovute ad esempio a
+cali di corrente.
+
+Possiamo anche far fronte ai tentativi di attacco più maliziosi.
+Supponiamo ad esempio che un avversario tenti di modificare di nascosto il
+contenuto di un file in una vecchia versione di un progetto. Per rendere
+il database degli oggetti coerente, il nostro avversario deve anche
+modificare il codice hash dei corrispondenti oggetti blob, visto che ora
+sarà una stringa di byte diversa. Questo significa che dovrà cambiare il
+codice hash di tutti gli oggetti tree che fanno riferimento al file, e
+di conseguenza cambiare l'hash di tutti gli oggetti commit in ognuno di
+questi tree, oltre ai codici hash di tutti i discendenti di questi
+commit. Questo implica che il codice hash dell'HEAD ufficiale differirà
+da quello del deposito corrotto. Seguendo la traccia di codici hash
+erronei possiamo localizzare con precisione il file corrotto, come anche
+il primo commit ad averlo introdotto.
+
+In conclusione, purché i 20 byte che rappresentano l'ultimo commit sono
+al sicuro, è impossibile manomettere il deposito Git.
+
+Che dire delle famose funzionalità di Git? Della creazione di branch?
+Dei merge? Delle tag? Semplici dettagli. L'HEAD corrente è conservata
+nel file +.git/HEAD+ che contiene un codice hash di un oggetto commit.
+Il codice hash viene aggiornato durante un commit e l'esecuzione di
+molti altri comandi. Le branch funzionano in maniera molto simile: sono
+file in +.git/refs/heads+. La stessa cosa vale per le tag, salvate in
++.git/refs/tags+ ma sono aggiornate da un insieme diverso di comandi.
diff --git a/it/translate.txt b/it/translate.txt
new file mode 100644
index 00000000..bae9ae1e
--- /dev/null
+++ b/it/translate.txt
@@ -0,0 +1,38 @@
+== Appendice B: Tradurre questo manuale ==
+
+La mia raccomandazione è di rispettare la seguente procedura per la
+traduzione di questo manuale, in maniera da poter rapidamente generare
+le versioni HTML e PDF del documento con gli script forniti, e così che
+tutte le traduzioni siano incorporate nello stesso deposito.
+
+Fate un clone della sorgente, poi create una directory il cui nome
+corrisponda http://www.iana.org/assignments/language-subtag-registry[al
+codice IETF della lingua desiderata] : vedere
+http://www.w3.org/International/articles/language-tags/Overview.en.php[l'articolo
+del W3C concernente internazionalizzazione]. Per esempio la versione in
+inglese è nella directory "en", quella in giapponese è in "ja". Nella
+nuova directory traducete i file +txt+ della directory originari "en".
+
+Per esempio, per creare questa guida in
+http://it.wikipedia.org/wiki/Lingua_klingon[Klingon], eseguite:
+
+ $ git clone git://repo.or.cz/gitmagic.git
+ $ cd gitmagic
+ $ mkdir tlh # "tlh" è il codice IETF della lingua Klingon.
+ $ cd tlh
+ $ cp ../en/intro.txt .
+ $ edit intro.txt # Tradurre il file.
+
+e così di seguito per tutti i file.
+
+Modificate il Makefile aggiungendo il codice della lingua alla
+variabile `TRANSLATIONS`. In questo modo potete rivedere il vostro
+lavoro in modo incrementale:
+
+ $ make tlh
+ $ firefox book-tlh/index.html
+
+Fate spesso dei commit per le vostre modifiche e avvertitemi non appena
+sono state implementate. Github possiede un'interfaccia che facilita il
+lavoro collaborativo: fate un fork del progetto "gitmagic", fate un
+push delle vostre modifiche, e chiedetemi di incorporarle.
diff --git a/ko/basic.txt b/ko/basic.txt
new file mode 100644
index 00000000..47025f65
--- /dev/null
+++ b/ko/basic.txt
@@ -0,0 +1,208 @@
+==기본적인 요령==
+
+Git의 수많은 명령어 속으로 곧바로 다이빙 하는 것 보단, 다음 간단한 예시들을 통해서
+천천히 배우는 방법이 좋을 것 같습니다. 제가 소개하는 예시들은, 표면적으로는 간단하게 보이지만, 앞으로 여러방면으로 많은 도움이 될 것입니다.
+저 역시도 처음 Git을 사용할 때에는 아래에 있는 예시 외에는 건들여 보지도 않았습니다.
+
+=== 상태 (state) 저장하는 방법===
+
+파일에 무엇인가 큰 변화를 주고 싶으시다고요? 그러시기 전에, 현 디렉토리에 들어있는
+모든 파일의 스냅샷을 찍어봅시다:
+
+ $ git init
+ $ git add .
+ $ git commit -m "My first backup"
+
+위 명령어들을 입력 후, 만약에 편집을 하다가 잘못됬다면, 편집되기 전의 깨끗한 버전으로 되돌리면 됩니다:
+
+ $ git reset --hard
+
+또 어떤 작업 후 state를 저장하고 싶다면:
+
+ $ git commit -a -m "Another backup"
+
+=== 파일 더하기 (add), 지우기 (delete), 이름 바꾸기 (rename) ===
+
+위의 간단한 요령들은 처음 *git add* 명령어를 실행했을 때 이미 존재하던 파일들만 저장하게 됩니다. 존재하던 파일의 편집 이외의 새로운 파일들이나 하위 디렉토리들을 추가했다면, Git에게 알려줘야 합니다:
+
+ $ git add readme.txt Documentation
+
+그리고 만약에 원하지 않는 파일을 Git에서 없애려면 그것 역시 Git에게 알려줘야 합니다:
+
+ $ git rm kludge.h obsolete.c
+ $ git rm -r incriminating/evidence/
+
+이렇게 함으로써 Git은 지정한 파일들을 지워주게 됩니다.
+
+Git 파일이름을 바꿀때에는 원치않는 일반파일들의 이름을 지우고 새로운 이름을 새롭게 지정하는 간단한 절차와 같습니다. 좀 더 손쉬운 방법으로는 *git mv* 명령어가 있습니다. 예를 들어:
+
+ $ git mv bug.c feature.c
+
+=== 고급 undo와 redo ===
+
+가끔씩은 작업을 하다가 하던 일을 멈추고 전 버전으로 돌아가고 싶다거나, 어느 시점 이후의 모든 편집을 지우고 싶을 때가 있을 것입니다. 그렇다면:
+
+ $ git log
+
+이 명령어는 최근의 commit들을 정리한 리스트와 그의 SHA1 hashes를 보여줍니다:
+
+----------------------------------
+commit 766f9881690d240ba334153047649b8b8f11c664
+Author: Bob
+Date: Tue Mar 14 01:59:26 2000 -0800
+
+ Replace printf() with write().
+
+commit 82f5ea346a2e651544956a8653c0f58dc151275c
+Author: Alice
+Date: Thu Jan 1 00:00:00 1970 +0000
+
+ Initial commit.
+----------------------------------
+
+Hash 앞의 알파벳 몇 개만으로도 commit을 세분화 설정하실 수 있습니다;
+다른 방법으로는, 아래의 명령어와 같이 hash 전문을 복사/붙여넣기 하는 방법도 있지요:
+
+ $ git reset --hard 766f
+
+위 명령어를 입력하시면 설정된 commit으로 돌아갈 수 있으며 그 후의 새로운 commit들은 영구적으로 삭제됩니다.
+
+가끔씩은 또 아주 예전의 state로 잠시만 돌아가길 원하실 수 있습니다. 그럴 경우에는:
+
+ $ git checkout 82f5
+
+이 명령어는 82f5 이후의 commit들을 보존함과 동시에 과거의 시간으로 잠시 돌아가게 해줍니다. 그러나, SF영화에서 처럼, 과거에 돌아간 상태에서 편집을하고 commit을 한다면 또 다른 시간대의 현실을 만들어가게 되는 것이죠. 왜냐하면 당신의 편집이 과거의 편집과는 다르게 입력이 되었기 때문입니다.
+
+이렇게 새롭게 만들어진 대체현실을 'branch (나뭇가지)'라고 부릅니다 <>. 지금 알고계셔야 할 것은
+
+ $ git checkout master
+
+이 명령어는 과거에서 현재의 state로 돌아오게 해줄 것입니다. 그리고 Git이 유저에게 푸념을 놓기전에 과거에서 편집했던 사항들이 있다면
+master branch로 돌아오기전 commit을 하거나 reset을 한번 실행하시길 바랍니다.
+
+게임과 또 다시 비교해본다 하면:
+
+- *`git reset --hard`*: 예전에 세이브 해뒀던 게임으로 돌아가며, 돌아간 시점 이후의 세이브들을 모두 삭제합니다.
+
+- *`git checkout`*: 예전에 세이브 해뒀던 게임으로 돌아가며, 돌아간 시점 이후의 게임들은 처음 세이브와 다른 길을 가게 됩니다. 추후의 모든 세이브들은 다른 branch로써 새로운 현실세계를 만들게 됩니다 <>.
+
+예전의 파일/하위 디렉토리들을 되돌리고 싶을 때 다음 명령어를 이용함으로써 필요한 파일/하위 디렉토리만을 되돌릴 수 있습니다:
+
+ $ git checkout 82f5 some.file another.file
+
+그러나 이 *checkout* 명령어가 다른 파일들을 조용히 덮어씌우기 할 수 있다는 점을 알아두세요! 이러한 사고를 방지하고 싶다면
+checkout 명령어를 쓰기전에 commit을 이용하세요. Git을 처음 이용하는 분들은 특히 더 조심하시기 바랍니다.
+대체적으로 파일이 삭제될까 두려우시다면 *git commit -a*를 우선해놓고 생각하세요.
+
+긴 hash 전체를 복붙하기 싫으시다고요? 그렇다면:
+
+ $ git checkout :/"My first b"
+
+이 명령어를 사용함으로써 이 commit message를 사용해서 commit했었던 state로 돌아갈 수 있습니다.
+그리고 이 다음 명령어로 5번 스텝 전의 state로 돌아갈 수도 있습니다:
+
+ $ git checkout master~5
+
+=== 되돌리기 (Reverting) ===
+
+법정에서는 어떠한 일에 관해서는 기록에서 지울 수 있습니다. 이런 식으로, Git에서는 원하는 commit을 정해서 없던 일로 할 수 있습니다.
+
+ $ git commit -a
+ $ git revert 1b6d
+
+이렇게 하는 것으로 특정 hash에 대한 commit을 undo 할 수 있습니다. 이렇게 되돌린 state는 새로운
+commit으로 인식되어 *git log*에 기록됩니다.
+
+=== 변경기록 만들기 ===
+
+어떤 프로젝트들은 http://en.wikipedia.org/wiki/Changelog[changelog]. 필요로 합니다.
+다음 명령어를 이용해 변경기록을 만들어 봅시다.:
+
+ $ git log > ChangeLog
+
+=== 파일 다운로드하기 ===
+
+Git으로 관리되는 프로젝트 사본을 얻기위해서는:
+
+ $ git clone git://server/path/to/files
+
+예를 들어, 본 웹사이트를 만들기 위해 사용한 파일들을 얻기위해서는:
+
+ $ git clone git://git.or.cz/gitmagic.git
+
+곧 *clone* 명령어에 관해 많은 것을 소개하도록 하겠습니다.
+
+=== 최첨단 기술 ===
+
+*git clone* 명령어를 이용해 어떤 프로젝트의 사본을 다운로드 해뒀다면, 다음 명령어를 이용해 그 프로젝트의 최신버전으로 업데이트 할 수 있습니다:
+
+ $ git pull
+
+=== 즉석 발행 ===
+
+당신이 다른 사람들과 공유하고 싶은 스크립트를 작성했다고 가정합니다. 당신은 그들에게 당신의 컴퓨터에서 다운로드를 받으라고 할 수있지만, 당신 친구들이 만약 당신이 해당 스크립트를 편집하는 도중에 받게된다면, 그들은 예상치 못한 트러블에 걸릴 수 있습니다. 이러한 이유 때문에 릴리스 사이클이란 것이 존재하는 것입니다. 개발자들은 개발 중인 프로젝트 디렉토리에 자주 들락날락 거릴 것이고, 그들은 그들이 한 작업이 다른 사람들 앞에 내놓을 만한 상태로 만들어지기 전까지 남들에게 보여주지 않을겁니다.
+
+Git으로 릴리스 사이클을 맞추려면, 당신의 스크립트가 들어있는 디렉토리에서:
+
+ $ git init
+ $ git add .
+ $ git commit -m "First release"
+
+그리고 당신들 친구들에게 다음 명령어를 사용하도록 하십시오:
+
+ $ git clone your.computer:/path/to/script
+
+그들이 이렇게하면 당신의 스크립트를 다운로드 할 수 있을 것입니다. 이 작업은 다른 유저들이 ssh 접근을 할수있다고 가정합니다. 그렇지 않다면, 소유주인 당신이 *git daemon* 명령어를 쓴 후 친구들에게 다음 명령어를 쓰라고 하십시오:
+
+ $ git clone git://your.computer/path/to/script
+
+이렇게 하고 난 다음부터 당신의 스크립트가 준비되었을 때마다 다음 명령어를 실행하면 됩니다:
+
+ $ git commit -a -m "Next release"
+
+당신의 친구들은 다음 명령어를 사용함으로써 가장 최근 버전으로 당신의 스크립트를 보유하고 있을 수 있게 되죠:
+
+ $ git pull
+
+그들은 절대로 당신이 보여주고 싶지않은 버전의 스크립트를 보는 일이 없을 것입니다.
+
+=== 제가 도대체 뭘 한거죠? ===
+
+마지막으로 한 commit으로 부터 어떤 변화가 있었는지 확인하기 위해서는:
+
+ $ git diff
+
+어제부터 어떤 변화가 있었는지 확인하기 위해서는:
+
+ $ git diff "@{yesterday}"
+
+어떤 특정 버전에서 부터 2번째 전 버전 사이의 변화를 확인하기 위해서는:
+
+ $ git diff 1b6d "master~2"
+
+각각의 결과는 *git apply*와 함께 적용할 수 있는 패치가 될 것입니다.
+다음 명령어도 사용해 보세요:
+
+ $ git whatchanged --since="2 weeks ago"
+
+저는 윗 방법대신 http://sourceforge.net/projects/qgit[qgit] 를 따로 다운받아서 commit 히스토리를 체크하곤 합니다. 이 프로그램은 깨끗한 그래픽 인터페이스로 구성되어 있어보기 쉽지요. 아니면, http://jonas.nitro.dk/tig/[tig], 텍스트형식 인터페이스 역시 느린 인터넷속도를 가지고 있는 분들에겐 도움이 될 것입니다. 또 다른 방법으로는 웹 서버를 설치한 후 *git instaweb*명령어를 사용하는 방법도 있겠지요.
+
+=== 연습 ===
+
+우선 A, B, C, D 를 각각 연속된 한 파일에 대한 commit이라고 가정합니다. 그리고 B는 A 에서 몇 개의 파일들이 삭제된 버전으로 가정합니다. 문제는 여기서 그 삭제된 파일들을 D에 더하고 싶을 때 어떻게 하는 것 인가 입니다.
+
+적어도 세가지의 방법이 있습니다. 우선 우리가 현재 D에 있다고 생각합시다:
+
+ 1. A와 B의 차이점은 몇 개의 지워진 파일들 뿐입니다. 우리는 이 차이점을 패치로 따로 작성하여 본래의 디렉토리에 적용할 수 있습니다:
+
+ $ git diff B A | git apply
+
+ 2. 우리는 A에 파일을 저장해 두었기에, 그 곳에서 다시 받아올 수 있겠지요:
+
+ $ git checkout A foo.c bar.h
+
+ 3. 또는 A에서 B까지로 갈 때의 변화를 undo한다고 생각하셔도 됩니다:
+
+ $ git revert B
+
+어떤 방법이 가장 좋은 해답일까요? 답은 본인이 원하는 것이 곧 해답입니다. Git을 이용한다면 당신이 원하는 것은 쉽게 해낼 수 있고, 그 것을 해내는 방법은 한가지만 있는 것이 아닐겁니다.
diff --git a/ko/branch.txt b/ko/branch.txt
new file mode 100644
index 00000000..0eb5a0e7
--- /dev/null
+++ b/ko/branch.txt
@@ -0,0 +1,239 @@
+== 브랜칭 마법 ==
+
+Git의 끝내주는 기능들 중에는 즉석으로 브랜칭 (brancing) 및 병합 (merging)이 가능하다는 것입니다.
+
+*예시*: 외부적인 요소들은 가끔 불가피하게 당신이 하던 일을 그만두게 합니다. 예를 들어, 치명적인 버그가 경고없이 퍼져나가게 생겼습니다. 프로그램에 새로 넣어야 할 기능이 있는데 데드라인은 가까워져 옵니다. 당신이 도움을 요청하고자 했던 개발자는 퇴사할려고 하니 도움을 요청할 수도 없고요. 시간이 촉박한 만큼 하던 일을 멈추고 버그를 고치는 데에 올인을 해야겠지요.
+
+위의 예시와 같이 하던 일을 갑자기 멈추는 것은 일의 생산성을 치명적으로 떨어트립니다. 특히나 지금까지 하던 일과 정 상관없는 부분의 프로그램을 건들어야 할 때 말이죠. 이럴 때, 중앙관리식 VCS를 사용하는 경우엔 버그없는 버전의 프로그램을 새로 다시받아야 할껍니다. 분산관리식 VCS일 경우에는 원하는 버전만 로컬 컴퓨터로 받아내면 되죠.
+
+하지만 클로닝은 작업 중인 디렉토리 포함 그 디렉토리의 히스토리를 어느 선까지는 같이 다운로드 받게 합니다. Git은 최대한 효율성있게 시스템이 디자인되어 있긴하지만, 클로닝 명령어를 쓴다면 프로젝트 파일들이 (비효율적으로) 현재 작업 중인 디렉토리에 전부 다시 생성될 것입니다.
+
+*해답*: Git은 이런 상황에서 좀 더 빠르고 공간적으로 효율성있게 클로닝을 할 수 있는 명령어를 가지고 있습니다: *git branch*
+
+이런 환상적인 명령어를 이용하여 디렉토리에 있는 파일들은 탈바꿈을 감행해 이 버전과 저 버전을 넘나들 수 있습니다. 이 변형기법은 버전 사이를 넘나드는 것 외에도 더 많은 것을 할 수 있습니다. 당신의 프로젝트는 브랜칭을 통해 구버전에서 임시버전, 개발버전, 친구들이 보유하고 있는 버전 등으로 아무렇게나 변형할 수 있습니다.
+
+=== 일하는 척 하기 버튼 ===
+
+버튼 하나만 누르면 ("일하는 척 하기 버튼") 게임화면이 최소화되고 엑셀파일이 화면상에 나타나는 기능을 보신 적이 있을겁니다. 이 기능을 활용하면 직장상사의 눈을 속이고 일하던 척 할 수 있지요?
+
+어떤 디렉토리에서:
+
+ $ echo "I'm smarter than my boss" > myfile.txt # 난 내 상사보다 똑똑하다
+ $ git init
+ $ git add .
+ $ git commit -m "Initial commit"
+
+우리는 "난 내 상사보다 똑똑하다"라는 내용을 가진 텍스트파일을 Git repository에 만들었습니다. 그리고:
+
+ $ git checkout -b boss # 이 명령어를 사용한 후엔 아무것도 바뀌지 않은 것처럼 보일겁니다.
+ $ echo "My boss is smarter than me" > myfile.txt
+ $ git commit -a -m "Another commit"
+
+겉으로 보기에는 그 텍스트파일을 새로운 문장으로 덮어씌우고 commit을 한 것처럼 보일겁니다. 그러나 그건 착각입니다. 다음 명령어를 입력해보세요:
+
+ $ git checkout master # 처음 버전으로 돌아가기
+
+자! 그럼 처음 생성했던 텍스트파일이 돌아왔을 겁니다. 만약에 그 상사가 이 사실을 알아채고 당신의 디렉토리를 살펴본다고 할 때는:
+
+ $ git checkout boss # 아까 두 번째로 만들어놓은 "상사는 나보다 똑똑합니다"라는 메세지를 담은 myfile.txt 파일로 돌아갑니다.
+
+이런 식으로 두 가지 다른버전의 파일 사이를 오갈 수 있습니다. 그리고 각각 따로 commit을 할 수 있지요.
+
+=== 힘든 작업 ===
+
+[[branch]]
+당신이 어떤 작업을하고 있다고 가정합니다. 작업 도중에 세 버전 전으로 돌아가서 새로운 print 라인을 넣고 테스팅 해보고 싶다는 생각이 들었습니다. 그럴 때엔:
+
+ $ git commit -a
+ $ git checkout HEAD~3
+
+이제 테스팅하고 싶었던 파일에 더하고 싶은 것을 걱정없이 마구 넣어도 됩니다. 이 미친 짓(?)을 commit 해놓을 수도 있습니다. 작업이 다 끝났다면,
+
+ $ git checkout master
+
+를 사용해 아까 미친 짓을 하기 전의 작업상태로 돌아올 수 있습니다. Commit하지 않았던 작업들이 같이 딸려 왔다는 것을 확인 (조심!)할 수 있을 겁니다.
+
+아까 그 임시작업 (미친 짓)을 세이브하고 싶다면 어떻게 해야할까요? 쉽습니다:
+
+ $ git checkout -b dirty
+
+를 실행하여 그 나뭇가지 (branch) 에서 마스터 나뭇가지로 돌아오기 전에 commit을 하면 됩니다. 그런 후 다시 미친 짓을 할 때의 상태로 돌아가고 싶다면:
+
+ $ git checkout dirty
+
+우리는 이 체크아웃이라는 명령어를 전에도 설명했었죠. 여기서는 이 명령어가 어떻게 예전 버전들을 불러오는 지 살펴볼 수 있었습니다: 파일을 원하는 버전으로 돌아가게 할 수 있으나, master 나뭇가지를 우선 벗어나야 하지요. 벗어난 후의 commit은 master 나뭇가지와는 다른 길을 걷게 될 것입니다. 그 길을 나중에 이름도 지어줄 수 있지요.
+
+다시 말하면, 예전 상태 (state)에서 벗어나면 Git은 자동으로 이름이 없는 새로운 나뭇가지로 이동시켜 줍니다. 이 나뭇가지는 *git checkout -b*로 이름을 바꿔 저장해줄 수 있죠.
+
+=== 빠른 코드수정 ===
+
+작업 중에 갑자기 하던 일을 멈추고 '1b6d...'commit에 있는 버그를 고치라고 부탁을 받았다고 생각해 봅시다:
+
+ $ git commit -a
+ $ git checkout -b fixes 1b6d
+
+버그를 다 고친 후에:
+
+ $ git commit -a -m "Bug fixed"
+ $ git checkout master
+
+이제 아까 잠시 중단했던 작업으로 돌아갈 수 있습니다. 버그가 고쳐진 파일도 병합해올 수 있죠:
+
+ $ git merge fixes
+
+=== 병합 (Merging) ===
+
+Git을 제외한 다른 VCS들을 이용할 땐 나뭇가지 (branch)들을 만드는 것은 쉽지만
+나뭇가지들을 병합하기는 어려웠습니다. Git에서는 병합작업이 정말 쉽고
+병합이 진행되고 있는 중인지 우리도 모르는 사이에 끝날 것입니다.
+
+병합은 전에도 소개했었습니다. '당겨오기 (pull)' 명령어는
+commit들을 가져와 지금 머물고있는 branch에 병합하여 줍니다. 로컬에서 아무런
+작업을 진행하지 않았더라면 *pull*은 현 branch를 '빨리 감기' 하여
+중앙 서버에서 가장 최근의 정보를 가져와 병합합니다. 로컬에서 작업을 한
+기록이 있었다면, Git은 자동으로 병합을 시도할 것이고, 병합 중에 버전간의 차질이 있다면 당신에게 친절히 알려줄 것 입니다.
+
+Commit은 보통 하나의 '부모 commit'이 (과거의 commit) 있습니다. 그러나 병합을 하게 된다면
+하나의 commit이 적어도 '아버지 commit'와 '어머니 commit' 이 있다고 생각할 수 있는 것이죠.
+그럼 'HEAD~10'은 어떤 commit을 가르키는 걸까요? 부모 commit 두 개 이상이라면
+어떤 commit을 받아 순조롭게 작업을 계속 진행할 수 있을까요?
+
+Git은 먼저 시간적으로 제일 먼저 commit되었던 부모를 따르게 설정되어 있습니다. 현재 작업중인
+branch가 병합이 실행될 경우 이 branch 자체가 첫번째 부모가 되기때문에 당연한 겁니다:
+당신은 언제나 현 나뭇가지에서 가장 최근에 한 작업에만 관심이 있을 가능성이 크기 때문이지요.
+다른 나뭇가지에서 한 작업은 다음 일입니다.
+
+탈자 기호 (^)를 이용하서 부모를 수동으로 정해줄 수도 있습니다. 예를 들어
+두번째 부모의 기록을 조회하고 싶다면:
+
+ $ git log HEAD^2
+
+첫번째 부모의 기록을 조회할 때는 탈자기호 이후의 번호는 생략해도 됩니다.
+굳이 보여드리자면:
+
+ $ git diff HEAD^
+
+이 표기법은 다른 형식의 표기법과도 병행해서 사용할 수 있습니다:
+
+ $ git checkout 1b6d^^2~10 -b ancient
+
+(집중하십시오) 새로운 나뭇가지인 "ancient"를 시작하고 두번째 부모의 첫번째 부모 나뭇가지에서
+1b6d로 시작하는 commit과 그 commit 전 10개의 commit을 불러와 줄 것입니다.
+
+=== 방해받지 않는 작업진행 ===
+
+하드웨어 관련작업을 하다보면 현재 작업중인 단계가 완료되어야만 다음 단계 진행이 가능할 것입니다. 자동차를 예로들면 외부로부터 오기로했던 부품들이 도착해야 비로소 수리에 들어갈 수 있겠지요. 프로토타입들은 칩들이 가공되어야 건축이 가능해 지겠죠.
+
+소프트웨어 관련작업도 비슷합니다. 다음 작업이 진행될려면
+현재 작업이 이미 발표 및 테스트가 되어있어야 할 겁니다. 어떤 작업들은
+당신의 코드가 받아 들여지기 전 검토부터 되어야 겠지요. 그래서 당신은 그 검토가
+끌날 때까지는 다음 작업으로 진행하지 못 할것입니다.
+
+하지만 나뭇가지와 병합기능 덕분에 이 규칙을 깨고 파트 1이 완료되기도 전에
+파트 2에서 미리 작업을 진행하고 있을 수 있습니다. 파트 1을 commit하고
+검토를 위해 어디론가 보냈다고 생각해봅시다. 만약 당신이 Master 나뭇가지에서 작업하고 있었다면,
+그 branch에서 다른 branch로 갈아타야합니다:
+
+ $ git checkout -b part2
+
+그리곤 파트 2에서 commit을 하며 작업을 계속 진행하세요. 인간은 실수를 많이하는 동물이기에
+파트 1으로 다시 돌아가서 무엇인가 고치고 싶을지도 모릅니다.
+만약에 당신이 천재적인 프로그래머라면 다음 명령어를 사용할 일은 없겠지요.
+
+ $ git checkout master # 파트 1로 돌아갑니다.
+ $ fix_problem # 수정 작업
+ $ git commit -a # 수정 작업을 commit합니다.
+ $ git checkout part2 # 파트 2로 다시 갑니다.
+ $ git merge master # 아까 파트 1의 수정을 파트 2로 병합합니다.
+
+이 때 즈음이면 이미 파트 1은 허가 받았겠지요.
+
+ $ git checkout master # 파트 1로 돌아갑니다.
+ $ submit files # 파일 배포!
+ $ git merge part2 # 파트 2도 파트 1으로 병합.
+ $ git branch -d part2 # 파트 2 나뭇가지 삭제.
+
+이제 파트 2의 모든 것과 함께 업데이트 된 master 나뭇가지로 돌아왔습니다.
+
+ branch는 갯수의 제한 없이 원하는 만큼 생성할 수 있습니다. 역순으로 branch를 만들 수도
+ 있죠: 만약에 7번의 commit전에 나뭇가지를 하나 만들어 놓았어야 함을
+ 늦게 깨닫았을 때, 다음 명령어를 이용해 보세요:
+
+ $ git branch -m master part2 # master 나뭇가지의 이름을 part2로 바꿉니다.
+ $ git branch master HEAD~7 # 7 commit 전의 상황에서 master 나뭇가지를 새로 만듭니다.
+
+Master 나뭇가지는 이제 part 1만 들어있고, 나머지는 모두 part 2에 들어가게 되었습니다.
+그리고 우리는 지금 part 2에서 작업을 하고 있는 중이겠지요; master를 만들면서 master로는
+현재 옮겨간 상태가 아닙니다. 처음 보시죠? 여태까지 설명한 예제들에서는
+나뭇가지를 만들면서 곧바로 작업공간도 같이 옮겨갔었는데 말이죠. 이런 식으로요:
+
+ $ git checkout HEAD~7 -b master # 나뭇가지를 만들고 바로 작업공간도 그 나뭇가지로 옮긴다.
+
+=== 메들리의 재정리 ===
+
+하나의 branch에서 모든 작업을 끝내고 싶을 수도 있습니다. 작업중인 일들은 혼자만 알고 중요한 commit들만 다른사람들에게 보여주고 싶을 수 있습니다. 그럴경우엔 두 개의 branch를 우선 만드세요:
+
+ $ git branch sanitized # 정돈된 commit을 보여주기 위한 나뭇가지를 만듭니다.
+ $ git checkout -b medley # 작업을 하게 될 "메들리" 나뭇가지를 만들어 이동합니다.
+
+버그를 고치던, 어떤 기능을 더하던, 임시코드를 더하던 작업을 진행합니다. 물론 commit을 해가면서 말이죠. 그리고:
+
+ $ git checkout sanitized
+ $ git cherry-pick medley^^
+
+위의 명령어들을 차례로 사용한다면 "메들리" 나뭇가지의 commit들을 "sanitzed" 나뭇가지에 붙입니다. "cherry-pick"명령어를 잘 사용한다면 마지막 결과물에만 첨부된 코드들이 들어있는 branch를 만들 수 있습니다. 잡다한 commit들도 잘 정리되어 있을겁니다.
+
+=== Branch 관리하기 ===
+
+여태까지 프로젝트에서 생성한 나뭇가지들을 보려면:
+
+ $ git branch
+
+기본적으로 "master" 나뭇가지에서 작업을 시작하는 것이 디폴트로 지정되어 있습니다. 그러나 어떤 개발자들은 "master" 나뭇가지는 그대로 냅두고 새로운 나뭇가지를 만들어서 그 곳에서 작업하는 것을 선호합니다.
+
+*-d*와 *-m* 옵션들은 각각 branch들을 지우거나 branch 이름을 바꿔줄 수 있는 파라메터들 입니다.
+*git help branch*를 보시면 더욱 자세히 설명되어 있을겁니다 (번역 주: 어차피 영어입니다)
+
+"master" 나뭇가지는 관례적인 이름의 branch일 뿐입니다. 다른 개발자들은
+당신의 저장소에 당연히 "master"라는 이름을 가진 branch가 있을 것이라고 생각하겠지요. 그리고
+그 branch는 모든 공식적인 자료들이 들어있다고 넘겨짚을 것입니다. 물론 당신은 "master"를 없에거나 새로운 이름을 지정해줄 수 있으나, "master" 나뭇가지를 쓰는 관례를 따르는 것을 추천합니다.
+
+=== 임시 branch ===
+
+Git을 사용하다보면 당신은 쓸모없는 하루살이 같은 쓸때없는 branch들을 많이 만들고 있다는 사실을
+깨달을 것입니다. 이유는 다음과 같겠지요: 그 많은 branch들은 작업의 경과를
+저장하기 위해 임시로 만들어놓고 무엇인가 고칠 것이 있을 때 빨리 돌가가기 위해서
+쌓아두기만 하고있는 거겠죠.
+
+다른 TV채널에서 무얼하나 확인할 때 잠시 채널을 바꾸는 것과 같은 아이디어입니다.
+그러나 리모콘 버튼 몇 개 누르면 되는 것과는 달리, 많은 나뭇가지를 만들고, 설정하고, 병합하고,
+나중에 다쓰면 지워야합니다. 다행히도 Git에서는 TV 리모트와 비슷하게
+지름길이 있습니다:
+
+ $ git stash
+
+이 명령어는 현 버전을 임시저장소 (stash)에 저장해 주고 작업하기 전의 상태로
+돌아갑니다. 작업중인 디렉토리는 작업 (편집, 버그고침 등) 하기 전의 상태로 돌아가겠지요.
+그리고 임시 (stash)로 돌아가고 싶다면:
+
+ $ git stash apply # 에러 (version conflict)가 날지도 몰라요. 수동적으로 해결하세요.
+
+물론 여러개의 임시저장소 (stash)를 만들수도 있습니다. *git help stash*에 설명이 되어있으니
+읽어보세요. 눈치챘을지 모르겠지만, Git은 올바른 임시저장소 (stash) 기능을 쓰게 해주기 위해서 자체적으로 임의 생성된 branch들을 몰래 이용한답니다.
+
+=== 내 방식대로 작업하기 ===
+
+Branch를 이용하는 것이 꼭 필요한지 생각할지도 모르겠습니다. 파일들을
+클로닝하는게 제일 빠르고 *cd*를 이용해 디렉토리를 바꿈으로써 branch 사용을
+대체하고 싶을지도 모릅니다.
+
+웹브라우저의 예를 들어보겠습니다. 여러개의 창 아니면 여러개의 탭을 지원하는 이유는 무엇일까요?
+여러 이용자들의 작업방식을 존중하여 주기 위해서랍니다. 어떤 이용자들은
+웹브라우저 창 하나만 열고 여러 탭을 열어서 작업하는 방식을 추구합니다. 다른 이용자들은
+반대의 형식으로 작업하는 것을 추구할지도 모르죠: 여러개의 창을 만들고 탭이 없이 작업하는 것을 말이죠.
+또 어떤 이용자들은 이 두 방법들을 섞어서 작업하는 걸 선호할지도 모릅니다.
+
+Branch들은 마치 작업중인 디렉토리의 탭과 같습니다. 클로닝은 새로운 브라우저 창을
+여는 것과 같은 것이죠. 이 두가지 방법은 모두 빠르고 로컬에서 진행됩니다. 그러니
+당신에게 맞는 방법을 찾아보는 건 어떨까요? Git은 당신이 원하는 대로 일하게
+도와줄 것입니다.
diff --git a/ko/clone.txt b/ko/clone.txt
new file mode 100644
index 00000000..a259d039
--- /dev/null
+++ b/ko/clone.txt
@@ -0,0 +1,206 @@
+== 클론 만들기 ==
+
+구형 VCS에서는 체크아웃 명령어가 어딘가에 저장되어 있는 파일들을 가져오는 보편적인 방법이었습니다.
+
+Git을 포함한 다른 분산 제어식 VCS에서는 클론만들기를 체크아웃을 대체하는 보편적인 방법으로 채택하고 있습니다. 어떤 저장된 파일을 얻기위해서는, 원하는 파일 원본들이 저장되어있는 저장소에서 내 컴퓨터로 끌고와 '클론'을 만들어야 합니다. 즉, 중앙관리서버를 미러링해오는 것과 같은 이치라고 설명할 수 있습니다. 클론을 본떠온다면 중앙관리서버가 할 수 있는 모든 것들을 당신이 이제 할 수 있는 것이죠.
+
+=== 컴퓨터 동기화 ===
+
+기본적인 동기화 및 백업을 할 때 tarball을 만드는 것과 *rsync*명령어를 사용하는 것은 이해할 수 있는 행동입니다. 그러나 저는 가끔씩 노트북에서 편집을 할 때도 있고, 데스크탑에서 할 때도 있는데, 이 두 개의 컴퓨터는 *rsync*같은 명령어를 사용하면서 작업할때 잦은 동기화를 하지 않을지도 모릅니다.
+
+한 컴퓨터에서 Git Repository를 초기화하고 파일들을 commit함으로써 이 문제를 해결할 수 있습니다. 그 후 다른 컴퓨터에서:
+
+ $ git clone other.computer:/path/to/files
+
+위 명령어를 이용해서 두 번째 Git repository 사본을 만들 수 있습니다. 그 다음부터는,
+
+ $ git commit -a
+ $ git pull other.computer:/path/to/files HEAD
+
+을 이용하여 현재 작업중인 컴퓨터로 다른 컴퓨터에서 작업하던 파일들을 '당겨올 (pull)' 수 있습니다. 만약에 같은 파일에 대해서 전후가 맞지않는 작업을 했을 경우, Git은 당신에게 에러메세지로 먼저 이 모순을 해결 후 commit을 할 것을 알려줄 것입니다.
+
+=== 고전적인 소스 관리 ===
+
+우선 Git 저장소를 초기화 해줍니다:
+
+ $ git init
+ $ git add .
+ $ git commit -m "Initial commit"
+
+그리고 중앙 서버에서, 아무 디렉토리에서나 태초의(bare) repository를 초기화 해줍니다:
+
+ $ mkdir proj.git
+ $ cd proj.git
+ $ git --bare init
+ $ touch proj.git/git-daemon-export-ok
+
+필요하다면 Git daemon을 실행합니다:
+
+ $ git daemon --detach # 아마 이미 daemon이 실행하고 있을지도 모릅니다.
+
+Git 호스팅 서비스를 한다면 우선 빈 Git repository를 만들어야 합니다.
+대부분 웹페이지에서 어떠한 문서를 작성하곤 하죠.
+
+ 다음 명령어를 사용해 당신의 프로젝트를 중앙서버로 '밀어넣기 (push)' 할 수 있습니다:
+
+ $ git push central.server/path/to/proj.git HEAD
+
+소스를 확인하고 싶을 때에 개발자는 다음 명령어를 사용합니다:
+
+ $ git clone central.server/path/to/proj.git
+
+편집작업이 끝난 후에 개발자는 다음명령어를 사용해 로컬드라이브에 각종 바뀐 사항들을 저장을 합니다:
+
+ $ git commit -a
+
+가장 최신 버전으로 로컬파일들을 갱신하려면:
+
+ $ git pull
+
+merge할때 일어날 수 있는 오류들은 수동으로 해결 후, commit 명령어를 사용하여 작업을 commit 해주셔야 합니다:
+
+ $ git commit -a
+
+로컬에서 바뀐 사항들을 중앙 저장소로 저장하기 위해서는:
+
+ $ git push
+
+중앙 서버가 다른 개발자들로 인하여 새로운 변경사항이 생겼을 경우에는, 당신의 '밀어넣기 (Push)'는 실패할 것입니다.
+그렇다면 당신은 '밀어넣기 (Push)' 하기 전에 최신 버전을 다시 당겨서 (pull) 오류를 수동으로 해결 후 다시 밀어넣기를 시도해야 하겠지요.
+
+모든 개발자들은 특정 Git repository에 대한 SSH 접근권한이 있어야 push와 pull를 할 수 있습니다.
+그러나 개발소스는 대부분 모든 이들에게 개방된 것으로써 다음 명령어를 이용하면 조회 및 클로닝이 가능합니다:
+
+ $ git clone git://central.server/path/to/proj.git
+
+Git 프로토콜은 HTTP와 비슷합니다: 증명서가 존재하지 않죠. 그래서 아무나 프로젝트를 조회할 수 있는겁니다.
+그런 이유에서 '밀어넣기 (push)'는 Git 프로토콜로는 할 수없게 디폴트 설정이 되어있지요.
+
+=== 숨겨진 소스 ===
+
+개방되어 있지않은 소스의 프로젝트를 진행할 때에는 Git의 터치 (Touch) 명령어를 생략합니다. 그리고
+'git-daemong-export-ok'라는 이름의 파일을 절대 만들지 않도록 주의합니다. 이렇게하면 git 프로토콜을 사용해서
+원치않는 사람들이 당신의 저장소를 조회하거나 클로닝 할 수 있는 일은 없을 것입니다; 이제는 SSH 접근권이 있는 사람들만
+조회할 수 있게 될겁니다. 당신의 모든 repository가 개방되지 않은 경우에는 git daemon명령어는 필요없겠지요.
+모든 repository는 SSH 를 통해서만 허락된 개발자들에게만 공개될테니까요.
+
+=== 태초의 저장소 ===
+
+이 괴상한 이름의 저장소 (bare repository)는 현재 작업중인 디렉토리가 아니기에 이렇게 이름이 붙여졌습니다; 이 저장소는 하위 '.git' 디렉토리에서 숨겨진 파일들만을 저장하는 저장소입니다. 풀어 설명하면, 이 저장소는 현 프로젝트의 과거를 관리하기만 하고, 아무런 버전도 저장하지 않는 저장소입니다.
+
+헐벗은 저장소는 중앙서버관리식 VCS와 비슷한 기능을 담당하고 있고
+당신의 프로젝트가 저장되어 있는 집과같은 기능을 담당하고 있습니다. 개발자들은
+이 곳에서 부터 클론을 만들 수 있고, 작업한 내용을 '밀어넣기 (Push)' 할 수 있습니다. 보편적으로
+이 bare repository는 서버에서 상주하고 있다가 데이터를 퍼트리는 역할을 맡고있습니다. 개발은
+개발자 각자가 만들어 놓은 로컬컴퓨터에서의 클론에서 이루어짐으로써, 워킹 디렉토리없이 서버내에서 보호받는 저장소 역할을 할 수 있습니다.
+
+많은 Git 명령어들은 'GIT_DIR' 환경 변수가 repository로 경로설정이 되어 있지않다면 이 bare repository에 인식되지 않을 것입니다. '--bare' 옵션을 이용한다면 모를까.
+
+=== 밀어넣기 (push) vs. 당기기 (pull) ===
+
+'당기기 (pull)' 커맨드에만 의존하는 대신에 왜 제가 '밀어넣기 (push)'를 소개했을까요? 먼저, 당기기 (pull)는 아까 소개드린 bare repository에서는 실행이 되지 않는 명령어입니다: 물론 나중에 소개할 '물어오기 (fetch)'라는 명령어로 같은 일을 할 수 있지만요. 그러나 중앙서버에 저장 되어있는 보통 일반적인 repository에서도, 당기기 (pull)는 번거로울 수 밖에 없습니다. 서버에 로그인을 해야 될 것이고 그런 후에야 당기기 (pull)을 사용해야 하다는 말이지요. 파이어월이 이런 절차를 방해할 수도 있습니다. 그리고 쉘 접근 권한이 없다면 중앙 서버에 접속이나 가능할런지요?
+
+그러나 이러한 특수상황들이 아니라면 밀어넣기 (push)를 사용하시는 것을 비추합니다. 목적지가 현재 작업중인 디렉토리가 있을 경우에는 굉장히 햇갈릴 수 있기 때문입니다.
+
+줄여서, Git을 배울 때에는, bare repository일 경우에는 '밀어넣기 (push)'를 진행하시고 아니면 '당기기 (pull)'을 사용합시다.
+
+=== 프로젝트 포크질 (forking) 하기 ===
+
+현재 프로젝트가 진행되고 있는 방식이 마음에 안 드신 다고요? 당신이 좀 더 잘할 수 있다고 생각하세요? 그렇다면 당신 서버에서:
+
+ $ git clone git://main.server/path/to/files
+
+이 명령어를 쓴 후에, 다른 사람들에게 당신이 포크질 (fork)을 한 프로젝트에 대해 알리세요.
+
+이후 작업이 끝난 후 아무때나 원래 프로젝트 파일에서 다음 명령어를 씀으로써 포크질 해놓은 프로젝트로부터 오리지널 프로젝트 파일로 병합을 실행할 수 있습니다:
+
+ $ git pull
+
+=== 궁극의 백업 ===
+
+아무도 건들 수 없고 지리적으로 다양한 곳에 저장해놓고 싶은 기록 보관소를 소유하고 싶다고요? 만약 당신의 프로젝트에 많은 개발자들이 참여한다면 아무 것도 하지 마십시오. 그 수많은 개발자들이 각자 클론을 만들었다면 그 클론 자체가 아주 효율적인 프로젝트 백업이 될 것 입니다. 현 상태의 프로젝트 뿐만이 아니라, 그 프로젝트의 모든 과거 버전까지 말이죠. 만약이라도 어떤 개발자 분의 클론이 훼손 된다면 암호화 된 hashing 덕에 다른 모든 개발자들이 프로젝트 훼손여부에 관해 알 수 있게 될 것입니다.
+
+만약 당신의 프로젝트에 그리 많은 개발자들이 참여하지 않는다면, 최대한 많은 서버를 확보해서 클론을 만들어 놓으십시오.
+
+편집증이 걸린 개발자들은 언제나 프로젝트 HEAD의 20-바이트 SHA1 hash를 어딘가에는 안전하게 모셔놓죠. 안전하다는 말이 꼭 사적인 공간에 저장해놓는다는 말은 아닙니다. 예를 들면, 어떤 신문에 기사를 개제하는 것도 안전한 기록보관의 한 방법이 될 수 있지요. 그 정보를 훼손하고자하는 작자들이 세상에 발간된 모든 신문 카피를 바꿀 수는 없기 때문입니다.
+
+=== 광속의 멀티테스킹 ===
+
+만약에 어떠한 프로젝트의 여러 부분을 동시에 작업하고 싶으실 때에는 우선 현재상태의 프로젝트를 한 번 commit 한 후 다음 명령어를 사용합니다:
+
+ $ git clone . /some/new/directory
+
+http://en.wikipedia.org/wiki/Hard_link[hardlinking] 이라는 기능 덕분에 로컬시스템에 생성된 클론들은 일반 백업에 비해 비교적 적은 시간과 공간만 필요로 합니다.
+
+이렇게 하면 두개의 독립적인 작업을 동시진행 할 수 있습니다. 예로, 한 클론이 컴파일 중일때 다른 클론에서 또 다른 작업을 진행하고 있을 수 있습니다. 그리고 다른 클론으로 부터 아무 때나 commit과 당기기 (pull)도 사용할 수 있습니다.
+
+ $ git pull /the/other/clone HEAD
+
+=== 게릴라 버전 관리 ===
+
+당신은 현재 다른 VCS를 사용하고 있지만, Git을 그리워하고 있진 않습니까? 그렇다면 현재 작업중인 디렉토리에서 Git을 초기화 시켜주십시오:
+
+ $ git init
+ $ git add .
+ $ git commit -m "Initial commit"
+
+그리고 클론을 만들고:
+
+ $ git clone . /some/new/directory
+
+이제 방금 클론 된 디렉토리에서 작업을 진행하시면 됩니다. 가끔은 다른 개발자 분들과 동기화하고 싶으시겠죠. 그 개발자분들은 아직 Git을 사용하고 있지 않아도 우리 Git에서는:
+
+ $ git add .
+ $ git commit -m "Sync with everyone else"
+
+그리고는 새로운 디렉토리에서:
+
+ $ git commit -a -m "Description of my changes"
+ $ git pull
+
+다른 분들에게 당신의 작업을 공유하는 일은 그 쪽 분들이 쓰시는 VCS에 따라 다릅니다. 새로운 디렉토리는 이제 당신이 실행한 작업들이 포함되어 있겠죠. 위의 명령어를 쓰신 후에 다른 VCS에서 쓰는 명령어를 통해서 그들의 중앙 서버에 업로드 하실 수 있습니다.
+
+Subversion은 가장좋은 중앙관리식 VCS로써 개발자들 사이에서 애용되고 있습니다. Git에서 *git svn*을 사용해서 위에서 언급한 일들은 Subversion 저장소를 대상으로 행할 수 있습니다.http://google-opensource.blogspot.com/2008/05/export-git-project-to-google-code.html[Git 프로젝트를 Subversion 저장소로 보내기].
+
+=== Mercurial ===
+
+Mercurial 역시 비슷한 VCS으로써 Git과 쉽게 연동될 수 있습니다. 'hg-git'플러그인을 통해서 Mercurial 유저들은 Git 저장소에 쉽게 '밀어넣기 (push)'와 '당기기 (pull)'을 사용할 수 있죠.
+
+Git으로 'hg-git' 플러그인을 구하는 방법:
+
+ $ git clone git://github.com/schacon/hg-git.git
+
+Mercurial로 'hg-git'플러그인을 구하는 방법:
+
+ $ hg clone http://bitbucket.org/durin42/hg-git/
+
+유감스럽지만 다른 VCS에선 Git과 비슷한 플러그인이 있는지는 모르겠습니다. 그렇기 때문에 Mercurial보다는 Git을 주 저장소를 쓰길 선호합니다. Mercurial로 프로젝트를 진행할 경우에는 대부분 한 개발자가 Git 저장소를 같이 병행관리하는 업무를 떠맡곤 합니다. 그러나 Git으로 Mercurial 프로젝트를 진행할 경우에는 'hg-git'플러그인의 도움으로 그러한 번거로움이 필요없겠죠.
+
+Mercurial에 있는 repository를 Git repository로 '밀어넣기 (push)'를 사용하여 쉽게 바꿀 수 있으나, 'hg-fast-export.sh'스크립트를 사용해 이 작업을 더 쉽게 끝낼 수 있습니다. 다음 저장소에서 이 스크립트를 구할 수 있습니다:
+
+ $ git clone git://repo.or.cz/fast-export.git
+
+빈 저장소에서 이 작업을 한번 해봅시다:
+
+ $ git init
+ $ hg-fast-export.sh -r /hg/repo
+
+위 명령어는 스크립트를 '$PATH'에 넣은 후에 실행합니다.
+
+=== Bazaar ===
+
+Bazaar는 Git과 Mercurial 다음으로 많이 알려진 VCS입니다.
+
+Bazaar는 만들어진지 별로 되지않은 시스템이기에 엄청난 가능성이 잠재하고 있지요; Bazaar 개발자들은 다른 VCS의 단점을 배우고 고쳐나가는 중입니다. 그리고 Bazaar 개발자들은 Bazaar VCS가 다른 VCS들과 연동하는 문제에 많은 노력을 기울이고 있습니다.
+
+'bzr-git'플러그인은 Bazaar 이용자들이 Git과 함께 연동해 작업할 수 있도록 해줍니다. 'tailor' 프로그램은 Bazaar repository를 Git repository로 바꿔줍니다. 'bzr-fast-export'도 한 번 검색해보세요.
+
+=== 내가 Git을 사용하는 이유 ===
+
+제가 Git을 처음에 사용했던 이유는 제가 듣기에 Git은 Linux kernel source 관리에 용이하다고 들었기 때문입니다. Git을 사용한 이후로는 다른 VCS로 바꿔야겠다는 생각은 들지도 않았지요. Git은 저에게 매우 유용했고 저는 아직 Git으로 인한 어떠한 심각한 오류를 겪어보지도 않았습니다.저는 Linux를 주로 이용하기 때문에 다른 플랫폼에서 발생할 수 있는 문제는 생략하겠습니다.
+
+그리고 저는 C, bash scripts, Python을 이용하는 사람이고 프로그램 런타임에 목숨을 거는 사람 중 하나입니다.
+
+Git이 어떻게 좀 더 발전할 수 있을지, 또 Git과 비슷한 프로그램도 직접 짜보기도 했지만 학교 프로젝트 정도로만 썻었을 뿐입니다. 그러나 제가 직접 저만의 VCS를 만들었더라도 저는 Git을 계속 이용했을 겁니다. 제 프로그램을 써도 별로 투자한 것에 비해 얻을 것이 적어보였기 때문이지요.
+
+자연스레 여러분들이 필요로하고 원하는 프로그램은 계속해서 바뀝니다. 그러나 Git과는 그럴 가능성이 매우 적지요.
\ No newline at end of file
diff --git a/ko/drawbacks.txt b/ko/drawbacks.txt
new file mode 100644
index 00000000..2079dbb8
--- /dev/null
+++ b/ko/drawbacks.txt
@@ -0,0 +1,93 @@
+== 부록 A: Git의 약점들 ==
+
+Git을 소개하면서 저는 Git의 약점들을 몇 개 숨기긴 했습니다. 몇가지 약점들은 script나 hook을 통해 해결할수 있고, 몇가지는 프로젝트를 수정하면서 해결할수 있고, 그 외의 약점들은 현 시점에선 그냥 앉아서 기다리고 있을 수 밖에 없습니다. 그러기 싫으시다면 직접 도와줘보십쇼!
+
+=== SHA1 약점 ===
+
+시간이 지나면 해커들은 SHA1의 약점들을 더 많이 발견하게 될겁니다. 이미 hash에서의 충돌을 찾아내는 건
+가능한 일이지요. 몇 년 안에는 Git repository를 위해할 수 있는 연산능력을 가진
+일반컴퓨터도 있을 수 있습니다.
+
+Git이 그런 일이 일어나기전에 hash관련 기능들을 발전할 수 있었으면 좋겠어요.
+
+=== Microsoft Windows ===
+
+Git을 Microsoft Windows에서 사용하는 건 성가실 수 있습니다:
+
+- http://cygwin.com/[Cygwin], 리눅스와 비슷한 윈도우체제에선 http://cygwin.com/packages/git/[a Windows port of Git] 가 있습니다.
+
+- https://gitforwindows.org/[Git for Windows] 는 아직 몇몇 허점이 있지만 Windows에서 Git을 효율적으로 쓸수 있게 해줍니다.
+
+=== Git과 연관없는 파일들 ===
+
+만약에 당신의 프로젝트가 굉장히 크고, 쓸때없는 파일들이 많이 들어있는 상태이고, 상시로 바뀌는 상태라면, Git은 하나의 파일을 트랙킹하지 않기에 다른 VCS보다 유용하지 않을 수 있습니다. Git은 프로젝트 단위로 트랙킹을 하기 때문입니다. 이건 Git의 장점입니다.
+
+그래도 만약 하나의 파일만을 트랙킹하기 원하다면 프로젝트를 여러개의 파트로 분리해두는 겁니다. 여러개의 파트로 분리해도 *git submodule* 명령어를 이용하면 하나의 repository를 유지할 수 있을겁니다.
+
+=== 누가 어떤 작업을 하는거지? ===
+
+몇몇의 VCS는 유저들로 하여금 작업하기전에 파일들을 강제로 마킹 시킵니다. 이러한 강제성은 중앙서버와 연결하는데 귀찮은 절차이지만 두개의 장점이 있습니다:
+
+ 1. 버전의 차이 (Diff)를 체크하는데 매우 빠릅니다. 마킹 된 파일만 검사하면 되니까요.
+
+ 2. 유저는 어떤 사람이 어떤 작업을 하는지 중앙서버를 조회하면 간단히 알아낼 수 있습니다.
+
+Git으로도 이렇게 하는게 가능합니다. 그러나 그렇게 하기위해선 코딩이 좀 필요하니 프로그래머의 도움이 좀 필요할 수 있겠군요.
+
+=== 파일 히스토리 ===
+
+Git은 프로젝트 전체를 트랙킹하기 때문에 어떤 한 파일의 히스토리를 재건설하는데 다른 (하나의 파일만 트랙킹하는) VCS들보다 느릴 수 있습니다.
+
+그렇게 심하게 느려진다는 것은 아니고 오히려 Git의 장점들이 이 하나의 단점을 상쇄하고도 남습니다. 예를 들어 'git checkout'은 'cp -a'보다 빠르고 프로젝트 전체의 변화를 압축화하는 것이 파일 하나하나씩 압축하는 것보다 효율적입니다.
+
+=== 태초의 클론 ===
+
+만약에 어떠한 프로젝트의 히스토리가 길 경우, 클론을 만드는 것은 다른 VCS들의 'checking out'보다 컴퓨터의 용량을 더 차지할 수 있습니다.
+
+그러나 길게보면 클론이 checking out보다 나을 것입니다. 클로닝 이후 다른 명령어들은 매우 빠르고 오프라인으로도 진행이 가능하니까요. 그러나 어떠한 경우에는 좀 더 히스토리가 얕은 클론을 '--depth' 명령어를 통해 만드는 것이 더 나은 선택일 수 있습니다. 이렇게 만들어진 클론은 작업실행 속도가 빠르겠지만 몇몇 기능들이 제외되어 있을 수 있습니다.
+
+=== 불완전한 프로젝트들 ===
+
+Git은 파일에 작업을 더 많이할 수록 그 작업량에 대비해 빠르게 Version Control을 할 수 있도록 하기위해 쓰여진 프로그램입니다. 인간은 하나의 버전에서 다음 버전으로 작업을 할때 소량의 작업만 진행할 수 있죠. 예를들어, 한줄짜리 코드에 있는 버그를 고친다던가, 새로운 기능을 넣는다던가, 코멘트를 코드에 단다거나 말이죠. 그런데 만약 commit과 commit 사이에 작업량이 방대하게 클 경우 그 파일의 히스토리는 비례해서 커질 수 밖에 없겠죠.
+
+VCS는 이것에 대해 아무것도 할 수 없습니다. 일반 Git 유저들은 그 부풀어진 파일들을 곧대로 받아들일 수 밖에 없겠죠.
+
+그러나 왜 방대한 작업량이 필요했는지에 대해 알아볼 필요는 있습니다. 파일 포맷이 바뀌어서 그랬을수도 있죠. 소량의 작업은 소량의 변화를 주기마련입니다.
+
+아니면 데이터베이스나 백업자료실를 구축해놓는 것이 이런 방대한 프로젝트들을 진행하는 데에 있어 VCS보다 적합할수도 있습니다. 예를 들어 VCS는 어떤 웹캠에서 주기적으로 찍은 이미지를 관리하는 데에는 적합하지 않습니다.
+
+만약에 파일들이 매번 변화하고 있고 각각의 변화에 무조건 버젼번호를 매겨야겠다 한다면 Git을 중앙서버처럼 쓰는 방법밖에 없습니다. 개발자들은 상대적으로 가벼운 클론을 만들면 되죠. 이렇게 일을 진해하면 물론 단점도 있을겁니다. 픽스들을 패치로 배포해야하고 Git tool들이 들어먹지 않을 수도 있어요. 근데 이렇게라도 일을 진행해야하는게 맞는 방법일 수 있습니다. 아무도 히스토리가 매우 긴 프로젝트들을 곧대로 받긴 싫어하거든요.
+
+다른 예시로는 큰 바이너리 파일들을 수행하는 펌웨어들에 기반한 프로젝트를 진행할 경우입니다. 펌웨어의 히스토리는 유저들에게 별로 흥미로운 소재는 아니고, 업데이트들은 압축률이 매우 좋지 않습니다. 그래서 펌웨어들을 재구성할떄는 repository의 크기가 매우 커지는 경우가 있죠.
+
+이럴때에는 모든 소스코드들이 Git repository에 저장되어 있는 편이 좋고, 바이너리 파일들은 따로 보관되어야 할 것 입니다. 이 일을 좀 더 쉽게 진행하기 위해서 Git 유저가 어떤 파일에 대해 클론을 만들수있고 *rsync*를 할 수 있으며, 가벼운 클론을 만들수있는 코드를 배포하는 것이 좋을 수 있습니다.
+
+=== 글로벌 카운터 ===
+
+몇몇 중앙관리식 VCS들은 새로운 commit이 받아들여질때마다 임의의 양의정수를 보존합니다. Git은 양의정수보다 나은 hash를 써서 commit을 관리합니다.
+
+그러나 어느 사람들은 아직도 양의정수로 commit관리를 하길 추구합니다. 다행히도 Git에 추가프로그래밍을하여 Git repository에서 양의정수를 1씩 더하는 방식으로 commit을 관리할수도 있습니다.
+
+어느 클론 파일이나 양의정수를 사용하여 commit을 관리할 수 있습니다. 그러나 이건 아무짝에도 쓸모가 없죠. 중앙 repository만 이 숫자를 쓸꺼니까요.
+
+=== 빈 (empty) 섭디렉토리 ===
+
+빈 섭디렉토리는 트랙킹되지 않습니다. 그러나 더미 파일을 만들어서 트랙킹하게 편법을 쓸 수 있죠.
+
+현 버전의 Git으로써 이 문제점은 Git의 약점입니다. Git이 다시 수면위로 올라가고 더 많은 사람들이 사용하게 될수록 이런 약점도 메꿔나가 지겠죠.
+
+=== 태초의 commit ===
+
+보통의 컴퓨터공학자들은 숫자를 셀 때 0부터 세지 1부터 세지 않습니다. 하지만 안타깝게도 commit의 횟수를 셀때 git은 컴퓨터공학자들처럼 숫자를 세지 않습니다. Git의 그 많은 명령어들은 commit이 태초적으로 한번 이루어지기 전까지는 실행되지 않을겁니다. Branch들을 rebasing 할때나 이럴 경우에는 예외일 수도 있습니다.
+
+애초에 Git은 태초의 commit으로부터 많은 혜택을 받습니다: repostiory가 생성되자마자 HEAD는 20 zero bytes의 스트링으로 자동설정됩니다. 이 특별한 commit은 빈 나무로 표현합니다. 빈 나무는 부모님 commit도 없습니다. 한마디로 근본이 없는 친구를 태초의 commit으로 부릅니다.
+
+그리고 태초의 commit후, git log를 로드했을때 Git이 오류를 내지 않고 단순히 commit이 하나도 안 되었다고 알려줄 것입니다.
+
+태초의 commit은 한마디로 zero commit의 양자같은 컨셉트입니다.
+
+그러나 이런 구성은 가끔 문제를 야기합니다. 여러개의 branch가 모두 태초의 commit을 하고 이제 branch를 병합시켜야 할때, rebasing은 아마 유저 본인이 수동으로 버전청소를 하라고 할수도 있습니다.
+
+=== 별난 인터페이스 ===
+
+A와 B commit이 있을때, "A..B" 와 "A...B" 표현의 차이는 명령어가 두개의 종점이나 범위가 입력되기를 기다리고 있느냐 마느냐입니다. *git help diff* 와 *git help rev-parse*를 참조하십시오.
diff --git a/ko/grandmaster.txt b/ko/grandmaster.txt
new file mode 100644
index 00000000..f8cc00e6
--- /dev/null
+++ b/ko/grandmaster.txt
@@ -0,0 +1,225 @@
+== Git 마스터링 ==
+
+지금까지 배운것만으로도 당신은 *git help* 페이지를 자유롭게 돌아다니며 거의 모든 것을
+이해할 수 있을 것입니다. 그러나 어떠한 문제를 풀기위해 어느 한 가지의 알맞는 명령어를 찾는 것은 아직 성가실 수 있습니다. 그런 문제에 대해 제가 도와줄 수 있을 것 같습니다: 아래는 제가 Git을 사용하며 유용하게 썼던 몇가지 팁들입니다.
+
+=== 소스 배포 ===
+
+제 프로젝트에서 Git은 제가 저장 및 공개하고 싶은 파일들을 정확히 추적하여 줍니다.
+
+ $ git archive --format=tar --prefix=proj-1.2.3/ HEAD
+
+=== 바뀐 것은 꼭 commit ===
+
+Git에게 무엇을 추가, 삭제 및 파일이름을 바꾸었는지 일일히 알려주는 것은 귀찮은 짓일지도 모릅니다.
+대신에 당신은 다음 명령어를 쓸 수있습니다:
+
+ $ git add .
+ $ git add -u
+
+Git은 현재 작업중인 디렉토리에 있는 파일들을 자동으로 살피며 자세한 사항들을 기록하여 줍니다. 위의 두번째
+명령어 (git add -u) 대신에 'git commit -a'를 사용하여 그 명령어와 commit을 동시에
+해낼 수 있습니다. *git help ignore*를 참고하여 특별히 지정된 파일을 무시하는 방법을
+알아보십시오.
+
+위의 모든 것을 한 줄의 명령어로 실행할 수 있습니다.
+
+ $ git ls-files -d -m -o -z | xargs -0 git update-index --add --remove
+
+*-z*와 *-0* 옵션은 파일이름이 이상한 문자를 포함하고 있을 때 생길 수 있는 여러가지 문제점들을
+처리하여 줍니다. 이 옵션들은 무시된 파일들을 포함하여줌으로써 '-x'아니면 '-X'을 같이 써주어야 할
+것입니다.
+
+=== 내 commit이 너무 클 경우? ===
+
+Commit을 한지 시간이 좀 많이 지난 상황입니까? 코딩을 너무 열심히 한 나머지 버전컨트롤하는 것을
+깜빡했나요? 프로젝트에 여러가지 연관성없는 수정을 한 상태입니까?
+
+걱정하지말고:
+
+ $ git add -p
+
+당신이 만든 모든 수정작업에 대하여 Git은 어떠한 것들이 바뀌였는지 코드로 보여주며 당신에게
+다음에 실행할 commit에 부분적인 코드가 포함될 사항인지 물어볼 것입니다. "y"와 "n"를 이용하여
+대답할 수 있습니다. 물론 이 대답을 당장하지 않아도 됩니다; "?"로 좀 더 알아보십시요.
+
+모든 수정작업이 마음에 든다면:
+
+ $ git commit
+
+위의 간단한 명령어를 사용하여 직접 선택한 작업만을 commit합니다. 이 상황에선 반드시 *-a*옵션을 생략하시길 바랍니다.
+그렇지 않으면 Git은 모든 수정작업을 commit할 것입니다.
+
+만약에 여러군데 다른 디렉토리에 많은 수정작업을 해놓았다면 어떻게 할까요? 수정된 사항을 하나씩
+검토하는 작업은 정말 귀찮은 짓입니다. 이럴땐 *git add -i*를 사용합니다. 몇 번의 타이핑만으로도
+특정 파일의 수정작업을 검토할 수 있게됩니다. 또는 *git commit \--interactive*를 사용하여 작업 중
+자동으로 작업 후 commit하는 방법도 있을 수 있습니다.
+
+=== 인덱스: Git의 스테이징 구역 ===
+
+여태까지 Git의 중요한 기능인 'index'를 피해왔지만 이제 한 번 살펴본 시간이 온 것 같습니다.
+인덱스는 임시적인 스테이징 구역 (번역주:책갈피처럼)으로 보면 됩니다. Git은 당신의 프로젝트와 프로젝트의
+기록 사이에 데이터를 직접 옮기는 경우는 드뭅니다. 대신, Git은 인덱스에 파일을 쓰며 그리고 그 파일들을 마지막 목표지점에 카피하여 줍니다.
+
+예를 들어 *commit -a*는 원래 두단계 과정을 거치는 하나의 명령어입니다. 첫번째 단계에서는 현 작업상황의
+스냅샷을 찍어 모든 파일들을 인덱스하는 과정을 거칩니다. 두번째 단계에서는 방금 찍은 스냅샷을 영구적으로
+보관하게 됩니다. *-a* 옵션을 쓰지않고 commit을 하는 것은 이 두번째 과정만 실행하는 일입니다. 그렇기에
+*git add* 같은 명령어를 쓴 후에 commit을 하는 것이 당연한 이야기가 되겠지요.
+
+대체적으로 인덱스에 관한 컨셉트는 무시하고 파일기록에서 직접적으로 쓰기와 읽기가 실행된다는 개념으로 이해하면 편합니다. 이런 경우에는 우린 인덱스를 제어하는 것 처럼
+좀 더 세부한 제어를 하기 원할것입니다. 부분적인 스냅샷을 찍은 후 영구적으로 이 '부분스냅샷'을 보존하는 것이죠.
+
+=== 머리(HEAD)를 잃어버리지 않기 ===
+
+HEAD 태그는 문서작업시 보이는 커서처럼 마지막 commit 포인트를 가르키는 포인터 역할을 합니다. Commit을 실행할 때마다 물론 HEAD도 같이 앞으로 움직이겠지요. 어떤 Git 명령어들은 수동으로 HEAD를
+움직일 수 있게 해줍니다. 예를 들면:
+
+ $ git reset HEAD~3
+
+위 명령어를 사용한다면 HEAD를 commit을 3번 하기 전으로 옮깁니다. 이 후 모든 Git 명령어는 가지고 있던 파일은 현재상태로 그대로 두되
+그 3번의 commit을 하지 않은 것으로 이해하죠.
+
+그러나 어떻게 해야 다시 가장 최근으로 돌아갈 수 있을까요? 예전에 했던 commit들은 미래에 대해서 아무것도 모를텐데 말이지요.
+
+원래의 HEAD의 SHA1을 가지고 있다면:
+
+ $ git reset 1b6d
+
+그러나 이 것을 어디에도 써두지 않았었더라도 걱정하지 마십시오: Git은 이런 경우를 대비해서 원래의 HEAD를 ORIG_HEAD로 어딘가에는 저장하여 둡니다. 그러고는 다음명령어를 사용하여
+미래로 안전하게 돌아올 수 있지요:
+
+ $ git reset ORIG_HEAD
+
+=== HEAD-헌팅 ===
+
+ORIG_HEAD로 돌아가는 것만으로는 충분하지 않을지도 모릅니다. 당신은 방금 엄청나게 큰 실수를 발견하였고 아주 오래전에 했던 commit으로 돌아가야 할지 모릅니다.
+
+기본적으로 Git은 branch를 수동으로 삭제하였더라도 2주의 시간동안 commit을 무조건 저장하여 둡니다.
+문제는 돌아가고 싶은 commit의 hash를 찾는 일입니다. '.git/objects'의 모든 hash 값을
+조회하여 얻어걸릴 때까지 해보는 방법이 있긴합니다만, 여기 좀 더 쉬운 방법이 있습니다.
+
+Git은 모든 commit의 hash를 '.git/logs'에 저장해 둡니다. 하위 디렉토리 'refs'은 모든 branch의 활동기록을 저장하여두고 동시에 'HEAD'파일은 모든 hash 값을 저장하고 있습니다.
+후자는 실수로 마구 건너 뛴 commit들의 hash도 찾을 수 있게 해줍니다.
+
+reflog 명령어는 당신이 사용하기 쉬운 유저인터페이스로 log파일들을 표현하여 줍니다. 다음 명령어를 사용하여 보십시오.
+
+ $ git reflog
+
+hash를 reflog으로부터 자르고 붙여넣기 보다는:
+
+ $ git checkout "@{10 minutes ago}"
+
+아니면 5번 째 전에 방문했던 commit으로 돌아갈수도 있습니다:
+
+ $ git checkout "@{5}"
+
+좀 더 많은 정보는 *git help rev-parse*의 "재편집 구체화하기" 섹션을 참고하십시오.
+
+아까 언급한 commit의 2주살이 생명을 수동으로 연장하여 줄 수 있습니다. 예를 들어:
+
+ $ git config gc.pruneexpire "30 days"
+
+위 명령어는 30일이 지난 후에 지워진 commit들 역시 영구적으로 삭제된다는 의미입니다. 그러고는
+*git gc*가 실행되지요.
+
+*git gc*가 자동실행되는 것을 꺼줄 수도 있습니다:
+
+ $ git config gc.auto 0
+
+이 경우에는 *git gc*를 수동적으로 실행시켜 commit들을 삭제할 수 있지요.
+
+=== Git을 좀 더 발전시키는 방법 ===
+
+진정한 UNIX와 같이 Git의 디자인은 다른 프로그램들의 GUI, 웹 인터페이스와 같은 하위파트들과 호환이 됩니다. 어느 Git 명령어들은 유명인사의 어깨위에 서있는 것처럼
+Git 그 자체가 스크립팅 언어로 사용될 수도 있습니다. 조금만 시간을 투자하면 Git은 당신의 기호에 더 알맞게 바꿀수 있습니다.
+
+한 가지 트릭을 소개하자면 자주 사용할것 같은 명령어들을 짧게 만들어줄 수 있는 방법이 있습니다:
+
+ $ git config --global alias.co checkout
+ $ git config --global --get-regexp alias # 현재 설정한 명령어들의 '가명'을 표기해줍니다.
+ alias.co checkout
+ $ git co foo # 'git checkout foo'와 같은 것입니다.
+
+또 다른 트릭은 현재 작업중인 branch의 이름을 작업표시창에 표시하여주는 명령어도 있습니다.
+
+ $ git symbolic-ref HEAD
+
+위 명령어는 현재 작업중인 branch 이름을 표기하여 줍니다. 실제로는 "refs/heads/"를 없애고
+잠재적으로 일어날 수 있는 에러들을 무시하는걸 추천드립니다:
+
+ $ git symbolic-ref HEAD 2> /dev/null | cut -b 12-
+
++contrib+ 하위 디렉토리는 유용한 Git 툴들이 저장되어있는 장소이기도 합니다.
+시간이 지나면 이곳에 있는 툴들은 공식적으로 인정받아 고유명령어가 생기기도 하겠지요. Debian과 Ubuntu에서는
+이 디렉토리는 +/usr/share/doc/git-core/contrib+에 위치하고 있습니다.
+
+앞으로 +workdir/git-new-workdir+디렉토리에 방문할 일도 많을 것입니다. 시스템링크 기술을 통해서 이 스크립트는 원래의 repository와 작업기록을 공유하는
+새로운 작업 디렉토리를 생성하여 줍니다:
+
+ $ git-new-workdir an/existing/repo new/directory
+
+새롭게 생성된 디렉토리는 클론으로 봐도 무방하며 일반클론들과의 한가지 차이점은 어느 한 곳에서 작업을 하던 두 개의 디렉토리는 앞으로 계속 싱크를 진행하며 같은 기록을 가지게 된다는 것입니다.
+즉, 병합, 밀어넣기, 당겨오기를 해줄 필요가 없어지는 것이지요.
+
+=== 용감한 스턴트 ===
+
+Git은 요즘 유저들이 데이터를 쉽게 지우지 못하도록 하고 있습니다.
+그러나 몇가지의 상용적인 명령어를 통해서 이런 Git만의 방화벽 쯤은 쉽게 뚫어버릴 수 있지요.
+
+*Checkout*: Commit하지 않은 작업들은 checkout을 할 수없습니다. 방금작업한 모든 것들을 없던 일로하고 그래도 굳이 commit을 진행하고 싶다면:
+
+ $ git checkout -f HEAD^
+
+반면에 checkout을 할 위치를 수동으로 설정하여 준다면 Git의 방화벽은 처음부터 작동하지 않을 것입니다. 설정해준 위치는 조용히 덮어씌우게 됩니다.
+그러니, 이런 방식으로 checkout을 할 때에는 주의 하십시오.
+
+*Reset*: 리셋은 commit되지 않은 작업이 있으면 실행되지 않을 것입니다. 그래도 강제로 하고싶다면:
+
+ $ git reset --hard 1b6d
+
+*Branch*: 방금한 작업을 잃어버릴 것같으면 Git은 branch가 지워지지 않게합니다. 그래도 하고싶다면:
+
+ $ git branch -D dead_branch # -d 대신 -D
+
+비슷한 방식으로, commit을 안한 작업이 있어서 move명령어를 통해서 덮어씌우기가 안될경우에는:
+
+ $ git branch -M source target # -m 대신 -M
+
+체크아웃과 리셋과는 다르게 위의 두 명령어는 데이터를 직접 삭제하진 않습니다. 모든 변경기록은
+.git 하위 디렉토리에 남게되고 필요한 hash는 '.git/logs'에서
+찾을 수 있습니다 (위의 "HEAD-헌팅" 섹션 참고). 기본설정상, 이 기록들은
+2주 동안은 삭제되지 않습니다.
+
+*Clean*: 몇 git 명령어들은 추적되지 않은 파일들을 망쳐놓을까봐 실행이 안되는 경우가 종종 있습니다.
+만약에 그 파일들이 삭제되도 된다는 확신이 선다면, 가차없이 다음 명령어를 사용하여
+삭제하십시오:
+
+ $ git clean -f -d
+
+이 후에는 위 모든 명령어들은 다시 잘 실행되기 시작할 것입니다!
+
+=== 원치않는 commit들을 방지하기 ===
+
+바보같은 실수들은 내 repository를 망쳐놓곤 합니다. 그 중에서도 제일 무서운 것은 *git add*를 쓰지 않아서
+작업해놓은 파일들을 잃어버리는 것이지요. 그나마 코드 뒤에 빈 공간을 마구 넣어놓는다던지
+병합에서 일어날 수 있는 문제들을 해결해 놓지않는 것은 애교로 보입니다: 별로 문제가 되는 것들은 아니지만
+남들이 볼 수 있는 repository에서는 보여주기 싫습니다.
+
+_hook_ 을 사용하는 것과 같이 제가 바보같은 짓을 할 때마다 경고를 해주는 기능이 있다면 얼마나 좋을까요:
+
+ $ cd .git/hooks
+ $ cp pre-commit.sample pre-commit # 예전 Git 버젼에서는: chmod +x pre-commit
+
+이제는 아까 설명했던 애교스러운 실수들이 발견될 때 Git은 commit을 도중에 그만 둘것입니다.
+
+이 가이드에서는 *pre-commit* 앞에 밑에 써놓은 코드를 넣음으로써 혹시 있을지도 모르는
+바보같은 짓을 방지하였습니다.
+
+ if git ls-files -o | grep '\.txt$'; then
+ echo FAIL! Untracked .txt files.
+ exit 1
+ fi
+
+많은 git 작업들은 hook과 상호작용합니다; *git help hooks*를 참조하십시오. 우리는 "HTTP를 통한 Git"을을 설명할때
+*post-update* hook을 활성화시켰습니다. HEAD가 옮겨질때마다 같이 실행되지요. Git over HTTP 예제에서는
+post-update 스크립트가 통신에 필요한 Git을 업데이트 했었습니다.
diff --git a/ko/history.txt b/ko/history.txt
new file mode 100644
index 00000000..d16c023d
--- /dev/null
+++ b/ko/history.txt
@@ -0,0 +1,236 @@
+== 히스토리 레슨 ==
+
+분산관리식 시스템을 택한 Git은 개발자들이 history관리를 용이하게 할 수 있게 해줍니다. 그러나 프로그램의 과거를 들춰내려면 조심하세요: 당신이 소유하고 있는 파일들만 다시쓰기 하세요. 세계 각국의 나라들이 누군가 어떤 잘못을 하나하면 누가했는지 끝임없이 따지는 것처럼 만약 한 개발자가 당신이 가지고 있는 파일과 기록 (history)이 다른 파일들을 클론하여 갔을 때 추후 병합시 문제가 생길지도 모릅니다.
+
+어떤 개발자들은 파일의 수정기록들이 절대로 조작되면 안되는 것이라고 믿고 있습니다. 반면에 어떤 개발자들은 수정 기록들이 깨끗하게 정리되어 보여져야 할 것만 선택하여 보여져야 한다고 합니다.
+Git은 이렇게 다른 성향의 개발자들을 모두 포용할 수 있습니다. 클로닝, branch, 병합과 같은 기능들이 당신이 어떤 개발자 타입이던 당신의 일처리를 도와줄 것입니다. 어떻게 영리하게 사용하는지는 당신에게 달려있죠.
+
+=== 오류 수정합니다 ===
+
+방금 commit을 했는데, 그 commit에 달린 메세지를 바꾸고 싶다고요? 그렇다면:
+
+ $ git commit --amend
+
+위 명령어를 사용하면 마지막으로 한 commit의 메세지를 바꿀 수 있습니다. 파일을 더하는 것을 잊어버리고 commit을 했다고요? *git add*를
+사용하고서 위의 명령어를 사용하세요.
+
+마지막으로 했던 commit에 편집을 더 하고 싶으신가요? 그렇다면 작업 후에 다음 명령어를 쓰세요.
+
+ $ git commit --amend -a
+
+=== ... 더 있습니다 ===
+
+이제 전보다 더 꼬인 상황을 마주했다고 생각합시다. 우선 당신이 긴 시간동안 작업해서 많은
+commit을 하였다고 가정해봅시다. 그러나 당신은 그 commit들의 난잡한 구성이 마음에 들지
+않습니다. 그리고 몇몇 commit 메세지들을 다시쓰고 싶다면:
+
+ $ git rebase -i HEAD~10
+
+위 명령어를 사용한다면 당신의 작업용 에디터에 지난 열 개의 commit이 출력될 것입니다. 샘플을 보자면:
+
+ pick 5c6eb73 Added repo.or.cz link
+ pick a311a64 Reordered analogies in "Work How You Want"
+ pick 100834f Added push target to Makefile
+
+여기서는 'log'와는 달리 가장 오래된 commit 부터 가장 최근의 commit의 순서로 나열되어 출력되었습니다.여기서는 5c6eb73 가 가장 오래된 commit이고 100834f이 가장 최근 commit 이죠. 그리고:
+
+- 한 줄을 지움으로써 commit을 삭제합니다. 'revert' 명령어와 비슷하지만 기록에는 남지 않게 지웁니다: 이 방법은 마치 commit이 처음부터 존재하지 않던 것처럼 보여지게 해줍니다.
+- Commit list를 재정렬하며 commit의 순서를 바꾸어 줍니다.
+- 위의 'pick' 명령어 대신에
+ * `edit` 을 사용하여 개정시킬 commit을 마킹합니다.
+ * `reword`를 사용하여 로그메세지를 바꿉니다.
+ * `squash` 를 사용하여 전에 했던 commit과 합병합니다.
+ * `fixup` 를 사용하여 전에 했던 commit과 합병 후 log 메세지를 삭제합니다.
+
+예를들어, 두번째 행의 'pick'을 'squash' 명령어로 바꾸어 봅니다:
+
+ pick 5c6eb73 Added repo.or.cz link
+ squash a311a64 Reordered analogies in "Work How You Want"
+ pick 100834f Added push target to Makefile
+
+저장 후 프로그램을 종료하면, Git은 a311a64를 5c6eb73로 병합시킵니다. *squash* (짓누르기)는 지정된 commit을 바로 다음 commit으로 밀어붙어버린다고 생각하시면 됩니다.
+
+또, Git은 로그메세지들을 합친후 나중에 편집할 수 있게 해주기도 합니다. *fixup* 명령어를
+사용하면 이런 절차를 하지않아도 됩니다; 짓눌려진 (squash 된) 로그메세지들은 간단히 삭제되기 때문입니다.
+
+*edit*을 이용하여 어떤 commit을 마킹해두었다면, Git은 같은 성향의 commit들 중에 가장
+오래전에 했던 commit의 작업상태로 당신을 되돌려 보냅니다. 이 상태에서 아까 전 말했듯이
+편집작업을 할 수도 있고, 그 상태에 맞는 새로운 commit을 만들수도 있습니다. 모든 수정작업이
+만족스럽다면 다음 명령어를 사용해 앞으로 감기를 실행할 수 있습니다.:
+
+ $ git rebase --continue
+
+Git은 다음 *edit*까지 아니면 아무런 *edit*이 없다면 현재 작업상태까지 commit을 반복실행 할것입니다.
+
+새로운 rebase를 포기할 수도 있습니다:
+
+ $ git rebase --abort
+
+그러니 commit을 부지런하게 자주하십시오: 나중에 rebase를 사용하여 정리할 수 있으니까요.
+
+=== 로컬에서의 수정작업 ===
+
+어떤 프로젝트를 진행하고 있습니다. 당신의 컴퓨터에서 commit을 하며 작업을 하다가
+이제 공식적인 프로젝트 파일들이 있는 branch와 동기화 해야합니다. 이런 절차는 메인 branch에 올리기전에 거쳐야 할 과정이지요.
+
+그러나 당신의 로컬 Git클론은 당신 혼자만 이해할 수 있는 수많은 기록이 뒤죽박죽 섞여있을 것입니다. 아무래도 개인적인 기록이 깨끗하게 정리되어 공식적인 기록만 볼 수 있게 된다면 좋겠지요:
+
+위에서 설명했듯이 *git rebase* 명령어가 이 작업을 해줄것입니다. *--onto* 플래그를 사용하여 상호작용을 피할수도 있습니다.
+
+*git help rebase*를 확인해서 좀 더 자세한 예를 한번 봐보세요. Commit을 나눌 수 있다는 걸 알게될 것입니다. 여러 branch들을 재정리할 수도있죠.
+
+*rebase*는 유용한 명령어입니다. 여러가지 실험을 하기전에
+*git clone*으로 복사본을 만들어두고 놀아보세요.
+
+=== 기록 다시쓰기 ===
+
+가끔은 어떤 그룹사진에서 포토샵으로 몇 사람지우는 기능과 같은 명령어가 필요할지도 모릅니다.
+스탈린식 스타일로 사람을 무자비하게 지우는 명령어 말입니다. 예를들어
+이제 어떤 프로젝트를 대중에게 공개할 시간이 왔다고 가정합니다. 그러나 어떤 파일들은
+일반 유저들이 보지 못하도록 하고싶습니다. 당신 크레딧카드 번호를 실수로 썻다던지
+했다면 더욱 더 그러고 싶겠지요. 이런 경우, 파일을 지우는 것 만으로는 부족합니다. 예전 commit으로 파일을 지워진 파일을 복구하는 것이 가능하기 때문이죠. 당신은 이 파일을 모든
+commit으로 부터 없에야 할 것입니다:
+
+ $ git filter-branch --tree-filter 'rm top/secret/file' HEAD
+
+*git help filter-branch*를 보세요. 여기서는 본 예시에 대해 설명하고 있고 더 빠른 방법을
+제시하여 줄 것입니다. 대체적으로 *filter-branch*은 하나의 명령어만으로도
+대량의 파일기록을 변화시킬 수 있을 것입니다.
+
+ 그리고 +.git/refs/original+ 디렉토리는 이렇게 만든 변화가 오기 전의 기록을 보여줄 것입니다. *filter-branch* 명령어가 어떻게 작용했는지 확인하고, 필요하다면 이 디렉토리를 지우면 됩니다.
+
+마지막으로, 당신의 클론을 새로운 버전의 클론으로 바꾸시면 됩니다.
+
+=== 기록 만들기 ===
+
+[[makinghistory]]
+어떤 프로젝트를 Git으로 옮겨오고 싶다고요? 다른 VCS에서 옮겨오는 것이라면, 어떤 개발자가 이미 프로젝트의 기록을 Git으로 쉽게 옮겨오는 스크립트를 써두었을지도 모릅니다.
+
+아니라면, 특정 포맷으로 텍스트를 읽어 Git 기록을 처음부터 작성하여 주는
+*git fast-import* 명령어를 확인해 보세요. 대체적으로 한번에 간편하게 프로젝트를 Git에서 사용할수 있게 해줄겁니다.
+
+예를들어, '/tmp/history' 같은 임시파일에 다음 텍스트를 붙여넣기 해보세요:
+----------------------------------
+commit refs/heads/master
+committer Alice Thu, 01 Jan 1970 00:00:00 +0000
+data <
+
+int main() {
+ printf("Hello, world!\n");
+ return 0;
+}
+EOT
+
+
+commit refs/heads/master
+committer Bob Tue, 14 Mar 2000 01:59:26 -0800
+data <
+
+int main() {
+ write(1, "Hello, world!\n", 14);
+ return 0;
+}
+EOT
+
+----------------------------------
+
+그리고 이 임시파일로 Git repository를 만들어보세요:
+
+ $ mkdir project; cd project; git init
+ $ git fast-import --date-format=rfc2822 < /tmp/history
+
+가장 최근 버전을 가져오고 싶다면:
+
+ $ git checkout master .
+
+*git fast-export* 명령어는 아무 Git repository를 결과물이 사람들이 읽을 수
+있는 포맷으로 바꾸어 주는 *git fast-import* 포맷으로 바꾸어 줍니다.
+이 명령어들은 텍스트 파일들을 텍스트 파일 전용채널을 통해서
+repository로 밀어넣기 해줍니다.
+
+=== 어디서부터 잘못되었을까? ===
+
+당신은 몇 달전에는 잘 작동되던 프로그램이 갑자기 안 된다는 것을 발견했습니다. 아놔! 이 버그는 어디서부터 생긴 것일까요? 개발을 하면서 테스팅을 종종했더라면 진작에 알아챘을텐데요.
+
+이미 그러기엔 너무 늦었습니다. 그러나 commit이라도 자주했다는 가정하에 Git은
+이러한 짐을 덜어줄 수 있습니다:
+
+ $ git bisect start
+ $ git bisect bad HEAD
+ $ git bisect good 1b6d
+
+Git에서 한 프로젝트를 자체적으로 테스팅을 실행합니다. 그리고 버그가 발견된다면:
+
+ $ git bisect bad
+
+버그가 더이상 없다면 위 명령어에서 "bad"를 "good"으로 바꾸세요. Git은 good 버전과 bad 버전 사이로 당신을 데려갈 겁니다. 물론 버그를 찾을 확률은 높아지지요. 몇 번이렇게 반복하다보면
+결국엔 버그를 일으킨 commit을 찾아낼 수 있게 도와줄 것입니다. 버그찾기를 완료했다면
+다시 처음 작업상태로 (이젠 버그가 없겠지요) 돌아가야 겠지요:
+
+ $ git bisect reset
+
+수동으로 테스팅하는 것보단, 다음 명령어로 테스팅을 자동화할 수 있습니다:
+
+ $ git bisect run my_script
+
+ Git 은 기존 대비할 스크립트에 약간의 변화를 주어서 이것이 좋은 변화인지
+ 안 좋은 변화인지 체크합니다: 좋은 변화는 0으로 무시해야할 변화는 125로
+ 안 좋은 변화는 1과 127사이의 번호로 테스팅을 종료합니다. 마이너스 숫자는
+ 이분화 (bisect)를 강제종료하지요.
+
+ 당신은 이것보다 더 많은 일을 할 수 있습니다. 도움말은 이분화를 시각화해주는 방법과,
+ 이분화 기록을 다시보는 방법, 이미 확인된 이상없는 변화들은 건너띄어 테스팅을 가속 시켜주는 기능들을 배우실 수 있습니다.
+
+=== 누가 망가뜨렸을까? ===
+
+다른 VCS들과 같이 Git은 누군가를 탓할 수 있는 기능이 있습니다:
+
+ $ git blame bug.c
+
+이 명령어를 사용하면 누가 언제 마지막으로 어느 부분을 작업하였는지 표시하여 줍니다. 다른 VCS들과는 달리 모든 작업은 오프라인에서 진행됩니다.
+
+=== 나의 개인경험담 ===
+
+중앙관리식 VCS에서는 파일들의 기록 변경은 어려울 뿐만아니라
+관리자만이 변경할 수 있습니다. 클론, branch 만들기와 병합하기는
+네트워크를 통해서만 할 수 있는 작업들입니다. 브라우징 기록보기, commit하기
+역시 중앙관리식 VCS에서는 네트워크를 통해야만 합니다. 어떤 시스템에서는
+네트워크 연결이 되어야지만 자기 자신이 작업한 기록을 보거나 편집할 수 있습니다.
+
+중앙관리식 VCS는 개발자의 수가 늘어남에 비례해서 더 많은 네트워크 통신을
+요구하기 때문에 오프라인에서 작업하는 것보다 비경제적일 수 밖에 없습니다. 그리고
+제일 중요한 것은 모든 개발자들이 고급명령어들을 적재적소에 쓰지 않는다면
+모든 작업이 어느정도는 무조건 느릴 수 밖에 없다는 것입니다. 극적인 경우에는
+아주 기본적인 명령어 역시 잘못하면 느려질 수 밖에 없습니다. 무거운
+명령어를 써야한다면 일의 효율성은 나쁜영향을 받을 수 밖에 없습니다.
+
+저는 직접 이런 상황들을 겪어보았습니다. Git은 제가 사용한 가장 먼저 사용한 VCS였죠. 저는 Git의 여러기능들을 당연하다 생각하고 금방 적응하였습니다.
+저는 당연히 다른 VCS들 역시 Git이 제공하는 기능들을 가지고 있을 것이라고
+생각하였습니다: VCS를 선택하는 것은 텍스트 에디터나 웹 브라우저를
+선택하는 것과 같은 맥락일 것이라고 생각하였습니다.
+
+제가 나중에 강제로 중앙관리식 VCS를 사용하게 되었을땐 완전 쇼킹이였죠. 불안정한 인터넷연결은
+Git을 사용할 때 중요치 않습니다. 그러나 이러한 인터넷연결은 로컬디스크에서 작업하는 것
+만큼은 효율적 일수는 없죠. 그리고 저는 어떤 명령어는 연결 딜레이를 고려함에 따라
+습관적으로 쓰지 않고있는 걸 시간이 지나며 깨달았습니다. 이런 습관은 제가 원하는 방식대로 작업을 할 수 없게하는 방해물들이었죠.
+
+어쩔 수 없이 느린 명령어를 사용할 때는 저의 작업효율에 치명타를 입히기
+일쑤였죠. 네트워크로 처리되야하는 작업이 완료되길 기다리면서 이메일 확인 및 다른 문서작업을 하며
+시간을 때웠습니다. 그러다가 원래하던 작업에 돌아가면 다시 무엇을 했었는지
+기억을 해내는데 시간이 많이 허비된 경험이 잦았습니다. 인간은 환경변화에
+적응을 할 수는 있으나 그 적응이 결코 빠르진 않죠.
+
+일을 하면서 발생하는 아이러니한 비극도 존재했죠: 네트워크 상황이 원활하지 않을 것이라는 걸 아는 개발자들은 미래에 딜레이를 줄이기위해 지금 하는 작업들이 오히려 현재 트래픽을 더 잡아먹을 수가
+있다는 것입니다. 모든 개발자들이 네트워크를 원활하게하는 노력을 할수록 오히려 서로에게 해가 될 수있다는 것입니다. 이게 무슨 아이러니한 일입니까?
\ No newline at end of file
diff --git a/ko/intro.txt b/ko/intro.txt
new file mode 100644
index 00000000..88512c90
--- /dev/null
+++ b/ko/intro.txt
@@ -0,0 +1,59 @@
+== 도입부 ==
+
+Github에 대해 설명하기 쉽게 비유법을 사용하여 버전 관리 시스템 (Version Control System; 이하 VCS)를 설명해보려 합니다. 제가 하려는 설명에 비해 덜 정신나간 버전의 설명을 원하시면 http://en.wikipedia.org/wiki/Revision_control 를 방문하시길 권장합니다.
+
+=== "일하는 것"은 곧 "노는 것" ===
+
+저는 거의 평생을 컴퓨터게임을 하며 지냈습니다. 그에 반해, 어른이 되서야 VCS를 사용하기 시작했지요. 이런 건 저 혼자가 아닐 것이라 생각하니, Git을 게임에 비유하며 설명하는 것이 Git을 이해하는 데 도움이 될 것이라 생각합니다.
+
+자, 이제 코드나 문서를 편집하는 작업이 게임을 하는 것과 같다고 생각해보세요. 편집을 마친 후에는 세이브하고 싶겠지요? 그렇게 하기 위해서는 당신의 든든한 코딩에디터에서 '세이브' 버튼을 누르면 될 것입니다.
+
+그러나 단순히 '세이브'를 누르는 것은 예전 세이브를 덮어쓰는 결과를 초래하죠. 세이브 슬롯이 한 개밖에 없는 옛날 구형 게임을 생각하면 됩니다. 다시 말하자면, 세이브를 할 수는 있지만, 예전 세이브포인트로 돌아갈 수 없는 것 입니다. 마치, 게임 진행하다가 정말 재미있는 파트에 적재적소에 맞게 세이브를 해 놓았는데 그 포인트로 다신 돌아갈 수 없다는 것이죠. 좀 더 심하게 말하자면, 절대로 깰 수 없는 보스 앞에서 세이브를 한 당신은 그 상태에 평생 머무르게 될수도 있다는 것 입니다. 그럴 경우에는 아주 처음부터 다시 시작해야 된다는 말이 되겠지요.
+
+=== 버전 관리 ===
+
+코드 등을 편집 시, '다른 이름으로 저장' 아니면 사본을 다른 디렉토리에 카피 떠 놓는 방법 등을 이용해 옛 버전의 코드들을 보존할 수는 있습니다. 컴퓨터 용량을 더욱 효율적으로 사용하기 위해서 압축을 할 수도 있죠. 이것은 참 원시적인 버전 컨트롤 방법입니다. 컴퓨터게임은 이런 과정에서 이미 발전해 나간지 오래되었지요. 요즘 게임들은 여러개의 세이브 슬롯에 시간을 기록해가며 세이브를 영리하게 해냅니다.
+
+이 문제를 좀 더 꼬아서 바라봅시다. 당신이 어떤 프로젝트나 웹사이트를 구성하는 소스코드와 같이 여러개의 파일을 보유한다고 가정합시다. 현 버전의 프로젝트/웹사이트를 세이브하고 싶다면 모든 디렉토리를 기록해야 한다는 번거로움이 있겠지요. 일일이 그 수 많은 버전들을 수동으로 관리한다는 것은 그리 효율적이지 않을 겁니다. 컴퓨터 용량도 더불어 많이 사용하게 될꺼고요.
+
+어떤 컴퓨터게임들은 정말로 모든 디렉토리를 각개 관리하는 형식으로 게임을 세이브하기도 합니다. 이런 게임들은 이런 불필요하게 세부적인 사항들을 게이머들이 보지 못 하게 하고 간편한 인터페이스를 통해 게이머들이 세이브파일들을 관리할 수 있게 해둡니다.
+
+VCS는 이런 컨셉과 그리 다르지 않습니다. VCS들은 파일 디렉토리들을 관리하기에 아주 편한 인터페이스로 구성되어 있습니다. 원하는 횟수 만큼 세이브를 할 수 있고, 원하는 세이브포인트를 특정지어 불러오기를 실행할 수도 있습니다. 그리고 컴퓨터게임들과는 다르게 용량을 효율적으로 사용하는 데에는 탁월한 성능을 보여주죠. 대부분의 어떤 코드의 버전을 바꿀 때에는 소수의 파일들만 살짝 바꾸게되죠. 코드자체가 아주 많이 바뀌는 경우는 드뭅니다. 디렉토리 전체를 세이브하는 것 보다는 버전과 버전사이의 차이를 세이브하는 것이 용량을 효율적으로 쓰는 VCS의 비밀입니다.
+
+=== 분산 제어 ===
+
+여러분이 어려운 컴퓨터 게임을 한다고 생각해보세요. 너무 어렵기 때문에 전 세계의 프로게이머들이 팀을 구성해 이 게임을 끝내보겠다고 합니다. 게임을 빨리 끝내는 것에 초점을 두는 스피드런 방식의 게임 스타일이 현실적인 예시 이지요: 각기 다른 특기를 가지고 있는 게이머들이 한 게임 안에서 각자 자신있는 부분을 담당함으로써 성공적인 결과를 만들어내는 것을 예로 들어봅니다.
+
+어떻게 시스템을 구축해 두어야 게이머들이 서로의 세이브파일들을 쉽게 업로드 하거나, 바통을 이어 받을 수 있을까요?
+
+프로그래밍 프로젝트들은 예전에 중앙 집중식 VCS를 사용하였습니다. 한 개의 서버가 모든 세이브파일을 저장했었지요. 그 서버외에는 아무 것도 그 세이브파일들을 관리할 수 없었습니다. 게임으로 말하자면, 게이머들은 각자의 게임기에 몇 개의 세이브파일들을 가지고 있었고, 게임을 다른 사람으로부터 이어받아 진행하고 싶을 때에는, 모든 세이브파일들이 저장되어있는 중앙서버에서 파일들을 다운로드 받은 후, 게임을 좀 하다가, 다시 다른 게이머들이 진행할 수 있게 그 서버에 업로드 해 놓아야 합니다.
+
+만약에 어떤 한 게이머가 예전에 세이브 해두었던 오래된 파일을 불러오고 싶다면 어떻게 될까요? 현재 최신의 세이브 시점은 누군가 게임의 전 단계에서 다음 단계에 필요한 아이템을 주워오지 않아서 아무리 잘 해도 게임을 진행 할수없는 상태로 저장이 되어있을지도 모르고, 그런게 아니라면 그들은 아마도 세이브파일 두 개를 비교하여 한 특정 게이머가 얼마나 진행을 하였는지 알고 싶어할지도 모릅니다.
+
+예전 세이브 파일을 불러오고 싶은 이유는 여러가지일 수 있습니다, 그러나 방법은 한 가지일 수 밖에 없지요. 중앙서버에서 불러오는 방법 말입니다. 더 많은 세이브파일을 원할 수록 서버와의 통신이 더 잦아질 수 밖에 없지요.
+
+(Git을 포함하여) 새로운 세대의 VCS들은 분산 제어를 기본으로 합니다. 예전의 중앙관리 방식의 보편화된 방식이라고 생각하면 되지요. 한 게이머가 서버로부터 (가장 최신) 세이브파일을 받는다해도 그 하나만 받게되는 것이 아니라 모든 예전 버전의 세이브파일까지도 같이 받게 되는 겁니다. 마치 중앙서버를 각자의 컴퓨터에 미러링한다고 보시면 됩니다.
+
+그렇기에 처음에는 Git을 셋업할 때 시간이 많이 걸릴 수 있습니다. 특히, 그 세이브파일이 오래되었고, 아주 긴 역사를 가지고 있다면 말이지요. 그러나 이 것은 길게보면 아주 효율적인 방법입니다. 이 방법을 통해 즉시 이득을 볼 수있는 점을 따진다면, 예전 세이브파일을 원할 때 중앙서버와 교신을 하지 않아도 된다는 점이지요.
+
+=== 멍청한 미신 ===
+
+사람들이 분산 제어 시스템에 대해 일반적으로 오해하는게, 분산 제어 시스템은 공식적인 중앙 저장소가 필요한 프로젝트에는 적합하지 않다고 생각하는 것입니다. 이 것은 말도 안되는 오해이지요. 이 오해는 누군가의 사진을 찍는다는 것은 그 피사체의 영혼을 같이 담아버린다는 말도 안 되는 논리와 같습니다. 다시 말하면, 중앙 저장소의 파일을 카피하여 분산 제어하는 것이 중앙 저장소의 중요성을 훼손한다는 것이 아닙니다.
+
+첫번째 이해해야하는 부분이, 중앙 버전 관리 시스템이 할 수 있는 모든 일들은 잘 짜여진 분산 관리 시스템이 더 잘 할수 있다는 것을 인식해야 한다는 것입니다. 네트워크상의 자원들은 기본적으로 로컬상의 자원들보다 시간적으로나 물질적으로 비경제적일 수 밖에 없습니다. 물론, 나중에도 말씀드리겠지만 분산 제어 시스템도 문제점이 없는 시스템은 아닙니다. 그러나 주먹구구식의 생각으로 중앙 관리 시스템과 분산 관리 시스템을 비교하는 일은 없어야 할 것입니다. 다음 인용문이 이것을 대변해 줍니다.
+
+"규모가 작은 프로젝트들은 시스템의 부분적인 특성만으로도 실행 할 수 있겠지만,
+이런 프로젝트들을 스케일업 할 수 없는 확장성이 낮은 시스템으로 계속 실행하는 것은 마치
+옛 로마숫자를 이용해 계산기를 두드리는 것과 같다."
+
+더욱이 당신의 프로젝트는 당신이 처음 생각했던 것보다 더 거대한 일이 될지도 모르는 겁니다. 처음부터 Git을 사용한다는 것은 단순히 병뚜껑을 여는데 스위스아미나이프를 들고 다니는 것과 같은 것입니다. 그러나, 어느 날, 드라이버가 필요할 경우, 당신은 병따개만 들고다니지 않았다는 사실에 안도의 한 숨을 쉬게 될 것입니다.
+
+=== 병합 충돌 ===
+
+이 주제를 설명하기 위해서는 컴퓨터게임에 비유하는 것은 더 이상 적합하지 않을 수 있습니다. 대신에 여기서는 문서편집에 비유해서 설명드리도록 하죠.
+
+다음 예시를 생각해 봅시다. 앨리스(Alice)는 파일을 편집하던 도중에 새로운 줄을 첫 줄로 추가하고, 밥(Bob)은 그 같은 파일의 마지막에 코드 한 줄을 더한다고 가정합시다. 그리고 그들은 편집된 파일을 각자 중앙서버에 업로드 합니다. 대부분의 시스템은 자동으로 두 사람이 각자 한 편집을 받아들이고 병합할 것입니다. 결과적으로는 앨리스와 밥 두 사람의 편집이 모두 한 파일에 적용되겠죠.
+
+자 이제 앨리스와 밥이 어떤 파일의 정확히 같은 부분에서 서로 다른 편집을 한다고 가정해 봅시다. 이럴 경우에는 인간의 직접적인 개입없이는 온순한 편집이 불가능 하겠지요? 누가 편집을하던 두번째로 편집하는 사람은 작업을 결합하는 과정에서 오류메세지 ("_merge conflict_")를 볼 수밖에 없겠지요. 이런 오류메세지를 피하기 위해선 한 사람만의 작업을 선택하거나 두 사람의 작업을 아우를 수 있는 새로운 코딩작업을 추가로 해줘야하는 번거로움이 발생하지요.
+
+예시보다 더 복잡한 상황이 일어날수도 있습니다. VCS는 간단한 상황들을 알아서 해결해 주고, 어려운 상황은 인간의 손에 맡기지요. 이런 VCS의 행동은 대체적으로 조정가능합니다.
diff --git a/ko/multiplayer.txt b/ko/multiplayer.txt
new file mode 100644
index 00000000..7428c6ad
--- /dev/null
+++ b/ko/multiplayer.txt
@@ -0,0 +1,217 @@
+== Git은 멀티플레이어 ==
+
+제가 과거에 단독 개발자였던 시절부터 Git을 사용해 오고있었습니다.
+그 당시엔 여태까지 소개했던 많은 명령어들 중 *pull*과 *clone*정도만 사용하여
+같은 프로젝트를 여러 디렉토리에 저장하는데 사용하였습니다.
+
+시간이 지난 후 Git에 제가 만든 코드를 올리고 싶었고 다른 개발자들이
+한 작업도 반영하고 싶었습니다. 저는 전 세계의 많은 개발자들을
+관리하는 방법을 배워야 했습니다. 다행히도 이런 일을 도와주는 것은 Git의 가장 큰 힘입니다.
+Git이 존재하는 이유이기도 하지요.
+
+=== 난 누굴까? ===
+
+각 commit은 작성자의 이름과 작성자의 이메일주소를 저장합니다. 이 목록은 *git log*를 사용해 조회할 수 있습니다.
+기본설정 상 Git은 시스템에 이미 기본으로 세팅이 되어있는 정보를 이용해 작성자의 이름과 이메일주소를 저장합니다.
+그러나 수동으로 이름과 이메일주소를 설정하려면:
+
+ $ git config --global user.name "John Doe"
+ $ git config --global user.email johndoe@example.com
+
+를 사용하여 지정해 주십시오.
+
+현재 사용중인 repository에만 한정적으로 사용할 수 있는 이름이나 이메일을 설정하려면 위 명령어에서 *--global*을 사용하지마세요.
+
+=== SSH, HTTP를 통한 Git 사용 ===
+
+웹 서버에 관한 SSH 접근권한을 보유하고 있다고 합니다. 그러나 Git은 아직 설치되어 있지않다고 가정합니다. 기존 프로토콜만큼 효율적이진 않겠지만, Git은 HTTP를 통해 데이터 교환이 가능합니다.
+
+우선 기본적으로 컴퓨터에 Git을 다운받아서 설치합니다. 그리고 웹 디렉토리에 저장소를 만듭니다:
+
+ $ GIT_DIR=proj.git git init
+ $ cd proj.git
+ $ git --bare update-server-info
+ $ cp hooks/post-update.sample hooks/post-update
+
+Git의 예전 버전에선 복사를 지시하는 명령어가 안 들을 수 있습니다. 그렇다면:
+
+ $ chmod a+x hooks/post-update
+
+이제 아무 클론에서 SSH를 통해 당신의 작업을 업로드할 수 있습니다:
+
+ $ git push web.server:/path/to/proj.git master
+
+다른 사람들은 당신의 작업을 다운받으려면 다음 명령어를 쓰면 될겁니다:
+
+ $ git clone http://web.server/proj.git
+
+=== 모든 것은 Git을 통한다 ===
+
+서버나 인터넷 연결없이 저장소를 동기화시키고 싶다고요?
+긴급하게 수정할 것이 발견되었다고요? <>.
+다양한 매개체를 통해서 repository의 파일들을 옮길 수 있지만, 정말 효율적인
+방법은 *git bundle* 명령어를 쓰는 것입니다.
+
+보내는 이가 '묶음 (bundle)'을 만듭니다:
+
+ $ git bundle create somefile HEAD
+
+ 그리고 다른 장소로 그 묶음, +somefile+을 어떻게든 옮겨야한다고 가정합시다: 이메일로 보내야할수도 있고, USB드라이브로 보내거나, *xxd* 프린트로 뽑아서 전송하던지, OCR 스캐너로 전송하던지, 전화로 직접 이야기하던지, 연기로 신호를 보내던지 등 어떻게든 보내야합니다. 파일을 받을 사람들은 이 묶음으로부터의 commit을 다음 명령어를 이용하여 간단히 받을 수 있습니다:
+
+ $ git pull somefile
+
+ 파일을 받는 사람들은 빈 repository에서도 이 명령어를 사용할 수 있습니다. 파일의
+ 사이즈가 작아 보임에도 불구하고 +somefile+ 은 저장소의 본 모습을 담고 있습니다.
+
+큰 프로젝트에서는 묶음만들기를 좀 더 효율적으로 하기위해서 버전차이만을
+묶어줍니다. 예를 들어서 "1b6d"의 hash가 달린 commit 이 가장 최근에 보내는 이와 받는 이 사이에 공유된 commit이라고 가정해 봅니다:
+
+ $ git bundle create somefile HEAD ^1b6d
+
+너무 자주 이렇게 한다면, 어떤 commit이 가장 최근 것인지 기억하지 못할 수 있습니다. 도움말에서는 태그를 이용해 이런 문제점들을 피하라 명시합니다. 풀어서 말하자면 어떤 묶음을 보낸 후에는:
+
+ $ git tag -f lastbundle HEAD
+
+그리고 새로운 묶음을 만들어 줍니다:
+
+ $ git bundle create newbundle HEAD ^lastbundle
+
+=== 패치: 세계적 통화 ===
+
+패치는 컴퓨터와 인간이 쉽게 알아들을 수 있는 언어로 파일의 변화를
+텍스트로 표현할 수 있는 방법입니다. 전 세계 어떤 개발 공간에서나 이런 식으로 파일의 변화를 시도합니다.
+어떠한 VCS를 쓰던간에 개발자들에게 패치를 이메일로 보낼 수도 있습니다. 그 개발자들이
+그 이메일을 읽을 수만 있다면 그들은 당신이 편집을 한 작업기록을 손쉽게 볼 수 있을겁니다. 즉, 온라인용 Git repository를 만들 필요가 없다는 말이지요.
+
+첫 장에서 본 명령어를 다시 한번 해봅시다:
+
+ $ git diff 1b6d > my.patch
+
+위 명령어는 간단한 패치를 생성하여 이메일로 보낼수 있게 도와줍니다. Git 저장소에서 다음을 따라해보세요:
+
+ $ git apply < my.patch
+
+위 명령어를 사용하여 패치를 적용시킵니다.
+
+작성자의 이름과 싸인이 기록되어야하는 좀 더 공식적인 환경에서는
+그에 상응하는 패치 (1b6d 이후의 작업)를 만들기위해 다음 명령어를 사용합니다:
+
+ $ git format-patch 1b6d
+
+이렇게 만든 파일묶음은 *git-send-email*을 사용하여 보낼 수 있습니다. 보내고싶은 commit 묶음을 수동으로 지정해줄 수도 있습니다:
+
+ $ git format-patch 1b6d..HEAD^^
+
+받는 쪽에서는 이메일을 받을 때는 받은 txt형태의 패치 파일을 저장한 후:
+
+ $ git am < email.txt
+
+ 이 명령어는 새로받은 패치를 적용시키고 작성자의 정보가 포함된 새로운 commit을 만듭니다.
+
+브라우저 상으로 이메일을 수신한다면, 당신의 이메일 클라이언트에서 첨부된 패치의 본 코드의 형태를 확인해야 할수도 있습니다.
+
+mbox-를 기반으로하는 이메일 클라이언트는 약간의 문제점들이 있습니다. 그러나
+이런 방식의 클라이언트를 쓸만한 사람이라면 손쉽게 튜토리얼을 읽지않고도
+해결할 수 있을것입니다.
+
+=== 죄송합니다. 주소를 옮겼습니다 ===
+
+Repository를 클로닝한 후 *git push*나 *git pull*을 사용하면 원래의 URL에서 해당
+명령어를 실행합니다. Git은 어떤 원리로 이렇게 하는 것일까요? 그 비밀은
+클론을 만들때 생선된 config 옵션에서 찾을 수 있습니다. 한번 볼까요?:
+
+ $ git config --list
+
++remote.origin.url+ 옵션은 URL 소스를 통제합니다; "origin"은 원래 repository에
+붙여진 별명이라고 보면됩니다. Branch에 "master"라고 이름이 붙듯이 말이죠. 그말은
+이 이름을 바꾸거나 지울 수 있는데 할 필요는 없다는 것입니다.
+
+제일 처음 사용하던 repository가 옮겨지면, URL을 수정해 주어야 합니다:
+
+ $ git config remote.origin.url git://new.url/proj.git
+
++brach.master.merge+ 옵션은 *git pull*로 당겨올 수 있는 branch를
+설정하여 줍니다. 처음으로 클론을 생성하였을때, 그 클론의 branch는
+그 클론을 만들어온 repository의 현재 사용중인 repository와 같게 설정이 되어있습니다. 그렇기 때문에 현재 작업 헤드가 다른 branch로 옮겨갔었다고 하더라도, 추후의 당겨오기는 본래의 branch를 따를 수 있게 해줄 것 입니다.
+
+본 옵션은 처음에 +branch.master.remote+옵션에 기록되어 있는 클론의 대상 repository에만 적용됩니다.
+다른 저장소에서 당겨오기를 실행한다면, 구체적으로 어떤 나뭇가지에서 당겨오길 원하는지
+설정해주어야 합니다:
+
+ $ git pull git://example.com/other.git master
+
+이 것은 왜 전에 보여드렸던 *push*와 *pull* 예제에 다른 argument가 붙지 않았었는지
+설명하여 줍니다.
+
+=== 원격 branch들 ===
+
+어떠한 repository를 클론할 때에는 그 클론의 모든 branch를 클론하게 됩니다. Git은 이 사실을 은폐하기에
+당신은 클론을 하면서 몰랐을지도 모릅니다: 그러니 당신은 직접 Git에게 물어보아야 합니다. 이 설정은 원격 repository에 있는 branch들은 당신의 branch들과 꼬이게하는 일을 없게 해줍니다. 그래서 초보자들이 Git을 사용할 수 있는 것이고요.
+
+다음 명령어를 이용하여 숨겨진 branch들을 포함해서 모두 나열합니다:
+
+ $ git branch -r
+
+당신은 다음과 비슷한 결과물들을 보게될 것입니다:
+
+ origin/HEAD
+ origin/master
+ origin/experimental
+
+이 결과는 각 행마다 원격 repository의 HEAD와 branch를 보여주며, 다른 Git 명령어들과
+함께 사용될 수 있습니다. 예를 들면, 당신은 지금 많은 commit을 하였다고 먼저 가정합니다. 그러고는 가장 최근에 가져온 버젼과 비교를 하고싶다고 생각해봅니다. SHA1 해쉬를 찾아서 확인할 수도 있지만 다음 명령어로 더 간단히 비교할 수 있습니다:
+
+ $ git diff origin/HEAD
+
+아니면 "experimental" 나뭇가지가 지금 어떠한 상태인지 알아낼 수도 있습니다.
+
+ $ git log origin/experimental
+
+=== 다수의 원격 repository ===
+
+당신 외의 두명의 개발자가 프로젝트를 공동으로 진행하고 있다고 가정합니다. 그리고 그 둘의
+작업상황을 주시하고 싶습니다. 당신은 다음 명령어를 사용함으로써 하나 이상의 repository를
+추적할 수 있습니다:
+
+ $ git remote add other git://example.com/some_repo.git
+ $ git pull other some_branch
+
+이제 두번째 repository의 branch로 병합을 시도하였으며 모든 repository의 모든 branch에
+대한 접근권한이 생겼습니다.
+
+ $ git diff origin/experimental^ other/some_branch~5
+
+그러나 내 작업과 관련없이 버전의 변화를 비교해내는 방법은 무엇일까요? 풀어말하자면
+그들의 branch를 보는 동시에 그들의 작업이 내 작업에 영향받지않게 하고싶다는 것입니다. 그렇다면
+간단하게 당겨오기 보다는:
+
+ $ git fetch # 태초의 repository로부터 물어옵니다. 디폴트 명령어.
+ $ git fetch other # 다른 개발자의 repository를 물어옵니다.
+
+작업기록들만을 가져오는 명령어들입니다. 현재 작업중인 디렉토리는 영향을 받지않을 것이지만, 로컬 사본을
+가지고 있기에 우리는 이제 어느 repository의 어떤 branch라도 Git 명령어를 사용하여 활용할 수 있습니다.
+
+Pull은 간단히 풀어서 설명하면 *fetch(물어오기)* 후 *merge(병합하기)*를 합친 하나의
+고급명령어라고 말할 수 있습니다. 우리는 마지막 으로 한 commit을 현재 작업에 병합하길 원하기 때문에
+주로 *pull(당겨오기)*를 사용하게 될 것입니다; 위에 설명한 상황은 특수상황이지요.
+
+*git help remote*에는 원격 repository를 삭제하는 방법, 특정 branch를 무시하는 방법 외에
+많은 것을 볼 수 있습니다.
+
+=== 나만의 취향 ===
+
+저는 작업을 할때 다른 개발자들이 제가 당겨오기를 실행할 수 있게 항시 준비해두는 것을 선호합니다.
+어떠한 Git 호스팅 서비스는 클릭 한 번만으로도 쉽게 이를 행할 수 있게 도와주는 것도 있습니다.
+
+어떤 파일꾸러미를 물어온 후에는 Git 명령어들을 사용하여 프로젝트가 잘 정리되어 있길 빌며
+변화 기록을 조회합니다. 그러고는 저의 작업을 병합합니다. 그 후 제 작업이 맘에 들 경우
+메인 저장소에 밀어넣기 합니다.
+
+제가 다른 사람들로부터 많은 도움을 받는 스타일은 아니지만, 이러한 제 작업방식을
+추천드리고 싶습니다. 다음 링크를 한 번보세요.
+http://torvalds-family.blogspot.com/2009/06/happiness-is-warm-scm.html[Linus Torvalds의
+블로그 포스팅].
+
+Git의 세상에 거주하는 것은 패치 파일들을 만들어 배포하는 것보다 더 효율적입니다. Git은 단순한 버전관리 외에도 작업을 행한 사람의 이름, 이메일주소, 작업날짜를 같이 기록하여줍니다.
\ No newline at end of file
diff --git a/ko/preface.txt b/ko/preface.txt
new file mode 100644
index 00000000..8c6fb207
--- /dev/null
+++ b/ko/preface.txt
@@ -0,0 +1,64 @@
+= Git Magic =
+Ben Lynn
+2007년 8월
+
+== 서문 ==
+
+http://git-scm.com/[Git] 은 버전 관리계의 스위스아미나이프 정도로 보면 됩니다. 아주 유연하고 믿을 수 있지만 그만큼 배우기는 어려울 수도있는 이 Version Control System을 마스터 해봅시다!
+
+Arthur C. Clarke는 충분히 발전한 기술은 마술과 같다고 말하였습니다. Git도 마찬가지입니다. 초보자들은 Git이 어떻게 돌아가는지 알 필요가 없으며 Git이라는 간단한 장치가 어떻게 친구들과 적들을 놀라게 하는지만 알면됩니다^^.
+
+세부사항들을 설명하는 대신에, 우리는 몇몇 기능들의 대략적인 설명을 하려합니다. 여기에 설명된 기능들을 자주 사용하다 보면 각각의 명령어들이 어떻게 작동하는지 알게 될 것입니다. 그리고 그 명령어들을 적용하여 새로운 일들을 해낼 수 있겠지요.
+
+.번역판
+
+ - link:/\~blynn/gitmagic/intl/zh_cn/[Simplified Chinese]: by JunJie, Meng and JiangWei. Converted to link:/~blynn/gitmagic/intl/zh_tw/[Traditional Chinese] via +cconv -f UTF8-CN -t UTF8-TW+.
+ - link:/~blynn/gitmagic/intl/fr/[French]: by Alexandre Garel, Paul Gaborit, and Nicolas Deram.
+ - link:/~blynn/gitmagic/intl/de/[German]: by Benjamin Bellee and Armin Stebich; also http://gitmagic.lordofbikes.de/[hosted on Armin's website].
+ - link:/~blynn/gitmagic/intl/it/[Italian]: by Mattia Rigotti.
+ - link:/~blynn/gitmagic/intl/ko/ [Korean]: by John J. Han; also https://sites.google.com/site/drinkhanjohn/useful-links/[hosted on John's website].
+ - link:/~blynn/gitmagic/intl/pl/[Polish]: by Damian Michna.
+ - link:/~blynn/gitmagic/intl/pt_br/[Brazilian Portuguese]: by José Inácio Serafini and Leonardo Siqueira Rodrigues.
+ - link:/~blynn/gitmagic/intl/ru/[Russian]: by Tikhon Tarnavsky, Mikhail Dymskov, and others.
+ - link:/~blynn/gitmagic/intl/es/[Spanish]: by Rodrigo Toledo and Ariset Llerena Tapia.
+ - link:/~blynn/gitmagic/intl/uk/[Ukrainian]: by Volodymyr Bodenchuk.
+ - link:/~blynn/gitmagic/intl/vi/[Vietnamese]: by Trần Ngọc Quân; also http://vnwildman.users.sourceforge.net/gitmagic/[hosted on his website].
+
+.그 외의 에디션
+
+ - link:book.html[Single webpage]: CSS 없는 HTML 버전.
+ - link:book.pdf[PDF file]: 프린팅 버전.
+ - http://packages.debian.org/gitmagic[Debian package], http://packages.ubuntu.com/gitmagic[Ubuntu package]: 이 웹사이트의 사본. Handy http://csdcf.stanford.edu/status/[when this server is offline].
+ - http://www.amazon.com/Git-Magic-Ben-Lynn/dp/1451523343/[Physical book [Amazon.com]]: 64 pages, 15.24cm x 22.86cm, black and white. 전기가 들어오지 않을 때 유용.
+
+=== 고맙습니다! ===
+
+많은 분들 께서 번역에 힘써주셔서 저는 어떻게 몸둘 바를 모르겠습니다. 이 분들을 통해
+더 많은 독자들을 만날 수 있어서 정말 기쁘고 감사드립니다.
+
+Dustin Sallings, Alberto Bertogli, James Cameron, Douglas Livingstone, Michael Budde, Richard Albury, Tarmigan, Derek Mahar, Frode Aannevik, Keith Rarick, Andy Somerville, Ralf Recker, Øyvind A. Holm, Miklos Vajna, Sébastien Hinderer, Thomas Miedema, Joe Malin, Tyler Breisacher, Sonia Hamilton, Julian Haagsma, Romain Lespinasse, Sergey Litvinov, Oliver Ferrigni, David Toca, Сергей Сергеев, Joël Thieffry, and Baiju Muthukadan 수정 및 편집에 힘써주셧습니다..
+
+François Marier 는 Daniel Baumann이 개발한 Debian 패키지를 관리합니다.
+
+
+고마워 해야할 사람들이 많지만은 여기에 다 쓸수는 없는 노릇입니다.
+
+그래도 만약에 제가 이 웹사이트에 실수로 이름을 개제하지 않았다면 연락을 주시거나 패치를 만들어 주세요!
+
+=== 라이센스 ===
+
+이 가이드는 http://www.gnu.org/licenses/gpl-3.0.html[the GNU General Public License version 3] 통해 발간되었습니다. 자연스레 소스콛드들은 Git 저장소에
+저장되어있습니다:
+
+ $ git clone git://repo.or.cz/gitmagic.git # Creates "gitmagic" directory.
+
+아니면 다음 미러사이트들에도 소스코드가 저장되어 있을겁니다.:
+
+ $ git clone git://github.com/blynn/gitmagic.git
+ $ git clone git://gitorious.org/gitmagic/mainline.git
+ $ git clone https://code.google.com/p/gitmagic/
+ $ git clone git://git.assembla.com/gitmagic.git
+ $ git clone git@bitbucket.org:blynn/gitmagic.git
+
+GitHub, Assembla, Bitbucket은 사적인 저장소를 지지합니다. Assembla와 Bitbucket은
+무료로 제공되고 있습니다.
diff --git a/ko/secrets.txt b/ko/secrets.txt
new file mode 100644
index 00000000..3a7a85d0
--- /dev/null
+++ b/ko/secrets.txt
@@ -0,0 +1,204 @@
+== 비밀을 벗겨내다 ==
+
+Git의 안을 들여다보고 Git이 어떻게 작동하는지 알려드리겠습니다. 너무 디테일한 것들은 알아서 빼놓고 설명해드리겠습니다.
+그래도 자세히 알고 싶은 분들은: http://schacon.github.com/git/user-manual.html[the user manual]로 가시길 바랍니다.
+
+=== 보이지 않는 능력 ===
+
+Git은 어떻게 눈에 띄지않게 강력한 툴일 수 있을까요? 습관적으로 하게되는 commit과 병합을 제외하고, VCS자체가 컴퓨터에 설치되지 않은 것 같아보일 때가 있습니다.
+
+다른 VCS들은 사용할때 쓸때없이 많은 절차와 검열 등으로 고생할 수 있습니다. 파일의 보안상태가 '읽기전용'으로 세팅되어 작업을 하려고 할 때마다 중앙서버에 승인을 요청해야 할 경우도 빈번합니다.
+그리고 VCS의 유저들이 많아질수록 업무처리 속도가 현저히 떨어질수도 있습니다. 그리고 중앙서버나 네트워크가 다운 될 경우에는 아무런 작업을 할 수 없죠.
+
+반면에, Git은 당신의 로컬컴퓨터 디렉토리에 '.git'디렉토리를 형성하여 그곳에 작업기록을 하게됩니다. 그 기록은 온전히 당신만의 것이죠. 그렇기에 오프라인 상태에서도 작업을 끊기지 않고 진행할 수 있습니다.
+그리고 작업중인 파일에 대해 모든 권한을 가지고 있게 해주죠.
+
+=== 진실성 ===
+
+대부분의 사람들은 크립토그래피를 어떤 정보를 비밀스럽게 숨기는 정도로 생각합니다. 그러나 크립토그래피의 진정한 목적은 정보를 보안하는 것이죠. 크립토그래피로 보호되는 hash는 데이터가 공격받거나 지워질 위험으로부터 보호해줍니다.
+
+SHA1 hash는 고유의 160-비트 ID 번호로 생각하시면 됩니다. 그리고 이 번호는 당신이 평생, 또는 열번의 삶을 살 정도의 시간에, 쓸 byte에 부여되는 번호이기에 보안이 철저합니다.
+
+SHA1 hash 자체 역시 byte로 구성되어 있기에 SHA1 hash의 hash를 만드는 것도 가능합니다. 이건 생각보다 유용한 기능입니다: 'hash chains'를 한번 살펴보세요. 우리는 나중에 Git이 이 기능을 어떻게 사용해서 효율적으로 데이터를 보호하는지 살펴보겠습니다.
+
+짧게 말하자면, Git은 당신의 모든 데이터를 `.git/objects`섭디렉토리에 저장합니다. 그리고 보통의 파일이름대신 각 파일에 지정된 ID를 통해서 이 파일들을 찾을 수 있습니다. 그렇기에 Git은 보통의 파일시스템을 뭔가 굉장히 효율적인 데이터베이스로 변화시켜줍니다.
+
+=== 똑똑함 ===
+
+어떻게 Git이 당신이 파일의 이름을 변경할 때 Git에게 이름을 바꾼다 말한적도 없는데 알수 있을까요? *git mv*를 실행할수도 있겠지만 그것은 *git rm*을 사용하고 *git add*를 사용하는 것과 같습니다.
+
+Git은 단순화된 지침으로 재설정된 파일명을 찾아내고 버전사이의 카피들을 만들어냅니다. Git은 코드들이 옮겨지고 카피되고 지워질 경우를 다 알아낼수 있죠. 모든 경우의 수를 다 알수는 없겠지만, Git은 대부분을 알아채고 있고 이 자동화된 기능은 날이 갈수록 발전하고 있습니다.
+
+
+=== 색인화 ===
+
+Git은 Git이 트랙킹하는 모든 파일들의 크기, 생성된 시간, 마지막 편집시간을 색인 (index)를 이용해서 기록하여 둡니다. 만약에 어떤 파일에 작업하여 변화가 생겼다면 Git은 현 파일상태와 인덱스에 저장되어있는 상태를 비교하여 파일의 변화를 감지합니다. 만약에 서로간의 차이가 없다면 Git은 그 파일이 가장 최신버전으로 업데이트되었다고 생각하고 더 이상 읽지 않습니다.
+
+인덱스 정보를 읽는 작업은 파일을 읽는 것보다는 훨씬 빠르게 진행되니 당신이 한 작업들은 Git이 아주 빠르게 업데이트 해줄 것입니다.
+
+인덱스는 마치 중간 대기 구역과 같다고 말씀드린 적이 있습니다. 왜 그렇게 얘기 했을까요? *Add* 명령어는 파일들을 순전히 업데이트 시켜 데이터베이스에 업데이트 하지만
+*commit*은 (별도의 옵션을 사용하지 않는다는 전제하에) 자체적인 로컬데이터베이스에 있는 파일들에 대한 commit만 진행하지요.
+
+=== Git의 근원 ===
+
+http://lkml.org/lkml/2005/4/6/121[Linux Kernel Mailing List post] 에서 Git의 역사를 나열하여 설명해줍니다. Git의 역사학자들에게 정말 흥미있는 웹사이트지요.
+
+=== 오브젝트 데이터베이스 ===
+
+데이터의 모든 버전은 '오브젝트 데이터베이스'에 보관되며, 이 데이터베이스는 `.git/objects`의 섭디렉토리에 상주하고 있습니다. `.git/`에 있는 다른 파일들은 더 적은 정보를
+담고 있지요 (인덱스, branch 이름, 태그, 설정 정보, 로그, head commit의 위치 등). 오브젝트 데이터베이스는 Git의 기본이지만 우아하고 또 Git의 힘의 원천입니다.
+
+`.git/objects'에 있는 파일들은 각각 오브젝트입니다. 그리고 크게 세가지 오브젝트로 나눌수 있습니다:
+'blob' 오브젝트, 'tree' 오브젝트, and 'commit' 오브젝트.
+
+=== Blob 오브젝트 ===
+
+첫째, 마술을 보여드리겠습니다. 우선 아무 파일 이름을 선택하십시오. 빈 디렉토리에서 :
+
+ $ echo sweet > YOUR_FILENAME
+ $ git init
+ $ git add .
+ $ find .git/objects -type f
+
++.git/objects/aa/823728ea7d592acc69b36875a482cdf3fd5c8d+ 을 보게 될 것입니다.
+
+저는 파일이름을 알지도 못하는데 이걸 제가 어떻게 알까요? 왜냐하면
+
+ "blob" SP "6" NUL "sweet" LF
+
+의 SHA1 hash 는 aa823728ea7d592acc69b36875a482cdf3fd5c8d 이고,
+SP 는 공간이며, NUL 는 0 바이트이고, LF는 라인피드이기 때문입니다. 직접 확인해보시려면 다음 명령어를 입력하세요:
+
+ $ printf "blob 6\000sweet\n" | sha1sum
+
+Git은 콘텐츠 주소를 지정하는 것이 가능합니다: 파일은 파일 이름에 따라 저장되지 않습니다.
+대신에 hash로 저장이 되며 이런 정보는 blob 오브젝트라고 불리우는 곳에 저장되어 있지요.
+우리는 hash를 파일 내용에 대한 고유 ID로 생각할 수 있습니다. 그래서
+어떤 의미에서 우리는 파일의 내용에 따라 주소를 지정하는 것으로 생각이 가능합니다. 초기`blob 6`는
+오브젝트 타입과 크기를 저장해 놓은 header나 다름없습니다; 단지 내부 부기를 단순화합니다.
+
+따라서 저는 당신이 보게 될 것을 쉽게 예측할 수 있었습니다. 파일 이름은 관련이 없습니다.
+내부 데이터만을 이용해 blob 오브젝트를 구성하는게 가능합니다.
+
+그러면 당신은 동일한 파일이 어떻게되는지 궁금 할 수 있습니다. 우선 아무런 파일 이름을 사용해 복사본을 추가해보십시오.
++ .git / objects +의 내용은 몇개의 복사본을 추가해도 동일합니다. Git은 데이터를 한 번만 저장합니다.
+
+별개로, + .git / objects + 내의 파일은 zlib로 압축되어 있으므로
+그들을 직접 보지 마십시오. http://www.zlib.net/zpipe.c[zpipe -d] 를 통해 필터링을 해서
+보시던지, 아니면 다음 명령어를 실행해 보시면 됩니다.:
+
+ $ git cat-file -p aa823728ea7d592acc69b36875a482cdf3fd5c8d
+
+주어진 오브젝트를 예쁘게 인쇄해줍니다.
+
+=== Tree 오브젝트 ===
+
+그러나 파일 이름은 어디에 간거죠? 그들은 어떤 단계에서 어딘가에 저장되어야합니다.
+Git은 커밋 중에 파일 이름을 찾습니다.
+
+ $ git commit # Type some message.
+ $ find .git/objects -type f
+
+이제 3 개의 개체를 보게 될 것입니다. 이번에는 당신이 선택한 파일 이름에 부분적으로 의존하기 때문에 두 개의 새 파일이 무엇인지 제가 말씀드릴 수 없습니다. ``rose''를 파일이름을 지정한 것으로 가정하여 진행하겠습니다. 그렇게 설정하시지 않은 경우 기록을 다시 작성하여 그렇게 지정한 것처럼 보이게 할 수 있습니다.
+
+You should now see 3 objects. This time I cannot tell you what the 2 new files are, as it partly depends on the filename you picked. We'll proceed assuming you chose ``rose''. If you didn't, you can rewrite history to make it look like you did:
+
+ $ git filter-branch --tree-filter 'mv YOUR_FILENAME rose'
+ $ find .git/objects -type f
+
+그럼 이제 +.git/objects/05/b217bb859794d08bb9e4f7f04cbda4b207fbe9+를 보실 수 있을겁니다. 왜냐하면 이것이
+SHA1 hash이기 때문입니다:
+
+ "tree" SP "32" NUL "100644 rose" NUL 0xaa823728ea7d592acc69b36875a482cdf3fd5c8d
+
+
+다음을 입력하여 이 파일에 실제로 위 내용이 포함되어 있는지 확인하십시오.
+
+ $ echo 05b217bb859794d08bb9e4f7f04cbda4b207fbe9 | git cat-file --batch
+
+zpipe으로 이 hash를 확인하는 것이 아마 쉬운 방법일 겁니다:
+
+ $ zpipe -d < .git/objects/05/b217bb859794d08bb9e4f7f04cbda4b207fbe9 | sha1sum
+
+Hash 확인은 cat-file로는 좀 어려울 수도 있습니다. 왜냐하면 압축되지 않은 원래의 파일보다 더 많은 파일을
+포함하고 있을 수 있기 때문입니다.
+
+
+This file is a 'tree' object: a list of tuples consisting of a file
+type, a filename, and a hash. In our example, the file type is 100644, which
+means `rose` is a normal file, and the hash is the blob object that contains
+the contents of `rose'. Other possible file types are executables, symlinks or
+directories. In the last case, the hash points to a tree object.
+
+If you ran filter-branch, you'll have old objects you no longer need. Although
+they will be jettisoned automatically once the grace period expires, we'll
+delete them now to make our toy example easier to follow:
+
+ $ rm -r .git/refs/original
+ $ git reflog expire --expire=now --all
+ $ git prune
+
+실제 프로젝트의 경우 일반적으로 이와 같은 명령을 피해야합니다. 이 명령어들은 백업들을 지울 수 있기 때문이죠.
+깨끗한 repository를 원한다면 일반적으로 새로운 클론을 새롭게 만드는 것이 좋습니다. 그리고 +.git+을 조작할때는
+주의하십시오: 만약에 여러가지 커맨드들이 동시에 실행 중이거나 갑작스러운 정전이 발생하면 안되잖아요.
+일반적으로 refs는 *git update-ref -d*로 삭제해야합니다. 그래도 +refs / original+를 수동으로 제거하는 것이 안전하긴 하지만요.
+
+=== Commit 오브젝트 ===
+
+우리는 3 개의 오브젝트들 중 2 개를 설명했습니다. 세 번째는 'commit'오브젝트입니다. 이 오브젝트의
+내용은 commit 메시지와 날짜 및 시간에 따라 다릅니다.
+여기에있는 것과 일치 시키려면 약간의 조정이 필요합니다.
+
+ $ git commit --amend -m Shakespeare # Commit 메시지를 바꿉니다.
+ $ git filter-branch --env-filter 'export
+ GIT_AUTHOR_DATE="Fri 13 Feb 2009 15:31:30 -0800"
+ GIT_AUTHOR_NAME="Alice"
+ GIT_AUTHOR_EMAIL="alice@example.com"
+ GIT_COMMITTER_DATE="Fri, 13 Feb 2009 15:31:30 -0800"
+ GIT_COMMITTER_NAME="Bob"
+ GIT_COMMITTER_EMAIL="bob@example.com"' # 타임스탬프와 저자를 바꿉니다.
+ $ find .git/objects -type f
+
+그럼 이제 +.git/objects/49/993fe130c4b3bf24857a15d7969c396b7bc187+ 를 보게될것 입니다.
+
+ "commit 158" NUL
+ "tree 05b217bb859794d08bb9e4f7f04cbda4b207fbe9" LF
+ "author Alice 1234567890 -0800" LF
+ "committer Bob 1234567890 -0800" LF
+ LF
+ "Shakespeare" LF
+
+
+이전과 마찬가지로 zpipe 또는 cat-file을 실행하여 직접 확인할 수 있습니다.
+이것은 첫 번째 commit이므로 부모 commit이 없지만 이제 나중에 commit을 할때마다
+항상 부모 commit을 식별하는 한 줄이 포함될것 입니다.
+
+=== 마술과 분간이 안되는 프로그램 ===
+
+Git의 비밀은 너무 단순 해 보입니다. 몇 시간 안에 몇 개의 셸 스크립트를 혼합하고 C 코드를 추가하여 몇 시간 만에 만들 수있는 것 같아 보입니다. 결국에 Git은 견고성을 위해 잠금 파일과 fsync로 장식 된 기본 파일 시스템 작업과 SHA1 해싱의 혼합으로 구성된 프로그램입니다. 실제로 이것은 Git의 초기 버전을 정확하게 설명합니다. 그럼에도 불구하고 공간을 절약하기위한 독창적인 패킹 트릭과 시간을 절약하기위한 독창적 인 인덱싱 트릭을 포함해 이제 우리는 Git이 버전 컨트롤을 위한 완벽한 데이터베이스로 거듭나게 되는지 알게되었습니다.
+
+예를 들어, 오브젝트 데이터베이스 내의 파일이 디스크에 의해 손상된 경우
+오류가 발생하면 hash가 더 이상 일치하지 않아 문제를 알려줍니다.
+기존 hash에 다른 hash를 지정해 주면서, 우리는 모든 수준에서 무결성을 유지합니다. Commit은 부분적으로
+파일을 관리하지않고 전체적으로 프로젝트를 관리하여줍니다.
+Commit의 hash를 계산하고서 모든 tree, blob 과 부모 commit들을 저장한 후에 데이터베이스에 저장합니다.
+오브젝트 데이터베이스는 정전과 같은 예상치 못한 방해에 영향을받지 않습니다.
+
+우리는 Git으로 가장 사악한 적도 물리칠수 있습니다. 만약에 누군가가
+아주 예전 버전의 프로젝트에서 파일 내용을 은밀하게 수정한다고 생각해봅시다.
+오브젝트 데이터베이스를 정상 상태처럼 보이게 유지하려면 해당 데이터베이스의 해시도 변경해야 할겁니다.
+이 말은 해당 파일을 참조하는 tree 오브젝트의 hash도 변경해야한다는 의미입니다.
+그리고 차례로 그러한 tree를 포함하는 모든 commit 오브젝트의 hash도 변경해야 한다는 거지요.
+이러면 해당 파일 이후의 commit모두 변경을 해야한다는 말이됩니다.
+이것은 공식 헤드의 hash는 나쁜 repository의 hash와 달라질 수 밖에 없다는 것입니다. 그러니
+일치하지 않는 hash의 흔적을 따라 나쁜의도로 변경된 파일을 정확히 찾아 낼 수 있습니다.
+처음에 손상된 commit도 마찬가지로 찾을 수 있습니다.
+
+짧게 말하자면, 마지막 commit을 나타내는 20 바이트가 안전하다면
+Git repository를 임의로 아무에게도 들키지 않게 조작하는 것은 불가능합니다.
+
+Git의 유명한 기능은 또 어떻습니까? branch 만들기? 병합하기? 태깅하기?
+세부 사항. 현재 head는 + .git / HEAD + 파일에 보관됩니다.
+commit 오브젝트의 hash를 포함합니다. Commit 중에 hash가 업데이트됩니다.
+Branch는 거의 동일합니다: 그것들은 +.git/refs/heads+에 저장된 파일들 입니다. 태그도 +.git/refs/tags +에 있지만
+다른 명령어들로 업데이트됩니다.
\ No newline at end of file
diff --git a/ko/translate.txt b/ko/translate.txt
new file mode 100644
index 00000000..f3bdbb1b
--- /dev/null
+++ b/ko/translate.txt
@@ -0,0 +1,31 @@
+== 부록 B: 이 가이드를 번역하기 ==
+
+다음 절차들을 따라하셔야 제 프로그램이 자동으로 빠르게 HTML과 PDF 버전의 번역본을 만들수 있습니다.
+
+우선 원본이 되는 소스를 클론하시고 폴더를 만드시는데, 폴더명을 IETF에 기재되어 있는 태그를 쓰시기 바랍니다:
+다음 링크에 들어가셔서 확인하세요,
+http://www.w3.org/International/articles/language-tags/Overview.en.php[the W3C
+article on internationalization]. 예를 들자면, 영어의 태그는 "en"이고, 일본어는 "ja"이며, 국어는 "ko"입니다.
+그리고 새로운 디렉토리에서 "en"에 들어있는 원본 txt를 번역하시면 됩니다. (번역주: 영어를 못하시고 국어를 하실수 있다면 본 가이드를 쓰시면 되겠지만 그럴 확률이 거의 없겠죠)
+
+
+For instance, to translate the guide into http://en.wikipedia.org/wiki/Klingon_language[Klingon], you might type:
+
+ $ git clone git://repo.or.cz/gitmagic.git
+ $ cd gitmagic
+ $ mkdir tlh # "tlh" is the IETF language code for Klingon.
+ $ cd tlh
+ $ cp ../en/intro.txt .
+ $ edit intro.txt # Translate the file.
+
+and so on for each text file.
+
+Edit the Makefile and add the language code to the `TRANSLATIONS` variable.
+You can now review your work incrementally:
+
+ $ make tlh
+ $ firefox book-tlh/index.html
+
+Commit your changes often, then let me know when they're ready.
+GitHub has an interface that facilitates this: fork the "gitmagic" project,
+push your changes, then ask me to merge.
diff --git a/lang-ru.conf b/lang-ru.conf
deleted file mode 100644
index f04d17a7..00000000
--- a/lang-ru.conf
+++ /dev/null
@@ -1,4 +0,0 @@
-[specialsections]
-^От редактора перевода$=preface
-^Предисловие$=preface
-^Введение.*$=sect1
diff --git a/makeover b/makeover
index 84a16455..fa6a57f9 100755
--- a/makeover
+++ b/makeover
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/usr/bin/env bash
# Extract table of contents from index.html and delete preface link.
BOOKDIR=book-$1
@@ -9,36 +9,31 @@ case $1 in
;;
esac
-gawk '
-/
/ {
- print $0
- getline
- print $0
- print "
'"$TITLE"'
"
- getline
- while (!match($0, "
")) {
- gsub("pr01.html", "index.html")
- print $0
- getline
- }
- print $0
- exit
-}
-' < $BOOKDIR/index.html > toc.tmp
+# Older AsciiDoc versions put newlines in their output.
+# To get them to work with the following, first minify the HTML output.
+cat $BOOKDIR/index.html \
+ | grep -o '
.*' \
+ | sed 's!
.*!!' \
+ | sed 's!!index.html!g' \
+ | sed 's!
!
'"$TITLE"'
&!' \
+ > toc.tmp
# For every file except the index...
for FILE in $BOOKDIR/*.html
do
+ sed '//a ' -i $FILE
if [ $FILE != "$BOOKDIR/index.html" ]
then
# Prepend "Git Magic - " to titles of all pages.
sed '// s//&'"$TITLE"' - /' -i $FILE
sed 's/pr01\.html/index.html/g' -i $FILE
+ # Insert newline after `body` tag.
+ sed 's/]*>/&\n/' -i $FILE
# Paste ToC into beginning and add div section with class content for CSS.
- sed '/
}' -i $FILE
- sed '/^<\/body/i ' -i $FILE
+ sed 's!!&!' -i $FILE
fi
done
diff --git a/pl/basic.txt b/pl/basic.txt
new file mode 100644
index 00000000..9171def8
--- /dev/null
+++ b/pl/basic.txt
@@ -0,0 +1,196 @@
+== Pierwsze kroki ==
+
+Zanim utoniemy w morzu poleceń Gita, przyjrzyjmy się najpierw kilku prostym poleceniom. Pomimo ich prostoty, wszystkie jednak są ważne i pożyteczne. W rzeczywistości, podczas pierwszych miesięcy pracy z Git nie wychodziłem poza zakres opisany w tym rozdziale
+
+=== Zabezpieczenie obecnego stanu ===
+
+Zamierzasz przeprowadzić jakieś drastyczne zmiany? Zanim to zrobisz, zabezpiecz najpierw dane w aktualnym katalogu.
+
+ $ git init
+ $ git add .
+ $ git commit -m "Mój pierwszy commit"
+
+Teraz, jeśli cokolwiek stałoby się z twymi plikami podczas edycji, możesz przywrócić pierwotną wersję:
+
+ $ git reset --hard
+
+Aby zapisać nową wersję:
+
+ $ git commit -a -m "Mój następny commit"
+
+=== Dodanie, kasowanie i zmiana nazwy ===
+
+Powyższa komenda zatrzyma jedynie pliki, które już istniały podczas gdy po raz pierwszy wykonałaś polecenie *git add*. Jeśli w międzyczasie dodałaś jakieś nowe pliki, Git musi zostać o tym poinformowany:
+
+ $ git add readme.txt Dokumentacja
+
+To samo, gdy zechcesz by Git zapomniał o wybranych plikach:
+
+ $ git rm ramsch.h archaiczne.c
+ $ git rm -r obciążający/materiał/
+
+Jeśli sam tego jeszcze nie zrobiłaś, to Git usunie pliki za ciebie.
+
+Zmiana nazwy pliku, to jak jego skasowanie i ponowne utworzenie z nową nazwą. Git wykorzystuje do tego skrót *git mv*, który posiada tą samą składnię co polecenie *mv*. Na przykład:
+
+ $ git mv bug.c feature.c
+
+=== Zaawansowane anulowanie/przywracanie ===
+
+Czasami zechcesz po prostu cofnąć się w czasie, zapominając o wszystkich wprowadzonych od tego punktu zmianach. Wtedy:
+
+ $ git log
+
+pokaże ci listę dotychczasowych 'commits' i ich sum kontrolnych SHA1:
+
+----------------------------------
+commit 766f9881690d240ba334153047649b8b8f11c664 Author: Bob
+Date: Tue Mar 14 01:59:26 2000 -0800
+
+ Zamień printf() na write().
+
+commit 82f5ea346a2e651544956a8653c0f58dc151275c
+Author: Alicja
+Date: Thu Jan 1 00:00:00 1970 +0000
+
+ Initial commit.
+----------------------------------
+
+Kilka początkowych znaków sumy kontrolnej SHA1 wystarcza by jednoznacznie zidentyfikować 'commit', alternatywnie możesz skopiować i wkleić cały hash. Wpisując:
+
+ $ git reset --hard 766f
+
+przywrócisz stan do wersji żądanego 'commit', a wszystkie późniejsze zmiany zostaną bezpowrotnie skasowane.
+
+Innym razem chcesz tylko na moment przejść do jednej z poprzednich wersji. W tym wypadku użyj komendy:
+
+ $ git checkout 82f5
+
+Tym poleceniem wrócisz się w czasie zachowując nowsze zmiany. Ale, tak samo jak w podróżach w czasie z filmów science-fiction - jeśli teraz dokonasz zmian i zapamiętasz je poleceniem 'commit', zostaniesz przeniesiona do alternatywnej rzeczywistości, ponieważ twoje zmiany różnią się od już dokonanych w późniejszych punktach czasu.
+
+Tą alternatywną rzeczywistość nazywamy 'branch', a <>. Na razie, zapamiętaj tylko, że:
+
+ $ git checkout master
+
+sprowadzi cię znów do teraźniejszości. Również, aby uprzedzić narzekanie Gita, powinnaś przed każdym 'checkout' wykonać 'commit' lub 'reset'.
+
+Korzystając ponownie z analogii do gier komputerowych:
+
+- *`git reset --hard`*: załaduj jakiś starszy stan gry i skasuj wszystkie nowsze niż właśnie ładowany.
+
+- *`git checkout`*: Załaduj stary stan, grając dalej, twój stan będzie się różnił od nowszych zapamiętanych. Każdy stan, który zapamiętasz od teraz, powstanie jako osobna gałąź ('branch'), reprezentującym alternatywną rzeczywistość. <>
+
+Jeśli chcesz, możesz przywrócić jedynie wybrane pliki lub katalogi poprzez dodanie ich nazw do polecenia:
+
+ $ git checkout 82f5 jeden.plik inny.plik
+
+Bądź ostrożna, ten sposób użycia komendy *checkout* może bez uprzedzenia skasować pliki. Aby zabezpieczyć się przed takimi wypadkami powinnaś zawsze zrobić 'commit' zanim wpiszesz 'checkout', szczególnie w okresie poznawania Gita. Jeśli czujesz się niepewnie przed wykonaniem jakiejś operacji Gita, generalną zasadą powinno stać się dla ciebie uprzednie wykonanie *git commit -a*.
+
+Nie lubisz kopiować i wklejać hashów SHA1? Możesz w tym wypadku skorzystać z:
+
+ $ git checkout :/"Mój pierwszy c"
+
+by przenieś się do 'commit', którego opis rozpoczyna się jak zawarta wiadomość. Możesz również cofnąć się do piątego z ostatnio zapamiętanych 'commit':
+
+ $ git checkout master~5
+
+=== Przywracanie ===
+
+W sali sądowej pewne zdarzenia mogą zostać wykreślone z akt. Podobnie możesz zaznaczyć pewne 'commits' do wykreślenia.
+
+ $ git commit -a
+ $ git revert 1b6d
+
+To polecenie wymaże 'commit' o wybranym hashu. Ten rewers zostanie zapamiętany jednak jako nowy 'commit', co można sprawdzić poleceniem *git log*.
+
+=== Generowanie listy zmian ===
+
+Niektóre projekty wymagają http://en.wikipedia.org/wiki/Changelog[pliku changelog]. Wygenerujesz go poleceniem:
+
+ $ git log > changelog
+
+=== Ładowanie plików ===
+
+Kopię projektu zarządzanego za pomocą Gita uzyskasz poleceniem:
+
+ $ git clone git://ścieżka/do/projektu
+
+By na przykład załadować wszystkie dane, których użyłem do stworzenia tej strony skorzystaj z:
+
+ $ git clone git://git.or.cz/gitmagic.git
+
+Do polecenia 'clone' wrócimy niebawem.
+
+=== Najnowszy stan ===
+
+Jeśli posiadasz już kopię projektu wykonaną za pomocą *git clone*, możesz ją zaktualizować poleceniem:
+
+ $ git pull
+
+=== Szybka publikacja ===
+
+Przypuśćmy, że napisałaś skrypt i chcesz go udostępnić innym. Mogłabyś poprosić ich, by załadowali go bezpośrednio z twojego komputera. Jeśli jednak zrobią to podczas gdy ty jeszcze wprowadzasz poprawki lub eksperymentujesz ze zmianami, mogłabyś przysporzyć im nieprzyjemności. Z tego powodu istnieje coś takiego jak cykl wydawniczy. Programiści regularnie pracują nad projektem, upubliczniają kod jednak dopiero, jeśli uznają, że nadaje się już do pokazania.
+
+Aby wykonać to za pomocą GIT, wejdź do katalogu w którym znajduje się twój skrypt:
+
+ $ git init
+ $ git add .
+ $ git commit -m "Pierwsze wydanie"
+
+Następnie poproś twych użytkowników o wykonanie:
+
+ $ git clone twój.komputer:/ścieżka/do/skryptu
+
+by załadować twój skrypt. Zakładamy tu posiadanie przez nich klucza SSH do twojego komputera. Jeśli go nie mają, uruchom *git daemon* i podaj im następujący link:
+
+ $ git clone git://twój.komputer/ścieżka/do/skryptu
+
+Od teraz, zawsze gdy uznasz, że wersja nadaje się do opublikowania, wykonaj polecenie:
+
+ $ git commit -a -m "Następna wersja"
+
+a twoi użytkownicy, po wejściu do katalogu zawierającego twój skrypt, będą go mogli zaktualizować poprzez:
+
+ $ git pull
+
+Twoi użytkownicy nigdy nie wejdą w posiadanie wersji, których nie chcesz im udostępniać.
+
+=== A co robiłem ostatnio? ===
+
+Jeśli chcesz zobaczyć zmiany, które wprowadziłaś od ostatniego 'commit', wpisz:
+
+ $ git diff
+
+Albo tylko zmiany od wczoraj:
+
+ $ git diff "@{yesterday}"
+
+Albo miedzy określoną wersją i dwoma poprzedzającymi:
+
+ $ git diff 1b6d "master~2"
+
+Za każdym razem uzyskane informacje są równocześnie patchem, który poprzez *git apply* może być zastosowany. Spróbuj również:
+
+ $ git whatchanged --since="2 weeks ago"
+
+Jeśli chcę sprawdzić listę zmian jakiegoś repozytorium, często korzystam z http://sourceforge.net/projects/qgit[qgit], ze względu na jego fotogeniczny interfejs, albo z http://jonas.nitro.dk/tig/[tig], tekstowy interfejs, działający zadowalająco, gdy mamy do czynienia z wolnym łączem internetowym. Alternatywnie, zainstaluj serwer HTTP, uruchom *git instaweb* i odpal dowolną przeglądarkę internetową.
+
+=== Ćwiczenie ===
+
+Niech A, B, C i D będą 4 następującymi po sobie 'commits', gdzie B różni się od A, jedynie tym, iż usunięto kilka plików. Chcemy teraz te usunięte pliki zrekonstruować do D. Jak to można zrobić?
+
+Istnieją przynajmniej 3 rozwiązania. Załóżmy, że znajdujemy się obecnie w D:
+
+1. Różnica pomiędzy A i B, to skasowane pliki. Możemy utworzyć patch, który pokaże te różnice i następnie zastosować go:
+
+ $ git diff B A | git apply
+
+2. Ponieważ pliki zostały już raz zapamiętane w A, możemy je przywrócić:
+
+ $ git checkout A foo.c bar.h
+
+3. Możemy też widzieć przejście z A na B jako zmianę, którą można zrewertować:
+
+ $ git revert B
+
+A które z tych rozwiązań jest najlepsze? To, które najbardziej tobie odpowiada. Korzystając z Git łatwo osiągnąć cel, czasami prowadzi do niego wiele dróg.
diff --git a/pl/branch.txt b/pl/branch.txt
new file mode 100644
index 00000000..927f722a
--- /dev/null
+++ b/pl/branch.txt
@@ -0,0 +1,190 @@
+== Magia 'branch' ==
+
+Szybkie, natychmiastowe działanie poleceń 'branch' i 'merge', to jedne z najbardziej zabójczych właściwości Gita.
+
+*Problem*: Zewnętrzne faktory narzucają konieczność zmiany kontekstu. Poważne błędy w opublikowanej wersji ujawniły się bez ostrzeżenia. Skrócono termin opublikowania pewnej właściwości. Autor, którego pomocy potrzebujesz w jednej z kluczowych sekcji postanawia opuścić projekt. We wszystkich tych przypadkach musisz natychmiastowo zaprzestać bieżących prac i skoncentrować się nad zupełnie innymi zadaniami.
+
+Przerwanie toku myślenia nie jest dobre dla produktywności, a czym większa różnica w kontekście, tym większe straty. Używając centralnych systemów kontroli wersji musielibyśmy najpierw załadować świeżą kopię roboczą z serwera. W systemach rozproszonych wygląda to dużo lepiej, ponieważ możemy żądaną wersje sklonować lokalnie
+
+Jednak klonowanie również niesie za sobą kopiowanie całego katalogu roboczego jak i całej historii projektu aż do żądanego punktu. Nawet jeśli Git redukuje wielkość przez podział danych i użycie twardych dowiązań, wszystkie pliki projektu muszą zostać odtworzone w nowym katalogu roboczym.
+
+*Rozwiązanie*: Git posiada lepsze narzędzia dla takich sytuacji, jest ono wiele szybsze i zajmujące mniej miejsca na dysku jak klonowanie: *git branch*.
+
+Tym magicznym słowem zmienisz dane w swoim katalogu roboczym z jednej wersji w inną. Ta przemiana potrafi dużo więcej jak tylko poruszać się w historii projektu. Twoje pliki mogą przekształcić się z aktualnej wersji do wersji eksperymentalnej, do wersji testowej, do wersji twojego kolegi i tak dalej.
+
+=== Przycisk 'szef' ===
+
+Być może grałaś już kiedyś w grę, która posiadała magiczny (``przycisk szef''), po naciśnięciu którego twój monitor natychmiast pokazywał jakieś arkusze kalkulacyjne, czy coś w tym roduaju? Celem przycisku było szybkie ukrycie gierki na wypadek pojawienia się szefa w twoim biurze.
+
+W jakimś katalogu:
+
+ $ echo "Jestem mądrzejsza od szefa" > mój_plik.txt
+ $ git init
+ $ git add .
+ $ git commit -m "Pierwszy commit"
+
+Utworzyliśmy repozytorium Gita, które zawiera plik o powyższej zawartości. Następnie wpisujemy:
+
+ $ git checkout -b szef # wydaje się, jakby nic się nie stało
+ $ echo "Mój szef jest ode mnie mądrzejszy" > mój_plik.txt
+ $ git commit -a -m "Druga wersja"
+
+Wygląda jakbyśmy zmienili zawartość pliku i wykonali 'commit'. Ale to tylko iluzja. Wpisz:
+
+ $ git checkout master # przejdź do oryginalnej wersji
+
+i hokus-pokus! Poprzedni plik jest przywrócony do stanu pierwotnego. Gdyby jednak szef zdecydował się grzebać w twoim katalogu, wpisz:
+
+ $ git checkout szef # przejdź do wersji, która nadaje się do obejrzenia przez szefa
+
+Możesz zmieniać pomiędzy tymi wersjami pliku tak często jak zechcesz, każdą z tych wersji pliku możesz też niezależnie edytować.
+
+=== Brudna robota ===
+
+[[branch]]
+Załóżmy, że pracujesz nad jakąś funkcją i musisz z jakiegokolwiek powodu wrócić o 3 wersje wstecz w celu wprowadzenia kilku poleceń print, aby sprawdzić jej działanie. Wtedy:
+
+ $ git commit -a
+ $ git checkout HEAD~3
+
+Teraz możesz na dziko wprowadzać tymczasowy kod. Możesz te zmiany nawet dodać do'commit'. Po skończeniu,
+
+ $ git checkout master
+
+wróci cię do poprzedniej pracy. Zauważ, że wszystkie zmiany, które nie zostały zatwierdzone przez 'commit', zostały przejęte.
+
+A co jeśli chciałaś zapamiętać wprowadzone zmiany? Proste:
+
+ $ git checkout -b brudy
+
+i tylko jeszcze wykonaj 'commit' zanim wrócisz do 'master branch'. Jeśli tylko chcesz wrócić do twojej brudnej roboty, wpisz po prostu
+
+ $ git checkout brudy
+
+Spotkaliśmy się z tym poleceniem już we wcześniejszym rozdziale, gdy poruszaliśmy temat ładowania starych wersji. Teraz możemy opowiedzieć cala prawdę: pliki zmieniają się do żądanej wersji, jednak musimy opuścić 'master branch'. Każdy 'commit' od teraz prowadzi twoje dane inną drogą, której możemy również nadać nazwę.
+
+Innymi słowami, po przywołaniu ('checkout') starszego stanu Git automatycznie przenosi cię do nowego, nienazwanego 'branch', który poleceniem *git checkout -b* otrzyma nazwę i zostanie zapamiętany.
+
+=== Szybka korekta błędów ===
+
+Będąc w środku jakiejś pracy, otrzymujesz polecenie zajęcia się nowo znalezionym błędem w 'commit' `1b6d...`:
+
+ $ git commit -a
+ $ git checkout -b fixes 1b6d
+
+Po skorygowaniu błędu:
+
+ $ git commit -a -m "Błąd usunięty"
+ $ git checkout master
+
+i kontynuujesz przerwaną pracę. Możesz nawet ostatnio świeżo upieczoną poprawkę przejąć do aktualnej wersji:
+
+ $ git merge fixes
+
+=== Merge ===
+
+Za pomocą niektórych systemów kontroli wersji utworzenie nowego 'branch' może i jest proste, jednak późniejsze połączenie ('merge') skomplikowane. Z Gitem 'merge' jest tak trywialne, że możesz czasem nawet nie zostać powiadomiony o jego wykonaniu.
+
+W gruncie rzeczy spotkaliśmy się już dużo wcześniej z funkcją 'merge'. Polecenie *git pull* ściąga inne wersje i łączy ('merge') z twoim aktualnym 'branch'. Jeśli nie wprowadziłaś żadnych lokalnych zmian, to 'merge' jest szybkim przejściem do przodu, jest to przypadek podobny do zładowania ostatniej wersji przy centralnych systemach kontroli wersji. Jeśli jednak wprowadziłaś zmiany, Git automatycznie wykona 'merge' i powiadomi cię o ewentualnych konfliktach.
+
+Zwyczajnie każdy 'commit' posiada matczyny 'commit', a mianowicie poprzedzający go 'commit'. Zespolenie kilku 'branch' wytwarza 'commit' z minimum 2 matczynymi 'commit'. To nasuwa pytanie, który właściwie 'commit' wskazuje na `HEAD~10`? Każdy 'commit' może posiadać więcej rodziców, za którym właściwie podążamy?
+
+Wychodzi na to, ze ta notacja zawsze wybiera pierwszego rodzica. To jest wskazane, ponieważ aktualny 'branch' staje się pierwszym rodzicem dla 'merge', częściej będziesz zainteresowany bardziej zmianami których dokonałaś w aktualnym 'branch', niż w innych.
+
+Możesz też wybranego rodzica wskazać używając symbol dzióbka. By na przykład pokazać logi drugiego rodzica.
+
+ $ git log HEAD^2
+
+Możesz pominąć numer pierwszego rodzica. By na przykład pokazać różnice z pierwszym rodzicem:
+
+ $ git diff HEAD^
+
+Możesz ta notacje kombinować także z innymi rodzajami. Na przykład:
+
+ $ git checkout 1b6d^^2~10 -b archaiczne
+
+tworzy nowy 'branch' o nazwie 'archaiczne', reprezentujący stan 10 'commit' do tyłu drugiego rodzica dla pierwszego rodzica 'commit', którego hash rozpoczyna się na 1b6d.
+
+=== Praca bez przestojów ===
+
+W procesie produkcji często drugi krok planu musi czekać na zakończenie pierwszego. Popsuty samochód stoi w garażu nieużywany do czasu dostarczenia części zamiennej. Prototyp musi czekać na wyprodukowanie jakiegoś chipa zanim będzie można podjąć dalszą konstrukcje.
+
+W projektach software może to wyglądać podobnie. Druga część jakiegoś feature musi czekać, aż pierwsza zostanie wydana i przetestowana. Niektóre projekty wymagają sprawdzenia twojego kodu zanim zostanie zaakceptowany, musisz wiec czekać z następną częścią aż pierwsza zostanie sprawdzona.
+
+Dzięki bezbolesnemu 'branch' i 'merge' możemy te reguły naciągnąć i pracować nad druga częścią jeszcze zanim pierwsza zostanie oficjalnie zatwierdzona. Przyjmijmy, że wykonałaś 'commit' pierwszej części i przekazałaś do sprawdzenia. Przyjmijmy też, że znajdujesz się w 'master branch'. Najpierw przejdź do 'branch' o nazwie 'część2':
+
+$ git checkout -b część2
+
+Pracujesz w części 2 i regularnie wykonujesz 'commit'. Błądzenie jest ludzkie i może się zdarzyć, że zechcesz wrócić do części 1 i wprowadzić jakieś poprawki. Jeśli masz szczęście albo jesteś bardzo dobry, możesz ominąć następne linijki.
+
+ $ git checkout master # przejdź do części 1
+ $ fix_problem
+ $ git commit -a # zapisz rozwiązanie
+ $ git checkout część2 # przejdź do części 2
+ $ git merge master # połącz zmiany
+
+Ewentualnie, część pierwsza zostaje dopuszczona:
+
+ $ git checkout master # przejdź do części 1
+ $ submit files # opublikuj twoja wersję
+ $ git merge część2 # Połącz z częścią 2
+ $ git branch -d część2 # usuń branch część2
+
+Znajdujesz się teraz z powrotem w 'master branch' posiadając 'część2' w katalogu roboczym.
+
+Dość łatwo zastosować ten sam trik na dowolną ilość części. Równie łatwo można utworzyć 'branch' wstecznie: przypuśćmy, właśnie spostrzegłaś, iż już właściwie jakieś 7 'commit' wcześniej powinnaś stworzyć 'branch'. Wpisz wtedy:
+
+ $ git branch -m master część2 # Zmień nazwę "master" na "część2".
+ $ git branch master HEAD~7 # utwórz ponownie "master" 7 'commits' do tyłu.
+
+Teraz 'master branch' zawiera cześć 1 a branch `część2` zawiera całą resztę. Znajdujemy się teraz w tym ostatnim 'branch'; utworzyliśmy `master` bez wchodzenia do niego, gdyż zamierzamy dalszą pracę prowadzić w 'branch' `część2`. Nie jest to zbyt często stosowane. Do tej pory przechodziliśmy do nowego 'branch' zaraz po jego utworzeniu, tak jak w:
+
+ $ git checkout HEAD~7 -b master # Utwórz branch i wejdź do niego.
+
+=== Reorganizacja składanki ===
+
+Może lubisz odpracowywać wszystkie aspekty projektu w jednym 'branch'. Chcesz wszystkie bieżące zmiany zachować dla siebie, a wszyscy inni powinni zobaczyć twoje 'commit' po ich starannym zorganizowaniu. Wystartuj parę 'branch':
+
+ $ git branch czyste # Utwórz branch dla oczyszczonych 'commits'.
+ $ git checkout -b zbieranina # utwórz 'branch' i przejdź do niego w celu dalszej pracy.
+
+Następnie wykonaj zamierzone prace: pousuwaj błędy, dodaj nowe funkcje, utwóż kod tymczasowy i tak dalej, regularnie wykonując 'commit'. Wtedy:
+
+ $ git checkout czyste
+ $ git cherry-pick zbieranina^^
+
+zastosuje najstarszy matczyny 'commit' z 'branch' ``zbieranina'' na 'branch' ``czyste''. Poprzez 'przebranie wisienek' możesz tak skonstruować 'branch', który posiada jedynie końcowy kod i zależne od niego pogrupowane 'commit'.
+
+=== Zarządzanie 'branch' ===
+
+Listę wszystkich 'branch' otrzymasz poprzez:
+
+ $ git branch
+
+Standardowo zaczynasz w 'branch' zwanym ``master''. Wielu opowiada się za pozostawieniem ``master'' branch w stanie dziewiczym i tworzeniu nowych dla twoich prac.
+
+Opcje *-d* und *-m* pozwalają na usuwanie i przesuwanie (zmianę nazwy) 'branch'. Zobacz: *git help branch*.
+
+Nazwa ``master'' jest bardzo użytecznym stworem. Inni mogą wychodzić z założenia, że twoje repozytorium takowy posiada i że zawiera on oficjalną wersję projektu. Nawet jeśli mogłabyś skasować lub zmienić nazwę na inną powinnaś respektować tę konwencję.
+
+=== Tymczasowe 'branch' ===
+
+Po jakimś czasie zapewne zauważysz, że często tworzysz 'branch' o krótkiej żywotności, w większości z tego samego powodu: każdy nowy 'branch' służy jedynie do tego, by zabezpieczyć aktualny stan, aby móc wrócić do jednego z poprzednich punktów i poprawić jakieś priorytetowe błędy czy cokolwiek innego.
+
+Można to porównać do chwilowego przełączenia kanału telewizyjnego, by sprawdzić co dzieje się na innym. Lecz zamiast naciskać guziki pilota, korzystasz z poleceń 'create', 'checkout', 'merge' i 'delete'. Na szczęście Git posiada na te operacje skrót, który jest tak samo komfortowy jak pilot telewizora:
+
+ $ git stash
+
+Polecenie to zabezpiecza aktualny stan w tymczasowym miejscu ('stash' = ukryj) i przywraca poprzedni stan. Twój katalog roboczy wygląda dokładnie tak, jak wyglądał zanim zacząłaś edycję. Teraz możesz poprawiać błędy, załadować zmiany z centralnego repozytorium ('pull') i tak dalej. Jeśli chcesz powrócić z powrotem do ukrytego ('stashed') stanu, wpisz:
+
+ $ git stash apply # Prawdopodobnie będziesz musiał rozwiązać konflikty.
+
+Możesz posiadać więcej 'stash'-ów i traktować je w zupełnie inny sposób. Zobacz *git help stash*. Jak już prawdopodobnie się domyślasz, Git korzysta przy wykonywaniu tej magicznej sztuczki z funkcji 'branch' w tle.
+
+=== Pracuj jak chcesz ===
+
+Może pytasz się, czy 'branch' są warte tego zachodu. Jakby nie było, polecenia 'clone' są prawie tak samo szybkie i możesz po prostu poleceniem *cd* zmieniać pomiędzy nimi, bez stosowania ezoterycznych poleceń Gita.
+
+Przyjrzyjmy się takiej przeglądarce internetowej. Dlaczego pozwala używać tabów tak samo jak i nowych okien? Ponieważ udostępnienie obu możliwości pozwala na stosowanie wielu stylów. Niektórzy użytkownicy preferują otwarcie jednego okna przeglądarki i korzystają z tabów dla wyświetlenia różnych stron. Inni upierają się przy stosowaniu pojedynczych okien dla każdej strony, zupełnie bez korzystania z tabów. Jeszcze inni znowu wolą coś pomiędzy.
+
+Stosowanie 'branch' to jak korzystanie z tabów dla twojego katalogu roboczego, a klonowanie porównać można do otwarcia wielu okien przeglądarki. Obie operacje są szybkie i lokalne, dlaczego nie poeksperymentować i nie znaleźć dla siebie najbardziej odpowiedniej kombinacji. Git pozwoli ci pracować dokładnie tak jak chcesz.
diff --git a/pl/clone.txt b/pl/clone.txt
new file mode 100644
index 00000000..05c9d791
--- /dev/null
+++ b/pl/clone.txt
@@ -0,0 +1,194 @@
+== Klonowanie ==
+
+W starszych systemach kontroli wersji polecenie 'checkout' stanowi standardową operację pozyskiwania danych. Otrzymasz nią zbiór plików konkretnej wersji.
+
+W Git i innych rozproszonych systemach standardowo służy temu operacja 'clone'. By pozyskać dane, tworzysz najpierw klon całego repozytorium. Lub inaczej mówiąc, otrzymujesz lustrzane odbicie serwera. Wszystko, co można zrobić w centralnym repozytorium, możesz również robić z klonem.
+
+=== Synchronizacja komputera ===
+
+W celu ochrony danych mógłbym jeszcze zaakceptować korzystanie z archiwum 'tar', a dla prostej synchronizacji używania *rsync*. Jednak czasami pracując na laptopie, a innym razem na komputerze stacjonarnym, może się zdarzyć, że komputery nie miały możliwości zsynchwonizowania się w międzyczasie.
+
+Utwórz repozytorium Gita w wykonaj 'commit' twoich danych na jednym z komputerów. Potem na następnym wpisz:
+
+ $ git clone drugi.komputer:/ścieżka/do/danych
+
+by otrzymać drugą kopię danych i jednocześnie utworzyć repozytorium Gita na drugim komputerze. Od teraz poleceniem:
+
+ $ git commit -a
+ $ git pull drugi.komputer:/ścieżka/do/danych HEAD
+
+przenosisz stan drugiego komputera na komputer na którym właśnie pracujesz. Jeśli dokonałaś zmian w tym samym pliku na obydwu komputerach, Git poinformuje cię o tym, po usunięciu konfliktu powinnaś ponowić 'commit'.
+
+=== Klasyczna kontrola kodu źródłowego ===
+
+Utwórz repozytorium Gita w katalogu roboczym projektu:
+
+ $ git init
+ $ git add .
+ $ git commit -m "Pierwszy commit"
+
+Na centralnym serwerze utwórz gołe ('bare') repozytorium w jakimkolwiek katalogu:
+
+ $ mkdir proj.git
+ $ cd proj.git
+ $ git --bare init
+ $ touch proj.git/git-daemon-export-ok
+
+W razie konieczności wystartuj daemon Gita:
+
+ $ git daemon --detach # ponieważ, gdyby uruchomiony był wcześniej
+
+Jeśli korzystasz z hostingu to poszukaj na stronie usługodawcy wskazówek jak utworzyć repozytorium 'bare'. Zwykle konieczne jest do tego wypełnienie formularza online na jego stronie.
+
+Popchaj ('push') twój projekt teraz na centralny serwer:
+
+ $ git push centralny.serwer/ścieżka/do/projektu.git HEAD
+
+By pozyskać kod źródłowy programista podaje zwykle polecenie w rodzaju:
+
+ $ git clone główny.serwer/ścieżka/do/projektu.git
+
+Po dokonaniu edycji programista zapamiętuje zmiany najpierw lokalnie:
+
+ $ git commit -a
+
+Aby zaktualizować do wersji istniejącej na głównym serwerze:
+
+ $ git pull
+
+Jeśli wystąpią jakiekolwiek konflikty łączenia ('merge') , powinny być najpierw usunięte i na nowo zostać wykonany 'commit'.
+
+ $ git commit -a
+
+Lokalne zmiany przekazujemy do serwera poleceniem:
+
+ $ git push
+
+Jeśli w międzyczasie nastąpiły nowe zmiany na serwerze wprowadzone przez innego programistę, twój 'push' nie powiedzie się. Zaktualizuj lokalne repozytorium ponownie poleceniem 'pull', pozbądź się konfliktów i spróbuj jeszcze raz.
+
+Programiści potrzebują dostępu poprzez SSH dla wykonania poleceń 'pull' i 'push'. Mimo to, każdy może skopiowć kod źródłowy poprzez podanie:
+
+ $ git clone git://główny.serwer/ścieżka/do/projektu.git
+
+Protokół GIT przypomina HTTP: nie posiada uwierzytelniania, a więc każdy może skopiować dane. Przy ustawieniach standardowych wykonanie 'push' za pomocą protokołu GIT jest zdezaktywowane.
+
+=== Utajnienie źródła ===
+
+Przy projektach Closed-Source wyklucz używanie poleceń takich jak 'clone' i upewnij się, że nie został utworzony plik o nazwie 'git-daemon-export-ok'. Wtedy repozytorium nie może już komunikować się poprzez protokół 'git', tylko posiadający dostęp przez SHH mogą widzieć dane. Jeśli wszystkie repozytoria są zamknięte, nie ma potrzeby startować daemona 'git', ponieważ cała komunikacja odbywa się wyłącznie za pomocą SSH.
+
+=== Gołe repozytoria ===
+
+Określenie: 'gołe' ('bare') repozytorium, powstało, ze względu na fakt, iż repozytorium to nie posiada katalogu roboczego. Posiada jedynie dane, które są zwykle schowane w podkatalogu '.git'. Innymi słowy: zarządza historią projektu, nie posiada jednak katalogu roboczego jakiejkolwiek wersji.
+
+Repozytorium 'bare' przejmuje rolę podobną do roli głównego serwera w scentralizowanych systemach kontroli wersji: dach twojego projektu. Programiści klonują twój projekt stamtąd i przesyłają tam ostatnie oficjalne zmiany. Często znajduje się ono na serwerze, którego jedynym zadaniem jest wyłącznie dystrybucja danych. Sama praca nad projektem przebiega na jego klonach, w ten sposób główne repozytorium daje sobie radę nie korzystając z katalogu roboczego.
+
+Wiele z poleceń Gita nie będzie funkcjonować w repozytoriach 'bare', chyba że ustawimy zmienną systemową GIT_DIR na katalog roboczy repozytorium albo przekażemy opcję `--bare`.
+
+=== 'Push', czy 'pull'? ===
+
+Dlaczego wprowadziliśmy polecenie 'push', a nie pozostaliśmy przy znanym nam już 'pull'? Po pierwsze, 'pull' nie działa z repozytoriami 'bare': zamiast niego używaj 'fetch', polecenia którym zajmiemy się później. Również gdybyśmy nawet używali normalnego repozytorium na serwerze centralnym, polecenie 'pull' byłoby raczej niewygodne. Musielibyśmy wpierw zalogować się na serwerze i przekazać poleceniu 'pull' adres IP komputera z którego chcemy ściągnąć pliki. Jeśli w ogóle posiadalibyśmy dostęp do konsoli serwera, to prawdopodobnie przeszkodziłaby nam firewalle na drodze do naszego komputera.
+
+W każdym bądź razie, nawet jeśli nawet mogło by to zadziałać, odradzam z korzystania z funkcji 'push' w ten sposób. Poprzez samo posiadanie katalogu roboczego na serwerze mogłoby powstać wiele nieścisłości.
+
+Krótko mówiąc, podczas gdy uczysz się korzystania z Git, korzystaj z polecenia 'push' tylko, gdy celem jest repozytorium 'bare', we wszystkich innych wypadkach z 'pull'.
+
+=== Rozwidlenie projektu ===
+
+Jeśli nie potrafisz już patrzeć na kierunek rozwoju w jakim poszedł jakiś projekt. Uważasz, że potrafisz to lepiej. To po prostu utwórz jego 'fork', w tym celu na twoim serwerze podaj:
+
+ $ git clone git://główny.serwer/ścieżka/do/danych
+
+Następnie, poinformuj wszystkich o nowym 'forku' projektu na twoim serwerze.
+
+W każdej późniejszej chwili możesz dokonać łączenia ('merge') zmian z oryginalnego projektu, poprzez:
+
+ $ git pull
+
+=== Ultymatywny backup ===
+
+Chcesz posiadać liczne, wolne od manipulacji, redundantne kopie bezpieczeństwa w różnych miejscach? Jeśli projekt posiada wielu programistów, nie musisz niczego robić. Ponieważ każdy klon twojego kodu jest pełnowartościową kopią bezpieczeństwa. Nie tylko jego aktualna wersja, lecz również cała historia projektu. Gdy jakikolwiek klon zostanie uszkodzony, dzięki kryptograficznemu hashowaniu, zostanie to natychmiast rozpoznane, jeśli tylko dana osoba będzie próbować wymiany z innymi.
+
+Jeśli twój projekt nie jest jeszcze wystarczająco znany, spróbuj pozyskać tak wiele serwerów, ile to możliwe, by umieścić tam jego klon.
+
+Ci najbardziej paranoidalni powinni zawsze zapisywać 20 bajtów ostatniej sumy kontrolnej SHA1 dla HEAD i przechowywać w bezpiecznym miejscu. Musi być bezpieczny, jednak nie tajny. Na przykład opublikowanie go w gazecie dobrze by spełniło swoje zadanie, dość trudnym zadaniem byłoby zmanipulowanie każdej kopii gazety.
+
+=== Wielozadaniowość z prędkością światła ===
+
+Załóżmy, że chcesz pracować nad kilkoma funkcjami równocześnie. Wykonaj 'commit' i wpisz:
+
+ $ git clone . /jakiś/nowy/katalog
+
+Za sprawą http://en.wikipedia.org/wiki/Hard_link[twardych linków] stworzenie lokalnej kopii zajmuje dużo mniej czasu i pamięci niż zwykły backup.
+
+Możesz pracować nad dwoma niezależnymi funkcjami jednocześnie. Na przykład, możesz pracować nad jednym klonem dalej, podczas gdy drugi jest właśnie kompilowany. W każdym momencie możesz wykonać 'commit' i 'pull' innego klonu.
+
+ $ git pull /inny/klon HEAD
+
+=== Kontrola wersji z podziemia ===
+
+Pracujesz nad projektem, który używa innego systemu kontroli wersji i tęsknisz za Gitem? Utwórz po prostu repozytorium Gita w twoim katalogu roboczym:
+
+ $ git init
+ $ git add .
+ $ git commit -m "Pierwszy commit"
+
+następnie sklonuj go:
+
+ $ git clone . /jakiś/inny/katalog
+
+Przejdź teraz do nowego katalogu i pracuj według upodobania. Kiedyś zechcesz zsynchronizować pracę, idź do oryginalnego katalogu, zaktualizuj go najpierw z tym innym systemem kontroli wersji, następnie wpisz:
+
+ $ git add .
+ $ git add . $ git commit -m"Synchronizacja z innym systemem kontroli wersji"
+
+Teraz przejdź do nowego katalogu i podaj:
+
+ $ git commit -a -m "Opis zmian"
+ $ git pull
+
+Sposób w jaki przekażesz zmiany drugiemu systemowi zależy już od jego sposobu działania. Twój nowy katalog posiada dane ze zmianami przez ciebie wprowadzonymi. Wykonaj jeszcze adekwatne kroki żądane przez ten inny system kontroli wersji, by przekazać dane do centralnego repozytorium.
+
+Subversion, być może najlepszy z centralnych systemów, stosowany jest w wielu projektach. Komenda *git svn* automatyzuje powyższe kroki, może być użyta na przykład do http://google-opensource.blogspot.com/2008/05/export-git-project-to-google-code.html[exportu projektu Git do repozytorium Subversion].
+
+=== Mercurial ===
+
+Mercurial to podobny do Gita system kontroli wersji, który prawie bezproblemowo potrafi pracować z Gitem. Korzystając z rozszerzenia `hg-git` użytkownik Mercurial jest w stanie bez strat wykonywać 'push' i 'pull' z repozytorium Gita.
+
+Możesz ściągnąć sobie rozszerzenie `hg-git` za pomocą Gita:
+
+ $ git clone git://github.com/schacon/hg-git.git
+
+albo za pomocą Mercurial:
+
+ $ hg clone http://bitbucket.org/durin42/hg-git/
+
+Niestety nie są mi znane takie rozszerzenia dla Gita. Dlatego jestem za używaniem Gita jako głównego repozytorium, nawet gdy preferujesz Mercurial. W projektach prowadzonych za pomocą Mercurial często znajdziemy woluntariusza, który równolegle prowadzi repozytorium Gita, dzięki pomocy rozszerzenia `hg-git` projekty Gita automatycznie osiągają użytkowników Mercurial.
+
+To rozszerzenie potrafi również zmienić skład Mercurial w skład Gita, za pomocą komendy 'push' do gołego repozytorium Gita. Jeszcze łatwiej dokonamy tego skryptem `hg-fast-export.sh`, który możemy tu znaleźć:
+
+ $ git clone git://repo.or.cz/fast-export.git
+
+Aby skonwertować, wejdź do pustego katalogu:
+
+ $ git init
+ $ hg-fast-export.sh -r /hg/repo
+
+po uprzednim dodaniu skryptu do twojego `$ PATH`.
+
+=== Bazaar ===
+
+Wspomnijmy również pokrótce o Bazaar, ponieważ jest to najbardziej popularny darmowy rozproszony system kontroli wersji po Git i Mercurial.
+
+Bazar będąc stosunkowo młodym systemem, posiada zaletę perspektywy czasu, jego twórcy mogli uczyć się na błędach z przeszłości i uniknąć historycznych naleciałości. Poza tym programiści byli świadomi popularności i wagi interakcji z innymi systemami kontroli wersji.
+
+Rozszerzenie `Bzr-git` pozwala użytkownikom Bazar dość łatwo pracować z repozytoriami Gita. Program `tailor` konwertuje składy Bazaar do składów Gita i może robić to na bieżąco, podczas gdy `bzr-fast-export` lepiej nadaje się do jednorazowej konwersji.
+
+=== Dlaczego korzystam z Gita ===
+
+Zdecydowałem się pierwotnie do wyboru Gita, ponieważ słyszałem, że jest w stanie zarządzać tak zawiłym i rozległym projektem jak kod źródłowy Linuksa. Jak na razie nie miałem powodów do zmiany. Git służył mi znakomicie i do tej pory mnie nie zawiódł. Ponieważ w pierwszej linii pracuję na Linuksie, problemy innych platform nie mają dla mnie znaczenia.
+
+Preferuję również programy 'C' i skrypty 'bash' w opozycji do na przykład Pythona: posiadają mniej zależności, wolę też, gdy kod jest wykonywany szybko.
+
+Myślałem już też nad tym, jak można by ulepszyć Gita, poszło to nawet tak daleko, że napisałem własną aplikacje podobną do niego, w celu jednak wyłącznie ćwiczeń akademickich. Nawet gdybym zakończył mój projekt, mimo to pozostałbym przy Git, bo ulepszenia byłyby zbyt minimalne by uzasadnić zastosowanie odosobnionego systemu.
+
+Oczywiście może się okazać, że twoje potrzeby i oczekiwania są zupełnie inne i być może wygodniej jest tobie z zupełnie innym systemem. Jakby jednak nie spojrzeć, stosując Git nie popełnisz tu niczego złego.
diff --git a/pl/drawbacks.txt b/pl/drawbacks.txt
new file mode 100644
index 00000000..e3b08773
--- /dev/null
+++ b/pl/drawbacks.txt
@@ -0,0 +1,91 @@
+== Załącznik A: Niedociągnięcia Gita ==
+
+O kilku problemach mogących wystąpić z Gitem nie wspomniałem do tej pory. Niektóre z nich można łatwo rozwiązać korzystając ze skryptów i 'hooks', inne wymagają reorganizacji i ponownego zdefiniowania całego projektu, a na rozwiązanie kilku innych uniedogodnień możesz tylko uzbroić się w cierpliwość i czekać na ich usunięcie. Albo jeszcze lepiej, samemu się nimi zająć i spróbować pomóc.
+
+=== Słabości SHA1 ===
+
+Z biegiem czasu kryptografowie odkrywają coraz więcej słabości systemu SHA1. Już dzisiaj byłoby możliwe dla przedsięwzięć dysponujących odpowiednimi zasobami finansowymi znaleźć kolizje w hashach. Za kilka lat, całkiem możliwe, że normalny domowy PC będzie dysponował odpowiednim zasobem mocy obliczeniowej, by skorumpować niepostrzeżenie repozytorium Gita.
+
+Miejmy nadzieję, że Git przestawi się na lepszą funkcje hashującą, zanim badania nad SHA1 zrobią go bezużytecznym.
+
+=== Microsoft Windows ===
+
+Korzystanie z Gita pod Microsoft Windows może być frustrujące:
+
+- http://cygwin.com/[Cygwin], unixoidalne środowisko dla Windowsa posiada http://cygwin.com/packages/git/[port Gita].
+
+- https://gitforwindows.org/[Git dla Windows] jest jedną z alternatyw, niektóre polecenia wymagają jednak poprawek.
+
+=== Pliki niepowiązane ===
+
+Jeśli twój projekt jest bardzo duży i zawiera wiele plików, które nie są bezpośrednio ze sobą związane, mimo to jednak często zostają zmieniane, Git może tu działać gorzej niż inne systemy, ponieważ nie prowadzi monitoringu poszczególnych plików. Git kontroluje zawsze całość projektu, co w normalnym wypadku jest zaletą.
+
+Jednym z możliwych rozwiązań mogłoby być podzielenie twojego projektu na kilka mniejszych, w których znajdują się jedynie pliki od siebie zależne. Korzystaj z *git submodule* jeśli mimo to chcesz cały twój projekt mieć w tym samym repozytorium.
+
+=== Kto nad czym pracuje? ===
+
+Niektóre systemy kontroli wersji zmuszają cię, by w jakiś sposób oznaczyć pliki nad którymi pracujesz. Mimo że jest to bardzo uciążliwe, gdyż wymaga ciągłej komunikacji z serwerem centralnym, posiada to też swoje zalety:
+
+1. Różnice zostają szybko znalezione, ponieważ wystarczy skontrolować wyłącznie oznaczone pliki.
+
+2. Każdy może szybko sprawdzić, kto aktualnie nad czym pracuje, sprawdzając na serwerze po prostu kto zaznaczył jakie dane do edycji.
+
+Używając odpowiednich skryptów uda ci się to również przy pomocy Gita. Wymaga to jednak współdziałania programistów, ponieważ muszą również korzystać z tych skryptów podczas pracy nad projektem.
+
+=== Historia pliku ===
+
+Ponieważ Git loguje zmiany tylko dla całości projektu jako takiego, rekonstrukcja przebiegu zmian pojedynczego pliku jest bardziej pracochłonna, niż w innych systemach kontrolujących pojedyncze .
+
+Te wady są w większości przypadków uznawane za marginalne i nie są brane pod uwagę, ponieważ inne operacje są bardzo wydajne. Na przykład polecenie `git checkout` jest szybsze niż `cp -a`, zmiany w zakresie całego projektu daje się lepiej komprymować niż zbiór zmian na bazie pojedynczych plików.
+
+=== Pierwszy klon ===
+
+Wykonanie klonu jest kosztowniejsze niż w innych systemach kontroli wersji jeśli istnieje długa historia.
+
+Początkowy koszt spłaca się jednak na dłuższą metę ponieważ większość przyszłych operacji przeprowadzane będzie szybko i offline. Niemniej jednak istnieją sytuacje, w których lepiej utworzyć powierzchowny klon korzystając z opcji `--depth`. Trwa to o wiele krócej, taki klon jednak posiada też tylko ograniczoną funkcjonalność.
+
+=== Niestałe projekty ===
+
+Git został napisany z myślą optymalizacji prędkości działania przy dokonywaniu wielkich zmian. Ludzie robią jednak pomniejsze zmiany z wersji na wersję. Jakaś poprawka tutaj, jakaś nowa funkcja gdzie indziej, poprawienie komentarzy, itd. Ale jeśli twoje dane znacznie się od siebie różnią pomiędzy następującymi po sobie wersjami, to chcąc nie chcąc przy każdym 'commit' projekt zwiększy się o te zmiany.
+
+Nie wymyślono jednak do tej pory niczego w żadnym systemie kontroli wersji, by móc temu zapobiec, tutaj jednak użytkownik Gita cierpi najbardziej, ponieważ w normalnym wypadku klonuje cały przebieg projektu.
+
+Powinno się w takim wypadku szukać powodów wystąpienia największych zmian. Ewentualnie można czasami zmienić format danych. Małe zmiany w projekcie powinny pociągać tylko minimalne zmiany na tak wąskiej grupie plików, jak to tylko możliwe.
+
+Może czasami bardziej wskazana byłaby baza danych, czy jakiś system archiwizacji zamiast systemu kontroli wersji. Na przykład nie jest dobrym sposobem zastosowanie systemu kontroli wersji do zarządzania zdjęciami wykonywanymi periodycznie przez kamerę internetową.
+
+Jeśli dane ulegają ciągłym zmianom i naprawdę muszą być objęte kontrolą wersji, jedną z możliwości jest zastosowanie Gita w scentralizowanej formie. Każdy może dokonywać pobieżnych klonów, które mało co lub wcale nie mają nic do czynienia z przebiegiem projektu. Oczywiście w takim wypadku wiele funkcji Gita nie będzie dostępnych a zmiany muszą być przekazywane w formie 'patch'. Prawdopodobnie będzie to dość dobrze działać, mimo iż nie jest do końca jasne komu potrzebna jest znajomość przebiegu tak ogromnej ilości niestabilnych danych.
+
+Innym przykładem może być projekt, który zależny jest od firmware przyjmującej kształt wielkiej danej w formie binarnej. Historia pliku firmware nie interesuje użytkownika, a zmiany nie pozwalają się wygodnie komprymować, wielkość repozytorium wzrasta niepotrzebnie o nowe wersje binarnego pliku firmware.
+
+W takim wypadku należałoby trzymać w repozytorium wyłącznie kod źródłowy, a sam plik binarny poza nim. By ułatwić sobie życie, ktoś mógłby opracować skrypt, który Git wykorzystuje do klonowania kodu źródłowego i 'rsync' albo pobieżny klon dla samego firmware.
+
+=== Licznik globalny ===
+
+Wiele systemów kontroli wersji udostępnia licznik, który jest zwiększany z każdym "commit". Git natomiast odwołuje się przy zmianach do sum kontrolnych SHA1, co w wielu przypadkach jest lepszym rozwiązaniem.
+
+Niektórzy jednak przyzwyczaili się do tego licznika. Na szczęście, łatwo jest napisać skrypt zwiększający stan licznika przy każdej aktualizacji centralnego repozytorium Gita. Może w formie taga, który powiązany jest z sumą kontrolną ostatniego 'commit'.
+
+Każdy klon mógłby posiadać taki licznik, jednak byłby on prawdopodobnie bezużyteczny, ponieważ tylko licznik centralnego repozytoriom ma znaczenie.
+
+=== Puste katalogi ===
+
+Nie ma możliwości kontroli wersji pustych katalogów. Aby obejść ten problem wystarczy utworzyć w takim katalogu plik dummy.
+
+To raczej obecna implementacja Gita, a mniej jego konstrukcja, jest odpowiedzialna za to wadę. Przy odrobinie szczęścia, jeśli Git jeszcze bardziej się upowszechni i więcej użytkowników żądać będzie tej funkcji, to być może zostanie zaimplementowana.
+
+=== Pierwszy 'commit' ===
+
+Stereotypowy informatyk liczy od 0 zamiast 1. Niestety, w kwestii 'commits' Git nie podąża za tą konwencją. Wiele komend marudzi przed wykonaniem pierwszego 'commit'. Dodatkowo, różnego rodzaju krańcowe przypadki muszą być traktowane specjalnie, jak 'rebase' dla 'branch' o różniącym się pierwszym 'commit'.
+
+Git zyskałby na zdefiniowaniu tzw. 'zero-commit', ponieważ zaraz po zainicjowaniu repozytorium, 'HEAD' otrzymałby 20 bajtowy hash SHA1. Ten specjalny 'commit' reprezentowałby puste drzewo, bez rodziców, być może pradziad wszystkich repozytoriów.
+
+Jeśli na przykład użytkownik wykonałby polecenie *git log*, zostałby poinformowany, że nie istnieje jeszcze żaden 'commit', gdzie na dzień dzisiejszy taka komenda wywoła błąd. Analogicznie dzieje się też z innymi poleceniami.
+
+Każdy inicjujący 'commit' byłby pochodną tego zerowego 'commit'.
+
+Niestety występuje jeszcze kilka innych problemów. Jeśli chcemy scalić kilka 'branches' o różniących się inicjalnych 'commits' i przeprowadzić 'rebase', musimy ingerować ręcznie.
+
+=== Charakterystyka zastosowania ===
+
+Dla 'commits' A i B, znaczenie wyrażeń "A..B" i "A...B" zależy od tego, czy polecenie oczekuje dwóch punktów końcowych, czy zakresu. Sprawdź *git help diff* i *git help rev-parse*.
diff --git a/pl/grandmaster.txt b/pl/grandmaster.txt
new file mode 100644
index 00000000..f066d77a
--- /dev/null
+++ b/pl/grandmaster.txt
@@ -0,0 +1,179 @@
+== Git dla zaawansowanych ==
+
+W międzyczasie powinnaś umieć odnaleźć się na stronach *git help* i rozumieć większość zagadnień. Mimo to może okazać się dość mozolne odnalezienie odpowiedniej komendy dla rozwiązania pewnego zadania. Może uda mi się zaoszczędzić ci trochę czasu: poniżej znajdziesz kilka przepisów, które były mi przydatne w przeszłości.
+
+=== Publikowanie kodu źródłowego ===
+
+Git zarządza w moich projektach dokładnie tymi danymi, które chcę archiwizować i dać do dyspozycji innym użytkownikom. Aby utworzyć archiwum tar kodu źródłowego, używam polecenia:
+
+ $ git archive --format=tar --prefix=proj-1.2.3/ HEAD
+
+=== Zmiany dla 'commit' ===
+
+Powiadomienie Gita o dodaniu, skasowaniu czy zmianie nazwy plików może okazać sie przy niektórych projektach dość uciążliwą pracą. Zamiast tego można skorzystać z:
+
+ $ git add .
+ $ git add -u
+
+Git przyjży się danym w aktualnym katalogu i odpracuje sam szczegóły. Zamiast tego drugiego polecenia możemy użyć `git commit -a`, jeśli i tak mamy zamiar przeprowadzić 'comit'. Sprawdź też *git help ignore*, by dowiedzieć się jak zdefiniować dane, które powinny być zignorowane.
+
+Można to także wykonać za jednyym zamachem:
+
+ $ git ls-files -d -m -o -z | xargs -0 git update-index --add --remove
+
+Opcje *-z* i *-0* zapobiegą przed niechcianymi efektmi ubocznymi przez niestandardowe znaki w nazwach plików. Ale ponieważ to polecenie dodaje również pliki które powinny być zignorowane, można dodać do niego jeszcze opcje `-x` albo `-X`
+
+=== Mój 'commit' jest za duży! ===
+
+Od dłuższego czasu nie pamiętałaś o wykonaniu 'commit'? Tak namiętnie programowałaś, że zupełnie zapomniałaś o kontroli kodu źródłowego? Przeprowadzasz serię niezależnych zmian, bo jest to w twoim stylu?
+
+Nie ma sprawy, wpisz polecenie:
+
+ $ git add -p
+
+Dla każdej zmiany, której dokonałaś Git pokaże ci pasaże z kodem, który uległ zmianom i spyta cię, czy mają zostać częścią następnego 'commit'. Odpowiedz po prostu "y" dla tak, albo "n" dla nie. Dysponujesz jeszcze innymi opcjami, na przykład dla odłożenie w czasie decyzji, wpisz "?", by dowiedzieć się więcej.
+
+Jeśli jesteś już zadowolony z wyniku, wpisz:
+
+ $ git commit
+
+by dokonać wybranych zmian. Uważaj tylko, by nie skorzystać z opcji *-a*, ponieważ wtedy git dokona 'commit' zawierający wszystkie zmiany.
+
+A co, jeśli pracowałaś nad wieloma danymi w wielu różnych miejscach? Sprawdzenie każdej danej z osobna jest zarówno frustrujące, jak i męczące. W takim wypadku skorzystaj z *git add -i*, obsługa tego polecenia może nie jest zbyt łatwa, za to jednak bardzo elastyczna. Kilkoma naciśnięciami klawiszy możesz wiele zmienionych plików dodać ('stage') albo usunąć z 'commit' ('unstage'), jak również sprawdzić, czy dodać zmiany dla poszczególnych plików. Alternaywnie możesz skorzystać z *git commit \--interactive*, polecenie to wykona automatycznie 'commit' gdy skończysz.
+
+=== Index: rusztowanie Gita ===
+
+Do tej pory staraliśmy się omijać sławny 'indeks', jednak przyszedł czas się nim zająć, aby móc wyjaśnić wszystko to co poznaliśmy do tej pory. Index jest tymczasową przechowalnią. Git rzadko wymienia dane bezpośrednio między twoim projektem a swoją historią wersji. Raczej zapisuje on dane najpierw w indeksie, dopiero po tym kopiuje dane z indeksu na ich właściwe miejsce przeznaczenia.
+
+Na przykład polecenie *commit -a* jest właściwie procesem dwustopniowym. Pierwszy krok to stworzenie obrazu bieżącego statusu każdego monitorowanego pliku do indeksu. Drugim krokiem jest trwałe zapamiętanie obrazu do indeksu. Wykonanie 'commit' bez opcji *-a* wykona jedynie drugi wspomniany krok i ma jedynie sens, jeśli poprzednio wykonano komendę, która dokonała odpowiednich zmian w indeksie, na przykład *git add*.
+
+Normalnie możemy ignorować indeks i udawać, że czytamy i zapisujemy bezpośrednio z historii. W tym wypadku chcemy posiadać jednak większą kontrolę, więc manipulujemy indeks. Tworzymy obraz niektórych, jednak nie wszystkich zmian w indeksie i później zapamiętujemy trwale starannie dobrany obraz.
+
+=== Nie trać głowy! ===
+
+Identyfikator 'HEAD' zachowuje się jak kursor, który zwykle wskazuje na najmłodszy 'commit' i z każdym nowym 'commit' zostaje przesunięty do przodu. Niektóre komendy Gita pozwolą ci nim manipulować. Na przyklad:
+
+ $ git reset HEAD~3
+
+przesunie identyfikator 'HEAD' o 3 'commits' z powrotem. Spowoduje to, że wszystkie następne komendy Gita będą reagować, jakby tych trzech ostatnich 'commits' wogóle nie było, podczas gdy twoje dane zostaną w przyszłości. Na stronach pomocy Gita znajdziesz więcej takich zastosowań.
+
+Ale jak teraz wrócić znów do przyszłości? Poprzednie 'commits' nic nie wiedzą o jej istnieniu.
+
+Jeśli posiadasz hash SHA1 orginalnego 'HEAD', wtedy możesz wrócić komendą:
+
+ $ git reset 1b6d
+
+Wyobraź jednak sobie, że nigdy go nie notowałaś? Nie ma sprawy: Przy wykonywaniu takich poleceń Git archiwizuje orginalny HEAD jako indentyfikator o nazwie ORIG_HEAD a ty możesz bezproblemowo wrócić używając:
+
+ $ git reset ORIG_HEAD
+
+=== Łowcy głów ===
+
+Może się zdarzyć, że ORIG_HEAD nie wystarczy. Może właśnie spostrzegłaś, iż dokonałaś kapitalnego błędu i musisz wrócić się do bardzo starego 'commit' w zapomnianym 'branch'.
+
+Standardowo Git zapamiętuje 'commit' przez przynajmniej 2 tygodnie, nawet jeśli poleciłaś zniszczyć 'branch' w którym istniał. Problemem staje się tutaj odnalezienie odpowieniej sumy kontrolnej SHA1. Możesz po kolei testować wszystkie hashe SHA1 w `.git/objects` i w ten sposób próbować odnaleźć szukany 'commit'. Istnieje jednak na to dużo prostszy sposób.
+
+Git zapamiętuje każdy obliczony hash SHA1 dla odpowiednich 'commit' w `.git/logs`. Podkatalog `refs` zawieza przebieg wszystkich aktywności we wszystkich 'branches', podczas gdy plik `HEAD` wszystkie klucze SHA1 które kiedykolwiek posiadał. Ostatnie możemy zastosować do odnalezienia sum kontrolnych SHA1 tych 'commits' które znajdowały się w nieuważnie usuniętym 'branch'.
+
+Polecenie 'reflog' daje nam do dyspozycji przyjazny interfejs do tych właśnie logów. Wypróbuj polecenie:
+
+ $ git reflog
+
+Zamiast kopiować i wklejać klucze z 'reflog', możesz:
+
+ $ git checkout "@{10 minutes ago}"
+
+Albo przywołaj 5 z ostatnio oddwiedzanych 'commits' za pomocą:
+
+ $ git checkout "@{5}"
+
+Jeśli chciałbyś pogłębić wiedze na ten temat przeczytaj sekcję ``Specifying Revisions`` w *git help rev-parse*.
+
+Byś może zechcesz zmienić okres karencji dla przeznaczonych na stracenie 'commits'. Na przyklad:
+
+ $ git config gc.pruneexpire "30 days"
+
+znaczy, że skasowany 'commit' zostanie nieuchronnie utracony dopiero po 30 dniach od wykonania polecenia *git gc*.
+
+Jeśli chcałbyś zapobiec automatyycznemu wykonywaniu *git gc*:
+
+ $ git config gc.auto 0
+
+wtedy 'commits' będą tylko wtedy usuwane, gdy ręcznie wykonasz polecenie *git gc*.
+
+=== Budować na bazie Gita ===
+
+W prawdziwym unixowym świecie sama konstrukcja Gita pozwala na wykorzystanie go jako funkcji niskiego poziomu przez inne aplikacje, jak na przykład interfejsy graficzne i aplikacje internetowe, alternatywne narzędzia konsoli, narzędzia patchujące, narzędzia pomocne w importowaniu i konwertowaniu i tak dalej. Nawek same polecenia Git są czasami malutkimi skryptami, jak krasnoludki na ramieniu olbrzyma. Przykładając trochę ręki możesz adoptować Git do twoich własnych potrzeb.
+
+Prostą sztuczką może być korzystanie z zintegrowanej w Git funkcji aliasu, by skrócić najczęściej stosowane polecenia:
+
+ $ git config --global alias.co checkout
+ $ git config --global --get-regexp alias # wyświetli aktualne aliasy
+ alias.co checkout
+ $ git co foo # to samo co 'git checkout foo'
+
+Czymś troszeczkę innym będzie zapis nazwy aktualnego 'branch' w prompcie lub jako nazwy okna. Polecenie:
+
+ $ git symbolic-ref HEAD
+
+pokaże nazwę aktualnego 'branch'. W praktyce chciałbyś raczej usunąć "refs/heads/" i ignorować błędy:
+
+ $ git symbolic-ref HEAD 2> /dev/null | cut -b 12-
+
+Podkatakog +contrib+ jest wielkim znaleziskiem narzędzi zbudowanych dla Gita. Z czasem niektóre z nich mogą uzyskać status oficjalnych poleceń. W dystrybucjach Debiana i Ubuntu znajdziemy ten katalog pod +/usr/share/doc/git-core/contrib+.
+
+Ulubionym przedstawicielem jest +workdir/git-new-workdir+. Poprzez sprytne przelinkowania skrypt ten tworzy nowy katalog roboczy, który dzieli swoją historię wersji z oryginalnym repozytorium:
+
+ $ git-new-workdir istniejacy/repo nowy/katalog
+
+Ten nowy katalog i znajdujące się w nim pliki można sobie wyobrazić jako klon, z tą różnicą, że ze względu na wspólną niepodzieloną historie obie wersje pozostaną zsynchronizowane. Synchronizacja za pomocą 'merge', 'push', czy 'pull' nie będzie konieczna.
+
+=== Śmiałe wyczyny ===
+
+Obecnie Git dość dobrze chroni użytkownika przed przypadkowym zniszczeniem danych. Ale, jeśli wiemy co robić, możemy obejść środki ochrony najczęściej stosowanych poleceń.
+
+*Checkout*: nie wersjonowane zmiany doprowadzą do niepowodzenia polecenia 'checkout'. Aby mimo tego zniszczyć zmiany i przywołać istniejący 'commit', możemy skorzystać z opcji 'force':
+
+ $ git checkout -f HEAD^
+
+Jeśli poleceniu 'checkout' podamy inną ścieżkę, środki ochrony nie znajdą zastosowania. Podana ścieżka zostanie bez pytania zastąpiona. Bądź ostrożny stosując 'checkout' w ten sposób.
+
+*reset*: reset odmówi pracy, jeśli znajdzie niewersjonowane zmiany. By zmusić go do tego, możesz użyć:
+
+ $ git reset --hard 1b6d
+
+*Branch*: Skasowanie 'branches' też się nie powiedzie, jeśli mogłyby przez to zostać utracone zmiany. By wymusić skasowanie, podaj:
+
+ $ git branch -D martwy_branch # zamiast -d
+
+Również nie uda się próba przesunięcia 'branch' poleceniem 'move', jeśliby miałoby to oznaczać utratę danych. By wymusić przesunięcie, podaj:
+
+ $ git branch -M źródło cel # zamiast -m
+
+Inaczej niż w przypadku 'checkout' i 'reset', te oba polecenia przesuną zniszczenie danych. Zmiany te zostaną zapisane w podkatalogu .git i mogą znów zostać przywrócone, jeśli znajdziemy odpowiedni hash SHA1 w `.git/logs` (zobacz "Łowcy głów" powyżej). Standardowo dane te pozostają jeszcze przez 2 tygodnie.
+
+*clean*: Różnorakie polecenia Git nie chcą zadziałać, ponieważ podejżewają konflikty z niewersjonowanymi danymi. Jeśli jesteś pewny, że wszystkie niezwersjonowane pliki i katalogi są zbędne, skasujesz je bezlitośnie poleceniem:
+
+ $ git clean -f -d
+
+Następnym razem te uciążliwe polecenia zaczną znów być posłuszne.
+
+=== Zapobiegaj złym 'commits' ===
+
+Głupie błędy zaśmiecają moje repozytoria. Najbardziej fatalny jest brak plików z powodu zapomnianych *git add*. Mniejszymi usterkami mogą być spacje na końcu linii i nierozwiązane konflikty poleceń 'merge': mimo iż nie są groźne, życzyłbym sobie, by nigdy nie wystąpiły publicznie.
+
+Gdybym tylko zabezpieczył się wcześniej, stosując prosty _hook_, który alarmowałby mnie przy takich problemach.
+
+ $ cd .git/hooks
+ $ cp pre-commit.sample pre-commit # Starsze wersje Gita wymagają jeszcze: chmod +x pre-commit
+
+I już 'commit' przerywa, jeśli odkryje niepotrzebne spacje na końcu linii albo nierozwiązane konflikty 'merge'.
+
+Na początku *pre-commit* tego 'hook' umieściłbym dla ochrony przed rozdrobnieniem:
+
+ if git ls-files -o | grep '\.txt$'; then
+ echo FAIL! Untracked .txt files.
+ exit 1
+ fi
+
+Wiele operacji Gita pozwala na używanie 'hooks'; zobacz też: *git help hooks*. We wcześniejszym rozdziale "Git poprzez http" przytoczyliśmy przykład 'hook' dla *post-update*, który wykonywany jest zawsze, jeśli znacznik 'HEAD' zostaje przesunięty. Ten przykładowy skrypt 'post-update' aktualizuje dane, które potrzebne są do komunikacji poprzez 'Git-agnostic transports', jak na przykład HTTP.
diff --git a/pl/history.txt b/pl/history.txt
new file mode 100644
index 00000000..5da4362c
--- /dev/null
+++ b/pl/history.txt
@@ -0,0 +1,195 @@
+== Lekcja historii ==
+
+Jedną z charakterystycznych cech rozproszonej natury Git jest to, że jego kronika historii może być łatwo edytowana. Ale jeśli masz zamiar manipulować przeszłością, bądź ostrożny: zmieniaj tylko tą część historii, którą wyłącznie jedynie ty sam posiadasz. Tak samo jak Narody ciągle dyskutują, który jakie popełnił okrucieństwa, popadniesz w kłopoty przy synchronizacji, jeśli ktoś inny posiada klon z różniącą się historią i jeśli te odgałęzienia mają się wymieniać.
+
+Niektórzy programiści zarzekają się w kwestii nienaruszalności historii - ze wszystkimi jej błędami i niedociągnięciami. Inni uważają, że odgałęzienia powinny dobrze się prezentować nim zostaną przedstawione publicznie. Git jest wyrozumiały dla obydwu stron. Tak samo jak 'clone', 'branch', czy 'merge', możliwość zmian kroniki historii to tylko kolejna mocna strona Gita. Stosowanie lub nie, tej możliwości zależy wyłącznie od ciebie.
+
+=== Muszę się skorygować ===
+
+Właśnie wykonałaś 'commit', ale chętnie chciałbyś podać inny opis? Wpisujesz:
+
+ $ git commit --amend
+
+by zmienić ostatni opis. Zauważasz jednak, że zapomniałaś dodać jakiegoś pliku? Wykonaj *git add*, by go dodać a następnie poprzednią instrukcje.
+
+Chcesz wprowadzić jeszcze inne zmiany do ostatniego 'commit'? Wykonaj je i wpisz:
+
+$ git commit --amend -a
+
+=== ... i jeszcze coś ===
+
+Załóżmy, że poprzedni problem będzie 10 razy gorszy. Po dłuższej sesji zrobiłaś całą masę 'commits'. Nie jesteś jednak szczęśliwy z takiego zorganizowania, a niektóre z 'commits' mogłyby być inaczej sformułowane. Wpisujesz:
+
+ $ git rebase -i HEAD~10
+
+a ostatnie 10 'commits' pojawią się w preferowanym przez ciebie edytorze. Przykładowy wyciąg:
+
+ pick 5c6eb73 Added repo.or.cz link
+ pick a311a64 Reordered analogies in "Work How You Want"
+ pick 100834f Added push target to Makefile
+
+Starsze 'commits' poprzedzają młodsze, inaczej niż w poleceniu `log`
+Tutaj 5c6eb73 jest najstarszym 'commit', a 100834f najnowszym. By to zmienić:
+
+- Usuń 'commits' poprzez skasowanie linii. Podobnie jak polecenie 'revert', będzie to jednak wyglądało jakby wybrane 'commit' nigdy nie istniały.
+- Przeorganizuj 'commits' przesuwając linie.
+- Zamień `pick` na:
+ * `edit` by zaznaczyć 'commit' do 'amend'.
+ * `reword`, by zmienić opisy logu.
+ * `squash` by połączyć 'commit' z poprzednim ('merge').
+ * `fixup` by połączyć 'commit' z poprzednim ('merge') i usunąć zapisy z logu.
+
+Na przykład chcemy zastąpić drugi `pick` na `squash`:
+
+Zapamiętaj i zakończ. Jeśli zaznaczyłaś jakiś 'commit' do 'edit', wpisz:
+
+ $ git commit --amend
+
+ pick 5c6eb73 Added repo.or.cz link
+ squash a311a64 Reordered analogies in "Work How You Want"
+ pick 100834f Added push target to Makefile
+
+Po zapamiętaniu i wyjściu Git połączy a311a64 z 5c6eb73.
+Thus *squash* merges
+into the next commit up: think ``squash up''.
+
+Git połączy wiadomości logów i zaprezentuje je do edycji. Polecenie *fixup* pominie ten krok, wciśnięte logi zostaną pominięte.
+
+Jeśli zaznaczyłeś 'commit' opcją *edit*, Git przeniesie cię do najstarszego takiego 'commit'. Możesz użyć 'amend', jak opisane w poprzednim rozdziale, i utworzyć nowy 'commit' mający się tu znaleźć. Gdy już będziesz zadowolony z ``retcon'', przenieś się na przód w czasie:
+
+ $ git rebase --continue
+
+Git powtarza 'commits' aż do następnego *edit* albo na przyszłość, jeśli żadne nie stoją na prożu.
+
+Możesz równierz zrezygnować z 'rebase':
+
+ $ git rebase --abort
+
+A więc, stosuj polecenie 'commit' wcześnie i często: możesz później zawsze posprzątać za pomocą 'rebase'.
+
+=== Lokalne zmiany na koniec ===
+
+Pracujesz nad aktywnym projektem. Z biegiem czasu nagromadziło się wiele 'commits' i wtedy chcesz zsynchronizować za pomocą 'merge' z oficjalną gałęzią. Ten cykl powtarza się kilka razy zanim jesteś gotowy na 'push' do centralnego drzewa.
+
+Teraz jednak historia w twoim lokalnym klonie jest chaotycznym pomieszaniem twoich zmian i zmian z oficjalnego drzewa. Chciałbyś raczej widzieć twoje zmiany uporządkowane chronologicznie w jednej sekcji i za oficjalnymi zmianami.
+
+To zadanie dla *git rebase*, jak opisano powyżej. W wielu przypadkach możesz skorzystać z przełącznika *--onto* by zapobiec interakcji.
+
+Przeczytaj też *git help rebase* dla zapoznania się z obszernymi przykładami tej zadziwiającej funkcji. Możesz również podzielić 'commits'. Możesz nawet przeorganizować 'branches' w repozytorium.
+
+Bądź ostrożny korzystając z 'rebase', to bardzo mocne polecenie. Zanim dokonasz skomplikowanych 'rebase', zrób backup za pomocą *git clone*
+
+=== Przepisanie historii ===
+
+Czasami potrzebny ci rodzaj systemu kontroli porównywalnego do wyretuszowania osób z oficjalnego zdjęcia, by w stalinowski sposób wymazać je z historii. Wyobraź sobie, że chcesz opublikować projekt, jednak zawiera on pewny plik, który z jakiegoś ważnego powodu musi pozostać utajniony. Być może zapisałem numer karty kredytowej w danej tekstowej i nieumyślnie dodałem do projektu? Skasowanie tej danej nie ma sensu, ponieważ poprzez starsze 'commits' można nadal ją przywołać. Musimy ten plik usunąć ze wszystkich 'commits':
+
+ $ git filter-branch --tree-filter 'rm bardzo/tajny/plik' HEAD
+
+Sprawdź *git help filter-branch*, gdzie przykład ten został wytłumaczony i przytoczona została jeszcze szybsza metoda. Ogólnie poprzez *filter-branch* da się dokonać zmian w dużych zakresach historii poprzez tylko jedno polecenie.
+
+Po tej operacji katalog +.git/refs/original+ opisuje stan przed jej wykonaniem. Sprawdź czy 'filter-branch' zrobił to, co od niego oczekiwałaś, następnie skasuj ten katalog zanim wykonasz następne polecenia 'filter-branch'.
+
+Wreszcie zamień wszystkie klony twojego projektu na zaktualizowaną wersję, jeśli masz zamiar prowadzić z nimi wymianę.
+
+=== Tworzenie historii ===
+
+[[makinghistory]]
+Masz zamiar przenieść projekt do Gita? Jeśli twój projekt był dotychczas zarządzany jednym z bardziej znanych systemów, to istnieje duże prawdopodobieństwo, że ktoś napisał już odpowiedni skrypt, który umożliwi ci eksportowanie do Gita całej historii.
+
+W innym razie przyjrzyj się funkcji *git fast-import*, która wczytuje tekst w specjalnym formacie by następnie odtworzyć całą historię od początku. Często taki skrypt pisany jest pośpiesznie i służy do jednorazowego wykorzystania, aby tylko w jednym przebiegu udała się migracja projektu.
+
+Utwórz na przykład z następującej listy tymczasowy plik, na przykład jako: `/tmp/history`:
+----------------------------------
+commit refs/heads/master
+committer Alice Thu, 01 Jan 1970 00:00:00 +0000
+data <
+
+int main() {
+ printf("Hello, world!\n");
+ return 0;
+}
+EOT
+
+
+commit refs/heads/master
+committer Bob Tue, 14 Mar 2000 01:59:26 -0800
+data <
+
+int main() {
+ write(1, "Hello, world!\n", 14);
+ return 0;
+}
+EOT
+
+----------------------------------
+
+Następnie utwórz repozytorium Git z tymczasowego pliku poprzez wpisanie:
+
+ $ mkdir project; cd project; git init
+ $ git fast-import --date-format=rfc2822 < /tmp/history
+
+Aktualną wersję projektu możesz przywołać poprzez:
+
+ $ git checkout master
+
+Polecenie *git fast-export* konwertuje każde repozytorium do formatu *git fast-import*, możesz przestudiować komunikaty tego polecenia, jeśli masz zamiar napisać programy eksportujące a oprócz tego, by przekazywać repozytoria jako czytelne dla ludzi zwykłe pliki tekstowe. To polecenie potrafi przekazywać repozytoria za pomocą zwykłego pliku tekstowego.
+
+=== Gdzie wszystko się zepsuło? ===
+
+Właśnie znalazłaś w swoim programie funkcję, która już nie chce działać, a jesteś pewna, że czyniła to jeszcze kilka miesięcy temu. Ach! Skąd wziął się ten błąd? A gdybym tylko lepiej przetestowała ją wcześniej, zanim weszła do wersji produkcyjnej.
+
+Na to jest już za późno. Jakby nie było, pod warunkiem, że często używałaś 'commit', Git może ci zdradzić gdzie szukać problemu.
+
+ $ git bisect start
+ $ git bisect bad HEAD
+ $ git bisect good 1b6d
+
+Git przywoła stan, który leży dokładnie pośrodku. Przetestuj funkcję, a jeśli ciągle jeszcze nie działa:
+
+ $ git bisect bad
+
+Jeśli nie, zamień "bad" na "good". Git przeniesie cię znowu do stanu dokładnie pomiędzy znanymi wersjami "good" i "bad", redukując w ten sposób możliwości. Po kilku iteracjach doprowadzą cię te poszukiwania do 'commit', który jest odpowiedzialny za kłopoty. Po skończeniu dochodzenia przejdź do oryginalnego stanu:
+
+ $ git bisect reset
+
+Zamiast sprawdzania zmian ręcznie, możesz zautomatyzować poszukiwania za pomocą skryptu:
+
+ $ git bisect run mój_skrypt
+
+Git korzysta tutaj z wartości zwróconej przez skrypt, by ocenić czy zmiana jest dobra ('good'), czy zła ('bad'): Skrypt powinien zwracać 0 dla 'good', 128, jeśli zmiana powinna być pominięta, i coś pomiędzy 1 - 127 dla 'bad'. Jeśli wartość zwrócona jest ujemna, program 'bisect' przerywa pracę.
+
+Możesz robić jeszcze dużo innych rzeczy: w pomocy znajdziesz opis w jaki sposób wizualizować działania 'bisect', sprawdzić czy powtórzyć log bisect, wyeliminować nieistotne zmiany dla zwiększenia prędkości poszukiwań.
+
+=== Kto ponosi odpowiedzialność? ===
+
+Jak i wiele innych systemów kontroli wersji również i Git posiada polecenie 'blame':
+
+ $ git blame bug.c
+
+które komentuje każdą linię podanego pliku, by pokazać kto ją ostatnio zmieniał i kiedy. W przeciwieństwie do wielu innych systemów, funkcja ta działa offline, czytając tylko z lokalnego dysku.
+
+=== Osobiste doświadczenia ===
+
+W scentralizowanym systemie kontroli wersji praca nad kroniką historii jest skomplikowanym zadaniem i zarezerwowanym głównie dla administratorów. Polecenia 'clone', 'branch' czy 'merge' nie są możliwe bez podłączenia do sieci. Również takie podstawowe funkcje, jak przeszukanie historii czy 'commit' jakiejś zmiany. W niektórych systemach użytkownik potrzebuje działającej sieci nawet by zobaczyć dokonane przez siebie zmiany, albo by w ogóle otworzyć plik do edycji.
+
+Scentralizowane systemy wykluczają pracę offline i wymagają drogiej infrastruktury sieciowej, w szczególności gdy wzrasta liczba programistów. Najgorsze jednak, iż z czasem wszystkie operacje stają się wolniejsze, z reguły do osiągnięcia punktu, gdzie użytkownicy unikają zaawansowanych poleceń, aż staną się one absolutnie konieczne. W ekstremalnych przypadkach dotyczy to również poleceń podstawowych. Jeśli użytkownicy są zmuszeni do wykonywania powolnych poleceń, produktywność spada, ponieważ ciągle przerywany zostaje tok pracy.
+
+Dowiedziałem się o tym fenomenie na sobie samym. Git był pierwszym systemem kontroli wersji którego używałem. Szybko dorosłem do tej aplikacji i przyjąłem wiele funkcji za oczywiste. Wychodziłem też z założenia, że inne systemy są podobne: wybór systemu kontroli wersji nie powinien zbyt bardzo odbiegać od wyboru edytora tekstu, czy przeglądarki internetowej.
+
+Byłem zszokowany, gdy musiałem później korzystać ze scentralizowanego systemu. Niesolidne połączenie internetowe ma niezbyt duży wpływ na Gita, praca staje się jednak prawie nie możliwa, gdy wymagana jest niezawodność porównywalny z lokalnym dyskiem. Poza tym sam łapałem się na tym, że unikałem pewnych poleceń i związanym z nimi czasem oczekiwania, w sumie wszystko to wpływało mocno na wypracowany przeze mnie system pracy.
+
+Gdy musiałem wykonywać powolne polecenia, z powodu ciągłego przerywanie toku myślenia, powodowałem nieporównywalne szkody dla całego przebiegu pracy. Podczas oczekiwania na zakończenie komunikacji pomiędzy serwerami dla przeczekania zaczynałem robić coś innego, na przykład czytałem maile albo pisałem dokumentację. Gdy wracałem do poprzedniego zajęcia, po zakończeniu komunikacji, dawno straciłem wątek i traciłem czas, by znów przypomnieć sobie co właściwie miałem zamiar zrobić. Ludzie nie potrafią dobrze dostosować się do częstej zmiany kontekstu.
+
+Był też taki ciekawy efekt http://pl.wikipedia.org/wiki/Tragedia_wspólnego_pastwiska[tragedii wspólnego pastwiska]: przypominający przeciążenia w sieci - pojedyncze indywidua pochłaniają więcej pojemności sieci niż to konieczne, by uchronić się przed mogącymi ewentualnie wystąpić w przyszłości niedoborami. Suma tych starań pogarsza tylko przeciążenia, co motywuje jednostki do zużywania jeszcze większych zasobów, by ochronić się przed jeszcze dłuższymi czasami oczekiwania.
diff --git a/pl/intro.txt b/pl/intro.txt
new file mode 100644
index 00000000..6c11d9ab
--- /dev/null
+++ b/pl/intro.txt
@@ -0,0 +1,57 @@
+== Wprowadzenie ==
+
+By wprowadzić w zagadnienie kontroli wersji, posłużę się pewną analogią. Dla bardziej rozsądnego wyjaśnienia przeczytajcie http://pl.wikipedia.org/wiki/System_kontroli_wersji[Artykuł Wikipedii] na ten temat.
+
+=== Praca jest zabawą ===
+
+Gram w gry komputerowe chyba już przez całe moje życie. W przeciwieństwie do tego, systemy kontroli wersji zacząłem stosować dopiero jako dorosły. Przypuszczam, że nie jestem tu odosobniony, a porównanie to pomoże mi w prosty sposób wytłumaczyć jego idee.
+
+Wyobraź sobie pracę nad twoim kodem albo edycję dokumentu jak granie na komputerze. Jeśli dobrze ci poszło, chcesz zabezpieczyć swoje osiągnięcia. W tym celu klikasz na 'zapisz' w wybranym edytorze.
+
+Niestety wymaże to poprzednio zapamiętaną wersję. To jak w grach starej szkoły, które posiadały pamięć na zapisanie tylko jednego stanu: oczywiście, mogłaś zapamiętać, ale już nigdy nie mogłaś powrócić do poprzednio zapisanej wersji. To była hańba, bo być może poprzednio zabezpieczony stan znajdował się w jakimś bardzo interesującym miejscu gry, do którego chętnie chciałbyś jeszcze kiedyś wrócić. Albo jeszcze gorzej, twój zabezpieczony stan utknął w niemożliwym do dokończenia gry miejscu i musisz zacząć wszystko od początku.
+
+=== Kontrola wersji ===
+
+Podczas edytowania dokumentu, by uchronić starą wersję, możesz poprzez wybranie 'zapisz jako ...' zapisać twój dokument pod inną nazwą lub zapamiętać w innym miejscu. Poza tym możesz go jeszcze spakować, by zaoszczędzić miejsce na dysku. Jest to prymitywna i pracochłonna forma kontroli wersji. Gry komputerowe robią tak już od długiego czasu, wiele z nich posiada tak automatycznie utworzone punkty opatrzone sygnaturą czasu.
+
+Skomplikujmy teraz trochę cały ten problem. Powiedzmy, że posiadasz całą masę plików, które w jakiś sposób są ze sobą powiązane, na przykład kod źródłowy jakiegoś projektu lub pliki strony internetowej. Jeśli chcesz otrzymać starszą wersję, musisz archiwizować cały katalog. Archiwizowanie w ten sposób wielu wersji jest pracochłonne i szybko może stać się kosztowne, zabierając niepotrzebnie miejsce na dysku.
+
+Niektóre gry komputerowe składały się rzeczywiście z jednego katalogu pełnego plików. Gry ukrywały szczegóły przed graczem i prezentowały wygodny interfejs, do zarządzania różnymi wersjami katalogu.
+
+Systemy kontroli wersji nie różnią się tutaj zbytnio. Wszystkie posiadają wygodne interfejsy, umożliwiającymi zarządzanie katalogami pełnymi plików. Możesz archiwizować stan katalogu tak często, jak często zechcesz i później możesz do każdego z tych punktów powrócić. W przeciwieństwie jednak do gier, są one z reguły wszystkie zoptymalizowane pod kątem oszczędności pamięci. W większości przypadków tylko niewiele danych ulega zmianie pomiędzy dwoma wersjami, a same zmiany nie są zbyt obszerne. Oszczędność miejsca na dysku polega głównie na zapamiętywaniu jedynie różnic, a nie kopii całego katalogu.
+
+=== Kontrola rozproszona ===
+
+Wyobraź sobie teraz bardzo trudną grę komputerową. Tak trudną, że wielu doświadczonych graczy na całym świecie postanawia o wspólnych siłach przejść grę, wymieniając się w tym celu swoimi wynikami. 'Speedruns' mogą posłużyć jako przykład z prawdziwego życia: gracze, którzy wyspecjalizowali się w różnych poziomach gry współpracują ze sobą dla uzyskania fascynujących wyników.
+
+W jaki sposób skonstruowałbyś taki system, który w prosty sposób byłby w stanie udostępnić osiągnięcia innych? I dodawał nowe?
+
+Kiedyś każdy projekt korzystał z własnego scentralizowanego systemu kontroli wersji. Jeden serwer zapamiętywał wszystkie gry, nikt inny. Każdy gracz posiadał jedynie kilka zapamiętanych na swoim komputerze gier. Jeśli jakiś gracz chciał popchać grę trochę do przodu, musiał najpierw załadować z serwera jej aktualny stan, trochę pograć, zapisać własny stan, a następnie załadować na serwer, by mógł go wykorzystać ktoś inny.
+
+A gdy jakiś gracz z jakiegoś powodu chce otrzymać jakiś starszy stan? Może aktualnie zapamiętany stan gry nie jest do przejścia, bo ktoś na trzecim poziomie zapomniał zabrać jakiś obiekt, no i teraz próbują znaleźć stan od którego startując gra znowu stanie się możliwa do przejścia. Albo chcą porównać dwa stany, by sprawdzić ile któryś gracz włożył pracy.
+
+Istnieje wiele powodów, dla których można chcieć zobaczyć straszą wersję, rezultat jednak jest zawsze taki sam. Za każdym razem trzeba ściągnąć wszystkie dane z serwera. Czym więcej gier zostało zapamiętanych, tym więcej wymaga to komunikacji.
+
+Nową generację systemów kontroli wersji, do których zalicza się również Git, nazywa się systemami rozproszonymi, mogą być one rozumiane jako uogólnienie systemów scentralizowanych. Jeśli gracze ładują teraz z serwera, otrzymują każdy zapisany stan, a nie tylko zapisany jako ostatni. Wygląda to, jak tworzenie kopii lustrzanej serwera.
+
+Stworzenie pierwszego klonu może wydać się drogie, przede wszystkim, jeśli projekt posiada długą historię, ale na dłuższy okres to się opłaci. Jedną z bezpośrednich zalet jest to, że kiedykolwiek potrzebny będzie nam jakiś starszy stan, komunikacja z głównym serwerem będzie zbędna.
+
+=== Głupi przesąd ===
+
+Szeroko rozpowszechnianym nieporozumieniem jest opinia, że rozproszony system nie nadaje się dla projektów wymagających oficjalnego centralnego repozytorium. Nic bardziej mylnego. Fotografując kogoś, nie kradniemy od razu jego duszy. Tym samym klonowanie centralnego repozytorium nie umniejsza jego znaczenia.
+
+Jednym z pierwszych pozytywnych skutków jest to, iż wszystko co potrafi scentralizowany system kontroli wersji, dobrze skonstruowany system rozproszony potrafi lepiej. Zasoby sieciowe są po prostu droższe niż zasoby lokalne. Nawet jeśli w późniejszym czasie dostrzeżemy pewne niedociągnięcia systemów rozproszonych, można powyższe przyjąć jako ogólną zasadę, unikając niestosownych porównań.
+
+Mały projekt wykorzysta prawdopodobnie tylko ułamek możliwości systemu. Ale, by od razu z tego powodu korzystać z prostszego systemu, nieposiadającego możliwości późniejszej rozbudowy, to tak jak stosowanie rzymskich cyfr do przeprowadzania obliczeń na małych liczbach.
+
+Ponadto możliwe, że twój projekt przerośnie początkowe oczekiwania. Używanie Gita od samego początku to jak noszenie ze sobą szwajcarskiego scyzoryka, nawet gdy najczęściej służy do otwierania butelek. Być może pewnego dnia będziesz pilnie potrzebowała użyć śrubokrętu, ucieszysz się, że masz przy sobie coś więcej niż tylko zwykły otwieracz.
+
+=== Kolizje przy scalaniu ===
+
+Do przedstawienia tego tematu wykorzystanie analogii do gier komputerowych byłoby naciągane. Wyobraźmy sobie znowu, że edytujemy dokument.
+
+Alicja dodaje linijkę na początku dokumentu, natomiast Bob linijkę na jego końcu. Obydwoje ładują swoje zmiany na serwer. Większość systemów automatycznie wybierze rozsądną drogę: zaakceptuje obie zmiany i połączy je ze sobą, tym samym obie poprawki wpłyną do dokumentu.
+
+Wyobraź sobie jednak, że Alicja i Bob dokonują zmian w tej samej linijce. W tym wypadku dalsza praca nie będzie możliwa bez ludzkiego udziału. Druga z osób, próbująca załadować dokument na serwer, zostanie poinformowana o wystąpieniu konfliktu podczas łączenia ('merge') i musi zadecydować, którą ze zmian przyjąć, ewentualnie ponownie zrewidować całą linijkę.
+
+Mogą wystąpić dużo bardziej skomplikowane sytuacje. Systemy kontroli wersji potrafią poradzić sobie z prostymi przypadkami, a te trudniejsze pozostawiają ludziom. Zazwyczaj sposób ich zachowania można skonfigurować.
diff --git a/pl/multiplayer.txt b/pl/multiplayer.txt
new file mode 100644
index 00000000..c90b9ca6
--- /dev/null
+++ b/pl/multiplayer.txt
@@ -0,0 +1,167 @@
+== Multiplayer Git ==
+
+Na początku zastosowałem Git w prywatnym projekcie, gdzie byłem jedynym programistą. Z poleceń, w związku z rozproszoną naturą Gita, potrzebowałem jedynie komendę *pull* i *clone*, dzięki czemu mogłem trzymać ten sam projekt w kilku miejscach.
+
+Później chciałem opublikować mój kod za pomocą Gita i dołączyć zmiany kolegów. Musiałem nauczyć się zarządzać projektami, nad którymi zaangażowani byli programiści z całego świata. Na szczęście jest to silną stroną Gita i chyba jego racją bytu.
+
+=== Kim jestem? ===
+
+Każdy 'commit' otrzymuje nazwę i adres e-mail autora, które zostaną pokazane w *git log*. Standardowo Git korzysta z ustawień systemowych do wypełnienia tych pól. Aby wprowadzić te dane bezpośrednio, podaj:
+
+ $ git config --global user.name "Jan Kowalski"
+ $ git config --global user.email jan.kowalski@example.com
+
+Jeśli opuścisz przełącznik '--global' zmiany zostaną zastosowane wyłącznie do aktualnego repozytorium.
+
+=== Git przez SSH, HTTP ===
+
+Załóżmy, posiadasz dostęp SSH do serwera stron internetowych, gdzie jednak Git nie został zainstalowany. Nawet, jeśli jest to mniej efektywne jak rodzimy protokół 'GIT', Git potrafi komunikować się również przez HTTP.
+
+Zładuj Git, skompiluj i zainstaluj pod własnym kontem oraz utwórz repozytorium w twoim katalogu strony internetowej.
+
+ $ GIT_DIR=proj.git git init
+ $ cd proj.git
+ $ git --bare update-server-info
+ $ cp hooks/post-update.sample hooks/post-update
+
+Przy starszych wersjach Gita samo polecenie 'cp' nie wystarczy, wtedy musisz jeszcze:
+
+ $ chmod a+x hooks/post-update
+
+Od teraz możesz publikować aktualizacje z każdego klonu poprzez SSH.
+
+ $ git push web.server:/sciezka/do/proj.git master
+
+i każdy może teraz sklonować twój projekt przez HTTP:
+
+ $ git clone http://web.server/proj.git
+
+=== Git ponad wszystko ===
+
+Chciałbyś synchronizować repozytoria bez pomocy serwera czy nawet bez użycia sieci komputerowej? Musisz improwizować w nagłym wypadku? Widzieliśmy, że poleceniami <>. W ten sposób możemy transportować tego typu pliki za pomocą dowolnego medium, jednak bardziej wydajnym narzędziem jest *git bundle*.
+
+Nadawca tworzy 'bundle':
+
+ $ git bundle create plik HEAD
+
+i transportuje 'bundle' +plik+ do innych zaangażowanych: przez e-mail, pendrive, *xxd* hexdump i skaner OCR, kod morsea, przez telefon, znaki dymne, itd. Odbiorca wyciąga 'commits' z 'bundle' poprzez podanie:
+
+ $ git pull plik
+
+Odbiorca może to zrobić z pustym repozytorium. Mimo swojej wielkości +plik+ zawiera kompletny oryginał repozytorium.
+
+W dużych projektach unikniesz śmieci danych, jeśli tylko zrobisz 'bundle' zmian brakujących w innych repozytoriach. Na przykład załóżmy, że 'commit' ``1b6d...'' jest najaktualniejszym, które posiadają obie partie:
+
+ $ git bundle create plik HEAD ^1b6d
+
+Jeśli robi się to regularnie, łatwo można zapomnieć, który 'commit' został wysłany ostatnio. Strony pomocy zalecają stosowanie tagów, by rozwiązać ten problem. To znaczy, po wysłaniu 'bundle', podaj:
+
+ $ git tag -f ostatni_bundle HEAD
+
+a nowy 'bundle' tworzymy następnie poprzez:
+
+ $ git bundle create nowy_bundle HEAD ^ostatni_bundle
+
+=== Patches: globalny środek płatniczy ===
+
+'Patches' to jawne zobrazowanie twoich zmian, które mogą być jednocześnie rozumiane przez komputer i człowieka. Dodaje im to uniwersalnej mocy przyciągania. Możesz wysłać patch prowadzącym projekt, niezależnie od tego, jakiego używają systemu kontroli wersji. Dopóty twoi współpracownicy potrafią czytać swoje maile, mogą widzieć również twoje zmiany. Również i z twojej strony wszystko, czego ci potrzeba to funkcjonujące konto e-mailowe: nie istnieje konieczność zakładania repozytorium online.
+
+Przypomnij sobie pierwszy rozdział:
+
+ $ git diff 1b6d > mój.patch
+
+produkuje 'patch', który można dołączyć do e-maila dla dalszej dyskusji. W repozytorium Git natomiast podajesz:
+
+ $ git apply < mój.patch
+
+By zastosować patch.
+
+W bardziej oficjalnym środowisku, jeśli nazwiska autorów i ich sygnatury powinny również być notowane, twórz 'patch' od pewnego punktu, po wpisaniu:
+
+ $ git format-patch 1b6d
+
+Uzyskane w ten sposób dane mogą przekazane być do *git-send-mail* albo odręcznie wysłane. Możesz podać grupę 'commits'
+
+ $ git format-patch 1b6d..HEAD^^
+
+Po stronie odbiorcy zapamiętaj e-mail jako daną i podaj:
+
+ $ git am < email.txt
+
+Patch zostanie wprowadzony i utworzy commit, włącznie z informacjami jak na przykład informacje o autorze.
+
+Jeśli stosujesz webmail musisz ewentualnie poszukać opcji pokazania treści w formie niesformatowanego textu, zanim zapamiętasz patch do pliku.
+
+Występują minimalne różnice między aplikacjami e-mailowymi bazującymi na mbox, ale jeśli korzystasz z takiej, należysz do grupy ludzi, która zapewne umie się z nimi obchodzić bez czytania instrukcji!
+
+=== Przepraszamy, przeprowadziliśmy się ===
+
+Po sklonowaniu repozytorium, polecenia *git push* albo *git pull* będą automatycznie wskazywały na oryginalne URL. Jak Git to robi? Tajemnica leży w konfiguracji, która utworzona zostaje podczas klonowania. Zaryzykujmy spojrzenie:
+
+ $ git config --list
+
+Opcja +remote.origin.url+ kontroluje źródłowe URL; ``origin'' to alias, nadany źródłowemu repozytorium. Tak jak i przy konwencji z 'master branch', możemy ten alias zmienić albo skasować, zwykle jednak nie ma powodów by to robić.
+
+Jeśli oryginalne repozytorium zostanie przesunięte, możemy zaktualizować link poprzez:
+
+ $ git config remote.origin.url git://nowy_link/proj.git
+
+Opcja +branch.master.merge+ definiuje standardowy 'remote-branch' dla *git pull*. Podczas początkowego klonowania, zostanie ustawiony na aktualny branch źródłowego repozytorium, że nawet i po tym jak 'HEAD' źródłowego repozytorium przejdzie do innego branch, późniejszy 'pull' pozostanie wierny oryginalnemu branch.
+
+Ta opcja jest ważna jedynie dla repozytorium, z którego dokonało się pierwszego klonowania, co zapisane jest w opcji +branch.master.remote+. Przy 'pull' z innego repozytorium musimy podać z którego branch chcemy korzystać.
+
+ $ git pull git://example.com/inny.git master
+
+To wyjaśnia dlaczego nasze poprzednie przykłady z 'push' i 'pull' nie posiadały argumentów.
+
+=== Oddalone 'Branches' ===
+
+Jeśli klonujesz repozytorium, klonujesz również wszystkie jego 'branches' Może jeszcze tego nie zauważyłaś, ponieważ Git je ukrywa: musisz się o nie specjalnie pytać: To zapobiega temu, że branches z oddalonego repozytorium nie przeszkadzają twoim lokalnym branches i czyni to Git łatwiejszym dla początkujących.
+
+Oddalone 'branches' możesz pokazać poprzez:
+
+ $ git branch -r
+
+Powinieneś zobaczyć coś jak:
+
+origin/HEAD origin/master origin/experimental
+
+Lista ta ukazuje branches i HEAD odległego repozytorium, które mogą być również stosowane w zwykłych poleceniach Git. Przyjmijmy, na przykład, że wykonałaś wiele commits i chciałbyś uzyskać porównanie do ostatnio ściągniętej wersji. Możesz przeszukać logi za odpowiednim hashem SHA1, ale dużo prościej jest podać:
+
+ $ git diff origin/HEAD
+
+Możesz też sprawdzić co działo się w 'branch' ``experimental'':
+
+ $ git log origin/experimental
+
+=== Więcej serwerów ===
+
+Przyjmijmy, dwóch innych programistów pracuje nad twoim projektem i chciałabyś mieć ich na oku. Możemy obserwować więcej niż jedno repozytorium jednocześnie:
+
+ $ git remote add inny git://example.com/jakies_repo.git
+ $ git pull inny jakis_branch
+
+Teraz przyłączyliśmy jeden 'branch' z dwóch repozytoriów i uzyskaliśmy łatwy dostęp do wszystkich 'branch' z wszystkich repozytoriów.
+
+ $ git diff origin/experimental^ inny/jakiś_branch~5
+
+Co jednak zrobić, gdy chcemy porównać zmiany w nich bez wpływu na naszą pracę? Innymi słowami, chcemy zbadać ich 'branches' bez importowania ich zmian do naszego katalogu roboczego. Zamiast 'pull' skorzystaj z:
+
+ $ git fetch # Fetch z origin, standard.
+ $ git fetch inne # Fetch od drugiego programisty.
+
+Polecenie to załaduje jedynie historię Mimo, że nasz katalog pozostał bez zmian, możemy teraz referować z każdego repozytorium poprzez polecenia Gita, ponieważ posiadamy lokalną kopię.
+
+Przypomnij sobie, że 'pull' za kulisami to to samo co 'fetch' z następującym za nim *merge*. W normalnym wypadku wykonalibyśmy *pull*, bo chcielibyśmy przywołać również ostatnie 'commmits'. Ta przywołana sytuacja jest wyjątkiem wartym wspomnienia.
+
+Sprawdź *git help remote* by zobaczyć, jak usuwa się repozytoria, ignoruje pewne branches i więcej.
+
+=== Moje ustawienia ===
+
+W moich projektach preferuję, gdy pomagający mi programiści przygotują własne repozytoria z których mogę wykonać 'pull'. Większość hosterów Gita pozwala na utworzenie jednym kliknięciem twojego własnego forka innego projektu.
+
+Gdy przywołałem moją gałęź korzystam z poleceń Gita dla nawigacji i kontroli zmian, które najlepiej, gdy są dobrze zorganizowane i udokumentowane. Wykonuję 'merge' moich własnych zmian i przeprowadzam ewentualnie dalsze zmiany. Gdy już jestem zadowolony, 'push' do centralnego repozytorium.
+
+Mimo, iż dość rzadko otrzymuję posty, jestem zdania, że ta metoda się opłaca. Zobacz http://torvalds-family.blogspot.com/2009/06/happiness-is-warm-scm.html[Post na Blogu Linusa Torvalds (po angielsku)].
+
+Pozostając w świecie Gita jest wygodniejsze niż otrzymywanie patchów, ponieważ zaoszczędza mi to konwertowanie ich do 'commits' Gita. Poza tym Git martwi się o szczegóły, jak nazwa autora i adres e-maila, tak samo jak i o datę i godzinę oraz motywuje autora do opisywania swoich zmian.
diff --git a/pl/preface.txt b/pl/preface.txt
new file mode 100644
index 00000000..0560761d
--- /dev/null
+++ b/pl/preface.txt
@@ -0,0 +1,58 @@
+= Git Magic =
+Ben Lynn
+Sierpień 2007
+
+== Przedmowa ==
+
+http://git-scm.com/[Git] to rodzaj scyzoryka szwajcarskiego dla kontroli wersji. To niezawodne, wielostronne narzędzie do kontroli wersji o niezwykłej elastyczności przysprawia trudności już w samym jego poznaniu, nie wspominając o opanowaniu.
+
+Jak stwierdził Arthur C. Clarke, każda wystarczająco postępowa technologia jest porównywalna z magią. Jest to wspaniałe podejście, by zacząć pracę z Gitem: Początkujący mogą zignorować jego wewnętrzne mechanizmy i ujrzeć jako rzecz, która urzeka przyjaciół swoimi niezwykłymi możliwościami, a przeciwników doprowadza do białej gorączki.
+
+Zamiast wchodzić w szczegóły, oferujemy proste instrukcje dla osiągnięcia zamierzonych efektów. W miarę regularnego korzystania stopniowo sam zrozumiesz jak każda z tych sztuczek funkcjonuje i jak dopasować podane instrukcje na twoje własne potrzeby.
+
+.Tłumaczenia
+
+ - link:/\~blynn/gitmagic/intl/zh_cn/[Chiński uproszczony]: od JunJie, Meng i JiangWei. Konwertacja do link:/~blynn/gitmagic/intl/zh_tw/[Tradycjonalnego chińskiego] za pomocą +cconv -f UTF8-CN -t UTF8-TW+.
+ - link:/~blynn/gitmagic/intl/fr/[Francuski]: od Alexandre Garel, Paul Gaborit, i Nicolas Deram.
+ - link:/~blynn/gitmagic/intl/de/[Niemiecki]: od Benjamin Bellee i Armin Stebich; również hostowany na http://gitmagic.lordofbikes.de/[stronie Armina].
+ - http://www.slideshare.net/slide_user/magia-git[Portugalski]: od Leonardo Siqueira Rodrigues [http://www.slideshare.net/slide_user/magia-git-verso-odt[wersja ODT]].
+ - link:/~blynn/gitmagic/intl/ru/[Rosyjski]: od Tikhon Tarnavsky, Mikhail Dymskov, i innych.
+ - link:/~blynn/gitmagic/intl/es/[Hiszpański]: od Rodrigo Toledo i Ariset Llerena Tapia.
+ - link:/~blynn/gitmagic/intl/uk/[Ukraiński]: od Volodymyr Bodenchuk.
+ - link:/~blynn/gitmagic/intl/vi/[Wietnamski]: od Trần Ngọc Quân; również hostowany http://vnwildman.users.sourceforge.net/gitmagic/[na tej stronie].
+
+.Inne wydania
+
+ - link:book.html[Jako jedna strona]: uszczuplone HTML, bez CSS.
+ - link:book.pdf[Wersja PDF]: przyjazna w druku.
+ - http://packages.debian.org/gitmagic[Pakiet Debiana], http://packages.ubuntu.com/gitmagic[Pakiet Ubuntu]: Pobiera szybką i lokalną kopię tej strony. Przydatne http://csdcf.stanford.edu/status/[gdyby ten serwer był offline].
+ - http://www.amazon.com/Git-Magic-Ben-Lynn/dp/1451523343/[Drukowane wydanie [Amazon.com]]: 64 strony, 15.24cm x 22.86cm, czarno-biały. Przyda się, gdy zabraknie prądu.
+
+
+=== Podziękowania! ===
+
+Jestem mile zaskoczony, że tak dużo ludzi pracowało nad przetłumaczeniem tych stron. Bardzo cenię, iż dzięki staraniom wyżej wspomnianych osób otrzymałem możliwość dotarcia do większego grona czytelników.
+
+Dustin Sallings, Alberto Bertogli, James Cameron, Douglas Livingstone, Michael Budde, Richard Albury, Tarmigan, Derek Mahar, Frode Aannevik, Keith Rarick, Andy Somerville, Ralf Recker, Øyvind A. Holm, Miklos Vajna, Sébastien Hinderer, Thomas Miedema, Joe Malin, i Tyler Breisacher przyczynilli się do poprawek i korektur.
+
+François Marier jest mentorem pakietu Debiana, który uprzednio utworzony został przez Daniela Baumann.
+
+Chciałbym podziękować również wszystkim innym za ich pomoc i dobre słowo. Chciałbym tu wszystkich wyszczególnić, mogłoby to jednak wzbudzić oczekiwania w szerokim zakresie.
+
+Gdybym o tobie przypadkowo zapomniał, daj mi znać albo przyślij mi po prostu patch.
+
+=== Licencja ===
+
+Ten poradnik publikowany jest na bazie licencji http://www.gnu.org/licenses/gpl-3.0.html[GNU General Public License Version 3]. Oczywiście, tekst źródłowy znajduje się w repozytorium Git i może zostać pobrany przez:
+
+ $ git clone git://repo.or.cz/gitmagic.git # Utworzy katalog "gitmagic".
+
+albo z serwerów lustrzanych:
+
+ $ git clone git://github.com/blynn/gitmagic.git
+ $ git clone git://gitorious.org/gitmagic/mainline.git
+ $ git clone https://code.google.com/p/gitmagic/
+ $ git clone git://git.assembla.com/gitmagic.git
+ $ git clone git@bitbucket.org:blynn/gitmagic.git
+
+GitHub, Assembla, i Bitbucket pozwalają na prowadzenie prywatnych repozytoriów, te dwa ostatnie za darmo.
diff --git a/pl/secrets.txt b/pl/secrets.txt
new file mode 100644
index 00000000..fb6a3833
--- /dev/null
+++ b/pl/secrets.txt
@@ -0,0 +1,146 @@
+== Uchylenie tajemnicy ==
+
+Rzućmy spojrzenie pod maskę silnika i wytłumaczymy w jaki sposób Git realizuje swoje cuda. Nie będę wchodził w szczegóły. Dla pogłębienia tematu odsyłam na http://www.kernel.org/pub/software/scm/git/docs/user-manual.html[angielskojęzyczny podręcznik użytkownika].
+
+=== Niewidzialność ===
+
+Jak to możliwe, że Git jest taki niepostrzeżony? Zapominając na chwilę o sporadycznych 'commits' i 'merges', możesz pracować w sposób, jakby kontrola wersji w ogóle nie istniała. Chciałem powiedzieć, do czasu aż będzie ci potrzebna. A oto chodzi, byś był zadowolony z tego, że Git cały czas czuwa nad twoją pracą.
+
+Inne systemy kontroli wersji ciągle zmuszają cię do ciągłego borykania się z zagadnieniem samej kontroli i związanej z tym biurokracji. Pliki mogą być zabezpieczone przed zapisem, aż do momentu gdy uda ci się poinformować centralny serwer o tym, że chciałabyś nad nimi popracować. Przy wzroście liczby użytkowników nawet najprostsze polecenia stają się wolne jak ślimak. Gdy tylko zniknie sieć lub centralny serwer praca staje.
+
+W przeciwieństwie do tego, Git posiada kronikę całej swojej historii w podkatalogu .git twojego katalogu roboczego. Jest to twoja własna kopie całej historii, z którą mogłabyś pracować offline, aż do momentu gdy zechcesz wymienić dane z innymi. Posiadasz absolutną kontrolę nad losem twoich danych, ponieważ Git potrafi dla ciebie w każdej chwili odtworzyć zapamiętany poprzednio stan z właśnie podkatalogu .git.
+
+=== Integralność ===
+
+Z kryptografią przez większość ludzi łączona jest poufność informacji, jednak równie ważnym jej celem jest zabezpieczenie danych. Właściwe zastosowanie kryptograficznych funkcji hashujących (funkcji skrótu) może uchronić przed nieumyślnym lub celowym zniszczeniem danych.
+
+Klucz hashujący SHA1 mogłabyś wyobrazić sobie jako składający się ze 160 bitów numer identyfikacyjny jednoznacznie opisujący dowolny łańcuch znaków, i który spotkasz w sowim życiu jeden jedyny raz. Nawet i więcej niż to: wszystkie łańcuchy znaków, jakie ludzkość przez wiele generacji stworzyła.
+
+Sama suma kontrolna SHA1 też jest łańcuchem znaków w formie bajtów. Możemy generować hashe SHA1 z łańcuchów samych zawierających inne hashe SHA1. Ta prosta obserwacja okazała się niesamowicie pożyteczna: jeśli cię to zainteresowało poszukaj informacji na temat 'hash chains'. Zobaczymy później w jaki sposób wykorzystuje je Git dla zapewnienia produktywności i integralności danych.
+
+Krótko mówiąc, Git przechowuje twoje dane w podkatalogu `.git/objects`, gdzie zamiast nazw plików znajdziesz numery identyfikacyjne. Poprzez wykorzystanie tych numerów identyfikacyjnych jako nazwy plików razem z kilkoma innymi trikami związanymi z plikami blokującymi i znacznikami czasu, Git zamienia twój prosty system plików na produktywną i solidną bazę danych.
+
+=== Inteligencja ===
+
+Skąd Git wie o tym, że zmieniłaś nazwę jakiegoś pliku, jeśli nigdy go o tym wyraźnie nie poinformowałaś? Oczywiście, być może użyłaś polecenia *git mv*, jest to jednak to samo jakbyś użyła *git rm*, a następnie *git add*.
+
+Git poszukuje heurystycznie zmian nazw w następujących po sobie wersjach kopii. Dodatkowo potrafi czasami nawet znaleźć całe bloki z kodem przenoszonym tam i z powrotem między plikami! Mimo iż wykonuje kawał dobrej roboty, a ta właściwość staje się coraz lepsza, nie potrafi niestety jeszcze poradzić sobie z wszystkimi możliwymi przypadkami. Jeśli to u ciebie nie działa, spróbuj poszukać opcji rozszerzonego rozpoznawania kopii, aktualizacja samego Gita, też może pomóc.
+
+=== Indeksowanie ===
+
+Dla każdego kontrolowanego pliku, Git zapamiętuje informacje o jego wielkości, czasie utworzenia i czasie ostatniej edycji w pliku znanym nam jako indeks. By ustalić, czy nastąpiła jakaś zmiana, Git porównuje stan aktualny ze stanem zapamiętanym w indeksie. Jeśli dane te nie różnią się, Git może pominąć czytanie zawartości pliku.
+
+Ponieważ sprawdzenie statusu pliku trwa dużo krócej niż jego całkowite wczytanie, to jeśli dokonałaś zmian tylko na kilku plikach Git zaktualizuje swój stan w mgnieniu oka.
+
+Stwierdziliśmy już wcześniej, że indeks jest przechowalnią (ang. staging area). Jak to możliwe, że stos informacji o statusie danych może być przechowalnią? Ponieważ polecenie 'add' transportuje pliki do bazy danych Git i aktualizuje informacje o ich statusie, podczas gdy polecenie 'commit' (bez opcji) tworzy commit tylko wyłącznie na podstawie informacji o statusie plików, ponieważ pliki te już się w tej bazie znajdują.
+
+=== Korzenie Git ===
+
+Ten http://lkml.org/lkml/2005/4/6/121['Linux Kernel Mailing List' post] opisuje cały łańcuch zdarzeń, które inicjowały powstanie Git. Cały post jest archeologicznie fascynującą stroną dla historyków zajmujących się Gitem.
+
+=== Obiektowa baza danych ===
+
+Każda wersja twoich danych jest przechowywana w obiektowej bazie danych, która znajduje się w podkatalogu `.git/objects`. Inne miejsca w `.git/` posiadają mniej ważne dane, jak indeks, nazwy gałęzi ('branch'), tagi, logi, konfigurację, aktualną pozycję HEAD i tak dalej. Obiektowa baza danych jest prosta, mimo to jednak elegancka i jest źródłem siły Gita.
+
+Każdy plik w `.git/objects` jest obiektem. Istnieją trzy rodzaje obiektów, które nas interesują: 'blob', 'tree' i 'commit'.
+
+=== Bloby ===
+
+Na początek magiczna sztuczka. Wymyśl jakąś nazwę pliku, jakąkolwiek. W pustym katalogu:
+
+
+ $ echo sweet > TWOJA_NAZWA
+ $ git init
+ $ git add .
+ $ find .git/objects -type f
+ $ find .git/objects -type f
+
+Zobaczysz coś takiego: +.git/objects/aa/823728ea7d592acc69b36875a482cdf3fd5c8d+.
+
+Skąd mogłem to wiedzieć, mimo iż nie znałem nazwy pliku? Ponieważ suma kontrolna SHA1 dla:
+
+ "blob" SP "6" NUL "sweet" LF
+
+wynosi właśnie: aa823728ea7d592acc69b36875a482cdf3fd5c8d. Przy czym SP to spacja, NUL - to bajt zerowy, a LF to znak nowej linii ('newline'). Możesz to skontrolować wpisując:
+
+ $ printf "blob 6\000sweet\n" | sha1sum
+
+Git pracuje asocjacyjnie (skojarzeniowo): dane nie są zapamiętywane na podstawie ich nazwy, tylko wartości ich własnego hasha SHA1 w pliku, który określamy mianem obiektu 'blob'. Sumę kontrolną SHA1 możemy sobie wyobrazić jako niepowtarzalny numer identyfikacyjny zawartości pliku, co oznacza, że pliki adresowane są na podstawie ich zawartości. Początkowe `blob 6`, to jedynie adnotacja, która określa tylko rodzaj obiektu i jego wielkość w bajtach, pozwala to na uproszczenie zarządzania wewnętrznego.
+
+Przez to właśnie mogłem 'przepowiedzieć' wynik. Nazwa pliku nie ma znaczenia, jedynie jego zawartość służy do utworzenia obiektu 'blob'.
+
+Pytasz się, a co w przypadku identycznych plików? Spróbuj dodać kopie twojej danej pod jakąkolwiek nazwą. Zawartość +.git/objects+ nie zmieni się, niezależnie ile kopii dodałaś. Git zapamięta zawartość pliku wyłącznie jeden raz.
+
+Na marginesie, dane w +.git/objects+ są spakowane poprzez 'zlib', nie powinieneś otwierać ich bezpośrednio. Przefiltruj je najpierw przez http://www.zlib.net/zpipe.c[zpipe -d], albo wpisz:
+
+ $ git cat-file -p aa823728ea7d592acc69b36875a482cdf3fd5c8d
+
+polecenie to pokaże ci zawartość obiektu jako tekst.
+
+=== 'Trees' ===
+
+Gdzie są więc nazwy plików? Przecież muszą być gdzieś zapisane. Podczas wykonywania 'commit' Git troszczy się o nazwy plików:
+
+ $ git commit # dodaj jakiś opis.
+ $ find .git/objects -type f
+ $ find .git/objects -type f
+
+Powinieneś ujrzeć teraz 3 obiekty. Tym razem nie jestem w stanie powiedzieć, jak nazywają się te dwa nowe pliki, ponieważ częściowo są zależne od nazwy jaką nadałaś plikom. Pójdźmy dalej, zakładając, że jedną z tych danych nazwałaś ``rose''. Jeśli nie, możesz zmienić opis, by wyglądał jakby był twój:
+
+ $ git filter-branch --tree-filter 'mv TWOJA_NAZWA rose'
+ $ find .git/objects -type f
+
+Powinnaś zobaczyć teraz plik +.git/objects/05/b217bb859794d08bb9e4f7f04cbda4b207fbe9+, ponieważ jest to suma kontrolna SHA1 jego zawartości.
+
+"tree" SP "32" NUL "100644 rose" NUL 0xaa823728ea7d592acc69b36875a482cdf3fd5c8d
+
+Sprawdź, czy plik na prawdę odpowiada powyższej zawartości przez polecenie:
+
+ $ echo 05b217bb859794d08bb9e4f7f04cbda4b207fbe9 | git cat-file --batch
+
+Za pomocą 'zpipe' łatwo sprawdzić hash SHA1:
+
+
+ $ zpipe -d < .git/objects/05/b217bb859794d08bb9e4f7f04cbda4b207fbe9 | sha1sum
+
+Sprawdzanie za pomocą 'cat-file' jest troszeczkę kłopotliwe, bo jego 'output' zawiera więcej niż tylko nieskomprymowany obiekt pliku.
+
+Nasz plik to tak zwany obiekt 'tree': lista wyrażeń, na którą składają się rodzaj pliku, jego nazwa i jego suma kontrolna SHA1. W naszym przykładzie typ pliku to 100644, co oznacza, że `rose` jest plikiem zwykłym, natomiast hash SHA1 odpowiada sumie kontrolnej SHA1 obiektu 'blob' zawierającego zawartość `rose`. Inne możliwe rodzaje plików to programy, linki symboliczne i katalogi. W ostatnim przypadku hash SHA1 wskazuje na obiekt 'tree'.
+
+Jeśli użyjesz polecenia 'filter-branch', otrzymasz stare objekty, które nie są już używane. Mimo iż automatycznie zostaną usunięte po upłynięciu okresu karencji, chcemy się ich pozbyć od zaraz, aby lepiej prześledzić następne przykłady.
+
+ $ rm -r .git/refs/original
+ $ git reflog expire --expire=now --all
+ $ git prune
+
+W prawdziwych projektach powinnaś unikać takich komend, ponieważ zniszczą zabezpieczone dane. Jeśli chcesz posiadać czyste repozytorium, to najlepiej załóż nowy klon. Bądź też ostrożna przy bezpośredniej manipulacji +.git+: gdy równocześnie wykonywane jest polecenie Git i zgaśnie światło? Generalnie do kasowania referencji powinnaś używać *git update-ref -d*, nawet gdy ręczne usunięcie +ref/original+ jest dość bezpieczne.
+
+=== 'Commits' ===
+
+Wytłumaczyliśmy dwa z trzech obiektów. Ten trzeci to obiekt 'commit' Jego zawartość jest zależna od opisu 'commit' jak i czasu jego wykonania. By wszystko do naszego przykładu pasowało, musimy trochę pokombinować.
+
+ $ git commit --amend -m Shakespeare # Zmień ten opis.
+ $ git filter-branch --env-filter 'export GIT_AUTHOR_DATE="Fri 13 Feb 2009 15:31:30 -0800" GIT_AUTHOR_NAME="Alice" GIT_AUTHOR_EMAIL="alice@example.com" GIT_COMMITTER_DATE="Fri, 13 Feb 2009 15:31:30 -0800" GIT_COMMITTER_NAME="Bob" GIT_COMMITTER_EMAIL="bob@example.com"' # Zmanipuluj znacznik czasowy i nazwę autora.
+ $ find .git/objects -type f
+ $ find .git/objects -type f
+
+Powinieneś znaleźć +.git/objects/49/993fe130c4b3bf24857a15d7969c396b7bc187+, co odpowiada sumie kontrolnej SHA1 jego zawartości:
+
+"commit 158" NUL "tree 05b217bb859794d08bb9e4f7f04cbda4b207fbe9" LF "author Alice 1234567890 -0800" LF "committer Bob 1234567890 -0800" LF LF "Shakespeare" LF
+
+Jak i w poprzednich przykładach możesz użyć 'zpipe' albo 'cat-file' by to sprawdzić.
+
+To jest pierwszy 'commit', przez to nie posiada matczynych 'commits'. Następujące 'commits' będą zawsze zawierać przynajmniej jedną linikę identyfikującą rodzica.
+
+=== Nie do odróżnienia od magii ===
+
+Tajemnice Gita wydają się być proste. Wygląda to jak połączenie kilku skryptów, troszeczkę kodu C i w ciągu kilku godzin jesteśmy gotowi: zmiksowanie podstawowych operacji na systemie danych, obliczenia SHA1, przyprawienie plikami blokującymy i synchronizacją dla stabilności. W sumie można by tak opisać najwcześniejsze wersje Gita. Tym niemniej, abstrahując od udanych trików pakujących, by oszczędnie odnosić się z pamięcią i udanych trików indeksujących by zaoszczędzić czas, wiemy jak Git sprawnie przemienia system danych w objektową bazę danych, co jest optymalne dla kontroli wersji.
+
+Przyjmijmy, gdy jakikolwiek plik w obiektowej bazie danych ulegnie zniszczeniu poprzez błąd nośnika, to jego SHA1 nie będzie zgadzać się z jego zawartością, co od razu wskaże nam problem. Poprzez tworzenie kluczy SHA1 z kluczy SHA1 innych objektów, osiągniemy integralność danych na wszystkich poziomach. 'Commits' są elementarne, to znaczy, 'commit' nie potrafi zapamiętać jedynie części zmian: hash SHA1 'commit' możemy obliczyć i zapamiętać dopiero po tym gdy zapamiętane zostały wszystkie obiekty 'tree', 'blob' i rodziców 'commit'. Obiektowa baza dynch jest odporna na nieoczekiwane przerwy, jak na przykład przerwanie dostawy prądu.
+
+Możemy przetrwać nawet podstępnego przeciwnika. Wyobraź sobie, ktoś ma zamiar zmienić treść jakiegoś pliku, która leży w jakiejś starszej wersji projektu. By sprawić pozory, że baza danych wygląda nienaruszona musiałby zmienić sumy kontrolne SHA1 korespondujących obiektów, ponieważ plik zawiera teraz zmieniony sznur znaków. To znaczy również, że musiałby zmienić każdy hash obiektu 'tree', które ją referują oraz w wyniku tego wszystkie sumy kontrolne 'commits' zawierające obiekty 'tree' dodatkowo do pochodnych tych 'commits'. Oznacza to również, że suma kontrolna oficjalnego HEAD różni się od sumy kontrolnej HEAD manipulowanego repozytorium. Wystarczy teraz prześledzić ścieżkę różniących się hashy SHA1, odnaleźć okaleczony plik, jak i 'commit' w którym po raz pierwszy wystąpił.
+
+Krótko mówiąc, dopóki reprezentujące ostatni commit 20 bajtów są zabezpieczone, sfałszowanie repozytorium Gita nie jest możliwe.
+
+A co ze sławnymi możliwościami Gita?
+'Branching'? 'Merging'? 'Tags'? To szczegół. Aktualny HEAD przetrzymywany jest w pliku +.git/HEAD+, która posiada hash SHA1 ostatniego 'commit'. Hash SHA1 zostaje aktualizowany podczas wykonania 'commit', tak samo jak i przy wielu innych poleceniach. 'branches' to prawie to samo, są plikami zapamiętanymi w +.git/refs/heads+. 'Tags' również, znajdziemy je w +.git/refs/tags+, są one jednak aktualizowane poprzez serię innych poleceń.
diff --git a/pl/translate.txt b/pl/translate.txt
new file mode 100644
index 00000000..1f1044ba
--- /dev/null
+++ b/pl/translate.txt
@@ -0,0 +1,21 @@
+== Załącznik B: Przetłumaczyć to HOWTO ==
+
+Aby przetłumaczyć moje HOWTO polecam wykonanie następujących poniżej kroków, wtedy moje skrypty będą w prosty sposób mogły wygenerować wersje HTML i PDF. Poza tym wszystkie tłumaczenia mogą być prowadzone w jednym repozytorium.
+
+Sklonuj teksty źródłowe, następnie utwórz katalog o nazwie skrótu IETF przetłumaczonego języka: sprawdź http://www.w3.org/International/articles/language-tags/Overview.en.php[Artykuł W3C o internacjonalizacji]. Na przykład, angielski to "en", a japoński to "ja". Skopiuj wszystkie pliki +txt+ z katalogu "en" do nowo utworzonego katalogu.
+
+Aby przykładowo przetłumaczyć to HOWTO na http://de.wikipedia.org/wiki/Klingonische_Sprache[Klingonisch], musisz wykonać następujące polecenia:
+
+ $ git clone git://repo.or.cz/gitmagic.git
+ $ cd gitmagic
+ $ mkdir tlh # "tlh" jest skrótem IETF języka Klingonisch.
+ $ cd tlh $ cp ../en/intro.txt .
+ $ edit intro.txt # Przetłumacz ten plik.
+
+i zrób to z każdą następną daną textową.
+
+Edytuj Makefile i dodaj skrót języka do zmiennej `TRANSLATIONS`. Teraz możesz swoją pracę w każdej chwili sprawdzić:
+
+ $ make tlh $ firefox book-tlh/index.html
+
+Używaj często 'commit' a gdy już skończysz, to daj znać. GitHub posiada interfejs, który to ułatwi: utwórz twój własny 'Fork' projektu "gitmagic", 'push' twoje zmiany i daj mi znać, by można było wykonać operację 'merge'.
diff --git a/pt_br/basic.txt b/pt_br/basic.txt
new file mode 100644
index 00000000..0aaa02f3
--- /dev/null
+++ b/pt_br/basic.txt
@@ -0,0 +1,198 @@
+== Truques básicos ==
+
+Ao invés de se aprofundar no mar de comandos do Git, use estes exemplos elementares para dar os primeiros passos. Apesar de sua simplicidade, cada um deles são muito úteis. Na verdade, no meu primeiro mês com o Git, nunca precisei ir além das informações deste capítulo.
+
+=== Salvando estados ===
+
+Pensando em tentar algo mais arriscado? Antes de fazê-lo, tire uma “fotografia” de todos os arquivos do diretório atual com:
+
+ $ git init
+ $ git add .
+ $ git commit -m "My first backup"
+
+Assim se algo der errado, você só precisará executar:
+
+ $ git reset --hard
+
+Para salvar o estado novamente, faça:
+
+ $ git commit -a -m "Another backup"
+
+=== Adicionar, Remover, Renomear ===
+
+Os comandos acima só irão verificar alterações nos arquivos que estavam presentes quando você executou seu primeiro *git add*. Se você adicionar novos arquivos ou diretórios terá que informar ao Git, com:
+
+ $ git add readme.txt Documentation
+
+Do mesmo modo, se você quiser que o Git não verifique certos arquivos, faça:
+
+ $ git rm kludge.h obsolete.c
+ $ git rm -r incriminating/evidence/
+
+O Git irá apagar estes arquivos, se você ainda não apagou.
+
+Renomear um arquivo é o mesmo que remover o nome antigo e adicionar um novo nome. Há também o atalho *git mv* que tem a mesma sintaxe do comando *mv*. Por exemplo:
+
+ $ git mv bug.c feature.c
+
+=== Desfazer/Refazer avançado ===
+
+Às vezes, você só quer voltar e esquecer todas as mudanças realizadas a partir de um certo ponto, pois estão todos erradas. Então:
+
+ $ git log
+
+mostrará uma lista dos últimos commit e seus hash SHA1:
+
+----------------------------------
+commit 766f9881690d240ba334153047649b8b8f11c664
+Author: Bob
+Date: Tue Mar 14 01:59:26 2000 -0800
+
+ Replace printf() with write().
+
+commit 82f5ea346a2e651544956a8653c0f58dc151275c
+Author: Alice
+Date: Thu Jan 1 00:00:00 1970 +0000
+
+ Initial commit.
+----------------------------------
+
+Os primeiros caracteres do hash são suficientes para especificar o commit; alternativamente, copie e cole o hash completo. Digite:
+
+ $ git reset --hard 766f
+
+para restaurar ao estado de um dado commit e apagar permanentemente os registros de todos os novos commit a partir deste ponto.
+
+Outras vezes você quer voltar, brevemente, para um estado. Neste caso, digite:
+
+ $ git checkout 82f5
+
+Isto levará você de volta no tempo, preservando os novos commit. Entretanto, como nas viagens no tempo dos filmes de ficção, se você editar e fizer um commit, você estará numa realidade alternativa, pois suas ações são diferentes das realizadas da primeira vez.
+
+Esta realidade alternativa é chamada de branch, nós falaremos mais sobre isso depois. Por ora, apenas lembre-se que:
+
+ $ git checkout master
+
+lhe levará de volta para o presente. Assim faça o Git parar de reclamar, sempre faça um commit ou reset em suas alterações antes de executar um checkout.
+
+Voltemos para a analogia dos jogos de computador :
+
+- *`git reset --hard`*: carrega um salvamento antigo e apaga todos jogos salvos mais novos do que este que foi carregado.
+
+- *`git checkout`*: carrega um salvamento antigo, mas se jogar a partir dele, os próximos salvamento realizados se desvincularão dos salvamentos já realizados após o que foi carregado. Qualquer jogo salvo que você fizer será colocado em um branch separado representado uma realidade alternativa em que entrou. Lidaremos com isso mais adiante. <>.
+
+Você pode escolher restaurar apenas alguns arquivos ou diretórios acrescentando-os ao final do comando:
+
+ $ git checkout 82f5 some.file another.file
+
+Tome cuidado, pois esta forma de *checkout* pode sobrescrever arquivos sem avisar. Para prevenir acidentes, faça um commit antes de qualquer comando checkout, especialmente quando esta aprendendo a utilizar o Git. De modo geral, sempre que se sentir inseguro sobre alguma operação, seja um comando Git ou não, execute primeiro o comando *git commit -a*.
+
+Não gosta de copiar e colar hash? Então use:
+
+ $ git checkout :/"My first b"
+
+para ir ao commit que começa a frase informada. Você também pode solicitar pelo estado salvo ha 5 commit atrás:
+
+ $ git checkout master~5
+
+=== Revertendo ===
+
+Como num tribunal, eventos podem ser retirados dos registros. Da mesma maneira, você pode especificar qual commit desfazer.
+
+ $ git commit -a
+ $ git revert 1b6d
+
+irá desfazer apenas o commit do hash informado. A regressão é gravada como um novo commit, e que pode ser confirmada executando o comando *git log*.
+
+=== Geração do Changelog ===
+
+Alguns projetos precisam de um http://en.wikipedia.org/wiki/Changelog[changelog].
+Podemos gerar um changelog com o comando:
+
+ $ git log > ChangeLog
+
+=== Download de arquivos ===
+
+Para obter uma cópia de um projeto gerenciado com GIT digite:
+
+ $ git clone git://server/path/to/files
+
+Por exemplo, para obter todos os arquivos usados para criar este site:
+
+ $ git clone git://git.or.cz/gitmagic.git
+
+Mais adiante, teremos muito o que dizer sobre o comando *clone*.
+
+=== A Última Versão ===
+
+Se você já obteve a cópia de um projeto usando *git clone*, pode agora atualizar para a última versão com:
+
+ $ git pull
+
+=== Publicação instantânea ===
+
+Suponha que você tenha escrito um script e gostaria de compartilhá-lo. Você poderia simplesmente dizer para pegarem do seu computador, mas se o fizerem enquanto você está melhorando o script ou experimentando algumas mudanças, eles podem ter problemas. Obviamente, é por isso que existem ciclos de liberação. Desenvolvedores podem trabalhar num projeto com frequência, mas só disponibilizam o código quando sentem que o mesmo está apresentável.
+
+Para fazer isso com Git, no diretório onde está seu script, execute:
+
+ $ git init
+ $ git add .
+ $ git commit -m "First release"
+
+Então avise aos outros para executarem:
+
+ $ git clone your.computer:/path/to/script
+
+para obter seu script. Assume-se que eles têm acesso ssh. Se não, execute *git daemon* e avise-os para executar:
+
+ $ git clone git://your.computer/path/to/script
+
+A partir de agora, toda vez que seu script estiver pronto para liberar, execute:
+
+ $ git commit -a -m "Next release"
+
+e seu usuários podem atualizar suas versões, indo para o diretório que contém seu script, e executando:
+
+ $ git pull
+
+Seu usuários nunca ficarão com uma versão do seu script que você não queira. Obviamente este truque serve para tudo, não apenas script.
+
+=== O que eu fiz? ===
+
+Saiba quais as mudanças que você fez desde o último commit com:
+
+ $ git diff
+
+Ou desde ontem:
+
+ $ git diff "@{yesterday}"
+
+Ou entre uma versão particular e duas versões atrás:
+
+ $ git diff 1b6d "master~2"
+
+Em cada um dos exemplos, a saída será um patch que pode ser aplicado com o *git apply*. Tente também:
+
+ $ git whatchanged --since="2 weeks ago"
+
+Às vezes navego pelo histórico com o http://sourceforge.net/projects/qgit[qgit], em razão de sua interface mais fotogênica, ou com o http://jonas.nitro.dk/tig/[tig], uma interface em modo texto ótima para conexões lentas. Alternativamente, instale um servidor web, e execute git instaweb e use um navegador.
+
+=== Exercícios ===
+
+Seja A, B, C D quatro commits sucessivos onde B é idêntico a A exceto por alguns arquivos que foram removidos. Queremos adicionar novamente os arquivos em D. Como podemos fazer isso?
+
+Existem no minimo 3 soluções. Assumindo que estamos em D.
+
+ 1. A diferença entre A e B são or arquivos removidos. Podemos criar um patch representando esta diferença e aplicá-la:
+
+ $ git diff B A | git apply
+
+ 2. Como salvamos os arquivos em A, podemos recuperá-los:
+
+ $ git checkout A foo.c bar.h
+
+ 3. Podemos visualizar as mudanças de A para B que queremos desfazer:
+
+ $ git revert B
+
+Qual a opção é melhor? A que você preferir, É fácil fazer o que você quer com o git, e na maioria das vezes existe mais de uma forma de fazê-lo.
diff --git a/pt_br/branch.txt b/pt_br/branch.txt
new file mode 100644
index 00000000..4fc71ea0
--- /dev/null
+++ b/pt_br/branch.txt
@@ -0,0 +1,190 @@
+== Bruxarias com branch ==
+
+Ramificações (Branch) e mesclagens (merge) instantâneos são as características mais fantásticas do Git.
+
+*Problema*: Fatores externos inevitavelmente exigem mudanças de contexto. Um erro grave que se manifesta sem aviso, em uma versão já liberada. O prazo final é diminuído. Um desenvolvedor que o ajuda, em uma função chave do seu projeto, precisa sair. Em todos esses casos, você deixará de lado bruscamente o que esta fazendo e focará em uma tarefa completamente diferente.
+
+Interromper sua linha de pensamento provavelmente prejudicará sua produtividade, e quanto mais trabalhoso for trocar de contexto, maior será a perda. Com um controle de versões centralizado precisamos pegar uma nova cópia do servidor central. Sistemas distribuídos fazem melhor, já que podemos clonar o que quisermos localmente.
+
+Mais clonar ainda implica copiar todo o diretório de trabalho, bem como todo o histórico até o ponto determinado. Mesmo que o Git reduza o custo disso com o compartilhamento de arquivos e hardlinks, os arquivos do projeto devem ser recriados completamente no novo diretório de trabalho.
+
+*Solução*: O Git tem a melhor ferramenta para estas situações que é muito mais rápida e mais eficiente no uso de espaço do que a clonagem: *git branch*.
+
+Com esta palavra mágica, os arquivos em seu diretório de repente mudam de forma, de uma versão para outra. Esta transformação pode fazer mais do que apenas avançar ou retroceder no histórico. Seus arquivos podem mudar a partir da última liberação para a versão experimental, para a versão atualmente em desenvolvimento, ou para a versão dos seus amigos, etc.
+
+=== A “tecla” chefe ===
+
+Sempre joguei um desses jogos que ao apertar de um botão (“a tecla chefe”), a tela instantaneamente mudará para uma planilha ou algo mais sério. Assim se o chefe passar pelo seu escritório enquanto você estiver jogando, poderá rapidamente esconder o jogo.
+
+Em algum diretório:
+
+ $ echo "I'm smarter than my boss" > myfile.txt
+ $ git init
+ $ git add .
+ $ git commit -m "Initial commit"
+
+Criamos um repositório Git que rastreará um arquivo texto contendo uma certa mensagem. Agora digite:
+
+ $ git checkout -b boss # nothing seems to change after this
+ $ echo "My boss is smarter than me" > myfile.txt
+ $ git commit -a -m "Another commit"
+
+ficou parecendo que nós sobrescrevemos nosso arquivo e fizemos um commit. Mas isto é um ilusão. Digite:
+
+ $ git checkout master # switch to original version of the file
+
+e tcham tcham tcham! O arquivo texto foi restaurado. E se o chefe decidir bisbilhotar este diretório. Digite:
+
+ $ git checkout boss # switch to version suitable for boss' eyes
+
+Você pode trocar entre as duas versões do arquivo quantas vezes quiser, e fazer commit independentes para cada uma.
+
+=== Trabalho porco ===
+
+[[branch]]
+Digamos que você está trabalhando em alguma função, e por alguma razão, precisa voltar 3 versões, e temporariamente colocar algumas declarações de controle para ver como algo funciona. Então:
+
+ $ git commit -a
+ $ git checkout HEAD~3
+
+Agora você pode adicionar temporariamente código feio em qualquer lugar. Pode até fazer commit destas mudanças. Quando estiver tudo pronto,
+
+ $ git checkout master
+
+para voltar para o trabalho original. Observe que qualquer mudança sem commit são temporárias.
+
+E se você desejasse salvar as mudanças temporárias depois de tudo? Fácil:
+
+ $ git checkout -b dirty
+
+e faça commit antes de voltar ao branch master. Sempre que quiser voltar à sujeira, simplesmente digite:
+
+ $ git checkout dirty
+
+Nós já falamos deste comando num capítulo anterior, quando discutimos carregamento de estados antigos salvos. Finalmente podemos contar toda a história: os arquivos mudam para o estado requisitado, porém saímos do branch master. Cada commit realizado a partir deste ponto nos seus arquivos o levarão em outra direção, que nomearemos mais adiante.
+
+Em outra palavras, depois de fazer checkout em um estado antigo, o Git automaticamente o colocará em um novo branch não identificado, que pode ser identificado e salvo com *git checkout -b*.
+
+=== Correções rápidas ===
+
+Você está fazendo algo quando mandam largar o que quer que seja e corrigir um erro recém-descoberto no commit `1b6d...`:
+
+ $ git commit -a
+ $ git checkout -b fixes 1b6d
+
+Então assim que tiver corrigido o erro:
+
+ $ git commit -a -m "Bug fixed"
+ $ git checkout master
+
+e volte a trabalhar no que estava fazendo anteriormente. Você pode até fazer um merge na correção realizada:
+
+ $ git merge fixes
+
+=== Merging ===
+
+Com alguns sistemas de controle de versões, a criação de ramos (branching) é fácil mas realizar o merge de volta é dificil. Com o Git, o merge é tão trivial que você pode nem perceber que ele acontece.
+
+Nós, na realidade encontramos o merge há bastante tempo. O comando *pull* na realidade 'busca' ('fetches') um commit e faz um merge no ramo (branch) atual. Se você não tem nenhuma alteração local, então ele faz um merge rápido, que é um caso especial parecido a buscar a ultima versão em um sistema de controle de versões centralizado. Mas se você tem mudanças locais, o Git irá automaticamente fazer o merge, e reportar qualquer conflito.
+
+Comumente, um commit possui exatamente um 'commit pai', que recebe o nome de commit anterior. Fazer o merge de ramos (branches) juntos produz um commit com no mínimo dois pais. Isso levanta a questão: a que commit `HEAD~10` estamos nos referindo? Um commit pode ter vários pais, e qual deles vamos seguir?
+
+Acontece que essa notação escolhe o primeiro pai a cada vez. Isso é o desejável porque o ramo atual se torna o primeiro pai durante o merge; frequentemente você estará preocupado com as alterações que realizou no ramo atual, em oposição às alterações merged de outros ramos.
+
+Podemos referenciar um pai especifico com um circunflexo. Por exemplo, para mostrar os logs do segundo pai:
+
+ $ git log HEAD^2
+
+Podemos omitir o número para o primeiro pai. Por exemplo, para mostrar as diferenças com o primeiro pai:
+
+ $ git diff HEAD^
+
+Podemos combinar essa notação com outras. Por exemplo:
+
+ $ git checkout 1b6d^^2~10 -b ancient
+
+inicia um novo ramo ``ancient'' representando o estado 10 commit atrás para o segundo pai do primeiro pai do commit iniciando com 1b6d.
+
+=== Fluxo ininterrupto ===
+
+Frequentemente em projetos de hardware, o segundo passo de um plano deve esperar que o primeiro passo termine. Um carro que esta esperando uma peça do fabricante deve permanecer na oficina até que a peça chegue. Um protótipo deve esperar até que o chip seja fabricado para que a montagem possa continuar.
+
+Os projetos de software pode ser semelhantes a isso. A segunda parte de uma nova função pode ter que esperar até que a primeira parte seja testada e liberada. Alguns projetos requerem que o código seja revisto antes de seu aceite, de modo que você deve esperar até que a primeira parte seja aprovada antes de iniciar a segunda parte.
+
+Graças à facilidade de realizar branch e merge, podemos “desviar” das regras e trabalhar na parte 2 antes da parte 1 estar oficialmente pronta. Suponha que fizemos o commit da parte 1 e enviamos para a revisão. Vamos dizer que estamos no ramo (branch) `master`. Então podemos ramificar:
+
+ $ git checkout -b part2
+
+Em seguida, trabalhamos na parte 2, fazendo commit das alterações durante o desenvolvimento. Mas errar é humano, e frequentemente você vai querer retornar e corrigir alguma coisa na parte 1. Se você estiver com sorte, ou for realmente bom, pode saltar esses comandos:
+
+ $ git checkout master # Go back to Part I.
+ $ fix_problem
+ $ git commit -a # Commit the fixes.
+ $ git checkout part2 # Go back to Part II.
+ $ git merge master # Merge in those fixes.
+
+Eventualmente, quando a parte 1 for aprovada:
+
+ $ git checkout master # Go back to Part I.
+ $ submit files # Release to the world!
+ $ git merge part2 # Merge in Part II.
+ $ git branch -d part2 # Delete "part2" branch.
+
+Agora, você estará no ramo `master` novamente, com a parte 2 no diretório de trabalho.
+
+É fácil de estender esse truque para qualquer número de partes. É fácil também fazer branching retroativos: suponha que você percebeu tardiamente que deveria ter criado um branch 7 commits atrás. Então digite:
+
+ $ git branch -m master part2 # Rename "master" branch to "part2".
+ $ git branch master HEAD~7 # Create new "master", 7 commits upstream.
+
+O branch `master` agora contém somente a parte 1, e o branch `part2` contém todo o resto. Estamos no ultimo branch; criamos o `master` sem mudar para ele, porque queremos continuar a trabalhar na `part2`. Isso não é comum. Até agora, nós trocamos de ramos imediatamente após a sua criação, como em:
+
+ $ git checkout HEAD~7 -b master # Create a branch, and switch to it.
+
+=== Reorganizando uma Bagunça ===
+
+Talvez você goste de trabalhar com todos os aspectos de um projeto num mesmo branch. E gostaria de manter seu trabalho para você mesmo e que os outros só vejam seus commit, apenas quando eles estiverem organizados. Inicie um par de branch:
+
+ $ git branch sanitized # Create a branch for sanitized commits.
+ $ git checkout -b medley # Create and switch to a branch to work in.
+
+A seguir, trabalhe em alguma coisa: corrigindo erros, adicionando funções, adicionando código temporário, e assim por diante, faça commit muitas vezes ao longo do caminho. Então:
+
+ $ git checkout sanitized
+ $ git cherry-pick medley^^
+
+aplique o comit avô ao commit HEAD do ramo ``medley'' para o ramo ``sanitized''. Com os cherry-picks apropriados você pode construir um branch que contêm apenas código permanente, e tem os commit relacionados agrupados juntos.
+
+=== Gerenciando os Branches ===
+
+Para listar todos os branch, digite:
+
+ $ git branch
+
+Por default, você deve iniciar em um branch chamado ``master''. Alguns defendem que o branch ``master'' deve permanecer intocado e que a seja criado novos branchs para suas próprias mudanças.
+
+As opções *-d* e *-m* permitem a você deletar ou mover (renomear) um branch. Veja *git help branch*.
+
+O branch ``master'' é uma personalização útil. Outros podem assumir que seu repositório possui um branch com esse nome e que ele contém a versão oficial de seu projeto. Embora possamos renomear ou apagar o branch ``master'', você deve procurar respeitar essa convenção.
+
+=== Branches Temporários ===
+
+Depois de um tempo você perceberá que está criando um branch de curta duração, frequentemente e por motivos parecidos: cada novo branch serve apenas para guardar o estado atual, assim você pode rapidamente voltar para estados antigos para corrigir um erro ou algo assim.
+
+É semelhante a mudar o canal da TV temporariamente para ver o que está passando nos outros canais. Mas, ao invés de apertar dois botões, você está criando, checando e apagando branchs temporários e seus commit. Felizmente, o Git tem um atalho que é tão conveniente como um controle remoto de TV:
+
+ $ git stash
+
+Isto salva o estado atual num local temporário (um 'stash') e restaura o estado anterior. Seu diretório de trabalho parece ter voltado ao estado anteriormente salvo, e você pode corrigir erros, puxar as mudanças mais novas, e assim por diante. Quando quiser retornar ao estado anterior ao uso do stash, digite:
+
+ $ git stash apply # You may need to resolve some conflicts.
+
+Você pode ter múltiplos stash, e manipulá-los de várias formas. Veja *git help stash*. Como deve ter adivinhado, o Git usa branch por traz dos panos para fazer este truque.
+
+=== Trabalhe como quiser ===
+
+Você pode se perguntar se os ramos valem a pena. Afinal, os clones são quase tão rápidos e você pode trocar entre eles com um comando cd ao invés de um comando esotérico do Git.
+
+Considere um navegador web. Por que suportar abas múltiplas bem como janelas múltiplas? É porque ao permitir ambas as características podemos acomodar uma variedade de estilos. Alguns usuários gostam de manter somente uma janela aberta do navegador, e utilizar varias abas para as páginas web. Outros preferem o outro extremo, várias janelas sem nenhuma aba. Outros podem preferir uma mistura dos estilos.
+
+Branching é como as abas para seu diretório de trabalho, e o clone é como uma nova janela do navegador. Essas operações são rápidas e locais, de modo que por que não experimentar para encontrar a combinação que melhor se adequa a você? O Git permite que você trabalhe exatamente do jeito que você desejar.
diff --git a/pt_br/clone.txt b/pt_br/clone.txt
new file mode 100644
index 00000000..9161e1be
--- /dev/null
+++ b/pt_br/clone.txt
@@ -0,0 +1,194 @@
+== Um pouco de clonagem ==
+
+Em sistemas de controle de versões mais antigos, checkout é a operação padrão para se obter arquivos. Obtendo assim os arquivos do ponto de salvamento informado.
+
+No Git e em outros sistemas distribuídos de controle de versões, clonagem é a operação padrão. Para obter os arquivos, criamos um clone do repositório inteiro. Em outras palavras, você praticamente faz um espelhamento do servidor central. Tudo o que se pode fazer no repositório principal, você pode fazer no seu repositório local.
+
+=== Sincronizando Computadores ===
+
+Eu posso aguentar fazer tarball1 ou usar o *rsync* para backup e sincronizações básicas. Mas, às vezes edito no meu laptop, outras no meu desktop, e os dois podem não ter conversado entre si nesse período.
+
+Inicialize um repositório Git e faça um commit seus arquivos em uma das máquinas. Então faça na outra máquina:
+
+ $ git clone other.computer:/path/to/files
+
+para criar uma segunda cópia dos seus arquivos e do repositório Git. A partir de agora, use:
+
+ $ git commit -a
+ $ git pull other.computer:/path/to/files HEAD
+
+o que deixará os arquivos da máquina em que você está trabalhando, no mesmo estado que estão no outro computador. Se você recentemente fez alguma alteração conflitante no mesmo arquivo, o Git lhe informará e você poderá fazer um novo commit e então escolher o que fazer para resolvê-lo.
+
+=== Controle clássico de código ===
+
+Inicialize um repositório Git para seus arquivos:
+
+ $ git init
+ $ git add .
+ $ git commit -m "Initial commit"
+
+No servidor principal, inicialize um 'repositório vazio' do Git em algum diretório:
+
+ $ mkdir proj.git
+ $ cd proj.git
+ $ git --bare init
+ $ touch proj.git/git-daemon-export-ok
+
+E inicie o daemon Git se necessário:
+
+ $ git daemon --detach # it may already be running
+
+Algumas hospedagens públicas, siga as instruções para configuração de um repositório git vazio. Na maioria das vezes, isso é feito através do preenchimento de um formulário no site deles.
+
+Envie ('Push') seu projeto para o servidor principal com:
+
+ $ git push central.server/path/to/proj.git HEAD
+
+Para verificar os fontes, um desenvolvedor pode digitar:
+
+ $ git clone central.server/path/to/proj.git
+
+Após realizar as alterações, o desenvolvedor pode salvar as alterações localmente com:
+
+ $ git commit -a
+
+Para atualizar para a ultima versão:
+
+ $ git pull
+
+Qualquer conflito de merge deve ser resolvido e então feito o commit:
+
+ $ git commit -a
+
+Para verificar as mudanças locais no repositório central:
+
+ $ git push
+
+Se o servidor principal possui novas alterações devido a atividades de outros desenvolvedores, o push irá falhar, e o desenvolvedor deverá fazer o pull da ultima versão, resolver qualquer conflito de merge, e então tentar novamente.
+
+Os desenvolvedores devem ter acesso a SSH para utilizar os comandos de push e pull acima. Entretanto qualquer pessoa pode examinar os arquivos-fonte, digitando:
+
+ $ git clone git://central.server/path/to/proj.git
+
+O protocolo nativo do Git é semelhante ao HTTP, não existe nenhum tipo de autenticação, de modo que qualquer um pode baixar o projeto. Da mesma maneira, o push, por default, é proibido pelo protocolo Git.
+
+=== Codigo-fonte secreto ===
+
+Para um projeto que não seja de código aberto, omita o comando touch e garanta que você nunca irá criar um arquivo com o nome `git-daemon-export-ok`. O repositório não poderá ser baixado via protocolo git; somente aqueles com acesso SSH poderão visualiza-lo. Se todos os seus repósitórios forem fechados, não é necessária a execução do daemon do git, pois todas as comunicações irão ocorrer por meio do SSH.
+
+=== Repositorios Vazios ===
+
+Um repositório é chamado de vazio (bare) porque ele não possui um diretório de trabalho; ele contém somente arquivos que normalmente estão escondidos no subdiretório `.git`. Em outras palavras, ele mantém a história de um projeto, e nunca guarda uma “fotografia” de alguma versão.
+
+Um repositório vazio tem um papel semelhante aquele do servidor principal nos sistemas de controle de versão centralizados: o diretório principal (home) de seu projeto. Os desenvolvedores clonam seu projeto a partir dele, e fazem o push da ultima versão oficial para ele. Geralmente, ele reside em um servidor que somente dissemina os dados. O desenvolvimento ocorre nos clones, de modo que o repositório principal (home) pode funcionar sem um diretório de trabalho.
+
+Muitos comandos git falham em repositórios vazios a não ser que a variável de ambiente `GIT_DIR` seja configurada para o path do repositório, ou a opção `--bare` seja fornecida.
+
+=== Push versus Pull ===
+
+Por que nós falamos do comando push, ao invés de basearmos no familar comando pull? Em primeiro lugar, porque o pulling falha em repositórios vazios: ao contrário você deve fazer um fetch, um comando que será discutido mais adiante. Mas mesmo que utilizamos um repositório normal em um servidor centralizado, fazer o pull para ele ainda será problemático. Primeiro, teremos que fazer o login no servidor, e então entrar com o comando pull com o endereço de rede da máquina que estamos fazendo o pull. Os firewall podem interferir, e o que dizer quando não temos acesso a uma janela de shell do servidor?
+
+Entretanto, além desse caso, desencorajamos o push em um repositório , por causa da confusão que pode ocorrer quando o destino possui um diretório de trabalho.
+
+Em resumo, enquanto estiver aprendendo a utilizar o git, somente faça push quando o alvo for um repositório vazio, caso contrário utilize o pull.
+
+=== Fazendo um Fork do Projeto ===
+
+Chateado com a rumo que o seu projeto está tomando? Acha que pode fazer um trabalho melhor? Então no seu servidor:
+
+ $ git clone git://main.server/path/to/files
+
+Em seguida avise a todos sobre seu fork do projeto no seu servidor.
+
+A qualquer hora, você poderá mesclar (merge) suas mudanças do projeto original no mesmo com:
+
+ $ git pull
+
+=== Backup Supremos ===
+
+Gostaria de ter vários arquivos geográficamente dispersos, redundantes e anti-falsificações? Se seu projeto tem muitos desenvolvedores, não faça nada! Cada clonagem do seu código é um backup efetivo. E não apenas uma cópia do estado atual, e sim o histórico completo do seu projeto. Graças ao hash criptográfico, se alguma clonagem for corrompida, ela será identificada assim que tentar se comunicar com as outras.
+
+Se seu projeto não é tão popular, encontre quantos servidores puder para hospedar seus clones.
+
+Um paranóico verdadeiro sempre anotará os últimos 20 byte do hash SHA1 do cabeçalho (HEAD) em algum lugar seguro. Tem que ser seguro, e não privado. Por exemplo, publicá-lo em um jornal funciona bem, pois é muito difícil para um atacante alterar todas as cópias de um jornal.
+
+=== Multitarefa na velocidade da luz ===
+
+Digamos que você queira trabalhar em diversas funções em paralelo. Então, faça um commit do seu projeto executando:
+
+ $ git clone . /some/new/directory
+
+Graças aos http://en.wikipedia.org/wiki/Hard_link[hardlinking], os clones locais necessitam de menos tempo e espaço do que os backups comuns.
+
+Agora você pode trabalhar em duas funções independentes de forma simultânea. Por exemplo, pode editar um clone enquanto o outro está sendo compilado. A qualquer momento, você pode fazer um commit e pegar (pull) as alterações de outro clone:
+
+ $ git pull /the/other/clone HEAD
+
+=== Controle de Versões de Guerrilha ===
+
+Você está trabalhando em um projeto que utiliza outro sistema de controle de versões, e sente saudade do Git? Inicialize um repositório Git no seu diretório de trabalho:
+
+ $ git init
+ $ git add .
+ $ git commit -m "Initial commit"
+
+Faça um clone dele:
+
+ $ git clone . /some/new/directory
+
+Agora vá para o novo diretório e trabalhe nele, não no anterior, usando Git para felicidade geral da nação. De vez em quando você desejará sincronizar com os outros, neste caso, vá para o diretório original, sincronize usando o outro sistema de controle de versões, e então digite:
+
+ $ git add .
+ $ git commit -m "Sync with everyone else"
+
+Depois vá para o novo diretório e execute:
+
+ $ git commit -a -m "Description of my changes"
+ $ git pull
+
+O procedimento para enviar suas alterações para os outros depende do outro sistema de controle de versões. O novo diretório contém os arquivos com as suas alterações. Execute qualquer comando do outro sistema de controle de versões necessário para enviá-las para o repositório central.
+
+O subversion, é talvez o melhor sistema de controle de versões centralizado, é utilizado em muitos projetos. O comando *git svn* automatiza tudo isso para repositórios Subversion, e também pode ser utilizado para http://google-opensource.blogspot.com/2008/05/export-git-project-to-google-code.html[exportar um repositório Git para um repositório Subversion].
+
+=== Mercurial ===
+
+Mercurial é um sistema de controle de versões semelhante, e que pode trabalhar perfeitamente junto com o Git. Com o plugin `hg-git`, um usuário do Mercurial pode realizar push e pulls de um repositorio Git.
+
+Para obter o `hg-git` plugin com o Git:
+
+ $ git clone git://github.com/schacon/hg-git.git
+
+ou no Mercurial:
+
+ $ hg clone http://bitbucket.org/durin42/hg-git/
+
+Infelizmente, não conheço de um plugin semelhante para o Git. Por essa razão, aconselho o Git no lugar do Mercurial para o repositório principal, mesmo que você prefira o Mercurial. Com o Mercurial, geralmente um voluntário mantém um repositorio Git paralelo para acomodar os usuários Git, e graças ao plugin `hg-git`, um projeto Git automaticamente acomoda os usuários Mercurial.
+
+Embora o plugin converta um repositorio Mercurial em um repositório Git fazendo o push para um repositório vazio, esse serviço é mais fácil de fazer com o script `hg-fast-export.sh` disponível em:
+
+ $ git clone git://repo.or.cz/fast-export.git
+
+Para fazer a conversão, em um diretório vazio, execute:
+
+ $ git init
+ $ hg-fast-export.sh -r /hg/repo
+
+após adicionar o script ao seu `$PATH`.
+
+=== Bazaar ===
+
+Vamos mencionar o Bazaar rapidamente por que é o sistema de controle de versões distribuído mais utilizado, depois do Git e do Mercurial.
+
+Bazaar tem a vantagem de retrospectiva, já que é relativamente recente; seus projetistas puderam aprender com os erros dos projetos anteriores, e evitar as principais falhas. Além disso, seus desenvolvedores estão preocupados com a portabilidade e interoperação com outros sistemas de controle de versão.
+
+O plugin `bzr-git` permite que os usuários do Bazaar trabalhem com os repositorios Git de alguma forma. O programa `tailor` converte um repositório Bazaar em repositórios Git, e pode fazer isso de forma incremental, enquanto que `bzr-fast-export` é adequada para realizar conversões uma única vez.
+
+=== Por que uso o Git? ===
+
+Originalmente, escolhi o Git porque escutei que poderia gerenciar o inimaginável e ingerenciável código fonte do kernel do Linux. E nunca senti necessidade de mudar. O Git tem me servido admiravelmente bem, e já estou acostumado com suas falhas. Como utilizo na maior parte do tempo o Linux, os problemas nas outras plataformas não são importantes.
+
+Também, prefiro programas em C e scripts bash a executáveis tais como scripts Python: existem poucas dependências, e sou viciado em tempos de execução muito rápidos.
+
+Já pensei também como o Git poderia ser melhorado, criando minha própria ferramenta Git, mas somente como um exercício académico. Assim que completei meu projeto, continuei com o git, pois os ganhos seriam mínimos para justificar a utilização de um sistema diferente.
+
+Naturalmente, você pode e precisa pensar diferente, e pode se sentir melhor com outro sistema. No entanto, você não pode estar muito errado com o Git.
diff --git a/pt_br/drawbacks.txt b/pt_br/drawbacks.txt
new file mode 100644
index 00000000..705848c7
--- /dev/null
+++ b/pt_br/drawbacks.txt
@@ -0,0 +1,91 @@
+== Apêndice A: Deficiências do Git ==
+
+Há algumas questões sobre o Git que joguei pra debaixo do tapete. Algumas são facilmente tratadas com script e gambiarras, algumas requerem uma reorganização ou redefinição do projeto, e para as poucas chateações remanescentes, só resta esperar por uma solução. Ou melhor ainda, solucione-as e ajude a todos!
+
+=== Pontos fracos do SHA1 ===
+
+A medida que o tempo passa, os criptógrafos descobrem mais e mais os pontos fracos do SHA1. Atualmente, encontrar colisões de hash é factível para algumas organizações bem equipadas. Dentro de alguns anos, talvez até um PC comum terá capacidade computacional suficiente para corromper silenciosamente um repositório Git.
+
+Esperamos que o Git irá migrar para uma função hash melhor antes que mais pesquisas destruam o SHA1.
+
+=== Microsoft Windows ===
+
+O Git no Microsoft Windows pode ser trabalhoso:
+
+- http://cygwin.com/[Cygwin], é um ambiente que deixa o Windows parecido com o Linux, tem http://cygwin.com/packages/git/[uma versão do Git para Windows].
+
+- https://gitforwindows.org/[Git para Windows] é uma alternativa que requer suporte minimo para execução, embora alguns poucos comandos precisem ser mais trabalhados.
+
+=== Arquivos Independentes ===
+
+Se seu projeto é muito grande e tem muitos arquivos independentes que estão sendo constantemente modificados, o Git pode ser prejudicado mais do que os outros sistemas, pois os arquivos não são monitorados isoladamente. O Git monitora modificações no projeto como um todo, o que geralmente é benéfico.
+
+Uma solução é dividir seu projeto em pedaços, cada um composto de arquivos relacionados. Use *git submodule* se ainda quiser manter tudo num repositório só.
+
+=== Quem Está Editando O Que? ===
+
+Alguns sistemas de controle de versões irão forçá-lo a marcar explicitamente um arquivo de alguma maneira antes de editá-lo. Embora seja especialmente irritante quando isso envolve usar um servidor centralizado, isto tem dois benefícios:
+
+ 1. Diff são rápido pois apenas os arquivos marcados são examinados;
+
+ 2. Outros podem saber quem está trabalhando no arquivo perguntando ao servidor central quem marcou o arquivo para edição.
+
+Com o script certo, você pode fazer o mesmo com o Git. Isto requer apenas a cooperação dos programadores, que devem executar o script em particular quando estiver editando um arquivo.
+
+=== Arquivo do Histórico ===
+
+Como o Git armazena modificações muito amplas no projeto, reconstruir o histórico de um único arquivo requer mais trabalho do que em sistemas de controle de versões que monitoram arquivos individualmente.
+
+A penalidade é usualmente leve, e vale a pena devido à eficiência que dá as outras operações. Por exemplo, `git checkout` é tão rápido quanto `cp -a`, e os deltas que abrangem grandes partes do projeto tem uma compressão melhor do que os deltas de agrupamentos de arquivos.
+
+=== Clone Inicial ===
+
+A criação de um clone é mais trabalhosa do que fazer checkout em outros sistemas de controle de versões quando há um histórico grande.
+
+O custo inicial se paga a longo prazo, pois as futuras operações serão mais rápidas e offline. Entretanto, em algumas situações, é preferível criar um clone vazio com a opção `--depth`. Isto é muito mais rápido, porém resulta em um clone com funcionalidades reduzidas.
+
+=== Projetos Voláteis ===
+
+O Git foi feito para ser rápido no que diz respeito ao tamanho das mudanças. Humanos fazem poucas edições de uma versão para outra. É a correção de uma falha numa linha, uma nova característica do sistema, inclusão de comentário e assim por diante. Mas se seus arquivos diferem muito de uma versão para outra, em cada commit, seu histórico irá crescer acompanhando o tamanho do seu projeto todo.
+
+Não há nada que qualquer sistema de controle de versões possa fazer para ajudar, mas os usuários comuns do Git devem sofrer mais quando estiverem clonando históricos.
+
+As razões pelas quais as mudanças são tão grandes, devem ser analisadas. Talvez os formatos dos arquivos possam ser trocados. Edições menores só devem causar pequenas modificações em poucos arquivos.
+
+Ou talvez um banco de dados ou uma solução de backup/arquivamento seja o que você realmente precisa, e não um sistema de controle de versões. Por exemplo, um controle de versões pode não ser adequado para gerenciar fotos feitas periodicamente de uma webcam.
+
+Se os arquivos estão, realmente, mudando constantemente e precisam ser versionados, uma possibilidade é usar o Git de uma maneira centralizada. Pode-se criar clones vazios, que adiciona pouco ou quase nada ao histórico do projeto. É claro, que muitas ferramentas do Git não estarão disponíveis, e as correções devem ser enviadas como patch. Isto deve ser razoavelmente útil, para alguém que deseja manter um histórico de arquivos demasiadamente instáveis.
+
+Outro exemplo é um projeto dependente de firmware, o qual provavelmente estará em um grande arquivo binário. O histórico de arquivos de firmware é irrelevante para os usuários, e as atualizações têm uma péssima compressão, assim revisões de firmware estourarão o tamanho do repositório sem necessidade.
+
+Neste caso, o código fonte deve ser armazenado num repositório Git, e os arquivos binários mantidos separados do mesmo. Para facilitar o trabalho, alguém pode criar e distribuir um script que usa o Git para clonar o código e o faz um rsync ou um cria um clone vazio do Git para o firmware.
+
+=== Contador Global ===
+
+Alguns sistemas centralizados de controle de versões mantém um número inteiro positivo que é incrementado quando um novo commit é aceito. O Git referencia as modificações por seus hash, o que é o melhor na maioria das circunstâncias.
+
+Mas algumas pessoas gostariam de ter este número por perto. Felizmente, é fácil criar um script que faça isso a cada atualização, o repositório central do Git incrementa o número, talvez em uma marca (tag), e associa a mesma com o hash do último commit.
+
+Cada clone poderia gerenciar este contador, porém isto provavelmente seja desnecessário, já que apenas o contador do repositório central é que importará para todos.
+
+=== Subdiretórios Vazios ===
+
+Subdiretórios vazios não são monitorados. Crie arquivos vazios para resolver esse problema.
+
+A implementação atual do Git, e não seu o design, é a razão deste inconveniente. Com sorte, uma vez que o Git ganhe mais utilização, mais usuários devem clamar por esse recurso e ele poderá ser implementado.
+
+=== Commit Inicial ===
+
+Um cientista da computação tipico inicia uma contagem do 0, ao invés do 1. Entretanto, no que diz respeito a commit, o Git não segue esta convenção. Muito comandos são confusos antes do commit inicial. Além disso existem algumas arestas que precisam aparadas manualmente, seja com um rebase de um branch com um commit inicial diferente.
+
+O Git iria se beneficiar por definir o commit zero: assim que um repositório é construído, o HEAD deve ser definido para uma cadeia de 20 bytes zero. Esse commit especial representaria uma arvore vazia, sem pai, em um momento anterior a todos os repositórios Git
+
+Então executando um git log, por exemplo, deveria informar ao usuário que nenhum commit foi feito até agora, ao invés de terminar com um erro fatal. Da mesma maneira que as outras ferramentas.
+
+Cada commit inicial é implicitamente um decendente desse commit zero.
+
+Infelizmente existem alguns casos problemáticos. Se vários branch com commit iniciais diferentes forem merged juntos, então um rebase do resultado vai requerer uma intervenção manual substancial.
+
+=== Peculiaridades da Interface ===
+
+Para commit A e B, o significado da expressão "A..B" e "A...B" depende de onde o comando espera os dois pontos ou uma faixa. Veja *git help diff* e *git help rev-parse*.
diff --git a/pt_br/grandmaster.txt b/pt_br/grandmaster.txt
new file mode 100644
index 00000000..9317ab5f
--- /dev/null
+++ b/pt_br/grandmaster.txt
@@ -0,0 +1,179 @@
+== Grão-Mestre Git ==
+
+Até agora, você deve ser capaz de navegar pelas páginas do *git help* e entender quase tudo. Entretanto, identificar o comando exato para resolver um dados problema pode ser tedioso. Talvez possa economizar algum tempo seu: a seguir estão algumas receitas que precisei no passado.
+
+=== Disponibilização de Código ===
+
+Para meus projetos, o Git organiza exatamente os arquivos que quero guardar e disponibilizar para os usuários. Para criar um tarball do código fonte, executo:
+
+ $ git archive --format=tar --prefix=proj-1.2.3/ HEAD
+
+=== Commit do que Mudou ===
+
+Mostrar ao Git quando adicionamos, apagamos e/ou renomeamos arquivos pode ser problemático em alguns projetos. Em vez disso, você pode digitar:
+
+ $ git add .
+ $ git add -u
+
+O Git analisará os arquivos no diretório atual e trabalhar nos detalhes, automaticamente. No lugar do segundo comando add, execute `git commit -a` se sua intenção é efetuar um commit neste momento. Veja *git help ignore* para saber como especificar os arquivos que devem ser ignorados.
+
+Você pode executar isto em apenas um passo com:
+
+ $ git ls-files -d -m -o -z | xargs -0 git update-index --add --remove
+
+As opções *-z* e *-0* previnem contra os transtornos de arquivos com caracteres estranhos no nome. Note que este comando adiciona os arquivos ignorados. Logo, você pode querer usar as opções `-x` ou `-X`.
+
+=== Meu Commit é muito Grande! ===
+
+Você esqueceu de fazer commit por um muito tempo? Ficou codificando furiosamente e esqueceu do controle de versões até agora? Fez uma série de modificações não relacionadas entre si, pois este é seu estilo?
+
+Não se preocupe. Execute:
+
+ $ git add -p
+
+Para cada modificação realizada, o Git mostrará o pedaço do código alterado, e perguntará se ele deve fazer parte do próximo commit. Responda "y" (sim) ou "n" (não). Há outras opções, como o adiamento dessa decisão; digite "?" para aprender como.
+
+Uma vez satisfeito, digite:
+
+ $ git commit
+
+para fazer um commit exatamente com as modificações aprovadas ('staged'). Lembre-se de retirar a opção *-a*, caso contrário o commit conterá todas as modificações.
+
+E se você tiver editado vários arquivos em vários locais? Rever cada modificação uma por uma será frustante e enfadonho. Neste caso, use *git add -i*, cuja interface é menos simples, porém mais flexível. Com algumas poucas teclas, você pode aprovar ou não vários arquivos de uma vez, ou rever e selecionar as modificações em um arquivo especifico. Alternativamente, execute *git commit \--interactive* o que automaticamente efetuará seus commit assim que terminar de aprovar.
+
+=== O Indice: A Área de Atuação do Git ===
+
+Até agora estivemos evitando o famoso 'index' do git, mas agora teremos que enfrentá-lo para explicar o tópico acima. O index é uma área de atuação temporária. O Git frequentemente atualiza os dados diretamente entre seu projeto e sua historia. Preferencialmente, Git primeiro armazena os dados no index, e então copia os dados do index para seu destino final.
+
+Por exemplo, *commit -a* é na realidade um processo em duas etapas. A primeira etapa coloca uma “fotografia” do estado atual de cada arquivo rastreado em um índice. O segundo passo registra permanentemente a “fotografia” localizado no índice. O commit sem a opção *-a* somente executa o segundo passo, e somente faz sentido após a execução de um comando que de alguma maneira altera o índice, tal como o *git add*.
+
+Geralmente podemos ignorar o index e supor que estamos lendo e escrevendo diretamente no histórico. Nessas ocasiões, queremos um controle mais fino, de modo que manipulamos o índice. Colocamos uma “fotografia” de algumas, mas não todas, as nossas alterações no índice, e então registramos permanentemente esta “fotografia” cuidadosamente manipulada.
+
+=== Não perca a CABEÇA (HEAD) ===
+
+A etiqueta HEAD (cabeçalho) é como um indicador que normalmente aponta para o último commit, avançando a cada novo commit. Alguns comandos do Git permitem movê-la. Por exemplo:
+
+ $ git reset HEAD~3
+
+irá mover o HEAD três commit para trás. Assim todos os comandos do Git passam a agir como se você não tivesse realizados os últimos três commit, enquanto seus arquivos permanecem no presente. Consulte a página do manual para mais aplicações.
+
+Mas como se faz para voltar para o futuro? Os últimos commit não sabem do futuro.
+
+Se você tem o SHA1 do HEAD original então:
+
+ $ git reset 1b6d
+
+Mas suponha que você não tenha anotado. Não se preocupe, para comandos desse tipo, o Git salva o HEAD original com uma etiqueta chamada de ORIG_HEAD, e você pode retornar são e salvo com:
+
+ $ git reset ORIG_HEAD
+
+=== Explorando o HEAD ===
+
+Talvez ORIG_HEAD não seja suficiente. Talvez você só tenha percebido que fez um erro descomunal e precisa voltar para um antigo commit de um branch há muito esquecido.
+
+Por default, o Git mantém um commit por pelo menos duas semanas, mesmo se você mandou o Git destruir o branch que o contêm. O problema é achar o hash certo. Você pode procurar por todos os valores de hash em `.git/objects` e por tentativa e erro encontrar o que procura. Mas há um modo mais fácil.
+
+O Git guarda o hash de todos os commit que ele calcula em `.git/logs`. O sub-diretório refs contêm o histórico de toda atividade em todos os branch, enquanto o arquivo `HEAD` mostra todos os valores de hash que teve. Este último pode ser usado para encontrar o hash de um commit num branch que tenha sido acidentalmente apagado.
+
+O comando reflog fornece uma interface amigável para estes arquivos de log. Experimente
+
+ $ git reflog
+
+Ao invés de copiar e colar o hash do reflog, tente:
+
+ $ git checkout "@{10 minutes ago}"
+
+Ou faça um checkout do quinto último commit com:
+
+ $ git checkout "@{5}"
+
+Leia a seção ``Specifying Revisions'' da ajuda com *git help rev-parse* para mais informações.
+
+Você pode querer configurar um período mais longo de carência para condenar um commit. Por exemplo:
+
+ $ git config gc.pruneexpire "30 days"
+
+significa que um commit apagado será permanentemente eliminado após passados 30 dias e executado o comando *git gc*.
+
+Você também pode desativar as execuções automáticas do *git gc*:
+
+ $ git config gc.auto 0
+
+assim os commit só serão permanentemente eliminados quando executado o *git gc* manualmente.
+
+=== Baseando se no Git ===
+
+Seguindo o jeito UNIX de ser, o Git permite ser facilmente utilizado como um componente de “baixo nível” para outros programas, tais como interfaces GUI, interfaces web, interfaces alternativas de linha de comando, ferramentas de gerenciamento de patchs, ferramentas de importação e conversão e outras. Na realidade, alguns comandos Git são eles mesmos, scripts apoiados em ombros de gigantes. Com pouco trabalho, você pode configurar o Git para suas preferencias.
+
+Um truque simples é criar alias (abreviações), internas ao Git para abreviar os comandos utilizados mais frequentemente:
+
+ $ git config --global alias.co checkout
+ $ git config --global --get-regexp alias # display current aliases
+ alias.co checkout
+ $ git co foo # same as 'git checkout foo'
+
+Outra é imprimir o branch atual no prompt, ou no título da janela. É só executar:
+
+ $ git symbolic-ref HEAD
+
+que mostra o nome do branch atual. Na prática, muito provavelmente você não quer ver o "refs/heads/" e ignorar os erros:
+
+ $ git symbolic-ref HEAD 2> /dev/null | cut -b 12-
+
+O subdiretório +contrib+ é um baú do tesouro de ferramentas construídas com o Git. Com o tempo algumas delas devem ser promovidas para comandos oficiais. Nos sistemas Debian e Ubuntu esse diretório esta em +/usr/share/doc/git-core/contrib+.
+
+Um residente popular é +workdir/git-new-workdir+. Por meio de um inteligente link simbólico, este script cria um novo diretório de trabalho cujo histórico é compartilhado com o repositório original:
+
+ $ git-new-workdir an/existing/repo new/directory
+
+O novo diretório e arquivos dentro dele podem ser vistos como um clone, exceto que como o histórico é compartilhado, as duas arvores automaticamente estarão em sincronia. Não é necessário fazer merge, push ou pull.
+
+=== Manobras Radicais ===
+
+As versões recentes do Git tornaram mais difícil para o usuário destruir acidentalmente um dado. Mas se você sabe o que esta fazendo, você pode transpor estas salvaguardas utilizadas nos comandos mais comuns.
+
+*Checkout*: Se há modificações sem commit, um checkout simples falhará. Para destruir estas modificações, e fazer um checkout de um certo commit assim mesmo, use a opção force (-f):
+
+ $ git checkout -f HEAD^
+
+Por outro lado, se for especificado algum endereço em particular para o checkout, então não haverá checagem de segurança. O endereço fornecido será silenciosamente sobrescrito. Tenha cuidado se você usa o checkout desse jeito.
+
+*Reset*: O Reset também falha na presença de modificações sem commit. Para obrigá-lo, execute:
+
+ $ git reset --hard 1b6d
+
+*Branch*: Apagar um branch falha se isto levar a perda das modificações. Para forçar, digite:
+
+ $ git branch -D dead_branch # instead of -d
+
+Analogamente, a tentativa de sobrescrever um branch movendo-o falha for causar a perda de dados. Para forçar a movimentação do branch, use:
+
+ $ git branch -M source target # instead of -m
+
+Ao contrário do checkout e do reset, estes dois comandos adiarão a destruição dos dados. As modificações ainda serão armazenadas no subdiretório .git, e podem ser resgatados, recuperando o hash apropriado do `.git/logs` (veja a seção "Explorando o HEAD" acima). Por padrão, eles serão mantidos por pelo menos duas semanas.
+
+*Clean*: Alguns comandos do Git recusam-se a avançar devido o receio de sobrescrever arquivos não “monitorados” (sem commit). Se você tiver certeza de que todos os arquivos e diretórios não monitorados são dispensáveis, então apague-os sem misericórdia com:
+
+ $ git clean -f -d
+
+Da próxima vez, o maldito comando não se recusará a funcionar!
+
+=== Prevenção a maus Commits ===
+
+Erros estúpidos poluem meus repositórios. Os mais assustadores são os arquivos perdidos devido a comandos *git add* esquecidos. Transgressões mais leves são espaço em branco e conflitos de merge não resolvidos: embora sem perigo, eu gostaria que eles nunca aparecessem nos meus registros públicos.
+
+Se eu tivesse comprado um seguro idiota usando _hook_ para me alertar sobre esses problemas:
+
+ $ cd .git/hooks
+ $ cp pre-commit.sample pre-commit # Older Git versions: chmod +x pre-commit
+
+Agora o Git aborta um commit se espaço em branco sem utilidade ou um conflito de merge não resolvido for detectado.
+
+Para este guia, eu eventualmente adiciono o seguinte ao inicio do hook *pre-commit* para proteção contra as “mentes sem noção”.
+
+ if git ls-files -o | grep '\.txt$'; then
+ echo FAIL! Untracked .txt files.
+ exit 1
+ fi
+
+Várias operações do Git suportam o hook: veja *git help hooks*. Nós ativamos o hook de exemplo *post-update* anteriormente quando discutimos o Git sob HTTP. Isso executa sempre que o HEAD se movimenta. O script de exemplo post-update atualiza os arquivos que o Git necessita para a comunicação sob transportes agnósticos do Git, como o HTTP.
diff --git a/pt_br/history.txt b/pt_br/history.txt
new file mode 100644
index 00000000..60d3c736
--- /dev/null
+++ b/pt_br/history.txt
@@ -0,0 +1,190 @@
+== Lições de historia ==
+
+Uma consequência da natureza distribuída do Git é que o histórico pode ser editado facilmente. Mas se você adulterar o passado, tenha cuidado: apenas rescreva a parte do histórico que só você possui. Assim como as nações sempre argumentam sobre quem comete atrocidades, se alguém tiver um clone cuja versão do histórico seja diferente do seu, você pode ter problemas para conciliar suas árvores quando interagirem.
+
+Alguns desenvolvedores acreditam que o histórico deva ser imutável, com falhas ou não. Outros, acreditam que suas árvores devem estar apresentáveis antes de liberá-las ao público. O Git contempla ambos pontos de vista. Tal como a clonagem, branch e merge, rescrever o histórico é simplesmente outro poder que o Git lhe concede. Cabe a você a usá-lo sabiamente.
+
+=== Eu corrijo ===
+
+Acabou de fazer um commit, mas queria ter escrito uma mensagem diferente? Então execute:
+
+ $ git commit --amend
+
+para mudar a última mensagem. Percebeu que esqueceu de adicionar um arquivo? Execute *git add* para adicioná-lo, e então execute o comando acima.
+
+Quer incluir mais algumas modificações no último commit? Faça-as e então execute:
+
+ $ git commit --amend -a
+
+=== ... e tem mais ===
+
+Suponha que o problema anterior é dez vezes pior. Após uma longa sessão onde você fez um monte de commit. E você não está muito satisfeito com a organização deles, e algumas das mensagens dos commit poderiam ser reformuladas. Então execute:
+
+ $ git rebase -i HEAD~10
+
+e os últimos 10 commit aparecerão em seu $EDITOR favorito. Trecho de exemplo:
+
+ pick 5c6eb73 Added repo.or.cz link
+ pick a311a64 Reordered analogies in "Work How You Want"
+ pick 100834f Added push target to Makefile
+
+Os commit antigos precedem os mais novos nessa lista, diferentemente do comando `log`.
+Aqui, 5c6eb73 é o commit mais velho e o 100834f é o commit mais novo. Então:
+
+- Remova os commit deletando as linhas. Como o comando revert, mas sem fazer o registro: será como se o commit nunca tenha existido.
+- Reorganize os commit reorganizando as linhas.
+- Substitua `pick` com:
+ * `edit` para modificar a mensagem do commit;
+ * `reword` para alterar a mensagem de log;
+ * `squash` para fazer o merge de um commit com o commit anterior;
+ * `fixup` para fazer o merge de um commit com o anterior e descartar a mensagem de log.
+
+Por exemplo, queremos substituir o segundo `pick` por `squash`:
+
+ pick 5c6eb73 Added repo.or.cz link
+ squash a311a64 Reordered analogies in "Work How You Want"
+ pick 100834f Added push target to Makefile
+
+Após salvar e sair, o Git ira fazer o merge a311a64 com o 5c6eb73. Assim *squash* faz o merge no próximo commit: pense como ``squash up''.
+
+O Git, então combina suas mensagens de logs e apresenta para edição. O comando *fixup* salta essa etapa; a mensagem de log squashed é simplesmente descartada.
+
+Se marcar um commit com *edit*, o Git retorna você ao passado, ao commit mais velho. Você pode emendar o commit velho como descrito na seção anterior, e até mesmo criar um novo commit que pertença a esse. Uma vez que esteja satisfeito com o ``retcon'', siga adiante executando:
+
+ $ git rebase --continue
+
+O Git reenvia os commits até o próximo *edit*, ou ao presente se não restar nenhum.
+
+Você pode também, abandonar o rebase com:
+
+ $ git rebase --abort
+
+Portanto, faça commit cedo e com frequência: e arrume tudo facilmente mais tarde com um rebase.
+
+=== Alterações locais por último ===
+
+Você está trabalhando em um projeto ativo. Faz alguns commit locais ao longo do tempo, e sincroniza com a árvore oficial com merge. Este ciclo se repete algumas vezes até estar tudo pronto para ser enviado à árvore central.
+
+Mas agora o histórico no seu clone local está uma confusão com o emaranhado de modificações locais e oficiais. Você gostaria de ver todas as suas modificações em uma seção contínua e depois todas as modificações oficiais.
+
+Este é um trabalho para *git rebase* conforme descrito acima. Em muitos casos pode-se usar a opção *--onto* e evitar sua interação.
+
+Veja também *git help rebase* com exemplos detalhados deste incrível comando. Você pode dividir commit. Ou até reorganizar branch de uma árvore.
+
+Tome cuidado: o comando rebase é muito poderoso. Para rebases complicados, primeiro faça um backup com *git clone*.
+
+=== Reescrevendo o histórico ===
+
+Eventualmente, será necessário que seu controle de código tenha algo equivalente ao modo Stanlinesco de retirada de pessoas das fotos oficiais, apagando-os da história. Por exemplo, suponha que temos a intenção de lançar um projeto, mas este envolve um arquivo que deve ser mantido privado por algum motivo. Talvez eu deixe meu número do cartão de crédito num arquivo texto e acidentalmente adicione-o ao projeto. Apagá-lo é insuficiente, pois, pode ser acessado pelos commit anteriores. Temos que remover o arquivo de todos os commit:
+
+ $ git filter-branch --tree-filter 'rm top/secret/file' HEAD
+
+Veja *git help filter-branch*, que discute este exemplo e mostra um método mais rápido. No geral, *filter-branch* permite que você altere grandes seções do histórico só com um comando.
+
+Depois, o diretório +.git/refs/original+ descreve o estado dos casos antes da operação. Verifique se o comando filter-branch faz o que você deseja, e então apague esse diretório se você deseja executar mais comandos filter-branch.
+
+Por ultimo, você deve substituir os clones do seu projeto pela versão revisada se desejar interagir com eles depois.
+
+=== Fazendo história ===
+
+[[makinghistory]]
+Quer migrar um projeto para Git? Se ele for gerenciado por um algum dos sistemas mais conhecidos, então é possível que alguém já tenha escrito um script para exportar todo o histórico para o Git.
+
+Caso contrário, dê uma olhada em *git fast-import*, que lê um texto num formato especifico para criar o histórico Git do zero. Normalmente um script usando este comando é feito as pressas sem muita frescura e é executado apenas uma vez, migrando o projeto de uma só vez.
+
+Por exemplo, cole a listagem a seguir num arquivo temporário, como `/tmp/history`:
+----------------------------------
+commit refs/heads/master
+committer Alice Thu, 01 Jan 1970 00:00:00 +0000
+data <
+
+int main() {
+ printf("Hello, world!\n");
+ return 0;
+}
+EOT
+
+
+commit refs/heads/master
+committer Bob Tue, 14 Mar 2000 01:59:26 -0800
+data <
+
+int main() {
+ write(1, "Hello, world!\n", 14);
+ return 0;
+}
+EOT
+
+----------------------------------
+
+Em seguida crie um repositório Git a partir deste arquivo temporário digitando:
+
+ $ mkdir project; cd project; git init
+ $ git fast-import --date-format=rfc2822 < /tmp/history
+
+Faça um checkout da última versão do projeto com:
+
+ $ git checkout master .
+
+O comando *git fast-export* converte qualquer repositório para o formato do
+*git fast-import* format, cujo resultado você pode estudar para escrever seus exportadores, e também para converter repositórios Git para um formato legível aos humanos. Na verdade, estes comandos podem enviar repositórios de arquivos de texto por canais exclusivamente textuais.
+
+=== Onde foi que tudo deu errado? ===
+
+Você acabou de descobrir uma função errada em seu programa, que você sabe com certeza que estava funcionando há alguns meses atrás. Merda! Onde será que este erro começou? Se só você estivesse testando a funcionalidade que desenvolveu.
+
+Agora é tarde para reclamar. No entanto, se você estiver fazendo commit, o Git pode localizar o problema:
+
+ $ git bisect start
+ $ git bisect bad HEAD
+ $ git bisect good 1b6d
+
+O Git verifica um estado intermediário entre as duas versões. Testa a função, e se ainda estiver errada:
+
+ $ git bisect bad
+
+Senão, substitua "bad" por "good". O Git novamente o levará até um estado intermediário entre as versões definidas como good e bad, diminuindo as possibilidades. Após algumas iterações, esta busca binária o guiará até o commit onde começou o problema. Uma vez terminada sua investigação, volte ao estado original digitando:
+
+ $ git bisect reset
+
+Ao invés de testar todas as mudanças manualmente, automatize a busca com:
+
+ $ git bisect run my_script
+
+O Git usa o valor de retorno do comando utilizado, normalmente um único script, para decidir se uma mudança é good ou bad: o comando deve terminar retornando com o código 0 se for good, 125 se a mudança for ignorável e qualquer coisa entre 1 e 127 se for bad. Um valor negativo abortará a bissecção.
+
+Podemos fazer muito mais: a página de ajuda explica como visualizar as bissecções, examinar ou reproduzir o log da bissecção, e eliminar mudanças reconhecidamente inocentes para acelerar a busca.
+
+=== Quem fez tudo dar errado? ===
+
+Tal como outros sistema de controle de versões, o Git tem um comando blame (culpado):
+
+ $ git blame bug.c
+
+que marca cada linha do arquivo mostrando quem o modificou por último e quando. Ao contrário de outros sistemas de controle de versões, esta operação ocorre offline, lendo apenas do disco local.
+
+=== Experiência pessoal ===
+
+Em um sistema de controle de versões centralizado, modificações no histórico são operações difíceis, e disponíveis apenas para administradores. Clonagem, branch e merge são impossíveis sem uma rede de comunicação. Bem como as operações básicas: navegar no histórico ou fazer commit das mudanças. Em alguns sistemas, é exigido do usuário uma conexão via rede, apenas para visualizar suas próprias modificações ou abrir um arquivo para edição.
+
+Sistemas centralizados impedem o trabalho offline, e exigem um infraestrutura de rede mais cara, especialmente quando o número de desenvolvedores aumenta. Mais importante, todas a operações são mais lentas, até certo ponto, geralmente até o ponto onde os usuários evitam comandos mais avançados até serem absolutamente necessários. Em casos extremos, esta é a regra até para a maioria dos comandos básicos. Quando os usuários devem executar comandos lento, a produtividade sofre por causa de uma interrupção no fluxo de trabalho.
+
+Já experimentei este fenômeno na pele. O Git foi o primeiro sistema de controle de versões que usei. E rapidamente cresci acostumado a ele, tomando muitas de suas características como normais. Simplesmente assumi que os outros sistemas eram semelhante: escolher um sistema de controle de versões deveria ser igual a escolher um novo editor de texto ou navegador para internet.
+
+Fiquei chocado quando, posteriormente, fui forçado a usar um sistema centralizado. Uma conexão ruim com a Internet pouco importa com o Git, mas torna o desenvolvimento insuportável quando precisa ser tão confiável quanto o disco local. Além disso, me condicionava a evitar determinados comandos devido a latência envolvida, o que me impediu, em última instância, de continuar seguindo meu fluxo de trabalho.
+
+Quando executava um comando lento, a interrupção na minha linha de pensamento causava um enorme prejuízo. Enquanto espero a comunicação com o servidor concluir, faço algo para passar o tempo, como checar email ou escrever documentação. Na hora em que retorno a tarefa original, o comando já havia finalizado há muito tempo, e perco mais tempo lembrando o que estava fazendo. Os seres humanos são ruins com trocas de contexto.
+
+Houve também um interessante efeito da tragédia dos comuns: antecipando o congestionamento da rede, os indivíduos consomem mais banda que o necessário em varias operações numa tentativa de reduzir atrasos futuros. Os esforços combinados intensificam o congestionamento, encorajando os indivíduos a consumir cada vez mais banda da próxima vez para evitar os longos atrasos.
diff --git a/pt_br/intro.txt b/pt_br/intro.txt
new file mode 100644
index 00000000..b630f854
--- /dev/null
+++ b/pt_br/intro.txt
@@ -0,0 +1,57 @@
+== Introdução ==
+
+Usaremos uma analogia para falar sobre controle de versões. Veja http://en.wikipedia.org/wiki/Revision_control[o verbete Sistema de Controle de Versões] para uma explicação mais formal.
+
+=== Trabalhar é Divertido ===
+
+Divirto-me com jogos para computador quase a minha vida toda. Em contrapartida, só comecei a usar sistemas de controle de versões quando adulto. Suspeito que não fui o único, e comparar os dois pode tornar estes conceitos mais fáceis de explicar e entender.
+
+Pense na edição de seu código, documento, ou qualquer outra coisa, como jogar um jogo. Uma vez que tenha feito muitos progressos, e gostaria de de salvá-los. Para isso, você clica em “Salvar” no seu editor preferido.
+
+Porém, isto vai sobrescrever a versão anterior. É como nos antigos jogos onde você só tinha uma espaço para salvar: você pode salvar, mas nunca mais poderá voltar a um estado salvo anteriormente. O que é um pena, pois o estado anterior era uma parte muito divertida do jogo e você gostaria de poder revisitá-lo outra hora. Ou pior, o último estado salvo é dificílimo e você terá que recomeçar.
+
+=== Controle de Versões ===
+
+Ao editar, você pode “Salvar como ...” num arquivo diferente, ou copiar o arquivo antes de sobrescrevê-lo se você quiser manter as versões anteriores. Pode também comprimí-los para economizar espaço. Isto é uma forma rudimentar e muito trabalhosa de controle de versões. Jogos de computador aperfeiçoaram este método, muitos deles acrescentam automaticamente a data e a hora aos estados salvos.
+
+Vamos dificultar um pouco. Digamos que são um monte de arquivos juntos, como os fontes do seu projeto, ou arquivos para um website. Agora se quiser manter suas versões anteriores, terá que arquivar todo um diretório ou vários. Manter muitas versões na mão é inconveniente e rapidamente se tornará caro.
+
+Em alguns jogos de computador, um estado salvo consiste de um diretório cheio de arquivos. Estes jogos escondem estes detalhes do jogador e lhe apresentam uma interface conveniente para gerenciar as diferentes versões neste diretório.
+
+Sistemas de controle de versões não são diferentes. Todos têm uma boa interface para gerenciar seu diretório de versões. Você pode salvar o diretório sempre que desejar, e pode rever qualquer um dos estados salvos quando quiser. Ao contrário da maioria dos jogos de computador, eles são geralmente mais espertos na economia de espaço. Normalmente, apenas uns poucos arquivos mudam de versão para versão, e com poucas diferenças. Armazenar as diferenças, ao invés de todos os arquivos, economiza espaço.
+
+=== Controle distribuído ===
+
+Agora imagine um jogo de computador muito difícil. Tão difícil de terminar que vários jogadores experientes pelo mundo decidem formar uma equipe e compartilhar seus estados salvos do jogo para tentar vencê-lo. Speedruns são exemplos reais: jogadores especializados em diferentes níveis do mesmo jogo colaboram na produção de resultados incríveis.
+
+Como você configura um sistema para que todos possam obter facilmente o que os outros salvarem? E salvar novos estados?
+
+Nos velhos tempos, todos os projetos utilizavam um controle de versões centralizado. Um servidor em algum lugar mantinha os jogos salvos. Ninguém mais teria todos os jogos. Cada jogador mantinha apenas alguns jogos salvos em suas maquinas. Quando algum jogador quiser avançar no jogo, ele pega o ultimo jogo salvo do servidor, joga um pouco, salva e manda de volta para o servidor para que os outros possam usar.
+
+E se um jogador quiser pegar um jogo antigo salvo por algum motivo? Talvez o jogo atual salvo esteja em um nível impossível de jogar devido alguém ter esquecido um objeto três níveis atrás, e é preciso encontrar o último jogo salvo que está em um nível que pode ser completado com sucesso. Ou talvez queira comparar dois jogos salvos para saber o quanto um jogador avançou.
+
+Podem existir vários motivos para ver uma versão antiga, mas o modus operandi é o mesmo. Têm que solicitar ao servidor centralizado a versão antiga. E quanto mais jogos salvos forem necessários, maior é o tráfego de informação.
+
+A nova geração de sistemas de controle de versões, dentre eles o Git, é conhecida como sistemas distribuídos, e pode ser pensada como uma generalização dos sistemas centralizados. Quando os jogadores baixam do servidor principal, eles recebem todos os jogos salvos, e não apenas o mais recente. É como se estivessem espelhando o servidor principal.
+
+A primeira operação de clonagem pode ser bem demorada, especialmente se há um longo histórico, mas é compensada no longo prazo. Um benefício imediato é que, se por qualquer razão desejar uma antiga versão, o trafego de informação com o servidor é desnecessário.
+
+=== Uma superstição ===
+
+Um equívoco popular é que sistemas distribuídos estão mal adaptados a projetos que exijam um repositório central oficial. Nada poderia estar mais longe da verdade. Fotografar alguém não irá roubar a sua alma. Igualmente, clonar o repositório master não diminui sua importância.
+
+Uma boa comparação inicial é: qualquer coisa que um sistema centralizado de controle de versões faz, um sistema distribuído de controle de versões bem concebido pode fazer melhor. Recursos de rede são simplesmente mais onerosos que recursos locais. Embora vejamos mais adiante que existem inconvenientes numa abordagem distribuída, é menos provável que alguém faça comparações errôneas com esta regra de ouro.
+
+Um pequeno projeto pode precisar de apenas uma fração dos recursos oferecidos pelo sistema, mas utilizar um sistema que não permite expansão é como utilizar os algarismos romanos quando calculamos com números pequenos.
+
+E mais, seu projeto pode crescer além da suas expectativas. Usando Git, desde o inicio é como ter um canivete suíço, embora o use na maioria das vezes para abrir garrafas. No dia que necessitar, desesperadamente, de uma chave de fenda você agradecerá por ter mais do que um abridor de garrafas.
+
+=== Conflitos de mesclagem (Merge) ===
+
+Neste tópico, nossa analogia com jogos de computador torna-se ruim. Em vez disso, vamos considerar novamente a edição de um documento.
+
+Suponha que Alice insira uma linha no início do arquivo, e Bob uma no final. Ambos enviam suas alterações. A maioria dos sistemas irá de maneira automática e reativa deduzir o plano de ação: aceitando e mesclando as mudanças, assim as alterações de Alice e Bob serão aplicadas.
+
+Agora suponha que ambos, Alice e Bob, façam alterações distintas na mesma linha. Tornando impossível resolver o conflito sem intervenção humana. A segunda pessoa, entre Alice e Bob, que enviar suas alterações será informado do conflito, e escolherá se aplica sua alteração sobre a do outro, ou revisa a linha para manter ambas as alterações.
+
+Situações muito mais complexas podem surgir. Sistemas de controle de versões são capazes de resolver os casos mais simples, e deixar os casos mais difíceis para nós resolvermos. Normalmente seu comportamento é configurável.
diff --git a/pt_br/multiplayer.txt b/pt_br/multiplayer.txt
new file mode 100644
index 00000000..1c8af7b5
--- /dev/null
+++ b/pt_br/multiplayer.txt
@@ -0,0 +1,171 @@
+== Git Multiplayer ==
+
+Inicialmente, utilizei o Git em um projeto particular onde era o único desenvolvedor. Entre os comandos relacionados a natureza distribuída do Git, eu precisava somente do *pull* e *clone*, de modo a manter o mesmo projeto em vários lugares.
+
+Mais tarde, quis publicar meu código com o Git, e incluir as alterações dos contribuidores. Tive que aprender como gerenciar projetos com vários desenvolvedores de todas as partes do mundo. Felizmente, esse é o forte do Git, e indiscutivelmente sua razão de existir.
+
+=== Quem sou eu? ===
+
+Cada commit tem um nome de autor e e-mail, que pode ser mostrado pelo *git log*. O Git utiliza as configurações do sistema para preencher esses campos. Para fazer o preenchimento explícito, digite:
+
+ $ git config --global user.name "John Doe"
+ $ git config --global user.email johndoe@example.com
+
+Omita o flag global para configurar essas opções somente para o repositório atual.
+
+=== Git sob SSH, HTTP ===
+
+Suponha que você tenha acesso SSH a um servidor web, mas que o Git não esteja instalado. Embora não tão eficiente quanto seu protocolo nativo, o Git pode se comunicar via HTTP.
+
+Baixe, compile e instale o Git em sua conta, e crie um repositório no seu diretório web:
+
+ $ GIT_DIR=proj.git git init
+ $ cd proj.git
+ $ git --bare update-server-info
+ $ cp hooks/post-update.sample hooks/post-update
+
+Para versões mais antigas do Git, o comando copy falha e você deve executar:
+
+ $ chmod a+x hooks/post-update
+
+Agora você pode publicar suas últimas edições via SSH de qualquer clone:
+
+ $ git push web.server:/path/to/proj.git master
+
+E qualquer um pode obter seu projeto com:
+
+ $ git clone http://web.server/proj.git
+
+=== Git sobre qualquer coisa ===
+
+Deseja sincronizar os repositórios sem servidores, ou mesmo sem uma conexão de rede? Precisa improvisar durante uma emergência? Vimos que <>. Podemos enviar esses arquivos para outros lugares fazendo o transporte de repositórios git sob qualquer meio, mas uma ferramenta mais eficiente é o *git bundle*.
+
+O emissor cria um 'bundle':
+
+ $ git bundle create somefile HEAD
+
+E então transporta o pacote, +somefile+, para outro lugar: por e-mail, pen-drive (ou mesmo uma saida impressa *xxd* e um scanner com ocr, sinais binários pelo telefone, sinais de fumaça, etc). O receptor recupera os commits do pacote executando:
+
+ $ git pull somefile
+
+O receptor pode inclusive fazer isso em um diretório vazio. Apesar do seu tamanho, +somefile+ contém todo o repositório git original.
+
+Em grandes projetos, podemos eliminar o desperdício fazendo o empacotamento somente das mudanças que o outro repositório necessita. Por exemplo, suponha que o commit ``1b6d...'' é o commit mais recente compartilhado por ambas as partes:
+
+ $ git bundle create somefile HEAD ^1b6d
+
+Se executado frequentemente, podemos esquecer que commit foi feito por último. A página de ajuda sugere utilizar tags para resolver esse problema. Isto é, após enviar um pacote, digite:
+
+ $ git tag -f lastbundle HEAD
+
+e crie um novo pacote de atualização com:
+
+ $ git bundle create newbundle HEAD ^lastbundle
+
+=== Patches: A moeda Universal ===
+
+Patches são representações textuais das suas mudanças que podem ser facilmente entendidas pelos computadores e pelos seres humanos. Isso tem um forte apelo. Você pode mandar um patch por e-mail para os desenvolvedores não importando que sistema de versão eles estão utilizando. Como os desenvolvedores podem ler o e-mail, eles podem ver o que você editou.
+
+Da mesma maneira, do seu lado, tudo o que você precisa é de uma conta de e-mail: não é necessário configurar um repositório online do Git.
+
+Lembrando do primeiro capítulo:
+
+ $ git diff 1b6d > my.patch
+
+produz um patch que pode ser colado em um e-mail para discussão. Em um repositório Git, digite:
+
+ $ git apply < my.patch
+
+para aplicar o patch.
+
+Em configurações mais formais, quando o nome do autor e talvez sua assinatura precisem ser armazenadas, podemos gerar os patches correspondentes a partir de um certo ponto com o comando:
+
+ $ git format-patch 1b6d
+
+Os arquivos resultantes podem ser fornecidos ao *git-send-email*, ou enviados manualmente. Você também pode especificar uma faixa de commits:
+
+ $ git format-patch 1b6d..HEAD^^
+
+No lado do receptor, salve o e-mail como um arquivo, e entre com:
+
+ $ git am < email.txt
+
+Isso aplica o patch de entrada e também cria um commit, incluindo as informações tais como o autor.
+
+Com um navegador cliente de e-mail, pode ser necessário clicar o botão para ver o e-mail em seu formato original antes de salvar o patch para um arquivo.
+
+Existem pequenas diferenças para os clientes de e-mail baseados em mbox, mas se você utiliza algum desses, provavelmente é o tipo de pessoa que pode resolver os problemas sem ler o manual.
+
+=== Sinto muito, mas mudamos ===
+
+Após fazer o clone de um repositório, executar o *git push* ou *git pull* irá automaticamente fazer o push ou pull da URL original. Como o Git faz isso? O segredo reside nas opções de configuração criadas com o clone. Vamos dar uma olhada:
+
+ $ git config --list
+
+A opção +remote.origin.url+ controla a URL de origem; ``origin'' é um apelido dados ao repositório fonte. Da mesma maneira que a convenção do branch ``master'', podemos mudar ou deletar esse apelido mas geralmente não existe um motivo para fazê-lo.
+
+Se o repositório original for movido, podemos atualizar a URL via:
+
+ $ git config remote.origin.url git://new.url/proj.git
+
+A opção +branch.master.merge+ especifica o branch remoto default em um *git pull*. Durante a clonagem inicial, ele é configurado para o branch atual do repositório fonte, mesmo que o HEAD do repositório fonte subsequentemente mova para um branch diferente, um pull posterior irá seguir fielmente o branch original.
+
+Essa opção somente aplica ao repositório que fizemos a clonagem em primeiro lugar, que é armazenado na opção +branch.master.remote+. Se fizermos um pull de outro repositório devemos estabelecer explicitamente que branch desejamos:
+
+ $ git pull git://example.com/other.git master
+
+Isso explica por que alguns de nossos exemplos de pull e push não possuem argumentos.
+
+=== Branches Remotos ===
+
+Quando clonamos um repositório, clonamos também todos os seus branches. Voce pode não ter notado isso porque o Git sempre esconde os branches: mas podemos solicitá-los especificamente. Isso previne os branches no repositório remoto de interferir com seus branches, e também torna o Git mais fácil para os iniciantes.
+
+Liste os branches remotos com:
+
+ $ git branch -r
+
+Voce deve obter uma saída como:
+
+ origin/HEAD
+ origin/master
+ origin/experimental
+
+Eles representam branches e a HEAD de um repositório remoto, e pode ser utilizado em comandos normais do Git. Por exemplo, suponha que você fez vários commits, e gostaria de comparar contra a última versão buscada (fetched). Você pode buscar nos logs pelo hash apropriado SHA1, mas é muito mais fácil digitar:
+
+ $ git diff origin/HEAD
+
+Ou você pode ver o que o branch ``experimental'' contém:
+
+ $ git log origin/experimental
+
+=== Remotos Múltiplos ===
+
+Suponha que dois desenvolvedores estão trabalhando em nosso projeto, e que queremos manter o controle de ambos. Podemos seguir mais de um repositório a qualquer hora com:
+
+ $ git remote add other git://example.com/some_repo.git
+ $ git pull other some_branch
+
+Agora temos merged em um branch a partir do segundo repositório, e temos fácil acesso a todos os branches de todos os repositórios:
+
+ $ git diff origin/experimental^ other/some_branch~5
+
+Mas e se só queremos comparar as suas alterações sem afetar o trabalho de ambos? Em outras palavras, queremos examinar seus branches sem ter que suas alterações invadam nosso diretório de trabalho. Então ao invés de pull, execute:
+
+ $ git fetch # Fetch from origin, the default.
+ $ git fetch other # Fetch from the second programmer.
+
+Isso faz com que somente busque os históricos. Embora o diretório de trabalho continue intocado, podemos fazer referencia a qualquer branch de qualquer repositório em um comando Git pois agora possuímos uma copia local.
+
+Lembre-se de nos bastidores, um pull é simplesmente um *fetch* e um *merge*. Geralmente fazemos um *pull* pois queremos fazer um merge do ultimo commit após o fetch; essa situação é uma exceção notável.
+
+Veja *git help remote* para saber como remover repositórios remotos, ignorar certos branches e outras informações.
+
+=== Minhas preferencias ===
+
+Para meus projetos, eu gosto que contribuidores para preparar os repositórios a partir dos quais eu possa fazer um pull. Alguns serviços hospedeiros de Git permite que você hospede seu próprio fork de um projeto com o clique de um botão.
+
+Após ter buscado (fetch) uma árvore, eu executo comandos Git para navegar e examinar as alterações, que idealmente estão bem organizadas e bem descritas. Faço merge de minhas próprias alterações, e talvez faça edições posteriores. Uma vez satisfeito, eu faço um push para o repositório principal.
+
+Embora eu receba infrequentes contribuições, eu acredito que essa abordagem funciona bem. Veja http://torvalds-family.blogspot.com/2009/06/happiness-is-warm-scm.html[esse post do blog do Linus Torvalds].
+
+Continuar no mundo Git é mais conveniente do que fazer patch de arquivos, já que ele me salva de convertê-los para commits Git. Além disso, o Git trata dos detalhes tais como registrar o nome do autor e seu endereço de e-mail, bem como o dia e hora, alem de pedir ao autor para descrever sua própria alteração.
diff --git a/pt_br/preface.txt b/pt_br/preface.txt
new file mode 100644
index 00000000..45204de1
--- /dev/null
+++ b/pt_br/preface.txt
@@ -0,0 +1,59 @@
+= Magia Git =
+Ben Lynn
+Agosto 2007
+
+== Prefácio ==
+
+http://git-scm.com/[Git] é um canivete suíço do controle de versões. Uma ferramenta polivalente realmente versátil, cuja extraordinária flexibilidade torna-o complicado de aprender, principalmente sozinho.
+
+Como Arthur C. Clarke observou, "Qualquer tecnologia suficientemente avançada é considerada mágica”. Esta é uma ótima forma de abordar o Git: novatos podem ignorar seu funcionamento interno e vê-lo como algo divertido que pode agradar aos amigos e enfurecer os inimigos com suas maravilhosas habilidades.
+
+Ao invés de entrar em detalhes, forneceremos apenas instruções para casos específicos. Após o uso repetido, você gradualmente entenderá como cada truque funciona, e como adaptar as receitas às suas necessidades.
+
+.Traduções
+
+ - link:/\~blynn/gitmagic/intl/zh_cn/[Simplified Chinese]: by JunJie, Meng and JiangWei. Converted to link:/~blynn/gitmagic/intl/zh_tw/[Traditional Chinese] via +cconv -f UTF8-CN -t UTF8-TW+.
+ - link:/~blynn/gitmagic/intl/fr/[French]: by Alexandre Garel, Paul Gaborit, and Nicolas Deram.
+ - link:/~blynn/gitmagic/intl/de/[German]: by Benjamin Bellee and Armin Stebich; also http://gitmagic.lordofbikes.de/[hosted on Armin's website].
+ - link:/~blynn/gitmagic/intl/pt-BR/[Portuguese-Brazilian]: by J.I.Serafini and Leonardo Siqueira Rodrigues.
+ - link:/~blynn/gitmagic/intl/ru/[Russian]: by Tikhon Tarnavsky, Mikhail Dymskov, and others.
+ - link:/~blynn/gitmagic/intl/es/[Spanish]: by Rodrigo Toledo and Ariset Llerena Tapia.
+ - link:/~blynn/gitmagic/intl/uk/[Ukrainian]: by Volodymyr Bodenchuk.
+ - link:/~blynn/gitmagic/intl/vi/[Vietnamese]: by Trần Ngọc Quân; also http://vnwildman.users.sourceforge.net/gitmagic/[hosted on his website].
+
+.Outras Edições
+
+ - link:book.html[Single webpage]: barebones HTML, with no CSS.
+ - link:book.pdf[PDF file]: printer-friendly.
+ - http://packages.debian.org/gitmagic[Debian package], http://packages.ubuntu.com/gitmagic[Ubuntu package]: get a fast and local copy of this site. Handy http://csdcf.stanford.edu/status/[when this server is offline].
+ - http://www.amazon.com/Git-Magic-Ben-Lynn/dp/1451523343/[Physical book [Amazon.com]]: 64 pages, 15.24cm x 22.86cm, black and white. Handy when there is no electricity.
+
+=== Agradecimentos! ===
+
+É com grande orgulho que vejo o grande número de pessoas que trabalho na tradução deste livro. Eu realmente agradeço pela grande audiência permitida pelos esforços dos tradutores citados a seguir.
+
+Dustin Sallings, Alberto Bertogli, James Cameron, Douglas Livingstone, Michael Budde, Richard Albury, Tarmigan, Derek Mahar, Frode Aannevik, Keith Rarick, Andy Somerville, Ralf Recker, Øyvind A. Holm, Miklos Vajna, Sébastien Hinderer, Thomas Miedema, Joe Malin, Tyler Breisacher, Sonia Hamilton, Julian Haagsma, Romain Lespinasse, Sergey Litvinov, Oliver Ferrigni, David Toca, Сергей Сергеев, Joël Thieffry, e Baiju Muthukadan contribuiram com correções e melhorias.
+
+François Marier mantém o pacote Debian criado originalmente por Daniel Baumann.
+
+
+My gratitude goes to many others for your support and praise. I'm tempted to
+quote you here, but it might raise expectations to ridiculous heights.
+
+If I've left you out by mistake, please tell me or just send me a patch!
+
+=== Licença ===
+
+Este guia é regido pelos termos da http://www.gnu.org/licenses/gpl-3.0.html[a Licença Publica Geral GNU Versão 3]. Naturalmente, os fontes estão num repositório Git, e podem ser obtido digitando:
+
+ $ git clone git://repo.or.cz/gitmagic.git # Cria um diretório "gitmagic".
+
+ou a partir de algum desses mirrors:
+
+ $ git clone git://github.com/blynn/gitmagic.git
+ $ git clone git://gitorious.org/gitmagic/mainline.git
+ $ git clone https://code.google.com/p/gitmagic/
+ $ git clone git://git.assembla.com/gitmagic.git
+ $ git clone git@bitbucket.org:blynn/gitmagic.git
+
+GitHub, Assembla, e Bitbucket suportam repositórios privados, os dois últimos são grátis.
diff --git a/pt_br/secrets.txt b/pt_br/secrets.txt
new file mode 100644
index 00000000..2f2e8f2f
--- /dev/null
+++ b/pt_br/secrets.txt
@@ -0,0 +1,155 @@
+== Segredos Revelados ==
+
+Vamos dar uma espiada sob o capô e explicar como o Git realiza seus milagres. Será uma explicação superficial. Para detalhes mais aprofundados consultar o http://schacon.github.com/git/user-manual.html[manual do usuário].
+
+=== Invisibilidade ===
+
+Como pode o Git ser tão discreto? Fora ocasionais commit e merge, você pode trabalhar como se desconhecesse que existe um controle de versões. Isto é, até que precise dele, e é quando você ficará agradecido ao Git por estar vigiando o que faz o tempo todo.
+
+Outros sistemas de controle de versões não deixam você esquecê-los. As permissões dos arquivos são apenas de leitura, a menos que você diga ao servidor quais arquivos tem a intenção de editar. Os comandos mais básicos podem demorar muito quando o número de usuários aumenta. O trabalho pode ser interrompido quando a rede ou o servidor central para.
+
+Ao contrário, o Git guarda o histórico do seu projeto no diretório `.git` no diretório de trabalho. Essa é a sua cópia do histórico, de modo que você pode ficar offline até que deseje se comunicar com os outros. Você tem total controle sobre o destino de seus arquivos, pois o Git pode facilmente recriar um estado salvo a partir do `.git` a qualquer hora.
+
+=== Integridade ===
+
+A maioria das pessoas associam criptografia com manter informações secretas, mas outra aplicação igualmente importante é manter a integridade da informação. O uso correto das funções criptográficas de hash pode prevenir o corrupção acidental ou intencional dos dados.
+
+Um hash SHA1 pode ser entendido como um número identificador único de 160 bits para cada sequência de bytes que você vai encontrar na vida. Na verdade mais que isso: para cada sequência de bytes que qualquer ser humano jamais usará durante várias vidas.
+
+Como um hash SHA1 é, ele mesmo, uma sequência de bytes, podemos gerar um hash de sequências de bytes formada por outros hash. Essa observação simples é surpreendentemente útil: a procura por 'cadeias hash' ('hash chains'). Vamos ver mais adiante como o Git a utiliza para garantir com eficiência a integridade de dados.
+
+A grosso modo, o Git mantém os seus arquivos no subdiretório `.git/objects`, onde ao invés de ter arquivos com nomes “normais”, vamos encontrar somente identificadores (Ids). Utilizando os Ids como nomes de arquivos, bem como uns poucos lockfiles e alguns truques com o timestamp, o Git transforma qualquer sistema de arquivos simples em um poderoso banco de dados.
+
+=== Inteligência ===
+
+Como o Git sabe que um arquivo foi renomeado, mesmo que você nunca tenha mencionado o fato explicitamente? Com certeza, você executou *git mv*, mas isto é exatamente o mesmo que um *git rm* seguido por um *git add*.
+
+A análise heurística do Git verifica além das ações de renomear e de cópias sucessivas entre versões. De fato, ele pode detectar até pedaços de código sendo movidos ou copiados entre arquivos! Embora não cubra todos os casos, faz um trabalho decente, e esta característica está sendo sempre aprimorada. Caso não funcione com você, tente habilitar opções mais refinadas para detecção de cópias e considere uma atualização.
+
+=== Indexando ===
+
+Para cada arquivo monitorado, o Git armazena informações como: tamanho, hora de criação e última modificação, em um arquivo conhecido como 'index'. Para determinar se um arquivo foi modificado, o Git compara seus status atual com o que tem no index. Se coincidem, então ele pode ignorar o arquivo.
+
+Já que verificações de status são imensamente mais baratas que ler o conteúdo do arquivo, se você editar poucos arquivos, o Git vai atualizar seus status quase que instantaneamente.
+
+Falamos anteriormente que o index é uma área de atuação (staging). Por que um monte de status de arquivos é uma area de atuação (staging)? É porque o comando add coloca os arquivos no banco de dados do Git e atualiza esse status, enquanto o comando commit, sem opções, cria um commit baseado somente no status e arquivos já existentes no banco de dados.
+
+=== Origem do Git ===
+
+Esta http://lkml.org/lkml/2005/4/6/121[mensagem na lista de discussão do Linux Kernel] descreve a sequência de eventos que levaram ao Git. A discussão inteira é um sitio arqueológico fascinante para historiadores do Git.
+
+=== O Banco de Dados de Objetos ===
+
+Cada versão de seus dados é mantida em um 'bando de dados de objetos', que reside no subdiretório `.git/objects`: os outros residentes de `.git/` armazenam menos dados: o index, nomes dos branchs, etiquetas (tags), configurações de opções, logs, a localização do commit HEAD, e outros. O bando de dados objeto é elementar e elegante, e a origem do poder do Git.
+
+Cada arquivo dentro de `.git/objects` é um 'objeto'. Existem 3 tipos de objetos que nos interessam: objetos 'blob', objetos 'árvores' ('tree'), e objetos 'commit'.
+
+=== Blobs ===
+
+Primeiro, um truque mágico. Peque um nome de arquivo, qualquer arquivo. Em um diretório vazio, execute
+
+ $ echo sweet > YOUR_FILENAME
+ $ git init
+ $ git add .
+ $ find .git/objects -type f
+
+Voce verá +.git/objects/aa/823728ea7d592acc69b36875a482cdf3fd5c8d+.
+
+Como eu posso saber disso, sem saber o nome do arquivo? É por que o hash SHA1 de:
+
+ "blob" SP "6" NUL "sweet" LF
+
+é aa823728ea7d592acc69b36875a482cdf3fd5c8d,
+onde SP é espaço, NUL é o byte zero e LF é um linefeed. Você pode verificar isso, digitando:
+
+ $ printf "blob 6\000sweet\n" | sha1sum
+
+O Git é 'endereçável-por-conteúdo': os arquivos não são armazenados de acordo com seus nomes de arquivos, e sim pelo hash de seus dados, em um arquivo que chamamos de 'objeto blob' ('blob object'). Podemos pensar que o hash é um identificador único para o conteúdo do arquivo, de modo que estamos endereçando os arquivos pelo seu conteúdo. O `blob 6` inicial é meramente um header que consiste do tipo do objeto e seu tamanho em bytes; isso simplifica a organização interna.
+
+Assim eu poderia prever o que você irá ver. O nome do arquivo é irrelevante: somente os dados internos são utilizados para construir o objeto blob.
+
+Você pode estar se perguntando o que acontece com os arquivos idênticos. Tente adicionar cópias de seu arquivo, com qualquer nome de arquivo. O conteúdo do +.git/objects+ continua o mesmo não importa quantos você adiciona. O Git somente armazena o dado uma única vez.
+
+A propósito, os arquivos dentro de +.git/objects+ são comprimidos com a zlib de modo que você não consegue examiná-los diretamente. Faça uma filtragem por meio do http://www.zlib.net/zpipe.c[zpipe -d], ou digite:
+
+ $ git cat-file -p aa823728ea7d592acc69b36875a482cdf3fd5c8d
+
+que mostra o objeto em um formato legível.
+
+=== Árvores ===
+
+Mas onde estão os nomes de arquivos? Eles precisam ser armazenados em algum lugar. Git fica sabendo o nome do arquivo durante um commit:
+
+ $ git commit # Type some message.
+ $ find .git/objects -type f
+
+Você pode ver agora 3 objetos. Dessa vez eu não consigo dizer quais os dois nomes de arquivos, já que eles dependem parcialmente do nome do arquivo que você escolheu. Vamos prosseguir assumindo que você escolheu ``rose''. Se não escolheu esse nome, você pode reescrever o histórico para ficar parecido com o que você fez:
+
+ $ git filter-branch --tree-filter 'mv YOUR_FILENAME rose'
+ $ find .git/objects -type f
+
+Agora você poderá ver o arquivo
++.git/objects/05/b217bb859794d08bb9e4f7f04cbda4b207fbe9+, porque esse é o hash SHA 1 de seu conteudo:
+
+ "tree" SP "32" NUL "100644 rose" NUL 0xaa823728ea7d592acc69b36875a482cdf3fd5c8d
+
+Verifique que este arquivo contém efetivamente o que falamos acima, digitando:
+
+ $ echo 05b217bb859794d08bb9e4f7f04cbda4b207fbe9 | git cat-file --batch
+
+Com o zpipe, é fácil verificar o hash:
+
+ $ zpipe -d < .git/objects/05/b217bb859794d08bb9e4f7f04cbda4b207fbe9 | sha1sum
+
+A verificação do hash é mais complicada via cat-file porque sua saida contem mais do que os dados descomprimidos do arquivo object.
+
+Esse arquivo é um objeto 'árvore' ('tree'): uma lista de tuplas que consiste em um tipo de arquivo, um nome de arquivo e um hash. Em nosso exemplo, este tipo de arquivo é 100644, que significa que `rose` é um arquivo normal, e o hash é o objeto blob que contém o termo `rose'. Outros tipos possíveis de arquivos são executáveis, symlinks e diretorios. No ultimo exemplo, o hash aponta para um objeto árvore.
+
+Se você executar o filter-branch, você obterá objetos antigos que não precisa mais. Embora sejam eliminados automaticamente quando o período de armazenamento expirar, iremos deletá-los agora para tornar o nosso exemplo mais fácil de seguir:
+
+ $ rm -r .git/refs/original
+ $ git reflog expire --expire=now --all
+ $ git prune
+
+Para projetos reais você deve tipicamente evitar comandos como esses, já que eles destroem os backups. Se você deseja um repositório limpo, é geralmente melhor criar um novo clone. Também, tome cuidado quando manipular diretamente o +.git+: e se um comando Git esta executando ao mesmo tempo, ou uma falha na alimentação eletrica ocorre? Geralmente, as referências podem ser deletadas com *git update-ref -d*, embora seja mais seguro remover manualmente o +refs/original+.
+
+=== Commits ===
+
+Explicamos 2 dos 3 objetos. O terceiro é o objeto 'commit'. Seu conteúdo depende da mensagem de commit bem como da data e hora em que foi criado. Para combinar com o que temos aqui, vamos ter que fazer um pequeno truque:
+
+ $ git commit --amend -m Shakespeare # Change the commit message.
+ $ git filter-branch --env-filter 'export
+ GIT_AUTHOR_DATE="Fri 13 Feb 2009 15:31:30 -0800"
+ GIT_AUTHOR_NAME="Alice"
+ GIT_AUTHOR_EMAIL="alice@example.com"
+ GIT_COMMITTER_DATE="Fri, 13 Feb 2009 15:31:30 -0800"
+ GIT_COMMITTER_NAME="Bob"
+ GIT_COMMITTER_EMAIL="bob@example.com"' # Rig timestamps and authors.
+ $ find .git/objects -type f
+
+Agora você pode ver
++.git/objects/49/993fe130c4b3bf24857a15d7969c396b7bc187+
+que é o hash SHA 1 de seu conteúdo:
+
+ "commit 158" NUL
+ "tree 05b217bb859794d08bb9e4f7f04cbda4b207fbe9" LF
+ "author Alice 1234567890 -0800" LF
+ "committer Bob 1234567890 -0800" LF
+ LF
+ "Shakespeare" LF
+
+Como anteriormente, você pode executar o zpipe ou cat-file para ver você mesmo.
+
+Esse é o primeiro commit, de modo que não existe nenhum commit pai, mas commit posteriores irão sempre conter no mínimo uma linha identificando o seu commit pai.
+
+=== Indistinguível da Magia ===
+
+O segredo do Git parece ser tão simples. Parece que você pode misturar um pouco de script shell e adicionar uma pitada de código C para cozinha-lo em questão de horas: uma mistura de operações básicas do sistema de arquivos e hash SHA 1, guarnecido com arquivos lock e fsyncs para robustez. De fato, isso descreve acuradamente as primeiras versões do Git. No entanto, além de truques engenhosos de empacotamento para economizar espaço, e truques engenhosos de indexação para economizar espaço, agora sabemos como o Git habilmente transforma um sistema de arquivos em um banco de dados perfeito para o controle de versões.
+
+Por exemplo, se algum arquivo dentro do banco de dados de objetos é corrompido por um erro de disco, então o seu hash não irá corresponder mais, alertando-nos sobre o problema. Fazendo hash de hash de outros objetos, mantemos a integridade em todos os níveis. Os commits são atomicos, isto é, um commit nunca pode armazenar parcialmente as mudanças: só podemos calcular o hash de um commit e armazenar ele no banco de dados após ter armazenado todas as árvores relevantes, blobs e os commits pais. O banco de dados de objetos é imune a interrupções inesperadas tais como falha de alimentação eletrica.
+
+Nós derrotamos até mesmo os adversários mais tortuosos. Suponha que alguem tente de maneira escondida, modificar o conteudo de um arquivo em uma versão antiga do projeto. Para manter o banco de dados dos objetos com uma aparência saudável, ele deve também alterar o hash do objeto blob correspondente, já que ele contem agora uma cadeia de bytes diferente. Isso significa que ele terá que alterar o hash de qualquer objeto árvore que referencia o arquivo, e em seguida alterar o hash de todos os objetos commit que estão envolvidos com esses objetos árvores, além dos hash de todos os descendentes desses commits. Isso significa que o hash do Head oficial será diferente do hash do repositório alterado. Seguindo a trilha dos hash não correspondentes podemos apontar o arquivo alterado, bem como o commit onde ele foi corrompido.
+
+Resumindo, graças aos 20 bytes que representam o ultimo commit seguro, é impossível adulterar um repositório Git.
+
+É sobre as famosas características do Git? Branching, Merging? Tags? Meros detalhes. O cabeçalho atual é mantido em um arquivo +.git/HEAD+, que contém um hash de um objeto commit. O hash é atualizado durante um commit bem como com muitos outros comandos. Branch são quase a mesma coisa: eles são arquivos em +.git/refs/heads+. Tags também: elas estão em +.git/refs/tags+ mas são atualizadas por um conjunto diferente de comandos.
diff --git a/pt_br/translate.txt b/pt_br/translate.txt
new file mode 100644
index 00000000..ec282219
--- /dev/null
+++ b/pt_br/translate.txt
@@ -0,0 +1,24 @@
+== Apendice B: Traduzindo esse guia ==
+
+Recomendo os seguintes passos para a tradução desse guia, de modo que meus scripts produzam a versão HTML e PDF, e que todas as traduções possam conviver em um mesmo repositório.
+
+Faça um clone do fonte, e então crie um diretório correspondente a tag IETF da idioma alvo: veja
+http://www.w3.org/International/articles/language-tags/Overview.en.php[o artigo da W3C sobre internacionalização]. Por exemplo, Ingles (English) é "en" e Japonês é "ja". No novo diretório, traduza os arquivos .txt a partir do subdiretorio "en".
+
+Por exemplo, para traduzir este guia para a língua http://en.wikipedia.org/wiki/Klingon_language[Klingon], você deve digitar:
+
+ $ git clone git://repo.or.cz/gitmagic.git
+ $ cd gitmagic
+ $ mkdir tlh # "tlh" is the IETF language code for Klingon.
+ $ cd tlh
+ $ cp ../en/intro.txt .
+ $ edit intro.txt # Translate the file.
+
+e assim por diante, para cada arquivo .txt
+
+Edite o Makefile e adicione o código do idioma na variável `TRANSLATIONS`. Você poderá então rever seu trabalho de forma incremental:
+
+ $ make tlh
+ $ firefox book-tlh/index.html
+
+Faça frequentes commits de suas alterações, e me avise quando o trabalho estiver pronto. O GitHub tem uma interface que facilita isso: faça um fork do projeto "gitmagic", faça um push de suas alterações, e então me peça para fazer um merge.
diff --git a/ru/drawbacks.txt b/ru/drawbacks.txt
index c0e95c85..914f2ca4 100644
--- a/ru/drawbacks.txt
+++ b/ru/drawbacks.txt
@@ -14,7 +14,7 @@ Git на Microsoft Windows может быть громоздким:
- http://cygwin.com/[Cygwin], Linux-подобная среда для Windows, содержащая http://cygwin.com/packages/git/[порт Git на Windows].
-- http://code.google.com/p/msysgit/[Git на MSys], вариант, требующий минимальной рантайм поддержки, хотя некоторые комманды нуждаются в доработке.
+- https://gitforwindows.org/[Git для Windows], вариант, требующий минимальной рантайм поддержки, хотя некоторые комманды нуждаются в доработке.
=== Несвязанные файлы ===
diff --git a/ru/preface.txt b/ru/preface.txt
index 3feae48c..b34f865d 100644
--- a/ru/preface.txt
+++ b/ru/preface.txt
@@ -20,12 +20,12 @@ http://git.or.cz/[Git] это швейцарский нож управления
.Переводы
- - http://docs.google.com/View?id=dfwthj68_675gz3bw8kj[ Китайский (упрощенный)]: JunJie, Meng и JiangWei.
+ - link:/~blynn/gitmagic/intl/zh_cn/[Китайский (упрощенный)]: JunJie, Meng и JiangWei.
- link:/~blynn/gitmagic/intl/es/[Испанский]: Rodrigo Toledo.
- link:/~blynn/gitmagic/intl/de/[Немецкий]: Benjamin Bellee и Armin Stebich. Armin также разместил http://gitmagic.lordofbikes.de/[немецкий перевод на его сайте].
- link:/~blynn/gitmagic/intl/ru/[Русский]: Тихон Тарнавский, Михаил Дымсков и другие.
- link:/~blynn/gitmagic/intl/uk/[Украинский]: Владимир Боденчук.
- - link:/~blynn/gitmagic/intl/fr/[Французский]: Alexandre Garel. Также размещён на http://tutoriels.itaapy.com/[itaapy].
+ - link:/~blynn/gitmagic/intl/fr/[Французский]: Alexandre Garel.
- http://www.slideshare.net/slide_user/magia-git[Португальский]: Leonardo Siqueira Rodrigues [http://www.slideshare.net/slide_user/magia-git-verso-odt[в формате ODT]].
.Другие варианты
diff --git a/uk/drawbacks.txt b/uk/drawbacks.txt
index 0930986d..5ea6a38c 100644
--- a/uk/drawbacks.txt
+++ b/uk/drawbacks.txt
@@ -14,7 +14,7 @@ Git на Microsoft Windows може бути громіздким:
- http://cygwin.com/[Cygwin], Linux-подібне середовище для Windows, яке містить http://cygwin.com/packages/git/[порт Git на Windows].
-- http://code.google.com/p/msysgit/[Git на MSys], варіант, що вимагає мінімальної рантайм підтримки, хоча деякі команди потребують доопрацювання.
+- https://gitforwindows.org/[Git для Windows], варіант, що вимагає мінімальної рантайм підтримки, хоча деякі команди потребують доопрацювання.
=== Незв'язані файли ===
diff --git a/uk/preface.txt b/uk/preface.txt
index 8617080f..489f2f48 100644
--- a/uk/preface.txt
+++ b/uk/preface.txt
@@ -14,12 +14,12 @@ http://git.or.cz/[Git] — це швейцарський ніж керуванн
- link:/~blynn/gitmagic/intl/vi/[В'єтнамська]: Trần Ngọc Quân; також http://vnwildman.users.sourceforge.net/gitmagic/[розміщено на його вебсайті].
- link:/~blynn/gitmagic/intl/es/[Іспанська]: Rodrigo Toledo та Ariset Llerena Tapia.
- - http://docs.google.com/View?id=dfwthj68_675gz3bw8kj[Китайська (спрощена)]: JunJie, Meng та JiangWei. Конвертовано у link:/~blynn/gitmagic/intl/zh_tw/[Традиційна китайська] via +cconv -f UTF8-CN -t UTF8-TW+.
+ - link:/\~blynn/gitmagic/intl/zh_cn/[Китайська (спрощена)]: JunJie, Meng та JiangWei. Конвертовано у link:/~blynn/gitmagic/intl/zh_tw/[Традиційна китайська] via +cconv -f UTF8-CN -t UTF8-TW+.
- link:/~blynn/gitmagic/intl/de/[Німецька]: Benjamin Bellee і Armin Stebich. Armin також розмістив http://gitmagic.lordofbikes.de/[німецький переклад на своєму сайті].
- http://www.slideshare.net/slide_user/magia-git[Португальська]: Leonardo Siqueira Rodrigues [http://www.slideshare.net/slide_user/magia-git-verso-odt[в форматі ODT]].
- link:/~blynn/gitmagic/intl/ru/[Російська]: Тихон Тарнавский, Михаил Дымсков і інші.
- link:/~blynn/gitmagic/intl/uk/[Українська]: Володимир Боденчук.
- - link:/~blynn/gitmagic/intl/fr/[Французька]: Alexandre Garel, Paul Gaborit, та Nicolas Deram. Також розміщений на http://tutoriels.itaapy.com/[itaapy].
+ - link:/~blynn/gitmagic/intl/fr/[Французька]: Alexandre Garel, Paul Gaborit, та Nicolas Deram.
.Інші варіанти
@@ -36,7 +36,6 @@ Dustin Sallings, Alberto Bertogli, James Cameron, Douglas Livingstone, Michael B
François Marier супроводжує пакунок Debian, спочатку створений Daniel Baumann.
-John Hinnegan купив http://www.gitmagic.com/[gitmagic.com] домен.
Мої подяки іншим за вашу підтримку і похвалу. Мені дуже хотілося процитувати вас тут, але це могло б підняти ваше марнославство до неймовірних висот.
diff --git a/vi/basic.txt b/vi/basic.txt
index 3e51b395..e8bad39d 100644
--- a/vi/basic.txt
+++ b/vi/basic.txt
@@ -2,7 +2,7 @@
Thay vì lao vào cả một biển lệnh với Git, bạn hãy sử dụng các ví dụ cơ bản để bắt đầu.
Mặc dù chúng rất đơn giản, nhưng tất cả chúng đều rất hữu dụng.
-Quả thực là vậy, trong tháng đầu tiên sử dụng Git tôi chưa bao giờ vượt qua những gì nói trong chương này.
+Quả thực là vậy, trong tháng đầu tiên sử dụng Git, tôi chưa bao giờ vượt quá những gì nói trong chương này.
=== Ghi lại Trạng thái ===
@@ -13,28 +13,28 @@ trong thư mục hiện hành chứa các mã nguồn hay văn bản mà bạn m
$ git add .
$ git commit -m "Bản sao lưu đầu tiên"
-Bây giờ nếu như các sửa đổi vừa xong của bạn không như mong đợi, hãy phục hồi lại bản cũ:
+Bây giờ nếu như các sửa đổi của bạn vừa làm không được như mong đợi, hãy phục hồi lại bản cũ:
- $ git reset --hard # Đặt lại trạng thái và dữ liệu như lần commit cuối
+ $ git reset --hard # Đặt lại trạng thái và dữ liệu như lần chuyển giao cuối
-Sau đó sửa nội dung cho đúng ý bạn rồi ghi lại thành một trạng thái mới:
+Sau đó sửa nội dung cho đúng ý mình rồi ghi lại thành một trạng thái mới:
$ git commit -a -m "Bản sao lưu khác"
=== Thêm, Xóa, Đổi Tên ===
-Lệnh ở trên chỉ giữ dấu vết các tệp tin hiện diện tại thời điểm bạn chạy lệnh *git add*. Nếu bạn thêm các tệp tin hay thư mục, thì bạn sẽ phải thông báo với Git:
+Lệnh ở trên chỉ giữ dấu vết các tập tin hiện diện tại thời điểm bạn chạy lệnh *git add*. Nếu bạn thêm các tập tin hay thư mục, thì bạn sẽ phải thông báo với Git:
$ git add readme.txt Documentation
-Tương tự như vậy, nếu bạn muốn Git bỏ đi các tệp tin nào đó:
+Tương tự như vậy, nếu bạn muốn Git bỏ đi các tập tin nào đó:
$ git rm kludge.h obsolete.c
$ git rm -r incriminating/evidence/ #gỡ bỏ một cách đệ qui
-Git xóa bỏ những tệp tin nếu như bạn chưa làm.
+Git xóa bỏ những tập tin nếu như bạn chưa làm.
-Đổi tên tệp tin thì cũng giống như là việc bạn gỡ bỏ tên cũ và đặt vào nó cái tên mới. Sử dụng lệnh *git mv* có cú pháp rất giống lệnh *mv* của hệ thống Linux. Ví dụ:
+Đổi tên tập tin thì cũng giống như là việc bạn gỡ bỏ tên cũ và đặt vào nó cái tên mới. Lệnh *git mv* có cú pháp rất giống lệnh *mv* của hệ thống Linux. Ví dụ:
$ git mv bug.c feature.c
@@ -44,7 +44,7 @@ Git xóa bỏ những tệp tin nếu như bạn chưa làm.
$ git log
-sẽ hiển thị cho bạn danh sách các lần commit gần đây cùng với giá trị băm SHA1:
+sẽ hiển thị cho bạn danh sách các lần chuyển giao gần đây cùng với giá trị băm SHA1:
----------------------------------
commit 766f9881690d240ba334153047649b8b8f11c664
@@ -60,73 +60,73 @@ Date: Thu Jan 1 00:00:00 1970 +0000
Initial commit.
----------------------------------
-Chỉ vài ký tự của giá trị băm là đủ để chỉ ra một commit cụ thể;
+Chỉ vài ký tự của giá trị băm là đủ để chỉ ra một chuyển giao cụ thể;
một cách khác là chép và dán giá trị băm. Gõ:
$ git reset --hard 766f
-để phục hồi lại trạng thái đã được chỉ ra và xóa bỏ tất cả các lần commit mới hơn kể từ đó.
+để phục hồi lại trạng thái đã được chỉ ra và xóa bỏ tất cả các lần chuyển giao mới hơn kể từ đó.
Một lúc nào đó bạn lại muốn nhảy tới một bản cũ hơn. Trong trường hợp này thì gõ:
$ git checkout 82f5
-Nó giúp bạn quay lại đúng thời điểm đó, trong khi vẫn giữ lại những lần commit mới hơn. Tuy nhiên, giống như cỗ máy thời gian trong các bộ phim khoa học viễn tưởng, nếu bây giờ bạn sửa sau đó commit, bạn sẽ ở trong một thực tại khác, bởi vì hành động của bạn bây giờ đã khác với khi chúng ta lần đầu tiên ở tại đây.
+Nó giúp bạn quay lại đúng thời điểm đó, trong khi vẫn giữ lại những lần chuyển giao mới hơn. Tuy nhiên, giống như cỗ máy thời gian trong các bộ phim khoa học viễn tưởng, nếu bây giờ bạn sửa sau đó chuyển giao, bạn sẽ ở trong một thực tại khác, bởi vì hành động của bạn bây giờ đã khác với khi chúng ta lần đầu tiên ở tại đây.
Có cách thực tế hơn là sử dụng 'branch', và <>. Bây giờ, chỉ cần nhớ là:
$ git checkout master
sẽ mang chúng ta trở về hiện tại. Ngoài ra, để tránh rủi ro khi sử dụng Git, thì luôn luôn
-commit hay reset các thay đổi của bạn trước khi chạy lệnh checkout.
+chuyển giao hay reset các thay đổi của bạn trước khi chạy lệnh checkout.
-Sự tương đồng với game trên máy tính:
+Sự tương đồng với *ván đấu* trên máy tính:
-- *`git reset --hard`*: lấy cái cũ đã được lưu lại và xóa tất cả các games mới hơn cái vừa lấy.
+- *`git reset --hard`*: lấy cái cũ đã được lưu lại và xóa tất cả các *ván đấu* mới hơn cái vừa lấy.
-- *`git checkout`*: lấy một cái cũ, nhưng chỉ chơi với nó, trạng thái của game sẽ tách riêng về phía mới hơn chỗ mà bạn đã ghi lại lần đầu tiên. Bất kỳ game nào bạn tạo từ bây giờ sẽ là bản cuối cùng trong nhánh riêng rẽ tương ứng với một thực tại khác mà bạn đã gia nhập vào. <>.
+- *`git checkout`*: lấy một cái cũ, nhưng chỉ chơi với nó, trạng thái của *ván đấu* sẽ tách riêng về phía mới hơn chỗ mà bạn đã ghi lại lần đầu tiên. Bất kỳ *ván đấu* nào bạn tạo từ bây giờ sẽ là bản cuối cùng trong nhánh riêng rẽ tương ứng với một thực tại khác mà bạn đã gia nhập vào. <>.
-Bạn có thể chọn chỉ phục hồi lại các tệp tin hay thư mục bạn muốn bằng cách thêm vào chúng vào phần sau của câu lệnh:
+Bạn có thể chọn chỉ phục hồi lại các tập tin hay thư mục bạn muốn bằng cách thêm vào chúng vào phần sau của câu lệnh:
$ git checkout 82f5 some.file another.file
-Bạn phải cẩn thận khi sử dụng các lệnh, như là lệnh *checkout* có thể âm thầm ghi đè lên các tệp tin. Để
-ngăn ngừa rủi ro như thế, hãy commit trước khi chạy lệnh checkout, nhất là khi
+Bạn phải cẩn thận khi sử dụng các lệnh, như là lệnh *checkout* có thể âm thầm ghi đè lên các tập tin. Để
+ngăn ngừa rủi ro như thế, hãy chuyển giao trước khi chạy lệnh checkout, nhất là khi
mới học sử dụng Git. Tóm lại, bất kỳ khi nào bạn không chắc chắn về một lệnh nào đó, dù có là lệnh của Git hay không, đầu tiên hãy chạy lệnh *git commit -a*.
Bạn không thích việc cắt dán ư? Hãy sử dụng:
$ git checkout :/"My first b"
-để nhảy tới lần commit mà phần chú thích của nó bắt đầu với chuỗi bạn đã cho.
+để nhảy tới lần chuyển giao mà phần chú thích của nó bắt đầu với chuỗi bạn đã cho.
Bạn cũng có thể yêu cầu trạng thái thứ 5 kể từ cái cuối cùng:
$ git checkout master~5
=== Sự quay lại ===
-Trong một phiên tòa, mỗi sự kiện được gắn với một bản ghi. Cũng giống thế, bạn có thể chọn lệnh commit để undo.
+Trong một phiên tòa, mỗi sự kiện được gắn với một bản ghi. Cũng giống thế, bạn có thể chọn lệnh chuyển giao để undo.
$ git commit -a
$ git revert 1b6d
-sẽ chỉ undo lần commit với giá trị băm đã chỉ ra. Sự quay trở lại được ghi nhận như là một lần
-commit mới, bạn có thể xác nhận lại điều này bằng lệnh *git log*.
+sẽ chỉ undo lần chuyển giao với giá trị băm đã chỉ ra. Sự quay trở lại được ghi nhận như là một lần
+chuyển giao mới, bạn có thể xác nhận lại điều này bằng lệnh *git log*.
=== Tạo Nhật Ký các thay đổi ===
-Một số dự án yêu cầu có một http://en.wikipedia.org/wiki/Changelog[changelog].
-Tạo một cái bằng cách gõ:
+Một số dự án yêu cầu phải có một http://en.wikipedia.org/wiki/Changelog[changelog].
+Bạn có thể tạo một cái bằng cách gõ:
- $ git log > ThayĐổi
+ $ git log > Changelog # ThayĐổi
-=== Tải về các Tệp tin ===
+=== Tải về các tập tin ===
Lấy về một bản sao của một dự án quản lý bằng Git bằng cách gõ:
$ git clone git://server/path/to/files
-Ví dụ, để lấy tất cả các tệp tin mà tôi đã dùng để tạo ra cho quyển sách này là:
+Ví dụ, để lấy tất cả các tập tin mà tôi đã dùng để tạo ra cho quyển sách này là:
$ git clone git://git.or.cz/gitmagic.git
@@ -150,11 +150,11 @@ Thực hiện điều này với Git, trong thư mục làm việc của Git:
Sau đó nói với những người cùng sử dụng hãy chạy:
- $ git clone your.computer:/path/to/script
+ $ git clone máy.tính.của.bạn:/đường/dẫn/tới/script
để tải dữ liệu về. Giả định là họ truy cập thông qua ssh. Nếu không, chạy *git daemon* và nói với người sử dụng là chạy lệnh sau để thay thế:
- $ git clone git://your.computer/path/to/script
+ $ git clone git://máy.tính.của.bạn:/đường/dẫn/tới/script
Kể từ lúc này, bất cứ khi nào mã nguồn của bạn đã có thể sử dụng được, chỉ việc thực hiện:
@@ -168,7 +168,7 @@ Những người sử dụng sẽ không bao giờ thấy được dữ liệu c
=== Tôi Đã Làm Được Gì? ===
-Tìm tất cả các thay đổi kề từ lần bạn commit lần cuối bằng lệnh:
+Tìm tất cả các thay đổi kề từ lần bạn chuyển giao lần cuối bằng lệnh:
$ git diff
@@ -189,15 +189,15 @@ Thường thường, tôi duyệt lịch sử bằng http://sourceforge.net/proj
=== Bài Tập ===
-Coi A, B, C, D là 4 lần commit thành công, nơi mà B giống A ngoại trừ một số tệp tin bị xóa bỏ. Chúng ta muốn thêm các tệp tin đó trở lại D. Chúng ta thực hiện điều này bằng cách nào?
+Giả sử A, B, C, D là 4 lần chuyển giao thành công, với B giống A ngoại trừ một số tập tin bị xóa bỏ. Chúng ta muốn thêm các tập tin đó trở lại D. Chúng ta thực hiện điều này bằng cách nào?
Ở đây chúng ta có ít nhất 3 giải pháp. Giả thiết chúng ta đang ở D:
- 1. Sự khác nhau giữa A và B là việc các tệp tin đã bị gỡ bỏ. Chúng ta có thể tạo miếng vá tương ứng với sự khác biệt này và apply nó:
+ 1. Sự khác nhau giữa A và B là việc các tập tin đã bị gỡ bỏ. Chúng ta có thể tạo miếng vá tương ứng với sự khác biệt này và áp dụng miếng vá đó:
$ git diff B A | git apply
- 2. Kể từ sau khi chúng ta ghi lại các tệp tin tại A trở đi, chúng ta có thể lấy lại:
+ 2. Kể từ sau khi chúng ta ghi lại các tập tin tại A trở đi, chúng ta có thể lấy lại:
$ git checkout A foo.c bar.h
@@ -206,3 +206,4 @@ Coi A, B, C, D là 4 lần commit thành công, nơi mà B giống A ngoại tr
$ git revert B
Lựa chọn nào là tốt nhất? Cách nào bạn thích nhất. Thật dễ dàng để có được thứ mà bạn muốn với Git, và thường là có nhiều hơn một cách để thực hiện được một thứ bạn muốn.
+
diff --git a/vi/branch.txt b/vi/branch.txt
index c1853e86..6b2b7a6c 100644
--- a/vi/branch.txt
+++ b/vi/branch.txt
@@ -2,21 +2,21 @@
Tạo Nhánh và Trộn là các đặc tính sát thủ của Git.
-*Vấn đề đặt ra*: Những nhân tố bên ngoài chắc hẳn có đòi hỏi việc hoán chuyển văb cảnh. Một lỗi tồi tệ
+*Vấn đề đặt ra*: Những nhân tố bên ngoài chắc hẳn đòi hỏi cần hoán chuyển văn cảnh. Một lỗi tồi tệ
xuất hiện trong phiên bản đã được phát hành mà không được cảnh báo gì. Điều tồi tệ nhất có thể xảy ra
-là phải xóa bỏ hẳn đặc tính kỹ thuật đó. Người phát triển phần mềm, người mà đã giúp bạn viết nó, cần biết lý do về việc bãi bỏ. Trong tất cả các trường hợp, bạn buộc phải xóa bỏ cái mà bạn đang làm và làm một cái hoàn toàn mới.
+là phải xóa bỏ hẳn đặc tính kỹ thuật đó. Người phát triển phần mềm, người mà đã giúp bạn viết nó, cần biết lý do về việc bãi bỏ. Trong tất cả các trường hợp trên, bạn buộc phải xóa bỏ cái mà bạn đang làm và làm một cái hoàn toàn mới.
-Việc gán đoạn suy nghĩ có thể làm giảm hiệu suất làm việc của bạn, và việc hoán chuyển nội dung càng cồng kềnh vướng víu càng gây hậu quả nặng nề. Đối với các hệ thống quản lý mã nguồn tập trung chúng ta phải tải về một bản sao công việc mới từ máy chủ trung tâm. Các hệ thống phân tán hoạt động hiệu quả hơn, như là chúng ta có thể nhân bản một cách cục bộ.
+Việc gán đoạn suy nghĩ có thể làm giảm hiệu suất làm việc, và việc hoán chuyển nội dung càng cồng kềnh, vướng víu càng gây hậu quả nặng nề. Đối với các hệ thống quản lý mã nguồn tập trung chúng ta phải tải về một bản sao các tập tin mới từ máy chủ trung tâm. Các hệ thống phân tán hoạt động hiệu quả hơn, như là chúng ta có thể nhân bản một cách cục bộ.
-Nhưng việc nhân bản bắt buộc phải sao chép toàn bộ thư mục làm việc cũng như là toàn bộ các mục trong lịch sử cho đến thời điểm đã được chỉ ra. Dù là Git giảm bớt sự lãng phí cho việc này bằng cách chia sẻ và tạo ra các liên kết tệp tin cứng, chính bản thân các tệp tin dự án cũng phải được tạo ra trong các đề mục của chúng trong thư mục làm việc.
+Nhưng việc nhân bản bắt buộc phải sao chép toàn bộ thư mục làm việc cũng như là toàn bộ các mục trong lịch sử cho đến thời điểm đã được chỉ ra. Dù là Git giảm bớt sự lãng phí cho việc này bằng cách chia sẻ và tạo ra các liên kết tập tin cứng, chính bản thân các tập tin dự án cũng phải được tạo ra trong các đề mục của chúng trong thư mục làm việc.
*Giải pháp*: Git có một công cụ tốt hơn để sử lý tình huống này, nó nhanh và tiết kiệm không gian lưu trữ hơn lệnh nhân bản đó chính là: *git branch*.
-Với vài câu thần chú, các tệp tin trong thư mục của bạn dễ dàng biến đổi từ phiên bản này sang phiên bản khác. Sự chuyển đổi này có thể làm nhiều hơn việc di chuyển trong trong lịch sử một các đơn thuần. Các tệp tin của bạn có thể chuyển hình thái từ bản phát hành cuối thành phiên bản thử nghiệm, thành phiên bản phát triển hiện hành, thành phiên bản của người bạn của bạn, và cứ như thế.
+Với vài câu thần chú, các tập tin trong thư mục của bạn dễ dàng biến đổi từ phiên bản này sang phiên bản khác. Sự chuyển đổi này có thể làm nhiều hơn việc di chuyển trong trong lịch sử một các đơn thuần. Các tập tin của bạn có thể chuyển hình thái từ bản phát hành cuối thành phiên bản thử nghiệm, thành phiên bản phát triển hiện nay, thành phiên bản của người bạn của bạn, và cứ như thế.
=== Nút Điều Khiển ===
-Mỗi khi chơi trò chơi, bạn bấm vào nút (``nút điều khiển''), màn hình có lẽ hiển thị ngay ra một cái bảng hay một thứ gì đó? Thế thì nhỡ ông chủ của bạn đang đi lại trong văn phòng nơi bạn đang chơi trò chơi thì làm cách nào để nhanh chóng giấu chúng đi?
+Mỗi khi chơi điện tử, bạn bấm vào nút (``nút điều khiển''), màn hình có lẽ hiển thị ngay ra một cái bảng hay một thứ gì đó? Thế thì nhỡ ông chủ của bạn đang đi lại trong văn phòng nơi bạn đang chơi điện tử thì làm cách nào để nhanh chóng giấu chúng đi?
Ở thư mục nào đó:
@@ -25,26 +25,26 @@ Mỗi khi chơi trò chơi, bạn bấm vào nút (``nút điều khiển''), m
$ git add .
$ git commit -m "Lần commit đầu tiên"
-Chúng ta đã tạo ra kho chứa Git mà nó theo dõi một tệp tin văn bản có chứa một thông điệp đã biết trước. Giờ hãy gõ:
+Chúng ta đã tạo ra kho chứa Git mà nó theo dõi một tập tin văn bản có chứa một thông điệp đã biết trước. Giờ hãy gõ:
$ git checkout -b boss # dường như chẳng có gì thay đổi sau lệnh này
$ echo "Xếp thông minh hơn tôi" > myfile.txt
- $ git commit -a -m "Lần commit khác"
+ $ git commit -a -m "Lần chuyển giao khác"
-Điều này cũng giống như việc chúng ta ghi đè lên tệp tin của mình sau đó commit nó. Nhưng không, đó chỉ là ảo tưởng. Gõ:
+Điều này cũng giống như việc chúng ta ghi đè lên tập tin của mình sau đó commit nó. Nhưng không, đó chỉ là ảo tưởng. Gõ:
- $ git checkout master # quay trở lại phiên bản nguyên gốc của tệp tin
+ $ git checkout master # quay trở lại phiên bản nguyên gốc của tập tin
-Ối trời ơi! Tệp tin văn bản lại trở về như cũ mất rồi. Và nếu ông chủ có ý định ngó qua thư mục của bạn thì hãy gõ:
+Ối trời ơi! Tập tin văn bản lại trở về như cũ mất rồi. Và nếu ông chủ có ý định ngó qua thư mục của bạn thì hãy gõ:
- $ git checkout boss # chuyển trở lại phiên bạn vừa mắt ông chủ
+ $ git checkout boss # chuyển trở lại phiên bản vừa mắt ông chủ
-Bạn có thể hoán chuyển giữa hai phiên bản của tệp tin tùy thích, và commit từng cái trong số chúng một cách độc lập.
+Bạn có thể hoán chuyển giữa hai phiên bản của tập tin tùy thích, và commit từng cái trong số chúng một cách độc lập.
=== Bản Nháp ===
[[branch]]
-Bạn nói mình đang làm việc với một số đặc tính kỹ thuật, và vì lý do nào đó, bạn muốn quay trở lại bản cách đây ba bản và tạm thời đặt vài dòng lệnh
+Bạn nói rằng mình đang làm việc với một số đặc tính kỹ thuật, và vì lý do nào đó, bạn muốn quay trở lại bản cách đây ba bản và tạm thời đặt thêm vài dòng lệnh
in ra màn hình để có thể thấy được một số hàm hoạt động như thế nào. Thế thì:
$ git commit -a
@@ -56,7 +56,7 @@ Giờ thì bạn có thể thêm những dòng mã lệnh tạm thời ở đâu
để quay lại công việc chính. Chú ý là bất kỳ các thay đổi không được commit sẽ đổ xuống sông xuống biển.
-Nhưng bạn lại muốn ghi lại các thay đổi tạm thời đó sau khi làm xong? Rất dễ:
+Nhưng bạn lại muốn ghi lại các thay đổi tạm thời đó sau khi đã làm xong? Rất dễ:
$ git checkout -b dirty
@@ -64,23 +64,23 @@ và commit trước khi quay trở lại nhánh master. Khi nào đó bạn mu
$ git checkout dirty
-Chúng ta đã đụng chạm đến lệnh như trên ở những chương trước rồi, khi thảo luận về việc tải về một trạng thái cũ. Cuối cùng chúng ta có thể thuật lại toàn bộ câu chuyện: các tệp tin đã thay đổi theo trạng thái đã được yêu cầu, nhưng chúng ta phải rời bỏ nhánh master. Tất cả những lần commit được tạo ra từ đây sẽ dẫn bạn đi trên một nhánh khác, nhánh này có thể được đặt tên sau.
+Chúng ta đã đụng chạm đến lệnh như trên ở những chương trước rồi, khi thảo luận về việc tải về một trạng thái cũ. Cuối cùng chúng ta có thể thuật lại toàn bộ câu chuyện: các tập tin đã thay đổi theo trạng thái đã được yêu cầu, nhưng chúng ta phải rời bỏ nhánh master. Tất cả những lần commit được tạo ra từ đây sẽ dẫn bạn đi trên một nhánh khác, nhánh này có thể được đặt tên sau.
Mặt khác, sau khi 'check out' một trạng thái cũ, Git tự động đặt bạn vào một trạng thái mới, một nhánh chưa có tên, và nhánh này có thể đặt tên và ghi lại với lệnh *git checkout -b*.
=== Sửa Nhanh ===
-Bạn đang phân vân giữa ngã ba đường khi bạn phải xác định là xóa tất cả mọi thứ hoặc là sửa chữa các lỗi mới phát hiện ra trong lần commit `1b6d...`:
+Bạn đang phân vân giữa ngã ba đường khi bạn phải quyết định là xóa tất cả mọi thứ hoặc là sửa chữa các lỗi mới phát hiện ra trong lần commit `1b6d...`:
$ git commit -a
- $ git checkout -b fixes 1b6d
+ $ git checkout -b fixes 1b6d # checkout và đặt tên là nhánh fixes
-Một khi bạn đã sửa lỗi:
+Sau khi hoàn tất việc sửa chữa:
$ git commit -a -m "Đã sửa"
$ git checkout master
-và quay lại công việc theo phận sự của mình. Bạn thậm chí có thể trộn với lần commit đã sửa để
+và sau đó quay lại công việc theo phận sự của mình. Bạn thậm chí có thể trộn với lần commit đã sửa để
sửa lỗi:
$ git merge fixes
@@ -91,11 +91,11 @@ Với một số hệ thống quản lý mã nguồn, việc tạo các nhánh r
trở lại là một bài toán hóc búa. Với Git, việc trộn là dễ dàng và bạn có thể
không hay biết nó hoạt động như thế nào.
-Chúng ta đã sử dụng việc trộn từ lâu rồi. Lệnh *pull* trên thực tế đã 'fetch'
+Chúng ta đã sử dụng việc trộn từ lâu rồi. Lệnh *pull* trên thực tế đã 'fetch' (lấy về)
các lần commit và sau đó trộn chúng vào trong nhánh hiện hành của bạn. Nếu trên máy của mình bạn không có
-thay đổi gì cả, thế thì việc trộn sẽ là một 'fast forward', trường hợp này cũng na ná như việc lấy về
+thay đổi gì cả, thế thì việc trộn sẽ là một 'fast forward' (chuyển tiếp nhanh), trường hợp này cũng na ná như việc lấy về
phiên bản cuối cùng trong hệ thống quản lý mã nguồn tập trung. Nhưng nếu bạn đã có thay đổi
-trên máy của mình, Git sẽ tự động trộn, và báo cáo cho bạn nếu có xung đột xảy ra.
+trên máy của mình, Git sẽ tự động trộn, và báo lỗi cho bạn nếu có xung đột xảy ra.
Thông thường, mỗi lần commit có một 'commit cha', tạm gọi thế, chính là lần
commit trước. Việc trộn các nhánh với nhau phát sinh ra một lần commit với ít nhất hai 'cha'.
@@ -104,7 +104,7 @@ có thể có nhiều cha, thế thì chúng ta phải theo cái nào?
Nó sẽ gọi ra 'cha' đầu tiên. Đây là
điều ta mong muốn bởi vì nhánh hiện hành trở thành cha đầu tiên trong suốt quá trình trộn;
-một cách thường xuyên, bạn chỉ liên quan đến những thay đổi mình tạo ra trong nhánh
+thường, bạn chỉ liên quan đến những thay đổi mình tạo ra trong nhánh
hiện hành, cốt để mà đối lập với việc trộn thay đổi từ các nhánh khác.
Bạn hãy nhớ Git quy một cha nào đó với một dấu mũ. Ví dụ, để hiển thị
@@ -182,8 +182,8 @@ Có lẽ bạn thích làm việc trên mọi khía cạnh của một dự án
Tiếp theo, làm việc gì đó: sửa lỗi, thêm các đặc tính kỹ thuật, thêm mã lệnh tạm thời, vân vân, commit thường xuyên. Sau đó:
- $ git checkout sanitized
- $ git cherry-pick medley^^
+ $ git checkout sanitized # tạm dịch: đã được vệ sinh
+ $ git cherry-pick medley^^ # tạm dịch: hỗn độn; ^^: ông bà
áp dụng nhánh ông-bà của lần commit head của nhánh ``medley'' thành nhánh ``sanitized''. Với lệnh thích hợp là cherry-picks bạn có thể cấu trúc một nhánh mà nó chỉ chứa mã nguồn không thay đổi, và những lần commit có liên quan sẽ được nhóm lại với nhau.
@@ -200,7 +200,7 @@ Các tùy chọn *-d* and *-m* cho phép bạn xóa hay di chuyển (đổi tên
Xem thêm *git help branch*.
Nhánh ``master'' thông thường rất hữu dụng. Những người khác sẽ nghĩ rằng
-kho chứa của bạn có nhánh với tên này, và nhánh đó chứa phiên bản chính thức
+kho chứa của bạn có nhánh mang tên này, và nhánh đó chứa phiên bản chính thức
của dự án của bạn. Mặc dù bạn có thể đổi tên hay xóa bỏ nhánh ``master'',
nhưng bạn không nên làm như thế mà hãy tôn trọng thỏa thuận ngầm này.
@@ -209,16 +209,16 @@ nhưng bạn không nên làm như thế mà hãy tôn trọng thỏa thuận ng
Một lát sau bạn có lẽ nhận thức được rằng mình cần có các nhánh tạm thời
vì các lý do như: mọi nhánh khác đơn thuần phục vụ cho
việc ghi lại trạng thái hiện tại do vậy bạn có thể nhảy trở lại các trạng thái cũ hơn để mà
-sửa chữa các lỗi nghiêm trọng hay thứ gì đó.
+sửa chữa các lỗi nghiêm trọng hay làm một cái gì đó.
Điều này cũng tương tự như việc chuyển kênh trên TV một cách tạm thời để thấy chương trình khác đang chiếu cái gì.
-Nhưng thay vì chỉ cần nhấn vài cái nút, bạn phải tạo, check out,
+Nhưng thay vì chỉ cần nhấn vài cái nút, bạn phải tạo, ``checkout'',
trộn và xóa nhánh tạm đó. May mắn thay, Git có cách ngắn gọn tiện lợi
chẳng thua kém gì chiếc điều khiển từ xa của một chiếc TV:
$ git stash
-Lệnh này ghi lại trạng thái hiện hành vào một vị trí tạm thời (một 'stash') và
+Lệnh này ghi lại trạng thái hiện hành vào một vị trí tạm thời (một *stash*) và
phục hồi lại trạng thái trước đó. Thư mục bạn đang làm việc xuất hiện chính xác
như trước khi bạn chỉnh sửa, và bạn có thể sửa lỗi, pull về các thay đổi ngược dòng, và
cứ như thế. Khi bạn muốn qua trở lại trạng thái đã được tạm giấu đi đó, hãy gõ:
@@ -230,7 +230,7 @@ Bạn có thể có nhiều trạng thái được tạm giấu đi, và vận d
=== Làm Theo Cách Của Mình ===
-Bạn có thể sẽ cảm thấy việc sử dụng nhánh phiền hà quá. Cuối cùng, clones có lẽ là
+Bạn có thể sẽ cảm thấy việc sử dụng nhánh phiền hà quá. Cuối cùng, *clone* có lẽ là
lệnh nhanh nhất, và bạn có thể hoán chuyển giữa chúng với lệnh *cd* thay vì sử dụng
lệnh riêng của Git.
@@ -238,8 +238,9 @@ Ta thử xét đến các trình duyệt web. Tại sao việc hỗ trợ mở n
Bởi vì cả hai điều này thể hiện tính đa dạng của quan điểm, phong cách sống. Một số người sử dụng lại thích
chỉ giữ một cửa sổ trình duyệt được mở, và sử dụng các tab để hiển thị nhiều trang web một lúc. Những người khác
có lẽ lại khăng khăng cực đoan cho rằng: mở trên nhiều cửa sổ khác nhau và chẳng cần tab nữa.
-Một nhóm khác lại thích cả hai một lúc.
+Một nhóm khác lại thích cả hai cách trên.
Việc tạo nhánh thì cũng giống như tạo các tab cho thư mục làm việc của bạn, còn việc nhân bản thì lại giống như việc mở một cửa sổ duyệt mới. Những việc này nhanh chóng và nội bộ, thế thì sao lại không
-thử nghiệm để tìm thấy cách thực hiện thích hợp nhất cho mình? Git giúp bạn làm việc chính xác
+thử nghiệm để tìm thấy cách nào thích hợp nhất cho mình? Git giúp bạn làm việc chính xác
như bạn muốn.
+
diff --git a/vi/clone.txt b/vi/clone.txt
index 60b7bfa0..185d5bfb 100644
--- a/vi/clone.txt
+++ b/vi/clone.txt
@@ -1,40 +1,40 @@
== Nhân Bản ==
-Trong các hệ thống quản lý mã nguồn trước đây, checkout là tác vụ cơ bản để lấy các tệp tin về. Bạn lấy về toàn bộ các tập tin được lưu giữ trong từng phiên bản riêng biệt.
+Trong các hệ thống quản lý mã nguồn trước đây, checkout là tác vụ cơ bản để lấy các tập tin về. Bạn lấy về toàn bộ các tập tin được lưu giữ trong từng phiên bản riêng biệt.
-Với Git và các hệ thống quản lý mã nguồn phân tán, clone là tác vụ cơ bản. Để lấy các tệp tin, bạn tạo một của toàn bộ kho chứa. Nói cách khác, bạn thực tế là một bản sao của máy chủ trung tâm. Bất kỳ cái gì bạn thể làm được với kho chứa chính thì cũng làm được ở đây.
+Với Git và các hệ thống quản lý mã nguồn phân tán, clone là tác vụ cơ bản. Để lấy các tập tin, bạn lấy về toàn bộ kho chứa. Nói cách khác, bạn thực tế là một bản sao của máy chủ trung tâm. Bất kỳ cái gì bạn thể làm được với kho chứa chính thì cũng làm được ở đây.
=== Đồng bộ hóa Các Máy tính ===
-Tôi có thể tạo gói tarball hay sử dụng lệnh *rsync* để sao lưu dự phòng và đồng bộ hóa dữ liệu. Nhưng thỉnh thoảng, tôi biên tập trên máy tính xách tay của mình, nhưng lúc khác lại trên máy tính để bàn, và chúng có thể không có sự trao đổi được với nhau.
+Tôi có thể tạo gói *tarball* hay sử dụng lệnh *rsync* để sao lưu dự phòng và đồng bộ hóa dữ liệu. Nhưng thỉnh thoảng, tôi biên tập trên máy tính xách tay của mình, nhưng lúc khác lại trên máy tính để bàn, và chúng có thể không có sự trao đổi được với nhau.
-Khởi tạo kho chứa Git và commit các tệp tin trên một máy tính. Sau đó trên máy tính kia chạy lệnh:
+Khởi tạo kho chứa Git và commit các tập tin trên một máy tính. Sau đó trên máy tính kia chạy lệnh:
$ git clone other.computer:/path/to/files
-để tạo một bản sao thứ hai cho các tệp tin và kho chứa. Từ giờ trở đi,
+để tạo một bản sao thứ hai cho các tập tin và kho chứa. Từ giờ trở đi,
$ git commit -a
$ git pull other.computer:/path/to/files HEAD
-sẽ lấy về một trạng thái của các tệp tin trên máy tính khác về máy bạn đang làm việc. Nếu bạn vừa tạo ra một sự chỉnh sửa xung đột trong cùng một tệp tin , Git sẽ cho bạn biết và bạn có thể commit lại sau khi đã sửa chữa chúng.
+sẽ lấy về một trạng thái của các tập tin trên máy tính khác về máy bạn đang làm việc. Nếu bạn vừa tạo ra một sự chỉnh sửa xung đột trong cùng một tập tin, Git sẽ cho bạn biết và bạn có thể chuyển giao sau khi đã sửa chữa chúng.
=== Quản lý theo cách Cũ ===
-Khởi tạo kho Git cho các tệp tin của bạn:
+Khởi tạo kho Git cho các tập tin của bạn:
$ git init
$ git add .
$ git commit -m "Lần commit khởi tạo"
-Trên máy chủ trung tâm, khởi tạo 'kho bare' ở một thư mục nào đó:
+Trên máy chủ trung tâm, khởi tạo kho 'thuần' ở một thư mục nào đó:
$ mkdir proj.git
$ cd proj.git
$ git --bare init
$ touch proj.git/git-daemon-export-ok
-Khởi động dịch vụ Git daemon nếu cần:
+Khởi động dịch vụ Git nếu cần:
$ git daemon --detach # nó có thể đã hoạt động rồi
@@ -57,7 +57,7 @@ Sau khi thay đổi, các nhà phát triển phần mềm sẽ lưu lại các t
$ git pull
-Mọi xung đột phải được xử lý trước, sau đó mới commit:
+Mọi xung đột phải được xử lý trước, sau đó mới chuyển giao:
$ git commit -a
@@ -69,7 +69,7 @@ Nếu máy chủ trung tâm có thay đổi bởi hành động của một ngư
push sẽ bị lỗi, và anh ta phải pull về bản mới nhất, xử lý các xung đột khi trộn, sau đó thử lại.
Người dùng phải có quyền truy cập SSH mới có thể thực hiện được lệnh pull và push ở trên.
-Tuy nhiên, ai cũng có thể lấy mã nguồn về bằng lệnh::
+Tuy nhiên, ai cũng có thể lấy mã nguồn về bằng lệnh:
$ git clone git://central.server/path/to/proj.git
@@ -87,11 +87,11 @@ việc truyền thông bây giờ đều thông qua SSH.
=== Kho thuần ===
-Kho thuần (bare) được đặt tên như vậy vì nó không chứa thư mục làm việc; nó chỉ chứa các tệp tin thường là ẩn trong thư mục phụ `.git`. Hay nói cách khác, nó chứa lịch sử mã nguồn của một dự án, và không bao giờ giữ dữ liệu còn đang dang dở của bất kỳ phiên bản nào.
+Kho thuần (bare) được đặt tên như vậy vì nó không chứa thư mục làm việc; nó 'thuần túy' chứa các tập tin thường là ẩn trong thư mục con `.git`. Hay nói cách khác, nó chứa lịch sử mã nguồn của một dự án, và không bao giờ giữ các tập tin bất kỳ phiên bản nào.
Kho thuần có vai trò hoạt động giống như máy chủ trung tâm trong các hệ thống
quản lý mã nguồn tập trung: thư mục chủ dự án của bạn. Các nhà phát triển phần mềm nhân bản
-dữ liệu dự án của bạn ở đây, và push các thay đổi chính thức lên đó. Thông thường nó
+dữ liệu dự án của bạn ở đây, và 'push' các thay đổi chính thức lên đó. Thông thường nó
đặt tại máy chủ mà máy này đôi khi còn làm một số việc khác nữa. Sự biên soạn mã nguồn
xảy ra trên bản sao, vì vậy thư mục chủ của kho chứa có thể hoạt động mà không cần
thư mục làm việc.
@@ -100,17 +100,17 @@ Nhiều lệnh Git gặp lỗi trên kho thuần trừ phi biến môi trường
=== Push ngược với pull ===
-Tại sao chúng tôi lại giới thiệu lệnh push, thay vì trông cậy vào lệnh pull
+Tại sao chúng tôi lại giới thiệu lệnh 'push', thay vì trông cậy vào lệnh 'pull'
quen thuộc? Trước hết, việc pull gặp lỗi trên kho thuần: thay vào đó bạn phải dùng lệnh 'fetch',
lệnh này chúng ta sẽ nói sau. Nhưng dù là chúng ta giữ kho chứa thông thường trên
-máy chủ trung tâm, việc pull lên nó hơi cồng kềnh. Chúng ta phải
-đăng nhập vào máy chủ trước, và cung cấp cho lệnh pull địa chỉ mạng
-của máy chúng ta đang pull từ đó. Chương trình tường lửa có thể gây trở ngại, và điều gì xảy ra khi chúng ta không
-có khả năng truy cập shell máy chủ trong chỗ đầu tiên đó?
+máy chủ trung tâm, việc 'pull' lên nó hơi cồng kềnh. Chúng ta phải
+đăng nhập vào máy chủ trước, và cung cấp cho lệnh 'pull' địa chỉ mạng
+của máy chúng ta đang 'pull' từ đó. Chương trình tường lửa có thể gây trở ngại, và điều gì xảy ra khi chúng ta không
+có khả năng truy cập 'hệ vỏ' máy chủ trong chỗ đầu tiên đó?
Tuy nhiên, ngoài trường hợp này ra, chúng ta còn nản lòng với việc push lên kho chứa, bởi vì tình trạng hỗn loạn có thể xảy khi thư mục đích có chứa thư mục làm việc.
-Tóm lại, khi bạn học Git, chỉ push khi đích là kho thuần; nếu không thì dùng pull.
+Tóm lại, khi bạn học Git, chỉ 'push' khi đích là kho thuần; nếu không thì dùng 'pull'.
=== Rẽ nhánh một dự án ===
@@ -155,7 +155,7 @@ Bạn đang làm việc cho một dự án có sử dụng hệ thống quản l
$ git add .
$ git commit -m "Lần commit khởi tạo"
-sau đó clone nó:
+sau đó nhân bản nó:
$ git clone . /some/new/directory
@@ -169,7 +169,7 @@ Sau đó chuyển tới thư mục mới và chạy:
$ git commit -a -m "Mô tả về các thay đổi của mình"
$ git pull
-Thủ tục đem lại các thay đổi của bạn tới những người khác nữa trên hệ thống quản lý mã nguồn khác. Thư mục mới có chứa các tệp tin mà bạn thay đổi. Chạy các lệnh mà hệ thống quản lý mã nguồn khác cần để tải chúng lên kho chứa trung tâm.
+Thủ tục đem lại các thay đổi của bạn tới những người khác nữa trên hệ thống quản lý mã nguồn khác. Thư mục mới có chứa các tập tin mà bạn thay đổi. Chạy các lệnh mà hệ thống quản lý mã nguồn khác cần để tải chúng lên kho chứa trung tâm.
Subversion, có lẽ là hệ thống quản lý mã nguồn tập trung tốt nhất, được sử dụng bởi vô số các dự án. Lệnh *git svn* sẽ tự động hóa những việc đã nói ở trên dành cho Subversion, bạn cũng có thể làm như thế để http://google-opensource.blogspot.com/2008/05/export-git-project-to-google-code.html[xuất dự án Git thành Subversion].
@@ -207,12 +207,13 @@ Bazaar có lợi thế vì phát triển sau, có tuổi tương đối trẻ; n
Plugin `bzr-git` giúp người dùng Bazaar làm việc với kho Git trong chừng mực nào đó. Chương trình chuyển đổi Bazaar thành Git, và có thể làm hơn thế nữa, trong khi `bzr-fast-export` thích hợp nhất cho việc chuyển đổi một lần duy nhất.
-=== Tại sao Tôi sử dụng Git ===
+=== Tại sao Tôi dùng Git? ===
-Trước tiên, tôi chọn Git bởi tôi nghe nói nó làm được việc phi thường là có thể quản lý mã nguồn cho một thứ khó quản lý như hạt nhân của hệ điều hành Linux. Tôi chưa bao giờ nghĩ đến việc chuyển sang cái khác. Git làm được những việc thật đáng ngưỡng mộ, và tôi chưa từng bao giờ gặp các vấn đề với sai sót của nó. Do tôi hoạt động chủ yếu trên Linux, phát hành trên các nền tảng khác không phải là điều mà tôi quan tâm.
+Trước tiên, tôi chọn Git bởi tôi nghe nói nó làm được việc phi thường là có thể quản lý mã nguồn cho một thứ khó quản lý như hạt nhân của hệ điều hành *Linux*. Tôi chưa bao giờ nghĩ đến việc chuyển sang dùng một phần mềm quản lý mã nguồn khác. Git làm được những việc thật đáng ngưỡng mộ, và tôi chưa từng bao giờ gặp các vấn đề với sai sót của nó. Do tôi hoạt động chủ yếu trên Linux, phát hành trên các nền tảng khác không phải là điều mà tôi quan tâm.
-Ngoài ra, tôi thích lập trình bằng ngôn ngữ C và bash scripts để thực thi như là Python script: ở đây có rất ít sự phụ thuộc, và tôi đam mê với những hệ thống thi hành nhanh chóng.
+Ngoài ra, tôi thích lập trình bằng ngôn ngữ C và bash scripts để thực thi như là ngôn ngữ kịch bản Python: ở đây có rất ít sự phụ thuộc, và tôi đam mê với những hệ thống thi hành nhanh chóng.
Tôi đã nghĩ về việc làm thế nào để Git có thể phát triển, xa hơn nữa là tự mình viết một công cụ tương tự như Git, nhưng đây không phải là bài tập có tính thực tế. Khi tôi hoàn thành dự án của mình, dù sao đi nữa tôi vẫn sẽ dùng Git, với lợi thế là có thể chuyển đổi từ hệ thống cũ sang một cách nhanh chóng.
-Theo lẽ tự nhiên, những thứ cần thiết cho bạn và những thứ bạn mong muốn có lẽ khác nhau, và bạn có thể tốt hơn nếu ở một hệ thống khác. Dù sao đi nữa, bạn sẽ không bao giờ phải hối tiếc vì đã chọn Git.
+Theo lẽ tự nhiên, những thứ cần thiết cho bạn và những thứ bạn mong muốn có lẽ khác nhau, và bạn có thể tốt hơn nếu mình làm việc với hệ thống khác. Dù sao đi nữa, bạn sẽ không bao giờ phải hối tiếc vì đã chọn Git.
+
diff --git a/vi/drawbacks.txt b/vi/drawbacks.txt
index bfa26877..d9908bdb 100644
--- a/vi/drawbacks.txt
+++ b/vi/drawbacks.txt
@@ -17,29 +17,29 @@ Sử dụng Git trên hệ điều hành Microsoft Windows có vẻ hơi cồng
- http://cygwin.com/[Cygwin], mô phỏng Linux dành cho Windows, có chứa http://cygwin.com/packages/git/[Git đã chuyển đổi để chạy trên Windows].
-- http://code.google.com/p/msysgit/[Git chạy trên MSys] là một thay thế với các hỗ trợ tối thiểu nhất, bởi vì chỉ cần một ít lệnh để thực hiện một số việc mà thôi.
+- https://gitforwindows.org/[Git cho Windows] là một thay thế với các hỗ trợ tối thiểu nhất, bởi vì chỉ cần một ít lệnh để thực hiện một số việc mà thôi.
-=== Các Tệp tin Không liên quan ===
+=== Các Tập tin Không liên quan ===
-Nếu dự án của bạn rất lớn và chứa rất nhiều tệp tin không có liên quan mà luôn luôn bị thay đổi, Git có thể chịu thiệt thòi hơn các hệ thống khác bởi vì các tệp tin không được giữ dấu viết từng cái riêng lẻ. Git giữ các dấu vết thay đổi cho toàn bộ dự án, điều này thường là có lợi.
+Nếu dự án của bạn rất lớn và chứa rất nhiều tập tin không có liên quan mà luôn luôn bị thay đổi, Git có thể chịu thiệt thòi hơn các hệ thống khác bởi vì các tập tin không được giữ dấu viết từng cái riêng lẻ. Git giữ các dấu vết thay đổi cho toàn bộ dự án, điều này thường là có lợi.
-Giải pháp là chia nhỏ dự án của bạn ra, mỗi một phần bao gồm các tệp tin liên quan đến nhau. Hãy sử dụng *git submodule* nếu bạn vẫn muốn giữ mọi thứ trong một kho chung.
+Giải pháp là chia nhỏ dự án của bạn ra, mỗi một phần bao gồm các tập tin liên quan đến nhau. Hãy sử dụng *git submodule* nếu bạn vẫn muốn giữ mọi thứ trong một kho chung.
=== Ai Sửa và Sửa gì? ===
-Một số hệ thống quản lý mã nguồn bắt buộc bạn đánh dấu rõ ràng vào tệp tin theo một cách nào đó trước khi biên soạn. Trong khi mà điều này đặc biệt phiền toái vì nó lại dính líu đến việc phải liên lạc với máy chủ trung tâm, việc làm này có hai lợi ích:
+Một số hệ thống quản lý mã nguồn bắt buộc bạn đánh dấu rõ ràng vào tập tin theo một cách nào đó trước khi biên soạn. Trong khi mà điều này đặc biệt phiền toái vì nó lại dính líu đến việc phải liên lạc với máy chủ trung tâm, việc làm này có hai lợi ích:
- 1. Thực hiện lệnh 'diff' diễn ra nhanh bởi vì nó chỉ kiểm tra các tệp tin đã đánh dấu.
+ 1. Thực hiện lệnh 'diff' diễn ra nhanh bởi vì nó chỉ kiểm tra các tập tin đã đánh dấu.
- 2. Một người có thể biết được khác đang làm việc trên một tệp tin bằng cách hỏi máy chủ trung tâm ai đã đánh dấu là đang sửa.
+ 2. Một người có thể biết được khác đang làm việc trên một tập tin bằng cách hỏi máy chủ trung tâm ai đã đánh dấu là đang sửa.
-Với một đoạn kịch bản thích hợp, bạn có thể lưu giữ theo cách này với. Điều này yêu cầu sự hợp tác từ người lập trình, người có thể chạy các kịch bản chuyên biệt khi biên soạn một tệp tin.
+Với một đoạn kịch bản thích hợp, bạn có thể lưu giữ theo cách này với. Điều này yêu cầu sự hợp tác từ người lập trình, người có thể chạy các kịch bản chuyên biệt khi biên soạn một tập tin.
-=== Lịch Sử Tệp Tin ===
+=== Lịch Sử Tập Tin ===
-Sau khi Git ghi lại các thay đổi cho các dự án lớn, việc cấu trúc lại lịch sử của một tệp tin đơn lẻ yêu cầu phải làm việc nhiều hơn các chương trình quản lý mã nguồn giữ dấu vết theo các tệp tin riêng lẻ.
+Sau khi Git ghi lại các thay đổi cho các dự án lớn, việc cấu trúc lại lịch sử của một tập tin đơn lẻ yêu cầu phải làm việc nhiều hơn các chương trình quản lý mã nguồn giữ dấu vết theo các tập tin riêng lẻ.
-Hình phạt thường là không đáng kể, và thứ đáng giá mà nó nhận được là các tác vụ khác hoạt động hiệu quả đến không ngờ. Ví dụ, `git checkout` nhanh hơn `cp -a`, và dữ liệu trong dự án lớn nén tốt hơn việc gom lại từ tệp tin cơ bản.
+Thiệt hại thường là không đáng kể, và thứ đáng giá mà nó nhận được là các tác vụ khác hoạt động hiệu quả đến không ngờ. Ví dụ, `git checkout` nhanh hơn `cp -a`, và dữ liệu trong dự án lớn nén tốt hơn việc gom lại từ tập tin cơ bản.
=== Khởi tạo Bản Sao ===
@@ -49,19 +49,19 @@ Cái giá phải trả ban đầu là cần nhiều thời gian để lấy về
=== Các Dự Án Hay Thay Đổi ===
-Git được viết ra với mục đích chú tâm đến kích thước tạo ra bởi các thay đổi. Con người chỉ tạo ra sự thay đổi rất nhỏ giữa các phiên bản. Như là bổ xung lời nhận xét là có sửa lỗi ở đây, có đặc tính mới ở đây, sửa lỗi chú thích, v.v.. Nhưng nếu các tệp tin của bạn căn bản khác nhau, thì trong mỗi lần commit, nó sẽ ghi lại toàn bộ các thay đổi vào lịch sử và làm cho dự án của bạn tất yếu sẽ tăng kích cỡ.
+Git được viết ra với mục đích chú tâm đến kích thước tạo ra bởi các thay đổi. Con người chỉ tạo ra sự thay đổi rất nhỏ giữa các phiên bản. Như là bổ xung lời nhận xét là có sửa lỗi ở đây, có đặc tính mới ở đây, sửa lỗi chú thích, v.v.. Nhưng nếu các tập tin của bạn căn bản khác nhau, thì trong mỗi lần commit, nó sẽ ghi lại toàn bộ các thay đổi vào lịch sử và làm cho dự án của bạn tất yếu sẽ tăng kích cỡ.
Không có bất kỳ một hệ thống quản lý mã nguồn nào có thể làm được điều này, nhưng những người sử dụng Git theo tiêu chuẩn sẽ còn phải chịu tổn thất hơn khi lịch sử của nó được nhân bản.
-Đây là lý do tại sao các thay đổi quá lớn cần được xem xét. Định dạng các tệp tin có thể bị thay đổi. Các thay đổi nhỏ chỉ xảy ra phần lớn tại một số ít tệp tin.
+Đây là lý do tại sao các thay đổi quá lớn cần được xem xét. Định dạng các tập tin có thể bị thay đổi. Các thay đổi nhỏ chỉ xảy ra phần lớn tại một số ít tập tin.
Việc xét đến việc sử dụng cơ sở dữ liệu hay các giải pháp sao-lưu/lưu-trữ có lẽ là thứ có vẻ thực tế hơn, không nên dùng hệ thống quản lý mã nguồn. Ví dụ, quản lý mã nguồn không thích hợp cho việc quản lý các ảnh được chụp một cách định kỳ từ webcam.
-Nếu các tệp tin thực sự thay đổi thường xuyên và chúng cần phải quản lý, việc xem xét khả năng sử dụng Git hoạt động như một hệ thống quản lý tập trung là có thể chấp nhận được. Một người có thể tải về một bản sao không đầy đủ, nó chỉ lấy về một ít hay không lấy về lịch sử của dự án. Dĩ nhiên, nhiều công cụ dành cho Git sẽ không thể hoạt động được, và sự sửa chữa phải được chuyển lên như là các miếng vá. Điều này chắc chắn là tốt và nó giống như là ta không thể hiểu nổi tại sao một số người lại muốn có được lịch sử của rất nhiều các tệp tin chẳng hoạt động ổn định.
+Nếu các tập tin thực sự thay đổi thường xuyên và chúng cần phải quản lý, việc xem xét khả năng sử dụng Git hoạt động như một hệ thống quản lý tập trung là có thể chấp nhận được. Một người có thể tải về một bản sao không đầy đủ, nó chỉ lấy về một ít hay không lấy về lịch sử của dự án. Dĩ nhiên, nhiều công cụ dành cho Git sẽ không thể hoạt động được, và sự sửa chữa phải được chuyển lên như là các miếng vá. Điều này chắc chắn là tốt và nó giống như là ta không thể hiểu nổi tại sao một số người lại muốn có được lịch sử của rất nhiều các tập tin chẳng hoạt động ổn định.
-Một ví dụ khác là dự án phụ thuộc vào firmware, cái này có dạng thức là tệp tin nhị phân có kích thước rất lớn. Người sử dụng không quan tâm tới lịch sử của firmware, vả lại khả năng nén của nó lại cũng rất ít, vì vậy quản lý firmware có lẽ là không cần thiết vì nó làm phình to kích thước kho chứa.
+Một ví dụ khác là dự án phụ thuộc vào firmware, cái này có dạng thức là tập tin nhị phân có kích thước rất lớn. Người sử dụng không quan tâm tới lịch sử của firmware, vả lại khả năng nén của nó lại cũng rất ít, vì vậy quản lý firmware có lẽ là không cần thiết vì nó làm phình to kích thước kho chứa.
-Trong trường hợp này, mã nguồn có thể lưu giữ trong kho Git, và tệp tin nhị phân được giữ ở nơi khác. Để cho công việc trở nên dễ dàng hơn, một người có thể tạo ra một đoạn kịch bản mà nó sử dụng Git để nhân bản mã nguồn, và dùng lệnh rsync hay Git lấy về firmware.
+Trong trường hợp này, mã nguồn có thể lưu giữ trong kho Git, và tập tin nhị phân được giữ ở nơi khác. Để cho công việc trở nên dễ dàng hơn, một người có thể tạo ra một đoạn kịch bản mà nó sử dụng Git để nhân bản mã nguồn, và dùng lệnh rsync hay Git lấy về firmware.
=== Bộ Đếm ===
@@ -89,8 +89,9 @@ Tất cả các bản commit đầu tiên hoàn toàn là con cháu của bản
Tuy nhiên, ở đây có một số vấn đề xảy ra trong một số trường hợp đặc biệt. Nếu nhiều nhánh với các lần khởi tạo commit khác nhau được trộn với nhau, sau đó rebase kết quả đòi hỏi thực chất có sự can thiệp bằng tay.
-=== Giao diện Lập lờ ===
+=== Giao diện chưa rõ ràng ===
Để commit A và B, nghĩa của biểu thức "A..B" và "A...B" tùy thuộc vào
việc lệnh mong đó là hai đầu mút hay là một vùng. Xem *git help diff*
và *git help rev-parse*.
+
diff --git a/vi/grandmaster.txt b/vi/grandmaster.txt
index c0dce57d..0aba7d6f 100644
--- a/vi/grandmaster.txt
+++ b/vi/grandmaster.txt
@@ -7,30 +7,30 @@ cách giải quyết các vấn đề thực tế đặt ra mà tôi đã từng
=== Phát hành Mã Nguồn ===
-Với dự án của tôi, Git giữ theo dõi chính xác các tệp tin tôi muốn lưu trữ và phát hành tới
+Với dự án của tôi, Git giữ theo dõi chính xác các tập tin tôi muốn lưu trữ và phát hành tới
người dùng. Để tạo gói tarball cho mã nguồn, tôi chạy:
$ git archive --format=tar --prefix=proj-1.2.3/ HEAD
=== Chỉ Commit Những Gì Thay Đổi ===
-Việc phải thông báo với Git khi bạn thêm, xóa hay đổi tên các tệp tin là việc rầy rà với
+Việc phải thông báo với Git khi bạn thêm, xóa hay đổi tên các tập tin là việc rầy rà với
các dự án nào đó. Thay vào đó, bạn có thể gõ:
$ git add .
$ git add -u
-Git sẽ xem tất cả các tệp tin trong thư mục hiện tại và làm công việc mà nó phải
+Git sẽ xem tất cả các tập tin trong thư mục hiện tại và làm công việc mà nó phải
làm. Thay vì chạy lệnh add thứ hai, hãy chạy `git commit -a` nếu bạn cũng có
ý định commit vào lúc này. Xem *git help ignore* để biết làm cách nào để chỉ ra
-các tệp tin bỏ qua.
+các tập tin bỏ qua.
Bạn có thể thi hành những điều trên chỉ cần một dòng lệnh:
$ git ls-files -d -m -o -z | xargs -0 git update-index --add --remove
-Tùy chọn *-z* và *-0* dùng để ngăn ngừa sai hỏng không mong muốn từ những tệp tin có chứa
-các ký tự đặc biệt. Bởi vì lệnh này bổ xung những tệp tin đã bị bỏ qua, bạn có thể muốn sử dụng
+Tùy chọn *-z* và *-0* dùng để ngăn ngừa sai hỏng không mong muốn từ những tập tin có chứa
+các ký tự đặc biệt. Bởi vì lệnh này bổ xung những tập tin đã bị bỏ qua, bạn có thể muốn sử dụng
tùy chọn `-x` hay `-X`.
=== Lần commit này Nhiều Quá! ===
@@ -57,8 +57,8 @@ bạn đã không dùng tùy chọn *-a*, nếu không thì Git sẽ commit tấ
Nhưng bạn lại có những tài liệu đã được chỉnh sửa đặt tại nhiều chỗ khác nhau? Việc duyệt từng cái một
sẽ làm bạn nản lòng. Trong trường hợp này, sử dụng lệnh *git add -i*, với giao diện
không ít rắc rối hơn, nhưng uyển chuyển hơn. Chỉ cần gõ vài cái,
-bạn có thể đưa vào hay gỡ bỏ nhiều tệp tin vào một trạng thái cùng một lúc, hay xem xét và chọn các thay đổi
-chỉ trong các tệp tin riêng biệt. Có một sự lựa chọn khác, chạy lệnh *git commit \--interactive* mà nó
+bạn có thể đưa vào hay gỡ bỏ nhiều tập tin vào một trạng thái cùng một lúc, hay xem xét và chọn các thay đổi
+chỉ trong các tập tin riêng biệt. Có một sự lựa chọn khác, chạy lệnh *git commit \--interactive* mà nó
sẽ tự động commit sau khi bạn làm xong.
=== Mục Lục: Vùng trạng thái của Git ===
@@ -70,7 +70,7 @@ dữ liệu vào mục lục, và sau đó sao chép dữ liệu trong chỉ m
cuối.
Ví dụ, lệnh *commit -a* thực sự bao gồm hai quá trình. Bước thứ nhất là đặt
-toàn bộ dữ liệu hiện tại của mọi tệp tin cần theo dõi vào bảng mục lục. Bước thứ
+toàn bộ dữ liệu hiện tại của mọi tập tin cần theo dõi vào bảng mục lục. Bước thứ
hai là ghi vào bảng mục lục. Việc commit không sử dụng tùy chọn
*-a* chỉ thi hành bước thứ hai, và nó chỉ có ý nghĩa sau khi chạy lệnh
mà lệnh này bằng cách này hay cách khác thay đổi bảng chỉ mục, như là lệnh *git add* chẳng hạn.
@@ -83,7 +83,7 @@ Thẻ HEAD giống như một con trỏ, nó trỏ đến lần commit cuối c
$ git reset HEAD~3
-sẽ chuyển HEAD lên vị trí lần commit cách đây ba lần. Thế thì tất cả các lệnh Git thi hành như khi bạn ở vị trí commit này, trong khi các tệp tin của bạn vẫn nằm ở hiện tại. Xem thêm phần trợ giúp cho một số ứng dụng.
+sẽ chuyển HEAD lên vị trí lần commit cách đây ba lần. Thế thì tất cả các lệnh Git thi hành như khi bạn ở vị trí commit này, trong khi các tập tin của bạn vẫn nằm ở hiện tại. Xem thêm phần trợ giúp cho một số ứng dụng.
Nhưng ta lại muốn quay trở lại phần sau này? Lần commit cũ không biết gì về phần sau này cả.
@@ -95,7 +95,7 @@ Nhưng giả sử bạn không có được nó? Đừng lo: với những lện
$ git reset ORIG_HEAD
-=== Săn tìm-HEAD ===
+=== Tìm HEAD ===
Có thể ORIG_HEAD là chưa đủ. Có lẽ bạn vừa nhận thấy mình vừa tạo ra một sai sót có quy mô lớn và bạn cần phải quay lại một lần commit cách đây lâu lắm rồi trong một nhánh mà bạn đã quên rồi vì nó đã quá lâu.
@@ -104,9 +104,9 @@ cho Git phá hủy nhánh chứa nó. Sự khó khăn là ở chỗ làm thế n
thích hợp. Bạn có thể tìm kiếm tất cả các giá trị băm trong `.git/objects` và sử dụng phương pháp thử sai tất cả các giá trị
để có được thứ mình muốn. Nhưng còn có cách dễ dàng hơn.
-Git ghi lại mọi giá trị băm của mọi lần commit trong máy tính tại thư mục `.git/logs`. Thư mục con `refs` chứa lịch sử của tất cả các hoạt động trên tất cả cách nhánh, trong khi tệp tin `HEAD` giữ tất cả các giá trị băm mà nó từng có được. Phần sau có thể được sử dụng để tìm kiếm giá trị băm của các lần commits trên các nhánh cái mà đã bị cắt đi một cách tình cờ.
+Git ghi lại mọi giá trị băm của mọi lần commit trong máy tính tại thư mục `.git/logs`. Thư mục con `refs` chứa lịch sử của tất cả các hoạt động trên tất cả cách nhánh, trong khi tập tin `HEAD` giữ tất cả các giá trị băm mà nó từng có được. Phần sau có thể được sử dụng để tìm kiếm giá trị băm của các lần commits trên các nhánh cái mà đã bị cắt đi một cách tình cờ.
-Lệnh reflog cung cấp cho chúng ta một giao diện thân thiện dành cho các tệp tin log. Bạn có thể thử bằng lệnh:
+Lệnh reflog cung cấp cho chúng ta một giao diện thân thiện dành cho các tập tin log. Bạn có thể thử bằng lệnh:
$ git reflog
@@ -118,7 +118,7 @@ Hay checkout lần thứ 5 kể từ lần commit cuối viếng thăm thông qu
$ git checkout "@{5}"
-Xem chương ``Specifying Revisions'' từ lệnh *git help rev-parse* để biết thêm chi tiết.
+Xem chương ``Specifying Revisions'' (tạm dịch: chỉ định các điểm xét duyệt) từ lệnh *git help rev-parse* để biết thêm chi tiết.
Bạn muốn cấu hình thời gian gia hạn lâu hơn việc xóa bỏ những lần commit. Ví
dụ:
@@ -136,18 +136,18 @@ trong trường hợp này những lần commit sẽ chỉ bị xóa bỏ khi b
=== Xây Dựng trên Git ===
-Tuân thủ theo phong thái UNIX, Git được thiết kế cho phép nó dễ dàng được sử dụng như là một thành phần bên dưới của các chương trình khác, như là cho giao diện đồ họa GUI và giao diện Web để thay thế cho giao diện dòng lệnh, công cụ quản lý các miếng vá, các công cụ nhập và chuyển đổi, và những thứ tương tự như thế. Trên thực tế, một số lệnh Git bản chất nó cũng là các kịch bản đứng trên vai của những người khổng lồ, chính là hệ điều hành. Chỉ cần sửa đổi một chút, bạn có thể bắt Git làm việc phù hợp với sở thích của mình.
+Tuân thủ theo phong thái UNIX, Git được thiết kế cho phép nó dễ dàng được sử dụng như là một thành phần thực thi bên dưới của các chương trình khác, như là cho giao diện đồ họa GUI và giao diện Web để thay thế cho giao diện dòng lệnh, công cụ quản lý các miếng vá, các công cụ xuất/nhập và chuyển đổi, và những thứ tương tự như thế. Trên thực tế, một số lệnh Git bản chất nó cũng là các kịch bản đứng trên vai của những người khổng lồ, chính là hệ điều hành. Chỉ cần sửa đổi một chút, bạn có thể bắt Git làm việc phù hợp với sở thích của mình.
-Một mẹo nhỏ là sử dụng một tính năng dựng sẵn trong Git là gán bí danh cho các lệnh để nó trở nên ngắn gọn hơn
-sử dụng lệnh:
+Một mẹo nhỏ là sử dụng một tính năng sẵn có trong Git bằng cách gán bí danh cho các lệnh để nó trở nên ngắn gọn hơn
+như sau:
- $ git config --global alias.co checkout #gán bí danh cho lệnh checkout là co
+ $ git config --global alias.co checkout # gán bí danh cho lệnh checkout là co
$ git config --global --get-regexp alias # hiển thị bí danh hiện hành
alias.co checkout
$ git co foo # có kết quả giống như chạy lệnh 'git checkout foo'
Một thứ khác là hiển thị nhánh hiện hành lên màn hình hay thanh tiêu đề của cửa sổ.
-Gọi lệnh
+Gọi lệnh:
$ git symbolic-ref HEAD
@@ -164,7 +164,7 @@ Một thư mục phổ biến khác là +workdir/git-new-workdir+. Thông qua c
$ git-new-workdir an/existing/repo new/directory
-Thư mục mới và các tệp tin trong nó có thể được coi như một bản sao, ngoại trừ phần lịch sử được chia sẻ dùng chung, hai cây được tự động đồng bộ hóa. Ở đây không cần có sự trộn, push, hay pull.
+Thư mục mới và các tập tin trong nó có thể được coi như một bản sao, ngoại trừ phần lịch sử được chia sẻ dùng chung, hai cây được tự động đồng bộ hóa. Ở đây không cần có sự trộn, push, hay pull.
=== Cứ Phiêu Lưu ===
@@ -192,11 +192,11 @@ Cũng tương tự như thế, việc cố gắng ghi đè lên một nhánh b
Không giống như checkout và reset, hai lệnh trên trì hoãn việc phá hủy dữ liệu. Các
thay đổi vẫn còn lưu giữ trong thư mục con .git, và có thể lấy lại được bằng cách
-lấy giá trị băm `.git/logs` thích hợp (xem phần "Săn tìm - HEAD" ở phía trên).
+lấy giá trị băm `.git/logs` thích hợp (xem phần "Tìm - HEAD" ở phía trên).
Theo mặc định, chúng sẽ giữ ít nhất là hai tuần lễ.
*Clean*: Một số lệnh Git từ chối thi hành bởi vì chúng lo lắng về việc làm như thế
-làm mất dấu hoàn toàn các tệp tin. Nếu bạn chắc chắn về tất cả các tệp tin và thư mục không cần Git
+làm mất dấu hoàn toàn các tập tin. Nếu bạn chắc chắn về tất cả các tập tin và thư mục không cần Git
theo dõi nữa và muốn phá hủy chúng đi, thế thì xóa chúng triệt để với lệnh:
$ git clean -f -d
@@ -205,7 +205,7 @@ Sau này, lệnh rầy rà đó sẽ hoạt động!
=== Ngăn Ngừa Commit Sai ===
-Có một số lỗi ngớ ngẩn đã xảy ra với tôi. Điều tồi tệ nhất là để sót các tệp tin bởi vì
+Có một số lỗi ngớ ngẩn đã xảy ra với tôi. Điều tồi tệ nhất là để sót các tập tin bởi vì
quên lệnh *git add*. Ít tệ hại hơn là các ký tự khoảng trắng và
những xung đột không cần phải trộn: mặc dù cũng chẳng tệ hại lắm, tôi mong rằng những điều này sẽ không xảy ra
với mọi người.
@@ -228,5 +228,6 @@ hook *pre-commit* để đề phòng khi ta lơ đãng:
Nhiều hoạt động của Git hỗ trợ hook; hãy xem *git help hooks*. Chúng tôi đã kích hoạt
một hook mẫu là *post-update* trước khi nói đến Git thông qua HTTP. Cái này chạy
-mỗi khi head di chuyển. Đoạn script ví dụ post-update cập nhật các tệp tin Git cần
+mỗi khi head di chuyển. Đoạn script ví dụ post-update cập nhật các tập tin Git cần
cho việc truyền thông thông qua Git-agnostic chuyên chở bằng giao thức giống như là HTTP.
+
diff --git a/vi/history.txt b/vi/history.txt
index 70f9344d..ec12a296 100644
--- a/vi/history.txt
+++ b/vi/history.txt
@@ -3,7 +3,7 @@
Một hệ quả tất yếu của đặc tính phân tán của Git là việc lịch sử có thể biên soạn lại một cách
dễ dàng. Nhưng nếu bạn xáo trộn quá khứ, hãy cẩn thận: chỉ biên soạn lại các phần trong lịch sử
chỉ khi bạn sở hữu nó một mình. Cũng giống như việc các quốc gia tranh cãi không kết thúc xem ai là người
-tận tâm hành động nào là tàn ác, nếu một người khác có một bản sao mà lịch sử của nó lại khác với
+tận tâm, hành động nào là tàn ác, nếu một người khác có một bản sao mà lịch sử của nó lại khác với
cái của bạn, bạn sẽ gặp rắc rối ngay khi cần tương tác với họ.
Một số nhà phát triển phần mềm quả quyết rằng lịch sử không thể thay đổi, tất cả mọi thứ.
@@ -14,11 +14,11 @@ nếu muốn.
=== Dừng Lại Sửa Chữa ===
-Bạn vừa mới commit, nhưng lại ước mình đã gõ những dòng chú thích có nội dung khác phải không? Thế thì hãy chạy:
+Bạn vừa mới commit, nhưng lại ước rằng mình đã gõ những dòng chú thích có nội dung khác phải không? Thế thì hãy chạy:
$ git commit --amend
-để thay đổi chú thích cuối cùng. Bạn giật mình vì quên thêm các tệp tin vào? Chạy lệnh *git add* để
+để thay đổi chú thích cuối cùng. Bạn giật mình vì quên thêm các tập tin vào? Chạy lệnh *git add* để
thêm nó vào, và sau đó lại chạy lệnh ở trên.
Bạn muốn thêm vài chỉnh sửa vào lần cuối mình đã commit ư? Thế thì cứ sửa chúng đi và sau đó chạy lệnh:
@@ -83,7 +83,7 @@ Do vậy cứ commit thoải mái và thường xuyên bởi vì bạn có thể
Bạn đang làm việc trên một dự án đang hoạt động. Bạn đã tạo ra một số lần commit tại máy tính của mình, và
sau đó bạn đồng bộ hóa với cây chính thức bằng cách hòa trộn. Chu kỳ này tự lặp chính nó một số lần trước khi bạn thực sự push tới cây trên máy chủ trung tâm.
-Nhưng hiện tại lịch sử bản sao Git trên máy tính của bạn là một mớ hỗn độn của những lần thay đổi trên máy tính riêng và máy chính thức. Bạn muốn thấy tất cả các thay đôi của riêng mình trong một đoạn liên tục không ngắt quãng, và sau tất cả các thay đổi từ văn phòng.
+Nhưng hiện tại lịch sử bản sao Git trên máy tính của bạn là một mớ hỗn độn của những lần thay đổi trên máy tính riêng và máy chính thức. Bạn muốn thấy tất cả các thay đổi của riêng mình trong một đoạn liên tục không ngắt quãng, và sau tất cả các thay đổi từ kho chính thức.
Đây chính là công việc dành cho lệnh *git rebase* đã được miêu tả ở trên. Trong nhiều trường hợp bạn có thể sử dụng
cờ *--onto* và tránh xa sự tương tác với các máy tính khác.
@@ -97,11 +97,11 @@ một bản sao lưu dự phòng bằng lệnh *git clone*.
Thỉnh thoảng, bạn muốn việc quản lý mã nguồn giống việc người ta sơn vẽ chân dung một
con người, tẩy xóa chúng từ lịch sử như theo ý của Stalinesque. Ví dụ,
-giả sử chúng ta có ý định phát hành dự án, nhưng lại liên đới đến một tệp tin mà nó phải được giữ bí mật
-vì lý do nào đó. Chẳng hạn như tôi đã quên khi ghi lại số thẻ tín dụng vào trong một tệp tin
-văn bản và ngẫu nhiên nó được thêm vào trong dự án. Việc xóa tệp tin này là
+giả sử chúng ta có ý định phát hành dự án, nhưng lại liên đới đến một tập tin mà nó phải được giữ bí mật
+vì lý do nào đó. Chẳng hạn như tôi đã quên khi ghi lại số thẻ tín dụng vào trong một tập tin
+văn bản và ngẫu nhiên nó được thêm vào trong dự án. Việc xóa tập tin này là
chưa đủ, bởi vì ta có thể đọc nó từ lần commit cũ. Chúng ta phải gỡ bỏ
-tệp tin này từ tất cả các lần đã commit:
+tập tin này từ tất cả các lần đã commit:
$ git filter-branch --tree-filter 'rm top/secret/file' HEAD
@@ -123,7 +123,7 @@ riêng để mà tạo ra một lịch sử cho Git từ ban đầu. Thông thư
lệnh này là một nhóm lệnh tổ hợp với nhau và chỉ chạy một lần, di chuyển một dự án chỉ bằng
một lệnh đơn.
-Dưới đây là một ví dụ, dán danh sách theo sau đâu vào một tệp tin tạm thời nào đó, chẳng hạn như là `/tmp/history`:
+Dưới đây là một ví dụ, dán danh sách theo sau đâu vào một tập tin tạm thời nào đó, chẳng hạn như là `/tmp/history`:
----------------------------------
commit refs/heads/master
committer Alice Thu, 01 Jan 1970 00:00:00 +0000
@@ -160,7 +160,7 @@ EOT
----------------------------------
-Thế thì tạo một kho Git từ thư mục chứa các tệp tin tạm thời này bằng cách gõ:
+Thế thì tạo một kho Git từ thư mục chứa các tập tin tạm thời này bằng cách gõ:
$ mkdir project; cd project; git init
$ git fast-import --date-format=rfc2822 < /tmp/history
@@ -176,7 +176,7 @@ những lệnh này có thể gửi một kho chứa ở dạng văn bản thôn
=== Vị Trí Nào Phát Sinh Lỗi? ===
-Bạn vừa mới phát hiện ra một đặc tính không hoạt động trong chương trình mà bạn chắc chắn là nó đã hoạt động vài tháng trước. Tệ quá! Lỗi bắt đầu từ chỗ nào nhỉ? Nếu như chỉ có mình bạn kiểm tra cũng như phát triển đặc tính này.
+Bạn vừa mới phát hiện ra một đặc tính không hoạt động trong chương trình mà bạn chắc chắn là nó đã hoạt động vài tháng trước. Tệ quá! Bạn tự hỏi là lỗi bắt đầu từ chỗ nào nhỉ? Nếu như chỉ có mình bạn kiểm tra cũng như phát triển đặc tính này.
Lúc này thì đã quá muộn rồi. Tuy nhiên, chỉ cần bạn commit thường xuyên, Git
có thể xác định vị trí của trục trặc:
@@ -216,7 +216,7 @@ Giống như các hệ thống quản lý mã nguồn khác, Git cũng có lện
$ git blame bug.c
-lệnh này chú thích tất cả các dòng có trong tệp tin được chỉ ra cho thấy ai là người cuối cùng sửa nó, và là khi nào. Không giống các hệ thống quản lý mã nguồn khác, hành động này hoạt động không cần có mạng, việc đọc chỉ đơn thuần từ ổ đĩa của máy tính cá nhân.
+lệnh này chú thích tất cả các dòng có trong tập tin được chỉ ra cho thấy ai là người cuối cùng sửa nó, và là khi nào. Không giống các hệ thống quản lý mã nguồn khác, hành động này hoạt động không cần có mạng, việc đọc chỉ đơn thuần từ ổ đĩa của máy tính cá nhân.
=== Kinh Nghiệm Riêng ===
@@ -224,7 +224,7 @@ Trong một hệ thống quản lý mã nguồn tập trung, thay đổi lịch
khó khăn, và chỉ làm được thế nếu đó là người quản trị. Việc nhân bản, tạo nhánh và
trộn không thể thiếu việc truyền thông qua mạng. Cũng như thế với các tác vụ cơ bản khác
như là duyệt lịch sử, hay là commit một thay đổi. Trong một số hệ thống khác, người dùng
-yêu cầu có kết nối mạng chỉ để xem các thay đổi của họ hay mở một tệp tin
+yêu cầu có kết nối mạng chỉ để xem các thay đổi của họ hay mở một tập tin
để biên tập.
Hệ thống tập trung không cho phép làm việc mà không có mạng, và đòi hỏi cơ sở hạ tầng mạng máy tính
@@ -256,5 +256,6 @@ chính của mình, lệnh đã hoàn tất từ lâu rồi, và tôi phải lã
Ở đây còn có một hậu quả rất đáng quan tâm nữa: đoán trước được việc tắc nghẽn của mạng máy tính,
nhiều cá nhân riêng lẻ có thể chiếm dụng nhiều lưu lượng mạng hơn cần thiết trên các tác vụ
khác nhau để cố gắng giảm thiểu sự chậm trễ có thể xảy ra trong tương lai. Hậu quả cuối cùng là
-sự quá tải quá mức, việc vô tình ủng hộ việc tiêu dùng cá nhân như thế làm đốt cháy nhiều lưu lượng mạng hơn
+sự quá tải quá mức, chính việc vô tình ủng hộ việc tiêu dùng cá nhân như thế đã tiêu tốn nhiều lưu lượng mạng hơn
và sau đó nó làm cho việc tắc nghẽn càng lúc càng trở nên tồi tệ hơn.
+
diff --git a/vi/intro.txt b/vi/intro.txt
index 42ae75bb..0e6ba745 100644
--- a/vi/intro.txt
+++ b/vi/intro.txt
@@ -4,17 +4,17 @@ Tôi sử dụng cách ví von để giới thiệu về hệ thống quản lý
=== Công Việc giống như Trò Chơi ===
-Tôi đã chơi trò chơi trên máy tính suốt từ bé đến giờ. Ngược lại, tôi chỉ bắt đầu sử dụng hệ thống quản lý mã nguồn khi đã trưởng thành. Tôi tin rằng không chỉ có tôi như thế, và việc so sánh giữa hai điều đó sẽ làm cho các khái niệm trở nên dễ hiểu, dễ giải thích hơn.
+Tôi đã chơi điện tử trên máy tính suốt từ bé đến giờ. Nhưng tôi chỉ bắt đầu sử dụng hệ thống quản lý mã nguồn khi đã trưởng thành. Tôi tin rằng không chỉ có mình tôi như thế, và việc so sánh giữa hai điều đó sẽ làm cho các khái niệm trở nên dễ hiểu, dễ giải thích hơn.
-Hãy nghĩ việc biên soạn mã nguồn, tài liệu cũng giống như việc chúng ta đang chơi trò chơi trên máy tính. Một khi bạn đã làm được kha khá, bạn sẽ muốn ghi lại thành quả công việc của mình. Để làm điều đó, bạn chỉ việc bấm vào nút 'Save' trong chương trình biên soạn của mình.
+Hãy nghĩ việc biên soạn mã nguồn, tài liệu cũng giống như việc chúng ta đang chơi trò chơi điện tử trên máy tính. Một khi bạn đã làm được kha khá, bạn sẽ muốn ghi lại thành quả công việc của mình. Để làm điều đó, bạn chỉ việc bấm vào nút 'Save' trong chương trình biên soạn của mình.
-Nhưng việc làm này sẽ ghi đè lên bản cũ. Điều này cũng giống như các trò chơi đã cũ chỉ cho phép ghi trên một tệp tin: bạn phải chắc chắn là mình muốn ghi lại, nếu không thì bạn không bao giờ có thể quay lại trạng thái cũ nữa. Và thật không may vì lần lưu trước đó có thể là đúng tại một điểm rất hay trong lượt chơi và bạn muốn thăm lại về sau. Tệ hơn nữa là khi bản ghi lại hiện tại lại không đúng, và thế là bạn sẽ phải bắt đầu lại từ đầu.
+Nhưng việc làm này sẽ ghi đè lên dữ liệu của bản cũ. Điều này cũng giống như các trò chơi đã cũ chỉ cho phép ghi trên một tập tin: bạn phải chắc chắn là mình muốn ghi lại, nếu không thì bạn không bao giờ có thể quay lại trạng thái cũ nữa. Và thật không may vì lần lưu trước đó có thể là đúng tại một điểm rất hay trong lượt chơi và bạn muốn quay lại đó sau này. Tệ hơn nữa là khi bản ghi lại hiện tại lại không đúng, và thế là bạn sẽ phải bắt đầu lại từ đầu.
=== Quản Lý Mã Nguồn ===
-Khi biên soạn, bạn có thể chọn 'Save As...' để ghi lại tệp tin hiện tại nhưng với một cái tên khác, hay là sao chép tệp tin ra một chỗ khác trước khi bạn ghi lại, nếu như bạn muốn dùng cả các bản cũ. Bạn có thể nén chúng lại để tiết kiệm dung lượng lưu trữ. Đây là dạng thức nguyên thủy và tốn nhiều công sức cho việc quản lý dữ liệu. Trò chơi trên máy tính đã cải tiến cách trên từ rất lâu rồi, rất nhiều trong số chúng cung cấp cho bạn khả năng tự động ghi lại sau từng khoảng thời gian nhất định.
+Khi biên soạn, bạn có thể chọn 'Save As...' để ghi lại tập tin hiện tại nhưng với một cái tên khác, hay là sao chép tập tin ra một chỗ khác trước khi bạn ghi lại, nếu như bạn muốn dùng cả các bản cũ. Bạn có thể nén chúng lại để tiết kiệm dung lượng lưu trữ. Đây là dạng thức nguyên thủy và tốn nhiều công sức cho việc quản lý dữ liệu. Trò chơi trên máy tính đã cải tiến cách trên từ rất lâu rồi, rất nhiều trong số chúng cung cấp cho bạn khả năng tự động ghi lại sau từng khoảng thời gian nhất định.
-Chúng ta sẽ giải quyết một vấn đề hơi hóc búa một chút nhé! Bạn nói rằng bạn có nhiều tệp tin có liên quan mật thiết với nhau, như mã nguồn cho một dự án chẳng hạn, hay các tệp tin cho một website. Bây giờ nếu bạn muốn giữ một phiên bản cũ bạn phải lưu giữ toàn bộ thư mục. Giữ nhiều phiên bản như thế bằng cách thủ công thật bất tiện, và sẽ nhanh chóng trở nên tốn kém.
+Chúng ta sẽ giải quyết một vấn đề hơi hóc búa một chút nhé! Bạn nói rằng bạn có nhiều tập tin có liên quan mật thiết với nhau, như mã nguồn cho một dự án chẳng hạn, hay các tập tin cho một website. Bây giờ nếu bạn muốn giữ một phiên bản cũ bạn phải lưu giữ toàn bộ thư mục. Giữ nhiều phiên bản như thế bằng cách thủ công thật bất tiện, và sẽ nhanh chóng trở nên tốn kém.
Đối với một số trò chơi, ghi lại một trò chơi thực tế là bao gồm toàn bộ thư mục. Những trò chơi này thực thi việc này tự động và chỉ đưa ra một giao diện thích hợp cho người chơi để quản lý các phiên bản của thư mục này.
@@ -22,17 +22,17 @@ Các hệ thống quản lý mã nguồn cũng hoạt động theo cách ấy. C
=== Hệ Thống Phân Tán ===
-Bây giờ hãy tưởng tượng có một trò chơi rất khó. Khó để hoàn thành đến mức là có nhiều game thủ lão luyện trên toàn thế giới quyết định lập thành đội và chia sẻ những trò chơi mà họ đã lưu lại với mục đích là để tất cả mọi người có thể theo dõi được nhau. Speedruns là những ví dụ trong đời sống thực: các đấu thủ được phân hóa theo các mức của cùng một trò chơi hợp tác với nhau để đạt được các kết quả đáng kinh ngạc.
+Bây giờ hãy tưởng tượng có một trò chơi rất khó. Khó để hoàn thành đến mức là có nhiều game thủ lão luyện trên toàn thế giới quyết định lập thành đội và chia sẻ những trò chơi mà họ đã lưu lại với mục đích là để tất cả mọi người có thể theo dõi được nhau. *Speedruns* là những ví dụ trong đời sống thực: các đấu thủ được phân hóa theo các mức của cùng một trò chơi hợp tác với nhau để đạt được các kết quả đáng kinh ngạc.
Làm thế nào bạn có thể cài đặt một hệ thống mà chúng có thể lấy được từng bản ghi của mỗi người một cách dễ dàng? Và tải lên cái mới hơn?
-Ngày xưa, mọi dự án đều sử dụng hệ thống quản lý tập trung. Máy chủ ở một chỗ đâu đó và giữ tất cả các trò chơi đã được ghi lại. Không còn ai khác làm điều đó nữa. Mọi người giữ phần lớn các trò chơi được ghi lại trong máy của họ. Khi một đấu thủ muốn chơi, họ có thể tải về bản ghi lại cuối cùng đã lưu lại ở máy chủ, chơi một lúc, ghi lại và tải trở lại máy chủ để mọi người có thể sử dụng.
+Ngày xưa, mọi dự án đều sử dụng hệ thống quản lý tập trung. Máy chủ ở một chỗ đâu đó và giữ tất cả các trò chơi đã được ghi lại. Không còn ai khác làm điều đó nữa. Mọi người giữ phần lớn các trò chơi được ghi lại trong máy của họ. Khi một đấu thủ muốn chơi, họ có thể tải về bản ghi lại cuối cùng đã lưu lại ở máy chủ, chơi một lúc, ghi lại và tải trở lại máy chủ để những người khác có thể sử dụng.
-Điều gì xảy ra khi một người chơi, vì một lý do nào đó, muốn có được lần chơi cũ hơn? Lý do có thể là lần chơi hiện tại không ổn định hay có sai sót bởi vì một người chơi nào đó quên không chỉnh lại trò chơi về mức 3, và họ muốn tìm lần chơi đã ghi lại cuối cùng mà họ vẫn chưa hoàn thành. Hay có thể là họ muốn so sánh sự khác nhau giữa các lần chơi để thấy được thành quả của từng người chơi.
+Điều gì xảy ra khi một người chơi, vì một lý do nào đó, muốn có được lần chơi cũ hơn? Lý do có thể là lần chơi hiện tại không ổn định hay có sai sót bởi vì một người chơi nào đó quên không chỉnh lại trò chơi về mức 3, và họ muốn tìm lần chơi đã ghi lại cuối cùng mà họ vẫn chưa hoàn thành. Hay có thể là họ muốn so sánh sự khác nhau giữa các lần chơi để thấy được thành quả của từng người chơi.
Có rất nhiều lý do vì sao cần đến bản cũ hơn, nhưng kết cục là giống nhau. Họ phải hỏi máy chủ trung tâm để lấy về trò chơi cũ đã được lưu lại. Càng ghi lại nhiều trò chơi, họ càng cần phải liên lạc nhiều với nhau.
-Những hệ thống quản lý mã nguồn thế hệ mới, Git cũng nằm trong số đó, được biết đến như một hệ thống phân tán, và có thể coi nó là một hệ thống tập trung có mở rộng. Khi người chơi tải về từ máy chủ chính, họ lấy toàn bộ tất cả các lần đã ghi lại, không chỉ mỗi bản cuối cùng. Điều đó có nghĩa là họ trở thành bản sao của máy chủ trung tâm.
+Những hệ thống quản lý mã nguồn thế hệ mới, Git là một trong số đó, được biết đến như một hệ thống phân tán, và có thể coi nó là một hệ thống tập trung có mở rộng. Khi người chơi tải về từ máy chủ chính, họ lấy toàn bộ tất cả các lần đã ghi lại, không chỉ mỗi bản cuối cùng. Điều đó có nghĩa là họ trở thành bản sao của máy chủ trung tâm.
Việc khởi tạo bản sao như thế có vẻ hơi xa hoa, đặc biệt là nếu nó có lịch sử phát triển lâu dài, nhưng cái giá phải trả cũng chỉ là việc cần nhiều thời gian để lấy về. Một lợi ích trực tiếp của việc này là khi các tài liệu cũ cần đến, việc liên lạc với máy chủ trung tâm là không cần thiết nữa.
@@ -52,8 +52,9 @@ Hơn thế nữa, dự án của bạn có thể lớn vượt ra ngoài dự ki
Với chủ đề này, dùng cách ví von nó với một trò chơi trên máy tính là hơi khó. Thay vì thế, để chúng tôi dùng việc biên soạn một tài liệu để giải thích cho bạn.
-Giả sử Alice chèn thêm một dòng vào đầu một tệp tin, và Bob nối một dòng vào cuối của bản sao của mình. Cả hai đều tải lên các thay đổi của mình. Phần lớn các hệ thống sẽ tự động tìm ra hành động hợp lý: chấp nhận và trộn các sự thay đổi của họ, do đó cả hai sự thay đổi mà Alice và Bob tạo ra đều được dùng.
+Giả sử Alice chèn thêm một dòng vào đầu một tập tin, và Bob nối một dòng vào cuối của bản sao của mình. Cả hai đều tải lên các thay đổi của mình. Phần lớn các hệ thống sẽ tự động tìm ra hành động hợp lý: chấp nhận và trộn các sự thay đổi của họ, do đó cả hai sự thay đổi mà Alice và Bob tạo ra đều được dùng.
Bây giờ giả sử cả Alice và Bob cùng sửa một dòng. Thế thì mâu thuẫn này không thể sử lý được mà không có sự can thiệp của con người. Người thứ hai tải lên sẽ được thông báo có xung đột xảy ra, _merge conflict_, và phải chọn một là sửa thêm nữa, hay sửa lại toàn bộ dòng đó.
Nhiều tình huống phức tạp có thể nảy sinh. Hệ thống quản lý mã nguồn giữ phần dễ dàng cho chúng, và để lại những tình huống khó khăn cho chúng ta. Nhưng thông thường cách ứng xử của chúng có thể điều chỉnh được.
+
diff --git a/vi/multiplayer.txt b/vi/multiplayer.txt
index 0b38fb8b..7597dac7 100644
--- a/vi/multiplayer.txt
+++ b/vi/multiplayer.txt
@@ -9,12 +9,11 @@ những người đóng góp. Tôi đã phải học cách làm thế nào để
ở khắp nơi trên toàn thế giới. May mắn thay, đây là sở trường của Git, và người ta có thể nói đây là
điều sống còn của một hệ thống quản lý mã nguồn.
-
=== Tôi Là Ai? ===
Mỗi lần commit sẽ lưu giữ tên và địa chỉ thư điện tử, điều này có thể nhìn thấy bằng lệnh *git log*.
Theo mặc định, Git sử dụng các trường để lưu giữ các cài đặt trong hệ thống của mình.
-Để chỉ định chúng một cách rõ ràng, hãy gõ:
+Để cài đặt các thông tin cá nhân của mình vào, hãy gõ:
$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com
@@ -40,17 +39,17 @@ Với các phiên bản Git cũ, lệnh copy không thực hiện được và b
Từ giờ bạn có thể xuất bản mới nhất của mình thông qua SSH từ một bản sao bất kỳ:
- $ git push web.server:/path/to/proj.git master
+ $ git push máy.chủ.web:/đường/dẫn/đến/proj.git master
và mọi người có thể lấy dự án của bạn với lệnh:
- $ git clone http://web.server/proj.git
+ $ git clone http://máy.chủ.web/proj.git
=== Git Thông Qua Mọi Thứ ===
Bạn muốn đồng bộ hóa kho chứa nhưng lại không có máy chủ và cũng không có mạng?
Bạn cần trong những trường hợp khẩn cấp? Chúng ta đã biết lệnh <>. Chúng ta có thể chuyển qua chuyển lại như vậy để truyền kho Git
đi thông qua bất kỳ phương tiện nào, nhưng có một công cụ hiệu quả hơn đó chính là *git bundle*.
@@ -85,7 +84,7 @@ và tạo một bản bundles mới với:
=== Vá: Sự Thịnh Hành Toàn Cầu ===
-Miếng vá được trình bày ở dạng văn bản các thay đổi của bạn, nó dễ dàng được đọc hiểu bởi
+Miếng vá được trình bày ở dạng văn bản để thể hiện các thay đổi của bạn, nó dễ dàng được đọc hiểu bởi
con người cũng như là máy tính. Điều này mang lại cho chúng sức lôi cuốn toàn cầu. Bạn có thể gửi miếng vá qua
thư điện tử cho những nhà phát triển phần mềm khác mà chẳng cần lo họ đang sử dụng hệ thống quản lý mã nguồn nào. Chừng nào
mà độc giả của bạn có thể đọc được thư điện tử của mình thì họ còn có thể thấy được phần chỉnh sửa của bạn. Tương tự thế, về phía mình,
@@ -111,13 +110,13 @@ Tệp tin lưu kết quả có thể chuyển cho lệnh *git-send-email*, hay c
$ git format-patch 1b6d..HEAD^^
-Ở phía người nhận cuối, ghi lại thư điện tử thành tệp tin, sau đó chạy lệnh:
+Ở phía người nhận cuối, ghi lại thư điện tử thành tập tin, sau đó chạy lệnh:
$ git am < email.txt
Lệnh này sẽ áp dụng cho miếng vá nhận được, đồng thời tạo ra một lần commit, bao gồm các thông tin như là tác giả.
-Với một chương trình đọc thư điện tử, bạn có thể sử dụng con chuột để chuyển định dạng thư về dạng văn bản thuần trước khi ghi miếng vá thành một tệp tin.
+Với một chương trình đọc thư điện tử, bạn có thể sử dụng con chuột để chuyển định dạng thư về dạng văn bản thuần trước khi ghi miếng vá thành một tập tin.
Có một số khác biệt nhỏ giữa các trình đọc đọc thư điện tử, nhưng nếu bạn sử dụng một trong
số chúng, bạn hầu như chắc chắn là người mà có thể cấu hình chúng một cách dễ dàng
@@ -137,7 +136,7 @@ thay đổi hay xóa các tên này nhưng chẳng có lý do gì để phải l
Nếu kho chứa nguyên bản đã chuyển chỗ, chúng ta có thể cập nhật URL thông qua:
- $ git config remote.origin.url git://new.url/proj.git
+ $ git config remote.origin.url git://url.mới/proj.git
Tùy chọn +branch.master.merge+ chỉ ra nhánh remote mặc định trong
lệnh *git pull*. Trong suốt quá trình nhân bản, nó được đặt cho nhánh hiện hành của kho chứa
@@ -173,7 +172,7 @@ Bạn nhận được kết quả trông giống như thế này:
Những nhánh tương ứng và HEAD của kho chứa remote, và bạn có thể sử dụng
trong các lệnh Git thông thường. Ví dụ như là, giả sử bạn làm nhiều lần commit, và
-muốn so sánh chúng với bản đã fetch cuối cùng. Bạn cũng có thể tìm kiếm trong tệp tin
+muốn so sánh chúng với bản đã fetch cuối cùng. Bạn cũng có thể tìm kiếm trong tập tin
log để có được giá trị băm SHA1 thích hợp, nhưng dễ dàng hơn việc gõ:
$ git diff origin/HEAD
@@ -229,3 +228,4 @@ Git thuận lợi trong việc tạo các miếng vá, cũng như là nó
tiết kiệm công sức cho chúng ta trong việc chuyển đổi chúng thành những lần commit dành cho Git. Hơn thế nữa, Git lưu giữ các thông tin rất chi tiết
như là ghi lại tên và địa chỉ thư điện tử của tác giả, cũng như là ngày tháng và
thời gian, và nó cũng đòi hỏi tác giả phải mô tả về những thay đổi mà họ đã tạo ra.
+
diff --git a/vi/preface.txt b/vi/preface.txt
index 466646f6..c77e5b62 100644
--- a/vi/preface.txt
+++ b/vi/preface.txt
@@ -4,7 +4,7 @@ Tháng Tám, 2007
== Lời nói đầu ==
-http://git.or.cz/[Git] là công cụ quản lý mã nguồn vạn năng. Đây là một công cụ quản lý mã nguồn tin cậy, ổn định, đa dụng và cực kỳ mềm dẻo và chính sự mềm dẻo của Git làm cho việc học nó trở nên khó khăn, tất nhiên là không nói đến những người đã tạo ra nó.
+http://git-scm.com/[Git] là công cụ quản lý mã nguồn vạn năng. Đây là một công cụ quản lý mã nguồn tin cậy, ổn định, đa dụng và cực kỳ mềm dẻo và chính sự mềm dẻo của Git làm cho việc học nó trở nên khó khăn, tất nhiên là không nói đến những người đã tạo ra nó.
Theo quan sát của Arthur C. Clarke, bất kể công nghệ tiên tiến nào cũng không thể phân biệt rạch ròi là nó có kỳ diệu hay không. Đây cũng là cách hay đề đề cập đến Git: những người mới sử dụng không cần quan tâm đến bên trong Git làm việc như thế nào mà hãy xem khả năng thần kỳ của nó như là một điệu gizmo có thể làm những người coi nó là bạn sửng sốt và làm điên đầu những người đối lập.
@@ -13,16 +13,20 @@ Thay vì đi sâu vào chi tiết, chúng tôi đưa ra phác thảo cách làm
.Bản dịch
- link:/\~blynn/gitmagic/intl/zh_cn/[Tiếng Trung Giản thể]: dịch bởi JunJie, Meng và JiangWei. Đã chuyển đổi sang: link:/~blynn/gitmagic/intl/zh_tw/[Tiếng Trung Phồn thể] thông qua lệnh +cconv -f UTF8-CN -t UTF8-TW+.
- - link:/~blynn/gitmagic/intl/fr/[Tiếng Pháp]: dịch bởi Alexandre Garel; và đồng thời được xuất bản tại http://tutoriels.itaapy.com/[itaapy].
- - link:/~blynn/gitmagic/intl/de/[Tiếng Đức]: dịch bởi Benjamin Bellee và Armin Stebich. Armin ; và đồng thời xuất bản http://gitmagic.lordofbikes.de/[bản dịch tiếng Đức trên website của chính mình].
- - http://www.slideshare.net/slide_user/magia-git[Tiếng Bồ Đào Nha]: dịch bởi Leonardo Siqueira Rodrigues [http://www.slideshare.net/slide_user/magia-git-verso-odt[định dạng ODT]].
+ - link:/~blynn/gitmagic/intl/fr/[Tiếng Pháp]: dịch bởi Alexandre Garel.
+ - link:/~blynn/gitmagic/intl/de/[Tiếng Đức]: dịch bởi Benjamin Bellee và Armin Stebich; và đồng thời xuất bản http://gitmagic.lordofbikes.de/[trên website của Armin].
+ - link:/~blynn/gitmagic/intl/it/[Tiếng Ý]: dịch bởi Mattia Rigotti.
+ - link:/~blynn/gitmagic/intl/ko/[Tiếng Hàn Quốc]: dịch bởi Jung-Ho (John) Han; đồng thời https://sites.google.com/site/drinkhanjohn/useful-links/[xuất bản trên trang web của John].
+ - link:/~blynn/gitmagic/intl/pl/[Tiếng Ba Lan]: dịch bởi Damian Michna.
+ - link:/~blynn/gitmagic/intl/pt_br/[Tiếng Bồ Đào Nha Bra-xin]: dịch bởi José Inácio Serafini và Leonardo Siqueira Rodrigues.
- link:/~blynn/gitmagic/intl/ru/[Tiếng Nga]: dịch bởi Tikhon Tarnavsky, Mikhail Dymskov và một số người khác.
- link:/~blynn/gitmagic/intl/es/[Tiếng Tây Ban Nha]: dịch bởi Rodrigo Toledo và Ariset Llerena Tapia.
+ - link:/~blynn/gitmagic/intl/uk/[Ukrainian]: dịch bởi Volodymyr Bodenchuk.
- link:/~blynn/gitmagic/intl/vi/[Tiếng Việt]: dịch bởi Trần Ngọc Quân và đồng thời xuất bản bản dịch này trên http://vnwildman.users.sourceforge.net/gitmagic/[trang Web cá nhân của mình].
.Các định dạng khác
- - link:book.html[Trang web đơn]: định dạng HTML đơn giản, không định dạng bằng CSS.
+ - link:book.html[Trang web đơn]: dạng HTML đơn giản, không được định dạng bằng CSS.
- link:book.pdf[Định dạng PDF]: thuận tiện cho việc in ấn.
- http://packages.debian.org/gitmagic[Gói dành cho Debian], http://packages.ubuntu.com/gitmagic[gói dành cho Ubuntu]: tải về đĩa cứng từ các địa chỉ này. Tiện lợi http://csdcf.stanford.edu/status/[khi máy chủ này không kết nối mạng hay không hoạt động].
- http://www.amazon.com/Git-Magic-Ben-Lynn/dp/1451523343/[Sách giấy [Amazon.com]]: 64 trang, 15.24cm x 22.86cm, đen trắng. Rất tiện sử dụng vì chẳng cần đến điện.
@@ -33,12 +37,11 @@ Tôi gửi lời cảm ơn đến những người đã dịch quyển sách nà
Tôi rất cảm kích vì có được số lượng độc giả rộng lớn có được bởi những người
đã được nêu tên ở trên.
-Dustin Sallings, Alberto Bertogli, James Cameron, Douglas Livingstone, Michael Budde, Richard Albury, Tarmigan, Derek Mahar, Frode Aannevik, Keith Rarick, Andy Somerville, Ralf Recker, Øyvind A. Holm, Miklos Vajna, Sébastien Hinderer, Thomas Miedema, Joe Malin, Tyler Breisacher, Sonia Hamilton, Julian Haagsma, Romain Lespinasse, Sergey Litvinov, Oliver Ferrigni, David Toca, Сергей Сергеев và Joël Thieffry đã đóng góp trong việc sửa chữa và cải tiến nội dung.
+Dustin Sallings, Alberto Bertogli, James Cameron, Douglas Livingstone, Michael Budde, Richard Albury, Tarmigan, Derek Mahar, Frode Aannevik, Keith Rarick, Andy Somerville, Ralf Recker, Øyvind A. Holm, Miklos Vajna, Sébastien Hinderer, Thomas Miedema, Joe Malin, Tyler Breisacher, Sonia Hamilton, Julian Haagsma, Romain Lespinasse, Sergey Litvinov, Oliver Ferrigni, David Toca, Сергей Сергеев, Joël Thieffry và Baiju Muthukadan đã đóng góp trong việc sửa chữa và cải tiến nội dung.
François Marier đã bảo trì gói Debian do Daniel
Baumann khởi xướng.
-John Hinnegan đã mua tên miền http://www.gitmagic.com/[gitmagic.com].
Tôi cũng gửi lời cảm ơn tới sự giúp đỡ và sự tán dương của các bạn. Tôi muốn
trích dẫn những lời đó ra đây, nhưng làm như thế có vẻ hơi lố bịch, tự cao tự đại.
@@ -60,5 +63,6 @@ hay từ các máy chủ khác:
$ git clone git://git.assembla.com/gitmagic.git
$ git clone git@bitbucket.org:blynn/gitmagic.git
-GitHub, Assembla, và Bitbucket có hỗ trợ các kho có tính riêng tư, hai địa chỉ còn lại
+GitHub, Assembla, và Bitbucket có hỗ trợ các kho có tính riêng tư, hai địa sau
là miễn phí.
+
diff --git a/vi/secrets.txt b/vi/secrets.txt
index 9eee5715..35b2c602 100644
--- a/vi/secrets.txt
+++ b/vi/secrets.txt
@@ -4,11 +4,11 @@ Chúng ta mổ xẻ để hiểu được làm thế nào mà Git có thể thi
=== Tính Ẩn ===
-Git làm việc có vẻ kín đáo? Chỉ cần nói riêng về việc sử dụng lệnh commit và merge, bạn có thể làm việc mà không cần biết đến sự tồn tại của hệ thống quản lý mã nguồn. Cho đến khi bạn cần nó, và cho đến khi bạn vui sướng vì Git đã trông coi mã nguồn cho bạn trong suốt thời gian qua.
+Git làm việc có vẻ kín đáo? Chỉ cần nói riêng về việc sử dụng lệnh *commit* và *merge*, bạn có thể làm việc mà không cần biết đến sự tồn tại của hệ thống quản lý mã nguồn. Cho đến khi bạn cần nó, và cho đến khi bạn vui sướng vì Git đã trông coi mã nguồn cho bạn trong suốt thời gian qua.
-Các hệ thống quản lý mã nguồn khác ép buộc bạn luôn luôn phải tranh đấu với thói quan liêu. Quyền truy cập của các tệp tin có thể là chỉ cho phép đọc trừ phi bạn nói rõ với máy chủ trung tâm là các tệp tin nào bạn muốn chỉnh sửa. Tốc độ làm việc của phần lớn các lệnh sẽ tỷ lệ nghịch với số lượng người sử dụng. Mọi công việc sẽ đình trệ khi mạng máy tính hay máy chủ ngừng hoạt động.
+Các hệ thống quản lý mã nguồn khác ép buộc bạn luôn luôn phải tranh đấu với thói quan liêu. Quyền truy cập của các tập tin có thể là chỉ cho phép đọc trừ phi bạn nói rõ với máy chủ trung tâm là các tập tin nào bạn muốn chỉnh sửa. Tốc độ làm việc của phần lớn các lệnh sẽ tỷ lệ nghịch với số lượng người sử dụng. Mọi công việc sẽ đình trệ khi mạng máy tính hay máy chủ ngừng hoạt động.
-Đối lập với hạn chế trên, Git đơn giản giữ lịch sử của dự án của bạn tại thư mục `.git` trong thư mục làm việc của bạn. Đây là bản sao lịch sử của riêng bạn, do vậy bạn có thể làm việc không cần mạng cho đến khi cần truyền thông với những người khác. Bạn có toàn quyền quyết định với các tệp tin của mình bởi vì Git có thể tạo lại trạng thái đã ghi lại từ `.git` bất kỳ lúc nào một cách dễ dàng.
+Đối lập với hạn chế trên, Git đơn giản giữ lịch sử của dự án của bạn tại thư mục `.git` trong thư mục làm việc của bạn. Đây là bản sao lịch sử của riêng bạn, do vậy bạn có thể làm việc không cần mạng cho đến khi cần truyền thông với những người khác. Bạn có toàn quyền quyết định với các tập tin của mình bởi vì Git có thể tạo lại trạng thái đã ghi lại từ `.git` bất kỳ lúc nào một cách dễ dàng.
=== Toàn Vẹn Dữ Liệu ===
@@ -18,25 +18,25 @@ Giá trị SHA1 có thể coi như là một số định danh 160-bit không tr
Bản thân giá trị SHA1 cũng là một chuỗi ký tự, chúng ta có thể băm chuỗi có chứa giá trị băm khác. Khả năng quan sát đơn giản này cực kỳ hữu dụng: tra cứu 'hash chains' (tra cứu theo các chuỗi móc xích với nhau bằng giá trị băm). Sau này chúng ta sẽ thấy làm cách nào Git sử dụng nó để mà đảm bảo tính toàn vẹn của dữ liệu.
-Tóm lại, Git lưu giữ dữ liệu của bạn trong thư mục con `.git/objects`, thay vì sử dụng tên tệp tin như thông thường, bạn sẽ chỉ nhìn thấy ID của chúng. Bằng cách sử dụng ID để làm tên tệp tin, cũng tốt như là cách sử dụng kỹ thuật lockfiles (khóa tệp tin) và timestamp (theo dõi thời gian của tệp tin), Git biến hệ thống tệp tin thông thường bất kỳ nào trở thành một cơ sở dữ liệu hiệu quả và mạnh mẽ.
+Tóm lại, Git lưu giữ dữ liệu của bạn trong thư mục con `.git/objects`, thay vì sử dụng tên tập tin như thông thường, bạn sẽ chỉ nhìn thấy ID của chúng. Bằng cách sử dụng ID để làm tên tập tin, cũng tốt như là cách sử dụng kỹ thuật lockfiles (khóa tập tin) và timestamp (theo dõi thời gian của tập tin), Git biến hệ thống tập tin thông thường bất kỳ nào trở thành một cơ sở dữ liệu hiệu quả và mạnh mẽ.
=== Thông Minh ===
-Làm thể nào mà Git biết bạn đã đổi tên một tệp tin, dù là bạn chẳng bao giờ đề cập đến điều này một cách rõ ràng? Chắc chắn rồi, bạn có lẽ đã chạy lệnh *git mv*, nhưng nó chính xác giống hệt như việc chạy lệnh *git rm* sau đó là lệnh *git add*.
+Làm thể nào mà Git biết bạn đã đổi tên một tập tin, dù là bạn chẳng bao giờ đề cập đến điều này một cách rõ ràng? Chắc chắn rồi, bạn có lẽ đã chạy lệnh *git mv*, nhưng nó chính xác giống hệt như việc chạy lệnh *git rm* sau đó là lệnh *git add*.
-Git khám phá ra cách truy tìm các tệp tin đã được đổi tên hay sao chép giữa các phiên bản liên tiếp. Trên thực tế, nó có thể tìm ra từng đoạn mã nguồn đã bị di chuyển hay sao chép giữa các tệp tin! Dẫu cho nó không thể xử lý được mọi trường hợp, nó làm khá tốt, và đặc tính này luôn luôn được phát triển. Nếu nó không làm việc với bạn, hãy thử bật các tùy chọn dành cho việc phát hiện sự sao chép, và nên cất nhắc đến việc cập nhật.
+Git khám phá ra cách truy tìm các tập tin đã được đổi tên hay sao chép giữa các phiên bản liên tiếp. Trên thực tế, nó có thể tìm ra từng đoạn mã nguồn đã bị di chuyển hay sao chép giữa các tập tin! Dẫu cho nó không thể xử lý được mọi trường hợp, nó làm khá tốt, và đặc tính này luôn luôn được phát triển. Nếu nó không làm việc với bạn, hãy thử bật các tùy chọn dành cho việc phát hiện sự sao chép, và nên cất nhắc đến việc cập nhật.
=== Mục Lục ===
-Với mọi tệp tin được theo dõi, Git ghi lại các thông tin như là kích thước, thời gian tạo và lần cuối sửa đổi trong một tệp tin được biết đến là một mục lục 'index'. Để xác định rõ một tệp tin có bị thay đổi hay không, Git so sánh nó ở thời điểm hiện tại với phần lưu giữ trong bộ nhớ. Nếu chúng giống nhau, thế thì Git có thể bỏ qua việc đọc tệp tin đó lại lần nữa.
+Với mọi tập tin được theo dõi, Git ghi lại các thông tin như là kích thước, thời gian tạo và lần cuối sửa đổi trong một tập tin được biết đến là một mục lục 'index'. Để xác định rõ một tập tin có bị thay đổi hay không, Git so sánh nó ở thời điểm hiện tại với phần lưu giữ trong bộ nhớ. Nếu chúng giống nhau, thế thì Git có thể bỏ qua việc đọc tập tin đó lại lần nữa.
-Bởi vì gọi stat nhanh hơn đáng kể so với đọc tệp tin, nếu bạn chỉ chỉnh sửa
-vài tệp tin, Git có thể cập nhật trạng thái của nó cực kỳ nhanh chóng.
+Bởi vì gọi lệnh ``stat'' nhanh hơn đáng kể so với đọc tập tin, nếu bạn chỉ chỉnh sửa
+vài tập tin, Git có thể cập nhật trạng thái của nó cực kỳ nhanh chóng.
-Chúng ta đã nói trước rằng mục lục (index) là vùng làm việc của trạng thái. Tại sao lại là một chùm tệp tin
-stat vùng stage? Bởi vì lệnh add đặt các tệp tin vào trong cơ sở dữ liệu của Git
-và cập nhật những stats này, trong lúc lệnh commit được thực hiện, mà không có tùy chọn, tạo ra một
-commit trên cơ sở chỉ trên các stats và các tệp tin đã sẵn có trong cơ sở dữ liệu.
+Chúng ta đã nói trước rằng mục lục (index) là vùng làm việc của trạng thái. Tại sao lại là một chùm tập tin
+stat vùng stage? Bởi vì lệnh add đặt các tập tin vào trong cơ sở dữ liệu của Git
+và cập nhật những stat này, trong lúc lệnh commit được thực hiện, mà không có tùy chọn, tạo ra một
+commit trên cơ sở chỉ trên các stat và các tập tin đã sẵn có trong cơ sở dữ liệu.
=== Nguồn Gốc của Git ===
@@ -50,12 +50,12 @@ mục lục, tên các nhánh, các thẻ tag, các tùy chọn cấu hình, nh
hiện tại của head của lần commit, và những thứ tương tự như thế. Đối tượng cơ sở dữ liệu cho đến bây giờ vẫn là phần tử cơ bản xuất sắc nhất,
và là cội nguồn sức mạnh của Git.
-Mỗi tệp tin trong `.git/objects` là một 'đối tượng'. Ở đây có 3 loại đối tượng
-liên quan đến chúng ta: đối tượng 'blob', đối tượng cây 'tree', và đối tượng 'commit'.
+Mỗi tập tin trong `.git/objects` là một 'đối tượng'. Ở đây có 3 loại đối tượng
+liên quan đến chúng ta: đối tượng nội dung tập tin 'blob', đối tượng cây 'tree', và đối tượng lần chuyển giao 'commit'.
=== Đối Tượng Blob ===
-Đầu tiên, hãy tạo một tệp tin bất kỳ. Đặt cho nó một cái tên, tên gì cũng được. Trong một thư mục rỗng:
+Đầu tiên, hãy tạo một tập tin bất kỳ. Đặt cho nó một cái tên, tên gì cũng được. Trong một thư mục rỗng:
$ echo sweet > YOUR_FILENAME
$ git init
@@ -64,7 +64,7 @@ liên quan đến chúng ta: đối tượng 'blob', đối tượng cây 'tree'
Bạn sẽ thấy +.git/objects/aa/823728ea7d592acc69b36875a482cdf3fd5c8d+.
-Làm sao mà tôi biết được tệp tin khi không thấy tên của nó? Đó là bởi vì đó là giá trị
+Làm sao mà tôi biết được tập tin khi không thấy tên của nó? Đó là bởi vì đó là giá trị
băm SHA1 của:
"blob" SP "6" NUL "sweet" LF
@@ -75,21 +75,21 @@ bằng lệnh sau:
$ printf "blob 6\000sweet\n" | sha1sum
-Git sử dụng cách 'lấy nội dung để làm tên cho tệp tin': tệp tin không được lưu trữ như theo tên của chúng,
-mà bằng giá trị băm dữ liệu mà chúng chứa, trong tệp tin chúng ta gọi là một 'đối tượng
-blob'. Chúng ta có thể nghĩ giá trị băm như là một định danh duy nhất cho nội dung của tệp tin, do vậy
-ta có tên tệp tin được định danh bởi nội dung của nó. Phần khởi đầu `blob 6` đơn thuần
+Git sử dụng cách 'lấy nội dung để làm tên cho tập tin': tập tin không được lưu trữ như theo tên của chúng,
+mà bằng giá trị băm dữ liệu mà chúng chứa, trong tập tin chúng ta gọi là một 'đối tượng
+blob'. Chúng ta có thể nghĩ giá trị băm như là một định danh duy nhất cho nội dung của tập tin, do vậy
+ta có tên tập tin được định danh bởi nội dung của nó. Phần khởi đầu `blob 6` đơn thuần
chỉ là phần đầu để thể hiện kiểu của đối tượng và độ dài của nó tính bằng byte; việc làm này
làm đơn giản hóa việc vận hành bên trong Git.
-Đến đây tôi có thể dễ dàng đoán được bạn nghĩ gì. Tên của tệp tin là không thích hợp:
+Đến đây tôi có thể dễ dàng đoán được bạn nghĩ gì. Tên của tập tin là không thích hợp:
chỉ khi có dữ liệu bên trong được sử dụng để xây dựng nên đối tượng blob.
-Bạn có lẽ sẽ kinh ngạc với những gì xảy ra với các tệp tin có cùng nội dung. Hãy thử thêm một bản sao
-một tệp tin nào đó của bạn, với bất kỳ một cái tên nào cũng được. Nội dung của +.git/objects+ ở tại
+Bạn có lẽ sẽ kinh ngạc với những gì xảy ra với các tập tin có cùng nội dung. Hãy thử thêm một bản sao
+một tập tin nào đó của bạn, với bất kỳ một cái tên nào cũng được. Nội dung của +.git/objects+ ở tại
cùng một chỗ cho dù bạn thêm vào bao nhiêu lần đi chăng nữa. Git chỉ lưu giữ dữ liệu một lần duy nhất.
-Nhưng dẫu sao, các tệp tin nằm trong +.git/objects+ đã bị nén lại theo chuẩn zlib do vậy bạn
+Nhưng dẫu sao, các tập tin nằm trong +.git/objects+ đã bị nén lại theo chuẩn zlib do vậy bạn
không thể xem chúng một cách trực tiếp được. Đọc chúng thông qua
http://www.zlib.net/zpipe.c[zpipe -d], hay gõ:
@@ -99,24 +99,24 @@ lệnh này trình bày đối tượng được cho ở dạng dễ đọc trê
=== Đối Tượng Tree ===
-Nhưng mà tên tệp tin ở đâu? Chúng phải được lưu giữ ở đâu đó chứ.
-Git lấy tên tệp tin trong quá trình commit:
+Nhưng mà tên tập tin ở đâu? Chúng phải được lưu giữ ở đâu đó chứ.
+Git lấy tên tập tin trong quá trình commit:
$ git commit # Gõ chú thích.
$ find .git/objects -type f
-Bạn sẽ thấy ba đối tượng. Ở thời điểm này tôi không thể nói hai tệp tin mới này là cái gì, hãy nghĩ nó là một phần của tên tệp tin bạn đang xét. Chúng ta sẽ xuất phát từ giả định bạn chọn ``rose''. Nếu bạn không làm thế, bạn có thể viết lại lịch sử để làm cho nó giống như bạn đã làm thế:
+Bạn sẽ thấy ba đối tượng. Ở thời điểm này tôi không thể nói hai tập tin mới này là cái gì, hãy nghĩ nó là một phần của tên tập tin bạn đang xét. Chúng ta sẽ xuất phát từ giả định bạn chọn ``rose''. Nếu bạn không làm thế, bạn có thể viết lại lịch sử để làm cho nó giống như bạn đã làm thế:
$ git filter-branch --tree-filter 'mv YOUR_FILENAME rose'
$ find .git/objects -type f
-Bây giờ bạn có lẽ nhìn thấy tệp tin
+Bây giờ bạn có lẽ nhìn thấy tập tin
+.git/objects/05/b217bb859794d08bb9e4f7f04cbda4b207fbe9+, bởi vì đây là giá trị băm
SHA1 của nội dung của nó:
"tree" SP "32" NUL "100644 rose" NUL 0xaa823728ea7d592acc69b36875a482cdf3fd5c8d
-Xác thực tệp tin này chứa thông tin như trên bằng cách gõ:
+Xác thực tập tin này chứa thông tin như trên bằng cách gõ:
$ echo 05b217bb859794d08bb9e4f7f04cbda4b207fbe9 | git cat-file --batch
@@ -125,12 +125,12 @@ Với lệnh zpipe, ta có thể dễ dàng xác thực một giá trị băm:
$ zpipe -d < .git/objects/05/b217bb859794d08bb9e4f7f04cbda4b207fbe9 | sha1sum
Sự thẩm tra giá trị băm thì rắc rối hơn thông qua lệnh cat-file bởi vì phần kết xuất của nó chứa nhiều thông tin hơn
-đối tượng tệp tin thường không bị nén.
+đối tượng tập tin thường không bị nén.
-Tệp tin này là một đối tượng cây 'tree': một danh sách các hàng bao gồm kiểu tệp tin,
-tên tệp tin, và giá trị băm. Trong ví dụ của chúng ta, kiểu tệp tin là 100644, điều này
-có nghĩa `rose` là tệp tin bình thường, và giá trị băm là một đối tượng blob mà nó chứa
-nội dung của `rose'. Dạng tệp tin khác có thể là tệp tin thi hành, symlinks hay
+Tập tin này là một đối tượng cây 'tree': một danh sách các hàng bao gồm kiểu tập tin,
+tên tập tin, và giá trị băm. Trong ví dụ của chúng ta, kiểu tập tin là 100644, điều này
+có nghĩa `rose` là tập tin bình thường, và giá trị băm là một đối tượng blob mà nó chứa
+nội dung của `rose'. Dạng tập tin khác có thể là tập tin thực thi, liên kết mềm hay
các thư mục. Trong trường hợp cuối, giá trị băm sẽ chỉ đến đối tượng cây 'tree'.
Nếu bạn đã chạy lệnh filter-branch, bạn sẽ có các đối tượng cũ bạn không cần đến sau này nữa. Mặc dù
@@ -148,9 +148,9 @@ Git khác cũng đang thực thi cùng lúc, hay là mất điện đột ngột
Đại khái, refs có thể được xóa bằng lệnh *git update-ref -d*,
mặc dù thường thường nó an toàn hơn xóa +refs/original+ bằng tay.
-=== Lần Commit ===
+=== Commit ===
-Chúng tôi đã giảng giải cho bạn 2 trong số 3 đối tượng của Git. Cái thứ 3 chính là 'commit'. Nội dung
+Chúng tôi đã giảng giải cho bạn 2 trong số 3 đối tượng của Git. Cái thứ 3 chính là *commit*. Nội dung
của nó buộc chặt vào phần chú thích của lần commit cũng như thời gian, ngày tháng chúng được
tạo ra. Để cho khớp với những thứ chúng ta có ở đây, chúng ta sẽ phải chỉnh nó một chút:
@@ -182,9 +182,9 @@ sẽ luôn luôn chứa it nhất là một dòng chỉ định commit cha.
=== Khó Phân Biệt Được sự Thần Kỳ ===
-Bí mật của Git dường như có vẻ đơn giản. Nó giống như bạn có thể trộn lẫn cùng nhau một ít kịch bản và một ít mã C mà đun trong vài giờ: nhào trộn của quá trình hoạt động của hệ thống tệp tin và mã băm SHA1, bày biện thêm với các khóa và đồng bộ hóa tệp tin để tăng vị ngon. Trên thực tế, những mô tả như thế với Git các phiên bản trước kia là chính xác. Tuy nhiên, ngoài chiêu bài đóng gói để tiết kiệm không gian lưu trữ, sử dụng mục lục để tiết kiệm thời gian ra, giờ chúng ta còn biết thêm làm cách nào Git khéo léo thay đổi hệ thống tệp tin thành một cơ sở dữ liệu hoàn hảo cho việc quản lý mã nguồn.
+Bí mật của Git dường như có vẻ đơn giản. Nó giống như bạn có thể trộn lẫn cùng nhau một ít kịch bản và một ít mã C mà đun trong vài giờ: nhào trộn của quá trình hoạt động của hệ thống tập tin và mã băm SHA1, bày biện thêm với các khóa và đồng bộ hóa tập tin để tăng vị ngon. Trên thực tế, những mô tả như thế với Git các phiên bản trước kia là chính xác. Tuy nhiên, ngoài chiêu bài đóng gói để tiết kiệm không gian lưu trữ, sử dụng mục lục để tiết kiệm thời gian ra, giờ chúng ta còn biết thêm làm cách nào Git khéo léo thay đổi hệ thống tập tin thành một cơ sở dữ liệu hoàn hảo cho việc quản lý mã nguồn.
-Ví dụ, nếu một tệp tin bất kỳ nào đó trong đối tượng cơ sở dữ liệu bị sai hỏng bởi lỗi do ổ đĩa,
+Ví dụ, nếu một tập tin bất kỳ nào đó trong đối tượng cơ sở dữ liệu bị sai hỏng bởi lỗi do ổ đĩa,
thế thì giá trị băm tương ứng của nó sẽ không đúng nữa, điều này sẽ mang lại rắc rối cho chúng ta. Bằng
việc băm giá trị băm của đối tượng khác, chúng ta có thể duy trì tính toàn vẹn ở tất cả các mức. Commit
là hạt nhân, thật vậy đấy, mỗi lần commit không bao giờ ghi lại nửa vời: chúng ta có thể
@@ -193,22 +193,23 @@ lưu tất cả các đối tượng là trees, blobs và cha của các lần c
cơ sở dữ liệu không bị ảnh hưởng bởi các sự cố ngắt quãng bất ngờ như là mất điện đột ngột chẳng hạn.
Chúng ta có thể làm thất bại ngay cả những kẻ phá hoại ranh mãnh. Giả sử người nào đó lén lút
-sửa chữa nội dung của một tệp tin trong một phiên bản cũ của dự án. Để giữ đối tượng
+sửa chữa nội dung của một tập tin trong một phiên bản cũ của dự án. Để giữ đối tượng
cơ sở dữ liệu vẫn hoạt động tốt, họ đồng thời cũng phải thay đổi giá trị băm của
đối tượng blob tương ứng vì lẽ rằng nó bây giờ đã khác trước. Điều đó có nghĩa là
-họ sẽ phải thay đổi giá trị băm của một đối tượng tree có liên quan đến tệp tin,
+họ sẽ phải thay đổi giá trị băm của một đối tượng tree có liên quan đến tập tin,
và việc chỉnh sửa giá trị băm của tất cả các đối tượng commit kéo theo như là tree, thêm
nữa là các giá trị băm của toàn bộ các lần commit con cháu của nó. Cái này kéo theo
-giá trị băm của head tại trung tâm không giống với thứ đó tại kho chứa sai hỏng. Bằng cách
-theo dõi sự tương khớp giá trị băm chúng ta có thể xác định được tệp tin bị sai hỏng,
+giá trị băm của head tại kho trung tâm không giống với thứ đó tại kho chứa sai hỏng. Bằng cách
+theo dõi sự tương khớp giá trị băm chúng ta có thể xác định được tập tin bị sai hỏng,
cũng như là lần commit nơi mà nó lần đầu bị hư hỏng.
Nói ngắn gọn, dùng 20 byte để đại diện cho lần commit cuối là an toàn,
-nod không thể giả mạo với kho chứa Git.
+việc cố tình sửa đổi nội dung một kho chứa Git là điều không thể thực hiện được.
Đặc tính nào của Git là trứ danh nhất? Nhánh? Trộn? Hay Tags?
-Chỉ là chi tiết. Head hiện hành được giữ trong tệp tin +.git/HEAD+,
+Chỉ là chi tiết. Head hiện hành được giữ trong tập tin +.git/HEAD+,
mà nó có chứa giá trị băm của một đối tượng commit. Giá trị băm được cập nhật trong quá trình commit
-cũng như là một số lệnh khác. Nhánh đại thể cũng tương tự: chúng là các tệp tin trong thư mục
+cũng như là một số lệnh khác. Nhánh đại thể cũng tương tự: chúng là các tập tin trong thư mục
+.git/refs/heads+. Tags cũng thế: chúng ở tại +.git/refs/tags+ nhưng chúng
được cập nhật bởi các lệnh khác nhau.
+
diff --git a/vi/translate.txt b/vi/translate.txt
index 83bac720..918df238 100644
--- a/vi/translate.txt
+++ b/vi/translate.txt
@@ -1,14 +1,14 @@
-== Phụ lục B: Dịch Bản Hướng Dẫn Này ==
+== Phụ lục B: Dịch cuốn sách này ==
Tôi khuyến nghị các bạn làm theo các bước sau để thực hiện việc dịch thuật,
làm như vậy thì các đoạn kịch bản của tôi có thể
-nhanh chóng tạo ra các bản có định dạng HTML và PDF,
+nhanh chóng tạo ra các tài liệu ở định dạng HTML và PDF,
và tất cả các bản dịch có thể ở trong cùng một kho chứa.
Lấy một bản sao của mã nguồn, sau đó tạo một thư mục tương ứng với ngôn ngữ bạn dịch http://www.iana.org/assignments/language-subtag-registry[language's IETF tag]: xem tại
http://www.w3.org/International/articles/language-tags/Overview.en.php[the W3C article on internationalization].
Ví dụ, tiếng Anh là "en", Nhật là "ja", tiếng Trung Quốc Phồn thể là "zh-Hant".
-Trong thư mục mới đó, và dịch tệp tin +txt+ từ thư mục con "en".
+Trong thư mục mới đó, và dịch tập tin +txt+ từ thư mục con "en".
Một ví dụ cụ thể là để dịch phần hướng dẫn này thành ngôn ngữ http://en.wikipedia.org/wiki/Klingon_language[Klingon], bạn hãy gõ vào:
@@ -17,9 +17,9 @@ Một ví dụ cụ thể là để dịch phần hướng dẫn này thành ng
$ mkdir tlh # "tlh" là mã ngôn ngữ IETF dành cho Klingon.
$ cd tlh
$ cp ../en/intro.txt .
- $ edit intro.txt # Dịch tệp tin này.
+ $ edit intro.txt # Dịch tập tin này.
-và cứ như thế cho những tệp tin còn lại.
+và cứ như thế cho những tập tin còn lại.
Chỉnh sửa lại Makefile và thêm mã ngôn ngữ cho biến `TRANSLATIONS`.
Bạn có thể xem thử kết quả công việc của mình như sau:
@@ -27,6 +27,7 @@ Bạn có thể xem thử kết quả công việc của mình như sau:
$ make tlh
$ firefox book-tlh/index.html
-Hãy commit công việc của bạn thường xuyên, và cho tôi biết khi nào thì chúng sẵn sàng để sử dụng.
-GitHub.com có giao diện thuận lợi như sau: tạo nhánh cho dự án "gitmagic",
-push các thay đổi của bạn lên, sau đó thông báo với tôi để tôi trộn.
+Hãy chuyển giao công việc của bạn thường xuyên, và cho tôi biết khi nào thì chúng sẵn sàng để sử dụng.
+GitHub.com có giao diện thuận lợi như sau: rẽ nhánh dự án "gitmagic",
+'push' các thay đổi của bạn lên, sau đó thông báo với tôi để tôi trộn.
+
diff --git a/zh_cn/basic.txt b/zh_cn/basic.txt
index c6c23560..5e207075 100644
--- a/zh_cn/basic.txt
+++ b/zh_cn/basic.txt
@@ -11,7 +11,7 @@
$ git add .
$ git commit -m "My first backup"
-现在如果你的编辑乱了套,恢复之前的版本:
+现在如果你的编辑乱了套,恢复之前的版本可以使用:
$ git reset --hard
@@ -31,9 +31,9 @@
$ git rm kludge.h obsolete.c
$ git rm -r incriminating/evidence/
-这些文件如果还没删除,Git删除它们。
+这些文件如果还没被从系统中删除,Git将会删除它们。
-重命名文件和先删除旧文件,再添加新文件的一样。也有一个快捷方式 *git mv* ,和
+重命名文件同删除旧文件,并同时添加新文件一样。也有一个快捷方式 *git mv* ,和
*mv* 命令的用法一样。例如:
$ git mv bug.c feature.c
@@ -41,11 +41,11 @@
=== 进阶撤销/重做 ===
有时候你只想把某个时间点之后的所有改动都回滚掉,因为这些的改动是不正确的。那
-么:
+么使用这个命令:
$ git log
-来显示最近提交列表,以及他们的SHA1哈希值:
+来显示最近提交列表,以及查看他们的SHA1哈希值:
----------------------------------
commit 766f9881690d240ba334153047649b8b8f11c664
@@ -61,13 +61,13 @@ Date: Thu Jan 1 00:00:00 1970 +0000
Initial commit.
----------------------------------
-哈希值的前几个字符足够确定一个提交;也可以拷贝粘贴完整的哈希值,键入:
+哈希值的前几个字符足够确定一个提交;也可以拷贝粘贴完整的哈希值,输入:
$ git reset --hard 766f
来恢复到一个指定的提交状态,并从记录里永久抹掉所有比该记录新一些的提交。
-另一些时候你想简单地跳到一个旧状态。这种情况,键入:
+另一些时候你想简单地回朔到某一个旧状态。这种情况,键入:
$ git checkout 82f5
@@ -91,15 +91,15 @@ Date: Thu Jan 1 00:00:00 1970 +0000
一轮的较新状态。你现在打的所有游戏记录会在你刚进入的、代表另一个真实的分支
里。<>。
-你可以选择只恢复特定文件和目录,通过将其加在命令之后:
+你可以选择只恢复特定文件和目录,这将通过将其加在命令之后来实现:
$ git checkout 82f5 some.file another.file
-小心,这种形式的 *checkout* 会不声不响地覆盖文件。为阻止意外发生,在运行任何
+小心,这种形式的 *checkout* 会不声不响地覆盖当前文件。为防止意外发生,在运行任何
checkout命令之前做提交,尤其在初学Git的时候。通常,任何时候你觉得对运行某个命
令不放心,无论Git命令还是不是Git命令,就先运行一下 *git commit -a* 。
-不喜欢拷贝站题哈希值?那就用:
+不喜欢拷贝旧提交的哈希值?那就用:
$ git checkout :/"My first b"
@@ -114,19 +114,21 @@ checkout命令之前做提交,尤其在初学Git的时候。通常,任何时
$ git commit -a
$ git revert 1b6d
-讲撤销给定哈希值的提交。本撤销被记录为一个新的提交,你可以通过运行 *git log*
+将撤销给定哈希值的提交。本撤销被记录为一个新的提交,你可以通过运行 *git log*
来确认这一点。
=== 变更日志生成 ===
-一些项目要求生成变更日志http://en.wikipedia.org/wiki/Changelog[changelog]. 生
-成一个,通过键入:
+一些项目要求生成变更日志http://en.wikipedia.org/wiki/Changelog[changelog]. 若
+要生成一个变更日志,可以键入:
$ git log > ChangeLog
+来实现。
+
=== 下载文件 ===
-得到一个由Git管理的项目的拷贝,通过键入:
+得到一个由Git管理的项目的拷贝,则键入:
$ git clone git://server/path/to/files
@@ -143,13 +145,13 @@ checkout命令之前做提交,尤其在初学Git的时候。通常,任何时
$ git pull
-
+
=== 快速发布 ===
假设你写了一个脚本,想和他人分享。你可以只告诉他们从你的计算机下载,但如果此
-时你正在改进你的脚本,或加入试验性质的改动,他们下载了你的脚本,他们可能由此
-陷入困境。当然,这就是发布周期存在的原因。开发人员可能频繁进行项目修改,但他
-们只在他们觉得代码可以见人的时候才择时发布。
+时你正在改进你的脚本,或加入了试验性质的改动,他们下载了你的脚本,他们可能因
+此陷入困境。当然,这就是发布周期存在的原因。开发人员可能频繁进行项目修改,但
+他们只在他们觉得代码可以见人的时候才择时发布。
用Git来完成这项,需要进入你的脚本所在目录:
@@ -170,12 +172,12 @@ checkout命令之前做提交,尤其在初学Git的时候。通常,任何时
$ git commit -a -m "Next release"
-并且你的用户可以通过进入包含你脚本的目录,并键入下列命令,来更新他们的版本:
+而你的用户则可以进入包含你脚本的目录,并键入下列命令,来更新他们的版本:
$ git pull
-你的用户永远也不会取到你不想让他们看到的脚本版本。显然这个技巧对所有的东西都
-是可以,不仅是对脚本。
+你的用户永远也不会取到你不想让他们看到的脚本版本。显然这个技巧对所有代码库都
+适用,而不仅仅局限于脚本。
=== 我们已经做了什么? ===
@@ -198,8 +200,8 @@ checkout命令之前做提交,尤其在初学Git的时候。通常,任何时
我也经常用http://sourceforge.net/projects/qgit[qgit] 浏览历史, 因为他的图形界
面很养眼,或者 http://jonas.nitro.dk/tig/[tig] ,一个文本界面的东西,很慢的网
-络状况下也工作的很好。也可以安装web 服务器,运行 *git instaweb* ,就可以用任
-何浏览器浏览了。
+络状况下也可以工作的很好。也可以安装web 服务器,运行 *git instaweb* ,就可以用
+任意浏览器浏览了。
=== 练习 ===
@@ -208,7 +210,7 @@ checkout命令之前做提交,尤其在初学Git的时候。通常,任何时
至少有三个解决方案。假设我们在D:
- 1. A与B的差别是那些删除的文件。我们可以创建一个补丁代表这些差别,然后吧补丁
+ 1. A与B的差别是那些删除的文件。我们可以创建一个补丁代表这些差别,然后把补丁
打上:
$ git diff B A | git apply
diff --git a/zh_cn/branch.txt b/zh_cn/branch.txt
index b7d2f9e6..f3f7b3f7 100644
--- a/zh_cn/branch.txt
+++ b/zh_cn/branch.txt
@@ -2,13 +2,13 @@
即时分支合并是Git最给力的杀手锏。
-*问题* :外部因素要求必须切换场景。在发布版本中突然蹦出个严重缺陷。某个特性完
-成的截至日期就要来临。在项目关键部分可以提供帮助的一个开发正打算离职。所有情
-况逼迫你停下所有手头工作,全力扑到到这个完全不同的任务上。
+*问题* :外部因素要求必须切换场景。不如说,在发布版本中突然蹦出个严重缺陷;某
+个特性完成的截至日期就要来临;在项目关键部分可以提供帮助的一个开发正打算离
+职。所有情况逼迫你停下所有手头工作,全力扑到到这个完全不同的任务上。
-打断思维的连续性会使你的生产力大大降低,并且切换上下文也更麻烦,更大的损失。
-使用中心版本控制我们必须从中心服务器下载一个新的工作拷贝。分布式系统的情况就
-好多了,因为我们能够在本地克隆所需要的版本。
+打断思维的连续性会使你的生产力大大降低,并且切换上下文越麻烦,潜在的损失也越
+大。如果使用中心版本控制,我们就必须从中心服务器下载一个新的工作拷贝。分布式
+系统的情况就好多了,因为我们能够在本地克隆所需要的版本。
但是克隆仍然需要拷贝整个工作目录,还有直到给定点的整个历史记录。尽管Git使用文
件共享和硬链接减少了花费,项目文件自身还是必须在新的工作目录里重建。
@@ -32,7 +32,7 @@
$ git add .
$ git commit -m "Initial commit"
-我们已经创建了一个Git仓库,该仓库记录一个包含特定信息的文件。现在我们键入:
+我们已经创建了一个Git仓库,该仓库保存了一个包含特定信息的文件。现在我们键入:
$ git checkout -b boss # 之后似乎没啥变化
$ echo "My boss is smarter than me" > myfile.txt
@@ -129,7 +129,7 @@
=== 不间断工作流 ===
经常在硬件项目里,计划的第二步必须等第一步完成才能开始。待修的汽车傻等在车库
-里,直到特定的零件从工厂运来。一个原型在其可以构建之前,可能苦等芯片成型。
+里,直到特定的零件从工厂运来。一个原型在其可以构建之前,可能要苦等芯片成型。
软件项目可能也类似。新功能的第二部分不得不等待,直到第一部分发布并通过测试。
一些项目要求你的代码需要审批才能接受,因此你可能需要等待第一部分得到批准,才
@@ -166,8 +166,8 @@
$ git branch master HEAD~7 # 以七次前提交建一个新的“master”。
分支 `master` 只有第一部分内容,其他内容在分支 `part2` 。 我们现在后一个分支;
-我们创建了 `master` 分支还没有切换过去,因为我们想继续工作在 `part2` 。这是不
-寻常的。直到现在,我们已经在创建之后切换到分支,如:
+我们创建了 `master` 分支还没有切换过去,因为我们想继续在分支 `part2` 上工作。这
+是不寻常的。直到现在,我们已经在创建之后切换到分支,如:
$ git checkout HEAD~7 -b master # 创建分支,并切换过去。
@@ -232,5 +232,5 @@
格的用户。一些用户喜欢只保持一个打开的窗口,然后用标签浏览多个网页。一些可能
坚持另一个极端:任何地方都没有标签的多窗口。一些喜好处在两者之间。
-分支类似你工作目录的标签,克隆类似打开的浏览器新窗口。这些是本地操作很快,那
-为什么不试着找出最适合你的组合呢?Git让你按你确实所希望的那样工作。
+分支类似于你工作目录的标签,克隆则类似于打开的浏览器新窗口。这些是本地操作很
+快,那为什么不试着找出最适合你的组合呢?Git让你按你确实所希望的那样工作。
diff --git a/zh_cn/clone.txt b/zh_cn/clone.txt
index 1bcfece6..a45172ca 100644
--- a/zh_cn/clone.txt
+++ b/zh_cn/clone.txt
@@ -1,4 +1,4 @@
-== 克隆周边 ==
+== 克隆代码库 ==
在较老一代的版本控制系统里,checkout是获取文件的标准操作。你将获得一组特定保
存状态的文件。
@@ -43,12 +43,12 @@
$ git daemon --detach # 它也许已经在运行了
-对一些Git伺服服务,按照其指导来初始化空Git仓库。一般是在网页上填一个表单。
+对一些Git伺服服务,按照其提示来初始化空Git仓库。一般是在服务器网页上填写一个表单。
-把你的项目“推”到中心服务器:
+把你的项目“推送”到中心服务器:
$ git push central.server/path/to/proj.git HEAD
-捡出源码,可以键入:
+若要克隆源码,可以键入:
$ git clone central.server/path/to/proj.git
@@ -56,7 +56,7 @@
$ git commit -a
-更新到最近版本:
+更新到最新版本:
$ git pull
@@ -68,11 +68,11 @@
$ git push
-如果主服务器由于其他开发的活动,有了新的变更,这个捡入会失败,该开发应该把最
-新版本拿下来,解决合并冲突,然后重试。
+如果主服务器由于其他开发的活动,有了新的变更,这个推送将会失败,开发者应该把最
+新版本更新至本地机器,解决合并冲突,然后重试。
-为使用上面pull和push命令,开发必须有SSH访问权限。不过,通过键入以下命令,任何
-人都可以看到源码:
+为使用上面的pull和push命令,开发者必须有SSH访问权限。不过,通过键入以下命令,任
+何人都可以看到源码:
$ git clone git://central.server/path/to/proj.git
@@ -81,8 +81,8 @@ git协议禁止推操作。
=== 封闭源码 ===
-闭源项目不要执行touch命令,并确保你从未创建`git-daemon-export-ok`文件。资源库
-不再可以通过git协议获取;只有那些有SSH访问权限的人才能看到。如果你所有的资源
+闭源项目须避免执行touch命令,并确保你从未创建`git-daemon-export-ok`文件。资源
+库不再可以通过git协议获取;只有那些有SSH访问权限的人才能看到。如果你所有的资源
库都是封闭的,那也没必要运行运行git守护了,因为所有沟通都走SSH。
=== 裸仓库 ===
@@ -91,8 +91,9 @@ git协议禁止推操作。
的文件。换句话说,它维护项目历史,而且从不保存任何给定版本的快照。
裸仓库扮演的角色和中心版本控制系统中中心服务器的角色类似:你项目的中心。开
-发从其中克隆项目,捡入新近改动。典型地裸仓库存在一个服务器上,该服务器除了
-分散数据外并不做啥。开发活动发生在克隆上,因此中心仓库没有工作目录也行。
+发从其中克隆项目,检入新近改动。典型地裸仓库存在一个服务器上,该服务器除了
+分散数据外并不担负额外的任务。开发活动发生在克隆的代码库上,因此中心仓库没
+有工作目录也行。
很多Git命令在裸仓库上失败,除非指定仓库路径到环境变量`GIT_DIR`,或者指定
@@ -108,7 +109,7 @@ shell访问怎么办呢?
然而,除了这个案例,我们反对推进仓库,因为当目标有工作目录时,困惑随之而来。
-简短截说,学习Git的时候,只在目标是裸仓库的时候push,否则用pull的方式。
+简短来说,学习Git的时候,只在目标是裸仓库的时候使用push,否则用pull的方式。
=== 项目分叉 ===
@@ -124,12 +125,12 @@ shell访问怎么办呢?
=== 终极备份 ===
-会有很多散布在各处,禁止篡改的冗余存档吗? 如果你的项目有很多开发,那干脆啥也
-别做了。你的每份代码克隆是一个有效备份。不仅当前状态,还包括你项目整个历史。
-感谢哈希加密算法,如果任何人的克隆被损坏,只要他们与其他的交互,这个克隆就会
-被修好。
+需要制作很多散布在各处,并禁止篡改的冗余存档吗? 如果你的项目有很多开发者参
+与,那你并不需要再做什么了。每份代码克隆都是一个有效备份。它不仅包含当前代码
+库状态,也同时包含了项目的整个历史。多谢哈希加密算法,如果任何人的克隆库被损
+坏,只要其与其他克隆库交互,损坏的代码就会被显示出来。
-如果你的项目并不是那么流行,那就找尽可能多的伺服来放克隆吧。
+如果你的项目并不是那么流行,那就找尽可能多的伺服来存放克隆库吧。
真正的偏执狂应该总是把HEAD最近20字节的SHA1哈希值写到安全的地方。应该保证安全,
而不是把它藏起来。比如,把它发布到报纸上就不错,因为对攻击者而言,更改每份报
@@ -201,25 +202,25 @@ Mercurial是一个类似的的版本控制系统,几乎可以和Git一起无
Git项目以适应Git用户,然而感谢`hg-git`插件,一个Git项目自动地适应Mercurial用
户。
-尽管该插件可以把一个Mercurial仓库转成一个Git仓库,通过推到一个空的仓库,
-这个差事交给`hg-fast-export.sh`脚本还是更容易些。来自:
+尽管该插件可以把一个Mercurial仓库转成一个Git仓库,通过推送一个空仓库来实现,
+这个差事交给`hg-fast-export.sh`脚本来做还是更容易些。这个脚本来自:
$ git clone git://repo.or.cz/fast-export.git
-要转化,只需在一个空目录运行:
+如需转化,只需在一个空目录运行:
$ git init
$ hg-fast-export.sh -r /hg/repo
-注意该脚本应加入你的`$PATH`。
+注意,需要先将该脚本加入你的`$PATH`路径中,再执行以上命令行。
=== Bazaar ===
我们简略提一下Bazaar,它毕竟是紧跟Git和Mercurial之后最流行的自由分布式版本控
制系统。
-Bazaar有后来者的优势,它相对年轻些;它的设计者可以从前人的错误中学习,并且躲
-过去翻历史上犯过的错误。另外,它的开发人员对可移植性以及和与其它版本控制系统
+Bazaar有后来者的优势,它相对年轻些;它的设计者可以从前人的错误中学习,并且避免
+先行者在历史上犯过的错误。另外,它的开发人员对可移植性以及和与其它版本控制系统
的互操作性也考虑周全。
一个`bzr-git`插件让Bazaar用户在一定程度下可以工作在Git仓库。`tailor`程序转
@@ -229,14 +230,14 @@ Bazaar有后来者的优势,它相对年轻些;它的设计者可以从前
=== 我偏爱Git的原因 ===
我起先选择Git是因为我听说它能管理不可想象地不可管理的Linux内核源码。我从来没
-觉得有离开的必要。Git已经服侍的很好了,并且我也没有被其瑕疵所困扰。因为我主要
+觉得有离开的必要。Git已经工作的很好了,并且我也没有被其瑕疵所困扰。因为我主要
使用Linux,其他平台上的问题与我无关。
-还有,我偏爱C程序和bash脚本,以及诸如Python的可执行可脚本:较少依赖,并且我也
-沉迷于快速的执行时间。
+还有,我偏爱C程序和bash脚本,以及诸如Python的可执行可脚本:其代码依赖性较低,并
+且我也沉迷于快速的执行时间。
-我考虑过Git才能如何提高,甚至自己写类似的工具,但只作为研究练练手。即使完成这
-个项目,我也无论如何会继续使用Git,因为使用一个古里古怪的系统所获甚微。
+我考虑过Git如何才能提高,甚至自己写过类似的工具,但只作为学术研究练练手。即使我
+会完成这个项目,我也无论如何会继续使用Git,因为使用一个古里古怪的系统所获甚微。
-自然地,你的需求和期望可能不同,并且你可能使用另一个系统会好些。尽管如此,使
-用Git你都错不太远。
+自然地,你的需求和期望可能不同,并且你可能感觉使用另一个系统会好些。即便如此,使
+用Git你都不至于错太远。
diff --git a/zh_cn/drawbacks.txt b/zh_cn/drawbacks.txt
index 632df2d8..ccc70d9d 100644
--- a/zh_cn/drawbacks.txt
+++ b/zh_cn/drawbacks.txt
@@ -1,49 +1,50 @@
== 附录 A: Git的缺点 ==
有一些Git的问题,我已经藏在毯子下面了。有些可以通过脚本或回调方法轻易地解决,
-有些需要重组或重定义项目,少数剩下的烦恼,还只能等待。或者更好地,投入进来帮
-忙。
+有些需要重组或重定义项目,少数剩下的烦恼,还只能等待。或者更好地,你可以加入
+Git项目来帮忙。
=== SHA1 的弱点 ===
-随着时间的推移,密码学家发现越来越多的SHA1的弱点。已经发现对对资源雄厚的组织
-哈希冲撞是可能的。在几年内,或许甚至一个一般的PC也将有足够计算能力悄悄摧毁一
-个Git仓库。
+随着时间的推移,密码学家发现越来越多的SHA1的弱点。人们发现,对资源雄厚的组织
+而言,找到哈希冲突是可能的。在几年内,或许甚至一个一般的PC也将有足够计算能力
+悄悄摧毁一个Git仓库。
-希望在进一步研究摧毁SHA1之前,Git能迁移到一个更好的哈希算法。
+希望在进一步研究出摧毁SHA1的方法之前,Git能迁移到一个更好的哈希算法。
=== 微软 Windows ===
Git在微软Windows上可能有些繁琐:
-- http://cygwin.com/[Cygwin] ,, 一个Windows下的类Linux的环境,包含一个 http://cygwin.com/packages/git/[ 一个Git在Windows下的移植].
+- http://cygwin.com/[Cygwin] , 这是一个Windows下的类Linux的环境,其包含一
+ 个 http://cygwin.com/packages/git/[一个Git在Windows下的移植].
+
+- http://code.google.com/p/msysgit/[基于MSys的Git] 是另一个,要求最小运行
+ 时支持,不过一些命令不能马上工作。
-- http://code.google.com/p/msysgit/[基于MSys的Git] 是另一个,要求最小运行时支持,不过一些命令不能马上工作。
-
=== 不相关的文件 ===
-如果你的项目非常大,包含很多不相关的文件,而且正在不断改变,Git可能比其他系统
-更不管用,因为独立的文件是不被跟踪的。Git跟踪整个项目的变更,这通常才是有益的。
+如果你的项目非常大,包含很多不相关的文件,而且目录树在不断变更,Git可能比其他系统
+更不可靠,因为独立的文件是不被跟踪的。Git跟踪整个项目的变更,这通常才是有益的。
一个方案是将你的项目拆成小块,每个都由相关文件组成。如果你仍然希望在同一个资
源库里保存所有内容的话,可以使用 *git submodule* 。
=== 谁在编辑什么? ===
-一些版本控制系统在编辑前强迫你显示地用某个方法标记一个文件。尽管这种要求很烦
-人,尤其是需要和中心服务器通讯时,不过它还是有以下两个好处的:
+一些版本控制系统在编辑前会强迫你显示和用某个方法标记一个文件。尽管这种要求很烦
+人,尤其是需要和中心服务器通讯时。不过它还是有以下两个好处的:
- 1. 比较速度快,因为只有被标记的文件需要检查。
+ 1. 速度比较快,因为只有被标记的文件需要检查。
- 2. 可以知道谁在这个文件上工作,通过查询在中心服务器谁把这个文件标记为编辑状
- 态。
+ 2. 通过查询在中心服务器谁把这个文件标记为编辑状态,可以知道谁正在这个文件上工作。
-使用适当的脚本,你也可以使Git达到同样的效果。这要求程序员协同工作,当他编辑一
+使用适当的脚本,你也可以使Git达到同样的效果。但这要求程序员协同工作,当他编辑一
个文件的时候还要运行特定的脚本。
=== 文件历史 ===
-因为Git记录的是项目范围的变更,重造单一文件的变更历史比其他跟踪单一文件的版本
+因为Git记录的是项目范围内的变更,重造单一文件的变更历史比其他跟踪单一文件的版本
控制系统要稍微麻烦些。
好在麻烦还不大,也是值得的,因为Git其他的操作难以置信地高效。例如,`git
@@ -52,33 +53,23 @@ checkout`比`cp -a`都快,而且项目范围的delta压缩也比基于文件
=== 初始克隆 ===
-The initial cost is worth paying in the long run, as most future operations will then be fast and offline. However, in some situations, it may be preferable to create a shallow clone with the `--depth` option. This is much faster, but the resulting clone has reduced functionality.
-
当一个项目历史很长后,与在其他版本系统里的检出代码相比,创建一个克隆的开销会
大的多。
长远来看,开始付出的代价还是值得付出的,因为大多将来的操作将由此变得很快,并
-可以离线完成。然而,在一些情况下,使用`--depth`创建一个浅克隆比较划算些。这种
+可以离线完成。然而,在一些情况下,使用`--depth`创建一个浅层克隆比较划算些。这种
克隆初始化的更快,但得到克隆的功能有所削减。
=== 不稳定的项目 ===
-变更的大小决定写入的速度快慢是Git的设计。一般人做了小的改动就会提交新版本。这
-里一行臭虫修改,那里一个新功能,修改掉的注释等等。但如果你的文件在相邻版本之
-间存在极大的差异,那每次提交时,你的历史记录会以整个项目的大小增长。
-
-
-
-
-
-
-
-
+由变更的大小来决定写入的速度快慢是Git的特性。一般人做了小的改动就会提交新版
+本:这里修正一行错误,那里加一个新功能,或者修改注释等等。但如果你的文件在相邻
+版本之间存在极大的差异,那每次提交时,你的历史记录会随整个项目的大小增长。
-任何版本控制系统对此都束手无策,但标准的Git用户将遭受更多,因为一般来说,历史
-记录也会被克隆。
+任何版本控制系统对此都束手无策,但普通的Git用户将面对更多资源的消耗,因为一般
+来说,历史记录也会被克隆。
-应该检查一下变更巨大的原因。或许文件格式需要改变一下。小修改应该仅仅导致几个
+应该检查一下变更巨大的原因:或许文件格式需要改变一下。小修改应该仅仅导致几个
文件的细小改动。
或许,数据库或备份/打包方案才是正选,而不是版本控制系统。例如,版本控制就不适
@@ -89,26 +80,29 @@ The initial cost is worth paying in the long run, as most future operations will
Git工具就不能用了,并且修复必须以补丁的形式提交。这也许还不错,因为似乎没人需
要大幅度变化的不稳定文件历史。
-另一个例子是基于固件的项目,使用巨大的二进制文件形式。用户对固件文件的变化历
-史没有兴趣,更新的压缩比很低,因此固件修订将使仓库无谓的变大。
+另一个例子是基于固件的项目,因为要用到巨大的二进制文件形式。用户对固件文件的变
+化历史没有兴趣,更新的压缩比很低,因此固件修订将使仓库无谓的变大。
-这种情况,源码应该保存在一个Git仓库里,二进制文件应该单独保存。为了简化问题,
-应该发布一个脚本,使用Git克隆源码,对固件只做同步或Git浅克隆。
+这种情况下,源码应该保存在一个Git仓库里,但二进制文件应该单独保存。为了简化问题,
+应该发布一个脚本,使用Git克隆源码,并对固件只做同步或Git浅层克隆。
=== 全局计数器 ===
-一些中心版本控制系统维护一个正整数,当一个新提交被接受的时候这个整数就增长。Git则是通过哈希值来记录所有变更,这在大多数情况下都工作的不错。
+一些中心版本控制系统都会维护一个正整数,当一个新提交被接受的时候这个整数就增
+长。Git则是通过哈希值来记录所有变更,这在大多数情况下都工作的不错。
-但一些人喜欢使用整数的方法。幸运的是,很容易就可以写个脚本,这样每次更新,中心Git仓库就增大这个整数,或使用tag的方式,把最新提交的哈希值与这个整数关联起来。
+但一些人喜欢使用整数的方法。幸运的是,很容易就可以写个脚本,这样每次更新,中
+心Git仓库就增大这个整数,或使用tag的方式,把最新提交的哈希值与这个整数关联起来。
-每个克隆都可以维护这么个计数器,但这或许没什么用,因为只有中心仓库以及它的计数器对每个人才有意义。
+每个克隆都可以维护这么个计数器,但这或许没什么用,因为只有中心仓库以及它的计数器
+对每个人才有意义。
=== 空子目录 ===
-空子目录不可加入管理。可以通过创建一个空文件以绕过这个问题。
+空子目录不可加入管理。但可以通过创建一个空文件以绕过这个问题。
Git的当前实现,而不是它的设计,是造成这个缺陷的原因。如果运气好,一旦Git得到
-更多关注,更多用户要求这个功能,这个功能就会被实现。
+更多关注,并其有更多用户要求这个功能,这个功能就会被实现。
=== 初始提交 ===
@@ -125,7 +119,7 @@ Git将从定义零提交中受益:一旦一个仓库被创建起来,HEAD将
每个初始提交都隐式地成为这个零提交的后代。
不幸的是还有更糟糕的情况。如果把几个具有不同初始提交的分支合并到一起,之后的
-重新修订不可避免的需要人员的介入。
+重新修订不可避免的将需要人员的介入。
=== 接口怪癖 ===
diff --git a/zh_cn/grandmaster.txt b/zh_cn/grandmaster.txt
index 710e7598..4803b8ba 100644
--- a/zh_cn/grandmaster.txt
+++ b/zh_cn/grandmaster.txt
@@ -1,25 +1,26 @@
== Git大师技 ==
到现在,你应该有能力查阅 *git help* 页,并理解几乎所有东西。然而,查明解决特
-定问题需要的确切命令可能是乏味的。或许我可以省你点功夫:以下是我过去曾经需要
-的一些食谱。
+定问题需要的确切命令可能是乏味的。或许我可以省你点功夫:以下是我过去曾经用到
+的一些技巧。
=== 源码发布 ===
-就我的项目而言,Git完全跟踪了我想打包并发布给用户的文件。创建一个源码包,我运
-行:
+就我的项目而言,Git完全跟踪了我想打包并发布给用户的文件。如需创建一个源码包,我
+会运行:
$ git archive --format=tar --prefix=proj-1.2.3/ HEAD
=== 提交变更 ===
-对特定项目而言,告诉Git你增加,删除和重命名了一些文件很麻烦。而键入如下命令会容易的多:
+对特定项目而言,告诉Git你增加,删除和重命名了一些文件很麻烦。而键入如下命令会容易
+的多:
$ git add .
$ git add -u
-Git将查找当前目录的文件并自己算出具体的情况。除了用第二个add命令,如果你也打
-算这时提交,可以运行`git commit -a`。关于如何指定应被忽略的文件,参见 *git
+Git将查找当前目录的文件并计算出所有更改过的内容。除了第二个add命令,如果你也打
+算同时提交,则可以运行`git commit -a`。关于如何指定应被忽略的文件,参见 *git
help ignore* 。
你也可以用一行命令完成以上任务:
@@ -27,28 +28,28 @@ help ignore* 。
$ git ls-files -d -m -o -z | xargs -0 git update-index --add --remove
这里 *-z* 和 *-0* 选项可以消除包含特殊字符的文件名引起的不良副作用。注意这个
-命令也添加应被忽略的文件,这时你可能需要加上 `-x` 或 `-X` 选项。
+命令也会添加本应被忽略的文件,这时你可能需要加上 `-x` 或 `-X` 选项。
=== 我的提交太大了! ===
-是不是忽视提交太久了?痴迷地编码,直到现在才想起有源码控制工具这回事?提交一
-系列不相关的变更,因为那是你的风格?
+是不是忽略提交太久了?一直痴迷于写代码,直到现在才想起有源码控制工具这回事?或者
+提交一系列不相关的变更,因为你更喜欢这么做?
别担心,运行:
$ git add -p
-为你做的每次修改,Git将展示给你变动的代码,并询问该变动是否应是下一次提交的一
-部分。回答“y”或者“n”。也有其他选项,比如延迟决定;键入“?”来学习更多。
+对你做过的每次修改,Git都将展示变动过的代码,并询问该变动是否应是下一次提交的一
+部分。回答“y”或者“n”。当然也有其他选项,比如延迟决定;键入“?”来学习更多。
一旦你满意,键入
$ git commit
-来精确地提交你所选择的变更(阶段变更)。确信你没加上 *-a* 选项,否则Git将提交
+来精确地提交你所选择的变更(阶段变更)。注意请勿加上 *-a* 选项,否则Git将提交
所有修改。
-如果你修改了许多地方的许多文件怎么办?一个一个地查看变更令人沮丧,心态麻木。
+如果你修改了许多地方的许多文件怎么办?一个一个地查看这些变更会令人沮丧,心态麻木。
这种情况下,使用 *git add -i* , 它的界面不是很直观,但更灵活。敲几个键,你可
以一次决定阶段或非阶段性提交几个文件,或查看并只选择特定文件的变更。作为另一
种选择,你还可以运行 *git commit --interactive* ,这个命令会在你操作完后自动
@@ -56,8 +57,8 @@ help ignore* 。
=== 索引:Git的中转区域 ===
-当目前为止,我们已经忽略Git著名的'索引‘概念,但现在我们必须面对它,以解释上
-面发生的。索引是一个临时中转区。Git很少在你的项目和它的历史之间直接倒腾数据。
+当目前为止,我们一直在忽略Git著名的“索引”概念,但现在我们必须面对它,以解释上
+面发生的事情。索引是一个临时中转区。Git很少在你的项目和它的历史之间直接倒腾数据。
通常,Git先写数据到索引,然后拷贝索引中的数据到最终目的地。
例如, *commit -a* 实际上是一个两步过程。第一步把每个追踪文件当前状态的快照放
@@ -66,16 +67,16 @@ help ignore* 。
通常我们可以忽略索引并假装从历史中直接读并直接写。在这个情况下,我们希望更好
地控制,因此我们操作索引。我们放我们变更的一些的快照到索引中,而不是所有的,
-然后永久地记录这个小心操纵的快照。
+然后永久地记录这个被小心操纵的快照。
=== 别丢了你的HEAD ===
-HEAD好似一个游标,通常指向最新提交,随最新提交向前移动。一些Git命令让你来移动
+HEAD好似一个游标,通常指向最新提交,随最新提交向前移动。一些Git命令可让你来移动
它。 例如:
$ git reset HEAD~3
-将立即向回移动HEAD三个提交。这样所有Git命令都表现得好似你没有做那最后三个提交,
+这将立即将HEAD向回移动三个提交。这样所有Git命令都表现得好似你没有做那最后三个提交,
然而你的文件保持在现在的状态。具体应用参见帮助页。
但如何回到将来呢?过去的提交对将来一无所知。
@@ -84,27 +85,25 @@ HEAD好似一个游标,通常指向最新提交,随最新提交向前移动
$ git reset 1b6d
-但假设你从来没有记下呢?别担心,像这些命令,Git保存原先的Head为一个叫
-ORGI_HEAD的标记,你可以安全体面的返回:
+但假设你从来没有记下呢?别担心,在这些命令里面,Git会将原先的Head保存为一个叫做
+ORIG_HEAD的标记,你可以安全体面的返回那里:
$ git reset ORIG_HEAD
=== HEAD捕猎 ===
-或许ORG_HEAD不够。或许你刚认识到你犯了个历史性的错误,你需要回到一个早已忘记
+或许ORIG_HEAD还不够;或许你刚认识到你犯了个历史性的错误,你需要回到一个早已忘记
分支上一个远古的提交。
-默认,Git保存一个提交至少两星期,即使你命令Git摧毁该提交所在的分支。难点是找
-到相应的哈希值。你可以查看在.git/objects里所有的哈希值并尝试找到你期望的。但
-有一个更容易的办法。
+默认的,Git将会将一个提交保存至少两星期,即使你命令Git摧毁该提交所在的分支。难点
+是找到相应的哈希值。你可以查看在.git/objects里所有的哈希值并尝试找到你期望的提
+交。但这里有一个更简单的办法。
Git把算出的提交哈希值记录在“.git/logs”。这个子目录引用包括所有分支上所有活
动的历史,同时文件HEAD显示它曾经有过的所有哈希值。后者可用来发现分支上一些不
小心丢掉提交的哈希值。
-The reflog command provides a friendly interface to these log files. Try
-
-命令reflog为访问这些日志文件提供友好的接口,试试
+命令reflog为访问这些日志文件提供了友好的接口,可以试试
$ git reflog
@@ -122,7 +121,7 @@ The reflog command provides a friendly interface to these log files. Try
$ git config gc.pruneexpire "30 days"
-意思是一个被删除的提交会在删除30天后,且运行 *git gc* 以后,被永久丢弃。
+意思是一个被删除的提交会在删除30天并运行 *git gc* 以后,被永久丢弃。
你或许还想关掉 *git gc* 的自动运行:
@@ -152,21 +151,21 @@ Git命令它们自己就是站在巨人肩膀上的脚本。通过一点修补
$ git symbolic-ref HEAD 2> /dev/null | cut -b 12-
-子目录 +contrib+ 是一个基于Git工具的宝库。它们中的一些时时会被提升为官方命令。
-在Debian和Ubuntu,这个目录位于 +/usr/share/doc/git-core/contrib+ 。
+子目录 +contrib+ 是一个基于Git工具的宝库。它们中的一些命令不时的会被提升为官方
+命令。在Debian和Ubuntu,这个目录位于 +/usr/share/doc/git-core/contrib+ 。
一个受欢迎的居民是 +workdir/git-new-workdir+ 。通过聪明的符号链接,这个脚本创
建一个新的工作目录,其历史与原来的仓库共享:
$ git-new-workdir an/existing/repo new/directory
-这个新的目录和其中的文件可被视为一个克隆,除了既然历史是共享的,两者的树自动
-保持同步。不必合并,推入或拉出。
+这个新的目录和其中的文件可被视为一个克隆,除了历史是共享的,两者的树会自动保持
+同步,而不必合并,推入或拉出。
=== 大胆的特技 ===
-这些天,Git使得用户意外摧毁数据变得更困难。但如若你知道你在做什么,你可以突破
-为通用命令所设的防卫保障。
+最近以来,Git努力使用户因意外而销毁数据变得更困难。但如若你知道你在做什么,你可
+以突破为通用命令所设的保障措施。
*Checkout*:未提交的变更会导致捡出失败。销毁你的变更,并无论如何都checkout一
个指定的提交,使用强制标记:
@@ -184,16 +183,17 @@ Git命令它们自己就是站在巨人肩膀上的脚本。通过一点修补
$ git branch -D dead_branch # instead of -d
-类似,通过移动试图覆盖分支,如果随之而来有数据丢失,也会失败。强制移动分支,键入:
+类似,通过移动试图覆盖分支,如果随之而来有数据丢失,那么覆盖也会失败。强制移动
+分支,键入:
$ git branch -M source target # 而不是 -m
-不像checkout和重置,这两个命令延迟数据销毁。这个变更仍然存储在.git的子目录里,
+不像checkout和重置,这两个命令将延迟数据销毁。这个变更仍然存储在.git的子目录里,
并且可以通过恢复.git/logs里的相应哈希值获取(参见上面 上面“HEAD猎捕”)。默
认情况下,这些数据会保存至少两星期。
*Clean*: 一些Git命令拒绝执行,因为它们担心会重装未纳入管理的文件。如果你确信
- 所有未纳入管理的文件都是消耗,那就无情地删除它们,使用:
+ 所有未纳入管理的文件都是消耗品,那就无情地删除它们,使用:
$ git clean -f -d
@@ -201,8 +201,8 @@ Git命令它们自己就是站在巨人肩膀上的脚本。通过一点修补
=== 阻止坏提交 ===
-愚蠢的错误污染我的仓库。最可怕的是由于忘记 *git add* 而引起的文件丢失。较小
-的罪过是行末追加空格并引起合并冲突:尽管危害少,我希望浙西永远不要出现在公开
+愚蠢的错误会污染我的代码库。最可怕的是由于忘记 *git add* 而引起的文件丢失。较小
+的错误则是行末追加空格而引发合并冲突:尽管危害少,我希望这些永远不要出现在公开
记录里。
不过我购买了傻瓜保险,通过使用一个_钩子_来提醒我这些问题:
@@ -210,7 +210,7 @@ Git命令它们自己就是站在巨人肩膀上的脚本。通过一点修补
$ cd .git/hooks
$ cp pre-commit.sample pre-commit # 对旧版本Git,先运行chmod +x
-现在Git放弃提交,如果检测到无用的空格或未解决的合并冲突。
+现在如果Git检测到无用的空格或未解决的合并冲突,它将放弃合并。
对本文档,我最终添加以下到 *pre-commit* 钩子的前面,来防止缺魂儿的事:
@@ -219,8 +219,7 @@ Git命令它们自己就是站在巨人肩膀上的脚本。通过一点修补
exit 1
fi
-几个git操作支持钩子;参见 *git help hooks* 。我们早先激活了作为例子的
+一部分其他的Git操作也支持钩子;参见 *git help hooks* 。我们早先激活了作为例子的
*post-update* 钩子,当讨论基于HTTP的Git的时候。无论head何时移动,这个钩子都会
-运行。例子脚本post-update更新Git在基于Git并不知晓的传输协议,诸如HTTP,通讯时
-所需的文件。
-
+运行。例子中的脚本post-update会在Git面对并不知晓的传输协议,诸如HTTP时,更新自己的
+资料库,以确保它有能力交换所需的文件。
diff --git a/zh_cn/history.txt b/zh_cn/history.txt
index 93526a56..e3423293 100644
--- a/zh_cn/history.txt
+++ b/zh_cn/history.txt
@@ -2,9 +2,9 @@
Git分布式本性使得历史可以轻易编辑。但你若篡改过去,需要小心:只重写你独自拥有
的那部分。正如民族间会无休止的争论谁犯下了什么暴行一样,如果在另一个人的克隆
-里,历史版本与你的不同,当你们的树互操作时,你会遇到一致性方面的问题。
+里,历史版本与你的不同,当你们的树互操作时,你们会遇到一致性方面的问题。
-一些开发人员强烈地感觉历史应该永远不变,不好的部分也不变所有都不变。另一些觉
+一些开发人员强烈地感到历史应该永远不变,不好的部分也不变,所有都不变。另一些觉
得代码树在向外发布之前,应该整得漂漂亮亮的。Git同时支持两者的观点。像克隆,分
支和合并一样,重写历史只是Git给你的另一强大功能,至于如何明智地使用它,那是你
的事了。
@@ -24,35 +24,51 @@ Git分布式本性使得历史可以轻易编辑。但你若篡改过去,需
=== 更复杂情况 ===
-假设前面的问题还要糟糕十倍。在漫长的时间里我们提交了一堆。但你不太喜欢他们的
+假设上面的问题再糟糕十倍,比如在漫长的时间里我们提交了一堆,但你不太喜欢他们的
组织方式,而且一些提交信息需要重写。那么键入:
$ git rebase -i HEAD~10
-并且后10个提交会出现在你喜爱的$EDITOR。一个例子:
+则最后的10个提交会出现在你喜爱的$EDITOR(即通过设置EDITOR环境变量决定使用哪个
+文本编辑器)。一个例子:
pick 5c6eb73 Added repo.or.cz link
pick a311a64 Reordered analogies in "Work How You Want"
pick 100834f Added push target to Makefile
-之后:
+不像git log,列表中的提交是旧的在前,新的在后。在上面的列表中,5c6eb73是最老的
+提交,100834是最新的提交。接下来可以在$EDITOR中:
- 通过删除行来移去提交。
-- 通过为行重新排序行来重新排序提交。
-- 替换 `pick` 使用:
+- 通过对几行记录重新排序,来重组提交顺序。
+- 替换 `pick` 命令:
* `edit` 标记一个提交需要修订。
* `reword` 改变日志信息。
- * `squash` 将一个提交与其和前一个合并。
- * `fixup` 将一个提交与其和前一个合并,并丢弃日志信息。
+ * `squash` 将一个提交与其前一个合并。
+ * `fixup` 将一个提交与其前一个合并,并丢弃日志信息。
-保存退出。如果你把一个提交标记为可编辑,那么运行
+比如,将第二个提交的`pick`修改为`squash`:
+ pick 5c6eb73 Added repo.or.cz link
+ squash a311a64 Reordered analogies in "Work How You Want"
+ pick 100834f Added push target to Makefile
- $ git commit --amend
+保存退出,则Git会把a311a64合并进5c6eb73。想象一下“挤压”动作,squash的作用就是
+把一个提交“挤压”进前一个提交。
-否则,运行:
+“挤压”的同时,Git合并了两个提交的日志信息供编辑。比较一下*fixup*命令,其直接
+扔掉“挤压“后合并的日志信息。
+
+如果你把一个提交标记为*edit*,Git会带你回到这个提交点,你可以修改当时的提交信息
+,甚至可以增加新的提交。修改完毕后执行:
$ git rebase --continue
+直到遇到下一个*edit*标记点,Git会回放所有遇到的提交。
+
+也可以放弃修改:
+
+ $ git rebase --abort
+
这样尽早提交,经常提交:你之后还可以用rebase来规整。
=== 本地变更之后 ===
@@ -61,7 +77,7 @@ Git分布式本性使得历史可以轻易编辑。但你若篡改过去,需
与官方版本同步。在你准备好提交到中心分支之前,这个循环会重复几次。
但现在你本地Git克隆掺杂了你的改动和官方改动。你更期望在变更列表里,你所有的变
-更能够连续。
+更能够连续列出。
这就是上面提到的 *git rebase* 所做的工作。在很多情况下你可以使用 *--onto* 标
记以避免交互。
@@ -69,9 +85,12 @@ Git分布式本性使得历史可以轻易编辑。但你若篡改过去,需
另外参见 *git help rebase* 以获取这个让人惊奇的命令更详细的例子。你可以拆分提
交。你甚至可以重新组织一棵树的分支。
+要小心的是,rebase指令非常强悍,对于复杂的rebase,最好首先使用*git clone*备份
+一下。
+
=== 重写历史 ===
-偶尔,你需要做一些代码控制,好比从正式的照片中去除一些人一样,需要从历史记录
+偶尔,你需要做一些代码控制——好比从正式的照片中去除一些人一样——你需要从历史记录
里面彻底的抹掉他们。例如,假设我们要发布一个项目,但由于一些原因,项目中的某
个文件不能公开。或许我把我的信用卡号记录在了一个文本文件里,而我又意外的把它
加入到了这个项目中。仅仅删除这个文件是不够的,因为从别的提交记录中还是可以访
@@ -82,10 +101,10 @@ Git分布式本性使得历史可以轻易编辑。但你若篡改过去,需
参见 *git help filter-branch* ,那里讨论了这个例子并给出一个更快的方法。一般
地, *filter-branch* 允许你使用一个单一命令来大范围地更改历史。
-此后,+.git/refs/original+目录描述操作之前的状态。检查命令filter-branch的确做
-了你想要做的,然后删除此目录,如果你想运行多次filter-branch命令。
+此后,+.git/refs/original+目录描述操作之前的状态。检查命令 *filter-branch* 的
+确做了你想要做的,然后删除此目录,如果你想运行多次filter-branch命令。
-最后,用你修订过的版本替换你的项目克隆,如果你想之后和它们交互的话。
+最后,如果你想之后和修订过的版本交互的话,记得用你修订过的版本替换你的项目克隆。
=== 制造历史 ===
@@ -143,9 +162,9 @@ EOT
$ git checkout master .
-命令*git fast-export* 转换任意仓库到 *git fast-import* 格式,你可以研究其输
-出来写导出程序, 也以可读格式传送仓库。的确,这些命令可以发送仓库文本文件
-通过只接受文本的渠道。
+命令*git fast-export* 可将任意仓库转换成 *git fast-import* 格式,你可以研究其输
+出来写新的导出程序, 或以人类可以理解的格式转移仓库。的确,这些命令可以通过只接受文
+本的渠道来发送仓库文件。
=== 哪儿错了? ===
@@ -200,24 +219,22 @@ Git使用指定命令(通常是一个一次性的脚本)的返回值来决
中心系统排斥离线工作,也需要更昂贵的网络设施,特别是当开发人员增多的时候。最
重要的是,所有操作都一定程度变慢,一般在用户避免使用那些能不用则不用的高级命
令时。在极端的情况下,即使是最基本的命令也会变慢。当用户必须运行缓慢的命令的
-时候,由于工作流被打断,生产力降低。
+时候,由于工作流被打断,生产力就会降低。
-我有这些的一手经验。Git是我使用的第一个版本控制系统。我很快学会适应了它,用了
-它提供的许多功能。我简单地假设其他系统也是相似的:选择一个版本控制系统应该和
-选择一个编辑器或浏览器没啥两样。
+我有这方面的一手经验。Git是我使用的第一个版本控制系统。我很快学会适应了它,并
+使用了它提供的许多功能。我简单地假设其他系统也是相似的:选择一个版本控制系统应
+该和选择一个编辑器或浏览器没啥两样。
-在我之后被迫使用中心系统的时候,我被震惊了。我那有些脆弱的网络没给Git带来大麻
-烦,但是当它需要像本地硬盘一样稳定的时候,它使开发困难重重。另外,我发现我自
-己有选择地避免特定的命令,以避免踏雷,这极大地影响了我,使我不能按照我喜欢的
-方式工作。
+在我之后被迫使用中心系统的时候,我被震惊到了。我那有些脆弱的网络没给Git带来
+大麻烦,但是当它需要像本地硬盘一样稳定工作的时候,它使开发变得困难重重。另
+外,我发现我自己有选择地避免使用特定的命令,以避免踏雷,这极大地影响了我,使
+我不能按照我喜欢的方式工作。
-当我不得不运行一个慢的命令的时候,这种等待极大地破坏了我思绪连续性。在等待服
-务器通讯完成的时候,我选择做其他的事情以度过这段时光,比如查看邮件或写其他的
-文档。当我返回我原先的工作场景的时候,这个命令早已结束,并且我还需要浪费时间
-试图记起我之前正在做什么。人类不擅长场景间的切换。
+当我不得不运行一个速度缓慢的命令时,这种等待极大地破坏了我思绪的连续性。在等
+待服务器通讯完成的时候,我选择做其他的事情以度过这段时光,比如查看邮件或写其
+他的文档。当我返回我原先的工作场景的时候,这个命令早已结束,并且我还需要浪费
+时间试图记起我之前正在做什么。人类并不擅长场景间的切换。
还有一个有意思的大众悲剧效应:预料到网络拥挤,为了减少将来的等待时间,每个人
-将比以往消费更多的带宽在各种操作上。共同的努力加剧了拥挤,这等于是鼓励个人下
-次消费更多带宽以避免更长时间的等待。
-
-
+将比以往消费更多的带宽在各种操作上。大家共同的努力结果加剧了拥挤,这等于是鼓
+励个人下次消费更多带宽以避免更长的等待时间。
diff --git a/zh_cn/intro.txt b/zh_cn/intro.txt
index 905b10c8..5b170acd 100644
--- a/zh_cn/intro.txt
+++ b/zh_cn/intro.txt
@@ -1,15 +1,15 @@
== 入门 ==
-我将用类比方式来介绍版本控制的概念。更严谨的解释参见
+我将用类比的方式来介绍版本控制的概念。更严谨的解释参见
http://en.wikipedia.org/wiki/Revision_control[维基百科版本修订控制条目]。
=== 工作是玩 ===
-我从小就玩电脑游戏。相反,我只是在长大后才开始使用版本控制系统。我想我并不特
-殊,并且,对比两者工作方式可使这些概念更易解释,也易于理解。
+我从小就玩电脑游戏,直到今天;不过我只是在长大后才开始使用版本控制系统。我
+想我并不是个例,所以拿两者工作方式进行类比,可使一些概念更易解释,也易于理解。
-编写代码,或编辑文档和玩游戏差不多。在你做出了很多进展之后,你最好保存一下。
-去做这个,会点击你所信任的编辑器保存按钮就好了。
+编写代码,或编辑文档,和玩游戏差不多。在你做出了很多进展之后,你最好保存一下。
+要做到这点,点击你所信任的编辑器保存按钮就好了。
但这将覆盖老版本。就像那些学校里玩的老游戏,只有一个存档:你确实可以保存,但
你不能回到更老的状态了。这真让人扫兴,因为那个状态可能恰好保存了这个游戏特别
@@ -19,8 +19,9 @@ http://en.wikipedia.org/wiki/Revision_control[维基百科版本修订控制条
=== 版本控制 ===
在编辑的时候,如果想保留旧版本,你可以将文件“另存为”一个不同的文件,或在保
-存之前将文件拷贝到别处。你可能压缩这些文件以节省空间。这是一个初级的靠手工的
-版本控制方式。游戏软件早就提高了这块,很多都提供多个基于时间戳的自动存档槽。
+存之前将文件拷贝到别处。你可能会压缩这些文件以节省空间。这是一个初级的依赖
+手工进行的版本控制方式。游戏软件在这块早就做了很多提高,很多游戏都提供基于
+时间戳的多个存档槽。
让我们看看稍稍复杂的情况。比如你有很多放在一起的文件,比如项目源码,或网站文
件。现在如你想保留旧版本,你不得不把整个目录存档。手工保存多个版本很不方便,
@@ -29,38 +30,38 @@ http://en.wikipedia.org/wiki/Revision_control[维基百科版本修订控制条
在一些电脑游戏里,一个存档真的包含在一个充满文件的目录里。这些游戏为玩家屏蔽
了这些细节,并提供一个方便易用的界面来管理该目录的不同版本。
-版本控制系统也没有两样。两者提供友好的界面,来管理目录里的东西。你可以频繁保
-存,也可以之后加载任一保存。不像大多计算机游戏,版本控制系统通常精于节省存储
-空间。一般情况如果两个版本间只有少数文件的变更,每个文件的变更也不大,那就只
-存储差异的部分,而不是把全部拷贝的都保存下来,以节省存储空间。
+版本控制系统也没有不同。两者提供友好的用户界面,来管理目录里的东西。你可以频
+繁保存,也可以之后加载任一存档。不像大多数计算机游戏,版本控制系统通常精于节
+省存储空间。一般情况下,如果两个版本间只有少数文件的变更,每个文件的变更也不
+大,那就只存储差异的部分,而不是把全部拷贝的都保存下来,以节省存储空间。
=== 分布控制 ===
现在设想一个很难的游戏。太难打了,以至于世界各地很多骨灰级玩家决定组队,分享
-他们游戏存档以攻克它。Speedrun们就是实际中的例子:在同一个游戏里,玩家们分别
+他们游戏存档以攻克它。Speedrun就是现实中的例子:在同一个游戏里,玩家们分别
攻克不同的等级,协同工作以创造惊人战绩。
你如何搭建一个系统,使得他们易于得到彼此的存档?并易于上载新的存档?
在过去,每个项目都使用中心式版本控制。某个服务器上放所有保存的游戏记录。其他
-人就不用了。每个玩家在他们机器上最多保留几个游戏记录。当一个玩家想更新进度时
-候,他们需要把最新进度从主服务器下载下来,玩一会儿,保存并上载到主服务器以供
-其他人使用。
+人就不用再做备份了。每个玩家在他们机器上最多保留几个游戏记录。当一个玩家想更
+新至最新进度时候,他们需要把这个进度从主服务器下载下来,玩一会儿,保存并上载
+到主服务器以供其他人使用。
-假如一个玩家由于某种原因,想得到一个较旧版本的游戏进度怎么样?或许当前保存的
+假如一个玩家由于某种原因,想得到一个较旧版本的游戏进度该怎么办?或许当前保存的
游戏是一个注定的败局,因为某人在第三级忘记捡某个物品;他们希望能找到最近一个
可以完成的游戏记录。或者他们想比较两个旧版本间的差异,来估算某个特定玩家干了
多少活。
-查看旧版本的理由有很多,但检查的办法都是一样的。他们必须去问中心服务器要那个
+查看旧版本的理由有很多,但检查的办法都是一样的。他们必须去中心服务器索要那个
旧版本的记录。需要的旧版本越多,和服务器的交互就越多。
-新一代的版本控制系统,Git就是其中之一,是分布式的,可以被认作广义上的中心式系
-统。从主服务器下载时玩家会得到所有保存的记录,而不仅是最新版。这看起来他们好
-像把中心服务器做了个镜像。
+Git是新一代的版本控制系统中的一员,它的特点是分布式的,广义上也可以被看作是一
+种中心式系统。从主服务器下载时,玩家会得到所有保存的记录,而不仅是最新版。这
+看来,玩家们好像把中心服务器做了个镜像。
-最初的克隆操作可能比较费时,特别当有很长历史的时,但从长远看这是值得的。一个
-显而易见的好处是,当查看一个旧版本时,不再需要和中心服务器通讯了。
+最初的克隆操作可能比较费时,特别当存档有很长历史的时候,但从长远看这是值得的。一
+个显而易见的好处是,当查看一个旧版本时,就不再需要和中心服务器通讯了。
=== 一个误区 ===
@@ -68,11 +69,11 @@ http://en.wikipedia.org/wiki/Revision_control[维基百科版本修订控制条
相符。给谁照相也不会偷走他们的灵魂。类似地,克隆主仓库并不降低它的重要性。
一般来说,一个中心版本控制系统能做的任何事,一个良好设计的分布式系统都能做得
-更好。网络资源总要比本地资源耗费更费。不过我们应该在稍后分析分布式方案的缺点,
+更好。网络资源总要比本地资源耗费更昂贵。不过我们应该在稍后分析分布式方案的缺点,
这样人们才不会按照习惯做出错误的比较。
-一个小项目或许只需要分布式系统提供的一小部分功能,但是,在项目很小的时候,应
-该用规划不好的系统?就好比说,在计算较小数目的时候应该使用罗马数字?
+一个小项目或许只需要分布式系统提供的一小部分功能,但是,在项目很小的时候,就理应
+使用规划并不好的系统?就好比说,在计算较小数目的时候应该使用罗马数字?
而且,你的项目的增长可能会超出你最初的预期。从一开始就使用Git好似带着一把瑞士
军刀,尽管你很多时候只是用它来开开瓶盖。某天你迫切需要一把改锥,你就会庆幸你
@@ -92,4 +93,3 @@ Bob两人的改动都会生效。
更复杂的情况也可能出现。版本控制系统自己处理相对简单的情况,把困难的情况留给
人来处理。它们的行为通常是可配置的。
-
diff --git a/zh_cn/multiplayer.txt b/zh_cn/multiplayer.txt
index c0726009..250baf09 100644
--- a/zh_cn/multiplayer.txt
+++ b/zh_cn/multiplayer.txt
@@ -1,34 +1,34 @@
== 多人Git ==
-我最初在一个私人项目上使用Git,那里我是唯一的开发。在与Git分布式本性有关的命
-令中,我只用到了 *pull* 和 *clone*,用以在不同地方保持同一个项目。
+我最初在一个私人项目上使用Git,我是那个项目的唯一的开发者。在与Git分布式特性
+有关的命令中,我只用到了 *pull* 和 *clone*,以此即可在不同地方保持项目同步。
后来我想用Git发布我的代码,并且包括其他贡献者的变更。我不得不学习如何管理有来
自世界各地的多个开发的项目,幸运的是,这是Git的长处,也可以说是其存在的理由。
=== 我是谁? ===
-每个提交都有一个作者姓名和电子信箱,这显示在 *git log* 里。默认, Git使用系统
-设定来填充这些域。要显示地设定,键入:
+每个提交都有一个作者姓名和电子信箱,这显示在 *git log* 里。Git使用系统默认
+设定来填充这些信息。要设定这些信息,键入:
$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com
-去掉global选项设定只对当前仓库生效。
+去掉global选项设定则只对当前仓库生效。
-=== Git在SSH, HTTP上 ===
+=== Git在SSH, HTTP上的使用 ===
-假设你有ssh访问权限,以访问一个网页服务器,但上面并没有安装Git。尽管比着它的
+假设你有ssh访问权限,可以访问一个网页服务器,但上面并没有安装Git。尽管比它的
原生协议效率低,Git也是可以通过HTTP来进行通信的。
-那么在你的帐户下,下载,编译并安装Git。在你的网页目录里创建一个Git仓库:
+在你的帐户下,下载,编译并安装Git,并在你的网页目录里创建一个Git仓库:
$ GIT_DIR=proj.git git init
$ cd proj.git
$ git --bare update-server-info
$ cp hooks/post-update.sample hooks/post-update
-对较老版本的Git,只拷贝还不够,你应运行:
+对较老版本的Git,只拷贝还不够,你还要运行:
$ chmod a+x hooks/post-update
@@ -36,16 +36,16 @@
$ git push web.server:/path/to/proj.git master
-那随便谁都可以通过如下命令得到你的项目:
+而随便任何人都可以通过如下命令来取得你的项目:
$ git clone http://web.server/proj.git
-=== Git在随便什么上 ===
+=== Git在随便什么上的使用 ===
-想无需服务器,甚至无需网络连接的时候同步仓库?需要在紧急时期凑合一下?我们
-已经看过<>。 我们可以来来会会传送这些文件以传输git仓库,
-通过任何媒介,但一个更有效率的工具是 *git bundle* 。
+若想不依赖服务器,甚至无需网络连接来同步仓库?需要在紧急时期凑合一下?我们
+已经看过<>。 我们可以通过任何媒介,来来回回传送这些文件
+以同步git仓库。但一个更有效率的工具是 *git bundle* 。
发送者创建一个“文件包”:
@@ -60,13 +60,13 @@
接收者甚至可以在一个空仓库做这个。不考虑大小, +somefile+ 可以包含整个原先
git仓库。
-在较大的项目里,可以通过只打包其他仓库缺少的变更消除浪费。例如,假设提交
+在较大的项目里,可以通过只打包其他仓库缺少的变更来消除存储浪费。例如,假设提交
``1b6d...''是两个参与者共享的最近提交:
$ git bundle create somefile HEAD ^1b6d
-如果做的频繁,人可能容易忘记刚发了哪个提交。帮助页面建议使用标签解决这个问题。
-即,在你发了一个文件包后,键入:
+如果提交频繁,人们可能很容易忘记刚发送了哪个提交。帮助页面建议使用标签解决这个问
+题。即,在你发了一个文件包后,键入:
$ git tag -f lastbundle HEAD
@@ -76,10 +76,10 @@ git仓库。
=== 补丁:全球货币 ===
-补丁是变更的文本形式,易于计算机理解,人也类似。补丁可以通吃。你可以给开发电
-邮一个补丁,不用管他们用的什么版本控制系统。只要你的观众可以读电子邮件,他们
-就能看到你的修改。类似,在你这边,你只需要一个电子邮件帐号:不必搭建一个在线
-的Git仓库。
+补丁是变更的文本形式,易于计算机理解,人也类似。补丁可以通吃。你可以给开发者电
+邮一个补丁,不用管他们用的什么版本控制系统,只要对方可以读电子邮件,他们就能看
+到你的修改。类似的,在你这边,你只需要一个电子邮件帐号,而不必搭建一个在线的Git
+仓库。
回想一下第一章:
@@ -91,7 +91,7 @@ git仓库。
来打这个补丁。
-在更正式些的设置里,当作者名字以及或许签名应该记录下的时候,为过去某一刻生成
+在更正式些的设置里,当作者名字以及或许签名应该被记录下的时候,为过去某一刻生成
补丁,键入:
$ git format-patch 1b6d
@@ -104,9 +104,9 @@ git仓库。
$ git am < email.txt
-这就打了补丁并创建了一个提交,包含诸如作者之类的信息。
+这就打了补丁并创建了一个提交,其自动包含了诸如作者之类的信息。
-使用浏览器邮件客户端,在保存补丁为文件之前,你可能需要建一个按钮,看看邮件内
+使用浏览器的邮件客户端,在保存补丁为文件之前,你可能需要建一个按钮,看看邮件内
容原来的原始形式。
对基于mbox的邮件客户端有些微不同,但如果你在使用的话,你可能是那种能轻易找出
@@ -114,12 +114,12 @@ git仓库。
=== 对不起,移走了 ===
-克隆一个仓库后,运行 *git push* 或 *git pull* 讲自动推到或从原先URL拉。Git
-如何做这个呢?秘密在和克隆一起创建的配置选项。让我们看一下:
+克隆一个仓库后,运行 *git push* 或 *git pull* 将自动推到或从原先的仓库URL拉出
+新内容。Git如何做这个呢?秘密在于同克隆一起创建的配置选项里面。让我们看一下:
$ git config --list
-选项 +remote.origin.url+ 控制URL源;``origin'' 是给源仓库的昵称。和
+选项 +remote.origin.url+ 控制仓库的URL源;``origin'' 是给源仓库的昵称。和
``master'' 分支的惯例一样,我们可以改变或删除这个昵称,但通常没有理由这么做。
如果原先仓库移走,我们可以更新URL,通过:
@@ -139,8 +139,8 @@ pull也将忠实地跟着原来的分支。
=== 远端分支 ===
-当你克隆一个仓库,你也克隆了它的所有分支。你或许没有注意到因为Git将它们隐藏
-起来了:你必须明确地要求。这使得远端仓库里的分支不至于干扰你的分支,也使
+当你克隆了一个仓库,你也克隆了它的所有分支。你或许没有注意到这点,因为Git将它们
+隐藏起来了:你必须明确地要求。这使得远端仓库里的分支不至于干扰你的分支,也使
Git对初学者稍稍容易些。
列出远端分支,使用:
@@ -165,19 +165,20 @@ Git对初学者稍稍容易些。
=== 多远端 ===
-假设另两个开发在同一个项目上工作,我们希望保持两个标签。我们可以同事跟多个仓库:
+假设另两个开发在同一个项目上工作,我们希望保持两个标签。我们可以同时跟踪多个
+仓库:
$ git remote add other git://example.com/some_repo.git
$ git pull other some_branch
-现在我们已经从第二个仓库合并到一个分支,并且我们已容易访问所有仓库的所有
+现在我们已经合并到第二个仓库的一个分支,并且我们已容易访问所有仓库的所有
分支。
$ git diff origin/experimental^ other/some_branch~5
但如果为了不影响自己的工作,我们只想比较他们的变更怎么办呢?换句话说,我们想
-检查一下他们的分支,又不使他们的变更入侵我们的工作目录。那不是运行pull命令,
-而是运行:
+检查一下他们的分支,又不使他们的变更入侵我们的工作目录。这里我们并不要运行pull
+命令,而是运行:
$ git fetch # Fetch from origin, the default.
$ git fetch other # Fetch from the second programmer.
diff --git a/zh_cn/secrets.txt b/zh_cn/secrets.txt
index c7c52852..c26dff38 100644
--- a/zh_cn/secrets.txt
+++ b/zh_cn/secrets.txt
@@ -1,24 +1,24 @@
== 揭开面纱 ==
-我们揭开Git神秘面纱,往里瞧瞧它是如何创造奇迹的。我会跳过细节。更深入的描述参
-见 http://www.kernel.org/pub/software/scm/git/docs/user-manual.html[ 用户手
-册]。
+我们揭开Git神秘面纱,往里瞧瞧它是如何创造奇迹的。我会跳过细节,若要更深入的了解Git
+工作原理,可参见 http://www.kernel.org/pub/software/scm/git/docs/user-manual.html[ 用
+户手册]。
=== 大象无形 ===
Git怎么这么谦逊寡言呢?除了偶尔提交和合并外,你可以如常工作,就像不知道版本控
-制系统存在一样。那就是,直到你需要它的时候,而且那是你欢欣的时候,Git一直默默
-注视着你。
+制系统存在一样。那就是,直到你需要它,并且感到时间合适的时候以外,Git都只是默
+默在后台看顾着你。
其他版本控制系统强迫你与繁文缛节和官僚主义不断斗争。文件的权限可能是只读的,
-除非你显式地告诉中心服务器哪些文件你打算编辑。即使最基本的命令,随着用户数目
+除非你明确地告诉中心服务器哪些文件你打算编辑。即使最基本的命令,随着用户数目
的增多,也会慢的像爬一样。中心服务器可能正跟踪什么人,什么时候check out了什么
代码。当网络连接断了的时候,你就遭殃了。开发人员不断地与这些版本控制系统的种
种限制作斗争。一旦网络或中心服务器瘫痪,工作就嘎然而止。
与之相反,Git简单地在你工作目录下的`.git`目录保存你项目的历史。这是你自己的历
史拷贝,因此你可以保持离线,直到你想和他人沟通为止。你拥有你的文件命运完全的
-控制权,因为Git可以轻易在任何时候从`.git`重建一个保存状态。
+控制权,因为Git可以轻易在任何时候从`.git`重建一个曾经保存过的状态。
=== 数据完整性 ===
@@ -34,14 +34,14 @@ Git怎么这么谦逊寡言呢?除了偶尔提交和合并外,你可以如
个简单的观察出奇地有用:查看“哈希链”。我们之后会看Git如何利用这一点来高效地
保证数据完整性。
-简言之,Git把你数据保存在`.git/objects`子目录,那里看不到正常文件名,相反你只
+简言之,Git把数据保存在`.git/objects`子目录,那里看不到正常文件名,相反你只
看到ID。通过用ID作为文件名,加上一些文件锁和时间戳技巧,Git把任意一个原始的文
件系统转化为一个高效而稳定的数据库。
=== 智能 ===
Git是如何知道你重命名了一个文件,即使你从来没有明确提及这个事实?当然,你或许
-是运行了 *git mv* ,但这个命令和 *git add* 紧接 *git rm* 是完全一样的。
+是运行了 *git mv* ,但这个命令和 *git add* 紧随 *git rm* 是完全一样的。
Git启发式地找出相连版本之间的重命名和拷贝。实际上,它能检测文件之间代码块的移
动或拷贝!尽管它不能覆盖所有的情况,但它已经做的很好了,并且这个功能也总在改
@@ -50,34 +50,34 @@ Git启发式地找出相连版本之间的重命名和拷贝。实际上,它
=== 索引 ===
-为每个加入管理的文件,Git在一个名为“index”的文件里记录统计信息,诸如大小,
-创建时间和最后修改时间。为了确定文件是否更改,Git比较其当前统计信息与那些在索
-引里的统计信息。如果一致,那Git就跳过重新读文件。
+对每个加入库中管理的文件,Git都会在一个名为“index”的文件里记录统计信息,诸如
+大小,创建时间和最后修改时间。为了确定文件是否被更改,Git会将当前统计信息同那
+些在索引里的统计信息对比。如果一致,那Git就跳过该文件。
因为统计信息的调用比读文件内容快的很多,如果你仅仅编辑了少数几个文件,Git几乎
不需要什么时间就能更新他们的统计信息。
我们前面讲过索引是一个中转区。为什么一堆文件的统计数据是一个中转区?因为添加
-命令将文件放到Git的数据库并更新它们的统计信息,而无参数的提交命令创建一个提交,
-只基于这些统计信息和已经在数据库里的文件。
+命令将文件放到Git的数据库并更新它们的统计信息,而无参数的提交命令将只基于统计
+信息和已经在数据库里的文件来创建一个全新的提交。
=== Git的源起 ===
-这个 http://lkml.org/lkml/2005/4/6/121[ Linux内核邮件列表帖子] 描述了导致Git
-的一系列事件。整个讨论线索是一个令人着迷的历史探究过程,对Git史学家而言。
+这个 http://lkml.org/lkml/2005/4/6/121[ Linux内核邮件列表帖子] 描述了导致
+Git诞生的一系列事件。对Git史学家而言,整个讨论线是一个令人着迷的历史探究过程。
=== 对象数据库 ===
-你数据的每个版本都保存在“对象数据库”里,其位于子目录`.git/objects`;其他位
+你数据的每个版本都保存在“对象数据库”里,其位于子目录`.git/objects`内;其他位
于`.git/`的较少数据:索引,分支名,标签,配置选项,日志,头提交的当前位置等。
对象数据库朴素而优雅,是Git的力量之源。
-`.git/objects`里的每个文件是一个对象。有3中对象跟我们有关:“blob”对象,
+`.git/objects`里的每个文件是一个对象。有3种对象跟我们有关:“blob”对象,
“tree”对象,和“commit”对象。
=== Blob对象 ===
-首先来一个小把戏。去一个文件名,任意文件名。在一个空目录:
+首先来一个小把戏。选择一个文件名,任意文件名。在一个空目录:
$ echo sweet > YOUR_FILENAME
$ git init
@@ -90,8 +90,8 @@ Git启发式地找出相连版本之间的重命名和拷贝。实际上,它
"blob" SP "6" NUL "sweet" LF
-是 aa823728ea7d592acc69b36875a482cdf3fd5c8d,这里SP是一个空格,NUL是一个0字节,
-LF是一个换行符。你可以验证这一点,键入:
+是 aa823728ea7d592acc69b36875a482cdf3fd5c8d,这里SP是一个空格,NUL是一
+个0字节,LF是一个换行符。你可以验证这一点,键入:
$ printf "blob 6\000sweet\n" | sha1sum
@@ -100,17 +100,18 @@ Git基于“内容寻址”:文件并不按它们的文件名存储,而是
在某种意义上我们通过他们内容放置文件。开始的“blob 6”只是一个包含对象类型与
其长度的头;它简化了内部存储。
-这样我可以轻易语言你所看到的。文件名是无关的:只有里面的内容被用作构建blob对象。
+这样我可以轻易预言你所看到的输出:文件名是无关的:只有里面的内容被用作构
+建blob对象。
-你可能想知道对相同的文件什么会发生。试图加一个你文件的拷贝,什么文件名都行。
-在 +.git/objects+ 的内容保持不变,不管你加了多少。Git只存储一次数据。
+你可能想知道对相同的文件会发生什么。试图填加一个你文件的拷贝,什么文件名都行。
+在 +.git/objects+ 的内容保持不变,不管你加了多少。Git都只存储一次数据。
顺便说一句,在 +.git/objects+ 里的文件用zlib压缩,因此你不应该直接查看他们。
可以通过http://www.zlib.net/zpipe.c[zpipe -d] 管道, 或者键入:
$ git cat-file -p aa823728ea7d592acc69b36875a482cdf3fd5c8d
-这漂亮地打印出给定的对象。
+这样可以漂亮地打印出给定的对象。注意,上面的cat-file命令中,aa是目录名。
=== Tree对象 ===
@@ -126,11 +127,12 @@ Git基于“内容寻址”:文件并不按它们的文件名存储,而是
$ git filter-branch --tree-filter 'mv YOUR_FILENAME rose'
$ find .git/objects -type f
-现在你硬看到文件 +.git/objects/05/b217bb859794d08bb9e4f7f04cbda4b207fbe9+ ,因为这是以下内容的SHA1哈希值:
+现在你应看到文件 +.git/objects/05/b217bb859794d08bb9e4f7f04cbda4b207fbe9+ ,因
+为这是以下内容的SHA1哈希值:
"tree" SP "32" NUL "100644 rose" NUL 0xaa823728ea7d592acc69b36875a482cdf3fd5c8d
-检查这个文件真的包含上面内容通过键入:
+通过键入以下命令来检查这个文件真的包含上面内容:
$ echo 05b217bb859794d08bb9e4f7f04cbda4b207fbe9 | git cat-file --batch
@@ -138,21 +140,21 @@ Git基于“内容寻址”:文件并不按它们的文件名存储,而是
$ zpipe -d < .git/objects/05/b217bb859794d08bb9e4f7f04cbda4b207fbe9 | sha1sum
-与查看文件相比,哈希值验证更技巧一些,因为其输出不止包含原始未压缩文件。
+与查看文件相比,哈希值验证更轻巧一些,因为其输出不包含原始未压缩文件。
-这个文件是一个“tree”对象:一组数据包含文件类型,文件名和哈希值。在我们的例
+这里的输出是一个“tree”对象:一组包含文件类型,文件名和哈希值的数据。在我们的例
子里,文件类型是100644,这意味着“rose”是一个一般文件,并且哈希值指blob对象,
包含“rose”的内容。其他可能文件类型有可执行,链接或者目录。在最后一个例子里,
哈希值指向一个tree对象。
-在一些过渡性的分支,你会有一些你不在需要的老的对象,尽管有宽限过期之后,它们
-会被自动清除,现在我们还是将其删除,以使我们比较容易跟上这个玩具例子。
+在一些过渡性的分支,你会有一些你不再需要的老的对象,尽管在宽限过期之后,它们
+会被自动清除,现在我们还是将其删除,以使我们比较容易跟上这个示范的例子。
$ rm -r .git/refs/original
$ git reflog expire --expire=now --all
$ git prune
-在真实项目里你通常应该避免像这样的命令,因为你在破换备份。如果你期望一个干净
+在真实项目里你通常应该避免像这样的命令,因为你在破坏备份。如果你期望一个干净
的仓库,通常最好做一个新的克隆。还有,直接操作 +.git+ 时一定要小心:如果
Git命令同时也在运行会怎样,或者突然停电?一般,引用应由 *git update-ref -d*
删除,尽管通常手工删除 +refs/original+ 也是安全的。
@@ -160,7 +162,7 @@ Git命令同时也在运行会怎样,或者突然停电?一般,引用应
=== Commit对象 ===
我们已经解释了三个对象中的两个。第三个是“commit”对象。其内容依赖于提交信息
-以及其创建的日期和时间。为满足这里我们所有的,我们不得不调整一下:
+以及其创建的日期和时间。为满足这里我们所需的,我们不得不调整一下:
$ git commit --amend -m Shakespeare # 改提交信息
$ git filter-branch --env-filter 'export
@@ -191,25 +193,25 @@ Git命令同时也在运行会怎样,或者突然停电?一般,引用应
Git的秘密似乎太简单。看起来似乎你可以整合几个shell脚本,加几行C代码来弄起来,
也就几个小时的事:一个基本文件操作和SHA1哈希化的混杂,用锁文件装饰一下,文件
同步保证健壮性。实际上,这准确描述了Git的最早期版本。尽管如此,除了巧妙地打包
-以节省空间,巧妙地索引以省时间,我们现在知道Git如何灵巧地改造文件系统成为一个
-对版本控制完美的数据库。
+以节省空间,巧妙地索引以省时间,我们现在知道Git如何灵巧地改造文件系统,使其成
+为一个完美的版本控制数据库。
例如,如果对象数据库里的任何一个文件由于硬盘错误损毁,那么其哈希值将不再匹配,
这个错误会报告给我们。通过哈希化其他对象的哈希值,我们在所有层面维护数据完整
-性。Commit对象是原子的,也就是说,一个提交永远不会部分地记录变更:在我们已经
-存储所有相关tree对象,blob对象和父commit对象之后,我们才可以计算提交的的哈希
+性。Commit对象是原子性的,也就是说,一个提交永远不会部分地记录变更:在我们已经
+存储所有关于tree对象,blob对象和父commit对象之后,我们才可以计算提交的的哈希
值并将其存储在数据库,对象数据库不受诸如停电之类的意外中断影响。
-我们打败即使是最狡猾的对手。假设有谁试图悄悄修改一个项目里一个远古版本文件的
-内容。为使对象据库看起来健康,他们也必须修改相应blob对象的哈希值,既然它现在
-是一个不同的字节串。这意味着他们讲不得不引用这个文件的tree对象的哈希值,并反
+我们打败了即使是最狡猾的对手。假设有人试图悄悄修改一个项目里一个远古版本文件的
+内容,为使对象据库看起来健康,他们也必须修改相应blob对象的哈希值,既然它现在
+是一个不同的字节串。这意味着他们将不得不引用这个文件的tree对象的哈希值,并反
过来改变所有与这个tree相关的commit对象的哈希值,还要加上这些提交所有后裔的哈
希值。这暗示官方head的哈希值与这个坏仓库不同。通过跟踪不匹配哈希值线索,我
们可以查明残缺文件,以及第一个被破坏的提交。
-总之,只要20个字节代表最后一次提交的是安全的,不可能篡改一个Git仓库。
+总之,只要20个字节代表最后一次的提交是安全的,我们就将不可能篡改一个Git仓库。
-那么Git的著名功能怎样呢?分支?合并?标签?单纯的细节。当前head保存在文件
-+.git /HEAD+ ,其中包含了一个commit对象的哈希值。该哈希值在运行提交以及其他命
-令是更新。分支几乎一样:它们是保存在 +.git/refs/heads+ 的文件。标签也是:它们
-住在住在 +.git/refs/tags+ ,但它们由一套不同的命令更新。
+那么Git的著名功能怎样实现的呢?分支?合并?标签?这些都是单纯的细节。当前head保
+存在文件+.git /HEAD+ ,其中包含了一个commit对象的哈希值。该哈希值在运行提交
+以及其他命令时更新。分支几乎一样:它们是保存在 +.git/refs/heads+ 的文件。标签
+也是:它们住在 +.git/refs/tags+ ,但它们由一套不同的命令更新。
diff --git a/zh_cn/translate.txt b/zh_cn/translate.txt
index c11c70c5..81a8a2f7 100644
--- a/zh_cn/translate.txt
+++ b/zh_cn/translate.txt
@@ -10,8 +10,8 @@ http://www.w3.org/International/articles/language-tags/Overview.en.php[ W3C在
国际化方面的文章 ]。例如,英语是“en”,日语是“ja”,正体中文是“zh-Hant”。
然后在新建目录,翻译这些来自“en”目录的 +txt+ 文件。
-例如,将本指南译为 http://en.wikipedia.org/wiki/Klingon_language[ 克林贡语 ],
-你也许键入:
+例如,要将本指南译为 http://en.wikipedia.org/wiki/Klingon_language[ 克林贡语 ],
+你可以键入:
$ git clone git://repo.or.cz/gitmagic.git
$ cd gitmagic
@@ -28,9 +28,8 @@ http://www.w3.org/International/articles/language-tags/Overview.en.php[ W3C在
$ make tlh
$ firefox book-tlh/index.html
-经常提交你的变更,然后然我知道他们什么时候完成。GitHub.com提供一个便于fork
+经常提交你的更新,这样我就知道他们什么时候可以完成。GitHub.com提供一个便于fork
“gitmatic”项目的界面,提交你的变更,然后告诉我去合并。
但请按照最适合你的方式做:例如,中文译者就使用
-Google Docs。只要你的工作使更多人看到我的工作,我就高兴。
-
+Google Docs。只要你的工作能使更多人看到我的工作,我就高兴。