From 86f121b3ad85d45a25a177d66d10afa6ce5cee07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-No=C3=ABl=20Avila?= Date: Sat, 24 Feb 2018 16:48:26 +0100 Subject: [PATCH 1/4] change organization of the files fix typos and missing cross-refs. --- .gitignore | 2 +- ...nts.asc => A-git-in-other-environments.asc | 13 +- ...1-embedding-git.asc => B-embedding-git.asc | 7 +- .../1-git-commands.asc => C-git-commands.asc | 473 +++++++++--------- Gemfile | 14 +- Rakefile | 235 ++++++++- book/01-introduction/sections/basics.asc | 14 +- .../sections/first-time-setup.asc | 2 +- book/01-introduction/sections/help.asc | 2 +- book/01-introduction/sections/history.asc | 4 +- book/02-git-basics/sections/aliases.asc | 2 +- .../sections/getting-a-repository.asc | 16 +- .../sections/recording-changes.asc | 24 +- book/02-git-basics/sections/remotes.asc | 24 +- book/02-git-basics/sections/tagging.asc | 6 +- book/02-git-basics/sections/undoing.asc | 16 +- .../sections/viewing-history.asc | 24 +- .../sections/basic-branching-and-merging.asc | 14 +- .../sections/branch-management.asc | 2 +- book/03-git-branching/sections/nutshell.asc | 20 +- book/03-git-branching/sections/rebasing.asc | 48 +- .../sections/remote-branches.asc | 20 +- book/03-git-branching/sections/workflows.asc | 8 +- book/04-git-server/images/gitlab-groups.png | Bin 17463 -> 0 bytes book/04-git-server/images/gitlab-menu.png | Bin 2311 -> 0 bytes book/04-git-server/images/gitlab-users.png | Bin 18656 -> 0 bytes .../sections/generating-ssh-key.asc | 2 +- .../sections/git-on-a-server.asc | 4 +- book/04-git-server/sections/gitlab.asc | 16 +- book/04-git-server/sections/gitweb.asc | 2 +- book/04-git-server/sections/hosted.asc | 4 +- book/04-git-server/sections/protocols.asc | 16 +- .../sections/setting-up-server.asc | 2 +- .../images/managed-team-flow.png | Bin 33045 -> 0 bytes .../sections/contributing.asc | 42 +- .../sections/distributed-workflows.asc | 14 +- .../sections/maintaining.asc | 50 +- .../sections/1-setting-up-account.asc | 12 +- book/06-github/sections/2-contributing.asc | 110 ++-- book/06-github/sections/3-maintaining.asc | 68 +-- .../sections/4-managing-organization.asc | 20 +- book/06-github/sections/5-scripting.asc | 36 +- .../sections/advanced-merging.asc | 30 +- book/07-git-tools/sections/bundling.asc | 6 +- book/07-git-tools/sections/credentials.asc | 2 +- book/07-git-tools/sections/debugging.asc | 4 +- .../sections/interactive-staging.asc | 2 +- book/07-git-tools/sections/notes.asc | 6 +- book/07-git-tools/sections/replace.asc | 6 +- book/07-git-tools/sections/rerere.asc | 10 +- book/07-git-tools/sections/reset.asc | 16 +- .../sections/revision-selection.asc | 26 +- .../sections/rewriting-history.asc | 10 +- book/07-git-tools/sections/searching.asc | 4 +- book/07-git-tools/sections/signing.asc | 4 +- .../sections/stashing-cleaning.asc | 4 +- book/07-git-tools/sections/submodules.asc | 15 +- book/07-git-tools/sections/subtree-merges.asc | 10 +- .../sections/attributes.asc | 10 +- book/08-customizing-git/sections/config.asc | 20 +- book/08-customizing-git/sections/hooks.asc | 10 +- book/08-customizing-git/sections/policy.asc | 16 +- .../sections/client-p4.asc | 4 +- .../sections/client-svn.asc | 2 +- .../sections/import-custom.asc | 10 +- .../sections/import-p4.asc | 12 +- .../sections/import-tfs.asc | 2 +- .../10-git-internals/sections/environment.asc | 4 +- .../10-git-internals/sections/maintenance.asc | 22 +- book/10-git-internals/sections/objects.asc | 6 +- .../sections/plumbing-porcelain.asc | 6 +- book/10-git-internals/sections/refs.asc | 8 +- book/10-git-internals/sections/refspec.asc | 4 +- .../sections/guis.asc | 4 +- .../sections/powershell.asc | 2 +- .../sections/visualstudio.asc | 6 +- .../sections/zsh.asc | 6 +- book/B-embedding-git/sections/jgit.asc | 4 +- book/B-embedding-git/sections/libgit2.asc | 8 +- book/dedication.asc | 19 + book/license.asc | 4 + book/preface_ben.asc | 20 + book/{preface.asc => preface_scott.asc} | 49 -- ...-introduction.asc => ch01-introduction.asc | 17 +- .../1-git-basics.asc => ch02-git-basics.asc | 17 +- ...it-branching.asc => ch03-git-branching.asc | 15 +- .../1-git-server.asc => ch04-git-server.asc | 19 +- ...ibuted-git.asc => ch05-distributed-git.asc | 9 +- .../06-github/1-github.asc => ch06-github.asc | 17 +- .../1-git-tools.asc => ch07-git-tools.asc | 31 +- ...mizing-git.asc => ch08-customizing-git.asc | 11 +- ...er-scms.asc => ch09-git-and-other-scms.asc | 21 +- ...it-internals.asc => ch10-git-internals.asc | 19 +- {book/06-github/images => images}/2fa-1.png | Bin .../images => images}/account-settings.png | Bin .../images => images}/advance-master.png | Bin .../images => images}/advance-testing.png | Bin .../images => images}/areas.png | Bin .../images => images}/avatar-crop.png | Bin .../images => images}/basic-branching-1.png | Bin .../images => images}/basic-branching-2.png | Bin .../images => images}/basic-branching-3.png | Bin .../images => images}/basic-branching-4.png | Bin .../images => images}/basic-branching-5.png | Bin .../images => images}/basic-branching-6.png | Bin .../images => images}/basic-merging-1.png | Bin .../images => images}/basic-merging-2.png | Bin .../images => images}/basic-rebase-1.png | Bin .../images => images}/basic-rebase-2.png | Bin .../images => images}/basic-rebase-3.png | Bin .../images => images}/basic-rebase-4.png | Bin .../images => images}/benevolent-dictator.png | Bin .../images => images}/bitnami.png | Bin .../images => images}/blink-01-start.png | Bin .../images => images}/blink-02-pr.png | Bin .../blink-03-pull-request-open.png | Bin .../images => images}/blink-04-email.png | Bin .../images => images}/blink-04-pr-comment.png | Bin .../blink-05-general-comment.png | Bin .../images => images}/blink-06-final.png | Bin .../blink-pull-request-open copy.png | Bin .../blink-pull-request-open.png | Bin .../images => images}/branch-and-history.png | Bin .../images => images}/branch_widget_mac.png | Bin .../images => images}/branch_widget_win.png | Bin .../images => images}/centralized.png | Bin .../centralized_workflow.png | Bin .../images => images}/checkout-master.png | Bin .../images => images}/clean.png | Bin .../images => images}/collaborators.png | Bin .../images => images}/commit-and-tree.png | Bin .../images => images}/commits-and-parents.png | Bin .../images => images}/data-model-1.png | Bin .../images => images}/data-model-2.png | Bin .../images => images}/data-model-3.png | Bin .../images => images}/data-model-4.png | Bin .../images => images}/deltas.png | Bin .../images => images}/distributed.png | Bin .../images => images}/double-dot.png | Bin .../images => images}/egit.png | Bin .../images => images}/email-settings.png | Bin {book/06-github/images => images}/emoji.png | Bin .../images => images}/forkbutton.png | Bin .../images => images}/git-bash.png | Bin .../images => images}/git-diff-check.png | Bin .../images => images}/git-fusion-boot.png | Bin .../git-fusion-perforce-graph.png | Bin .../images => images}/git-gui.png | Bin .../images => images}/git-instaweb.png | Bin .../images => images}/git-osx-installer.png | Bin .../images => images}/git-tfs-ct.png | Bin .../images => images}/github_mac.png | Bin .../images => images}/github_win.png | Bin .../images => images}/gitk.png | Bin .../images => images}/gitlab-broadcast.png | Bin images/gitlab-groups.png | Bin 0 -> 236758 bytes images/gitlab-menu.png | Bin 0 -> 29468 bytes images/gitlab-users.png | Bin 0 -> 237381 bytes .../images => images}/head-to-master.png | Bin .../images => images}/head-to-testing.png | Bin {book/06-github/images => images}/hubot.png | Bin .../images => images}/integration-manager.png | Bin .../interesting-rebase-1.png | Bin .../interesting-rebase-2.png | Bin .../interesting-rebase-3.png | Bin .../interesting-rebase-4.png | Bin .../interesting-rebase-5.png | Bin .../images => images}/large-merges-1.png | Bin .../images => images}/large-merges-2.png | Bin .../images => images}/lifecycle.png | Bin .../images => images}/local.png | Bin .../images => images}/lr-branches-1.png | Bin .../images => images}/lr-branches-2.png | Bin .../images => images}/maint-01-email.png | Bin .../images => images}/maint-02-merge.png | Bin .../images => images}/maint-03-email-resp.png | Bin .../images => images}/maint-04-target.png | Bin .../images => images}/maint-05-mentions.png | Bin .../maint-06-unsubscribe.png | Bin .../maint-07-notifications.png | Bin .../maint-08-notifications-page.png | Bin .../images => images}/maint-09-contrib.png | Bin .../maint-10-default-branch.png | Bin .../images => images}/maint-11-transfer.png | Bin .../images => images}/managed-team-1.png | Bin .../images => images}/managed-team-2.png | Bin .../images => images}/managed-team-3.png | Bin images/managed-team-flow.png | Bin 0 -> 29831 bytes .../images => images}/markdown-01-example.png | Bin .../images => images}/markdown-02-tasks.png | Bin .../markdown-03-task-summary.png | Bin .../markdown-04-fenced-code.png | Bin .../images => images}/markdown-05-quote.png | Bin .../markdown-06-emoji-complete.png | Bin .../images => images}/markdown-07-emoji.png | Bin .../markdown-08-drag-drop.png | Bin .../images => images}/mentions-01-syntax.png | Bin .../images => images}/mentions-02-render.png | Bin .../images => images}/mentions-03-closed.png | Bin .../images => images}/merging-workflows-1.png | Bin .../images => images}/merging-workflows-2.png | Bin .../images => images}/merging-workflows-3.png | Bin .../merging-workflows-4 2.png | Bin .../images => images}/merging-workflows-4.png | Bin .../images => images}/merging-workflows-5.png | Bin .../06-github/images => images}/new-repo.png | Bin {book/06-github/images => images}/neworg.png | Bin {book/06-github/images => images}/newrepo.png | Bin .../images => images}/newrepoform.png | Bin .../images => images}/notifications.png | Bin .../images => images}/orgs-01-page.png | Bin .../images => images}/orgs-02-teams.png | Bin .../images => images}/orgs-03-audit.png | Bin .../images => images}/p4merge.png | Bin .../perils-of-rebasing-1.png | Bin .../perils-of-rebasing-2.png | Bin .../perils-of-rebasing-3.png | Bin .../perils-of-rebasing-4.png | Bin .../perils-of-rebasing-5.png | Bin .../images => images}/posh-git.png | Bin .../images => images}/pr-01-fail.png | Bin .../images => images}/pr-02-merge-fix.png | Bin .../images => images}/public-small-1.png | Bin .../images => images}/public-small-2.png | Bin .../images => images}/public-small-3.png | Bin .../images => images}/rebasing-1.png | Bin .../images => images}/rebasing-2.png | Bin .../images => images}/remote-branches-1.png | Bin .../images => images}/remote-branches-2.png | Bin .../images => images}/remote-branches-3.png | Bin .../images => images}/remote-branches-4.png | Bin .../images => images}/remote-branches-5.png | Bin .../images => images}/replace1.png | Bin .../images => images}/replace2.png | Bin .../images => images}/replace3.png | Bin .../images => images}/replace4.png | Bin .../images => images}/replace5.png | Bin .../images => images}/reposettingslink.png | Bin .../images => images}/rerere1.png | Bin .../images => images}/rerere2.png | Bin .../images => images}/rerere3.png | Bin .../images => images}/reset-checkout.png | Bin .../images => images}/reset-ex1.png | Bin .../images => images}/reset-ex2.png | Bin .../images => images}/reset-ex3.png | Bin .../images => images}/reset-ex4.png | Bin .../images => images}/reset-ex5.png | Bin .../images => images}/reset-ex6.png | Bin .../images => images}/reset-hard.png | Bin .../images => images}/reset-mixed.png | Bin .../images => images}/reset-path1.png | Bin .../images => images}/reset-path2.png | Bin .../images => images}/reset-path3.png | Bin .../images => images}/reset-soft.png | Bin .../images => images}/reset-squash-r1.png | Bin .../images => images}/reset-squash-r2.png | Bin .../images => images}/reset-squash-r3.png | Bin .../images => images}/reset-start.png | Bin .../images => images}/reset-workflow.png | Bin .../scripting-01-services.png | Bin .../scripting-02-email-service.png | Bin .../scripting-03-webhook.png | Bin .../scripting-04-webhook-debug.png | Bin .../scripting-05-access-token.png | Bin .../scripting-06-comment.png | Bin .../images => images}/scripting-07-status.png | Bin {book/06-github/images => images}/signup.png | Bin .../images => images}/small-team-1.png | Bin .../images => images}/small-team-2.png | Bin .../images => images}/small-team-3.png | Bin .../images => images}/small-team-4.png | Bin .../images => images}/small-team-5.png | Bin .../images => images}/small-team-6.png | Bin .../images => images}/small-team-7.png | Bin .../images => images}/small-team-flow.png | Bin .../images => images}/smudge.png | Bin .../images => images}/snapshots.png | Bin .../06-github/images => images}/ssh-keys.png | Bin .../images => images}/topic-branches-1.png | Bin .../images => images}/topic-branches-2.png | Bin .../images => images}/two-branches.png | Bin .../images => images}/undomerge-reset.png | Bin .../images => images}/undomerge-revert.png | Bin .../images => images}/undomerge-revert2.png | Bin .../images => images}/undomerge-revert3.png | Bin .../images => images}/undomerge-start.png | Bin .../images => images}/vs-1.png | Bin .../images => images}/vs-2.png | Bin .../images => images}/your-profile.png | Bin .../images => images}/zsh-oh-my.png | Bin .../images => images}/zsh-prompt.png | Bin index.asc | 3 + progit.asc | 48 +- 293 files changed, 1132 insertions(+), 896 deletions(-) rename book/A-git-in-other-environments/1-git-other-environments.asc => A-git-in-other-environments.asc (80%) rename book/B-embedding-git/1-embedding-git.asc => B-embedding-git.asc (86%) rename book/C-git-commands/1-git-commands.asc => C-git-commands.asc (61%) delete mode 100644 book/04-git-server/images/gitlab-groups.png delete mode 100644 book/04-git-server/images/gitlab-menu.png delete mode 100644 book/04-git-server/images/gitlab-users.png delete mode 100644 book/05-distributed-git/images/managed-team-flow.png create mode 100644 book/dedication.asc create mode 100644 book/license.asc create mode 100644 book/preface_ben.asc rename book/{preface.asc => preface_scott.asc} (75%) rename book/01-introduction/1-introduction.asc => ch01-introduction.asc (78%) rename book/02-git-basics/1-git-basics.asc => ch02-git-basics.asc (83%) rename book/03-git-branching/1-git-branching.asc => ch03-git-branching.asc (88%) rename book/04-git-server/1-git-server.asc => ch04-git-server.asc (91%) rename book/05-distributed-git/1-distributed-git.asc => ch05-distributed-git.asc (90%) rename book/06-github/1-github.asc => ch06-github.asc (88%) rename book/07-git-tools/1-git-tools.asc => ch07-git-tools.asc (73%) rename book/08-customizing-git/1-customizing-git.asc => ch08-customizing-git.asc (86%) rename book/09-git-and-other-scms/1-git-and-other-scms.asc => ch09-git-and-other-scms.asc (87%) rename book/10-git-internals/1-git-internals.asc => ch10-git-internals.asc (90%) rename {book/06-github/images => images}/2fa-1.png (100%) rename {book/06-github/images => images}/account-settings.png (100%) rename {book/03-git-branching/images => images}/advance-master.png (100%) rename {book/03-git-branching/images => images}/advance-testing.png (100%) rename {book/01-introduction/images => images}/areas.png (100%) rename {book/06-github/images => images}/avatar-crop.png (100%) rename {book/03-git-branching/images => images}/basic-branching-1.png (100%) rename {book/03-git-branching/images => images}/basic-branching-2.png (100%) rename {book/03-git-branching/images => images}/basic-branching-3.png (100%) rename {book/03-git-branching/images => images}/basic-branching-4.png (100%) rename {book/03-git-branching/images => images}/basic-branching-5.png (100%) rename {book/03-git-branching/images => images}/basic-branching-6.png (100%) rename {book/03-git-branching/images => images}/basic-merging-1.png (100%) rename {book/03-git-branching/images => images}/basic-merging-2.png (100%) rename {book/03-git-branching/images => images}/basic-rebase-1.png (100%) rename {book/03-git-branching/images => images}/basic-rebase-2.png (100%) rename {book/03-git-branching/images => images}/basic-rebase-3.png (100%) rename {book/03-git-branching/images => images}/basic-rebase-4.png (100%) rename {book/05-distributed-git/images => images}/benevolent-dictator.png (100%) rename {book/04-git-server/images => images}/bitnami.png (100%) rename {book/06-github/images => images}/blink-01-start.png (100%) rename {book/06-github/images => images}/blink-02-pr.png (100%) rename {book/06-github/images => images}/blink-03-pull-request-open.png (100%) rename {book/06-github/images => images}/blink-04-email.png (100%) rename {book/06-github/images => images}/blink-04-pr-comment.png (100%) rename {book/06-github/images => images}/blink-05-general-comment.png (100%) rename {book/06-github/images => images}/blink-06-final.png (100%) rename {book/06-github/images => images}/blink-pull-request-open copy.png (100%) rename {book/06-github/images => images}/blink-pull-request-open.png (100%) rename {book/03-git-branching/images => images}/branch-and-history.png (100%) rename {book/A-git-in-other-environments/images => images}/branch_widget_mac.png (100%) rename {book/A-git-in-other-environments/images => images}/branch_widget_win.png (100%) rename {book/01-introduction/images => images}/centralized.png (100%) rename {book/05-distributed-git/images => images}/centralized_workflow.png (100%) rename {book/03-git-branching/images => images}/checkout-master.png (100%) rename {book/08-customizing-git/images => images}/clean.png (100%) rename {book/06-github/images => images}/collaborators.png (100%) rename {book/03-git-branching/images => images}/commit-and-tree.png (100%) rename {book/03-git-branching/images => images}/commits-and-parents.png (100%) rename {book/10-git-internals/images => images}/data-model-1.png (100%) rename {book/10-git-internals/images => images}/data-model-2.png (100%) rename {book/10-git-internals/images => images}/data-model-3.png (100%) rename {book/10-git-internals/images => images}/data-model-4.png (100%) rename {book/01-introduction/images => images}/deltas.png (100%) rename {book/01-introduction/images => images}/distributed.png (100%) rename {book/07-git-tools/images => images}/double-dot.png (100%) rename {book/A-git-in-other-environments/images => images}/egit.png (100%) rename {book/06-github/images => images}/email-settings.png (100%) rename {book/06-github/images => images}/emoji.png (100%) rename {book/06-github/images => images}/forkbutton.png (100%) rename {book/A-git-in-other-environments/images => images}/git-bash.png (100%) rename {book/05-distributed-git/images => images}/git-diff-check.png (100%) rename {book/09-git-and-other-scms/images => images}/git-fusion-boot.png (100%) rename {book/09-git-and-other-scms/images => images}/git-fusion-perforce-graph.png (100%) rename {book/A-git-in-other-environments/images => images}/git-gui.png (100%) rename {book/04-git-server/images => images}/git-instaweb.png (100%) rename {book/01-introduction/images => images}/git-osx-installer.png (100%) rename {book/09-git-and-other-scms/images => images}/git-tfs-ct.png (100%) rename {book/A-git-in-other-environments/images => images}/github_mac.png (100%) rename {book/A-git-in-other-environments/images => images}/github_win.png (100%) rename {book/A-git-in-other-environments/images => images}/gitk.png (100%) rename {book/04-git-server/images => images}/gitlab-broadcast.png (100%) create mode 100644 images/gitlab-groups.png create mode 100644 images/gitlab-menu.png create mode 100644 images/gitlab-users.png rename {book/03-git-branching/images => images}/head-to-master.png (100%) rename {book/03-git-branching/images => images}/head-to-testing.png (100%) rename {book/06-github/images => images}/hubot.png (100%) rename {book/05-distributed-git/images => images}/integration-manager.png (100%) rename {book/03-git-branching/images => images}/interesting-rebase-1.png (100%) rename {book/03-git-branching/images => images}/interesting-rebase-2.png (100%) rename {book/03-git-branching/images => images}/interesting-rebase-3.png (100%) rename {book/03-git-branching/images => images}/interesting-rebase-4.png (100%) rename {book/03-git-branching/images => images}/interesting-rebase-5.png (100%) rename {book/05-distributed-git/images => images}/large-merges-1.png (100%) rename {book/05-distributed-git/images => images}/large-merges-2.png (100%) rename {book/02-git-basics/images => images}/lifecycle.png (100%) rename {book/01-introduction/images => images}/local.png (100%) rename {book/03-git-branching/images => images}/lr-branches-1.png (100%) rename {book/03-git-branching/images => images}/lr-branches-2.png (100%) rename {book/06-github/images => images}/maint-01-email.png (100%) rename {book/06-github/images => images}/maint-02-merge.png (100%) rename {book/06-github/images => images}/maint-03-email-resp.png (100%) rename {book/06-github/images => images}/maint-04-target.png (100%) rename {book/06-github/images => images}/maint-05-mentions.png (100%) rename {book/06-github/images => images}/maint-06-unsubscribe.png (100%) rename {book/06-github/images => images}/maint-07-notifications.png (100%) rename {book/06-github/images => images}/maint-08-notifications-page.png (100%) rename {book/06-github/images => images}/maint-09-contrib.png (100%) rename {book/06-github/images => images}/maint-10-default-branch.png (100%) rename {book/06-github/images => images}/maint-11-transfer.png (100%) rename {book/05-distributed-git/images => images}/managed-team-1.png (100%) rename {book/05-distributed-git/images => images}/managed-team-2.png (100%) rename {book/05-distributed-git/images => images}/managed-team-3.png (100%) create mode 100644 images/managed-team-flow.png rename {book/06-github/images => images}/markdown-01-example.png (100%) rename {book/06-github/images => images}/markdown-02-tasks.png (100%) rename {book/06-github/images => images}/markdown-03-task-summary.png (100%) rename {book/06-github/images => images}/markdown-04-fenced-code.png (100%) rename {book/06-github/images => images}/markdown-05-quote.png (100%) rename {book/06-github/images => images}/markdown-06-emoji-complete.png (100%) rename {book/06-github/images => images}/markdown-07-emoji.png (100%) rename {book/06-github/images => images}/markdown-08-drag-drop.png (100%) rename {book/06-github/images => images}/mentions-01-syntax.png (100%) rename {book/06-github/images => images}/mentions-02-render.png (100%) rename {book/06-github/images => images}/mentions-03-closed.png (100%) rename {book/05-distributed-git/images => images}/merging-workflows-1.png (100%) rename {book/05-distributed-git/images => images}/merging-workflows-2.png (100%) rename {book/05-distributed-git/images => images}/merging-workflows-3.png (100%) rename {book/05-distributed-git/images => images}/merging-workflows-4 2.png (100%) rename {book/05-distributed-git/images => images}/merging-workflows-4.png (100%) rename {book/05-distributed-git/images => images}/merging-workflows-5.png (100%) rename {book/06-github/images => images}/new-repo.png (100%) rename {book/06-github/images => images}/neworg.png (100%) rename {book/06-github/images => images}/newrepo.png (100%) rename {book/06-github/images => images}/newrepoform.png (100%) rename {book/06-github/images => images}/notifications.png (100%) rename {book/06-github/images => images}/orgs-01-page.png (100%) rename {book/06-github/images => images}/orgs-02-teams.png (100%) rename {book/06-github/images => images}/orgs-03-audit.png (100%) rename {book/08-customizing-git/images => images}/p4merge.png (100%) rename {book/03-git-branching/images => images}/perils-of-rebasing-1.png (100%) rename {book/03-git-branching/images => images}/perils-of-rebasing-2.png (100%) rename {book/03-git-branching/images => images}/perils-of-rebasing-3.png (100%) rename {book/03-git-branching/images => images}/perils-of-rebasing-4.png (100%) rename {book/03-git-branching/images => images}/perils-of-rebasing-5.png (100%) rename {book/A-git-in-other-environments/images => images}/posh-git.png (100%) rename {book/06-github/images => images}/pr-01-fail.png (100%) rename {book/06-github/images => images}/pr-02-merge-fix.png (100%) rename {book/05-distributed-git/images => images}/public-small-1.png (100%) rename {book/05-distributed-git/images => images}/public-small-2.png (100%) rename {book/05-distributed-git/images => images}/public-small-3.png (100%) rename {book/05-distributed-git/images => images}/rebasing-1.png (100%) rename {book/05-distributed-git/images => images}/rebasing-2.png (100%) rename {book/03-git-branching/images => images}/remote-branches-1.png (100%) rename {book/03-git-branching/images => images}/remote-branches-2.png (100%) rename {book/03-git-branching/images => images}/remote-branches-3.png (100%) rename {book/03-git-branching/images => images}/remote-branches-4.png (100%) rename {book/03-git-branching/images => images}/remote-branches-5.png (100%) rename {book/07-git-tools/images => images}/replace1.png (100%) rename {book/07-git-tools/images => images}/replace2.png (100%) rename {book/07-git-tools/images => images}/replace3.png (100%) rename {book/07-git-tools/images => images}/replace4.png (100%) rename {book/07-git-tools/images => images}/replace5.png (100%) rename {book/06-github/images => images}/reposettingslink.png (100%) rename {book/07-git-tools/images => images}/rerere1.png (100%) rename {book/07-git-tools/images => images}/rerere2.png (100%) rename {book/07-git-tools/images => images}/rerere3.png (100%) rename {book/07-git-tools/images => images}/reset-checkout.png (100%) rename {book/07-git-tools/images => images}/reset-ex1.png (100%) rename {book/07-git-tools/images => images}/reset-ex2.png (100%) rename {book/07-git-tools/images => images}/reset-ex3.png (100%) rename {book/07-git-tools/images => images}/reset-ex4.png (100%) rename {book/07-git-tools/images => images}/reset-ex5.png (100%) rename {book/07-git-tools/images => images}/reset-ex6.png (100%) rename {book/07-git-tools/images => images}/reset-hard.png (100%) rename {book/07-git-tools/images => images}/reset-mixed.png (100%) rename {book/07-git-tools/images => images}/reset-path1.png (100%) rename {book/07-git-tools/images => images}/reset-path2.png (100%) rename {book/07-git-tools/images => images}/reset-path3.png (100%) rename {book/07-git-tools/images => images}/reset-soft.png (100%) rename {book/07-git-tools/images => images}/reset-squash-r1.png (100%) rename {book/07-git-tools/images => images}/reset-squash-r2.png (100%) rename {book/07-git-tools/images => images}/reset-squash-r3.png (100%) rename {book/07-git-tools/images => images}/reset-start.png (100%) rename {book/07-git-tools/images => images}/reset-workflow.png (100%) rename {book/06-github/images => images}/scripting-01-services.png (100%) rename {book/06-github/images => images}/scripting-02-email-service.png (100%) rename {book/06-github/images => images}/scripting-03-webhook.png (100%) rename {book/06-github/images => images}/scripting-04-webhook-debug.png (100%) rename {book/06-github/images => images}/scripting-05-access-token.png (100%) rename {book/06-github/images => images}/scripting-06-comment.png (100%) rename {book/06-github/images => images}/scripting-07-status.png (100%) rename {book/06-github/images => images}/signup.png (100%) rename {book/05-distributed-git/images => images}/small-team-1.png (100%) rename {book/05-distributed-git/images => images}/small-team-2.png (100%) rename {book/05-distributed-git/images => images}/small-team-3.png (100%) rename {book/05-distributed-git/images => images}/small-team-4.png (100%) rename {book/05-distributed-git/images => images}/small-team-5.png (100%) rename {book/05-distributed-git/images => images}/small-team-6.png (100%) rename {book/05-distributed-git/images => images}/small-team-7.png (100%) rename {book/05-distributed-git/images => images}/small-team-flow.png (100%) rename {book/08-customizing-git/images => images}/smudge.png (100%) rename {book/01-introduction/images => images}/snapshots.png (100%) rename {book/06-github/images => images}/ssh-keys.png (100%) rename {book/03-git-branching/images => images}/topic-branches-1.png (100%) rename {book/03-git-branching/images => images}/topic-branches-2.png (100%) rename {book/03-git-branching/images => images}/two-branches.png (100%) rename {book/07-git-tools/images => images}/undomerge-reset.png (100%) rename {book/07-git-tools/images => images}/undomerge-revert.png (100%) rename {book/07-git-tools/images => images}/undomerge-revert2.png (100%) rename {book/07-git-tools/images => images}/undomerge-revert3.png (100%) rename {book/07-git-tools/images => images}/undomerge-start.png (100%) rename {book/A-git-in-other-environments/images => images}/vs-1.png (100%) rename {book/A-git-in-other-environments/images => images}/vs-2.png (100%) rename {book/06-github/images => images}/your-profile.png (100%) rename {book/A-git-in-other-environments/images => images}/zsh-oh-my.png (100%) rename {book/A-git-in-other-environments/images => images}/zsh-prompt.png (100%) create mode 100644 index.asc diff --git a/.gitignore b/.gitignore index 85385187..5949a4e7 100644 --- a/.gitignore +++ b/.gitignore @@ -9,4 +9,4 @@ progit.pdfmarks progit.epub progit-kf8.epub progit.mobi -/images/ + diff --git a/book/A-git-in-other-environments/1-git-other-environments.asc b/A-git-in-other-environments.asc similarity index 80% rename from book/A-git-in-other-environments/1-git-other-environments.asc rename to A-git-in-other-environments.asc index 100f4b51..870489c4 100644 --- a/book/A-git-in-other-environments/1-git-other-environments.asc +++ b/A-git-in-other-environments.asc @@ -1,3 +1,4 @@ +[#A-git-in-other-environments] [appendix] ////////////////////////// == Git in Other Environments @@ -15,18 +16,18 @@ Now we'll take a look at some of the other kinds of environments where Git can b Git은 CLI말고 다른 도구로도 사용할 수 있다. CLI는 Git 생태계의 한 부분일 뿐이고 터미널이 진리인 것도 아니다. 이 장에서는 다른 환경에서 Git을 어떻게 사용할 수 있는지 살펴보고 어떤 Git 애플리케이션이 있는지도 소개한다. -include::sections/guis.asc[] +include::book/A-git-in-other-environments/sections/guis.asc[] -include::sections/visualstudio.asc[] +include::book/A-git-in-other-environments/sections/visualstudio.asc[] -include::sections/eclipse.asc[] +include::book/A-git-in-other-environments/sections/eclipse.asc[] -include::sections/bash.asc[] +include::book/A-git-in-other-environments/sections/bash.asc[] -include::sections/zsh.asc[] +include::book/A-git-in-other-environments/sections/zsh.asc[] -include::sections/powershell.asc[] +include::book/A-git-in-other-environments/sections/powershell.asc[] ////////////////////////// === Summary diff --git a/book/B-embedding-git/1-embedding-git.asc b/B-embedding-git.asc similarity index 86% rename from book/B-embedding-git/1-embedding-git.asc rename to B-embedding-git.asc index 62780a43..43c6598a 100644 --- a/book/B-embedding-git/1-embedding-git.asc +++ b/B-embedding-git.asc @@ -1,3 +1,4 @@ +[#B-embedding-git] [appendix] ////////////////////////// == Embedding Git in your Applications @@ -16,8 +17,8 @@ If you need to integrate Git with your application, you have essentially three c ////////////////////////// Git을 지원하는 애플리케이션을 만들 때는 세 가지 방법의 하나를 선택할 수 있다. 쉘 명령어를 실행시키거나 Libgit2를 사용하거나 JGit을 사용한다. -include::sections/command-line.asc[] +include::book/B-embedding-git/sections/command-line.asc[] -include::sections/libgit2.asc[] +include::book/B-embedding-git/sections/libgit2.asc[] -include::sections/jgit.asc[] +include::book/B-embedding-git/sections/jgit.asc[] diff --git a/book/C-git-commands/1-git-commands.asc b/C-git-commands.asc similarity index 61% rename from book/C-git-commands/1-git-commands.asc rename to C-git-commands.asc index 9daca507..f2628fc4 100644 --- a/book/C-git-commands/1-git-commands.asc +++ b/C-git-commands.asc @@ -1,3 +1,4 @@ +[#C-git-commands] [appendix] ////////////////////////// == Git Commands @@ -45,34 +46,34 @@ The `git config` command has been used in nearly every chapter of the book. `git config` 명령은 이 책의 모든 장에서 사용한다. ////////////////////////// -In <<_first_time>> we used it to specify our name, email address and editor preference before we even got started using Git. +In <> we used it to specify our name, email address and editor preference before we even got started using Git. ////////////////////////// -Git을 처음 사용할 때 이름, 이메일 주소, 편집기는 어떻게 설정하는지는 <<_first_time>>에서 설명한다. +Git을 처음 사용할 때 이름, 이메일 주소, 편집기는 어떻게 설정하는지는 <>에서 설명한다. ////////////////////////// -In <<_git_aliases>> we showed how you could use it to create shorthand commands that expand to long option sequences so you don't have to type them every time. +In <> we showed how you could use it to create shorthand commands that expand to long option sequences so you don't have to type them every time. ////////////////////////// -어떻게 단축 명령어를 만드는지는 <<_git_aliases>>에 있다. 매번 긴 옵션을 줄줄 입력하지 않아도 된다. +어떻게 단축 명령어를 만드는지는 <>에 있다. 매번 긴 옵션을 줄줄 입력하지 않아도 된다. ////////////////////////// -In <<_rebasing>> we used it to make `--rebase` the default when you run `git pull`. +In <> we used it to make `--rebase` the default when you run `git pull`. ////////////////////////// -`git pull` 명령을 실행할 때 `--rebase` 옵션으로 동작하게 하는 방법은 <<_rebasing>>에 있다. +`git pull` 명령을 실행할 때 `--rebase` 옵션으로 동작하게 하는 방법은 <>에 있다. ////////////////////////// -In <<_credential_caching>> we used it to set up a default store for your HTTP passwords. +In <> we used it to set up a default store for your HTTP passwords. ////////////////////////// -HTTP 암호를 저장하는 방법은 <<_credential_caching>>를 보면 된다. +HTTP 암호를 저장하는 방법은 <>를 보면 된다. ////////////////////////// -In <<_keyword_expansion>> we showed how to set up smudge and clean filters on content coming in and out of Git. +In <> we showed how to set up smudge and clean filters on content coming in and out of Git. ////////////////////////// -Git에 데이터를 넣고 꺼낼 때 사용하는 Smudge와 Clean 필터를 설정하는 방법은 <<_keyword_expansion>>에 있다. +Git에 데이터를 넣고 꺼낼 때 사용하는 Smudge와 Clean 필터를 설정하는 방법은 <>에 있다. ////////////////////////// -Finally, basically the entirety of <<_git_config>> is dedicated to the command. +Finally, basically the entirety of <> is dedicated to the command. ////////////////////////// -마지막으로 `git config` 명령 자체에 대한 설명은 <<_git_config>>에 있다. +마지막으로 `git config` 명령 자체에 대한 설명은 <>에 있다. ==== git help @@ -84,9 +85,9 @@ While we're giving a rough overview of most of the more popular ones in this app 이 장에서는 많이 사용하는 것만 간단히 설명한다. `git help `라고 실행하면 해당 명령어에 어떤 옵션이 있고 어떻게 사용하는지 알려준다. ////////////////////////// -We introduced the `git help` command in <<_git_help>> and showed you how to use it to find more information about the `git shell` in <<_setting_up_server>>. +We introduced the `git help` command in <> and showed you how to use it to find more information about the `git shell` in <>. ////////////////////////// -`git help` 명령은 <<_git_help>>에 소개한다. `git shell`을 서버에 설정하는 방법은 <<_setting_up_server>>에서 보여준다. +`git help` 명령은 <>에 소개한다. `git shell`을 서버에 설정하는 방법은 <>에서 보여준다. ////////////////////////// === Getting and Creating Projects @@ -108,24 +109,24 @@ To take a directory and turn it into a new Git repository so you can start versi 프로젝트 디렉토리로 가서 `git init`이라고 실행한다. 디렉토리에 Git 저장소가 새로 만들어지고 프로젝트를 버전 관리할 수 있다. ////////////////////////// -We first introduce this in <<_getting_a_repo>>, where we show creating a brand new repository to start working with. +We first introduce this in <>, where we show creating a brand new repository to start working with. ////////////////////////// -<<_getting_a_repo>>에서 로컬에 저장소를 만드는 방법을 설명한다. +<>에서 로컬에 저장소를 만드는 방법을 설명한다. ////////////////////////// -We talk briefly about how you can change the default branch from ``master'' in <<_remote_branches>>. +We talk briefly about how you can change the default branch from ``master'' in <>. ////////////////////////// -``master''에서 다른 브랜치로 변경하는 방법은 <<_remote_branches>>에 소개한다. +``master''에서 다른 브랜치로 변경하는 방법은 <>에 소개한다. ////////////////////////// -We use this command to create an empty bare repository for a server in <<_bare_repo>>. +We use this command to create an empty bare repository for a server in <>. ////////////////////////// -<<_bare_repo>>를 보면 Bare 저장소를 만드는 방법이 나와 있다. +<>를 보면 Bare 저장소를 만드는 방법이 나와 있다. ////////////////////////// -Finally, we go through some of the details of what it actually does behind the scenes in <<_plumbing_porcelain>>. +Finally, we go through some of the details of what it actually does behind the scenes in <>. ////////////////////////// -마지막으로 `git init` 명령을 실행하면 내부에서 어떤 일이 일어나는 지 <<_plumbing_porcelain>>에서 설명한다. +마지막으로 `git init` 명령을 실행하면 내부에서 어떤 일이 일어나는 지 <>에서 설명한다. ==== git clone @@ -142,24 +143,24 @@ The `git clone` command is used in dozens of places throughout the book, but we' `git clone` 명령은 이 책 어디에서나 볼 수 있는 명령이지만 가장 설명이 잘된 몇 곳을 소개한다. ////////////////////////// -It's basically introduced and explained in <<_git_cloning>>, where we go through a few examples. +It's basically introduced and explained in <>, where we go through a few examples. ////////////////////////// -이 명령은 <<_git_cloning>>에서 설명했고 바로 따라 할 수 있는 예제도 보여준다. +이 명령은 <>에서 설명했고 바로 따라 할 수 있는 예제도 보여준다. ////////////////////////// -In <<_git_on_the_server>> we look at using the `--bare` option to create a copy of a Git repository with no working directory. +In <> we look at using the `--bare` option to create a copy of a Git repository with no working directory. ////////////////////////// -`--bare` 옵션을 주고 워킹 디렉토리 없는 Git 저장소를 복사하는 방법을 <<_git_on_the_server>>에서 다룬다. +`--bare` 옵션을 주고 워킹 디렉토리 없는 Git 저장소를 복사하는 방법을 <>에서 다룬다. ////////////////////////// -In <<_bundling>> we use it to unbundle a bundled Git repository. +In <> we use it to unbundle a bundled Git repository. ////////////////////////// -Bundle 파일로 된 Git 저장소를 다시 풀 수도 있는데 <<_bundling>>에서 소개한다. +Bundle 파일로 된 Git 저장소를 다시 풀 수도 있는데 <>에서 소개한다. ////////////////////////// -Finally, in <<_cloning_submodules>> we learn the `--recursive` option to make cloning a repository with submodules a little simpler. +Finally, in <> we learn the `--recursive` option to make cloning a repository with submodules a little simpler. ////////////////////////// -마지막으로 `--recursive` 옵션으로 Clone 할 때 서브모듈까지 Clone 하는 방법은 <<_cloning_submodules>>에서 설명한다. +마지막으로 `--recursive` 옵션으로 Clone 할 때 서브모듈까지 Clone 하는 방법은 <>에서 설명한다. ////////////////////////// Though it's used in many other places through the book, these are the ones that are somewhat unique or where it is used in ways that are a little different. @@ -192,24 +193,24 @@ We'll quickly cover some of the unique uses that can be found. 이 명령은 매우 중요한 명령어라서 이 책에서 수십 번도 더 언급한다. 여기서 어떻게 사용하는지 잘 설명한 곳을 찾아보자. ////////////////////////// -We first introduce and explain `git add` in detail in <<_tracking_files>>. +We first introduce and explain `git add` in detail in <>. ////////////////////////// -`git add`는 <<_tracking_files>>에서 자세히 설명한다. +`git add`는 <>에서 자세히 설명한다. ////////////////////////// -We mention how to use it to resolve merge conflicts in <<_basic_merge_conflicts>>. +We mention how to use it to resolve merge conflicts in <>. ////////////////////////// -이 명령는 충돌 시에도 필요하다. <<_basic_merge_conflicts>>에서 어떻게 사용하는지 설명한다. +이 명령는 충돌 시에도 필요하다. <>에서 어떻게 사용하는지 설명한다. ////////////////////////// -We go over using it to interactively stage only specific parts of a modified file in <<_interactive_staging>>. +We go over using it to interactively stage only specific parts of a modified file in <>. ////////////////////////// -<<_interactive_staging>>에서 수정한 파일 일부분을 대화형으로 Stage 하는 방법을 보여준다. +<>에서 수정한 파일 일부분을 대화형으로 Stage 하는 방법을 보여준다. ////////////////////////// -Finally, we emulate it at a low level in <<_tree_objects>>, so you can get an idea of what it's doing behind the scenes. +Finally, we emulate it at a low level in <>, so you can get an idea of what it's doing behind the scenes. ////////////////////////// -마지막으로 이 명령이 내부적으로 어떻게 동작하는지 이해할 수 있도록 <<_tree_objects>>에서 저수준 명령어로 따라 하는 예를 보여준다. +마지막으로 이 명령이 내부적으로 어떻게 동작하는지 이해할 수 있도록 <>에서 저수준 명령어로 따라 하는 예를 보여준다. ==== git status @@ -223,10 +224,10 @@ Modified 상태이거나 Unstaged 상태인 파일이 무엇인지 Staged 상태 Staging Area에 파일을 넣고 꺼내는 방법에 대한 힌트도 보여준다. ////////////////////////// -We first cover `status` in <<_checking_status>>, both in its basic and simplified forms. +We first cover `status` in <>, both in its basic and simplified forms. While we use it throughout the book, pretty much everything you can do with the `git status` command is covered there. ////////////////////////// -`git status` 명령은 <<_checking_status>>에서 간결하게 설명한다. +`git status` 명령은 <>에서 간결하게 설명한다. 이 명령은 이 책에서 아주 많이 사용했지만 여기 설명을 벗어나지 않는다. ==== git diff @@ -237,29 +238,29 @@ The `git diff` command is used when you want to see differences between any two `git diff` 명령은 두 트리 개체의 차이를 보고 싶을 때 사용한다. 워킹 디렉토리와 Staging Area를 비교할 수 있고(`git diff`) Staing Area와 마지막 커밋을 비교할 수 있다(`git diff --staged`). 그리고 두 커밋을 비교할 수 있다(`git diff master branchB`). ////////////////////////// -We first look at the basic uses of `git diff` in <<_git_diff_staged>>, where we show how to see what changes are staged and which are not yet staged. +We first look at the basic uses of `git diff` in <>, where we show how to see what changes are staged and which are not yet staged. ////////////////////////// -`git diff`는 <<_git_diff_staged>>에서 처음 설명한다. Staged 상태인 내용이 무엇이고 반대 상태인 내용은 무엇인지 비교하는 법을 설명한다. +`git diff`는 <>에서 처음 설명한다. Staged 상태인 내용이 무엇이고 반대 상태인 내용은 무엇인지 비교하는 법을 설명한다. ////////////////////////// -We use it to look for possible whitespace issues before committing with the `--check` option in <<_commit_guidelines>>. +We use it to look for possible whitespace issues before committing with the `--check` option in <>. ////////////////////////// -<<_commit_guidelines>>에서 `--check` 옵션으로 공백문자가 잘못 입력되지 않았는지 확인하는 방법을 소개한다. +<>에서 `--check` 옵션으로 공백문자가 잘못 입력되지 않았는지 확인하는 방법을 소개한다. ////////////////////////// -We see how to check the differences between branches more effectively with the `git diff A...B` syntax in <<_what_is_introduced>>. +We see how to check the differences between branches more effectively with the `git diff A...B` syntax in <>. ////////////////////////// -<<_what_is_introduced>>에서 두 브랜치를 효율적으로 비교할 수 있는 `git diff A...B` 문법을 설명한다. +<>에서 두 브랜치를 효율적으로 비교할 수 있는 `git diff A...B` 문법을 설명한다. ////////////////////////// -We use it to filter out whitespace differences with `-b` and how to compare different stages of conflicted files with `--theirs`, `--ours` and `--base` in <<_advanced_merging>>. +We use it to filter out whitespace differences with `-b` and how to compare different stages of conflicted files with `--theirs`, `--ours` and `--base` in <>. ////////////////////////// -<<_advanced_merging>>을 보면 `-b` 옵션으로 공백문자는 무시하고 비교하는 것과 `--theirs`, `--ours`, `--base` 옵션으로 충돌 난 파일의 상태를 비교하는 방법이 나와 있다. +<>을 보면 `-b` 옵션으로 공백문자는 무시하고 비교하는 것과 `--theirs`, `--ours`, `--base` 옵션으로 충돌 난 파일의 상태를 비교하는 방법이 나와 있다. ////////////////////////// -Finally, we use it to effectively compare submodule changes with `--submodule` in <<_starting_submodules>>. +Finally, we use it to effectively compare submodule changes with `--submodule` in <>. ////////////////////////// -마지막으로 <<_starting_submodules>>에서 서브모듈의 변경 내용을 비교하는 `--submodule` 옵션도 설명한다. +마지막으로 <>에서 서브모듈의 변경 내용을 비교하는 `--submodule` 옵션도 설명한다. ==== git difftool @@ -269,9 +270,9 @@ The `git difftool` command simply launches an external tool to show you the diff `git difftool` 명령은 단순히 외부 diff 도구를 실행해준다. `git diff`는 Git에 들어 있는 기능을 사용하는 것이고 외부 diff 도구로 두 트리를 비교하고 싶을 때 사용한다. ////////////////////////// -We only briefly mention this in <<_git_diff_staged>>. +We only briefly mention this in <>. ////////////////////////// -이 명령은 <<_git_diff_staged>>에서 설명한다. +이 명령은 <>에서 설명한다. ==== git commit @@ -281,31 +282,31 @@ The `git commit` command takes all the file contents that have been staged with `git commit` 명령은 `git add`로 Staging Area에 넣은 모든 파일을 커밋한다. 데이터베이스에는 하나의 스냅샷으로 기록된다. 그리고 현 브랜치가 새 커밋을 가리키게 한다. ////////////////////////// -We first cover the basics of committing in <<_committing_changes>>. +We first cover the basics of committing in <>. There we also demonstrate how to use the `-a` flag to skip the `git add` step in daily workflows and how to use the `-m` flag to pass a commit message in on the command line instead of firing up an editor. ////////////////////////// -커밋에 대한 기본적인 내용은 <<_committing_changes>>에서 다룬다. +커밋에 대한 기본적인 내용은 <>에서 다룬다. `-a` 플래그를 주고 `git add`를 건너뛰고 바로 커밋하는 것과 `-m`으로 커밋 메시지를 파라미터로 넘기는 방법도 보여준다. ////////////////////////// -In <<_undoing>> we cover using the `--amend` option to redo the most recent commit. +In <> we cover using the `--amend` option to redo the most recent commit. ////////////////////////// -가장 최근 커밋을 수정하는 `--amend` 옵션은 <<_undoing>>에서 설명한다. +가장 최근 커밋을 수정하는 `--amend` 옵션은 <>에서 설명한다. ////////////////////////// -In <<_git_branches_overview>>, we go into much more detail about what `git commit` does and why it does it like that. +In <>, we go into much more detail about what `git commit` does and why it does it like that. ////////////////////////// -<<_git_branches_overview>>을 보면 `git commit`이 무엇을 하는지 왜 그렇게 하는지 설명한다. +<>을 보면 `git commit`이 무엇을 하는지 왜 그렇게 하는지 설명한다. ////////////////////////// -We looked at how to sign commits cryptographically with the `-S` flag in <<_signing_commits>>. +We looked at how to sign commits cryptographically with the `-S` flag in <>. ////////////////////////// -`-S` 플래그로 커밋에 서명하는 방법은 <<_signing_commits>>에서 설명한다. +`-S` 플래그로 커밋에 서명하는 방법은 <>에서 설명한다. ////////////////////////// -Finally, we take a look at what the `git commit` command does in the background and how it's actually implemented in <<_git_commit_objects>>. +Finally, we take a look at what the `git commit` command does in the background and how it's actually implemented in <>. ////////////////////////// -마지막으로 <<_git_commit_objects>>에서 `git commit` 명령이 내부적으로 하는 일이 무엇이고 실제로 어떻게 구현돼 있는지 설명한다. +마지막으로 <>에서 `git commit` 명령이 내부적으로 하는 일이 무엇이고 실제로 어떻게 구현돼 있는지 설명한다. ==== git reset @@ -319,19 +320,19 @@ This final option makes it possible for this command to lose your work if used i `--hard` 옵션을 잘못 사용하면 작업물을 잃어버릴 수도 있기 때문에 이 명령을 잘 이해하고 있어야 한다. ////////////////////////// -We first effectively cover the simplest use of `git reset` in <<_unstaging>>, where we use it to unstage a file we had run `git add` on. +We first effectively cover the simplest use of `git reset` in <>, where we use it to unstage a file we had run `git add` on. ////////////////////////// -`git reset`은 무엇보다도 `git add`로 추가한 파일을 Unstage 하는데 사용한다. <<_unstaging>>에서 설명한다. +`git reset`은 무엇보다도 `git add`로 추가한 파일을 Unstage 하는데 사용한다. <>에서 설명한다. ////////////////////////// -We then cover it in quite some detail in <<_git_reset>>, which is entirely devoted to explaining this command. +We then cover it in quite some detail in <>, which is entirely devoted to explaining this command. ////////////////////////// -<<_git_reset>>에서 이 명령을 전체적으로 자세히 설명한다. +<>에서 이 명령을 전체적으로 자세히 설명한다. ////////////////////////// -We use `git reset --hard` to abort a merge in <<_abort_merge>>, where we also use `git merge --abort`, which is a bit of a wrapper for the `git reset` command. +We use `git reset --hard` to abort a merge in <>, where we also use `git merge --abort`, which is a bit of a wrapper for the `git reset` command. ////////////////////////// -`git reset --hard` 명령으로 충돌 시 Merge를 취소할 수 있다. `git merge --abort`로도 같은 일을 할 수 있는데 이 명령은 `git reset` 명령어의 Wrapper다. 이 내용은 <<_abort_merge>>에서 설명한다. +`git reset --hard` 명령으로 충돌 시 Merge를 취소할 수 있다. `git merge --abort`로도 같은 일을 할 수 있는데 이 명령은 `git reset` 명령어의 Wrapper다. 이 내용은 <>에서 설명한다. ==== git rm @@ -343,15 +344,15 @@ It is similar to `git add` in that it stages a removal of a file for the next co `git add` 명령과 비슷하게 파일의 삭제를 Stage 하는 기능이다. ////////////////////////// -We cover the `git rm` command in some detail in <<_removing_files>>, including recursively removing files and only removing files from the staging area but leaving them in the working directory with `--cached`. +We cover the `git rm` command in some detail in <>, including recursively removing files and only removing files from the staging area but leaving them in the working directory with `--cached`. ////////////////////////// -<<_removing_files>>에서 `git rm` 명령을 자세히 설명한다. Staging Area와 워킹 디렉토리 모두에서 파일을 삭제하는 방법과 `--cached` 옵션을 주고 Staging Area에 있는 파일만 지우고 워킹 디렉토리의 파일은 남겨두는 방법도 설명한다. +<>에서 `git rm` 명령을 자세히 설명한다. Staging Area와 워킹 디렉토리 모두에서 파일을 삭제하는 방법과 `--cached` 옵션을 주고 Staging Area에 있는 파일만 지우고 워킹 디렉토리의 파일은 남겨두는 방법도 설명한다. ////////////////////////// -The only other differing use of `git rm` in the book is in <<_removing_objects>> where we briefly use and explain the `--ignore-unmatch` when running `git filter-branch`, which simply makes it not error out when the file we are trying to remove doesn't exist. +The only other differing use of `git rm` in the book is in <> where we briefly use and explain the `--ignore-unmatch` when running `git filter-branch`, which simply makes it not error out when the file we are trying to remove doesn't exist. This can be useful for scripting purposes. ////////////////////////// -대부분은 <<_removing_objects>>에서 설명한 대로 쓰지만, 이 책에서는 다르게 사용한 예도 있다. `git filter-branch` 명령을 실행할 때 `git rm` 명령에 `--ignore-unmatch` 옵션을 주고 사용한다. 이 옵션은 삭제하려는 파일이 없을 때 에러가 나지 않게 해준다. +대부분은 <>에서 설명한 대로 쓰지만, 이 책에서는 다르게 사용한 예도 있다. `git filter-branch` 명령을 실행할 때 `git rm` 명령에 `--ignore-unmatch` 옵션을 주고 사용한다. 이 옵션은 삭제하려는 파일이 없을 때 에러가 나지 않게 해준다. 스크립트를 작성할 때는 유용하다. ==== git mv @@ -362,9 +363,9 @@ The `git mv` command is a thin convenience command to move a file and then run ` `git mv` 명령은 파일을 옮기고(이름을 변경하고) 나서 새 파일에 `git add` 명령을 실행하고 이전 파일에는 `git rm`을 실행시켜주는 명령이다. ////////////////////////// -We only briefly mention this command in <<_git_mv>>. +We only briefly mention this command in <>. ////////////////////////// -이 명령은 <<_git_mv>>에서 다룬다. +이 명령은 <>에서 다룬다. ==== git clean @@ -376,9 +377,9 @@ This could include removing temporary build artifacts or merge conflict files. 이 명령으로 충돌로 생긴 파일이나 빌드 아티팩트 파일을 삭제할 때 편리하다. ////////////////////////// -We cover many of the options and scenarios in which you might used the clean command in <<_git_clean>>. +We cover many of the options and scenarios in which you might used the clean command in <>. ////////////////////////// -이 명령을 사용하는 상황과 필요한 옵션은 <<_git_clean>>에서 다룬다. +이 명령을 사용하는 상황과 필요한 옵션은 <>에서 다룬다. ////////////////////////// === Branching and Merging @@ -400,21 +401,21 @@ It can list the branches you have, create a new branch, delete branches and rena 이 명령은 브랜치를 모두 보여주고 브랜치를 새로 만들고 브랜치를 삭제하고 브랜치 이름을 변경한다. ////////////////////////// -Most of <<_git_branching>> is dedicated to the `branch` command and its used throughout the entire chapter. -We first introduce it in <<_create_new_branch>> and we go through most of it's other features (listing and deleting) in <<_branch_management>>. +Most of <> is dedicated to the `branch` command and its used throughout the entire chapter. +We first introduce it in <> and we go through most of it's other features (listing and deleting) in <>. ////////////////////////// -<<_git_branching>>에서 `branch` 명령을 설명하는데 이 명령을 한 장에 걸쳐서 설명한다. -브랜치를 만드는 것은 <<_create_new_branch>>에서 설명하고 브랜치를 보여주거나 삭제하는 기능은 <<_branch_management>>에서 설명한다. +<>에서 `branch` 명령을 설명하는데 이 명령을 한 장에 걸쳐서 설명한다. +브랜치를 만드는 것은 <>에서 설명하고 브랜치를 보여주거나 삭제하는 기능은 <>에서 설명한다. ////////////////////////// -In <<_tracking_branches>> we use the `git branch -u` option to set up a tracking branch. +In <> we use the `git branch -u` option to set up a tracking branch. ////////////////////////// -`git branch -u` 명령으로 트래킹 브랜치를 만드는 것을 <<_tracking_branches>>에서 보여준다. +`git branch -u` 명령으로 트래킹 브랜치를 만드는 것을 <>에서 보여준다. ////////////////////////// -Finally, we go through some of what it does in the background in <<_git_refs>>. +Finally, we go through some of what it does in the background in <>. ////////////////////////// -내부적으로 어떤 일이 벌어지는지는 <<_git_refs>>에서 설명한다. +내부적으로 어떤 일이 벌어지는지는 <>에서 설명한다. ==== git checkout @@ -424,29 +425,29 @@ The `git checkout` command is used to switch branches and check content out into `git checkout` 명령은 브랜치를 변경하고 해당 파일을 워킹 디렉토리로 복사한다. ////////////////////////// -We first encounter the command in <<_switching_branches>> along with the `git branch` command. +We first encounter the command in <> along with the `git branch` command. ////////////////////////// -`git branch` 명령을 설명하면서 이 명령도 설명한다(<<_switching_branches>>). +`git branch` 명령을 설명하면서 이 명령도 설명한다(<>). ////////////////////////// -We see how to use it to start tracking branches with the `--track` flag in <<_tracking_branches>>. +We see how to use it to start tracking branches with the `--track` flag in <>. ////////////////////////// -<<_tracking_branches>>에서 `--track` 옵션을 주고 트래킹 브랜치를 만드는 방법을 설명한다. +<>에서 `--track` 옵션을 주고 트래킹 브랜치를 만드는 방법을 설명한다. ////////////////////////// -We use it to reintroduce file conflicts with `--conflict=diff3` in <<_checking_out_conflicts>>. +We use it to reintroduce file conflicts with `--conflict=diff3` in <>. ////////////////////////// -이 명령에 `--conflict=diff3`을 주면 충돌 표시된 파일을 재현할 수 있다(<<_checking_out_conflicts>>). +이 명령에 `--conflict=diff3`을 주면 충돌 표시된 파일을 재현할 수 있다(<>). ////////////////////////// -We go into closer detail on its relationship with `git reset` in <<_git_reset>>. +We go into closer detail on its relationship with `git reset` in <>. ////////////////////////// -`git reset` 명령과 관련된 내용은 <<_git_reset>>에서 설명한다. +`git reset` 명령과 관련된 내용은 <>에서 설명한다. ////////////////////////// -Finally, we go into some implementation detail in <<_the_head>>. +Finally, we go into some implementation detail in <>. ////////////////////////// -마지막으로 `git checkout`이 어떻게 구현됐는지는 <<_the_head>>를 참고한다. +마지막으로 `git checkout`이 어떻게 구현됐는지는 <>를 참고한다. ==== git merge @@ -456,29 +457,29 @@ The `git merge` tool is used to merge one or more branches into the branch you `git merge`는 다른 브랜치를 현재 Checkout된 브랜치에 Merge 하는 명령이다. Merge 하고 나서 현재 브랜치가 Merge 된 결과를 가리키도록 옮긴다. ////////////////////////// -The `git merge` command was first introduced in <<_basic_branching>>. Though it is used in various places in the book, there are very few variations of the `merge` command -- generally just `git merge ` with the name of the single branch you want to merge in. +The `git merge` command was first introduced in <>. Though it is used in various places in the book, there are very few variations of the `merge` command -- generally just `git merge ` with the name of the single branch you want to merge in. ////////////////////////// -`git merge` 명령은 <<_basic_branching>>에서 설명한다. 이 책의 여러 곳에서 `merge` 명령을 사용하지만 <<_basic_branching>>에서 설명한 것에서 크게 벗어나지 않는다. `git merge ` 명령을 실행하면 해당 브랜치가 Merge 된다. +`git merge` 명령은 <>에서 설명한다. 이 책의 여러 곳에서 `merge` 명령을 사용하지만 <>에서 설명한 것에서 크게 벗어나지 않는다. `git merge ` 명령을 실행하면 해당 브랜치가 Merge 된다. ////////////////////////// -We covered how to do a squashed merge (where Git merges the work but pretends like it's just a new commit without recording the history of the branch you're merging in) at the very end of <<_public_project>>. +We covered how to do a squashed merge (where Git merges the work but pretends like it's just a new commit without recording the history of the branch you're merging in) at the very end of <>. ////////////////////////// -<<_public_project>>의 끝 부분에서 Squash 해서 Merge 하는 방법도 설명한다. Merge 하는 브랜치의 히스토리는 무시하고 새 커밋을 하나 만들어 Merge 하는 방법이다. +<>의 끝 부분에서 Squash 해서 Merge 하는 방법도 설명한다. Merge 하는 브랜치의 히스토리는 무시하고 새 커밋을 하나 만들어 Merge 하는 방법이다. ////////////////////////// -We went over a lot about the merge process and command, including the `-Xignore-space-change` command and the `--abort` flag to abort a problem merge in <<_advanced_merging>>. +We went over a lot about the merge process and command, including the `-Xignore-space-change` command and the `--abort` flag to abort a problem merge in <>. ////////////////////////// -<<_advanced_merging>>에서는 `-Xignore-space-change` 옵션을 사용하는 방법이나 `--abort` 플래그로 Merge를 중단하는 방법 등을 설명한다. +<>에서는 `-Xignore-space-change` 옵션을 사용하는 방법이나 `--abort` 플래그로 Merge를 중단하는 방법 등을 설명한다. ////////////////////////// -We learned how to verify signatures before merging if your project is using GPG signing in <<_signing_commits>>. +We learned how to verify signatures before merging if your project is using GPG signing in <>. ////////////////////////// -Merge 하기 전에 서명을 검사하는 방법도 설명한다. GPG 서명은 <<_signing_commits>>에서 설명한다. +Merge 하기 전에 서명을 검사하는 방법도 설명한다. GPG 서명은 <>에서 설명한다. ////////////////////////// -Finally, we learned about Subtree merging in <<_subtree_merge>>. +Finally, we learned about Subtree merging in <>. ////////////////////////// -마지막으로 Subtree를 Merge 하는 것은 <<_subtree_merge>>에서 배운다. +마지막으로 Subtree를 Merge 하는 것은 <>에서 배운다. ==== git mergetool @@ -488,9 +489,9 @@ The `git mergetool` command simply launches an external merge helper in case you `git mergetool` 명령은 외부 Merge Helper를 실행해 준다. Merge 하다가 문제가 생겼을 때 사용한다. ////////////////////////// -We mention it quickly in <<_basic_merge_conflicts>> and go into detail on how to implement your own external merge tool in <<_external_merge_tools>>. +We mention it quickly in <> and go into detail on how to implement your own external merge tool in <>. ////////////////////////// -<<_basic_merge_conflicts>>에서 살짝 맛을 보여주고 <<_external_merge_tools>>에서 자신의 외부 Merge 도구를 설정하는 방법을 설명한다. +<>에서 살짝 맛을 보여주고 <>에서 자신의 외부 Merge 도구를 설정하는 방법을 설명한다. ==== git log @@ -509,45 +510,45 @@ This command is used in nearly every chapter of the book to demonstrate the hist 이 책에서 프로젝트 히스트리를 보여줄 때마다 이 명령을 사용한다고 봐도 된다. ////////////////////////// -We introduce the command and cover it in some depth in <<_viewing_history>>. +We introduce the command and cover it in some depth in <>. There we look at the `-p` and `--stat` option to get an idea of what was introduced in each commit and the `--pretty` and `--oneline` options to view the history more concisely, along with some simple date and author filtering options. ////////////////////////// -<<_viewing_history>>에서 이 명령을 깊게 다뤘다. +<>에서 이 명령을 깊게 다뤘다. `-p`와 `--stat` 옵션을 주면 각 커밋 사이에 생긴 변화를 확인할 수 있다. `--pretty`와 `--oneline` 옵션을 주면 히스토리를 좀 더 깔끔하게 볼 수 있다. 이 옵션은 Author나 날짜를 중심으로 히스토리를 보여준다. ////////////////////////// -In <<_create_new_branch>> we use it with the `--decorate` option to easily visualize where our branch pointers are located and we also use the `--graph` option to see what divergent histories look like. +In <> we use it with the `--decorate` option to easily visualize where our branch pointers are located and we also use the `--graph` option to see what divergent histories look like. ////////////////////////// -<<_create_new_branch>>을 보면 `--decorate` 옵션을 주고 히스토리에 브랜치 포인터가 함께 보이도록 하는 방법이 나온다. `--graph` 옵션을 추가하면 히스토리가 어떻게 진행됐는지도 볼 수 있다. +<>을 보면 `--decorate` 옵션을 주고 히스토리에 브랜치 포인터가 함께 보이도록 하는 방법이 나온다. `--graph` 옵션을 추가하면 히스토리가 어떻게 진행됐는지도 볼 수 있다. ////////////////////////// -In <<_private_team>> and <<_commit_ranges>> we cover the `branchA..branchB` syntax to use the `git log` command to see what commits are unique to a branch relative to another branch. -In <<_commit_ranges>> we go through this fairly extensively. +In <> and <> we cover the `branchA..branchB` syntax to use the `git log` command to see what commits are unique to a branch relative to another branch. +In <> we go through this fairly extensively. ////////////////////////// -<<_private_team>>과 <<_commit_ranges>>에서 `branchA..branchB` 문법을 사용하는 방법을 설명한다. `branchB`에만 있고 `branchA`에는 없는 커밋만 걸러서 볼 수 있다. -<<_commit_ranges>>에서 이 문법을 다양하게 조합하는 방법을 설명한다. +<>과 <>에서 `branchA..branchB` 문법을 사용하는 방법을 설명한다. `branchB`에만 있고 `branchA`에는 없는 커밋만 걸러서 볼 수 있다. +<>에서 이 문법을 다양하게 조합하는 방법을 설명한다. ////////////////////////// -In <<_merge_log>> and <<_triple_dot>> we cover using the `branchA...branchB` format and the `--left-right` syntax to see what is in one branch or the other but not in both. -In <<_merge_log>> we also look at how to use the `--merge` option to help with merge conflict debugging as well as using the `--cc` option to look at merge commit conflicts in your history. +In <> and <> we cover using the `branchA...branchB` format and the `--left-right` syntax to see what is in one branch or the other but not in both. +In <> we also look at how to use the `--merge` option to help with merge conflict debugging as well as using the `--cc` option to look at merge commit conflicts in your history. ////////////////////////// -<<_merge_log>>와 <<_triple_dot>>에서 `branchA...branchB` 포맷을 사용하는 방법을 설명한다. 이 문법은 둘 중 한쪽에 속한 커밋만 보여준다. -`--left-right` 옵션을 주면 각각 어느 쪽에 속한 것인지도 보여준다. <<_merge_log>>에서는 충돌을 해결할 때 유용한 `--merge` 옵션도 설명한다. `--cc` 옵션을 사용하면 충돌을 히스토리에 보여준다. +<>와 <>에서 `branchA...branchB` 포맷을 사용하는 방법을 설명한다. 이 문법은 둘 중 한쪽에 속한 커밋만 보여준다. +`--left-right` 옵션을 주면 각각 어느 쪽에 속한 것인지도 보여준다. <>에서는 충돌을 해결할 때 유용한 `--merge` 옵션도 설명한다. `--cc` 옵션을 사용하면 충돌을 히스토리에 보여준다. ////////////////////////// -In <<_git_reflog>> we use the `-g` option to view the Git reflog through this tool instead of doing branch traversal. +In <> we use the `-g` option to view the Git reflog through this tool instead of doing branch traversal. ////////////////////////// -`-g` 옵션을 사용하면 브랜치를 오간 기록인 Reflog도 함께 보여준다. 이것은 <<_git_reflog>>에서 설명한다. +`-g` 옵션을 사용하면 브랜치를 오간 기록인 Reflog도 함께 보여준다. 이것은 <>에서 설명한다. ////////////////////////// -In <<_searching>> we look at using the `-S` and `-L` options to do fairly sophisticated searches for something that happened historically in the code such as seeing the history of a function. +In <> we look at using the `-S` and `-L` options to do fairly sophisticated searches for something that happened historically in the code such as seeing the history of a function. ////////////////////////// -<<_searching>>에서는 `-S`와 `-L` 옵션을 소개한다. 이 옵션을 사용하면 특정 코드에 대한 히스토리만 찾아볼 수 있다. 특정 함수의 히스토리를 보고 싶을 때 사용하면 유용하다. +<>에서는 `-S`와 `-L` 옵션을 소개한다. 이 옵션을 사용하면 특정 코드에 대한 히스토리만 찾아볼 수 있다. 특정 함수의 히스토리를 보고 싶을 때 사용하면 유용하다. ////////////////////////// -In <<_signing_commits>> we see how to use `--show-signature` to add a validation string to each commit in the `git log` output based on if it was validly signed or not. +In <> we see how to use `--show-signature` to add a validation string to each commit in the `git log` output based on if it was validly signed or not. ////////////////////////// -<<_signing_commits>>에서 `--show-signature` 옵션을 사용하는 방법을 설명한다. `git log` 명령에 이 옵션을 사용하면 커밋의 서명 정보까지도 보여준다. +<>에서 `--show-signature` 옵션을 사용하는 방법을 설명한다. `git log` 명령에 이 옵션을 사용하면 커밋의 서명 정보까지도 보여준다. ==== git stash @@ -557,9 +558,9 @@ The `git stash` command is used to temporarily store uncommitted work in order t `git stash` 명령은 아직 커밋하지 않은 일을 저장하는 데 사용된다. 작업 중인 워킹 디렉토리를 저장한다. ////////////////////////// -This is basically entirely covered in <<_git_stashing>>. +This is basically entirely covered in <>. ////////////////////////// -<<_git_stashing>>에서 설명한다. +<>에서 설명한다. ==== git tag @@ -571,14 +572,14 @@ Generally this is used for things like releases. 일반적으로 배포할 때 사용한다. ////////////////////////// -This command is introduced and covered in detail in <<_git_tagging>> and we use it in practice in <<_tagging_releases>>. +This command is introduced and covered in detail in <> and we use it in practice in <>. ////////////////////////// -이 명령은 <<_git_tagging>>에서 자세히 설명하고 <<_tagging_releases>>에 보면 구체적인 사례도 보여준다. +이 명령은 <>에서 자세히 설명하고 <>에 보면 구체적인 사례도 보여준다. ////////////////////////// -We also cover how to create a GPG signed tag with the `-s` flag and verify one with the `-v` flag in <<_signing>>. +We also cover how to create a GPG signed tag with the `-s` flag and verify one with the `-v` flag in <>. ////////////////////////// -태그에 GPG 서명을 하려면 `-s` 플래그를 주면 되고 `-v` 플래그를 주면 서명을 검증할 수 있다. <<_signing>>에서 다룬다. +태그에 GPG 서명을 하려면 `-s` 플래그를 주면 되고 `-v` 플래그를 주면 서명을 검증할 수 있다. <>에서 다룬다. ////////////////////////// === Sharing and Updating Projects @@ -600,24 +601,24 @@ The `git fetch` command communicates with a remote repository and fetches down a `git fetch` 명령은 로컬 데이터베이스에 있는 것을 뺀 리모트 저장소의 모든 것을 가져온다. ////////////////////////// -We first look at this command in <<_fetching_and_pulling>> and we continue to see examples of it use in <<_remote_branches>>. +We first look at this command in <> and we continue to see examples of it use in <>. ////////////////////////// -<<_fetching_and_pulling>>에서 이 명령을 설명하고 <<_remote_branches>>에 보면 참고할 수 있는 예제가 더 있다. +<>에서 이 명령을 설명하고 <>에 보면 참고할 수 있는 예제가 더 있다. ////////////////////////// -We also use it in several of the examples in <<_contributing_project>>. +We also use it in several of the examples in <>. ////////////////////////// -<<_contributing_project>>에도 좋은 예제가 많다. +<>에도 좋은 예제가 많다. ////////////////////////// -We use it to fetch a single specific reference that is outside of the default space in <<_pr_refs>> and we see how to fetch from a bundle in <<_bundling>>. +We use it to fetch a single specific reference that is outside of the default space in <> and we see how to fetch from a bundle in <>. ////////////////////////// -Ref를 한 개만 가져오는 방법은 <<_pr_refs>>에서 설명하고 번들에서 가져오는 방법은 <<_bundling>>에서 설명한다. +Ref를 한 개만 가져오는 방법은 <>에서 설명하고 번들에서 가져오는 방법은 <>에서 설명한다. ////////////////////////// -We set up highly custom refspecs in order to make `git fetch` do something a little different than the default in <<_refspec>>. +We set up highly custom refspecs in order to make `git fetch` do something a little different than the default in <>. ////////////////////////// -Fetch 하는 기본 Refspec을 수정하는 방법은 <<_refspec>>에서 설명한다. 원하는 대로 수정할 수 있다. +Fetch 하는 기본 Refspec을 수정하는 방법은 <>에서 설명한다. 원하는 대로 수정할 수 있다. ==== git pull @@ -627,24 +628,24 @@ The `git pull` command is basically a combination of the `git fetch` and `git me `git pull` 명령은 `git fetch`와 `git merge` 명령을 순서대로 실행하는 것뿐이다. 그래서 해당 리모트에서 Fetch 하고 즉시 현 브랜치로 Merge를 시도한다. ////////////////////////// -We introduce it quickly in <<_fetching_and_pulling>> and show how to see what it will merge if you run it in <<_inspecting_remote>>. +We introduce it quickly in <> and show how to see what it will merge if you run it in <>. ////////////////////////// -<<_fetching_and_pulling>>에서 이 명령을 사용하는 방법을 다뤘고 정확히 무엇을 Merge 하는 지는 <<_inspecting_remote>>에서 설명한다. +<>에서 이 명령을 사용하는 방법을 다뤘고 정확히 무엇을 Merge 하는 지는 <>에서 설명한다. ////////////////////////// -We also see how to use it to help with rebasing difficulties in <<_rebase_rebase>>. +We also see how to use it to help with rebasing difficulties in <>. ////////////////////////// -<<_rebase_rebase>>에서 그 어렵다는 Rebase를 다루는 방법을 설명한다. +<>에서 그 어렵다는 Rebase를 다루는 방법을 설명한다. ////////////////////////// -We show how to use it with a URL to pull in changes in a one-off fashion in <<_checking_out_remotes>>. +We show how to use it with a URL to pull in changes in a one-off fashion in <>. ////////////////////////// -저장소 URL을 주고 한 번만 Pull 해 올 수 있다는 것을 <<_checking_out_remotes>>에서 설명한다. +저장소 URL을 주고 한 번만 Pull 해 올 수 있다는 것을 <>에서 설명한다. ////////////////////////// -Finally, we very quickly mention that you can use the `--verify-signatures` option to it in order to verify that commits you are pulling have been GPG signed in <<_signing_commits>>. +Finally, we very quickly mention that you can use the `--verify-signatures` option to it in order to verify that commits you are pulling have been GPG signed in <>. ////////////////////////// -`--verify-signatures` 옵션을 주면 Pull 할 때 커밋의 PGP 서명을 검증한다. PGP 서명은 <<_signing_commits>>에서 설명한다. +`--verify-signatures` 옵션을 주면 Pull 할 때 커밋의 PGP 서명을 검증한다. PGP 서명은 <>에서 설명한다. ==== git push @@ -656,42 +657,42 @@ It requires write access to the other repository and so normally is authenticate Push를 하려면 원격 저장소에 대한 쓰기 권한이 필요하고 인증돼야 한다. ////////////////////////// -We first look at the `git push` command in <<_pushing_remotes>>. +We first look at the `git push` command in <>. Here we cover the basics of pushing a branch to a remote repository. -In <<_pushing_branches>> we go a little deeper into pushing specific branches and in <<_tracking_branches>> we see how to set up tracking branches to automatically push to. -In <<_delete_branches>> we use the `--delete` flag to delete a branch on the server with `git push`. +In <> we go a little deeper into pushing specific branches and in <> we see how to set up tracking branches to automatically push to. +In <> we use the `--delete` flag to delete a branch on the server with `git push`. ////////////////////////// -<>에서 `git push` 명령으로 +<>에서 `git push` 명령으로 브랜치를 원격 저장소에 Push 하는 방법을 설명한다. -조금 깊게 브랜치를 하나씩 골라서 Push 하는 방법은 <<_pushing_branches>>에서 설명한다. 자동으로 Push 하도록 트래킹 브랜치를 설정하는 방법은 <<_tracking_branches>>에서 설명한다. -`git push --delete` 명령으로 원격 서버의 브랜치를 삭제하는 방법은 <<_delete_branches>>에서 설명한다. +조금 깊게 브랜치를 하나씩 골라서 Push 하는 방법은 <>에서 설명한다. 자동으로 Push 하도록 트래킹 브랜치를 설정하는 방법은 <>에서 설명한다. +`git push --delete` 명령으로 원격 서버의 브랜치를 삭제하는 방법은 <>에서 설명한다. ////////////////////////// -Throughout <<_contributing_project>> we see several examples of using `git push` to share work on branches through multiple remotes. +Throughout <> we see several examples of using `git push` to share work on branches through multiple remotes. ////////////////////////// -<<_contributing_project>>에서는 `git push`를 주구장창 사용한다. 리모트를 여러 개 사용해서 브랜치에 작업한 내용을 공유하는 것을 보여준다. +<>에서는 `git push`를 주구장창 사용한다. 리모트를 여러 개 사용해서 브랜치에 작업한 내용을 공유하는 것을 보여준다. ////////////////////////// -We see how to use it to share tags that you have made with the `--tags` option in <<_sharing_tags>>. +We see how to use it to share tags that you have made with the `--tags` option in <>. ////////////////////////// -`--tags` 옵션을 주고 태그를 Push 하는 방법은 <<_sharing_tags>>에서 설명한다. +`--tags` 옵션을 주고 태그를 Push 하는 방법은 <>에서 설명한다. ////////////////////////// -In <<_publishing_submodules>> we use the `--recurse-submodules` option to check that all of our submodules work has been published before pushing the superproject, which can be really helpful when using submodules. +In <> we use the `--recurse-submodules` option to check that all of our submodules work has been published before pushing the superproject, which can be really helpful when using submodules. ////////////////////////// -서브모듈의 코드를 수정했을 때는 `--recurse-submodules` 옵션이 좋다. 프로젝트를 Push 할 때 서브모듈에 Push 할 게 있으면 서브모듈부터 Push 하므로 매우 편리하다. 이 옵션은 <<_publishing_submodules>>에서 설명한다. +서브모듈의 코드를 수정했을 때는 `--recurse-submodules` 옵션이 좋다. 프로젝트를 Push 할 때 서브모듈에 Push 할 게 있으면 서브모듈부터 Push 하므로 매우 편리하다. 이 옵션은 <>에서 설명한다. ////////////////////////// -In <<_other_client_hooks>> we talk briefly about the `pre-push` hook, which is a script we can setup to run before a push completes to verify that it should be allowed to push. +In <> we talk briefly about the `pre-push` hook, which is a script we can setup to run before a push completes to verify that it should be allowed to push. ////////////////////////// -<<_other_client_hooks>>에서 `pre-push` 훅에 대해서 설명했다. 이 훅에 Push 해도 되는지 검증하는 스크립트를 설정하면 규칙에 따르도록 Push를 검증할 수 있다. +<>에서 `pre-push` 훅에 대해서 설명했다. 이 훅에 Push 해도 되는지 검증하는 스크립트를 설정하면 규칙에 따르도록 Push를 검증할 수 있다. ////////////////////////// -Finally, in <<_pushing_refspecs>> we look at pushing with a full refspec instead of the general shortcuts that are normally used. +Finally, in <> we look at pushing with a full refspec instead of the general shortcuts that are normally used. This can help you be very specific about what work you wish to share. ////////////////////////// 일반적인 이름 규칙에 따라서 Push 하는 것이 아니라 Refspec을 사용해서 원하는 이름으로 Push 하는 것도 가능하다. -이것은 <<_pushing_refspecs>>에서 설명한다. +이것은 <>에서 설명한다. ==== git remote @@ -705,9 +706,9 @@ You can have several of these and the `git remote` command is used to add, chang `git remote` 명령으로 이 리모트를 여러 개 만들어 관리할 수 있다. ////////////////////////// -This command is covered in detail in <<_remote_repos>>, including listing, adding, removing and renaming them. +This command is covered in detail in <>, including listing, adding, removing and renaming them. ////////////////////////// -이 리모트를 조회하고 추가하고 삭제하고 수정하는 방법은 <<_remote_repos>>에서 잘 설명한다. +이 리모트를 조회하고 추가하고 삭제하고 수정하는 방법은 <>에서 잘 설명한다. ////////////////////////// It is used in nearly every subsequent chapter in the book too, but always in the standard `git remote add ` format. @@ -722,9 +723,9 @@ The `git archive` command is used to create an archive file of a specific snapsh `git archive` 명령은 프로젝트 스냅샷을 아카이브 파일로 만들어 준다. ////////////////////////// -We use `git archive` to create a tarball of a project for sharing in <<_preparing_release>>. +We use `git archive` to create a tarball of a project for sharing in <>. ////////////////////////// -<<_preparing_release>>에서 설명하는데 프로젝트를 Tarball로 만들어 공유할 때 사용한다. +<>에서 설명하는데 프로젝트를 Tarball로 만들어 공유할 때 사용한다. ==== git submodule @@ -738,9 +739,9 @@ The `submodule` command has several sub-commands (`add`, `update`, `sync`, etc) `submodule` 명령에 있는 `add`, `update`, `sync` 등의 하위 명령어로 서브모듈을 관리할 수 있다. ////////////////////////// -This command is only mentioned and entirely covered in <<_git_submodules>>. +This command is only mentioned and entirely covered in <>. ////////////////////////// -이 명령은 <<_git_submodules>>에서 설명한다. +이 명령은 <>에서 설명한다. ////////////////////////// === Inspection and Comparison @@ -757,19 +758,19 @@ Normally you would use this to show the information about a tag or a commit. 태그나 커밋 정보를 보고 싶을 때 이 명령을 사용한다. ////////////////////////// -We first use it to show annotated tag information in <<_annotated_tags>>. +We first use it to show annotated tag information in <>. ////////////////////////// -<<_annotated_tags>>을 보면 Annotated 태그의 정보를 보여주는 예제가 나온다. +<>을 보면 Annotated 태그의 정보를 보여주는 예제가 나온다. ////////////////////////// -Later we use it quite a bit in <<_revision_selection>> to show the commits that our various revision selections resolve to. +Later we use it quite a bit in <> to show the commits that our various revision selections resolve to. ////////////////////////// -<<_revision_selection>>에서 이 명령을 사용하는 것을 보여준다. +<>에서 이 명령을 사용하는 것을 보여준다. ////////////////////////// -One of the more interesting things we do with `git show` is in <<_manual_remerge>> to extract specific file contents of various stages during a merge conflict. +One of the more interesting things we do with `git show` is in <> to extract specific file contents of various stages during a merge conflict. ////////////////////////// -Merge 하다가 충돌이 났을 때 특정 버전의 파일 내용을 `git show`로 꺼내 볼 수 있다. <<_manual_remerge>>에서 이 점을 설명한다. +Merge 하다가 충돌이 났을 때 특정 버전의 파일 내용을 `git show`로 꺼내 볼 수 있다. <>에서 이 점을 설명한다. ==== git shortlog @@ -781,9 +782,9 @@ It will take many of the same options that the `git log` command will but instea 옵션도 `git log` 명령의 것과 매우 비슷하다. 이 명령은 Author 별로 커밋을 묶어서 보여준다. ////////////////////////// -We showed how to use it to create a nice changelog in <<_the_shortlog>>. +We showed how to use it to create a nice changelog in <>. ////////////////////////// -이 명령은 Changelog 파일을 만들 때 유용한 데 <<_the_shortlog>>에서 보여준다. +이 명령은 Changelog 파일을 만들 때 유용한 데 <>에서 보여준다. ==== git describe @@ -795,9 +796,9 @@ It's a way to get a description of a commit that is as unambiguous as a commit S 커밋 SHA-1처럼 식별 가능하고 사람이 이해할 수 있는 정보가 필요할 때 사용한다. ////////////////////////// -We use `git describe` in <<_build_number>> and <<_preparing_release>> to get a string to name our release file after. +We use `git describe` in <> and <> to get a string to name our release file after. ////////////////////////// -<<_build_number>>와 <<_preparing_release>>에서 `git describe` 명령을 설명한다. 이 명령으로 배포 파일의 이름을 짓는다. +<>와 <>에서 `git describe` 명령을 설명한다. 이 명령으로 배포 파일의 이름을 짓는다. === Debugging @@ -816,9 +817,9 @@ The `git bisect` tool is an incredibly helpful debugging tool used to find which `git bisect`는 굉장히 유용하다. 이진 탐색 알고리즘을 사용해서 버그나 문제가 생긴 커밋을 쉽게 찾을 수 있다. ////////////////////////// -It is fully covered in <<_binary_search>> and is only mentioned in that section. +It is fully covered in <> and is only mentioned in that section. ////////////////////////// -이 명령은 <<_binary_search>>에서 잘 설명한다. +이 명령은 <>에서 잘 설명한다. ==== git blame @@ -830,9 +831,9 @@ This is helpful in order to find the person to ask for more information about a 그래서 특정 코드에 대해 궁금한 게 있을 때 누구에게 물어야 할지 바로 알 수 있다. ////////////////////////// -It is covered in <<_file_annotation>> and is only mentioned in that section. +It is covered in <> and is only mentioned in that section. ////////////////////////// -이 명령은 <<_file_annotation>>에서 다룬다. +이 명령은 <>에서 다룬다. ==== git grep @@ -842,9 +843,9 @@ The `git grep` command can help you find any string or regular expression in any 소스 코드에서 스트링이나 정규표현식을 찾을 수 있다. `git grep` 명령을 사용하면 예전 소스 코드까지 찾는다. ////////////////////////// -It is covered in <<_git_grep>> and is only mentioned in that section. +It is covered in <> and is only mentioned in that section. ////////////////////////// -<<_git_grep>>에서 이 명령을 설명한다. +<>에서 이 명령을 설명한다. ////////////////////////// === Patching @@ -868,9 +869,9 @@ This can be useful to only take one or two commits from a branch individually ra 이 명령은 브랜치를 통째로 Merge 하기 보다 커밋 한두 개 정도만 Merge 하고 싶을 때 좋다. ////////////////////////// -Cherry picking is described and demonstrated in <<_rebase_cherry_pick>>. +Cherry picking is described and demonstrated in <>. ////////////////////////// -이 명령으로 커밋을 고르는 것은 <<_rebase_cherry_pick>>에서 설명한다. +이 명령으로 커밋을 고르는 것은 <>에서 설명한다. ==== git rebase @@ -882,24 +883,24 @@ It determines a series of commits and then cherry-picks them one by one in the s 연결된 커밋을 그 순서대로 한방에 Cherry-pick 해온다. ////////////////////////// -Rebasing is covered in detail in <<_rebasing>>, including covering the collaborative issues involved with rebasing branches that are already public. +Rebasing is covered in detail in <>, including covering the collaborative issues involved with rebasing branches that are already public. ////////////////////////// -Rebase는 <<_rebasing>>에서 설명한다. 이미 공개한 브랜치를 Rebase 할 때 생기는 문제도 다룬다. +Rebase는 <>에서 설명한다. 이미 공개한 브랜치를 Rebase 할 때 생기는 문제도 다룬다. ////////////////////////// -We use it in practice during an example of splitting your history into two separate repositories in <<_replace>>, using the `--onto` flag as well. +We use it in practice during an example of splitting your history into two separate repositories in <>, using the `--onto` flag as well. ////////////////////////// -<<_replace>>에서는 히스토리를 두 저장소로 분리하는 것을 보여주는데 여기서 `--onto` 옵션을 사용한다. +<>에서는 히스토리를 두 저장소로 분리하는 것을 보여주는데 여기서 `--onto` 옵션을 사용한다. ////////////////////////// -We go through running into a merge conflict during rebasing in <<_rerere>>. +We go through running into a merge conflict during rebasing in <>. ////////////////////////// -<<_rerere>>에서 Rebase 하면서 발생한 충돌을 어떻게 해결하는지 보여준다. +<>에서 Rebase 하면서 발생한 충돌을 어떻게 해결하는지 보여준다. ////////////////////////// -We also use it in an interactive scripting mode with the `-i` option in <<_changing_multiple>>. +We also use it in an interactive scripting mode with the `-i` option in <>. ////////////////////////// -`-i` 옵션을 주고 이 명령을 실행하면 대화형으로 실행할 수 있다. <<_changing_multiple>>에서 설명한다. +`-i` 옵션을 주고 이 명령을 실행하면 대화형으로 실행할 수 있다. <>에서 설명한다. ==== git revert @@ -911,9 +912,9 @@ It creates a new commit that applies the exact opposite of the change introduced 해당 커밋을 되돌리는 커밋을 새로 생성한다. ////////////////////////// -We use this in <<_reverse_commit>> to undo a merge commit. +We use this in <> to undo a merge commit. ////////////////////////// -<<_reverse_commit>>에서 Merge 커밋을 되돌리는 것을 보여준다. +<>에서 Merge 커밋을 되돌리는 것을 보여준다. === Email @@ -934,9 +935,9 @@ It is similar to what the `patch` command might do with a few small differences. 약간의 차이는 있지만 `patch` 명령어랑 비슷하다. ////////////////////////// -We demonstrate using it and the circumstances in which you might do so in <<_patches_from_email>>. +We demonstrate using it and the circumstances in which you might do so in <>. ////////////////////////// -이 명령을 사용하는 상황과 어떻게 사용하는지 <<_patches_from_email>>에서 설명한다. +이 명령을 사용하는 상황과 어떻게 사용하는지 <>에서 설명한다. ==== git am @@ -948,19 +949,19 @@ This is useful for receiving patches over email and applying them to your projec 이메일로 패치를 주고받을 때 유용하다. ////////////////////////// -We covered usage and workflow around `git am` in <<_git_am>> including using the `--resolved`, `-i` and `-3` options. +We covered usage and workflow around `git am` in <> including using the `--resolved`, `-i` and `-3` options. ////////////////////////// -`git am`을 언제 어떻게 사용하는지는 <<_git_am>>에서 다룬다. `--resolved`, `-i`, `-3` 옵션 사용법을 설명한다. +`git am`을 언제 어떻게 사용하는지는 <>에서 다룬다. `--resolved`, `-i`, `-3` 옵션 사용법을 설명한다. ////////////////////////// -There are also a number of hooks you can use to help with the workflow around `git am` and they are all covered in <<_email_hooks>>. +There are also a number of hooks you can use to help with the workflow around `git am` and they are all covered in <>. ////////////////////////// -`git am` 명령을 사용할 때 설정할 수 있는 훅은 <<_email_hooks>>에서 다룬다. +`git am` 명령을 사용할 때 설정할 수 있는 훅은 <>에서 다룬다. ////////////////////////// -We also use it to apply patch formatted GitHub Pull Request changes in <<_email_notifications>>. +We also use it to apply patch formatted GitHub Pull Request changes in <>. ////////////////////////// -이 명령으로 GitHub Pull Request의 Patch도 적용할 수 있는데 <<_email_notifications>>에서 설명한다. +이 명령으로 GitHub Pull Request의 Patch도 적용할 수 있는데 <>에서 설명한다. ==== git format-patch @@ -970,9 +971,9 @@ The `git format-patch` command is used to generate a series of patches in mbox f `git format-patch` 명령은 Patch를 mbox 포맷으로 생성하는 데 사용한다. 생성 한 패치를 쉽게 메일링 리스트로 보낼 수 있다. ////////////////////////// -We go through an example of contributing to a project using the `git format-patch` tool in <<_project_over_email>>. +We go through an example of contributing to a project using the `git format-patch` tool in <>. ////////////////////////// -`git format-patch`로 프로젝트에 기여하는 예제를 <<_project_over_email>>에서 보여준다. +`git format-patch`로 프로젝트에 기여하는 예제를 <>에서 보여준다. ==== git imap-send @@ -982,9 +983,9 @@ The `git imap-send` command uploads a mailbox generated with `git format-patch` `git imap-send` 명령은 `git format-patch`로 생성한 메일을 IMAP drafts 폴더에 넣어준다. ////////////////////////// -We go through an example of contributing to a project by sending patches with the `git imap-send` tool in <<_project_over_email>>. +We go through an example of contributing to a project by sending patches with the `git imap-send` tool in <>. ////////////////////////// -`git imap-send` 명령으로 예제는 <<_project_over_email>>에서 살펴본다. 패치를 보내서 프로젝트에 기여해보는 예제다. +`git imap-send` 명령으로 예제는 <>에서 살펴본다. 패치를 보내서 프로젝트에 기여해보는 예제다. ==== git send-email @@ -994,9 +995,9 @@ The `git send-email` command is used to send patches that are generated with `gi `git send-email` 명령은 `git format-patch` 명령으로 생성한 Patch를 이메일로 보내는 데 사용한다. ////////////////////////// -We go through an example of contributing to a project by sending patches with the `git send-email` tool in <<_project_over_email>>. +We go through an example of contributing to a project by sending patches with the `git send-email` tool in <>. ////////////////////////// -<<_project_over_email>>에서 `git send-email` 명령으로 패치를 보내서 다른 프로젝트에 기여하는 것을 보여준다. +<>에서 `git send-email` 명령으로 패치를 보내서 다른 프로젝트에 기여하는 것을 보여준다. ==== git request-pull @@ -1008,9 +1009,9 @@ If you have a branch on a public server and want to let someone know how to inte 브랜치에 커밋하고 Push 해 놓은 상태를 누군가에게 알릴 때 유용하다. Patch 자체는 이메일로 보내지 않고 정보만 요약해 보낼 수 있다. 이 명령의 결과를 메일로 보내면 된다. ////////////////////////// -We demonstrate how to use `git request-pull` to generate a pull message in <<_public_project>>. +We demonstrate how to use `git request-pull` to generate a pull message in <>. ////////////////////////// -<<_public_project>>에서 `git request-pull` 명령을 사용하는 것을 보여준다. +<>에서 `git request-pull` 명령을 사용하는 것을 보여준다. ////////////////////////// === External Systems @@ -1032,9 +1033,9 @@ This means you can use Git to checkout from and commit to a Subversion server. 그래서 Git으로 Subversion 서버에 있는 커밋을 Checkout 할 수 있다. ////////////////////////// -This command is covered in depth in <<_git_svn>>. +This command is covered in depth in <>. ////////////////////////// -<<_git_svn>>에서 자세히 설명한다. +<>에서 자세히 설명한다. ==== git fast-import @@ -1044,9 +1045,9 @@ For other version control systems or importing from nearly any format, you can u 버전 관리 시스템을 가리지 않고 데이터를 Git으로 가져올 수 있는 다목적 명령어도 있다. 버전 관리 시스템뿐만 아니라 다른 형식으로 관리하던 데이터도 가져올 수 있다. `git fast-import` 명령은 다른 포맷의 데이터를 쉽게 매핑할 수 있게 해준다. ////////////////////////// -This command is covered in depth in <<_custom_importer>>. +This command is covered in depth in <>. ////////////////////////// -<<_custom_importer>>에서 이 명령을 설명한다. +<>에서 이 명령을 설명한다. ////////////////////////// === Administration @@ -1067,10 +1068,10 @@ The `git gc` command runs ``garbage collection'' on your repository, removing un ////////////////////////// This command normally runs in the background for you, though you can manually run it if you wish. -We go over some examples of this in <<_git_gc>>. +We go over some examples of this in <>. ////////////////////////// 직접 실행시켜도 되지만 Git이 자동으로 실행해준다. -자세한 설명은 <<_git_gc>>에서 한다. +자세한 설명은 <>에서 한다. ==== git fsck @@ -1080,9 +1081,9 @@ The `git fsck` command is used to check the internal database for problems or in `git fsck`는 Git 데이터베이스에 문제가 없는지 검사해준다. ////////////////////////// -We only quickly use this once in <<_data_recovery>> to search for dangling objects. +We only quickly use this once in <> to search for dangling objects. ////////////////////////// -<<_data_recovery>>에서 Dangling 개체를 찾는 법을 설명한다. +<>에서 Dangling 개체를 찾는 법을 설명한다. ==== git reflog @@ -1092,14 +1093,14 @@ The `git reflog` command goes through a log of where all the heads of your branc `git reflog` 명령은 HEAD가 가리켰던 커밋의 로그를 보여준다. 히스토리를 재작성해서 잃어버린 커밋을 찾을 때 유용하다. ////////////////////////// -We cover this command mainly in <<_git_reflog>>, where we show normal usage to and how to use `git log -g` to view the same information with `git log` output. +We cover this command mainly in <>, where we show normal usage to and how to use `git log -g` to view the same information with `git log` output. ////////////////////////// -<<_git_reflog>>에서 이 명령을 설명한다. `git log` 명령에 `-g` 옵션을 주면 `git log` 명령의 결과처럼 Reflog를 출력한다. +<>에서 이 명령을 설명한다. `git log` 명령에 `-g` 옵션을 주면 `git log` 명령의 결과처럼 Reflog를 출력한다. ////////////////////////// -We also go through a practical example of recovering such a lost branch in <<_data_recovery>>. +We also go through a practical example of recovering such a lost branch in <>. ////////////////////////// -잃어버린 브랜치를 복구하는 법은 <<_data_recovery>>에서도 설명한다. +잃어버린 브랜치를 복구하는 법은 <>에서도 설명한다. ==== git filter-branch @@ -1109,14 +1110,14 @@ The `git filter-branch` command is used to rewrite loads of commits according to `git filter-branch` 명령은 커밋 뭉치를 수정하는 데 사용한다. 전체 히스토리에서 파일을 삭제하거나 디렉토리 구조를 변경하는 데 사용한다. ////////////////////////// -In <<_removing_file_every_commit>> we explain the command and explore several different options such as `--commit-filter`, `--subdirectory-filter` and `--tree-filter`. +In <> we explain the command and explore several different options such as `--commit-filter`, `--subdirectory-filter` and `--tree-filter`. ////////////////////////// -<<_removing_file_every_commit>>에서 `--commit-filter`, `--subdirectory-filter`, `--tree-filter` 같은 옵션 사용법을 설명한다. +<>에서 `--commit-filter`, `--subdirectory-filter`, `--tree-filter` 같은 옵션 사용법을 설명한다. ////////////////////////// -In <<_git_p4>> and <<_git_tfs>> we use it to fix up imported external repositories. +In <> and <> we use it to fix up imported external repositories. ////////////////////////// -<<_git_p4>>, <<_git_tfs>>에서는 다른 버전 관리 시스템에서 가져온 데이터베이스를 바로 잡는 데 사용한다. +<>, <>에서는 다른 버전 관리 시스템에서 가져온 데이터베이스를 바로 잡는 데 사용한다. ////////////////////////// === Plumbing Commands @@ -1129,23 +1130,23 @@ There were also quite a number of lower level plumbing commands that we encounte 이 책에서는 저수준 Plumbing 명령어도 많이 소개한다. ////////////////////////// -The first one we encounter is `ls-remote` in <<_pr_refs>> which we use to look at the raw references on the server. +The first one we encounter is `ls-remote` in <> which we use to look at the raw references on the server. ////////////////////////// -<<_pr_refs>>에서는 서버에 있는 저수준 Ref를 조회하는 `ls-remote` 명령을 소개한다. +<>에서는 서버에 있는 저수준 Ref를 조회하는 `ls-remote` 명령을 소개한다. ////////////////////////// -We use `ls-files` in <<_manual_remerge>>, <<_rerere>> and <<_the_index>> to take a more raw look at what your staging area looks like. +We use `ls-files` in <>, <> and <> to take a more raw look at what your staging area looks like. ////////////////////////// -<<_manual_remerge>>와 <<_rerere>>, <<_the_index>>에서 사용하는 `ls-files`는 Staging Area의 저수준 모습을 보여준다. +<>와 <>, <>에서 사용하는 `ls-files`는 Staging Area의 저수준 모습을 보여준다. ////////////////////////// -We also mention `rev-parse` in <<_branch_references>> to take just about any string and turn it into an object SHA-1. +We also mention `rev-parse` in <> to take just about any string and turn it into an object SHA-1. ////////////////////////// -`rev-parse` 명령은 가리키는 개체의 SHA-1 값을 보여준다. <<_branch_references>>에서 다룬다. +`rev-parse` 명령은 가리키는 개체의 SHA-1 값을 보여준다. <>에서 다룬다. ////////////////////////// -However, most of the low level plumbing commands we cover are in <<_git_internals>>, which is more or less what the chapter is focused on. +However, most of the low level plumbing commands we cover are in <>, which is more or less what the chapter is focused on. We tried to avoid use of them throughout most of the rest of the book. ////////////////////////// -저수준 명령인 Plumbing 명령은 거의 <<_git_interals>>에서 설명한다. Plumbing 명령에는 이 장에서만 설명하려고 했다. +저수준 명령인 Plumbing 명령은 거의 <>에서 설명한다. Plumbing 명령에는 이 장에서만 설명하려고 했다. 다른 장에서는 최대한 Plumbing 명령어는 사용하지 않으려고 노력했다. diff --git a/Gemfile b/Gemfile index ac4e3343..c29231e0 100644 --- a/Gemfile +++ b/Gemfile @@ -1,17 +1,21 @@ source 'https://rubygems.org' gem 'rake' -gem 'asciidoctor', '1.5.4' +gem 'asciidoctor', '1.5.6.1' gem 'json' gem 'awesome_print' -gem 'asciidoctor-epub3', '1.5.0.alpha.6' -gem 'asciidoctor-pdf', '1.5.0.alpha.11' -gem 'asciidoctor-pdf-cjk-kai_gen_gothic', '0.1.1' +gem 'asciidoctor-epub3', :git => 'https://github.com/asciidoctor/asciidoctor-epub3' +gem 'asciidoctor-pdf', '1.5.0.alpha.16' +gem 'asciidoctor-pdf-cjk', '~> 0.1.3' +gem 'asciidoctor-pdf-cjk-kai_gen_gothic', '~> 0.1.1' gem 'coderay' gem 'pygments.rb' gem 'thread_safe' -gem 'epubcheck' +gem 'epubcheck-ruby' gem 'kindlegen' + +gem 'octokit' +gem 'github_changelog_generator', github: 'Furtif/github-changelog-generator' diff --git a/Rakefile b/Rakefile index a2f77f7d..d2fed34a 100644 --- a/Rakefile +++ b/Rakefile @@ -1,30 +1,233 @@ -namespace :book do - desc 'prepare build' - task :prebuild do - Dir.mkdir 'images' unless Dir.exists? 'images' - Dir.glob("book/*/images/*").each do |image| - FileUtils.copy(image, "images/" + File.basename(image)) - end +# coding: utf-8 +require 'octokit' +require 'github_changelog_generator' + +def exec_or_raise(command) + puts `#{command}` + if (! $?.success?) + raise "'#{command}' failed" end +end + +module GitHubChangelogGenerator + + #OPTIONS = %w[ user project token date_format output + # bug_prefix enhancement_prefix issue_prefix + # header merge_prefix issues + # add_issues_wo_labels add_pr_wo_labels + # pulls filter_issues_by_milestone author + # unreleased_only unreleased unreleased_label + # compare_link include_labels exclude_labels + # bug_labels enhancement_labels + # between_tags exclude_tags exclude_tags_regex since_tag max_issues + # github_site github_endpoint simple_list + # future_release release_branch verbose release_url + # base configure_sections add_sections] + + def get_log(&task_block) + options = Parser.default_options + yield(options) if task_block + + options[:user],options[:project] = ENV['TRAVIS_REPO_SLUG'].split('/') + options[:token] = ENV['GITHUB_API_TOKEN'] + options[:unreleased] = false + generator = Generator.new options + generator.compound_changelog + end + + module_function :get_log +end + +namespace :book do desc 'build basic book formats' - task :build => :prebuild do + task :build do + + puts "Generating contributors list" + exec_or_raise("git shortlog -s --all| grep -v -E '(Straub|Chacon)' | cut -f 2- | column -c 120 > book/contributors.txt") + + # detect if the deployment is using glob + travis = File.read(".travis.yml") + version_string = ENV['TRAVIS_TAG'] || '0' + if travis.match(/file_glob/) + progit_v = "progit_v#{version_string}" + else + progit_v = "progit" + end + text = File.read('progit.asc') + new_contents = text.gsub("$$VERSION$$", version_string).gsub("$$DATE$$", Time.now.strftime("%Y-%m-%d")) + File.open("#{progit_v}.asc", "w") {|file| file.puts new_contents } + puts "Converting to HTML..." - `bundle exec asciidoctor progit.asc` - puts " -- HTML output at progit.html" + exec_or_raise("bundle exec asciidoctor #{progit_v}.asc") + puts " -- HTML output at #{progit_v}.html" puts "Converting to EPub..." - `bundle exec asciidoctor-epub3 progit.asc` - puts " -- Epub output at progit.epub" + exec_or_raise("bundle exec asciidoctor-epub3 #{progit_v}.asc") + puts " -- Epub output at #{progit_v}.epub" + + exec_or_raise("epubcheck #{progit_v}.epub") puts "Converting to Mobi (kf8)..." - `bundle exec asciidoctor-epub3 -a ebook-format=kf8 progit.asc` - puts " -- Mobi output at progit.mobi" + exec_or_raise("bundle exec asciidoctor-epub3 -a ebook-format=kf8 #{progit_v}.asc") + # remove the fake epub that would shadow the really one + exec_or_raise("rm progit*kf8.epub") + puts " -- Mobi output at #{progit_v}.mobi" + repo = ENV['TRAVIS_REPO_SLUG'] puts "Converting to PDF... (this one takes a while)" - `bundle exec asciidoctor-pdf -r asciidoctor-pdf-cjk-kai_gen_gothic -a pdf-style=KaiGenGothicKR progit.asc 2>/dev/null` - puts " -- PDF output at progit.pdf" + exec_or_raise("asciidoctor-pdf-cjk-kai_gen_gothic-install") + exec_or_raise("bundle exec asciidoctor-pdf -r asciidoctor-pdf-cjk -r asciidoctor-pdf-cjk-kai_gen_gothic -a pdf-style=KaiGenGothicKR #{progit_v}.asc") + puts " -- PDF output at #{progit_v}.pdf" + end + + desc 'tag the repo with the latest version' + task :tag do + api_token = ENV['GITHUB_API_TOKEN'] + if ((api_token) && (ENV['TRAVIS_PULL_REQUEST'] == 'false')) + repo = ENV['TRAVIS_REPO_SLUG'] + @octokit = Octokit::Client.new(:access_token => api_token) + begin + last_version=@octokit.latest_release(repo).tag_name + rescue + last_version="2.1.-1" + end + new_patchlevel= last_version.split('.')[-1].to_i + 1 + new_version="2.1.#{new_patchlevel}" + if (ENV['TRAVIS_BRANCH']=='master') + obj = @octokit.create_tag(repo, new_version, "Version " + new_version, + ENV['TRAVIS_COMMIT'], 'commit', + 'Automatic build', 'automatic@no-domain.org', + Time.now.utc.iso8601) + @octokit.create_ref(repo, "tags/#{new_version}", obj.sha) + p "Created tag #{last_version}" + elsif (ENV['TRAVIS_TAG']) + version = ENV['TRAVIS_TAG'] + changelog = GitHubChangelogGenerator.get_log do |config| + config[:since_tag] = last_version + end + credit_line = "*This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*" + changelog.gsub!(credit_line, "") + @octokit.create_release(repo, new_version, {:name => "v#{new_version}", :body => changelog}) + p "Created release #{new_version}" + else + p 'This only runs on a commit to master' + end + else + p 'No interaction with GitHub' + end + end + + desc 'convert book to asciidoctor compatibility' + task:convert do + `cp -aR ../progit2/images .` + `sed -i -e 's!/images/!!' .gitignore` + `git add images` + `git rm -r book/*/images` + + chapters = [ + ["01", "introduction" ], + ["02", "git-basics" ], + ["03", "git-branching" ], + ["04", "git-server" ], + ["05", "distributed-git" ], + ["06", "github" ], + ["07", "git-tools" ], + ["08", "customizing-git" ], + ["09", "git-and-other-scms" ], + ["10", "git-internals" ], + ["A", "git-in-other-environments" ], + ["B", "embedding-git" ], + ["C", "git-commands" ] + ] + + crossrefs = {} + chapters.each { | num, title | + if num =~ /[ABC]/ + chap = "#{num}-#{title}" + else + chap = "ch#{num}-#{title}" + end + Dir[File.join ["book","#{num}-#{title}" , "sections","*.asc"]].map { |filename| + File.read(filename).scan(/\[\[(.*?)\]\]/) + }.flatten.each { |ref| + crossrefs[ref] = "#{chap}" + } + } + + headrefs = {} + chapters.each { | num, title | + if num =~ /[ABC]/ + chap = "#{num}-#{title}" + else + chap = "ch#{num}-#{title}" + end + Dir[File.join ["book","#{num}-#{title}", "*.asc"]].map { |filename| + File.read(filename).scan(/\[\[([_a-z0-9]*?)\]\]/) + }.flatten.each { |ref| + headrefs[ref] = "#{chap}" + } + } + + # transform all internal cross refs + chapters.each { | num, title | + if num =~ /[ABC]/ + chap = "#{num}-#{title}" + else + chap = "ch#{num}-#{title}" + end + files = Dir[File.join ["book","#{num}-#{title}" , "sections","*.asc"]] + + Dir[File.join ["book","#{num}-#{title}" ,"1-*.asc"]] + p files + files.each { |filename| + content = File.read(filename) + new_contents = content.gsub(/\[\[([_a-z0-9]*?)\]\]/, '[[r\1]]').gsub( + "→", "→").gsub(/<<([_a-z0-9]*?)>>/) { |match| + ch = crossrefs[$1] + h = headrefs[$1] + # p " #{match} -> #{ch}, #{h}" + if ch + # if local do not add the file + if ch==chap + "<>" + else + "<<#{ch}#r#{$1}>>" + end + elsif h + if h==chap + "<<#{chap}>>" + else + "<<#{h}##{h}>>" + end + else + p "could not match xref #{$1}" + "<<#{$1}>>" + end + } + File.open(filename, "w") {|file| file.puts new_contents } + } + } + + chapters.each { | num, title | + if num =~ /[ABC]/ + chap = "#{num}-#{title}" + else + chap = "ch#{num}-#{title}" + end + Dir[File.join ["book","#{num}-#{title}" ,"1*.asc"]].map { |filename| + content = File.read (filename) + new_contents = content.gsub(/include::(.*?)asc/) {|match| + "include::book/#{num}-#{title}/#{$1}asc"} + `git rm -f #{filename}` + File.open("#{chap}.asc", "w") {|file| + file.puts "[##{chap}]\n" + file.puts new_contents } + `git add "#{chap}.asc"` + } + } end end + + task :default => "book:build" diff --git a/book/01-introduction/sections/basics.asc b/book/01-introduction/sections/basics.asc index ed2cbda7..24d439af 100644 --- a/book/01-introduction/sections/basics.asc +++ b/book/01-introduction/sections/basics.asc @@ -59,12 +59,12 @@ image::images/snapshots.png[시간순으로 프로젝트의 스냅샷을 저장. This is an important distinction between Git and nearly all other VCSs. It makes Git reconsider almost every aspect of version control that most other systems copied from the previous generation. This makes Git more like a mini filesystem with some incredibly powerful tools built on top of it, rather than simply a VCS. -We'll explore some of the benefits you gain by thinking of your data this way when we cover Git branching in <<_git_branching>>. +We'll explore some of the benefits you gain by thinking of your data this way when we cover Git branching in <>. ////////////////////////// 이것이 Git이 다른 VCS와 구분되는 점이다. 이점 때문에 Git은 다른 시스템들이 과거로부터 답습해왔던 버전 컨트롤의 개념과 다르다는 것이고 많은 부분을 새로운 관점에서 바라본다. Git은 강력한 도구를 지원하는 작은 파일시스템이다. Git은 단순한 VCS가 아니다. -<<_git_branching>>에서 설명할 Git 브랜치를 사용하면 얻게 되는 이득이 무엇인지 설명한다. +<>에서 설명할 Git 브랜치를 사용하면 얻게 되는 이득이 무엇인지 설명한다. ////////////////////////// ==== Nearly Every Operation Is Local @@ -156,10 +156,10 @@ Git으로 무얼 하든 Git 데이터베이스에 데이터가 추가된다. ////////////////////////// This makes using Git a joy because we know we can experiment without the danger of severely screwing things up. -For a more in-depth look at how Git stores its data and how you can recover data that seems lost, see <<_undoing>>. +For a more in-depth look at how Git stores its data and how you can recover data that seems lost, see <>. ////////////////////////// Git을 사용하면 프로젝트가 심각하게 망가질 걱정 없이 매우 즐겁게 여러 가지 실험을 해 볼 수 있다. -<<_undoing>>을 보면 Git에서 데이터를 어떻게 저장하고 손실을 어떻게 복구하는지 알 수 있다. +<>을 보면 Git에서 데이터를 어떻게 저장하고 손실을 어떻게 복구하는지 알 수 있다. ////////////////////////// ==== The Three States @@ -212,7 +212,7 @@ The staging area is a file, generally contained in your Git directory, that stor It's sometimes referred to as the ``index'', but it's also common to refer to it as the staging area. ////////////////////////// Staging Area는 Git 디렉토리에 있다. 단순한 파일이고 곧 커밋할 파일에 대한 정보를 저장한다. -종종 ``Index``라고 불리기도 하지만, Staging Area라는 명칭이 표준이 되어가고 있다. +종종 ``Index'' 라고 불리기도 하지만, Staging Area라는 명칭이 표준이 되어가고 있다. ////////////////////////// The basic Git workflow goes something like this: @@ -232,9 +232,9 @@ Git으로 하는 일은 기본적으로 아래와 같다. If a particular version of a file is in the Git directory, it's considered committed. If it has been modified but was added to the staging area, it is staged. And if it was changed since it was checked out but has not been staged, it is modified. -In <<_git_basics_chapter>>, you'll learn more about these states and how you can either take advantage of them or skip the staged part entirely. +In <>, you'll learn more about these states and how you can either take advantage of them or skip the staged part entirely. ////////////////////////// Git 디렉토리에 있는 파일들은 Committed 상태이다. 파일을 수정하고 Staging Area에 추가했다면 Staged이다. 그리고 Checkout 하고 나서 수정했지만, 아직 Staging Area에 추가하지 않았으면 Modified이다. -<<_git_basics_chapter>>에서 이 상태에 대해 좀 더 자세히 배운다. 특히 Staging Area를 이용하는 방법부터 아예 생략하는 방법까지도 설명한다. +<>에서 이 상태에 대해 좀 더 자세히 배운다. 특히 Staging Area를 이용하는 방법부터 아예 생략하는 방법까지도 설명한다. diff --git a/book/01-introduction/sections/first-time-setup.asc b/book/01-introduction/sections/first-time-setup.asc index 5eac4375..d138dc89 100644 --- a/book/01-introduction/sections/first-time-setup.asc +++ b/book/01-introduction/sections/first-time-setup.asc @@ -1,4 +1,4 @@ -[[_first_time]] +[[r_first_time]] ////////////////////////// === First-Time Git Setup ////////////////////////// diff --git a/book/01-introduction/sections/help.asc b/book/01-introduction/sections/help.asc index e08cf234..bb50b694 100644 --- a/book/01-introduction/sections/help.asc +++ b/book/01-introduction/sections/help.asc @@ -1,4 +1,4 @@ -[[_git_help]] +[[r_git_help]] ////////////////////////// === Getting Help ////////////////////////// diff --git a/book/01-introduction/sections/history.asc b/book/01-introduction/sections/history.asc index a92f317c..f2027a0d 100644 --- a/book/01-introduction/sections/history.asc +++ b/book/01-introduction/sections/history.asc @@ -41,7 +41,7 @@ Git은 BitKeeper를 사용하면서 배운 교훈을 기초로 아래와 같은 ////////////////////////// Since its birth in 2005, Git has evolved and matured to be easy to use and yet retain these initial qualities. -It's incredibly fast, it's very efficient with large projects, and it has an incredible branching system for non-linear development (See <<_git_branching>>). +It's incredibly fast, it's very efficient with large projects, and it has an incredible branching system for non-linear development (See <>). ////////////////////////// Git은 2005년 탄생하고 나서 아직도 초기 목표를 그대로 유지하고 있다. 그러면서도 사용하기 쉽게 진화하고 성숙했다. -Git은 미친 듯이 빨라서 대형 프로젝트에 사용하기도 좋다. Git은 동시다발적인 브랜치에도 끄떡없는 슈퍼 울트라 브랜칭 시스템이다(<<_git_branching>> 참고). +Git은 미친 듯이 빨라서 대형 프로젝트에 사용하기도 좋다. Git은 동시다발적인 브랜치에도 끄떡없는 슈퍼 울트라 브랜칭 시스템이다(<> 참고). diff --git a/book/02-git-basics/sections/aliases.asc b/book/02-git-basics/sections/aliases.asc index 4e98d506..1a5674bb 100644 --- a/book/02-git-basics/sections/aliases.asc +++ b/book/02-git-basics/sections/aliases.asc @@ -1,4 +1,4 @@ -[[_git_aliases]] +[[r_git_aliases]] ////////////////////////// === Git Aliases ////////////////////////// diff --git a/book/02-git-basics/sections/getting-a-repository.asc b/book/02-git-basics/sections/getting-a-repository.asc index cfca86d0..571ccfb6 100644 --- a/book/02-git-basics/sections/getting-a-repository.asc +++ b/book/02-git-basics/sections/getting-a-repository.asc @@ -1,4 +1,4 @@ -[[_getting_a_repo]] +[[r_getting_a_repo]] ////////////////////////// === Getting a Git Repository ////////////////////////// @@ -66,11 +66,11 @@ $ git init ////////////////////////// This creates a new subdirectory named `.git` that contains all of your necessary repository files – a Git repository skeleton. At this point, nothing in your project is tracked yet. -(See <<_git_internals>> for more information about exactly what files are contained in the `.git` directory you just created.)(((git commands, init))) +(See <> for more information about exactly what files are contained in the `.git` directory you just created.)(((git commands, init))) ////////////////////////// 이 명령은 `.git` 이라는 하위 디렉토리를 만든다. `.git` 디렉토리에는 저장소에 필요한 뼈대 파일(Skeleton)이 들어 있다. 이 명령만으로는 아직 프로젝트의 어떤 파일도 관리하지 않는다. -(`.git` 디렉토리가 막 만들어진 직후에 정확히 어떤 파일이 있는지에 대한 내용은 <<_git_internals>>에서 다룬다)(((git commands, init))) +(`.git` 디렉토리가 막 만들어진 직후에 정확히 어떤 파일이 있는지에 대한 내용은 <>에서 다룬다)(((git commands, init))) ////////////////////////// If you want to start version-controlling existing files (as opposed to an empty directory), you should probably begin tracking those files and do an initial commit. @@ -93,7 +93,7 @@ At this point, you have a Git repository with tracked files and an initial commi 명령어 몇 개로 순식간에 Git 저장소를 만들고 파일 버전 관리를 시작했다. -[[_git_cloning]] +[[r_git_cloning]] ////////////////////////// ==== Cloning an Existing Repository ////////////////////////// @@ -104,13 +104,13 @@ If you want to get a copy of an existing Git repository – for example, a proje If you're familiar with other VCS systems such as Subversion, you'll notice that the command is "clone" and not "checkout". This is an important distinction – instead of getting just a working copy, Git receives a full copy of nearly all data that the server has. Every version of every file for the history of the project is pulled down by default when you run `git clone`. -In fact, if your server disk gets corrupted, you can often use nearly any of the clones on any client to set the server back to the state it was in when it was cloned (you may lose some server-side hooks and such, but all the versioned data would be there – see <<_git_on_the_server>> for more details). +In fact, if your server disk gets corrupted, you can often use nearly any of the clones on any client to set the server back to the state it was in when it was cloned (you may lose some server-side hooks and such, but all the versioned data would be there – see <> for more details). ////////////////////////// 다른 프로젝트에 참여하려거나(Contribute) Git 저장소를 복사하고 싶을 때 `git clone` 명령을 사용한다. 이미 Subversion 같은 VCS에 익숙한 사용자에게는 "checkout" 이 아니라 "clone" 이라는 점이 도드라져 보일 것이다. Git이 Subversion과 다른 가장 큰 차이점은 서버에 있는 거의 모든 데이터를 복사한다는 것이다. `git clone`을 실행하면 프로젝트 히스토리를 전부 받아온다. -실제로 서버의 디스크가 망가져도 클라이언트 저장소 중에서 아무거나 하나 가져다가 복구하면 된다(서버에만 적용했던 설정은 복구하지 못하지만 모든 데이터는 복구된다 - <<_git_on_the_server>>에서 좀 더 자세히 다룬다). +실제로 서버의 디스크가 망가져도 클라이언트 저장소 중에서 아무거나 하나 가져다가 복구하면 된다(서버에만 적용했던 설정은 복구하지 못하지만 모든 데이터는 복구된다 - <>에서 좀 더 자세히 다룬다). ////////////////////////// You clone a repository with `git clone [url]`.(((git commands, clone))) @@ -146,8 +146,8 @@ That command does the same thing as the previous one, but the target directory i ////////////////////////// Git has a number of different transfer protocols you can use. The previous example uses the `https://` protocol, but you may also see `git://` or `user@server:path/to/repo.git`, which uses the SSH transfer protocol. -<<_git_on_the_server>> will introduce all of the available options the server can set up to access your Git repository and the pros and cons of each. +<> will introduce all of the available options the server can set up to access your Git repository and the pros and cons of each. ////////////////////////// Git은 다양한 프로토콜을 지원한다. 이제까지는 `https://` 프로토콜을 사용했지만 `git://`를 사용할 수도 있고 `user@server:path/to/repo.git` 처럼 SSH 프로토콜을 사용할 수도 있다. -자세한 내용은 <<_git_on_the_server>>에서 다루며 각 프로토콜의 장단점과 Git 저장소에 접근하는 방법을 설명한다. +자세한 내용은 <>에서 다루며 각 프로토콜의 장단점과 Git 저장소에 접근하는 방법을 설명한다. diff --git a/book/02-git-basics/sections/recording-changes.asc b/book/02-git-basics/sections/recording-changes.asc index 0528a235..92ec5913 100644 --- a/book/02-git-basics/sections/recording-changes.asc +++ b/book/02-git-basics/sections/recording-changes.asc @@ -35,7 +35,7 @@ image::images/lifecycle.png[The lifecycle of the status of your files.] .파일의 라이프사이클. image::images/lifecycle.png[파일의 라이프사이클.] -[[_checking_status]] +[[r_checking_status]] ////////////////////////// ==== Checking the Status of Your Files ////////////////////////// @@ -61,13 +61,13 @@ This means you have a clean working directory – in other words, none of your t Git also doesn't see any untracked files, or they would be listed here. Finally, the command tells you which branch you're on and informs you that it has not diverged from the same branch on the server. For now, that branch is always ``master'', which is the default; you won't worry about it here. -<<_git_branching>> will go over branches and references in detail. +<> will go over branches and references in detail. ////////////////////////// 위의 내용은 파일을 하나도 수정하지 않았다는 것을 말해준다. Tracked 파일은 하나도 수정되지 않았다는 의미다. Untracked 파일은 아직 없어서 목록에 나타나지 않는다. 그리고 현재 작업 중인 브랜치를 알려주며 서버의 같은 브랜치로부터 진행된 작업이 없는 것을 나타낸다. 기본 브랜치가 master이기 때문에 현재 브랜치 이름이 ``master''로 나온다. 브랜치 관련 내용은 차차 알아가자. -<<_git_branching>> 에서 브랜치와 Refs에 대해 자세히 다룬다. +<> 에서 브랜치와 Refs에 대해 자세히 다룬다. ////////////////////////// Let's say you add a new file to your project, a simple README file. @@ -101,7 +101,7 @@ Git은 Untracked 파일을 아직 스냅샷(커밋)에 넣어지지 않은 파 파일이 Tracked 상태가 되기 전까지는 Git은 절대 그 파일을 커밋하지 않는다. 그래서 일하면서 생성하는 바이너리 파일 같은 것을 커밋하는 실수는 하지 않게 된다. README 파일을 추가해서 직접 Tracked 상태로 만들어 보자. -[[_tracking_files]] +[[r_tracking_files]] ////////////////////////// ==== Tracking New Files ////////////////////////// @@ -298,7 +298,7 @@ The `Rakefile` was modified, staged and then modified again, so there are change `README` 파일 같은 경우 내용을 변경했지만 아직 Staged 상태로 추가하지는 않았다. `lib/simplegit.rb` 파일은 내용을 변경하고 Staged 상태로 추가까지 한 상태이다. 위 결과에서 차이점을 비교해보자. `Rakefile`은 변경하고 Staged 상태로 추가한 후 또 내용을 변경해서 Staged 이면서 Unstaged 상태인 파일이다. -[[_ignoring]] +[[r_ignoring]] ////////////////////////// ==== Ignoring Files ////////////////////////// @@ -417,7 +417,7 @@ GitHub maintains a fairly comprehensive list of good `.gitignore` file examples GitHub은 다양한 프로젝트에서 자주 사용하는 `.gitignore` 예제를 관리하고 있다. 어떤 내용을 넣을지 막막하다면 https://github.com/github/gitignore[] 사이트에서 적당한 예제를 찾을 수 있다. ==== -[[_git_diff_staged]] +[[r_git_diff_staged]] ////////////////////////// ==== Viewing Your Staged and Unstaged Changes ////////////////////////// @@ -584,7 +584,7 @@ index 8ebb991..643e24f 100644 that highlights your work in progress (and note in the PR title that it's ---- -[[_git_difftool]] +[[r_git_difftool]] [NOTE] ////////////////////////// .Git Diff in an External Tool @@ -603,7 +603,7 @@ Run `git difftool --tool-help` to see what is available on your system. `git difftool --tool-help`라는 명령은 사용가능한 도구를 보여준다. ==== -[[_committing_changes]] +[[r_committing_changes]] ////////////////////////// ==== Committing Your Changes ////////////////////////// @@ -629,10 +629,10 @@ $ git commit ////////////////////////// Doing so launches your editor of choice. -(This is set by your shell's `$EDITOR` environment variable – usually vim or emacs, although you can configure it with whatever you want using the `git config --global core.editor` command as you saw in <<_getting_started>>).(((editor, changing default)))(((git commands, config))) +(This is set by your shell's `$EDITOR` environment variable – usually vim or emacs, although you can configure it with whatever you want using the `git config --global core.editor` command as you saw in <>).(((editor, changing default)))(((git commands, config))) ////////////////////////// Git 설정에 지정된 편집기가 실행되고, 아래와 같은 텍스트가 자동으로 포함된다 -(아래 예제는 Vim 편집기의 화면이다. 이 편집기는 쉘의 $EDITOR 환경 변수에 등록된 편집기이고 보통은 Vim이나 Emacs을 사용한다. 또 <<_getting_started>> 에서 설명했듯이 `git config --global core.editor` 명령으로 어떤 편집기를 사용할지 설정할 수 있다).(((editor, changing default)))(((git commands, config))) +(아래 예제는 Vim 편집기의 화면이다. 이 편집기는 쉘의 $EDITOR 환경 변수에 등록된 편집기이고 보통은 Vim이나 Emacs을 사용한다. 또 <> 에서 설명했듯이 `git config --global core.editor` 명령으로 어떤 편집기를 사용할지 설정할 수 있다).(((editor, changing default)))(((git commands, config))) ////////////////////////// The editor displays the following text (this example is a Vim screen): @@ -739,7 +739,7 @@ This is convenient, but be careful; sometimes this flag will cause you to includ `-a` 옵션을 사용하면 모든 파일이 자동으로 추가된다. 편리한 옵션이긴 하지만 주의 깊게 사용해야 한다. 생각 없이 이 옵션을 사용하다 보면 추가하지 말아야 할 변경사항도 추가될 수 있기 때문이다. -[[_removing_files]] +[[r_removing_files]] ////////////////////////// ==== Removing Files ////////////////////////// @@ -848,7 +848,7 @@ This command removes all files that end with `~`. ////////////////////////// 이 명령은 `~`로 끝나는 파일을 모두 삭제한다. -[[_git_mv]] +[[r_git_mv]] ////////////////////////// ==== Moving Files ////////////////////////// diff --git a/book/02-git-basics/sections/remotes.asc b/book/02-git-basics/sections/remotes.asc index 1904873d..ec140d31 100644 --- a/book/02-git-basics/sections/remotes.asc +++ b/book/02-git-basics/sections/remotes.asc @@ -1,4 +1,4 @@ -[[_remote_repos]] +[[r_remote_repos]] ////////////////////////// === Working with Remotes ////////////////////////// @@ -90,9 +90,9 @@ We may additionally have permission to push to one or more of these, though we c 어떤 저장소에는 Push 권한까지 제공하기도 하지만 일단 이 화면에서 Push 가능 권한까지는 확인할 수 없다. ////////////////////////// -Notice that these remotes use a variety of protocols; we'll cover more about this in <<_git_on_the_server>>. +Notice that these remotes use a variety of protocols; we'll cover more about this in <>. ////////////////////////// -리모트 저장소와 데이터를 주고받는데 사용하는 다양한 프로토콜에 대해서는 <<_git_on_the_server>> 에서 자세히 살펴보기로 한다. +리모트 저장소와 데이터를 주고받는데 사용하는 다양한 프로토콜에 대해서는 <> 에서 자세히 살펴보기로 한다. ////////////////////////// ==== Adding Remote Repositories @@ -141,11 +141,11 @@ From https://github.com/paulboone/ticgit ////////////////////////// Paul's master branch is now accessible locally as `pb/master` – you can merge it into one of your branches, or you can check out a local branch at that point if you want to inspect it. -(We'll go over what branches are and how to use them in much more detail in <<_git_branching>>.) +(We'll go over what branches are and how to use them in much more detail in <>.) ////////////////////////// -로컬에서 `pb/master`가 Paul의 master 브랜치이다. 이 브랜치를 로컬 브랜치중 하나에 Merge 하거나 Checkout 해서 브랜치 내용을 자세히 확인할 수 있다. (브랜치를 어떻게 사용하는지는 <<_git_branching>> 에서 자세히 살펴본다) +로컬에서 `pb/master`가 Paul의 master 브랜치이다. 이 브랜치를 로컬 브랜치중 하나에 Merge 하거나 Checkout 해서 브랜치 내용을 자세히 확인할 수 있다. (브랜치를 어떻게 사용하는지는 <> 에서 자세히 살펴본다) -[[_fetching_and_pulling]] +[[r_fetching_and_pulling]] ////////////////////////// ==== Fetching and Pulling from Your Remotes ////////////////////////// @@ -180,15 +180,15 @@ You have to merge it manually into your work when you're ready. 그래서 당신이 로컬에서 하던 작업을 정리하고 나서 수동으로 Merge 해야 한다. ////////////////////////// -If your current branch is set up to track a remote branch (see the next section and <<_git_branching>> for more information), you can use the `git pull` command to automatically fetch and then merge that remote branch into your current branch.(((git commands, pull))) +If your current branch is set up to track a remote branch (see the next section and <> for more information), you can use the `git pull` command to automatically fetch and then merge that remote branch into your current branch.(((git commands, pull))) This may be an easier or more comfortable workflow for you; and by default, the `git clone` command automatically sets up your local master branch to track the remote master branch (or whatever the default branch is called) on the server you cloned from. Running `git pull` generally fetches data from the server you originally cloned from and automatically tries to merge it into the code you're currently working on. ////////////////////////// -그냥 쉽게 `git pull` 명령으로 리모트 저장소 브랜치에서 데이터를 가져올 뿐만 아니라 자동으로 로컬 브랜치와 Merge 시킬 수 있다(다음 섹션과 <<_git_branching>> 에서 좀더 자세히 살펴본다).(((git commands, pull))) +그냥 쉽게 `git pull` 명령으로 리모트 저장소 브랜치에서 데이터를 가져올 뿐만 아니라 자동으로 로컬 브랜치와 Merge 시킬 수 있다(다음 섹션과 <> 에서 좀더 자세히 살펴본다).(((git commands, pull))) 먼저 `git clone` 명령은 자동으로 로컬의 master 브랜치가 리모트 저장소의 master 브랜치를 추적하도록 한다(물론 리모트 저장소에 master 브랜치가 있다는 가정에서). 그리고 `git pull` 명령은 Clone 한 서버에서 데이터를 가져오고 그 데이터를 자동으로 현재 작업하는 코드와 Merge 시킨다. -[[_pushing_remotes]] +[[r_pushing_remotes]] ////////////////////////// ==== Pushing to Your Remotes ////////////////////////// @@ -212,14 +212,14 @@ $ git push origin master This command works only if you cloned from a server to which you have write access and if nobody has pushed in the meantime. If you and someone else clone at the same time and they push upstream and then you push upstream, your push will rightly be rejected. You'll have to fetch their work first and incorporate it into yours before you'll be allowed to push. -See <<_git_branching>> for more detailed information on how to push to remote servers. +See <> for more detailed information on how to push to remote servers. ////////////////////////// 이 명령은 Clone 한 리모트 저장소에 쓰기 권한이 있고, Clone 하고 난 이후 아무도 Upstream 저장소에 Push 하지 않았을 때만 사용할 수 있다. 다시 말해서 Clone 한 사람이 여러 명 있을 때, 다른 사람이 Push 한 후에 Push 하려고 하면 Push 할 수 없다. 먼저 다른 사람이 작업한 것을 가져와서 Merge 한 후에 Push 할 수 있다. -<<_git_branching>> 에서 서버에 Push 하는 방법에 대해 자세히 설명할 것이다. +<> 에서 서버에 Push 하는 방법에 대해 자세히 설명할 것이다. -[[_inspecting_remote]] +[[r_inspecting_remote]] ////////////////////////// ==== Inspecting a Remote ////////////////////////// diff --git a/book/02-git-basics/sections/tagging.asc b/book/02-git-basics/sections/tagging.asc index e88d9ef3..ff5db338 100644 --- a/book/02-git-basics/sections/tagging.asc +++ b/book/02-git-basics/sections/tagging.asc @@ -1,4 +1,4 @@ -[[_git_tagging]] +[[r_git_tagging]] ////////////////////////// === Tagging ////////////////////////// @@ -86,7 +86,7 @@ It's generally recommended that you create annotated tags so you can have all th GPG(GNU Privacy Guard)로 서명할 수도 있다. 일반적으로 Annotated 태그를 만들어 이 모든 정보를 사용할 수 있도록 하는 것이 좋다. 하지만 임시로 생성하는 태그거나 이러한 정보를 유지할 필요가 없는 경우에는 Lightweight 태그를 사용할 수도 있다. -[[_annotated_tags]] +[[r_annotated_tags]] ////////////////////////// ==== Annotated Tags ////////////////////////// @@ -255,7 +255,7 @@ Date: Sun Apr 27 20:43:35 2008 -0700 ... ---- -[[_sharing_tags]] +[[r_sharing_tags]] ////////////////////////// ==== Sharing Tags ////////////////////////// diff --git a/book/02-git-basics/sections/undoing.asc b/book/02-git-basics/sections/undoing.asc index 06cc7e31..423ed2ec 100644 --- a/book/02-git-basics/sections/undoing.asc +++ b/book/02-git-basics/sections/undoing.asc @@ -1,4 +1,4 @@ -[[_undoing]] +[[r_undoing]] ////////////////////////// === Undoing Things ////////////////////////// @@ -58,7 +58,7 @@ You end up with a single commit – the second commit replaces the results of th ////////////////////////// 여기서 실행한 명령어 3개는 모두 커밋 한 개로 기록된다. 두 번째 커밋은 첫 번째 커밋을 덮어쓴다. -[[_unstaging]] +[[r_unstaging]] ////////////////////////// ==== Unstaging a Staged File ////////////////////////// @@ -135,10 +135,10 @@ However, in the scenario described above, the file in your working directory is ////////////////////////// For now this magic invocation is all you need to know about the `git reset` command. -We'll go into much more detail about what `reset` does and how to master it to do really interesting things in <<_git_reset>>. +We'll go into much more detail about what `reset` does and how to master it to do really interesting things in <>. ////////////////////////// 지금까지 살펴본 내용이 `git reset` 명령에 대해 알아야 할 대부분의 내용이다. -`reset` 명령이 정확히는 어떻게 동작하는지, 어떻게 전문적으로 활용하는지는 <<_git_reset>> 부분에서 자세히 살펴보기로 한다. +`reset` 명령이 정확히는 어떻게 동작하는지, 어떻게 전문적으로 활용하는지는 <> 부분에서 자세히 살펴보기로 한다. ////////////////////////// ==== Unmodifying a Modified File @@ -204,15 +204,15 @@ Don't ever use this command unless you absolutely know that you don't want the f ===== ////////////////////////// -If you would like to keep the changes you've made to that file but still need to get it out of the way for now, we'll go over stashing and branching in <<_git_branching>>; these are generally better ways to go. +If you would like to keep the changes you've made to that file but still need to get it out of the way for now, we'll go over stashing and branching in <>; these are generally better ways to go. ////////////////////////// -변경한 내용을 쉽게 버릴수는 없고 하지만 당장은 되돌려야만 하는 상황이라면 Stash와 Branch를 사용하자. <<_git_branching>> 에서 다루는 이 방법들이 훨씬 낫다. +변경한 내용을 쉽게 버릴수는 없고 하지만 당장은 되돌려야만 하는 상황이라면 Stash와 Branch를 사용하자. <> 에서 다루는 이 방법들이 훨씬 낫다. ////////////////////////// Remember, anything that is _committed_ in Git can almost always be recovered. -Even commits that were on branches that were deleted or commits that were overwritten with an `--amend` commit can be recovered (see <<_data_recovery>> for data recovery). +Even commits that were on branches that were deleted or commits that were overwritten with an `--amend` commit can be recovered (see <> for data recovery). However, anything you lose that was never committed is likely never to be seen again. ////////////////////////// Git으로 __커밋__한 모든 것은 언제나 복구할 수 있다. -삭제한 브랜치에 있었던 것도, `--amend` 옵션으로 다시 커밋한 것도 복구할 수 있다(자세한 것은 <<_data_recovery>> 에서 다룬다). +삭제한 브랜치에 있었던 것도, `--amend` 옵션으로 다시 커밋한 것도 복구할 수 있다(자세한 것은 <> 에서 다룬다). 하지만 커밋하지 않고 잃어버린 것은 절대로 되돌릴 수 없다. diff --git a/book/02-git-basics/sections/viewing-history.asc b/book/02-git-basics/sections/viewing-history.asc index 28ed77c8..49d2fad7 100644 --- a/book/02-git-basics/sections/viewing-history.asc +++ b/book/02-git-basics/sections/viewing-history.asc @@ -1,4 +1,4 @@ -[[_viewing_history]] +[[r_viewing_history]] ////////////////////////// === Viewing the Commit History ////////////////////////// @@ -204,11 +204,11 @@ a11bef0 - Scott Chacon, 6 years ago : first commit ---- ////////////////////////// -<> lists some of the more useful options that `format` takes. +<> lists some of the more useful options that `format` takes. ////////////////////////// -<> 포맷에서 사용하는 유용한 옵션. +<> 포맷에서 사용하는 유용한 옵션. -[[pretty_format]] +[[rpretty_format]] ////////////////////////// .Useful options for `git log --pretty=format` [cols="1,4",options="header"] @@ -256,12 +256,12 @@ a11bef0 - Scott Chacon, 6 years ago : first commit You may be wondering what the difference is between _author_ and _committer_. The author is the person who originally wrote the work, whereas the committer is the person who last applied the work. So, if you send in a patch to a project and one of the core members applies the patch, both of you get credit – you as the author, and the core member as the committer. -We'll cover this distinction a bit more in <<_distributed_git>>. +We'll cover this distinction a bit more in <>. ////////////////////////// _저자(Author)_ 와 _커미터(Committer)_ 를 구분하는 것이 조금 이상해 보일 수 있다. 저자는 원래 작업을 수행한 원작자이고 커밋터는 마지막으로 이 작업을 적용한(저장소에 포함시킨) 사람이다. 만약 당신이 어떤 프로젝트에 패치를 보냈고 그 프로젝트의 담당자가 패치를 적용했다면 두 명의 정보를 모두 알 필요가 있다. 그래서 이 경우 당신이 저자고 그 담당자가 커미터다. -<<_distributed_git>> 에서 이 주제에 대해 자세히 다룰 것이다. +<> 에서 이 주제에 대해 자세히 다룰 것이다. ////////////////////////// The `oneline` and `format` options are particularly useful with another `log` option called `--graph`. @@ -292,12 +292,12 @@ This type of output will become more interesting as we go through branching and ////////////////////////// Those are only some simple output-formatting options to `git log` – there are many more. -<> lists the options we've covered so far, as well as some other common formatting options that may be useful, along with how they change the output of the log command. +<> lists the options we've covered so far, as well as some other common formatting options that may be useful, along with how they change the output of the log command. ////////////////////////// `git log` 명령의 기본적인 옵션과 출력물의 형식에 관련된 옵션을 살펴보았다. -`git log` 명령은 앞서 살펴본 것보다 더 많은 옵션을 지원한다. <> 는 지금 설명한 것과 함께 유용하게 사용할 수 있는 옵션이다. 각 옵션으로 어떻게 `log` 명령을 제어할 수 있는지 보여준다. +`git log` 명령은 앞서 살펴본 것보다 더 많은 옵션을 지원한다. <> 는 지금 설명한 것과 함께 유용하게 사용할 수 있는 옵션이다. 각 옵션으로 어떻게 `log` 명령을 제어할 수 있는지 보여준다. -[[log_options]] +[[rlog_options]] ////////////////////////// .Common options to `git log` [cols="1,4",options="header"] @@ -393,11 +393,11 @@ This is always the last option and is generally preceded by double dashes (`--`) 이 옵션은 `--`와 함께 경로 이름을 사용하는데 명령어 끝 부분에 쓴다(역주 - `git log -- path1 path2`). ////////////////////////// -In <> we'll list these and a few other common options for your reference. +In <> we'll list these and a few other common options for your reference. ////////////////////////// -<> 은 조회 범위를 제한하는 옵션들이다. +<> 은 조회 범위를 제한하는 옵션들이다. -[[limit_options]] +[[rlimit_options]] ////////////////////////// .Options to limit the output of `git log` [cols="2,4",options="header"] diff --git a/book/03-git-branching/sections/basic-branching-and-merging.asc b/book/03-git-branching/sections/basic-branching-and-merging.asc index 80ad75a9..227da109 100644 --- a/book/03-git-branching/sections/basic-branching-and-merging.asc +++ b/book/03-git-branching/sections/basic-branching-and-merging.asc @@ -37,7 +37,7 @@ You'll do the following: . 수정한 Hotfix 테스트를 마치고 운영 브랜치로 Merge 한다. . 다시 작업하던 브랜치로 옮겨가서 하던 일 진행한다. -[[_basic_branching]] +[[r_basic_branching]] ////////////////////////// ==== Basic Branching ////////////////////////// @@ -119,12 +119,12 @@ Git을 사용하면 이런 노력을 들일 필요 없이 그냥 `master` 브랜 ////////////////////////// However, before you do that, note that if your working directory or staging area has uncommitted changes that conflict with the branch you're checking out, Git won't let you switch branches. It's best to have a clean working state when you switch branches. -There are ways to get around this (namely, stashing and commit amending) that we'll cover later on, in <<_git_stashing>>. +There are ways to get around this (namely, stashing and commit amending) that we'll cover later on, in <>. For now, let's assume you've committed all your changes, so you can switch back to your `master` branch: ////////////////////////// 그렇지만, 브랜치를 이동하려면 해야 할 일이 있다. 아직 커밋하지 않은 파일이 Checkout 할 브랜치와 충돌 나면 브랜치를 변경할 수 없다. 브랜치를 변경할 때는 워킹 디렉토리를 정리하는 것이 좋다. -이런 문제를 다루는 방법은(주로, Stash이나 커밋 Amend에 대해) 나중에 <<_git_stashing>> 에서 다룰 것이다. +이런 문제를 다루는 방법은(주로, Stash이나 커밋 Amend에 대해) 나중에 <> 에서 다룰 것이다. 지금은 작업하던 것을 모두 커밋하고 `master` 브랜치로 옮긴다: [source,console] @@ -248,7 +248,7 @@ If you need to pull it in, you can merge your `master` branch into your `iss53` 위에서 작업한 `hotfix`가 `iss53` 브랜치에 영향을 끼치지 않는다는 점을 이해하는 것이 중요하다. `git merge master` 명령으로 `master` 브랜치를 `iss53` 브랜치에 Merge 하면 `iss53` 브랜치에 `hotfix`가 적용된다. 아니면 `iss53` 브랜치가 `master`에 Merge 할 수 있는 수준이 될 때까지 기다렸다가 Merge 하면 `hotfix`와 `iss53` 브랜치가 합쳐진다. -[[_basic_merging]] +[[r_basic_merging]] ////////////////////////// ==== Basic Merging ////////////////////////// @@ -325,7 +325,7 @@ iss53 브랜치를 master에 Merge 하고 나면 더는 iss53 브랜치가 필 $ git branch -d iss53 ---- -[[_basic_merge_conflicts]] +[[r_basic_merge_conflicts]] ////////////////////////// ==== Basic Merge Conflicts ////////////////////////// @@ -450,11 +450,11 @@ Just type the name of the tool you'd rather use. [NOTE] ////////////////////////// ==== -If you need more advanced tools for resolving tricky merge conflicts, we cover more on merging in <<_advanced_merging>>. +If you need more advanced tools for resolving tricky merge conflicts, we cover more on merging in <>. ==== ////////////////////////// ==== -Merge 시에 발생한 충돌을 다루는 더 어렵고 요상한 내용은 뒤에 <<_advanced_merging>> 에서 다루기로 한다. +Merge 시에 발생한 충돌을 다루는 더 어렵고 요상한 내용은 뒤에 <> 에서 다루기로 한다. ==== ////////////////////////// diff --git a/book/03-git-branching/sections/branch-management.asc b/book/03-git-branching/sections/branch-management.asc index f18e38b5..3e5473eb 100644 --- a/book/03-git-branching/sections/branch-management.asc +++ b/book/03-git-branching/sections/branch-management.asc @@ -1,4 +1,4 @@ -[[_branch_management]] +[[r_branch_management]] ////////////////////////// === Branch Management ////////////////////////// diff --git a/book/03-git-branching/sections/nutshell.asc b/book/03-git-branching/sections/nutshell.asc index 0338b7f7..0d17763c 100644 --- a/book/03-git-branching/sections/nutshell.asc +++ b/book/03-git-branching/sections/nutshell.asc @@ -1,4 +1,4 @@ -[[_git_branches_overview]] +[[r_git_branches_overview]] ////////////////////////// === Branches in a Nutshell ////////////////////////// @@ -10,9 +10,9 @@ To really understand the way Git does branching, we need to take a step back and Git이 브랜치를 다루는 과정을 이해하려면 우선 Git이 데이터를 어떻게 저장하는지 알아야 한다. ////////////////////////// -As you may remember from <<_getting_started>>, Git doesn't store data as a series of changesets or differences, but instead as a series of snapshots. +As you may remember from <>, Git doesn't store data as a series of changesets or differences, but instead as a series of snapshots. ////////////////////////// -Git은 데이터를 Change Set이나 변경사항(Diff)으로 기록하지 않고 일련의 스냅샷으로 기록한다는 것을 <<_getting_started>> 에서 보여줬다. +Git은 데이터를 Change Set이나 변경사항(Diff)으로 기록하지 않고 일련의 스냅샷으로 기록한다는 것을 <> 에서 보여줬다. ////////////////////////// When you make a commit, Git stores a commit object that contains a pointer to the snapshot of the content you staged. @@ -23,10 +23,10 @@ This object also contains the author's name and email, the message that you type ////////////////////////// To visualize this, let's assume that you have a directory containing three files, and you stage them all and commit. -Staging the files computes a checksum for each one (the SHA-1 hash we mentioned in <<_getting_started>>), stores that version of the file in the Git repository (Git refers to them as blobs), and adds that checksum to the staging area: +Staging the files computes a checksum for each one (the SHA-1 hash we mentioned in <>), stores that version of the file in the Git repository (Git refers to them as blobs), and adds that checksum to the staging area: ////////////////////////// 파일이 3개 있는 디렉토리가 하나 있고 이 파일을 Staging Area에 저장하고 커밋하는 예제를 살펴 보자. -파일을 Stage 하면 Git 저장소에 파일을 저장하고(Git은 이것을 Blob이라고 부른다) Staging Area에 해당 파일의 체크섬을 저장한다(<<_getting_started>> 에서 살펴본 SHA-1을 사용한다). +파일을 Stage 하면 Git 저장소에 파일을 저장하고(Git은 이것을 Blob이라고 부른다) Staging Area에 해당 파일의 체크섬을 저장한다(<> 에서 살펴본 SHA-1을 사용한다). [source,console] ---- @@ -97,7 +97,7 @@ image::images/branch-and-history.png[A branch and its commit history.] .브랜치와 커밋 히스토리 image::images/branch-and-history.png[브랜치와 커밋 히스토리] -[[_create_new_branch]] +[[r_create_new_branch]] ////////////////////////// ==== Creating a New Branch ////////////////////////// @@ -173,7 +173,7 @@ You can see the ``master'' and ``testing'' branches that are right there next to ////////////////////////// ``master''와 ``testing'' 이라는 브랜치가 `f30ab` 커밋 옆에 위치하여 이런식으로 브랜치가 가리키는 커밋을 확인할 수 있다. -[[_switching_branches]] +[[r_switching_branches]] ////////////////////////// ==== Switching Branches ////////////////////////// @@ -282,17 +282,17 @@ $ git commit -a -m 'made other changes' ---- ////////////////////////// -Now your project history has diverged (see <>). +Now your project history has diverged (see <>). You created and switched to a branch, did some work on it, and then switched back to your main branch and did other work. Both of those changes are isolated in separate branches: you can switch back and forth between the branches and merge them together when you're ready. And you did all that with simple `branch`, `checkout`, and `commit` commands. ////////////////////////// -프로젝트 히스토리는 분리돼 진행한다(<>). +프로젝트 히스토리는 분리돼 진행한다(<>). 우리는 브랜치를 하나 만들어 그 브랜치에서 일을 좀 하고, 다시 원래 브랜치로 되돌아와서 다른 일을 했다. 두 작업 내용은 서로 독립적으로 각 브랜치에 존재한다. 커밋 사이를 자유롭게 이동하다가 때가 되면 두 브랜치를 Merge 한다. 간단히 `branch`, `checkout`, `commit` 명령을 써서 말이다. -[[divergent_history]] +[[rdivergent_history]] ////////////////////////// .Divergent history image::images/advance-master.png[Divergent history.] diff --git a/book/03-git-branching/sections/rebasing.asc b/book/03-git-branching/sections/rebasing.asc index 189798b8..efca3040 100644 --- a/book/03-git-branching/sections/rebasing.asc +++ b/book/03-git-branching/sections/rebasing.asc @@ -1,4 +1,4 @@ -[[_rebasing]] +[[r_rebasing]] ////////////////////////// === Rebasing ////////////////////////// @@ -18,9 +18,9 @@ Git에서 한 브랜치에서 다른 브랜치로 합치는 방법으로는 두 ==== Rebase 의 기초 ////////////////////////// -If you go back to an earlier example from <<_basic_merging>>, you can see that you diverged your work and made commits on two different branches. +If you go back to an earlier example from <>, you can see that you diverged your work and made commits on two different branches. ////////////////////////// -앞의 <<_basic_merging>> 절에서 살펴본 예제로 다시 돌아가 보자. 두 개의 나누어진 브랜치의 모습을 볼 수 있다. +앞의 <> 절에서 살펴본 예제로 다시 돌아가 보자. 두 개의 나누어진 브랜치의 모습을 볼 수 있다. ////////////////////////// .Simple divergent history @@ -127,18 +127,18 @@ Rebase 의 경우는 브랜치의 변경사항을 순서대로 다른 브랜치 ////////////////////////// You can also have your rebase replay on something other than the rebase target branch. -Take a history like <>, for example. +Take a history like <>, for example. You branched a topic branch (`server`) to add some server-side functionality to your project, and made a commit. Then, you branched off that to make the client-side changes (`client`) and committed a few times. Finally, you went back to your server branch and did a few more commits. ////////////////////////// Rebase는 단순히 브랜치를 합치는 것만 아니라 다른 용도로도 사용할 수 있다. -<> 같은 히스토리가 있다고 하자. +<> 같은 히스토리가 있다고 하자. `server` 브랜치를 만들어서 서버 기능을 추가하고 그 브랜치에서 다시 `client` 브랜치를 만들어 클라이언트 기능을 추가한다. 마지막으로 `server` 브랜치로 돌아가서 몇 가지 기능을 더 추가한다. -[[rbdiag_e]] +[[rrbdiag_e]] ////////////////////////// .A history with a topic branch off another topic branch image::images/interesting-rebase-1.png[A history with a topic branch off another topic branch.] @@ -173,9 +173,9 @@ image::images/interesting-rebase-2.png[Rebasing a topic branch off another topic image::images/interesting-rebase-2.png[다른 토픽 브랜치에서 갈라져 나온 토픽 브랜치를 Rebase 하기] ////////////////////////// -Now you can fast-forward your master branch (see <>): +Now you can fast-forward your master branch (see <>): ////////////////////////// -이제 master 브랜치로 돌아가서 Fast-forward 시킬 수 있다(<> 참고). +이제 master 브랜치로 돌아가서 Fast-forward 시킬 수 있다(<> 참고). [source,console] ---- @@ -183,7 +183,7 @@ $ git checkout master $ git merge client ---- -[[rbdiag_g]] +[[rrbdiag_g]] ////////////////////////// .Fast-forwarding your master branch to include the client branch changes image::images/interesting-rebase-3.png[Fast-forwarding your master branch to include the client branch changes.] @@ -204,11 +204,11 @@ $ git rebase master server ---- ////////////////////////// -This replays your `server` work on top of your `master` work, as shown in <>. +This replays your `server` work on top of your `master` work, as shown in <>. ////////////////////////// -server 브랜치의 수정사항을 master 브랜치에 적용했다. 그 결과는 <> 같다. +server 브랜치의 수정사항을 master 브랜치에 적용했다. 그 결과는 <> 같다. -[[rbdiag_h]] +[[rrbdiag_h]] ////////////////////////// .Rebasing your server branch on top of your master branch image::images/interesting-rebase-4.png[Rebasing your server branch on top of your master branch.] @@ -228,9 +228,9 @@ $ git merge server ---- ////////////////////////// -You can remove the `client` and `server` branches because all the work is integrated and you don't need them anymore, leaving your history for this entire process looking like <>: +You can remove the `client` and `server` branches because all the work is integrated and you don't need them anymore, leaving your history for this entire process looking like <>: ////////////////////////// -모든 것이 `master` 브랜치에 통합됐기 때문에 더 필요하지 않다면 `client`나 `server` 브랜치는 삭제해도 된다. 브랜치를 삭제해도 커밋 히스토리는 <> 같이 여전히 남아 있다. +모든 것이 `master` 브랜치에 통합됐기 때문에 더 필요하지 않다면 `client`나 `server` 브랜치는 삭제해도 된다. 브랜치를 삭제해도 커밋 히스토리는 <> 같이 여전히 남아 있다. [source,console] ---- @@ -238,7 +238,7 @@ $ git branch -d client $ git branch -d server ---- -[[rbdiag_i]] +[[rrbdiag_i]] ////////////////////////// .Final commit history image::images/interesting-rebase-5.png[Final commit history.] @@ -246,7 +246,7 @@ image::images/interesting-rebase-5.png[Final commit history.] .최종 커밋 히스토리 image::images/interesting-rebase-5.png[최종 커밋 히스토리] -[[_rebase_peril]] +[[r_rebase_peril]] ////////////////////////// ==== The Perils of Rebasing ////////////////////////// @@ -314,7 +314,7 @@ You then fetch from that server, bringing down the new commits. 그런데 Push 했던 팀원은 Merge 한 일을 되돌리고 다시 Rebase 한다. 서버의 히스토리를 새로 덮어씌우려면 `git push --force` 명령을 사용해야 한다. 이후에 저장소에서 Fetch 하고 나면 아래 그림과 같은 상태가 된다. -[[_pre_merge_rebase_work]] +[[r_pre_merge_rebase_work]] ////////////////////////// .Someone pushes rebased commits, abandoning commits you've based your work on image::images/perils-of-rebasing-3.png[Someone pushes rebased commits, abandoning commits you've based your work on.] @@ -329,7 +329,7 @@ If you do a `git pull`, you'll create a merge commit which includes both lines o 자 이렇게 되면 짬뽕이 된다. `git pull`로 서버의 내용을 가져와서 Merge 하면 같은 내용의 수정사항을 포함한 Merge 커밋이 아래와 같이 만들어진다. -[[_merge_rebase_work]] +[[r_merge_rebase_work]] ////////////////////////// .You merge in the same work again into a new merge commit image::images/perils-of-rebasing-4.png[You merge in the same work again into a new merge commit.] @@ -346,7 +346,7 @@ It's pretty safe to assume that the other developer doesn't want `C4` and `C6` t 게다가 이 히스토리를 서버에 Push 하면 같은 커밋이 두 개 있기 때문에 다른 사람들도 혼란스러워한다. `C4`와 `C6`는 포함되지 말았어야 할 커밋이다. 애초에 서버로 데이터를 보내기 전에 Rebase로 커밋을 정리했어야 했다. -[[_rebase_rebase]] +[[r_rebase_rebase]] ////////////////////////// ==== Rebase When You Rebase ////////////////////////// @@ -372,9 +372,9 @@ If you pull down work that was rewritten and rebase it on top of the new commits 덮어쓴 커밋을 받아서 그 커밋을 기준으로 Rebase 할 때 Git은 원래 누가 작성한 코드인지 잘 찾아 낸다. 그래서 Patch가 원래대로 잘 적용된다. ////////////////////////// -For instance, in the previous scenario, if instead of doing a merge when we're at <<_pre_merge_rebase_work>> we run `git rebase teamone/master`, Git will: +For instance, in the previous scenario, if instead of doing a merge when we're at <> we run `git rebase teamone/master`, Git will: ////////////////////////// -예를 들어 앞서 살펴본 예제를 보면 <<_pre_merge_rebase_work>> 상황에서 Merge 하는 대신 `git rebase teamone/master` 명령을 실행하면 Git은 아래와 같은 작업을 한다. +예를 들어 앞서 살펴본 예제를 보면 <> 상황에서 Merge 하는 대신 `git rebase teamone/master` 명령을 실행하면 Git은 아래와 같은 작업을 한다. ////////////////////////// * Determine what work is unique to our branch (C2, C3, C4, C6, C7) @@ -388,11 +388,11 @@ For instance, in the previous scenario, if instead of doing a merge when we're a * 남은 커밋들만 다시 `teamone/master` 바탕으로 커밋을 쌓는다. ////////////////////////// -So instead of the result we see in <<_merge_rebase_work>>, we would end up with something more like <<_rebase_rebase_work>>. +So instead of the result we see in <>, we would end up with something more like <>. ////////////////////////// -결과를 확인해보면 <<_merge_rebase_work>> 같은 결과 대신 제대로 정리된 <<_rebase_rebase_work>> 같은 결과를 얻을 수 있다. +결과를 확인해보면 <> 같은 결과 대신 제대로 정리된 <> 같은 결과를 얻을 수 있다. -[[_rebase_rebase_work]] +[[r_rebase_rebase_work]] ////////////////////////// .Rebase on top of force-pushed rebase work. image::images/perils-of-rebasing-5.png[Rebase on top of force-pushed rebase work.] diff --git a/book/03-git-branching/sections/remote-branches.asc b/book/03-git-branching/sections/remote-branches.asc index a4b7f63c..18992066 100644 --- a/book/03-git-branching/sections/remote-branches.asc +++ b/book/03-git-branching/sections/remote-branches.asc @@ -1,4 +1,4 @@ -[[_remote_branches]] +[[r_remote_branches]] ////////////////////////// === Remote Branches ////////////////////////// @@ -97,12 +97,12 @@ image::images/remote-branches-3.png[`git fetch` 명령은 리모트 브랜치 ////////////////////////// To demonstrate having multiple remote servers and what remote branches for those remote projects look like, let's assume you have another internal Git server that is used only for development by one of your sprint teams. This server is at `git.team1.ourcompany.com`. -You can add it as a new remote reference to the project you're currently working on by running the `git remote add` command as we covered in <<_git_basics_chapter>>. +You can add it as a new remote reference to the project you're currently working on by running the `git remote add` command as we covered in <>. Name this remote `teamone`, which will be your shortname for that whole URL. ////////////////////////// 리모트 저장소를 여러 개 운영하는 상황을 이해할 수 있도록 개발용으로 사용할 Git 저장소를 팀 내부에 하나 추가해 보자. 이 저장소의 주소가 `git.team1.ourcompany.com` 이며 -<<_git_basics_chapter>>에서 살펴본 `git remote add` 명령으로 현재 작업 중인 프로젝트에 팀의 저장소를 추가한다. +<>에서 살펴본 `git remote add` 명령으로 현재 작업 중인 프로젝트에 팀의 저장소를 추가한다. 이름을 `teamone`으로 짓고 긴 서버 주소 대신 사용한다. ////////////////////////// @@ -126,7 +126,7 @@ image::images/remote-branches-5.png[Remote tracking branch for `teamone/master`. .`teamone/master`의 리모트 트래킹 브랜치 image::images/remote-branches-5.png[`teamone/master`의 리모트 트래킹 브랜치] -[[_pushing_branches]] +[[r_pushing_branches]] ////////////////////////// ==== Pushing ////////////////////////// @@ -164,14 +164,14 @@ To https://github.com/schacon/simplegit ////////////////////////// This is a bit of a shortcut. Git automatically expands the `serverfix` branchname out to `refs/heads/serverfix:refs/heads/serverfix`, which means, ``Take my serverfix local branch and push it to update the remote's serverfix branch.'' -We'll go over the `refs/heads/` part in detail in <<_git_internals>>, but you can generally leave it off. +We'll go over the `refs/heads/` part in detail in <>, but you can generally leave it off. You can also do `git push origin serverfix:serverfix`, which does the same thing – it says, ``Take my serverfix and make it the remote's serverfix.'' You can use this format to push a local branch into a remote branch that is named differently. If you didn't want it to be called `serverfix` on the remote, you could instead run `git push origin serverfix:awesomebranch` to push your local `serverfix` branch to the `awesomebranch` branch on the remote project. ////////////////////////// Git은 serverfix라는 브랜치 이름을 `refs/heads/serverfix:refs/heads/serverfix`로 확장한다. 이것은 `serverfix`라는 로컬 브랜치를 서버로 Push 하는데 리모트의 `serverfix` 브랜치로 업데이트한다는 것을 의미한다. -나중에 <<_git_internals>>에서 `refs/heads/`의 뜻을 자세히 알아볼 것이기 때문에 일단 넘어가도록 한다. +나중에 <>에서 `refs/heads/`의 뜻을 자세히 알아볼 것이기 때문에 일단 넘어가도록 한다. `git push origin serverfix:serverfix`라고 Push 하는 것도 같은 의미인데 이것은 ``로컬의 serverfix 브랜치를 리모트 저장소의 serverfix 브랜치로 Push 하라'' 라는 뜻이다. 로컬 브랜치의 이름과 리모트 서버의 브랜치 이름이 다를 때 필요하다. 리모트 저장소에 `serverfix`라는 이름 대신 다른 이름을 사용하려면 `git push origin serverfix:awesomebranch`처럼 사용한다. @@ -186,7 +186,7 @@ By default it will prompt you on the terminal for this information so the server If you don't want to type it every sinlge time you push, you can set up a ``credential cache''. The simplest is just to keep it in memory for a few mintues, which you can easily set up by running `git config --global credential.helper cache`. -For more information on the various credential caching options available, see <<_credential_caching>>. +For more information on the various credential caching options available, see <>. ==== ////////////////////////// .암호를 매번 입력하지 않아도 된다 @@ -197,7 +197,7 @@ HTTPS URL로 시작하는 리모트 저장소를 사용한다면 아마도 Push 이 리모트에 접근할 때마다 매번 사용자이름나 암호를 입력하지 않도록 ``credential cache'' 기능을 이용할 수 있다. 이 기능을 활성화하면 Git은 몇 분 동안 입력한 사용자이름이나 암호를 저장해둔다. 이 기능을 활성화하려면 `git config --global credential.helper cache` 명령을 실행하여 환경설정을 추가한다. -이 기능이 제공하는 다른 옵션에 대한 자세한 설명은 <<_credential_caching>>를 참고한다. +이 기능이 제공하는 다른 옵션에 대한 자세한 설명은 <>를 참고한다. ==== ////////////////////////// @@ -242,7 +242,7 @@ This gives you a local branch that you can work on that starts where `origin/ser ////////////////////////// 그러면 `origin/serverfix`에서 시작하고 수정할 수 있는 `serverfix`라는 로컬 브랜치가 만들어진다. -[[_tracking_branches]] +[[r_tracking_branches]] ////////////////////////// ==== Tracking Branches ////////////////////////// @@ -395,7 +395,7 @@ Generally it's better to simply use the `fetch` and `merge` commands explicitly ////////////////////////// 일반적으로 `fetch`와 `merge` 명령을 명시적으로 사용하는 것이 `pull` 명령으로 한번에 두 작업을 하는 것보다 낫다. -[[_delete_branches]] +[[r_delete_branches]] ////////////////////////// ==== Deleting Remote Branches ////////////////////////// diff --git a/book/03-git-branching/sections/workflows.asc b/book/03-git-branching/sections/workflows.asc index 27202c97..14ccfa72 100644 --- a/book/03-git-branching/sections/workflows.asc +++ b/book/03-git-branching/sections/workflows.asc @@ -51,7 +51,7 @@ It's generally easier to think about them as work silos, where sets of commits g ////////////////////////// 실험실에서 충분히 테스트하고 실전에 배치하는 과정으로 보면 이해하기 쉽다 -[[lrbranch_b]] +[[rlrbranch_b]] ////////////////////////// .A ``silo'' view of progressive-stability branching image::images/lr-branches-2.png[A ``silo'' view of progressive-stability branching.] @@ -70,7 +70,7 @@ Again, having multiple long-running branches isn't necessary, but it's often hel 중요한 개념은 브랜치를 이용해 여러 단계에 걸쳐서 안정화해 나아가면서 충분히 안정화가 됐을 때 안정 브랜치로 Merge 한다는 점이다. 다시 말해서 Long-Running의 브랜치가 여러 개일 필요는 없지만 정말 유용하다는 점이다. 특히 규모가 크고 복잡한 프로젝트일수록 그 유용성이 반짝반짝 빛난다. -[[_topic_branch]] +[[r_topic_branch]] ////////////////////////// ==== Topic Branches ////////////////////////// @@ -130,9 +130,9 @@ image::images/topic-branches-2.png[History after merging `dumbidea` and `iss91v2 image::images/topic-branches-2.png[`dumbidea`와 `iss91v2` 브랜치를 Merge 하고 난 후의 모습] ////////////////////////// -We will go into more detail about the various possible workflows for your Git project in <<_distributed_git>>, so before you decide which branching scheme your next project will use, be sure to read that chapter. +We will go into more detail about the various possible workflows for your Git project in <>, so before you decide which branching scheme your next project will use, be sure to read that chapter. ////////////////////////// -<<_distributed_git>>에서 프로젝트를 Git으로 관리할 때 브랜치를 이용하여 만들 수 있는 여러 워크플로에 대해 살펴본다. 관련 부분을 살펴보면 프로젝트에 어떤 형태로 응용할수 있을 지 감이 올 것이다. +<>에서 프로젝트를 Git으로 관리할 때 브랜치를 이용하여 만들 수 있는 여러 워크플로에 대해 살펴본다. 관련 부분을 살펴보면 프로젝트에 어떤 형태로 응용할수 있을 지 감이 올 것이다. ////////////////////////// It's important to remember when you're doing all this that these branches are completely local. diff --git a/book/04-git-server/images/gitlab-groups.png b/book/04-git-server/images/gitlab-groups.png deleted file mode 100644 index 399c5e62cb5fb05b92488b17eaa5c61663ddaf49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17463 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 G2~7ZLhBQ3@ diff --git a/book/04-git-server/images/gitlab-menu.png b/book/04-git-server/images/gitlab-menu.png deleted file mode 100644 index beed44978ca9328129e64bfac02df4a14f00b238..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2311 zcmV+i3HbJjP)Px%?odorMHv|xL_|dQ_xH`s&Hw-ZH$6!9_V!0jSoQVw zmz}8i`1q)(s76dz`uh4#PEM<k(Z$z9UX{>h^MEg#>U3z z=;%gCP$wrROiWCLijzi6R(pGUqN1YQ+}wSGjx;nhgM))sR#vySx4XN$l$4a(+S*Q4 zV2O{LKtMpMs;Yp1fHN~QFJ%For;i~OHEI9 zdV-akrj(kc($dn(%F3Xipt-rZLqkIU_mWJXF-Oi);ZiIRhekX&MI z$;ruqfr0Go?7zRihlhvbU478XTFPk4QaL`Fyu5D;i$%W!aTwzjrrW@f3WseOHYnwpx4iHU!Ie|dR%?(Xi4 zjEw#L{idd--{0SCZ+5b^xw5jdqobopN>6xrcyDiSl9H0@>g$GzlG)kWhl`S`t+Pr{ zTm1a|goK2jpPwEc9LlEYHDR@Y!43)US)7lQdNM4k#>BA zYjJ#IXmf6Ke=#vJOHWgDdWBI`T6unkeS(aFh?84gVTX&AOixi`XK!h5dU17pRaI5s z;NV+ZTd=UOIXO9;oSaEYOU%s7w6wHEMn+*_Vd&}Vs;#la#KdcFcBiSY<>lq*G}ng! z00p;6L_t(|+U?kPToYFu0Px4Zr7pTI;CYd+)vLf4z4{Sl%6<(hw3p@At>$Uf#Rk-S_U^{VoAy zZwP=CNP!ecffPuA6i8vuivDzS^zVG^t1rFqTu&(!yW$fP;&&qR>nugulyehMZk=2YG=}PfI>iF3E^~Onyx!H%_k=iIvp`VXpm@zkOZbX zA%wqkTEHNB7)fpl5mqPyK1tp8RnECD1Q@M~M}!XH${&B?_?5|WOM zcMkH|%_Zo-Xru6@-(!{~2R@@|UttAY*^{(`cPC9IJpcCXeEc=V_~_{I;*SWSxiQ_7 z>GPZ};NML?&28PD(MI7(zr$WNm_=MszlZ;7EXMKL`ubWNzdp{#XIv+fi~o8|TeEs{ z)a2D`rtxpxnqcUBAqD*|`Tj?ArwR||V>{mnDUSb5lIL)IvEU8k(Sq>c>s~dCj>_JW z9YqgY)rn%j7=FbJn$CH1QxY69Lsa1o=LX-1-@Ndfw{G3UO$CDWg58##UG99{>spZO z1Qbcli2MEc6;qkcK{K-lY^Uj|qKf8xcgKOpxY@mQjA*?OncXW|6f1aVw}LdYr=dNf zt->c3ZXNYj@yuACt|{baGEF!x^Y-d;y~t@%y>REB6EK!r7{1H-y8U9DVAV_Y6MK)6Z`^D)Z{8>ud1LVqd&0DaV7=%h zN{XGhC@$&FH*@#qy|{}H6Ra2L_XScQ1yUddQXmCVAO%t&1yb0#;-20R0JnY|J%rmh z0A=;?2Vfv&+W_5xusH*C3&Pe6&^-tnGybc>I3*BRAp)ludr)Ca0al6>W6voPfz=|h z=M*W{Qv~*$0$4GS!di;G-UiF6!L9Y{dyNjI_~Nq??Nb zfWge+JeEF9?n;@bA3DEk&JlMe%3 zX6`J(YwtyM|=Z`dy;?(HNhn&T!RRQRSZ{Sk%qZfO;u2FKIr(dv#7@ zwc5o{&0WmY!C%zarIYtD;SCiAjKUUX5#6q!jEPqI_aGu!N)XsVwKV!Hqgf_}icthb zJR`G#!dgK*mCVg<>G=_n*qkg3Do%b!h0V@&NJZ6!lUI}PunPYZ(Z@zgDaTPzQYFDH zF(px@#0aUB@G>|za$h@)g5ZvpSrQlqmjt7bva1fH;Bg(?-_`PMM+yqVs9vD3qksO9 h0x6IJDUhN={0r7V$RU6Mu*CoX002ovPDHLkV1mGFbLjv8 diff --git a/book/04-git-server/images/gitlab-users.png b/book/04-git-server/images/gitlab-users.png deleted file mode 100644 index e2edb586fdc8368be033786823737dc7bbc1bdb8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18656 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 diff --git a/book/04-git-server/sections/generating-ssh-key.asc b/book/04-git-server/sections/generating-ssh-key.asc index 2bbd211d..57f9bfea 100644 --- a/book/04-git-server/sections/generating-ssh-key.asc +++ b/book/04-git-server/sections/generating-ssh-key.asc @@ -1,4 +1,4 @@ -[[_generate_ssh_key]] +[[r_generate_ssh_key]] ////////////////////////// === Generating Your SSH Public Key ////////////////////////// diff --git a/book/04-git-server/sections/git-on-a-server.asc b/book/04-git-server/sections/git-on-a-server.asc index 38319ae6..c26fd5b5 100644 --- a/book/04-git-server/sections/git-on-a-server.asc +++ b/book/04-git-server/sections/git-on-a-server.asc @@ -1,4 +1,4 @@ -[[_git_on_the_server]] +[[r_git_on_the_server]] ////////////////////////// === Getting Git on a Server ////////////////////////// @@ -61,7 +61,7 @@ It takes the Git repository by itself, without a working directory, and creates 물론 설정상의 미세한 차이가 있지만, 저장소의 내용만 고려한다면 같다고 볼 수 있다. 워킹 디렉토리가 없는 Git 저장소인 데다가 별도의 디렉토리도 하나 만들었다는 점에서는 같다. -[[_bare_repo]] +[[r_bare_repo]] ////////////////////////// ==== Putting the Bare Repository on a Server ////////////////////////// diff --git a/book/04-git-server/sections/gitlab.asc b/book/04-git-server/sections/gitlab.asc index 64a5c51f..bcc609b2 100644 --- a/book/04-git-server/sections/gitlab.asc +++ b/book/04-git-server/sections/gitlab.asc @@ -28,13 +28,13 @@ GitLab은 데이터베이스와 따로 연동해야하는 웹 애플리케이션 ////////////////////////// There are a few methods you can pursue to install GitLab. To get something up and running quickly, you can download a virtual machine image or a one-click installer from https://bitnami.com/stack/gitlab[], and tweak the configuration to match your particular environment.(((bitnami))) -One nice touch Bitnami has included is the login screen (accessed by typing alt-→); it tells you the IP address and default username and password for the installed GitLab. +One nice touch Bitnami has included is the login screen (accessed by typing alt-→); it tells you the IP address and default username and password for the installed GitLab. ////////////////////////// 설치 방법은 여러 가지가 있다. 가상 머신 이미지나 원클릭 인스톨러를 내려받아 빨리 설치하고 환경에 맞게 후다닥 설정해서 사용할 수 있다. https://bitnami.com/stack/gitlab[]에서 내려받을 수 있다.(((bitnami))) Bitnami의 로그인 화면은 아래와 같다(alt-→ 를 눌러서 들어간다). 로그인 화면에 설치된 GitLab의 IP와 기본 사용자이름, 암호가 써있다. -[[bitnami]] +[[rbitnami]] ////////////////////////// .The Bitnami GitLab virtual machine login screen. image::images/bitnami.png[The Bitnami GitLab virtual machine login screen.] @@ -67,7 +67,7 @@ GitLab의 관리자 도구는 웹 페이지로 되어있다. 기본 사용자이름은 `admin@local.host`, 암호는 `5iveL!fe`이다(이건 로그인 후에 바꿀 수 있다). 로그인하고 나서 메뉴 오른쪽 위에 있는 ``Admin area''를 클릭한다. -[[gitlab_menu]] +[[rgitlab_menu]] ////////////////////////// .The ``Admin area'' item in the GitLab menu. image::images/gitlab-menu.png[The ``Admin area'' item in the GitLab menu.] @@ -91,7 +91,7 @@ GitLab의 사용자 계정은 한 사람당 하나씩 만든다. 각 사용자마다 **네임스페이스**가 있다. 네임스페이스는 프로젝트를 묶는 단위이다. *jane* 사용자가 **project**라는 프로젝트를 진행 중이라면 프로젝트의 URL은 http://server/jane/project[]가 될 것이다. -[[gitlab_users]] +[[rgitlab_users]] ////////////////////////// .The GitLab user administration screen. image::images/gitlab-users.png[The GitLab user administration screen.] @@ -115,7 +115,7 @@ This is obviously a much more permanent and destructive action, and its uses are 삭제한 사용자의 모든 프로젝트와 데이터가 삭제되고 해당 사용자가 소유한 그룹도 삭제된다. 영구히 삭제돼 되돌릴 수 없으므로 조심해야 한다. -[[_gitlab_groups_section]] +[[r_gitlab_groups_section]] ////////////////////////// ===== Groups ////////////////////////// @@ -128,7 +128,7 @@ Each group has a project namespace (the same way that users do), so if the group GitLab 그룹은 프로젝트와 누가 어떤 프로젝트에 어떻게 접근할지에 대한 권한 데이터의 모음이다. 그룹에도 사용자처럼 프로젝트 네임스페이스가 있다. +training+라는 그룹이 +materials+라는 프로젝트를 가지고 있으면 URL은 http://server/training/materials[]가 된다. -[[gitlab_groups]] +[[rgitlab_groups]] ////////////////////////// .The GitLab group administration screen. image::images/gitlab-groups.png[The GitLab group administration screen.] @@ -242,11 +242,11 @@ Each project's home page shows recent activity, and links along the top will lea ////////////////////////// The simplest way of working together on a GitLab project is by giving another user direct push access to the Git repository. -You can add a user to a project by going to the ``Members'' section of that project's settings, and associating the new user with an access level (the different access levels are discussed a bit in <<_gitlab_groups_section>>). +You can add a user to a project by going to the ``Members'' section of that project's settings, and associating the new user with an access level (the different access levels are discussed a bit in <>). By giving a user an access level of ``Developer'' or above, that user can push commits and branches directly to the repository with impunity. ////////////////////////// 함께 일할 사람에게 그냥 Git 저장소의 Push 권한을 주는 걸로 간단하게 협업을 시작할 수 있다. -프로젝트 설정 페이지에서 ``Members'' 섹션에 같이 일할 사용자를 추가한다. 그리고 그 사용자가 Push 할 수 있도록 설정한다(다른 접근 수준에 대해서는 <<_gitlab_groups_section>>에서 볼 수 있다). +프로젝트 설정 페이지에서 ``Members'' 섹션에 같이 일할 사용자를 추가한다. 그리고 그 사용자가 Push 할 수 있도록 설정한다(다른 접근 수준에 대해서는 <>에서 볼 수 있다). ``Developer'' 이상의 권한을 주면 그 사용자는 우리 저장소에 Push 하거나 브랜치를 만들 수 있다. ////////////////////////// diff --git a/book/04-git-server/sections/gitweb.asc b/book/04-git-server/sections/gitweb.asc index 818670b6..ddad47d5 100644 --- a/book/04-git-server/sections/gitweb.asc +++ b/book/04-git-server/sections/gitweb.asc @@ -11,7 +11,7 @@ Git comes with a CGI script called GitWeb that is sometimes used for this. 프로젝트 저장소를 단순히 읽거나 쓰는 것에 대한 설정은 다뤘다. 이제는 웹 기반 인터페이스를 설정해 보자. Git은 웹에서 저장소를 조회할 수 있는 GitWeb이라는 CGI 스크립트를 제공한다. -[[gitweb]] +[[rgitweb]] ////////////////////////// .The GitWeb web-based user interface. image::images/git-instaweb.png[The GitWeb web-based user interface.] diff --git a/book/04-git-server/sections/hosted.asc b/book/04-git-server/sections/hosted.asc index da3c6fb0..8cb2c7c3 100644 --- a/book/04-git-server/sections/hosted.asc +++ b/book/04-git-server/sections/hosted.asc @@ -20,6 +20,6 @@ To see an up-to-date list, check out the GitHosting page on the main Git wiki at https://git.wiki.kernel.org/index.php/GitHosting[]에 최신 Git 호스팅 서비스 리스트가 있으니 참고하자. ////////////////////////// -We'll cover using GitHub in detail in <<_github>>, as it is the largest Git host out there and you may need to interact with projects hosted on it in any case, but there are dozens more to choose from should you not want to set up your own Git server. +We'll cover using GitHub in detail in <>, as it is the largest Git host out there and you may need to interact with projects hosted on it in any case, but there are dozens more to choose from should you not want to set up your own Git server. ////////////////////////// -GitHub에 대해서는 <<_github>>에서 자세히 설명하려 한다. GitHub은 가장 큰 Git 호스팅 서비스이다. Git 서버를 직접 운영하지 않으려면 수십 개의 호스팅 서비스 중에서 하나를 골라야 한다. +GitHub에 대해서는 <>에서 자세히 설명하려 한다. GitHub은 가장 큰 Git 호스팅 서비스이다. Git 서버를 직접 운영하지 않으려면 수십 개의 호스팅 서비스 중에서 하나를 골라야 한다. diff --git a/book/04-git-server/sections/protocols.asc b/book/04-git-server/sections/protocols.asc index 67452381..af6b00a4 100644 --- a/book/04-git-server/sections/protocols.asc +++ b/book/04-git-server/sections/protocols.asc @@ -53,7 +53,7 @@ $ git clone file:///srv/git/project.git Git operates slightly differently if you explicitly specify `file://` at the beginning of the URL. If you just specify the path, Git tries to use hardlinks or directly copy the files it needs. If you specify `file://`, Git fires up the processes that it normally uses to transfer data over a network which is generally a lot less efficient method of transferring the data. -The main reason to specify the `file://` prefix is if you want a clean copy of the repository with extraneous references or objects left out – generally after an import from another version-control system or something similar (see <<_git_internals>> for maintenance tasks). +The main reason to specify the `file://` prefix is if you want a clean copy of the repository with extraneous references or objects left out – generally after an import from another version-control system or something similar (see <> for maintenance tasks). We'll use the normal path here because doing so is almost always faster. ////////////////////////// Git은 파일 경로를 직접 쓸 때와 `file://`로 시작하는 URL을 사용할 때를 약간 다르게 처리한다. @@ -88,7 +88,7 @@ Then, you can push to and pull from that remote as though you were doing so over The pros of file-based repositories are that they're simple and they use existing file permissions and network access. If you already have a shared filesystem to which your whole team has access, setting up a repository is very easy. You stick the bare repository copy somewhere everyone has shared access to and set the read/write permissions as you would for any other shared directory. -We'll discuss how to export a bare repository copy for this purpose in <<_git_on_the_server>>. +We'll discuss how to export a bare repository copy for this purpose in <>. ////////////////////////// 파일 기반 저장소의 장점은 간단하다는 것이다. 기존에 있던 네트워크나 파일의 권한을 그대로 사용하기 때문에 설정하기 쉽다. 이미 팀 전체가 접근할 수 있는 파일시스템을 가지고 있다면 저장소를 아주 쉽게 구성할 수 있다. @@ -186,14 +186,14 @@ In fact, for services like GitHub, the URL you use to view the repository online If the server does not respond with a Git HTTP smart service, the Git client will try to fall back to the simpler ``dumb'' HTTP protocol. The Dumb protocol expects the bare Git repository to be served like normal files from the web server. The beauty of the Dumb HTTP protocol is the simplicity of setting it up. -Basically, all you have to do is put a bare Git repository under your HTTP document root and set up a specific `post-update` hook, and you're done (See <<_git_hooks>>). +Basically, all you have to do is put a bare Git repository under your HTTP document root and set up a specific `post-update` hook, and you're done (See <>). At that point, anyone who can access the web server under which you put the repository can also clone your repository. To allow read access to your repository over HTTP, do something like this: ////////////////////////// Git 서버가 스마트 HTTP 요청에 응답하지 않으면 Git 클라이언트는 차선책으로 멍청한 HTTP 프로토콜을 시도한다. 이 멍청한 프로토콜은 원격 저장소를 그냥 파일 건네주는 웹 서버로 취급한다. HTTP와 HTTPS 프로토콜은 아름다울 정도로 설정이 간단하다. -HTTP 도큐먼트 루트 밑에 Bare 저장소를 두고 post-update 훅을 설정하는 것이 기본적으로 해야 하는 일의 전부다( <<_git_hooks>> 에서 자세히 다룰 것이다). +HTTP 도큐먼트 루트 밑에 Bare 저장소를 두고 post-update 훅을 설정하는 것이 기본적으로 해야 하는 일의 전부다( <> 에서 자세히 다룰 것이다). 저장소가 있는 웹 서버에 접근할 수 있다면 그 저장소를 Clone 할 수도 있다. 아래와 같이 HTTP를 통해서 저장소를 읽을 수 있게 한다. @@ -222,10 +222,10 @@ $ git clone https://example.com/gitproject.git ////////////////////////// In this particular case, we're using the `/var/www/htdocs` path that is common for Apache setups, but you can use any static web server – just put the bare repository in its path. -The Git data is served as basic static files (see <<_git_internals>> for details about exactly how it's served). +The Git data is served as basic static files (see <> for details about exactly how it's served). ////////////////////////// 여기서는 Apache 서버를 사용해서 기본 루트 디렉토리인 `/var/www/htdocs`를 사용하지만 다른 웹 서버를 사용해도 된다. 단순히 Bare 저장소를 HTTP 문서 루트에 넣으면 된다. -Git 데이터는 일반적인 정적 파일처럼 취급된다( <<_git_internals>> 에서 정확히 어떻게 처리하는지 다룬다). +Git 데이터는 일반적인 정적 파일처럼 취급된다( <> 에서 정확히 어떻게 처리하는지 다룬다). ////////////////////////// Generally you would either choose to run a read/write Smart HTTP server or simply have the files accessible as read-only in the Dumb manner. @@ -280,11 +280,11 @@ HTTP나 HTTPS를 사용하도록 설정하는 것이 SSH로 설정하는 것보 ////////////////////////// If you're using HTTP for authenticated pushing, providing your credentials is sometimes more complicated than using keys over SSH. There are however several credential caching tools you can use, including Keychain access on OSX and Credential Manager on Windows, to make this pretty painless. -Read <<_credential_caching>> to see how to set up secure HTTP password caching on your system. +Read <> to see how to set up secure HTTP password caching on your system. ////////////////////////// Push 할 때 HTTP 인증을 사용하면 SSH 인증키를 사용하는 것보다 좀 더 복잡하다. 그래도 인증 캐싱 툴을 사용하면 좀 낫다. OSX에는 키체인(Keychain Access)이, Windows에는 인증서 관리자(Credential Manager)가 있다. -HTTP 암호 캐싱 설정에 대한 더 자세한 사항은 <<_credential_caching>> 를 참고하길 바란다. +HTTP 암호 캐싱 설정에 대한 더 자세한 사항은 <> 를 참고하길 바란다. ////////////////////////// ==== The SSH Protocol diff --git a/book/04-git-server/sections/setting-up-server.asc b/book/04-git-server/sections/setting-up-server.asc index 5c8ef2cc..9dabaa65 100644 --- a/book/04-git-server/sections/setting-up-server.asc +++ b/book/04-git-server/sections/setting-up-server.asc @@ -1,4 +1,4 @@ -[[_setting_up_server]] +[[r_setting_up_server]] ////////////////////////// === Setting Up the Server ////////////////////////// diff --git a/book/05-distributed-git/images/managed-team-flow.png b/book/05-distributed-git/images/managed-team-flow.png deleted file mode 100644 index 18be331debbe0dc019f08b3928f606cb1fcb897b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33045 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 G0sjyG>V*IR diff --git a/book/05-distributed-git/sections/contributing.asc b/book/05-distributed-git/sections/contributing.asc index a2cb97bc..415cbc53 100644 --- a/book/05-distributed-git/sections/contributing.asc +++ b/book/05-distributed-git/sections/contributing.asc @@ -1,4 +1,4 @@ -[[_contributing_project]] +[[r_contributing_project]] ////////////////////////// === Contributing to a Project ////////////////////////// @@ -66,7 +66,7 @@ We'll cover aspects of each of these in a series of use cases, moving from simpl 이런 질문에 따라 프로젝트에 기여하는 방법과 워크플로가 달라진다. 간단한 것부터 복잡한 것까지 예제를 통해 각 상황을 살펴보면 실제 프로젝트에 필요한 워크플로를 선택하는 데 도움이 될 것이다. -[[_commit_guidelines]] +[[r_commit_guidelines]] ////////////////////////// ==== Commit Guidelines ////////////////////////// @@ -105,18 +105,18 @@ If you run that command before committing, you can tell if you're about to commi Next, try to make each commit a logically separate changeset. If you can, try to make your changes digestible – don't code for a whole weekend on five different issues and then submit them all as one massive commit on Monday. Even if you don't commit during the weekend, use the staging area on Monday to split your work into at least one commit per issue, with a useful message per commit. -If some of the changes modify the same file, try to use `git add --patch` to partially stage files (covered in detail in <<_interactive_staging>>). +If some of the changes modify the same file, try to use `git add --patch` to partially stage files (covered in detail in <>). The project snapshot at the tip of the branch is identical whether you do one commit or five, as long as all the changes are added at some point, so try to make things easier on your fellow developers when they have to review your changes. This approach also makes it easier to pull out or revert one of the changesets if you need to later. -<<_rewriting_history>> describes a number of useful Git tricks for rewriting history and interactively staging files – use these tools to help craft a clean and understandable history before sending the work to someone else. +<> describes a number of useful Git tricks for rewriting history and interactively staging files – use these tools to help craft a clean and understandable history before sending the work to someone else. ////////////////////////// 그리고 각 커밋은 논리적으로 구분되는 Changeset이다. 최대한 수정사항을 한 주제로 요약할 수 있어야 하고 여러 가지 이슈에 대한 수정사항을 하나의 커밋에 담지 않아야 한다. 여러 가지 이슈를 한꺼번에 수정했다고 하더라도 Staging Area를 이용하여 한 커밋에 이슈 하나만 담기도록 한다. 작업 내용을 분할하고, 각 커밋마다 적절한 메시지를 작성한다. -같은 파일의 다른 부분을 수정하는 경우에는 `git add -patch` 명령을 써서 한 부분씩 나누어 Staging Area에 저장해야 한다(관련 내용은 <<_interactive_staging>> 에서 다룬다). +같은 파일의 다른 부분을 수정하는 경우에는 `git add -patch` 명령을 써서 한 부분씩 나누어 Staging Area에 저장해야 한다(관련 내용은 <> 에서 다룬다). 결과적으로 최종 프로젝트의 모습은 한 번에 커밋을 하든 다섯 번에 나누어 커밋을 하든 똑같다. 하지만, 여러 번 나누어 커밋하는 것이 다른 동료가 수정한 부분을 확인할 때나 각 커밋의 시점으로 복원해서 검토할 때 이해하기 훨씬 쉽다. -<<_rewriting_history>> 에서 이미 저장된 커밋을 다시 수정하거나 파일을 단계적으로 Staging Area에 저장하는 방법을 살펴본다. 다양한 도구를 이용해서 간단하고 이해하기 쉬운 커밋을 쌓아가야 한다. +<> 에서 이미 저장된 커밋을 다시 수정하거나 파일을 단계적으로 Staging Area에 저장하는 방법을 살펴본다. 다양한 도구를 이용해서 간단하고 이해하기 쉬운 커밋을 쌓아가야 한다. ////////////////////////// The last thing to keep in mind is the commit message. @@ -192,7 +192,7 @@ Do as we say, not as we do. 시간 관계상, 이 책에서 설명하는 예제의 커밋 메시지는 위와 같이 아주 멋지게 쓰지 않았다. `git commit` 명령에서 `-m` 옵션을 사용하여 간단하게 적는다. 하지만! 저자처럼 하지 말고 시키는 대로 하는 것이 좋다. -[[_private_team]] +[[r_private_team]] ////////////////////////// ==== Private Small Team ////////////////////////// @@ -424,10 +424,10 @@ Date: Fri May 29 16:01:27 2009 -0700 ////////////////////////// The `issue54..origin/master` syntax is a log filter that asks Git to only show the list of commits that are on the latter branch (in this case `origin/master`) that are not on the first branch (in this case `issue54`). -We'll go over this syntax in detail in <<_commit_ranges>>. +We'll go over this syntax in detail in <>. ////////////////////////// `issue54..origin/master` 문법은 히스토리를 검색할 때 뒤의 브랜치(`origin/master`)에 속한 커밋 중 앞의 브랜치(`issue54`)에 속하지 않은 커밋을 검색하는 문법이다. -자세한 내용은 <<_commit_ranges>>에서 다룬다. +자세한 내용은 <>에서 다룬다. ////////////////////////// For now, we can see from the output that there is a single commit that John has made that Jessica has not merged in. @@ -691,11 +691,11 @@ To jessica@githost:simplegit.git ////////////////////////// This is called a _refspec_. -See <<_refspec>> for a more detailed discussion of Git refspecs and different things you can do with them. +See <> for a more detailed discussion of Git refspecs and different things you can do with them. Also notice the `-u` flag; this is short for `--set-upstream`, which configures the branches for easier pushing and pulling later. ////////////////////////// 이것은 _refspec_ 이란 것을 사용하는 것인데 -<<_refspec>> 에서 자세하게 설명한다. +<> 에서 자세하게 설명한다. 명령에서 사용한 `-u` 옵션은 `--set-upstream` 옵션의 짧은 표현인데 브랜치를 추적하도록 설정해서 이후 Push 나 Pull 할 때 좀 더 편하게 사용할 수 있다. ////////////////////////// @@ -802,7 +802,7 @@ image::images/managed-team-flow.png[Basic sequence of this managed-team workflow .Managed 팀의 워크플로. image::images/managed-team-flow.png[Managed 팀의 워크플로.] -[[_public_project]] +[[r_public_project]] ////////////////////////// ==== Forked Public Project ////////////////////////// @@ -843,11 +843,11 @@ $ git commit [NOTE] ////////////////////////// ==== -You may want to use `rebase -i` to squash your work down to a single commit, or rearrange the work in the commits to make the patch easier for the maintainer to review – see <<_rewriting_history>> for more information about interactive rebasing. +You may want to use `rebase -i` to squash your work down to a single commit, or rearrange the work in the commits to make the patch easier for the maintainer to review – see <> for more information about interactive rebasing. ==== ////////////////////////// ==== -`rebase -i` 명령을 사용하면 여러 커밋을 하나의 커밋으로 합치거나 프로젝트의 관리자가 수정사항을 쉽게 이해하도록 커밋을 정리할 수 있다. <<_rewriting_history>> 에서 대화식으로 Rebase 하는 방법을 살펴본다. +`rebase -i` 명령을 사용하면 여러 커밋을 하나의 커밋으로 합치거나 프로젝트의 관리자가 수정사항을 쉽게 이해하도록 커밋을 정리할 수 있다. <> 에서 대화식으로 Rebase 하는 방법을 살펴본다. ==== ////////////////////////// @@ -865,12 +865,12 @@ $ git remote add myfork (url) ////////////////////////// Then you need to push your work up to it. It's easiest to push the topic branch you're working on up to your repository, rather than merging into your `master` branch and pushing that up. -The reason is that if the work isn't accepted or is cherry-picked, you don't have to rewind your master branch. (`cherry-pick` is covered in more detail in <<_rebase_cherry_pick>>). +The reason is that if the work isn't accepted or is cherry-picked, you don't have to rewind your master branch. (`cherry-pick` is covered in more detail in <>). If the maintainers `merge`, `rebase`, or `cherry-pick` your work, you'll eventually get it back via pulling from their repository anyhow: ////////////////////////// 자 이제 등록한 리모트 저장소에 Push 한다. 작업하던 것을 로컬 저장소의 `master` 브랜치에 Merge 한 후 Push 하는 것보다 리모트 브랜치에 바로 Push를 하는 방식이 훨씬 간단하다. -이렇게 하는 이유는 관리자가 토픽 브랜치를 프로젝트에 포함시키고 싶지 않을 때 토픽 브랜치를 Merge 하기 이전 상태로 `master` 브랜치를 되돌릴 필요가 없기 때문이다. (`cherry-pick` 명령은 <<_rebase_cherry_pick>> 에서 자세히 다룬다). +이렇게 하는 이유는 관리자가 토픽 브랜치를 프로젝트에 포함시키고 싶지 않을 때 토픽 브랜치를 Merge 하기 이전 상태로 `master` 브랜치를 되돌릴 필요가 없기 때문이다. (`cherry-pick` 명령은 <> 에서 자세히 다룬다). 관리자가 토픽 브랜치를 Merge 하든 Rebase 하든 Cherry-Pick 하든지 간에 결국 다시 관리자의 저장소를 Pull 할 때는 토픽 브랜치의 내용이 들어 있을 것이다. [source,console] @@ -881,10 +881,10 @@ $ git push -u myfork featureA (((git commands, request-pull))) ////////////////////////// When your work has been pushed up to your fork, you need to notify the maintainer. -This is often called a pull request, and you can either generate it via the website – GitHub has it's own Pull Request mechanism that we'll go over in <<_github>> – or you can run the `git request-pull` command and email the output to the project maintainer manually. +This is often called a pull request, and you can either generate it via the website – GitHub has it's own Pull Request mechanism that we'll go over in <> – or you can run the `git request-pull` command and email the output to the project maintainer manually. ////////////////////////// Fork 한 저장소에 Push 하고 나면 프로젝트 관리자에게 이 내용을 알려야 한다. -이것을 'Pull Request'라고 한다. Git 호스팅 사이트에서 관리자에게 보낼 메시지를 생성하거나 `git request-pull` 명령으로 이메일을 수동으로 만들 수 있다. GitHub의 "pull request" 버튼은 자동으로 메시지를 만들어 주는데 관련 내용은 <<_github>> 에서 살펴볼 수 있다. +이것을 'Pull Request'라고 한다. Git 호스팅 사이트에서 관리자에게 보낼 메시지를 생성하거나 `git request-pull` 명령으로 이메일을 수동으로 만들 수 있다. GitHub의 "pull request" 버튼은 자동으로 메시지를 만들어 주는데 관련 내용은 <> 에서 살펴볼 수 있다. ////////////////////////// The `request-pull` command takes the base branch into which you want your topic branch pulled and the Git repository URL you want them to pull from, and outputs a summary of all the changes you're asking to be pulled in. @@ -964,11 +964,11 @@ $ git push -f myfork featureA ---- ////////////////////////// -This rewrites your history to now look like <>. +This rewrites your history to now look like <>. ////////////////////////// 위 명령들을 실행하고 나면 히스토리는 아래와 같아진다. -[[psp_b]] +[[rpsp_b]] ////////////////////////// .Commit history after `featureA` work. image::images/public-small-2.png[Commit history after `featureA` work.] @@ -1024,7 +1024,7 @@ image::images/public-small-3.png[Commit history after `featureBv2` work.] .featureBv2 브랜치를 커밋한 이후 저장소 모습. image::images/public-small-3.png[featureBv2 브랜치를 커밋한 이후 저장소 모습.] -[[_project_over_email]] +[[r_project_over_email]] ////////////////////////// ==== Public Project over Email ////////////////////////// diff --git a/book/05-distributed-git/sections/distributed-workflows.asc b/book/05-distributed-git/sections/distributed-workflows.asc index 1657f75f..65ee381c 100644 --- a/book/05-distributed-git/sections/distributed-workflows.asc +++ b/book/05-distributed-git/sections/distributed-workflows.asc @@ -71,7 +71,7 @@ With Git's branching model, it's possible for hundreds of developers to successf ////////////////////////// 작은 팀만 이렇게 일할 수 있는 것이 아니다. Git이 제공하는 브랜치 관리 모델을 사용하면 수백명의 개발자가 한 프로젝트 안에서 다양한 브랜치를 만들어서 함께 작업하는 것도 쉽다. -[[_integration_manager]] +[[r_integration_manager]] ////////////////////////// ==== Integration-Manager Workflow ////////////////////////// @@ -84,14 +84,14 @@ This scenario often includes a canonical repository that represents the ``offici To contribute to that project, you create your own public clone of the project and push your changes to it. Then, you can send a request to the maintainer of the main project to pull in your changes. The maintainer can then add your repository as a remote, test your changes locally, merge them into their branch, and push back to their repository. -The process works as follows (see <>): +The process works as follows (see <>): ////////////////////////// Git을 사용하면 리모트 저장소를 여러 개 운영할 수 있다. 다른 개발자는 읽기만 가능하고 자신은 쓰기도 가능한 공개 저장소를 만드는 워크플로도 된다. 이 Worlflow에는 보통 프로젝트를 대표하는 공식 저장소가 있다. 기여자는 우선 공식 저장소를 하나 Clone 하고 수정하고 나서 자신의 저장소에 Push 한다. 그 다음에 프로젝트 Integration-Manager에게 새 저장소에서 Pull 하라고 요청한다. 그러면 그 Integration-Manager는 기여자의 저장소를 리모트 저장소로 등록하고, 로컬에서 기여물을 테스트하고, 프로젝트 메인 브랜치에 Merge 하고, 그 내용을 다시 프로젝트 메인 저장소에 Push 한다. -이런 과정은 아래와 같다(<>). +이런 과정은 아래와 같다(<>). ////////////////////////// 1. The project maintainer pushes to their public repository. @@ -108,7 +108,7 @@ Git을 사용하면 리모트 저장소를 여러 개 운영할 수 있다. 다 5. Integration-Manager는 기여자의 저장소를 리모트 저장소로 등록하고 수정사항을 Merge 하여 테스트한다. 6. Integration-Manager는 Merge 한 사항을 메인 저장소에 Push 한다. -[[wfdiag_b]] +[[rwfdiag_b]] ////////////////////////// .Integration-manager workflow. image::images/integration-manager.png[Integration-manager workflow.] @@ -138,14 +138,14 @@ It's generally used by huge projects with hundreds of collaborators; one famous Various integration managers are in charge of certain parts of the repository; they're called lieutenants. All the lieutenants have one integration manager known as the benevolent dictator. The benevolent dictator pushes from his directory to a reference repository from which all the collaborators need to pull. -The process works like this (see <>): +The process works like this (see <>): ////////////////////////// 이 방식은 저장소를 여러개 운영하는 방식을 변형한 구조이다. 보통 수백 명의 개발자가 참여하는 아주 큰 프로젝트를 운영할 때 이 방식을 사용한다. Linux 커널 프로젝트가 대표적이다. 여러 명의 Integration-Manager가 저장소에서 자신이 맡은 부분만을 담당하는데 이들을 Lieutenants라고 부른다. 모든 Lieutenant는 최종 관리자 아래에 있으며 이 최종 관리자를 Benevolent Dictator라고 부른다. Benevolent Dictator는 Lieutenant의 저장소를 가져와 공식 저장소에 Push 하고 모든 프로젝트 참여자는 이 공식 저장소에서 반드시 Pull 해야 한다. -이러한 워크플로는 아래와 같다(<>). +이러한 워크플로는 아래와 같다(<>). ////////////////////////// 1. Regular developers work on their topic branch and rebase their work on top of `master`. @@ -160,7 +160,7 @@ Benevolent Dictator는 Lieutenant의 저장소를 가져와 공식 저장소에 3. Dictator는 Lieutenant의 master 브랜치를 자신의 master 브랜치로 Merge 한다. 4. Dictator는 자신의 master 브랜치를 Push 하며 다른 모든 개발자는 Dictator의 master 브랜치를 기준으로 Rebase 한다. -[[wfdiag_c]] +[[rwfdiag_c]] ////////////////////////// .Benevolent dictator workflow. image::images/benevolent-dictator.png[Benevolent dictator workflow.] diff --git a/book/05-distributed-git/sections/maintaining.asc b/book/05-distributed-git/sections/maintaining.asc index 729d53fe..478bada2 100644 --- a/book/05-distributed-git/sections/maintaining.asc +++ b/book/05-distributed-git/sections/maintaining.asc @@ -52,7 +52,7 @@ Now you're ready to add your contributed work that you received into this topic ////////////////////////// 이렇게 토픽 브랜치를 만들고 받은 Patch를 적용해보고 적용한 내용을 다시 Long-Running 브랜치로 Merge 한다. -[[_patches_from_email]] +[[r_patches_from_email]] ////////////////////////// ==== Applying Patches from Email ////////////////////////// @@ -117,7 +117,7 @@ This command also exits with a non-zero status if the check fails, so you can us 화면에 아무 내용도 뜨지 않으면 Patch가 깔끔하게 적용됐다는 것이다. 이 명령은 Patch를 적용해 보고 에러가 발생하면 0이 아닌 값을 반환하기 때문에 쉘 스크립트에서도 사용할 수 있다. -[[_git_am]] +[[r_git_am]] ////////////////////////// ===== Applying a Patch with `am` ////////////////////////// @@ -292,7 +292,7 @@ When all the patches for your topic are applied and committed into your branch, ////////////////////////// 모든 Patch를 토픽 브랜치에 적용하고 커밋까지 마치면 Long-Running 브랜치에 어떻게 통합할지를 결정해야 한다. -[[_checking_out_remotes]] +[[r_checking_out_remotes]] ////////////////////////// ==== Checking Out Remote Branches ////////////////////////// @@ -354,7 +354,7 @@ From https://github.com/onetimeguy/project Merge made by the 'recursive' strategy. ---- -[[_what_is_introduced]] +[[r_what_is_introduced]] ////////////////////////// ==== Determining What Is Introduced ////////////////////////// @@ -493,14 +493,14 @@ You have a number of choices, so we'll cover a few of them. One simple workflow is to merge the work into your `master` branch. In this scenario, you have a `master` branch that contains basically stable code. When you have work in a topic branch that you've done or that someone has contributed and you've verified, you merge it into your `master` branch, delete the topic branch, and then continue the process. -If we have a repository with work in two branches named `ruby_client` and `php_client` that looks like <> and merge `ruby_client` first and then `php_client` next, then your history will end up looking like <>. +If we have a repository with work in two branches named `ruby_client` and `php_client` that looks like <> and merge `ruby_client` first and then `php_client` next, then your history will end up looking like <>. ////////////////////////// 바로 `master` 브랜치에 Merge 하는 것이 가장 간단하다. 이 워크플로에서는 `master` 브랜치가 안전한 코드라고 가정한다. 토픽 브랜치를 검증하고 `master` 브랜치로 Merge 할 때마다 토픽 브랜치를 삭제한다. -<> 처럼 `ruby_client` 브랜치와 `php_client` 브랜치가 있을 때 `ruby_client` 브랜치를 `master` 브랜치로 Merge 한 후 `php_client` 브랜치를 Merge 하면 <> 같아진다. +<> 처럼 `ruby_client` 브랜치와 `php_client` 브랜치가 있을 때 `ruby_client` 브랜치를 `master` 브랜치로 Merge 한 후 `php_client` 브랜치를 Merge 하면 <> 같아진다. -[[merwf_a]] +[[rmerwf_a]] ////////////////////////// .History with several topic branches. image::images/merging-workflows-1.png[History with several topic branches.] @@ -508,7 +508,7 @@ image::images/merging-workflows-1.png[History with several topic branches.] .여러 토픽 브랜치 히스토리. image::images/merging-workflows-1.png[여러 토픽 브랜치 히스토리.] -[[merwf_b]] +[[rmerwf_b]] ////////////////////////// .After a topic branch merge. image::images/merging-workflows-2.png[After a topic branch merge.] @@ -525,14 +525,14 @@ That is probably the simplest workflow, but it can possibly be problematic if yo If you have a more important project, you might want to use a two-phase merge cycle. In this scenario, you have two long-running branches, `master` and `develop`, in which you determine that `master` is updated only when a very stable release is cut and all new code is integrated into the `develop` branch. You regularly push both of these branches to the public repository. -Each time you have a new topic branch to merge in (<>), you merge it into `develop` (<>); then, when you tag a release, you fast-forward `master` to wherever the now-stable `develop` branch is (<>). +Each time you have a new topic branch to merge in (<>), you merge it into `develop` (<>); then, when you tag a release, you fast-forward `master` to wherever the now-stable `develop` branch is (<>). ////////////////////////// 개발자가 많고 규모가 큰 프로젝트에서는 최소한 두 단계로 Merge 하는 것이 좋다. 살펴볼 예에서는 Long-Running 브랜치를 두 개를 유지한다. `master` 브랜치는 아주 안정적인 버전을 릴리즈하기 위해서 사용한다. `develop` 브랜치는 새로 수정된 코드를 통합할 때 사용한다. 그리고 두 브랜치를 모두 공개 저장소에 Push 한다. -우선 develop 브랜치에 토픽 브랜치(<>)를 <> 같이 Merge 한다. 그 후에 릴리즈해도 될만한 수준이 되면 master 브랜치를 develop 브랜치까지 Fast-forward시킨다(<>). +우선 develop 브랜치에 토픽 브랜치(<>)를 <> 같이 Merge 한다. 그 후에 릴리즈해도 될만한 수준이 되면 master 브랜치를 develop 브랜치까지 Fast-forward시킨다(<>). -[[merwf_c]] +[[rmerwf_c]] ////////////////////////// .Before a topic branch merge. image::images/merging-workflows-3.png[Before a topic branch merge.] @@ -540,7 +540,7 @@ image::images/merging-workflows-3.png[Before a topic branch merge.] .토픽 브랜치를 Merge 하기 전. image::images/merging-workflows-3.png[토픽 브랜치를 Merge 하기 전.] -[[merwf_d]] +[[rmerwf_d]] ////////////////////////// .After a topic branch merge. image::images/merging-workflows-4.png[After a topic branch merge.] @@ -548,7 +548,7 @@ image::images/merging-workflows-4.png[After a topic branch merge.] .토픽 브랜치를 Merge 한 후. image::images/merging-workflows-4.png[토픽 브랜치를 Merge 한 후.] -[[merwf_e]] +[[rmerwf_e]] ////////////////////////// .After a project release. image::images/merging-workflows-5.png[After a topic branch release.] @@ -573,16 +573,16 @@ Then, when the codebase on that branch is stable and passes tests, you merge it (((workflows, "merging (large)"))) ////////////////////////// The Git project has four long-running branches: `master`, `next`, and `pu` (proposed updates) for new work, and `maint` for maintenance backports. -When new work is introduced by contributors, it's collected into topic branches in the maintainer's repository in a manner similar to what we've described (see <>). +When new work is introduced by contributors, it's collected into topic branches in the maintainer's repository in a manner similar to what we've described (see <>). At this point, the topics are evaluated to determine whether they're safe and ready for consumption or whether they need more work. If they're safe, they're merged into `next`, and that branch is pushed up so everyone can try the topics integrated together. ////////////////////////// Git을 개발하는 프로젝트는 Long-Running의 브랜치를 4개 운영한다. 각 브랜치 이름은 `master`, `next`, `pu` (Proposed Updates), `maint` 이다. `maint`는 마지막으로 릴리즈한 버전을 지원하는 브랜치다. -기여자가 새로운 기능을 제안하면 관리자는 <> 처럼 자신의 저장소에 토픽 브랜치를 만들어 관리한다. +기여자가 새로운 기능을 제안하면 관리자는 <> 처럼 자신의 저장소에 토픽 브랜치를 만들어 관리한다. 그리고 토픽에 부족한 점은 없는지, 안정적인지 계속 테스트한다. 안정화되면 `next`로 Merge 하고 저장소에 Push 한다. 그러면 모두가 잘 통합됐는지 확인할 수 있다. -[[merwf_f]] +[[rmerwf_f]] ////////////////////////// .Managing a complex series of parallel contributed topic branches. image::images/large-merges-1.png[Managing a complex series of parallel contributed topic branches.] @@ -619,7 +619,7 @@ The Git project's workflow is specialized. To clearly understand this you could Git을 개발하는 프로젝트를 Clone 하면 브랜치가 4개 있고 각 브랜치를 이용하여 진행사항을 확인해볼 수 있다. 그래서 새로운 기능을 추가하려면 적당한 브랜치를 보고 고른다. 이 워크플로는 잘 구조화돼 있어서 코드가 새로 추가돼도 테스트하기 쉽다. 이 Git 프로젝트의 워크플로는 끝판왕이다. 완벽하게 이해하려면 https://github.com/git/git/blob/master/Documentaion/howto/maintain-git.txt[Git 관리자 가이드]를 봐야 한다. -[[_rebase_cherry_pick]] +[[r_rebase_cherry_pick]] ////////////////////////// ===== Rebasing and Cherry-Picking Workflows ////////////////////////// @@ -727,14 +727,14 @@ Now, whenever you do a merge that resolves conflicts, the resolution will be rec If you need to, you can interact with the rerere cache using the `git rerere` command. When it's invoked alone, Git checks its database of resolutions and tries to find a match with any current merge conflicts and resolve them (although this is done automatically if `rerere.enabled` is set to `true`). There are also subcommands to see what will be recorded, to erase specific resolution from the cache, and to clear the entire cache. -We will cover rerere in more detail in <<_rerere>>. +We will cover rerere in more detail in <>. ////////////////////////// 필요하다면 `git rerere` 명령을 사용하여 저장된 캐시를 바탕으로 대화형 인터페이스를 통해 충돌을 다룰 수도 있다. `git rerere` 명령을 직접 실행하면 현재 Merge 과정에서 발생한 충돌을 해결하는데 참고할 만한 이전 Merge 기록을 찾아준다(`rerere.enabled` 옵션이 켜져 있다면 자동). Rerere 기능을 사용할 때 기록할 내용을 세세하게 설정하거나, 기록된 내용 중에 특정 기록을 지운다거나 하는 보조 명령도 제공한다. -자세한 내용은 <<_rerere>> 에서 다루기로 한다. +자세한 내용은 <> 에서 다루기로 한다. -[[_tagging_releases]] +[[r_tagging_releases]] ////////////////////////// ==== Tagging Your Releases ////////////////////////// @@ -743,11 +743,11 @@ Rerere 기능을 사용할 때 기록할 내용을 세세하게 설정하거나, (((tags)))(((tags, signing))) ////////////////////////// When you've decided to cut a release, you'll probably want to drop a tag so you can re-create that release at any point going forward. -You can create a new tag as discussed in <<_git_basics_chapter>>. +You can create a new tag as discussed in <>. If you decide to sign the tag as the maintainer, the tagging may look something like this: ////////////////////////// 적당한 때가 되면 릴리즈해야 한다. 그리고 언제든지 그 시점으로 되돌릴 수 있게 태그를 다는 것이 좋다. -<<_git_basics_chapter>>에서 살펴본 대로 태그를 달면 된다. +<>에서 살펴본 대로 태그를 달면 된다. 서명된 태그를 달면 아래와 같이 출력된다. [source,console] @@ -817,7 +817,7 @@ Also, if you include instructions in the tag message, running `git show ` w 사람들은 이렇게 공개키를 얻어서 서명된 태그를 확인한다. 또한, 관리자가 태그 메시지에 서명을 확인하는 방법을 적어 놓으면 좋다. `git show `으로 어떻게 서명된 태그를 확인하는지 설명한다. -[[_build_number]] +[[r_build_number]] ////////////////////////// ==== Generating a Build Number ////////////////////////// @@ -855,7 +855,7 @@ For instance, the Linux kernel recently jumped from 8 to 10 characters to ensure 그리고 이 값은 checkout이나 show 명령에도 사용할 수 있지만, 전적으로 이름 뒤에 붙은 SHA-1 값을 사용한다. 그래서 이 값으로는 해당 커밋을 못 찾을 수도 있다. 최근 Linux 커널은 충돌 때문에 축약된 SHA-1가 8자에서 10자로 늘어났다. 이제는 8자일 때 생성한 값은 사용할 수 없다. -[[_preparing_release]] +[[r_preparing_release]] ////////////////////////// ==== Preparing a Release ////////////////////////// @@ -895,7 +895,7 @@ You now have a nice tarball and a zip archive of your project release that you c ////////////////////////// 이렇게 압축한 스냅샷 파일은 웹사이트나 이메일로 사람들에게 배포할 수 있다. -[[_the_shortlog]] +[[r_the_shortlog]] ////////////////////////// ==== The Shortlog ////////////////////////// diff --git a/book/06-github/sections/1-setting-up-account.asc b/book/06-github/sections/1-setting-up-account.asc index 7d86d87f..22c83e0a 100644 --- a/book/06-github/sections/1-setting-up-account.asc +++ b/book/06-github/sections/1-setting-up-account.asc @@ -61,11 +61,11 @@ However, to simply clone public projects, you don't even need to sign up - the a ////////////////////////// If you'd like to use SSH remotes, you'll need to configure a public key. -(If you don't already have one, see <<_generate_ssh_key>>.) +(If you don't already have one, see <>.) Open up your account settings using the link at the top-right of the window: ////////////////////////// SSH 리모트를 쓰려면 공개키를 설정해야 한다. -(아직 공개키가 없으면 <<_generate_ssh_key>>를 참고) +(아직 공개키가 없으면 <>를 참고) 아래 Windows의 오른쪽 꼭대기에 있는 계정 설정 링크를 클릭하자. ////////////////////////// @@ -104,7 +104,7 @@ SSH key 이름은 기억하기 쉬운 걸로 짓는다. "내 노트북"이나 "회사 계정"같이 구분하기 쉬운 이름으로 짓는다. 나중에 키를 삭제할 때 헷갈리지 않고 바로 알 수 있도록 짓는 것이 중요하다. ==== -[[_personal_avatar]] +[[r_personal_avatar]] ////////////////////////// ==== Your Avatar ////////////////////////// @@ -158,7 +158,7 @@ If you use multiple email addresses in your commits and you want GitHub to link GitHub는 Git 커밋에 있는 이메일 주소를 보고 어떤 사용자인지 식별한다. 사용자가 이메일 주소를 여러 개 사용해서 커밋했어도 GitHub에 그 이메일을 모두 등록하기만 했으면 GitHub는 잘 처리한다. ``Emails'' 화면에서 모두 등록한다. -[[_add_email_addresses]] +[[r_add_email_addresses]] ////////////////////////// .Add email addresses image::images/email-settings.png[Add all your email addresses.] @@ -167,13 +167,13 @@ image::images/email-settings.png[Add all your email addresses.] image::images/email-settings.png[이메일 주소를 전부 추가하기.] ////////////////////////// -In <<_add_email_addresses>> we can see some of the different states that are possible. +In <> we can see some of the different states that are possible. The top address is verified and set as the primary address, meaning that is where you'll get any notifications and receipts. The second address is verified and so can be set as the primary if you wish to switch them. The final address is unverified, meaning that you can't make it your primary address. If GitHub sees any of these in commit messages in any repository on the site, it will be linked to your user now. ////////////////////////// -<<_add_email_addresses>>의 이메일 주소는 각각 다른 상태다. +<>의 이메일 주소는 각각 다른 상태다. 첫 번째 주소는 이미 확인을 한 주(Primary) 주소이다. 알림이나 영수증 메일은 주 주소로 간다. 두 번째 주소도 확인한 주소로 주 주소로 변경 할 수 있는 상태다. 마지막 주소는 아직 확인이 안되어 주 주소로 변경할 수 없다. diff --git a/book/06-github/sections/2-contributing.asc b/book/06-github/sections/2-contributing.asc index d6bfdcb4..d5ce4298 100644 --- a/book/06-github/sections/2-contributing.asc +++ b/book/06-github/sections/2-contributing.asc @@ -59,7 +59,7 @@ After a few seconds, you'll be taken to your new project page, with your own wri ////////////////////////// 몇 초안에 복사된 프로젝트 페이지로 이동한다. 이 새 프로젝트의 소유자는 Fork 한 사람 자신이기 때문에 쓰기 권한이 있다. -[[_github_flow]] +[[r_github_flow]] ////////////////////////// ==== The GitHub Flow ////////////////////////// @@ -69,11 +69,11 @@ After a few seconds, you'll be taken to your new project page, with your own wri ////////////////////////// GitHub is designed around a particular collaboration workflow, centered on Pull Requests. This flow works whether you're collaborating with a tightly-knit team in a single shared repository, or a globally-distributed company or network of strangers contributing to an project through dozens of forks. -It is centered on the <<_topic_branch>> workflow covered in <<_git_branching>>. +It is centered on the <> workflow covered in <>. ////////////////////////// GitHub은 Pull Request가 중심인 협업 워크플로를 위주로 설계됐다. 이 워크플로는 Fork 해서 프로젝트에 기여하는 것인데 단일 저장소만 사용하는 작은 팀이나 전 세계에서 흩어져서 일하는 회사, 혹은 한 번도 본 적 없는 사람들 사이에서도 유용하다. -<<_git_branching>> 에서 설명했던 <<_topic_branch>> 중심으로 일하는 방식이다. +<> 에서 설명했던 <> 중심으로 일하는 방식이다. ////////////////////////// Here's how it generally works: @@ -95,9 +95,9 @@ Here's how it generally works: 6. 프로젝트 소유자는 Pull Request를 Merge 하고 닫는다. ////////////////////////// -This is basically the Integration Manager workflow covered in <<_integration_manager>>, but instead of using email to communicate and review changes, teams use GitHub's web based tools. +This is basically the Integration Manager workflow covered in <>, but instead of using email to communicate and review changes, teams use GitHub's web based tools. ////////////////////////// -이 방식은 기본적으로 <<_integration_manager>>에서 설명하는 Integration-Manager 워크플로와 같다. 토론이나 리뷰를 이메일이 아니라 GitHub에서 제공하는 웹 기반 도구를 사용하는 것뿐이다. +이 방식은 기본적으로 <>에서 설명하는 Integration-Manager 워크플로와 같다. 토론이나 리뷰를 이메일이 아니라 GitHub에서 제공하는 웹 기반 도구를 사용하는 것뿐이다. ////////////////////////// Let's walk through an example of proposing a change to an open source project hosted on GitHub using this flow. @@ -258,9 +258,9 @@ At this point, the project owner can look at the suggested change and merge it, Pull Request가 오면 프로젝트 소유자는 변경 점이 무엇인지 확인한 후, Merge 혹은 거절하거나 코멘트를 달 수 있다. 소유자가 아이디어 자체를 마음에 들어 한다면 빛을 보기까지 좀 더 공을 들여야 한다. ////////////////////////// -Where this conversation may take place over email in the workflows presented in <<_distributed_git>>, on GitHub this happens online. The project owner can review the unified diff and leave a comment by clicking on any of the lines. +Where this conversation may take place over email in the workflows presented in <>, on GitHub this happens online. The project owner can review the unified diff and leave a comment by clicking on any of the lines. ////////////////////////// -이런 소통을 이메일로 하는 워크플로는 <<_distributed_git>>에 설명했었다. GitHub에서는 온라인에서 한다. 프로젝트 소유자는 'unified diff' 형식의 변경사항을 검토하고 즉각 해당 라인에 코멘트를 달 수 있다. +이런 소통을 이메일로 하는 워크플로는 <>에 설명했었다. GitHub에서는 온라인에서 한다. 프로젝트 소유자는 'unified diff' 형식의 변경사항을 검토하고 즉각 해당 라인에 코멘트를 달 수 있다. ////////////////////////// .Comment on a specific line of code in a Pull Request @@ -274,7 +274,7 @@ Once the maintainer makes this comment, the person who opened the Pull Request ( ////////////////////////// 관리자가 코멘트를 달면 Pull Request를 만든 사람에게 알림이 간다. 실제로는 저장소를 'Watch'하는 사람 모두에게 알림이 간다. 알림 정책은 설정할 수 있지만, 다음에 검토한다. 알림을 받는 Tony가 이메일 알림을 켜놨다면 이메일 알림도 받는다. -[[_email_notification]] +[[r_email_notification]] ////////////////////////// .Comments sent as email notifications image::images/blink-04-email.png[Email notification] @@ -283,11 +283,11 @@ image::images/blink-04-email.png[Email notification] image::images/blink-04-email.png[이메일 알림으로 온 코멘트] ////////////////////////// -Anyone can also leave general comments on the Pull Request. In <<_pr_discussion>> we can see an example of the project owner both commenting on a line of code and then leaving a general comment in the discussion section. You can see that the code comments are brought into the conversation as well. +Anyone can also leave general comments on the Pull Request. In <> we can see an example of the project owner both commenting on a line of code and then leaving a general comment in the discussion section. You can see that the code comments are brought into the conversation as well. ////////////////////////// -누구나 Pull Request에 코멘트를 달 수 있다. <<_pr_discussion>>를 보면 프로젝트 소유자가 코드에 코멘트를 달거나 Pull Request 자체에 코멘트를 달면서 토론하는 것을 보여 준다. 코드 코멘트도 맥락을 이루어 커뮤니케이션 할 수 있다. +누구나 Pull Request에 코멘트를 달 수 있다. <>를 보면 프로젝트 소유자가 코드에 코멘트를 달거나 Pull Request 자체에 코멘트를 달면서 토론하는 것을 보여 준다. 코드 코멘트도 맥락을 이루어 커뮤니케이션 할 수 있다. -[[_pr_discussion]] +[[r_pr_discussion]] ////////////////////////// .Pull Request discusson page image::images/blink-05-general-comment.png[PR discussion page] @@ -299,19 +299,19 @@ image::images/blink-05-general-comment.png[PR 토론 페이지] Now the contributor can see what they need to do in order to get their change accepted. Luckily this is very straightforward. Where over email you may have to re-roll your series and resubmit it to the mailing list, with GitHub you simply commit to the topic branch again and push, which will automatically update the Pull Request. -In <<_pr_final>> you can also see that the old code comment has been collapsed in the updated Pull Request, since it was made on a line that has since been changed. +In <> you can also see that the old code comment has been collapsed in the updated Pull Request, since it was made on a line that has since been changed. ////////////////////////// 이 토론을 보고 기여자는 자신이 무엇을 해야 자신의 코드가 받아들여질지 알 수 있다. 다행히 매우 직관적이다. 만약 이 일을 이메일로 하고자 한다면 관련 커밋을 다시 말아서 메일링 리스트에 다시 보내야 한다. 하지만, GitHub에서는 해당 토픽 브랜치에 이어서 커밋하고 Push 하면 된다. -<<_pr_final>>에서 Push로 업데이트한 PR의 코드를 보면 예전 코드에 달렸던 코멘트는 나오지 않는다. 추가된 커밋으로 인해 코드가 수정되었기 때문이다. +<>에서 Push로 업데이트한 PR의 코드를 보면 예전 코드에 달렸던 코멘트는 나오지 않는다. 추가된 커밋으로 인해 코드가 수정되었기 때문이다. ////////////////////////// Adding commits to an existing Pull Request doesn't trigger a notification, so once Tony has pushed his corrections he decides to leave a comment to inform the project owner that he made the requested change. ////////////////////////// 기존 PR에 이어서 Push를 하면 알림이 가지 않는다. 그래서 Tony는 자신이 작업한 내용을 코멘트로 남겼다. 그러면 프로젝트 소유자는 무슨 일이 있었는지 쉽게 알 수 있다. -[[_pr_final]] +[[r_pr_final]] ////////////////////////// .Pull Request final image::images/blink-06-final.png[PR final] @@ -320,9 +320,9 @@ image::images/blink-06-final.png[PR final] image::images/blink-06-final.png[최종 PR] ////////////////////////// -An interesting thing to notice is that if you click on the ``Files Changed'' tab on this Pull Request, you'll get the ``unified'' diff -- that is, the total aggregate difference that would be introduced to your main branch if this topic branch was merged in. In `git diff` terms, it basically automatically shows you `git diff master...` for the branch this Pull Request is based on. See <<_what_is_introduced>> for more about this type of diff. +An interesting thing to notice is that if you click on the ``Files Changed'' tab on this Pull Request, you'll get the ``unified'' diff -- that is, the total aggregate difference that would be introduced to your main branch if this topic branch was merged in. In `git diff` terms, it basically automatically shows you `git diff master...` for the branch this Pull Request is based on. See <> for more about this type of diff. ////////////////////////// -꼭 짚고 넘어가야 할 것이 있다. 이 Pull Request의 ``Files Changed'' 탭을 클릭하면 ``unified'' diff를 볼 수 있다. 이 Pull Request가 주 브랜치에 Merge 되면 어떻게 달라지는지 보여준다. `git diff` 명령을 빌어 표현하자면 `git diff master...`와 같은 명령이 실행되는 거고 ``는 Pull Request의 브랜치를 의미한다. <<_what_is_introduced>>에서 자세히 설명한다. +꼭 짚고 넘어가야 할 것이 있다. 이 Pull Request의 ``Files Changed'' 탭을 클릭하면 ``unified'' diff를 볼 수 있다. 이 Pull Request가 주 브랜치에 Merge 되면 어떻게 달라지는지 보여준다. `git diff` 명령을 빌어 표현하자면 `git diff master...`와 같은 명령이 실행되는 거고 ``는 Pull Request의 브랜치를 의미한다. <>에서 자세히 설명한다. ////////////////////////// The other thing you'll notice is that GitHub checks to see if the Pull Request merges cleanly and provides a button to do the merge for you on the server. This button only shows up if you have write access to the repository and a trivial merge is possible. If you click it GitHub will perform a ``non-fast-forward'' merge, meaning that even if the merge *could* be a fast-forward, it will still create a merge commit. @@ -378,9 +378,9 @@ This is an important distinction, because generally the change is suggested befo 이 차이는 매우 중요하다. 일반적으로 처음부터 완벽한 코드를 보낼 수 없어서 메일링 리스트로 Patch를 보낼 일은 별로 없다. Pull Request는 초기부터 프로젝트 관리자와 소통할 수 있도록 해주기 때문에 혼자 답을 찾는 게 아니라 커뮤니티에서 함께 찾을 수 있다. 누군가 Pull Request를 열면 관리자와 커뮤니티는 어떻게 수정하는 게 좋을지 의견을 낸다. Patch를 처음부터 다시 전체를 작성하지 않아도 된다. 수정한 만큼만 해당 브랜치에 커밋하고 하던 일과 대화를 계속 해 나가면 된다. ////////////////////////// -For instance, if you go back and look again at <<_pr_final>>, you'll notice that the contributor did not rebase his commit and send another Pull Request. Instead they added new commits and pushed them to the existing branch. This way if you go back and look at this Pull Request in the future, you can easily find all of the context of why decisions were made. Pushing the ``Merge'' button on the site purposefully creates a merge commit that references the Pull Request so that it's easy to go back and research the original conversation if necessary. +For instance, if you go back and look again at <>, you'll notice that the contributor did not rebase his commit and send another Pull Request. Instead they added new commits and pushed them to the existing branch. This way if you go back and look at this Pull Request in the future, you can easily find all of the context of why decisions were made. Pushing the ``Merge'' button on the site purposefully creates a merge commit that references the Pull Request so that it's easy to go back and research the original conversation if necessary. ////////////////////////// -<<_pr_final>>로 돌아가서 다시 보면 기여자가 커밋을 Rebase 하거나 Pull Request를 다시 열지 않았다는 것을 확인할 수 있다. 그냥 기존 브랜치에 좀 더 커밋하고 Push 했을 뿐이다. 나중에 시간이 지나서 이 Pull Request를 다시 읽으면 왜 이런 방향으로 결정했는지에 대한 맥락을 쉽게 알 수 있다. 웹사이트에서 ``Merge'' 버튼을 누르면 Merge 커밋을 일부러 남기겠다는 뜻이 된다. 이 Merge 커밋에는 Pull Request 정보가 들어가기 때문에 필요하면 언제든지 맥락을 확인할 수 있다. +<>로 돌아가서 다시 보면 기여자가 커밋을 Rebase 하거나 Pull Request를 다시 열지 않았다는 것을 확인할 수 있다. 그냥 기존 브랜치에 좀 더 커밋하고 Push 했을 뿐이다. 나중에 시간이 지나서 이 Pull Request를 다시 읽으면 왜 이런 방향으로 결정했는지에 대한 맥락을 쉽게 알 수 있다. 웹사이트에서 ``Merge'' 버튼을 누르면 Merge 커밋을 일부러 남기겠다는 뜻이 된다. 이 Merge 커밋에는 Pull Request 정보가 들어가기 때문에 필요하면 언제든지 맥락을 확인할 수 있다. ////////////////////////// ===== Keeping up with Upstream @@ -392,7 +392,7 @@ If your Pull Request becomes out of date or otherwise doesn't merge cleanly, you ////////////////////////// Pull Request가 만든 지 오래됐거나 깨끗하게 Merge 되지 않으면 메인테이너가 쉽게 Merge 할 수 있게 수정한다. GitHub은 자동으로 Merge 할 수 있는 Pull Request인지 아닌지 Pull Request 페이지 하단에서 알려준다. -[[_pr_fail]] +[[r_pr_fail]] ////////////////////////// .Pull Request does not merge cleanly image::images/pr-01-fail.png[PR merge failure] @@ -401,9 +401,9 @@ image::images/pr-01-fail.png[PR merge failure] image::images/pr-01-fail.png[PR Merge 실패] ////////////////////////// -If you see something like <<_pr_fail>>, you'll want to fix your branch so that it turns green and the maintainer doesn't have to do extra work. +If you see something like <>, you'll want to fix your branch so that it turns green and the maintainer doesn't have to do extra work. ////////////////////////// -<<_pr_fail>> 같은 메시지를 보면 해당 브랜치를 고쳐서 녹색으로 만든다. 메인테이너가 고치지 않아도 되도록 한다. +<> 같은 메시지를 보면 해당 브랜치를 고쳐서 녹색으로 만든다. 메인테이너가 고치지 않아도 되도록 한다. ////////////////////////// You have two main options in order to do this. You can either rebase your branch on top of whatever the target branch is (normally the `master` branch of the repository you forked), or you can merge the target branch into your branch. @@ -476,7 +476,7 @@ Once you do that, the Pull Request will be automatically updated and re-checked ////////////////////////// 이렇게 하면 Pull Request는 자동으로 업데이트되고 깨끗하게 Merge 할 수 있는지 재확인된다. -[[_pr_fail]] +[[r_pr_merge_fix]] ////////////////////////// .Pull Request now merges cleanly image::images/pr-02-merge-fix.png[PR fixed] @@ -490,9 +490,9 @@ One of the great things about Git is that you can do that continuously. If you h 연속성은 Git의 장기 중 하나다. 오랫동안 무엇인가 만들고 있다면 최신으로 유지하기 위해 대상 브랜치를 쉽게 Merge 해 올 수 있다. 다 마칠 때까지 하고 또 하고 할 수 있다. Merge 할 때 발생하는 충돌만 해결하면 되고 지속적으로 개발 프로세스를 관리할 수 있다. ////////////////////////// -If you absolutely wish to rebase the branch to clean it up, you can certainly do so, but it is highly encouraged to not force push over the branch that the Pull Request is already opened on. If other people have pulled it down and done more work on it, you run into all of the issues outlined in <<_rebase_peril>>. Instead, push the rebased branch to a new branch on GitHub and open a brand new Pull Request referencing the old one, then close the original. +If you absolutely wish to rebase the branch to clean it up, you can certainly do so, but it is highly encouraged to not force push over the branch that the Pull Request is already opened on. If other people have pulled it down and done more work on it, you run into all of the issues outlined in <>. Instead, push the rebased branch to a new branch on GitHub and open a brand new Pull Request referencing the old one, then close the original. ////////////////////////// -브랜치를 꼭 깨끗하게 유지하고 싶어서 Rebase 해야 한다고 생각한다면 이미 열어 놓은 Pull Request에 대고 Push 하지 말아야 한다. 그럼 이 브랜치를 가져다 Merge 해 놓은 사람들은 <<_rebase_peril>>에 설명했듯이 충격에 빠질 것이다. 대신 브랜치를 새로 만들어 Push 한다. 그리고 Pull Request도 새로 여는데 원 Pull Request가 뭔지 알 수 있도록 참조를 달고 원래 것은 닫는다. +브랜치를 꼭 깨끗하게 유지하고 싶어서 Rebase 해야 한다고 생각한다면 이미 열어 놓은 Pull Request에 대고 Push 하지 말아야 한다. 그럼 이 브랜치를 가져다 Merge 해 놓은 사람들은 <>에 설명했듯이 충격에 빠질 것이다. 대신 브랜치를 새로 만들어 Push 한다. 그리고 Pull Request도 새로 여는데 원 Pull Request가 뭔지 알 수 있도록 참조를 달고 원래 것은 닫는다. ////////////////////////// ===== References @@ -510,11 +510,11 @@ Let's start with how to cross-reference another Pull Request or an Issue. All Pu 먼저 Issue와 Pull Request를 서로 참조시키는 방법부터 살펴보자. 모든 Pull Request와 Issue에는 프로젝트 내에서 유일한 번호를 하나 할당한다. 예를 들어, #3인 Pull Request와 #3인 Issue는 동시에 있을 수 없다. `#`과 같은 형태로 코멘트가나 설명에 Pull Request와 Issue를 참조시킬 수 있다. 이 방법은 단일 프로젝트 범위에서만 유효하다. Fork 저장소의 Issue나 Pull Request를 참조시키려고 한다면 `username#`라고 쓰고 아예 다른 저장소면 `username/repo#`라고 써야 한다. ////////////////////////// -Let's look at an example. Say we rebased the branch in the previous example, created a new pull request for it, and now we want to reference the old pull request from the new one. We also want to reference an issue in the fork of the repository and an issue in a completely different project. We can fill out the description just like <<_pr_references>>. +Let's look at an example. Say we rebased the branch in the previous example, created a new pull request for it, and now we want to reference the old pull request from the new one. We also want to reference an issue in the fork of the repository and an issue in a completely different project. We can fill out the description just like <>. ////////////////////////// -설명을 위해 이미 브랜치를 Rebase 했고 Pull Request를 새로 만들었다고 하자. 그럼 예전 Pull Request가 뭔지 알 수 있도록 새것에서 예전 것을 참조하게 해보고 <<_pr_references>>같이 Fork 한 저장소의 이슈나 아예 다른 저장소의 이슈도 참조하게 해보자. +설명을 위해 이미 브랜치를 Rebase 했고 Pull Request를 새로 만들었다고 하자. 그럼 예전 Pull Request가 뭔지 알 수 있도록 새것에서 예전 것을 참조하게 해보고 <>같이 Fork 한 저장소의 이슈나 아예 다른 저장소의 이슈도 참조하게 해보자. -[[_pr_references]] +[[r_pr_references]] ////////////////////////// .Cross references in a Pull Request. image::images/mentions-01-syntax.png[PR references] @@ -523,11 +523,11 @@ image::images/mentions-01-syntax.png[PR references] image::images/mentions-01-syntax.png[PR 참조 편집] ////////////////////////// -When we submit this pull request, we'll see all of that rendered like <<_pr_references_render>>. +When we submit this pull request, we'll see all of that rendered like <>. ////////////////////////// -이 Pull Request를 보내면 <<_pr_references_render>>처럼 보인다. +이 Pull Request를 보내면 <>처럼 보인다. -[[_pr_references_render]] +[[r_pr_references_render]] ////////////////////////// .Cross references rendered in a Pull Request. image::images/mentions-02-render.png[PR references rendered] @@ -541,11 +541,11 @@ Notice that the full GitHub URL we put in there was shortened to just the inform GitHub URL을 전부 입력해도 딱 필요한 만큼으로 줄어든다. ////////////////////////// -Now if Tony goes back and closes out the original Pull Request, we can see that by mentioning it in the new one, GitHub has automatically created a trackback event in the Pull Request timeline. This means that anyone who visits this Pull Request and sees that it is closed can easily link back to the one that superceded it. The link will look something like <<_pr_closed>>. +Now if Tony goes back and closes out the original Pull Request, we can see that by mentioning it in the new one, GitHub has automatically created a trackback event in the Pull Request timeline. This means that anyone who visits this Pull Request and sees that it is closed can easily link back to the one that superceded it. The link will look something like <>. ////////////////////////// -그리고 원래 있던 Pull Request를 닫으면 새 Pull Request에는 기존 Pull Request가 닫혔다고 언급된다. GitHub은 Pull Request 타임라인에 트랙백 이벤트를 자동으로 만든다. 그래서 이 Pull Request에 방문하는 사람은 예전 Pull Request가 닫혔는지 알 수 있고 그 링크가 있어서 바로 클릭해서 예전 것을 볼 수 있다. 이 링크는 <<_pr_closed>>처럼 생겼다. +그리고 원래 있던 Pull Request를 닫으면 새 Pull Request에는 기존 Pull Request가 닫혔다고 언급된다. GitHub은 Pull Request 타임라인에 트랙백 이벤트를 자동으로 만든다. 그래서 이 Pull Request에 방문하는 사람은 예전 Pull Request가 닫혔는지 알 수 있고 그 링크가 있어서 바로 클릭해서 예전 것을 볼 수 있다. 이 링크는 <>처럼 생겼다. -[[_pr_closed]] +[[r_pr_closed]] ////////////////////////// .Cross references rendered in a Pull Request. image::images/mentions-03-closed.png[PR closed] @@ -566,11 +566,11 @@ Linking to other Issues is just the beginning of interesting things you can do w 다른 이슈를 링크하는 것은 GitHub 글쓰기의 첫걸음에 불과하다. ``GitHub Flavored Markdown''이라는 형식으로 이슈나 Pull Request의 설명, 코멘트, 코드 주석 등에서 글을 쓸 수 있다. Markdown 형식으로 글을 쓰면 그냥 텍스트로 쓴 글이지만 형식을 갖춰 미끈하고 아름답게 렌더링된다. ////////////////////////// -See <<_example_markdown>> for an example of how comments or text can be written and then rendered using Markdown. +See <> for an example of how comments or text can be written and then rendered using Markdown. ////////////////////////// -<<_example_markdown>>는 Markdown으로 쓴 글이 어떻게 렌더링되는지 보여준다. +<>는 Markdown으로 쓴 글이 어떻게 렌더링되는지 보여준다. -[[_example_markdown]] +[[r_example_markdown]] ////////////////////////// .An example of Markdown as written and as rendered. image::images/markdown-01-example.png[Example Markdown] @@ -608,11 +608,11 @@ You can create a task list like this: ---- ////////////////////////// -If we include this in the description of our Pull Request or Issue, we'll see it rendered like <<_task_lists>> +If we include this in the description of our Pull Request or Issue, we'll see it rendered like <> ////////////////////////// -이 타스크 리스트를 이슈나 Pull Request에 사용하면 <<_task_lists>>처럼 렌더링된다. +이 타스크 리스트를 이슈나 Pull Request에 사용하면 <>처럼 렌더링된다. -[[_task_lists]] +[[r_task_lists]] ////////////////////////// .Task lists rendered in a Markdown comment. image::images/markdown-02-tasks.png[Example Task List] @@ -626,11 +626,11 @@ This is often used in Pull Requests to indicate what all you would like to get d Pull Request를 Merge 하기 전에 꼭 처리해야 하는 일의 목록을 표현할 때 타스크 리스트를 사용한다. Markdown을 직접 고치지 않고 체크박스만 클릭해도 해당 타스크가 완료됐다고 업데이트되기 때문에 상당히 좋은 기능이다. ////////////////////////// -What's more, GitHub will look for task lists in your Issues and Pull Requests and show them as metadata on the pages that list them out. For example, if you have a Pull Request with tasks and you look at the overview page of all Pull Requests, you can see how far done it is. This helps people break down Pull Requests into subtasks and helps other people track the progress of the branch. You can see an example of this in <<_task_list_progress>>. +What's more, GitHub will look for task lists in your Issues and Pull Requests and show them as metadata on the pages that list them out. For example, if you have a Pull Request with tasks and you look at the overview page of all Pull Requests, you can see how far done it is. This helps people break down Pull Requests into subtasks and helps other people track the progress of the branch. You can see an example of this in <>. ////////////////////////// -GitHub은 이슈나 Pull Requests에 있는 타스크 리스트를 집계해서 목록 화면에서 보여준다. 예를 들어, 타스크들이 정리된 Pull Request가 있으면 Pull Request 요약 페이지에서 얼마나 진행됐는지 볼 수 있다. 그래서 Pull Request를 타스크 여러 개로 쪼개 두면 그 브랜치가 얼마나 진행됐는지 알기 쉽다. <<_task_list_progress>>를 보자. +GitHub은 이슈나 Pull Requests에 있는 타스크 리스트를 집계해서 목록 화면에서 보여준다. 예를 들어, 타스크들이 정리된 Pull Request가 있으면 Pull Request 요약 페이지에서 얼마나 진행됐는지 볼 수 있다. 그래서 Pull Request를 타스크 여러 개로 쪼개 두면 그 브랜치가 얼마나 진행됐는지 알기 쉽다. <>를 보자. -[[_task_list_progress]] +[[r_task_list_progress]] ////////////////////////// .Task list summary in the Pull Request list. image::images/markdown-03-task-summary.png[Example Task List] @@ -669,11 +669,11 @@ for(int i=0 ; i < 5 ; i++) ---- ////////////////////////// -If you add a language name like we did there with 'java', GitHub will also try to syntax highlight the snippet. In the case of the above example, it would end up rendering like <<_md_code>>. +If you add a language name like we did there with 'java', GitHub will also try to syntax highlight the snippet. In the case of the above example, it would end up rendering like <>. ////////////////////////// -코드 조각에 언어 이름을 쓰면 GitHub은 구문강조(Syntax Highlight)도 해준다. <<_md_code>>는 언어 이름을 넣어서 구문 강조된 결과다. +코드 조각에 언어 이름을 쓰면 GitHub은 구문강조(Syntax Highlight)도 해준다. <>는 언어 이름을 넣어서 구문 강조된 결과다. -[[_md_code]] +[[r_md_code]] ////////////////////////// .Rendered fenced code example. image::images/markdown-04-fenced-code.png[Rendered fenced code] @@ -705,11 +705,11 @@ How big are these slings and in particular, these arrows? ---- ////////////////////////// -Once rendered, the comment will look like <<_md_quote>>. +Once rendered, the comment will look like <>. ////////////////////////// -이 텍스트는 <<_md_quote>>처럼 렌더링된다. +이 텍스트는 <>처럼 렌더링된다. -[[_md_quote]] +[[r_md_quote]] ////////////////////////// .Rendered quoting example. image::images/markdown-05-quote.png[Rendered quoting] @@ -724,7 +724,7 @@ Finally, you can also use emoji in your comments. This is actually used quite ex ////////////////////////// 마지막으로 소개하는 것은 글에 Emoji를 넣을 수 있다는 것이다. Emoji는 GitHub 이슈나 Pull Request에서 정말 많이 사용된다. GitHub은 Emoji를 쉽게 사용할 수 있도록 돕는다. 코멘트를 쓸 때 `:` 문자로 Emoji 입력을 시작하면 선택해서 자동완성할 수 있도록 Emoji 목록을 보여준다. -[[_md_emoji_auto]] +[[r_md_emoji_auto]] ////////////////////////// .Emoji autocompleter in action. image::images/markdown-06-emoji-complete.png[Emoji autocompleter] @@ -749,11 +749,11 @@ I :eyes: that :bug: and I :cold_sweat:. ---- ////////////////////////// -When rendered, it would look something like <<_md_emoji>>. +When rendered, it would look something like <>. ////////////////////////// -렌더링되면 <<_md_emoji>>처럼 보인다. +렌더링되면 <>처럼 보인다. -[[_md_emoji]] +[[r_md_emoji]] ////////////////////////// .Heavy emoji commenting. image::images/markdown-07-emoji.png[Emoji] @@ -790,7 +790,7 @@ This isn't technically GitHub Flavored Markdown, but it is incredibly useful. In ////////////////////////// GitHub이 제공하는 글에 이미지를 포함시키는 기능은 기술적으로 GFM이 아니지만 엄청 유용하다. Markdown 형식으로 이미지를 첨부하고 싶을 때 일반적인 방법으로는 이미지를 올리고 그 URL을 찾아서 일일이 입력해야 하는데 번거롭다. GitHub에서는 그냥 이미지를 바로 Drag-and-Drop으로 붙여 넣을 수 있다. -[[_md_drag]] +[[r_md_drag]] ////////////////////////// .Drag and drop images to upload them and auto-embed them. image::images/markdown-08-drag-drop.png[Drag and drop images] @@ -799,6 +799,6 @@ image::images/markdown-08-drag-drop.png[Drag and drop images] image::images/markdown-08-drag-drop.png[Drag and drop images] ////////////////////////// -If you look back at <<_pr_references>>, you can see a small ``Parsed as Markdown'' hint above the text area. Clicking on that will give you a full cheat sheet of everything you can do with Markdown on GitHub. +If you look back at <>, you can see a small ``Parsed as Markdown'' hint above the text area. Clicking on that will give you a full cheat sheet of everything you can do with Markdown on GitHub. ////////////////////////// -<<_pr_references>>로 돌아가서 보면 Text Area 위에 ``Parsed As Markdown''이라는 표시를 볼 수 있다. 그 링크를 클릭하면 GitHub에서 Markdown을 어떻게 사용하는지 알려주는 치트시트를 보여준다. +<>로 돌아가서 보면 Text Area 위에 ``Parsed As Markdown''이라는 표시를 볼 수 있다. 그 링크를 클릭하면 GitHub에서 Markdown을 어떻게 사용하는지 알려주는 치트시트를 보여준다. diff --git a/book/06-github/sections/3-maintaining.asc b/book/06-github/sections/3-maintaining.asc index 4a6d9641..a8971b9e 100644 --- a/book/06-github/sections/3-maintaining.asc +++ b/book/06-github/sections/3-maintaining.asc @@ -1,4 +1,4 @@ -[[_maintaining_gh_project]] +[[r_maintaining_gh_project]] ////////////////////////// === Maintaining a Project ////////////////////////// @@ -16,7 +16,7 @@ Now that we're comfortable contributing to a project, let's look at the other si ////////////////////////// Let's create a new repository to share our project code with. -Start by clicking the ``New repository'' button on the right-hand side of the dashboard, or from the `+` button in the top toolbar next to your username as seen in <<_new_repo_dropdown>>. +Start by clicking the ``New repository'' button on the right-hand side of the dashboard, or from the `+` button in the top toolbar next to your username as seen in <>. ////////////////////////// 저장소를 새로 만들고 프로젝트 코드를 공유해 보자. 대시보드 오른쪽에 있는 ``New repository'' 버튼을 클릭하면 저장소를 만드는 폼으로 이동한다. 맨 위 툴바의 사용자이름 옆에 있는 `+` 버튼을 클릭해도 된다. @@ -28,7 +28,7 @@ image::images/newrepo.png[The ``Your repositories'' area.] .``Your repositories'' 박스. image::images/newrepo.png[``Your repositories'' 박스.] -[[_new_repo_dropdown]] +[[r_new_repo_dropdown]] ////////////////////////// .The ``New repository'' dropdown. image::images/new-repo.png[The ``new repository'' dropdown.] @@ -57,10 +57,10 @@ For now, just click the ``Create Repository'' button, and boom – you have a ne ////////////////////////// Since you have no code there yet, GitHub will show you instructions for how to create a brand-new Git repository, or connect an existing Git project. -We won't belabor this here; if you need a refresher, check out <<_git_basics_chapter>>. +We won't belabor this here; if you need a refresher, check out <>. ////////////////////////// 아직 저장소에 코드가 하나도 없어서, GitHub는 Git 저장소를 만드는 방법이나 기존 Git 프로젝트를 넣는 방법을 보여준다. -이 내용을 다시 살펴보고 싶다면 <<_git_basics_chapter>>를 보라. 여기서 또 설명하지 않는다. +이 내용을 다시 살펴보고 싶다면 <>를 보라. 여기서 또 설명하지 않는다. ////////////////////////// Now that your project is hosted on GitHub, you can give the URL to anyone you want to share your project with. @@ -151,7 +151,7 @@ For these examples, let's assume you are ``tonychacon'' and you've created a new ////////////////////////// ``tonychacon''이라는 사람이 ``fade''라는 Arduino 프로젝트를 만든 상황을 살펴보자. -[[_email_notifications]] +[[r_email_notifications]] ////////////////////////// ===== Email Notifications ////////////////////////// @@ -159,12 +159,12 @@ For these examples, let's assume you are ``tonychacon'' and you've created a new ////////////////////////// Someone comes along and makes a change to your code and sends you a Pull Request. -You should get an email notifying you about the new Pull Request and it should look something like <<_email_pr>>. +You should get an email notifying you about the new Pull Request and it should look something like <>. ////////////////////////// 어떤 사람이 코드를 수정해서 Pull Request를 보내왔다. -그러면 새로운 Pull Request가 왔다는 메일이 담당자에게 간다. <<_email_pr>> 같은 메일이 보내진다. +그러면 새로운 Pull Request가 왔다는 메일이 담당자에게 간다. <> 같은 메일이 보내진다. -[[_email_pr]] +[[r_email_pr]] ////////////////////////// .Email notification of a new Pull Request. image::images/maint-01-email.png[Pull Request email notification] @@ -185,11 +185,11 @@ CLI로 Merge 하는 방법과 URL도 간략히 보여준다. ////////////////////////// If you notice the line that says `git pull patch-1`, this is a simple way to merge in a remote branch without having to add a remote. -We went over this quickly in <<_checking_out_remotes>>. +We went over this quickly in <>. If you wish, you can create and switch to a topic branch and then run this command to merge in the Pull Request changes. ////////////////////////// `git pull patch-1`라는 명령이 궁금할 텐데 이렇게 하면 리모트 브랜치를 간단히 Merge 할 수 있다. 저장소를 리모트로 추가하지 않아도 된다. -필요하면 토픽 브랜치를 만들고 <<_checking_out_remotes>>에서 배운 명령어로 +필요하면 토픽 브랜치를 만들고 <>에서 배운 명령어로 Pull Request로 직접 Merge 해도 된다. ////////////////////////// @@ -210,10 +210,10 @@ $ curl http://github.com/tonychacon/fade/pull/1.patch | git am ===== Pull Request로 함께 일하기 ////////////////////////// -As we covered in <<_github_flow>>, you can now have a conversation with the person who opened the Pull Request. +As we covered in <>, you can now have a conversation with the person who opened the Pull Request. You can comment on specific lines of code, comment on whole commits or comment on the entire Pull Request itself, using GitHub Flavored Markdown everywhere. ////////////////////////// -<<_github_flow>>에서 설명했듯이 Pull Request를 만든 사람과 토론할 수 있다. +<>에서 설명했듯이 Pull Request를 만든 사람과 토론할 수 있다. GFM을 사용하여 특정 커밋을 선택하거나, 특정 라인을 지정하거나, 혹은 전체 Pull Request 자체에도 코멘트를 남길 수 있다. ////////////////////////// @@ -239,13 +239,13 @@ Once the code is in a place you like and want to merge it in, you can either pul If the merge is trivial, you can also just hit the ``Merge'' buton on the GitHub site. This will do a ``non-fast-forward'' merge, creating a merge commit even if a fast-forward merge was possible. This means that no matter what, every time you hit the merge button, a merge commit is created. -As you can see in <<_merge_button>>, GitHub gives you all of this information if you click the hint link. +As you can see in <>, GitHub gives you all of this information if you click the hint link. ////////////////////////// GitHub 사이트에서 ``Merge'' 버튼을 누르는 것으로 간편하게 Merge 할 수 있다(Trivial Merge). ``fast-forward''가 가능할 때도 ``non-fast-forward'' Merge를 하기 때문에 Merge 커밋이 생긴다. 그래서 ``Merge'' 버튼을 클릭해서 Merge 하면 항상 Merge 커밋이 생긴다. -여기서 어떻게 해야 하는지 'command line' 힌트 링크를 클릭하면 <<_merge_button>>과 같이 알려준다. +여기서 어떻게 해야 하는지 'command line' 힌트 링크를 클릭하면 <>과 같이 알려준다. -[[_merge_button]] +[[r_merge_button]] ////////////////////////// .Merge button and instructions for merging a Pull Request manually. image::images/maint-02-merge.png[Merge button] @@ -258,7 +258,7 @@ If you decide you don't want to merge it, you can also just close the Pull Reque ////////////////////////// 만약 Pull Request를 Merge 하지 않기로 했다면 그냥 닫으면 된다. 그러면 그 Pull Request를 보낸 사람에게 알림이 간다. -[[_pr_refs]] +[[r_pr_refs]] ////////////////////////// ===== Pull Request Refs ////////////////////////// @@ -266,10 +266,10 @@ If you decide you don't want to merge it, you can also just close the Pull Reque ////////////////////////// If you're dealing with a *lot* of Pull Requests and don't want to add a bunch of remotes or do one time pulls every time, there is a neat trick that GitHub allows you to do. -This is a bit of an advanced trick and we'll go over the details of this a bit more in <<_refspec>>, but it can be pretty useful. +This is a bit of an advanced trick and we'll go over the details of this a bit more in <>, but it can be pretty useful. ////////////////////////// 일일이 리모트를 등록하고 Pull 하는 것은 Pull Request를 많이 처리하는 사람에게는 고통스럽다. -GitHub는 이럴 때 사용하는 방법을 제공한다. 이 내용은 <<_refspec>>에서 자세히 설명할 거고 조금 어려울 수 있다. +GitHub는 이럴 때 사용하는 방법을 제공한다. 이 내용은 <>에서 자세히 설명할 거고 조금 어려울 수 있다. ////////////////////////// GitHub actually advertises the Pull Request branches for a repository as sort of pseudo-branches on the server. @@ -279,11 +279,11 @@ GitHub는 Pull Request의 브랜치를 서버에 있는 가상 브랜치로 노 GitHub가 자동으로 해주기 때문에 바로 이용하면 된다. ////////////////////////// -To demonstrate this, we're going to use a low-level command (often referred to as a ``plumbing'' command, which we'll read about more in <<_plumbing_porcelain>>) called `ls-remote`. +To demonstrate this, we're going to use a low-level command (often referred to as a ``plumbing'' command, which we'll read about more in <>) called `ls-remote`. This command is generally not used in day-to-day Git operations but it's useful to show us what references are present on the server. ////////////////////////// 이걸 해보려면 저수준(``plumbing'') 명령어인 `ls-remote`가 필요하다. -이 명령어는 아무래도 매일 쓰는 명령어는 아니지만, 서버에 어떤 Ref가 있는지 보여 준다. ``plumbing'' 명령어는 <<_plumbing_porcelain>>에서 자세히 설명한다. +이 명령어는 아무래도 매일 쓰는 명령어는 아니지만, 서버에 어떤 Ref가 있는지 보여 준다. ``plumbing'' 명령어는 <>에서 자세히 설명한다. ////////////////////////// If we run this command against the ``blink'' repository we were using earlier, we will get a list of all the branches and tags and other references in the repository. @@ -441,7 +441,7 @@ If you hit the ``Edit'' button at the right of that box you can change not only Pull Request를 만들러 가면 페이지 위쪽에 어떤 저장소의 브랜치를 어떤 저장소의 브랜치로 요청하는 것인지를 보여주는 박스가 있다. ``Edit'' 버튼을 누르면 Fork 한 저장소 중 하나로 저장소를 변경하고 해당 저장소의 브랜치로 변경할 수 있다. -[[_pr_targets]] +[[r_pr_targets]] ////////////////////////// .Manually change the Pull Request target fork and branch. image::images/maint-04-target.png[PR targets] @@ -537,12 +537,12 @@ The two choices are to get notifications over ``Email'' and over ``Web'' and you ////////////////////////// Web notifications only exist on GitHub and you can only check them on GitHub. -If you have this option selected in your preferences and a notification is triggered for you, you will see a small blue dot over your notifications icon at the top of your screen as seen in <<_not_center>>. +If you have this option selected in your preferences and a notification is triggered for you, you will see a small blue dot over your notifications icon at the top of your screen as seen in <>. ////////////////////////// 웹 알림은 GitHub에서 제공하는 것으로 GitHub 사이트에서만 확인할 수 있다. -이 옵션을 선택하면 알림이 오면 알림 아이콘에 파란 점을 볼 수 있다. <<_not_center>>을 확인해보자. +이 옵션을 선택하면 알림이 오면 알림 아이콘에 파란 점을 볼 수 있다. <>을 확인해보자. -[[_not_center]] +[[r_not_center]] ////////////////////////// .Notification center. image::images/maint-08-notifications-page.png[Notifiation center] @@ -576,12 +576,12 @@ GitHub의 파워 유저는 이메일 알림을 꺼놓고 GitHub 사이트에서 ////////////////////////// Email notifications are the other way you can handle notifications through GitHub. If you have this turned on you will get emails for each notification. -We saw examples of this in <<_email_notification>> and <<_email_pr>>. +We saw examples of this in <> and <>. The emails will also be threaded properly, which is nice if you're using a threading email client. ////////////////////////// 이메일 알림을 켜 놓으면 이메일로도 GitHub 알림을 확인할 수 있다. -<<_email_notification>>과 <<_email_pr>>의 예를 보면 관련 알림들이 이메일 스레드로 잘 분류되는 것을 볼 수 있다. +<>과 <>의 예를 보면 관련 알림들이 이메일 스레드로 잘 분류되는 것을 볼 수 있다. 그래서 이메일 스레드를 잘 지원하는 메일 클라이언트를 사용하는 것이 좋다. ////////////////////////// @@ -590,9 +590,9 @@ There is also a fair amount of metadata embedded in the headers of the emails th GitHub가 보낸 이메일 헤더를 보면 여러 가지 메타데이터가 들어 있다. 그래서 사용자는 이메일 필터나 룰 같은 자동 관리 기능으로 쉽게 관리할 수 있다. ////////////////////////// -For instance, if we look at the actual email headers sent to Tony in the email shown in <<_email_pr>>, we will see the following among the information sent: +For instance, if we look at the actual email headers sent to Tony in the email shown in <>, we will see the following among the information sent: ////////////////////////// -<<_email_pr>>에서 보여준 이메일의 헤더는 아래와 같다. +<>에서 보여준 이메일의 헤더는 아래와 같다. [source,mbox] ---- @@ -678,12 +678,12 @@ GitHub는 README 파일을 렌더링하는 것이기 때문에 이미지나 외 ////////////////////////// The other special file that GitHub recognizes is the `CONTRIBUTING` file. -If you have a file named `CONTRIBUTING` with any file extension, GitHub will show <<_contrib_file>> when anyone starts opening a Pull Request. +If you have a file named `CONTRIBUTING` with any file extension, GitHub will show <> when anyone starts opening a Pull Request. ////////////////////////// GitHub는 CONTRIBUTING 파일도 인식한다. -README와 마찬가지로 원하는 파일 형식을 사용하면 된다. Pull Request를 열 때 이 파일이 있으면 <<_contrib_file>>과 같이 링크를 보여준다. +README와 마찬가지로 원하는 파일 형식을 사용하면 된다. Pull Request를 열 때 이 파일이 있으면 <>과 같이 링크를 보여준다. -[[_contrib_file]] +[[r_contrib_file]] ////////////////////////// .Opening a Pull Request when a CONTRIBUTING file exists. image::images/maint-09-contrib.png[Contributing notice] @@ -718,7 +718,7 @@ If you are using a branch other than ``master'' as your default branch that you ////////////////////////// 기본 브랜치를 ``master''말고 다른 브랜치로 설정할 수 있다. Pull Request를 열 때 설정한 기본 브랜치가 기본으로 선택된다. 기본 브랜치는 저장소 설정 페이지의 ``Options'' 탭에서 변경한다. -[[_default_branch]] +[[r_default_branch]] ////////////////////////// .Change the default branch for a project. image::images/maint-10-default-branch.png[Default branch] @@ -741,7 +741,7 @@ If you would like to transfer a project to another user or an organization in Gi ////////////////////////// 프로젝트 소유자를 다른 사용자나 Organization으로 변경할 수 있다. 저장소 설정 페이지의 ``Options''탭을 보면 페이지 아래쪽에 ``Transfer ownership'' 항목이 있다. 여기 있는 `Transfer` 버튼으로 프로젝트를 넘길 수 있다. -[[_transfer_project]] +[[r_transfer_project]] ////////////////////////// .Transfer a project to anther GitHub user or Organization. image::images/maint-11-transfer.png[Transfer] diff --git a/book/06-github/sections/4-managing-organization.asc b/book/06-github/sections/4-managing-organization.asc index ab3b3ffb..36af11c2 100644 --- a/book/06-github/sections/4-managing-organization.asc +++ b/book/06-github/sections/4-managing-organization.asc @@ -1,4 +1,4 @@ -[[_github_orgs]] +[[r_github_orgs]] ////////////////////////// === Managing an organization ////////////////////////// @@ -57,9 +57,9 @@ GitHub은 Organization 소유자가 저장소를 Fork 할 때는 어느 계정 그리고 소유자는 해당 Organization에 저장소가 생길 때마다 자동으로 ``Watching'' 상태가 된다. ////////////////////////// -Just like in <<_personal_avatar>>, you can upload an avatar for your organization to personalize it a bit. Also just like personal accounts, you have a landing page for the organization that lists all of your repositories and can be viewed by other people. +Just like in <>, you can upload an avatar for your organization to personalize it a bit. Also just like personal accounts, you have a landing page for the organization that lists all of your repositories and can be viewed by other people. ////////////////////////// -<<_personal_avatar>>에서 개인 아바타를 올렸던 것처럼 Organization 계정에도 똑같이 아바타를 올릴 수 있다. +<>에서 개인 아바타를 올렸던 것처럼 Organization 계정에도 똑같이 아바타를 올릴 수 있다. 계정 랜딩 페이지도 개인 계정과 같다. 가지고 있는 저장소의 목록 페이지가 랜딩 페이지이고 다른 사람들이 볼 수 있다. ////////////////////////// @@ -91,7 +91,7 @@ The Organization page shows you a simple dashboard of all the repositories, user ////////////////////////// Organization 페이지는 저장소, 사용자, 팀을 한눈에 보여주는 대시보드다. -[[_org_page]] +[[r_org_page]] ////////////////////////// .The Organization page. image::images/orgs-01-page.png[] @@ -100,17 +100,17 @@ image::images/orgs-01-page.png[] image::images/orgs-01-page.png[] ////////////////////////// -To manage your Teams, you can click on the Teams sidebar on the right hand side of the page in <<_org_page>>. +To manage your Teams, you can click on the Teams sidebar on the right hand side of the page in <>. This will bring you to a page you can use to add members to the team, add repositories to the team or manage the settings and access control levels for the team. Each team can have read only, read/write or administrative access to the repositories. -You can change that level by clicking the ``Settings'' button in <<_team_page>>. +You can change that level by clicking the ``Settings'' button in <>. ////////////////////////// -<<_org_page>> 오른쪽에 있는 'Teams' 사이드바를 클릭하면 팀을 관리하는 페이지로 넘어간다. +<> 오른쪽에 있는 'Teams' 사이드바를 클릭하면 팀을 관리하는 페이지로 넘어간다. 다음 페이지에서 팀에 팀원이나 저장소를 추가하고, 설정을 관리하고, 팀의 권한 설정을 할 수 있다. 팀은 저장소에 대해 읽기 전용, 읽고 쓰기, 관리 권한을 가질 수 있다. -<<_team_page>>에 있는 ``Settings'' 버튼을 클릭하면 권한 수준을 변경할 수 있다. +<>에 있는 ``Settings'' 버튼을 클릭하면 권한 수준을 변경할 수 있다. -[[_team_page]] +[[r_team_page]] ////////////////////////// .The Team page. image::images/orgs-02-teams.png[] @@ -149,7 +149,7 @@ You can go to the 'Audit Log' tab and see what events have happened at an organi 소유자는 Organization에서 일어나는 모든 정보를 알 수 있다. 'Audit Log' 탭에 보면 저장소에서 일어난 일들의 로그가 있다. 누가 세계 어디에서 무슨 일을 했는지 보여준다. -[[_audit_log]] +[[r_audit_log]] ////////////////////////// .The Audit log. image::images/orgs-03-audit.png[] diff --git a/book/06-github/sections/5-scripting.asc b/book/06-github/sections/5-scripting.asc index b31b4e86..2211f9ea 100644 --- a/book/06-github/sections/5-scripting.asc +++ b/book/06-github/sections/5-scripting.asc @@ -33,13 +33,13 @@ GitHub 저장소 관리의 훅과 서비스 절에 보면 다른 시스템과 ////////////////////////// First we'll take a look at Services. Both the Hooks and Services integrations can be found in the Settings section of your repository, where we previously looked at adding Collaborators and changing the default branch of your project. -Under the ``Webhooks and Services'' tab you will see something like <<_services_hooks>>. +Under the ``Webhooks and Services'' tab you will see something like <>. ////////////////////////// GitHub 서비스부터 살펴보자. 훅과 서비스는 저장소의 설정 페이지에서 연동할 수 있다. 이전에 동료를 추가하거나 기본 브랜치를 설정하던 그곳이다. -``Webhooks와 Services'' 탭은 <<_services_hooks>>처럼 생겼다. +``Webhooks와 Services'' 탭은 <>처럼 생겼다. -[[_services_hooks]] +[[r_services_hooks]] ////////////////////////// .Services and Hooks configuration section. image::images/scripting-01-services.png[Services and hooks] @@ -51,13 +51,13 @@ image::images/scripting-01-services.png[서비스와 훅] There are dozens of services you can choose from, most of them integrations into other commercial and open source systems. Most of them are for Continuous Integration services, bug and issue trackers, chat room systems and documentation systems. We'll walk through setting up a very simple one, the Email hook. -If you choose ``email'' from the ``Add Service'' dropdown, you'll get a configuration screen like <<_service_config>>. +If you choose ``email'' from the ``Add Service'' dropdown, you'll get a configuration screen like <>. ////////////////////////// CI, 버그 트래커, 이슈 트래커, 채팅, 문서 시스템 등과 연동하는 데 사용하는 서비스가 수십 개 준비돼 있다. 여기서는 가장 단순한 Email 훅을 살펴본다. -``Add Service'' 메뉴에서 ``email''을 선택하면 <<_service_config>> 같은 설정 화면으로 이동한다. +``Add Service'' 메뉴에서 ``email''을 선택하면 <> 같은 설정 화면으로 이동한다. -[[_service_config]] +[[r_service_config]] ////////////////////////// .Email service configuration. image::images/scripting-02-email-service.png[Email service] @@ -99,13 +99,13 @@ Generally the way this works is you can setup a small web service to listen for GitHub 훅 페이로드를 처리하는 간단한 웹 서비스를 하나 만들고 그 서비스에 원하는 동작을 구현하는 것이 일반적이다. ////////////////////////// -To enable a hook, you click the ``Add webhook'' button in <<_services_hooks>>. -This will bring you to a page that looks like <<_web_hook>>. +To enable a hook, you click the ``Add webhook'' button in <>. +This will bring you to a page that looks like <>. ////////////////////////// -<<_services_hooks>>의 ``Add webhook'' 버튼을 클릭하면 +<>의 ``Add webhook'' 버튼을 클릭하면 아래와 같은 페이지로 이동한다. -[[_web_hook]] +[[r_web_hook]] ////////////////////////// .Web hook configuration. image::images/scripting-03-webhook.png[Web hook] @@ -187,7 +187,7 @@ GitHub는 개발하고 테스트할 때 사용하는 개발자 콘솔도 제공 어떤 데이터가 전송됐는지 확인할 수 있다. 만약 전송에 성공했으면 요청과 응답의 바디와 헤더를 모두 확인할 수 있다. 이것으로 훅을 쉽게 테스트하고 디버깅할 수 있다. -[[_web_hook_debug]] +[[r_web_hook_debug]] ////////////////////////// .Web hook debugging information. image::images/scripting-04-webhook-debug.png[Webhook debug] @@ -304,7 +304,7 @@ You can generate this from the ``Applications'' tab of your settings page. 사용자이름과 암호가 필요한 Basic 인증도 가능하지만, 개인 엑세스 토큰을 사용하는 게 낫다. 설정 페이지의 ``Applications'' 탭에서 생성할 수 있다. -[[_access_token]] +[[r_access_token]] ////////////////////////// .Generate your access token from the ``Applications'' tab of your settings page. image::images/scripting-05-access-token.png[엑세스 토큰] @@ -369,11 +369,11 @@ $ curl -H "Content-Type: application/json" \ ---- ////////////////////////// -Now if you go to that issue, you can see the comment that we just successfully posted as in <<_api_comment>>. +Now if you go to that issue, you can see the comment that we just successfully posted as in <>. ////////////////////////// -해당 이슈 페이지에 가면 코멘트를 확인할 수 있다. <<_api_comment>>처럼 잘 써진다. +해당 이슈 페이지에 가면 코멘트를 확인할 수 있다. <>처럼 잘 써진다. -[[_api_comment]] +[[r_api_comment]] ////////////////////////// .A comment posted from the GitHub API. image::images/scripting-06-comment.png[API Comment] @@ -468,11 +468,11 @@ For example, a testing service may provide a status and a validation service lik 예를 들어 유효성을 검증하거나 상태값을 제공해 주는 테스팅 서비스의 경우 상태값을 제공해야 하는데, ``컨텍스트'' 필드를 통해 어떻게 상태가 변화했는지를 알 수 있다. ////////////////////////// -If someone opens a new Pull Request on GitHub and this hook is setup, you may see something like <<_commit_status>>. +If someone opens a new Pull Request on GitHub and this hook is setup, you may see something like <>. ////////////////////////// -이 훅을 적용하고 나서 누군가 Pull Request를 새로 열면 <<_commit_status>>같은 상태 메시지를 보게 된다. +이 훅을 적용하고 나서 누군가 Pull Request를 새로 열면 <>같은 상태 메시지를 보게 된다. -[[_commit_status]] +[[r_commit_status]] ////////////////////////// .Commit status via the API. image::images/scripting-07-status.png[Commit status] diff --git a/book/07-git-tools/sections/advanced-merging.asc b/book/07-git-tools/sections/advanced-merging.asc index 00d7b6aa..0fa67c67 100644 --- a/book/07-git-tools/sections/advanced-merging.asc +++ b/book/07-git-tools/sections/advanced-merging.asc @@ -1,4 +1,4 @@ -[[_advanced_merging]] +[[r_advanced_merging]] /////////////////// === Advanced Merging /////////////////// @@ -33,9 +33,9 @@ We'll also cover some of the different, non-standard types of merges you can do, ==== Merge 충돌 /////////////////// -While we covered some basics on resolving merge conflicts in <<_basic_merge_conflicts>>, for more complex conflicts, Git provides a few tools to help you figure out what's going on and how to better deal with the conflict. +While we covered some basics on resolving merge conflicts in <>, for more complex conflicts, Git provides a few tools to help you figure out what's going on and how to better deal with the conflict. /////////////////// -<<_basic_merge_conflicts>>에서 기초적인 Merge 충돌 해결에 대해서 다뤘다. Git은 복잡한 Merge 충돌이 났을 때 필요한 도구도 가지고 있다. 무슨 일이 일어났고 어떻게 해결하는 게 나은지 알 수 있다. +<>에서 기초적인 Merge 충돌 해결에 대해서 다뤘다. Git은 복잡한 Merge 충돌이 났을 때 필요한 도구도 가지고 있다. 무슨 일이 일어났고 어떻게 해결하는 게 나은지 알 수 있다. /////////////////// First of all, if at all possible, try to make sure your working directory is clean before doing a merge that may have conflicts. @@ -147,7 +147,7 @@ CONFLICT (content): Merge conflict in hello.rb Automatic merge failed; fix conflicts and then commit the result. ---- -[[_abort_merge]] +[[r_abort_merge]] /////////////////// ===== Aborting a Merge /////////////////// @@ -230,7 +230,7 @@ This is a lifesaver if you have someone on your team who likes to occasionally r /////////////////// 팀원 중 누군가 스페이스를 탭으로 바꾸거나 탭을 스페이스로 바꾸는 짓을 했을 때 이 옵션이 그대를 구원해 준다. -[[_manual_remerge]] +[[r_manual_remerge]] /////////////////// ===== Manual File Re-merging /////////////////// @@ -431,7 +431,7 @@ Removing hello.ours.rb Removing hello.theirs.rb ---- -[[_checking_out_conflicts]] +[[r_checking_out_conflicts]] /////////////////// ===== Checking Out Conflicts /////////////////// @@ -576,7 +576,7 @@ This can be particularly useful for conflicts of binary files where you can simp /////////////////// 이 옵션은 바이너리 파일이 충돌 나서 한쪽을 선택해야 하는 상황이나 한쪽 브랜치의 온전한 파일을 원할 때 사용할 수 있다. 일단 Merge 하고 나서 특정 파일만 Checkout 한 후에 커밋하는 방법도 있다. -[[_merge_log]] +[[r_merge_log]] /////////////////// ===== Merge Log /////////////////// @@ -592,9 +592,9 @@ Reviewing a little bit of history to remember why two lines of development were 과거를 살짝 들춰보면 개발 당시에 같은 곳을 고쳐야만 했던 이유를 밝혀내는 데 도움이 된다. /////////////////// -To get a full list of all of the unique commits that were included in either branch involved in this merge, we can use the ``triple dot'' syntax that we learned in <<_triple_dot>>. +To get a full list of all of the unique commits that were included in either branch involved in this merge, we can use the ``triple dot'' syntax that we learned in <>. /////////////////// -``Triple Dot'' 문법을 이용하면 Merge 에 사용한 양 브랜치의 모든 커밋의 목록을 얻을 수 있다. 자세한 문법은 <<_triple_dot>>를 참고한다. +``Triple Dot'' 문법을 이용하면 Merge 에 사용한 양 브랜치의 모든 커밋의 목록을 얻을 수 있다. 자세한 문법은 <>를 참고한다. [source,console] ---- @@ -751,7 +751,7 @@ index 0399cd5,59727f0..e1d0799 hello() ---- -[[_undoing_merges]] +[[r_undoing_merges]] /////////////////// ==== Undoing Merges /////////////////// @@ -803,10 +803,10 @@ image::images/undomerge-reset.png[History after `git reset --hard HEAD~`.] image::images/undomerge-reset.png[`git reset --hard HEAD~` 실행 후의 히스토리.] /////////////////// -We covered `reset` back in <<_git_reset>>, so it shouldn't be too hard to figure out what's going on here. +We covered `reset` back in <>, so it shouldn't be too hard to figure out what's going on here. Here's a quick refresher: `reset --hard` usually goes through three steps: /////////////////// -`reset`에 대해서는 이미 앞의 <<_git_reset>>에서 다뤘었기 때문에 이 내용이 그리 어렵진 않을 것이다. +`reset`에 대해서는 이미 앞의 <>에서 다뤘었기 때문에 이 내용이 그리 어렵진 않을 것이다. 간단하게 복습해보자. `reset --hard` 명령은 아래의 세 단계로 수행한다. /////////////////// @@ -822,14 +822,14 @@ Here's a quick refresher: `reset --hard` usually goes through three steps: /////////////////// The downside of this approach is that it's rewriting history, which can be problematic with a shared repository. -Check out <<_rebase_peril>> for more on what can happen; the short version is that if other people have the commits you're rewriting, you should probably avoid `reset`. +Check out <> for more on what can happen; the short version is that if other people have the commits you're rewriting, you should probably avoid `reset`. This approach also won't work if any other commits have been created since the merge; moving the refs would effectively lose those changes. /////////////////// 이 방법의 단점은 히스토리를 다시 쓴다는 것이다. 다른 사람들과 공유된 저장소에서 히스토리를 덮어쓰면 문제가 생길 수 있다. -무슨 문제가 일어나는지 알고 싶다면 <<_rebase_peril>>를 참고하자. 간단히 말해 다시 쓰는 커밋이 이미 다른 사람들과 공유한 커밋이라면 `reset` 하지 않는 게 좋다. +무슨 문제가 일어나는지 알고 싶다면 <>를 참고하자. 간단히 말해 다시 쓰는 커밋이 이미 다른 사람들과 공유한 커밋이라면 `reset` 하지 않는 게 좋다. 이 방법은 Merge 하고 나서 다른 커밋을 생성했다면 제대로 동작하지 않는다. HEAD를 이동시키면 Merge 이후에 만든 커밋을 잃어버린다. -[[_reverse_commit]] +[[r_reverse_commit]] /////////////////// ===== Reverse the commit /////////////////// diff --git a/book/07-git-tools/sections/bundling.asc b/book/07-git-tools/sections/bundling.asc index e612c1c8..e6f52bfd 100644 --- a/book/07-git-tools/sections/bundling.asc +++ b/book/07-git-tools/sections/bundling.asc @@ -1,4 +1,4 @@ -[[_bundling]] +[[r_bundling]] /////////// === Bundling /////////// @@ -132,12 +132,12 @@ Now, you could just do the same thing and bundle the entire repository, which wi /////////// In order to do that, you'll have to calculate the difference. -As we described in <<_commit_ranges>>, you can specify a range of commits in a number of ways. +As we described in <>, you can specify a range of commits in a number of ways. To get the three commits that we have in our master branch that weren't in the branch we originally cloned, we can use something like `origin/master..master` or `master ^origin/master`. You can test that with the `log` command. /////////// 우선 차이점을 찾아내야 Bundle 파일을 만들 수 있다. -<<_commit_ranges>>에서 살펴본 대로 숫자를 사용하여 커밋의 범위를 지정할 수 있다. +<>에서 살펴본 대로 숫자를 사용하여 커밋의 범위를 지정할 수 있다. 원래 Clone 한 브랜치인 master에는 없던 세 개의 커밋을 얻어내려면 `origin/master..master` 또는 `master ^origin/master` 파라미터를 쓰면 된다. `log` 명령으로 시험해볼 수 있다. diff --git a/book/07-git-tools/sections/credentials.asc b/book/07-git-tools/sections/credentials.asc index 2d834310..10e84cae 100644 --- a/book/07-git-tools/sections/credentials.asc +++ b/book/07-git-tools/sections/credentials.asc @@ -1,4 +1,4 @@ -[[_credential_caching]] +[[r_credential_caching]] //////////////////// === Credential Storage //////////////////// diff --git a/book/07-git-tools/sections/debugging.asc b/book/07-git-tools/sections/debugging.asc index cd3f85e7..7467d8d3 100644 --- a/book/07-git-tools/sections/debugging.asc +++ b/book/07-git-tools/sections/debugging.asc @@ -11,7 +11,7 @@ Git에는 디버깅에 사용하면 좋은 기능도 있다. Git은 굉장히 유연해서 어떤 형식의 프로젝트에나 사용할 수 있다. 문제를 일으킨 범인이나 버그를 쉽게 찾을 수 있도록 도와준다. -[[_file_annotation]] +[[r_file_annotation]] ////////////////////////// ==== File Annotation ////////////////////////// @@ -86,7 +86,7 @@ Git tells you the original commit where you wrote those lines, even if it was in ////////////////////////// 언제나 코드가 커밋될 당시의 파일이름을 알 수 있기 때문에 코드를 어떻게 리팩토링해도 추적할 수 있다. 그리고 어떤 파일에 적용해봐도 각 라인을 커밋할 당시의 파일이름을 알 수 있다. 버그를 찾을 때 정말 유용하다. -[[_binary_search]] +[[r_binary_search]] ////////////////////////// ==== Binary Search ////////////////////////// diff --git a/book/07-git-tools/sections/interactive-staging.asc b/book/07-git-tools/sections/interactive-staging.asc index 05398d6c..b89f1873 100644 --- a/book/07-git-tools/sections/interactive-staging.asc +++ b/book/07-git-tools/sections/interactive-staging.asc @@ -1,4 +1,4 @@ -[[_interactive_staging]] +[[r_interactive_staging]] ////////////////////////// === Interactive Staging ////////////////////////// diff --git a/book/07-git-tools/sections/notes.asc b/book/07-git-tools/sections/notes.asc index a3d5514c..c67b6cd1 100644 --- a/book/07-git-tools/sections/notes.asc +++ b/book/07-git-tools/sections/notes.asc @@ -1,4 +1,4 @@ -[[_git_notes]] +[[r_git_notes]] === Notes One of the cool things about Git is that it has strong cryptographic integrity. If you change any bit in the commit data or any of the files it keeps, all the checksums change, including the commit SHA and every commit SHA since that one. However, that means that in order to amend the commit in any way, for instance to add some comments on something or even sign off on a commit, you have to change the SHA of the commit itself. @@ -133,7 +133,7 @@ You can also switch the current namespace you're using so that the default for w $ git config core.notesRef refs/notes/bugzilla ---- -[[_sharing_notes]] +[[r_sharing_notes]] === Sharing Notes The notes (as you may have noticed in the previous section) are stored as references, just like branches and tags. This means you can push them to a server. However, Git has a bit of magic built in to expand a branch name like `master` to it's full name, which is `refs/heads/master`. Unfortunately, Git has no such magic built in for notes. So to push your notes to a server you cannot simply run something like `git push origin bugzilla`. Git will do @@ -162,7 +162,7 @@ To https://github.com/schacon/kidgloves In fact, you may want to just make that `git push origin refs/notes/*` which will push all your notes. This is what Git does normally for something like tags. When you run `git push origin --tags` it basically expands to `git push origin refs/tags/*`. -[[_getting_notes]] +[[r_getting_notes]] ==== Getting Notes Unfortunately, getting notes is even more difficult. Notes do not come down with a clone and there nothing like `git fetch --notes`. In order to fetch notes, you have to specify both sides of the refspec. diff --git a/book/07-git-tools/sections/replace.asc b/book/07-git-tools/sections/replace.asc index d9033d0c..c5bbe962 100644 --- a/book/07-git-tools/sections/replace.asc +++ b/book/07-git-tools/sections/replace.asc @@ -1,4 +1,4 @@ -[[_replace]] +[[r_replace]] === Replace //////////////////// @@ -135,14 +135,14 @@ $ echo 'get history from blah blah blah' | git commit-tree 9c68fdc^{tree} The `commit-tree` command is one of a set of commands that are commonly referred to as 'plumbing' commands. These are commands that are not generally meant to be used directly, but instead are used by *other* Git commands to do smaller jobs. On occasions when we're doing weirder things like this, they allow us to do really low-level things but are not meant for daily use. -You can read more about plumbing commands in <<_plumbing_porcelain>> +You can read more about plumbing commands in <> ===== //////////////////// ===== `commit-tree` 명령은 'Plumbing' 명령 중 하나다. 저수준 명령은 일반적으로 직접 사용할 일이 없다. 주로 사용하는 **고수준 Git 명령**이 하는 작업을 잘게 쪼개어 수행할 때 사용한다. 이 책에서 위의 예제처럼 특별한 작업을 위해 간혹 저수준 명령을 사용하긴 하지만 매일같이 사용하지는 않는다. -다른 여러 저수준 명령을 사용하는 예제는 <<_plumbing_porcelain>>에서 확인할 수 있다. +다른 여러 저수준 명령을 사용하는 예제는 <>에서 확인할 수 있다. ===== image::images/replace3.png[] diff --git a/book/07-git-tools/sections/rerere.asc b/book/07-git-tools/sections/rerere.asc index eff48d28..bb33e1f9 100644 --- a/book/07-git-tools/sections/rerere.asc +++ b/book/07-git-tools/sections/rerere.asc @@ -1,4 +1,4 @@ -[[_rerere]] +[[r_rerere]] === Rerere /////////////////// @@ -208,10 +208,10 @@ image::images/rerere2.png[] /////////////////// Now, let's undo that merge and then rebase it on top of our master branch instead. -We can move our branch back by using `reset` as we saw in <<_git_reset>>. +We can move our branch back by using `reset` as we saw in <>. /////////////////// 이제 Merge를 되돌리고 Rebase를 해서 master 브랜치에 쌓아 보자. -<<_git_reset>>에서 살펴본 대로 `reset` 명령을 사용하여 브랜치가 가리키는 커밋을 되돌린다. +<>에서 살펴본 대로 `reset` 명령을 사용하여 브랜치가 가리키는 커밋을 되돌린다. [source,console] ---- @@ -304,10 +304,10 @@ end ---- /////////////////// -We saw an example of this in <<_advanced_merging>>. +We saw an example of this in <>. For now though, let's re-resolve it by just running `rerere` again: /////////////////// -<<_advanced_merging>>에서 이러한 명령을 사용하는 예제를 보았다. +<>에서 이러한 명령을 사용하는 예제를 보았다. 이때 `rerere` 명령을 실행하면 충돌이 발생한 코드를 자동으로 다시 해결한다. [source,console] diff --git a/book/07-git-tools/sections/reset.asc b/book/07-git-tools/sections/reset.asc index 0259ad97..18b53361 100644 --- a/book/07-git-tools/sections/reset.asc +++ b/book/07-git-tools/sections/reset.asc @@ -1,4 +1,4 @@ -[[_git_reset]] +[[r_git_reset]] ////////////////////////// === Reset Demystified ////////////////////////// @@ -89,7 +89,7 @@ The `cat-file` and `ls-tree` commands are ``plumbing'' commands that are used fo ////////////////////////// `cat-file`와 `ls-tree` 명령은 일상적으로는 잘 사용하지 않는 저수준 명령이다. 이런 저수준 명령을 ``plumbing'' 명령이라고 한다. Git이 실제로 무슨 일을 하는지 볼 때 유용하다. -[[_the_index]] +[[r_the_index]] ////////////////////////// ===== The Index ////////////////////////// @@ -300,12 +300,12 @@ With `reset --soft`, it will simply stop there. Now take a second to look at that diagram and realize what happened: it essentially undid the last `git commit` command. When you run `git commit`, Git creates a new commit and moves the branch that HEAD points to up to it. When you `reset` back to `HEAD~` (the parent of HEAD), you are moving the branch back to where it was, without changing the Index or Working Directory. -You could now update the Index and run `git commit` again to accomplish what `git commit --amend` would have done (see <<_git_amend>>). +You could now update the Index and run `git commit` again to accomplish what `git commit --amend` would have done (see <>). ////////////////////////// 이제 위의 다이어그램을 보고 어떤 일이 일어난 것인지 생각해보자. `reset` 명령은 가장 최근의 `git commit` 명령을 되돌린다. `git commit` 명령을 실행하면 Git은 새로운 커밋을 생성하고 HEAD가 가리키는 브랜치가 새로운 커밋을 가리키도록 업데이트한다. `reset` 명령 뒤에 `HEAD~`(HEAD의 부모 커밋)를 주면 Index나 워킹 디렉토리는 그대로 놔두고 브랜치가 가리키는 커밋만 이전으로 되돌린다. -Index를 업데이트한 다음에 `git commit` 명령를 실행하면 `git commit --amend` 명령의 결과와 같아진다(<<_git_amend>>를 참조). +Index를 업데이트한 다음에 `git commit` 명령를 실행하면 `git commit --amend` 명령의 결과와 같아진다(<>를 참조). ////////////////////////// ===== Step 2: Updating the Index (--mixed) @@ -435,10 +435,10 @@ image::images/reset-path2.png[] ////////////////////////// This is why the output of the `git status` command suggests that you run this to unstage a file. -(See <<_unstaging>> for more on this.) +(See <> for more on this.) ////////////////////////// 이것이 git status 명령에서 이 명령을 보여주는 이유다. 이 명령으로 파일을 Unstaged 상태로 만들 수 있다. -(더 자세한 내용은 <<_unstaging>>를 참고한다.) +(더 자세한 내용은 <>를 참고한다.) ////////////////////////// We could just as easily not let Git assume we meant ``pull the data from HEAD'' by specifying a specific commit to pull that file version from. @@ -476,11 +476,11 @@ Let's look at how to do something interesting with this newfound power – squas ////////////////////////// Say you have a series of commits with messages like ``oops.'', ``WIP'' and ``forgot this file''. You can use `reset` to quickly and easily squash them into a single commit that makes you look really smart. -(<<_squashing>> shows another way to do this, but in this example it's simpler to use `reset`.) +(<> shows another way to do this, but in this example it's simpler to use `reset`.) ////////////////////////// ``oops.''나 ``WIP'', ``forgot this file'' 같은 깃털같이 가벼운 커밋들이 있다고 해보자. 이럴 때는 `reset` 명령으로 커밋들을 하나로 합쳐서 남들에게 똑똑한 척할 수 있다. -(<<_squashing>>를 하는 명령어가 따로 있지만, 여기서는 `reset` 명령을 쓰는 것이 더 간단할 때도 있다는 것을 보여준다.) +(<>를 하는 명령어가 따로 있지만, 여기서는 `reset` 명령을 쓰는 것이 더 간단할 때도 있다는 것을 보여준다.) ////////////////////////// Let's say you have a project where the first commit has one file, the second commit added a new file and changed the first, and the third commit changed the first file again. diff --git a/book/07-git-tools/sections/revision-selection.asc b/book/07-git-tools/sections/revision-selection.asc index ea851ce1..f47cbe9c 100644 --- a/book/07-git-tools/sections/revision-selection.asc +++ b/book/07-git-tools/sections/revision-selection.asc @@ -1,4 +1,4 @@ -[[_revision_selection]] +[[r_revision_selection]] ////////////////////////// === Revision Selection ////////////////////////// @@ -140,7 +140,7 @@ SHA-1 값의 크기는 20 바이트(160비트)이다. 그냥 어느 날 동료가 한순간에 모두 늑대에게 물려 죽을 확률이 훨씬 더 높다. ==== -[[_branch_references]] +[[r_branch_references]] ////////////////////////// ==== Branch References ////////////////////////// @@ -163,12 +163,12 @@ $ git show topic1 ////////////////////////// If you want to see which specific SHA-1 a branch points to, or if you want to see what any of these examples boils down to in terms of SHA-1s, you can use a Git plumbing tool called `rev-parse`. -You can see <<_git_internals>> for more information about plumbing tools; basically, `rev-parse` exists for lower-level operations and isn’t designed to be used in day-to-day operations. +You can see <> for more information about plumbing tools; basically, `rev-parse` exists for lower-level operations and isn’t designed to be used in day-to-day operations. However, it can be helpful sometimes when you need to see what’s really going on. Here you can run `rev-parse` on your branch. ////////////////////////// 브랜치가 가리키는 개체의 SHA-1 값에 대한 궁금증은 `rev-parse`이라는 Plumbing 도구가 해결해 준다. -<<_git_internals>>에서 이 뚫어뻥에 대해 시원하게 설명한다. 기본적으로 `rev-parse`은 저수준 명령이기 때문에 평소에는 전혀 필요하지 않다. +<>에서 이 뚫어뻥에 대해 시원하게 설명한다. 기본적으로 `rev-parse`은 저수준 명령이기 때문에 평소에는 전혀 필요하지 않다. 그래도 한번 사용해보고 어떤 결과가 나오는지 알아 두자. [source,console] @@ -177,7 +177,7 @@ $ git rev-parse topic1 ca82a6dff817ec66f44342007202690a93763949 ---- -[[_git_reflog]] +[[r_git_reflog]] ////////////////////////// ==== RefLog Shortnames ////////////////////////// @@ -377,7 +377,7 @@ You can also combine these syntaxes – you can get the second parent of the pre ////////////////////////// 이 두 표현을 같이 사용할 수도 있다. 위의 예제에서 `HEAD~3^2`를 사용하면 증조부모의 Merge 커밋의 부모의 부모를 조회한다. -[[_commit_ranges]] +[[r_commit_ranges]] ////////////////////////// ==== Commit Ranges ////////////////////////// @@ -395,13 +395,13 @@ This is particularly useful for managing your branches – if you have a lot of ////////////////////////// The most common range specification is the double-dot syntax. This basically asks Git to resolve a range of commits that are reachable from one commit but aren’t reachable from another. -For example, say you have a commit history that looks like <>. +For example, say you have a commit history that looks like <>. ////////////////////////// 범위를 표현하는 문법으로 Double Dot(..)을 많이 쓴다. Double Dot은 어떤 커밋들이 한쪽에는 관련됐고 다른 쪽에는 관련되지 않았는지 Git에게 물어보는 것이다. -예들 들어 <>과 같은 커밋 히스토리가 있다고 가정하자. +예들 들어 <>과 같은 커밋 히스토리가 있다고 가정하자. -[[double_dot]] +[[rdouble_dot]] ////////////////////////// .Example history for range selection. image::images/double-dot.png[Example history for range selection.] @@ -416,7 +416,7 @@ For the sake of brevity and clarity in these examples, I’ll use the letters of ////////////////////////// experiment 브랜치의 커밋들 중에서 아직 master 브랜치에 Merge 하지 않은 것들만 보고 싶으면 `master..experiment`라고 사용한다. 이 표현은 ``master에는 없지만, experiment에는 있는 커밋''을 의미한다. -여기에서는 설명을 쉽게 하려고 실제 조회 결과가 아니라 <>의 문자를 사용한다. +여기에서는 설명을 쉽게 하려고 실제 조회 결과가 아니라 <>의 문자를 사용한다. [source,console] ---- @@ -501,16 +501,16 @@ This makes for a very powerful revision query system that should help you figure ////////////////////////// 이 조건을 잘 응용하면 작업 중인 브랜치와 다른 브랜치을 매우 상세하게 비교해볼 수 있다. -[[_triple_dot]] +[[r_triple_dot]] ===== Triple Dot ////////////////////////// The last major range-selection syntax is the triple-dot syntax, which specifies all the commits that are reachable by either of two references but not by both of them. -Look back at the example commit history in <>. +Look back at the example commit history in <>. If you want to see what is in `master` or `experiment` but not any common references, you can run ////////////////////////// Triple Dot은 양쪽에 있는 두 Refs 사이에서 공통으로 가지는 것을 제외하고 서로 다른 커밋만 보여준다. -<>의 커밋 히스토리를 다시 보자. +<>의 커밋 히스토리를 다시 보자. 만약 `master`와 `experiment`의 공통부분은 빼고 다른 커밋만 보고 싶으면 아래와 같이 하면 된다. [source,console] diff --git a/book/07-git-tools/sections/rewriting-history.asc b/book/07-git-tools/sections/rewriting-history.asc index 2516c416..8a04eca9 100644 --- a/book/07-git-tools/sections/rewriting-history.asc +++ b/book/07-git-tools/sections/rewriting-history.asc @@ -1,4 +1,4 @@ -[[_rewriting_history]] +[[r_rewriting_history]] ////////////////////////// === Rewriting History ////////////////////////// @@ -20,7 +20,7 @@ In this section, you’ll cover how to accomplish these very useful tasks so tha ////////////////////////// 이 절에서는 사람들과 코드를 공유하기 전에 커밋 히스토리를 예쁘게 단장하는 방법에 대해서 설명한다. -[[_git_amend]] +[[r_git_amend]] ////////////////////////// ==== Changing the Last Commit ////////////////////////// @@ -64,7 +64,7 @@ It’s like a very small rebase – don’t amend your last commit if you’ve a 이때 SHA-1 값이 바뀌기 때문에 과거의 커밋을 변경할 때 주의해야 한다. Rebase와 같이 이미 Push 한 커밋은 수정하면 안 된다. -[[_changing_multiple]] +[[r_changing_multiple]] ////////////////////////// ==== Changing Multiple Commit Messages ////////////////////////// @@ -262,7 +262,7 @@ You effectively change the order of those commits and remove the ``added cat-fil 수정한 내용을 저장하고 편집기를 종료하면 Git은 브랜치를 이 커밋의 부모로 이동시키고서 `310154e`와 `f7f3f6d`를 순서대로 적용한다. 명령이 끝나고 나면 커밋 순서가 변경됐고 ``added cat-file'' 커밋이 제거된 것을 확인할 수 있다. -[[_squashing]] +[[r_squashing]] ////////////////////////// ==== Squashing Commits ////////////////////////// @@ -411,7 +411,7 @@ You’ll learn a few of the common uses so you can get an idea of some of the th 하지만, 잘 쓰면 꽤 유용하다. `filter-branch`가 유용한 경우를 예로 들어 설명하기 때문에 여기에서 대충 어떤 경우에 유용할지 배울 수 있다. -[[_removing_file_every_commit]] +[[r_removing_file_every_commit]] ////////////////////////// ===== Removing a File from Every Commit ////////////////////////// diff --git a/book/07-git-tools/sections/searching.asc b/book/07-git-tools/sections/searching.asc index 2b0023df..b959bcd9 100644 --- a/book/07-git-tools/sections/searching.asc +++ b/book/07-git-tools/sections/searching.asc @@ -1,4 +1,4 @@ -[[_searching]] +[[r_searching]] ////////////////////////// === Searching ////////////////////////// @@ -13,7 +13,7 @@ We'll go through a few of them. Git은 데이터베이스에 저장된 코드나 커밋에서 원하는 부분을 빠르고 쉽게 검색하는 도구가 여러 가지 있으며 앞으로 함께 살펴보자. -[[_git_grep]] +[[r_git_grep]] ==== Git Grep ////////////////////////// diff --git a/book/07-git-tools/sections/signing.asc b/book/07-git-tools/sections/signing.asc index 1e531c9d..99c7c627 100644 --- a/book/07-git-tools/sections/signing.asc +++ b/book/07-git-tools/sections/signing.asc @@ -1,4 +1,4 @@ -[[_signing]] +[[r_signing]] ////////////////////////// === Signing Your Work ////////////////////////// @@ -152,7 +152,7 @@ gpg: Can't check signature: public key not found error: could not verify the tag 'v1.4.2.1' ---- -[[_signing_commits]] +[[r_signing_commits]] ////////////////////////// ==== Signing Commits ////////////////////////// diff --git a/book/07-git-tools/sections/stashing-cleaning.asc b/book/07-git-tools/sections/stashing-cleaning.asc index 15cff3f5..bd3e3aed 100644 --- a/book/07-git-tools/sections/stashing-cleaning.asc +++ b/book/07-git-tools/sections/stashing-cleaning.asc @@ -1,4 +1,4 @@ -[[_git_stashing]] +[[r_git_stashing]] ////////////////////////// === Stashing and Cleaning ////////////////////////// @@ -296,7 +296,7 @@ This is a nice shortcut to recover stashed work easily and work on it in a new b ////////////////////////// 이 명령은 브랜치를 새로 만들고 Stash를 복원해주는 매우 편리한 도구다. -[[_git_clean]] +[[r_git_clean]] ////////////////////////// ==== Cleaning your Working Directory ////////////////////////// diff --git a/book/07-git-tools/sections/submodules.asc b/book/07-git-tools/sections/submodules.asc index e4b6ee00..4508ab08 100644 --- a/book/07-git-tools/sections/submodules.asc +++ b/book/07-git-tools/sections/submodules.asc @@ -1,4 +1,4 @@ -[[_git_submodules]] +[[r_git_submodules]] ////////////////////////// === Submodules ////////////////////////// @@ -36,7 +36,7 @@ Git의 서브모듈은 이런 문제를 다루는 도구다. Git 저장소 안에 다른 Git 저장소를 디렉토리로 분리해 넣는 것이 서브모듈이다. 다른 독립된 Git 저장소를 Clone 해서 내 Git 저장소 안에 포함할 수 있으며 각 저장소의 커밋은 독립적으로 관리한다. -[[_starting_submodules]] +[[r_starting_submodules]] ////////////////////////// ==== Starting with Submodules ////////////////////////// @@ -210,7 +210,7 @@ Lastly, push these changes: $ git push origin master ---- -[[_cloning_submodules]] +[[r_cloning_submodules]] ////////////////////////// ==== Cloning a Project with Submodules ////////////////////////// @@ -681,7 +681,7 @@ You can go into the submodule directory and fix the conflict just as you normall /////////// 이러면 서브모듈 디렉토리로 가서 충돌을 해결하면 된다. -[[_publishing_submodules]] +[[r_publishing_submodules]] /////////// ===== Publishing Submodule Changes /////////// @@ -946,11 +946,12 @@ Git으로 이 문제를 해결하는 흥미로운 다른 방법이 있다. This is why the error message from before was ``merge following commits not found'', because it could not do *this*. It's confusing because who would expect it to *try* to do this? /////////// -이런 이유에서 위에서 본 Merge 할 수 없다는 오류 메시지가 ``merge following commits not found''(Merge 커밋을 찾을 수 없음) 인 것이다. 이런 메시지가 이상한 까닭은 누가 이런 일을 한다고 상상이나 했겠느냐는 말이다. +이런 이유에서 위에서 본 Merge 할 수 없다는 오류 메시지가 ``merge following commits not found'' (Merge 커밋을 찾을 수 없음) 인 것이다. 이런 메시지가 이상한 까닭은 누가 이런 일을 한다고 상상이나 했겠느냐는 말이다. /////////// If it does find a single acceptable merge commit, you'll see something like this: /////////// + 위의 상황에서 마땅한 Merge 커밋을 하나 발견했다면 아래와 같은 결과를 볼 수 있다. [source,console] @@ -1101,10 +1102,10 @@ This is obviously a simplified example, but hopefully it gives you an idea of ho /////////// You may want to set up some aliases for some of these commands as they can be quite long and you can't set configuration options for most of them to make them defaults. -We covered setting up Git aliases in [[_git_aliases]], but here is an example of what you may want to set up if you plan on working with submodules in Git a lot. +We covered setting up Git aliases in <>, but here is an example of what you may want to set up if you plan on working with submodules in Git a lot. /////////// 서브모듈을 이용하는 명령은 대부분 길이가 길어서 Alias를 만들어 사용하는 것이 편하다. 혹은 설정파일을 통해 기본 값으로 모든 명령에 설정하지 않고 쉽게 서브모듈을 사용할 때도 Alias는 유용하다. -Alias를 설정하는 방법은 [[_git_aliases]]에서 이미 다루었다. 여기에서는 서브모듈에 관련된 몇 가지 유용한 Alias만 살펴본다. +Alias를 설정하는 방법은 <>에서 이미 다루었다. 여기에서는 서브모듈에 관련된 몇 가지 유용한 Alias만 살펴본다. [source,console] ---- diff --git a/book/07-git-tools/sections/subtree-merges.asc b/book/07-git-tools/sections/subtree-merges.asc index 1c03e669..0783cb06 100644 --- a/book/07-git-tools/sections/subtree-merges.asc +++ b/book/07-git-tools/sections/subtree-merges.asc @@ -1,4 +1,4 @@ -[[_subtree_merge]] +[[r_subtree_merge]] /////////////////// ===== Subtree Merging /////////////////// @@ -74,12 +74,12 @@ Git에서는 전혀 다른 브랜치를 쉽게 만들 수 있다. 물론 이렇 /////////////////// In this case, we want to pull the Rack project into our `master` project as a subdirectory. We can do that in Git with `git read-tree`. -You’ll learn more about `read-tree` and its friends in <<_git_internals>>, but for now know that it reads the root tree of one branch into your current staging area and working directory. +You’ll learn more about `read-tree` and its friends in <>, but for now know that it reads the root tree of one branch into your current staging area and working directory. We just switched back to your `master` branch, and we pull the `rack_branch` branch into the `rack` subdirectory of our `master` branch of our main project: /////////////////// Rack 프로젝트를 `master` 브랜치의 하위 디렉토리로 만들 수 있다. 이는 `git read-tree` 명령을 사용한다. -`read-tree` 명령과 같이 저수준 명령에 관련된 많은 내용은 <<_git_internals>>에서 다룬다. 간단히 말하자면 `read-tree` 명령은 어떤 브랜치로부터 루트 트리를 읽어서 현재 Staging Area나 워킹 디렉토리로 가져온다. +`read-tree` 명령과 같이 저수준 명령에 관련된 많은 내용은 <>에서 다룬다. 간단히 말하자면 `read-tree` 명령은 어떤 브랜치로부터 루트 트리를 읽어서 현재 Staging Area나 워킹 디렉토리로 가져온다. `master` 브랜치로 다시 Checkout 하고 `rack_branch` 브랜치를 `rack`이라는 `master` 브랜치의 하위 디렉토리로 만들어보자. [source,console] @@ -127,12 +127,12 @@ You can also do the opposite – make changes in the `rack` subdirectory of your 반대로 `rack` 하위 디렉토리에서 변경한 내용을 `rack_branch`로 Merge 하는 것도 가능하다. 변경한 것을 메인테이너에게 보내거나 Upstream에 Push 한다. /////////////////// -This gives us a way to have a workflow somewhat similar to the submodule workflow without using submodules (which we will cover in <<_git_submodules>>). +This gives us a way to have a workflow somewhat similar to the submodule workflow without using submodules (which we will cover in <>). We can keep branches with other related projects in our repository and subtree merge them into our project occasionally. It is nice in some ways, for example all the code is committed to a single place. However, it has other drawbacks in that it's a bit more complex and easier to make mistakes in reintegrating changes or accidentally pushing a branch into an unrelated repository. /////////////////// -이런 방식은 서브모듈(<<_git_submodules>>에서 자세하게 다룬다)을 사용하지 않고 서브모듈을 관리하는 또 다른 워크플로이다. +이런 방식은 서브모듈(<>에서 자세하게 다룬다)을 사용하지 않고 서브모듈을 관리하는 또 다른 워크플로이다. 한 저장소 안에 다른 프로젝트까지 유지하면서 서브트리 Merge 전략으로 업데이트도 할 수 있다. 프로젝트에 필요한 코드를 한 저장소에서 관리할 수 있다. 다만, 이렇게 저장소를 관리하는 방법은 저장소를 다루기 좀 복잡하고 통합할 때 실수하기 쉽다. 엉뚱한 저장소로 Push 해버릴 가능성도 있다. diff --git a/book/08-customizing-git/sections/attributes.asc b/book/08-customizing-git/sections/attributes.asc index 98e8f904..2127fe8e 100644 --- a/book/08-customizing-git/sections/attributes.asc +++ b/book/08-customizing-git/sections/attributes.asc @@ -246,7 +246,7 @@ You can easily see that the file size and image dimensions have both changed. ////////////////////////// 이미지 파일의 크기와 해상도가 달라진 것을 쉽게 알 수 있다. -[[_keyword_expansion]] +[[r_keyword_expansion]] ////////////////////////// ==== Keyword Expansion ////////////////////////// @@ -313,15 +313,15 @@ CVS나 SVN의 키워드 치환(Keyword Substitution)을 써봤으면 날짜(Date ////////////////////////// It turns out that you can write your own filters for doing substitutions in files on commit/checkout. These are called ``clean'' and ``smudge'' filters. -In the `.gitattributes` file, you can set a filter for particular paths and then set up scripts that will process files just before they're checked out (``smudge'', see <>) and just before they're staged (``clean'', see <>). +In the `.gitattributes` file, you can set a filter for particular paths and then set up scripts that will process files just before they're checked out (``smudge'', see <>) and just before they're staged (``clean'', see <>). These filters can be set to do all sorts of fun things. ////////////////////////// Commit/Checkout 할 때 사용하는 필터를 직접 만들어 쓸 수 있다. 방향에 따라 ``clean'' 필터와 ``smudge'' 필터라고 부른다. -".gitattributes" 파일에 설정하고 파일 경로마다 다른 필터를 설정할 수 있다. Checkout 할 때 파일을 처리하는 것이 ``smudge'' 필터이고(<>) 커밋할 때 처리하는 필터가 ``clean''(<>) 필터이다. +".gitattributes" 파일에 설정하고 파일 경로마다 다른 필터를 설정할 수 있다. Checkout 할 때 파일을 처리하는 것이 ``smudge'' 필터이고(<>) 커밋할 때 처리하는 필터가 ``clean''(<>) 필터이다. 이 필터로 할 수 있는 일은 무궁무진하다. -[[filters_a]] +[[rfilters_a]] ////////////////////////// .The ``smudge'' filter is run on checkout. image::images/smudge.png[The ``smudge'' filter is run on checkout.] @@ -329,7 +329,7 @@ image::images/smudge.png[The ``smudge'' filter is run on checkout.] .``smudge'' 필터는 Checkout 할 때 실행됨. image::images/smudge.png[``smudge'' 필터는 Checkout 할 때 실행됨.] -[[filters_b]] +[[rfilters_b]] ////////////////////////// .The ``clean'' filter is run when files are staged. image::images/clean.png[The ``clean'' filter is run when files are staged.] diff --git a/book/08-customizing-git/sections/config.asc b/book/08-customizing-git/sections/config.asc index 59d2253a..d0e81f80 100644 --- a/book/08-customizing-git/sections/config.asc +++ b/book/08-customizing-git/sections/config.asc @@ -1,4 +1,4 @@ -[[_git_config]] +[[r_git_config]] ////////////////////////// === Git Configuration ////////////////////////// @@ -6,10 +6,10 @@ (((git commands, config))) ////////////////////////// -As you briefly saw in <<_getting_started>>, you can specify Git configuration settings with the `git config` command. +As you briefly saw in <>, you can specify Git configuration settings with the `git config` command. One of the first things you did was set up your name and email address: ////////////////////////// -<<_getting_started>> 에서 `git config` 명령을 사용했다. +<> 에서 `git config` 명령을 사용했다. 제일 먼저 해야 하는 것은 `git config` 명령으로 이름과 이메일 주소를 설정하는 것이다. [source,console] @@ -197,10 +197,10 @@ If you run that, Git will page the entire output of all commands, no matter how (((GPG))) ////////////////////////// -If you're making signed annotated tags (as discussed in <<_signing>>), setting your GPG signing key as a configuration setting makes things easier. +If you're making signed annotated tags (as discussed in <>), setting your GPG signing key as a configuration setting makes things easier. Set your key ID like so: ////////////////////////// -이 설정은 <<_signing>> 에서 설명했던 Annotated Tag를 만들 때 유용하다. 사용할 GPG 키를 설정해 둘 수 있다. +이 설정은 <> 에서 설명했던 Annotated Tag를 만들 때 유용하다. 사용할 GPG 키를 설정해 둘 수 있다. 아래처럼 GPG 키를 설정하면 서명할 때 편리하다. [source,console] @@ -222,9 +222,9 @@ $ git tag -s (((excludes)))(((.gitignore))) ////////////////////////// -You can put patterns in your project's `.gitignore` file to have Git not see them as untracked files or try to stage them when you run `git add` on them, as discussed in <<_ignoring>>. +You can put patterns in your project's `.gitignore` file to have Git not see them as untracked files or try to stage them when you run `git add` on them, as discussed in <>. ////////////////////////// -Git에서 `git add` 명령으로 추적할 파일에 포함하지 않을 파일은 `.gitignore`에 해당 패턴을 적으면 된다고 <<_ignoring>>에서 설명했다. +Git에서 `git add` 명령으로 추적할 파일에 포함하지 않을 파일은 `.gitignore`에 해당 패턴을 적으면 된다고 <>에서 설명했다. ////////////////////////// But sometimes you want to ignore certain files for all repositories that you work with. @@ -366,7 +366,7 @@ If you want an attribute like bold in the previous example, you can choose from 컬러는 `normal`, `black`, `red`, `green`, `yellow`, `blue`, `magenta`, `cyan`, `white` 중에서 고를 수 있다. 텍스트 속성은 `bold`, `dim`, `ul` (underline), `blink`, `reverse` 중에서 고를 수 있다. -[[_external_merge_tools]] +[[r_external_merge_tools]] ////////////////////////// ==== External Merge and Diff Tools ////////////////////////// @@ -774,8 +774,8 @@ $ git config --system receive.denyDeletes true ////////////////////////// This denies any deletion of branches or tags – no user can do it. To remove remote branches, you must remove the ref files from the server manually. -There are also more interesting ways to do this on a per-user basis via ACLs, as you'll learn in <<_an_example_git_enforced_policy>>. +There are also more interesting ways to do this on a per-user basis via ACLs, as you'll learn in <>. ////////////////////////// 이제 브랜치나 Tag를 삭제하는 Push는 거절된다. 아무도 삭제할 수 없다. 리모트 브랜치를 삭제하려면 직접 손으로 server의 ref 파일을 삭제해야 한다. -그리고 사용자마다 다른 정책을 적용시키는 ACL을 만드는 방법도 있다. 이 방법은 <<_an_example_git_enforced_policy>> 에서 다룬다. +그리고 사용자마다 다른 정책을 적용시키는 ACL을 만드는 방법도 있다. 이 방법은 <> 에서 다룬다. diff --git a/book/08-customizing-git/sections/hooks.asc b/book/08-customizing-git/sections/hooks.asc index 67138040..ec0f54ac 100644 --- a/book/08-customizing-git/sections/hooks.asc +++ b/book/08-customizing-git/sections/hooks.asc @@ -1,4 +1,4 @@ -[[_git_hooks]] +[[r_git_hooks]] === Git Hooks (((hooks))) @@ -56,12 +56,12 @@ This section splits them into committing-workflow hooks, email-workflow scripts, ////////////////////////// ==== It's important to note that client-side hooks are *not* copied when you clone a repository. -If your intent with these scripts is to enforce a policy, you'll probably want to do that on the server side; see the example in <<_an_example_git_enforced_policy>>. +If your intent with these scripts is to enforce a policy, you'll probably want to do that on the server side; see the example in <>. ==== ////////////////////////// ==== 여기서 한가지 알아둘 점은 저장소를 Clone 해도 클라이언트 훅은 복사되지 않는다는 점이다. -만든 정책이 반드시 적용되도록 하려면 서버 훅을 이용해야만 하며 작성은 <<_an_example_git_enforced_policy>> 부분을 참고한다. +만든 정책이 반드시 적용되도록 하려면 서버 훅을 이용해야만 하며 작성은 <> 부분을 참고한다. ==== ////////////////////////// @@ -116,7 +116,7 @@ Generally, this script is used for notification or something similar. 이 훅은 넘겨받는 아규먼트가 하나도 없지만 커밋 해시정보는 `git log -1 HEAD` 명령으로 쉽게 가져올 수 있다. 일반적으로 이 스크립트는 커밋된 것을 누군가 혹은 다른 프로그램에게 알릴 때 사용한다. -[[_email_hooks]] +[[r_email_hooks]] ////////////////////////// ===== Email Workflow Hooks ////////////////////////// @@ -162,7 +162,7 @@ You can't stop the patching process with this script. 이 스크립트를 이용하면 자동으로 Patch를 보낸 사람이나 그룹에게 알림 메시지를 보낼 수 있다. 이 스크립트로는 Patch를 중단시킬 수 없다. -[[_other_client_hooks]] +[[r_other_client_hooks]] ////////////////////////// ===== Other Client Hooks ////////////////////////// diff --git a/book/08-customizing-git/sections/policy.asc b/book/08-customizing-git/sections/policy.asc index 3e4bbc79..16f5eae4 100644 --- a/book/08-customizing-git/sections/policy.asc +++ b/book/08-customizing-git/sections/policy.asc @@ -1,4 +1,4 @@ -[[_an_example_git_enforced_policy]] +[[r_an_example_git_enforced_policy]] ////////////////////////// === An Example Git-Enforced Policy ////////////////////////// @@ -69,7 +69,7 @@ Don't judge – it's easier to demonstrate this way. 스크립트에서 전역변수를 쓰고 있지만 데모의 이해를 돕기 위해서니 너무 나무라지는 마시길 바란다. -[[_enforcing_commit_message_format]] +[[r_enforcing_commit_message_format]] ////////////////////////// ===== Enforcing a Specific Commit-Message Format ////////////////////////// @@ -111,11 +111,11 @@ You can take that output, loop through each of those commit SHAs, grab the messa ////////////////////////// You have to figure out how to get the commit message from each of these commits to test. To get the raw commit data, you can use another plumbing command called `git cat-file`. -We'll go over all these plumbing commands in detail in <<_git_internals>>; but for now, here's what that command gives you: +We'll go over all these plumbing commands in detail in <>; but for now, here's what that command gives you: ////////////////////////// 커밋 메시지를 얻는 방법을 알아보자. 커밋의 raw 데이터는 `git cat-file`이라는 Plumbing 명령어로 얻을 수 있다. -<<_git_internals>> 에서 Plumbing 명령어에 대해 자세히 다루니까 지금은 커밋 메시지 얻는 것에 집중하자. +<> 에서 Plumbing 명령어에 대해 자세히 다루니까 지금은 커밋 메시지 얻는 것에 집중하자. [source,console] ---- @@ -261,9 +261,9 @@ Now that you have the permissions sorted out, you need to determine what paths t 이렇게 사용할 권한 정보를 만들었다. 이제 Push 하는 파일을 그 사용자가 Push 할 수 있는지 없는지 알아내야 한다. ////////////////////////// -You can pretty easily see what files have been modified in a single commit with the `--name-only` option to the `git log` command (mentioned briefly in <<_git_basics_chapter>>): +You can pretty easily see what files have been modified in a single commit with the `--name-only` option to the `git log` command (mentioned briefly in <>): ////////////////////////// -`git log` 명령에 `--name-only` 옵션을 주면 해당 커밋에서 수정된 파일이 뭔지 알려준다(`git log` 명령은 <<_git_basics_chapter>>에서 다루었다). +`git log` 명령에 `--name-only` 옵션을 주면 해당 커밋에서 수정된 파일이 뭔지 알려준다(`git log` 명령은 <>에서 다루었다). [source,console] ---- @@ -628,10 +628,10 @@ end ---- ////////////////////////// -This script uses a syntax that wasn't covered in <<_revision_selection>>. +This script uses a syntax that wasn't covered in <>. You get a list of commits that have already been pushed up by running this: ////////////////////////// -이 스크립트는 <<_revision_selection>> 절에서 설명하지 않은 표현을 사용했다. +이 스크립트는 <> 절에서 설명하지 않은 표현을 사용했다. 아래의 표현은 이미 Push 한 커밋 목록을 얻어오는 부분이다. [source,ruby] diff --git a/book/09-git-and-other-scms/sections/client-p4.asc b/book/09-git-and-other-scms/sections/client-p4.asc index ccbe81f6..95471e7e 100644 --- a/book/09-git-and-other-scms/sections/client-p4.asc +++ b/book/09-git-and-other-scms/sections/client-p4.asc @@ -26,7 +26,7 @@ Perforce와 Git을 함께 사용하는 방법은 두 가지다. 첫 번째는 Perforce가 제공하는 ``Git Fusion''이다. Perforce Depot의 서브트리를 읽고 쓸 수 있는 Git 저장소로 노출 시켜 준다. 두 번째 방법은 git-p4라는 클라이언트 Bridge를 사용하여 Git을 Perforce의 클라이언트로 사용하는 것이다. 이 방법은 Perforce 서버를 건드리지 않아도 된다. -[[_p4_git_fusion]] +[[r_p4_git_fusion]] ===== Git Fusion (((Perforce, Git Fusion))) @@ -865,7 +865,7 @@ Rebase 하고 나서 전송한 것처럼 히스토리가 일직선이 됐다. 이 결과는 Git으로 자유롭게 브랜치를 만들고 버리고 Merge 해도 된다는 것을 말해준다. 히스토리가 Perforce에 맞지 않더라도 걱정할 필요 없다. 물론 직접 Rebase 해서 Perforce 서버로 전송해도 된다. -[[_git_p4_branches]] +[[r_git_p4_branches]] ////////////////////////// ====== Branching ////////////////////////// diff --git a/book/09-git-and-other-scms/sections/client-svn.asc b/book/09-git-and-other-scms/sections/client-svn.asc index b893464b..54875474 100644 --- a/book/09-git-and-other-scms/sections/client-svn.asc +++ b/book/09-git-and-other-scms/sections/client-svn.asc @@ -1,4 +1,4 @@ -[[_git_svn]] +[[r_git_svn]] ////////////////////////// ==== Git and Subversion ////////////////////////// diff --git a/book/09-git-and-other-scms/sections/import-custom.asc b/book/09-git-and-other-scms/sections/import-custom.asc index 8dd41d0c..59edde28 100644 --- a/book/09-git-and-other-scms/sections/import-custom.asc +++ b/book/09-git-and-other-scms/sections/import-custom.asc @@ -1,4 +1,4 @@ -[[_custom_importer]] +[[r_custom_importer]] ////////////////////////// ==== A Custom Importer ////////////////////////// @@ -10,14 +10,14 @@ If your system isn't one of the above, you should look for an importer online – quality importers are available for many other systems, including CVS, Clear Case, Visual Source Safe, even a directory of archives. If none of these tools works for you, you have a more obscure tool, or you otherwise need a more custom importing process, you should use `git fast-import`. This command reads simple instructions from stdin to write specific Git data. -It's much easier to create Git objects this way than to run the raw Git commands or try to write the raw objects (see <<_git_internals>> for more information). +It's much easier to create Git objects this way than to run the raw Git commands or try to write the raw objects (see <> for more information). This way, you can write an import script that reads the necessary information out of the system you're importing from and prints straightforward instructions to stdout. You can then run this program and pipe its output through `git fast-import`. ////////////////////////// 사용하는 VCS가 앞서 살펴본 시스템이 아니면 인터넷에서 적당한 Importer를 찾아봐야 한다. CVS, Clear Case, Visual Source Safe 같은 시스템용 Importer가 좋은게 많다. 심지어 단순히 디렉토리 아카이브용 Importer에도 좋은게 있다. 사람들이 잘 안쓰는 시스템을 사용하고 있는데 적당한 Importer를 못 찾았거나 부족해서 좀 더 고쳐야 한다면 `git fast-import`를 사용한다. 이 명령은 표준입력으로 데이터를 입력받는다. -<<_git_internals>> 에서 배우는 저수준 명령어와 내부 객체를 직접 다루는 것보다 훨씬 쉽다. +<> 에서 배우는 저수준 명령어와 내부 객체를 직접 다루는 것보다 훨씬 쉽다. 먼저 사용하는 VCS에서 필요한 정보를 수집해서 표준출력으로 출력하는 스크립트를 만든다. 그리고 그 결과를 `git fast-import`의 표준입력으로 보낸다. @@ -52,11 +52,11 @@ Importer를 만들기 전에 우선 Git이 어떻게 데이터를 저장하는 그러면 디렉토리마다 스냅샷을 만들고, 그 스냅샷을 가리키는 커밋 개체를 만들고, 이전 커밋과 연결 시킨다. ////////////////////////// -As we did in <<_an_example_git_enforced_policy>>, we'll write this in Ruby, because it's what we generally work with and it tends to be easy to read. +As we did in <>, we'll write this in Ruby, because it's what we generally work with and it tends to be easy to read. You can write this example pretty easily in anything you're familiar with – it just needs to print the appropriate information to `stdout`. And, if you are running on Windows, this means you'll need to take special care to not introduce carriage returns at the end your lines – `git fast-import` is very particular about just wanting line feeds (LF) not the carriage return line feeds (CRLF) that Windows uses. ////////////////////////// -<<_an_example_git_enforced_policy>> 절에서 했던 것 처럼 Ruby로 스크립트를 작성한다. 책에서 계속 스크립트를 작성할 때 Ruby로 해왔고, 읽기도 쉽기에 Ruby를 쓴다. +<> 절에서 했던 것 처럼 Ruby로 스크립트를 작성한다. 책에서 계속 스크립트를 작성할 때 Ruby로 해왔고, 읽기도 쉽기에 Ruby를 쓴다. 하지만 자신에게 익숙한 것을 사용해서 표준출력으로 적절한 정보만 출력할 수 있으면 된다. 그리고 Windows에서는 라인 바꿈 문자에 CR(Carriage Return) 문자가 들어가지 않도록 주의해야 한다. `git fast-import` 명령은 Windows에서도 라인 바꿈 문자로 CRLF 문자가 아니라 LF(Line Feed) 문자만 허용한다. diff --git a/book/09-git-and-other-scms/sections/import-p4.asc b/book/09-git-and-other-scms/sections/import-p4.asc index 5036d911..81cc05e2 100644 --- a/book/09-git-and-other-scms/sections/import-p4.asc +++ b/book/09-git-and-other-scms/sections/import-p4.asc @@ -1,4 +1,4 @@ -[[_perforce_import]] +[[r_perforce_import]] ==== Perforce (((Perforce)))(((Importing, from Perforce))) @@ -13,16 +13,16 @@ Perforce와 Git으로 변환하는 방법도 git-p4와 Perforce Git Fusion을 ////////////////////////// Git Fusion makes this process fairly painless. -Just configure your project settings, user mappings, and branches using a configuration file (as discussed in <<_p4_git_fusion>>), and clone the repository. +Just configure your project settings, user mappings, and branches using a configuration file (as discussed in <>), and clone the repository. Git Fusion leaves you with what looks like a native Git repository, which is then ready to push to a native Git host if you desire. You could even use Perforce as your Git host if you like. ////////////////////////// Git Fusion을 사용한다면 큰 어려울게 없다. -그저 프로젝트 정보, 사용자 매핑, 브랜치를 설정파일에 설정하고(<<_p4_git_fusion>>에서 다룸) Perforce 저장소를 Clone 하기만 하면 된다. +그저 프로젝트 정보, 사용자 매핑, 브랜치를 설정파일에 설정하고(<>에서 다룸) Perforce 저장소를 Clone 하기만 하면 된다. Git Fusion은 마치 Git 저장소를 Clone 한 것 처럼 느끼게 해준다. Clone 했으면 Git 서버에 Push 한다. 심지어 다시 Perforce 서버로 Push 해도 된다. -[[_git_p4]] +[[r_git_p4]] ===== Git-p4 ////////////////////////// @@ -68,10 +68,10 @@ Importing revision 9957 (100%) ////////////////////////// This particular project has only one branch, but if you have branches that are configured with branch views (or just a set of directories), you can use the `--detect-branches` flag to `git p4 clone` to import all the project's branches as well. -See <<_git_p4_branches>> for a bit more detail on this. +See <> for a bit more detail on this. ////////////////////////// 예제로 사용하는 이 프로젝트는 브랜치가 하나뿐이다. 만약 Clone 할 프로젝트에 브랜치가 여러개 있거나 브랜치가 디렉토리로 구성돼 있다면 `--detect-branches` 옵션을 사용하여 브랜치 정보를 Git 저장소로 그대로 들고올 수 있다. -<<_git_p4_branches>> 에서 자세한 내용을 살펴볼 수 있다. +<> 에서 자세한 내용을 살펴볼 수 있다. ////////////////////////// At this point you're almost done. diff --git a/book/09-git-and-other-scms/sections/import-tfs.asc b/book/09-git-and-other-scms/sections/import-tfs.asc index adbc5935..b1df7bd4 100644 --- a/book/09-git-and-other-scms/sections/import-tfs.asc +++ b/book/09-git-and-other-scms/sections/import-tfs.asc @@ -1,4 +1,4 @@ -[[_git_tfs]] +[[r_git_tfs]] ==== TFS (((TFS)))(((Importing, from TFS))) diff --git a/book/10-git-internals/sections/environment.asc b/book/10-git-internals/sections/environment.asc index 3b7d6eb5..15a30c48 100644 --- a/book/10-git-internals/sections/environment.asc +++ b/book/10-git-internals/sections/environment.asc @@ -416,11 +416,11 @@ It's probably easier just to use the `~/.ssh/config` file for that. ////////////////////////// *`GIT_ASKPASS`* is an override for the `core.askpass` configuration value. This is the program invoked whenever Git needs to ask the user for credentials, which can expect a text prompt as a command-line argument, and should return the answer on `stdout`. -(See <<_credential_caching>> for more on this subsystem.) +(See <> for more on this subsystem.) ////////////////////////// *`GIT_ASKPASS`* 변수는 `core.askpass` 설정보다 우선한다. 이 변수에 설정하는 스크립트나 프로그램은 Git이 사용자에게 암호를 입력받는 상황에서 실행되어 `stdout` 표준출력으로 출력하는 메시지를 암호로 받아서 처리한다. -(<<_credential_caching>> 에서 더 자세한 내용을 확인할 수 있다.) +(<> 에서 더 자세한 내용을 확인할 수 있다.) ////////////////////////// *`GIT_NAMESPACE`* controls access to namespaced refs, and is equivalent to the `--namespace` flag. diff --git a/book/10-git-internals/sections/maintenance.asc b/book/10-git-internals/sections/maintenance.asc index 8308b7dd..2dde880b 100644 --- a/book/10-git-internals/sections/maintenance.asc +++ b/book/10-git-internals/sections/maintenance.asc @@ -10,7 +10,7 @@ This section will cover some of these scenarios. 언젠가는 저장소를 손수 정리해야 할 날이 올지도 모른다. 저장소를 좀 더 알차게(Compact) 만들고, 다른 VCS에서 임포트하고 나서 그 잔재를 치운다든가, 아니면 문제가 생겨서 복구해야 할 수도 있다. 이 절은 이럴 때 필요한 것을 설명한다. -[[_git_gc]] +[[r_git_gc]] ////////////////////////// ==== Maintenance ////////////////////////// @@ -96,7 +96,7 @@ This means the tag directly above is an annotated tag and that line is the commi 마지막에 있는 `^`로 시작하는 라인을 살펴보자. 이것은 바로 윗줄의 태그가 Annotated 태그라는 것을 말해준다. 해당 커밋은 윗 태그가 가리키는 커밋이라는 뜻이다. -[[_data_recovery]] +[[r_data_recovery]] ////////////////////////// ==== Data Recovery ////////////////////////// @@ -156,12 +156,12 @@ SHA 값을 외웠을 리도 없고 뭔가 찾아낼 방법이 필요하다. Often, the quickest way is to use a tool called `git reflog`. As you're working, Git silently records what your HEAD is every time you change it. Each time you commit or change branches, the reflog is updated. -The reflog is also updated by the `git update-ref` command, which is another reason to use it instead of just writing the SHA value to your ref files, as we covered in <<_git_refs>>. +The reflog is also updated by the `git update-ref` command, which is another reason to use it instead of just writing the SHA value to your ref files, as we covered in <>. You can see where you've been at any time by running `git reflog`: ////////////////////////// 보통 `git reflog` 명령을 사용하는 게 가장 쉽다. HEAD가 가리키는 커밋이 바뀔 때마다 Git은 남몰래 자동으로 그 커밋이 무엇인지 기록한다. -새로 커밋하거나 브랜치를 바꾸면 Reflog도 늘어난다. <<_git_refs>> 절에서 배운 `git update-ref` 명령으로도 Reflog를 남길 수 있다. 이런 상황을 대비할 수 있다는 점이 `git update-ref`를 꼭 사용해야 하는 이유 중 하나다. +새로 커밋하거나 브랜치를 바꾸면 Reflog도 늘어난다. <> 절에서 배운 `git update-ref` 명령으로도 Reflog를 남길 수 있다. 이런 상황을 대비할 수 있다는 점이 `git update-ref`를 꼭 사용해야 하는 이유 중 하나다. `git reflog` 명령만 실행하면 언제나 발자취를 돌아볼 수 있다. [source,console] @@ -260,7 +260,7 @@ You can recover it the same way, by adding a branch that points to that SHA. 이 Dangling 커밋이 잃어버린 커밋이니까 그 SHA를 가리키는 브랜치를 만들어 복구할 수 있다. -[[_removing_objects]] +[[r_removing_objects]] ////////////////////////// ==== Removing Objects ////////////////////////// @@ -398,13 +398,13 @@ dadf7258d699da2c8d89b09ef6670edb7d5f91b4 commit 229 159 12 ////////////////////////// The big object is at the bottom: 5MB. -To find out what file it is, you'll use the `rev-list` command, which you used briefly in <<_enforcing_commit_message_format>>. +To find out what file it is, you'll use the `rev-list` command, which you used briefly in <>. If you pass `--objects` to `rev-list`, it lists all the commit SHAs and also the blob SHAs with the file paths associated with them. You can use this to find your blob's name: ////////////////////////// 마지막에 있는 개체가 5MB로 가장 크다. 이제 그 파일이 정확히 무슨 파일인지 알아내야 한다. -<<_enforcing_commit_message_format>> 에서 소개했던 `rev-list` 명령에 `--objects` 옵션을 추가하면 커밋의 SHA 값과 Blob 개체의 파일이름, SHA 값을 보여준다. +<> 에서 소개했던 `rev-list` 명령에 `--objects` 옵션을 추가하면 커밋의 SHA 값과 Blob 개체의 파일이름, SHA 값을 보여준다. 그 결과에서 해당 Blob의 이름을 찾는다. [source,console] @@ -429,10 +429,10 @@ dadf725 oops - removed large tarball ////////////////////////// You must rewrite all the commits downstream from `7b30847` to fully remove this file from your Git history. -To do so, you use `filter-branch`, which you used in <<_rewriting_history>>: +To do so, you use `filter-branch`, which you used in <>: ////////////////////////// 이 파일을 히스토리에서 완전히 삭제하면 `6df76` 이후 커밋은 모두 재작성된다. -<<_rewriting_history>> 에서 배운 `filter-branch` 명령으로 삭제한다. +<> 에서 배운 `filter-branch` 명령으로 삭제한다. [source,console] ---- @@ -444,9 +444,9 @@ Ref 'refs/heads/master' was rewritten ---- ////////////////////////// -The `--index-filter` option is similar to the `--tree-filter` option used in <<_rewriting_history>>, except that instead of passing a command that modifies files checked out on disk, you're modifying your staging area or index each time. +The `--index-filter` option is similar to the `--tree-filter` option used in <>, except that instead of passing a command that modifies files checked out on disk, you're modifying your staging area or index each time. ////////////////////////// -`--index-filter` 옵션은 <<_rewriting_history>> 에서 배운 `--tree-filter`와 비슷하다. `--tree-filter`는 디스크에 Checkout 해서 파일을 수정하지만 `--index-filter`는 Staging Area에서 수정한다. +`--index-filter` 옵션은 <> 에서 배운 `--tree-filter`와 비슷하다. `--tree-filter`는 디스크에 Checkout 해서 파일을 수정하지만 `--index-filter`는 Staging Area에서 수정한다. ////////////////////////// Rather than remove a specific file with something like `rm file`, you have to remove it with `git rm --cached` – you must remove it from the index, not from disk. diff --git a/book/10-git-internals/sections/objects.asc b/book/10-git-internals/sections/objects.asc index 541b2d9e..02ec0ef4 100644 --- a/book/10-git-internals/sections/objects.asc +++ b/book/10-git-internals/sections/objects.asc @@ -1,4 +1,4 @@ -[[_objects]] +[[r_objects]] ////////////////////////// === Git Objects ////////////////////////// @@ -171,7 +171,7 @@ $ git cat-file -t 1f7a7a472abf3dd9643fd615f6da379c4acb3e3a blob ---- -[[_tree_objects]] +[[r_tree_objects]] ////////////////////////// ==== Tree Objects ////////////////////////// @@ -347,7 +347,7 @@ image::images/data-model-2.png[The content structure of your current Git data.] .현재 Git 데이터 구조. image::images/data-model-2.png[현재 Git 데이터 구조.] -[[_git_commit_objects]] +[[r_git_commit_objects]] ////////////////////////// ==== Commit Objects ////////////////////////// diff --git a/book/10-git-internals/sections/plumbing-porcelain.asc b/book/10-git-internals/sections/plumbing-porcelain.asc index d20b2c2f..88a01e32 100644 --- a/book/10-git-internals/sections/plumbing-porcelain.asc +++ b/book/10-git-internals/sections/plumbing-porcelain.asc @@ -1,4 +1,4 @@ -[[_plumbing_porcelain]] +[[r_plumbing_porcelain]] ////////////////////////// === Plumbing and Porcelain ////////////////////////// @@ -49,12 +49,12 @@ refs/ You may see some other files in there, but this is a fresh `git init` repository – it's what you see by default. The `description` file is only used by the GitWeb program, so don't worry about it. The `config` file contains your project-specific configuration options, and the `info` directory keeps a global exclude file (((excludes))) for ignored patterns that you don't want to track in a .gitignore file. -The `hooks` directory contains your client- or server-side hook scripts, which are discussed in detail in <<_git_hooks>>. +The `hooks` directory contains your client- or server-side hook scripts, which are discussed in detail in <>. ////////////////////////// 이 외에 다른 파일들이 더 있지만, 이 상태가 `git init` 명령을 실행한 직후에 보이는 새 저장소의 모습이다. `description` 파일은 기본적으로 GitWeb 프로그램에서만 사용하기 때문에 이 파일은 신경쓰지 않아도 된다. `config` 파일에는 해당 프로젝트에만 적용되는 설정 옵션이 들어 있다. `info` 디렉토리는 .gitignore 파일처럼 무시할 파일의 패턴을 적어 두는 곳이다. 하지만 .gitignore 파일과는 달리 Git으로 관리되지 않는다. -`hooks` 디렉토리에는 클라이언트 훅이나 서버 훅이 위치한다. 관련 내용은 <<_git_hooks>> 에서 설명한다. +`hooks` 디렉토리에는 클라이언트 훅이나 서버 훅이 위치한다. 관련 내용은 <> 에서 설명한다. ////////////////////////// This leaves four important entries: the `HEAD` and (yet to be created) `index` files, and the `objects` and `refs` directories. diff --git a/book/10-git-internals/sections/refs.asc b/book/10-git-internals/sections/refs.asc index 7de399be..d44e15a7 100644 --- a/book/10-git-internals/sections/refs.asc +++ b/book/10-git-internals/sections/refs.asc @@ -1,4 +1,4 @@ -[[_git_refs]] +[[r_git_refs]] ////////////////////////// === Git References ////////////////////////// @@ -102,7 +102,7 @@ When you run commands like `git branch (branchname)`, Git basically runs that `u ////////////////////////// `git branch (branchname)` 명령을 실행하면 Git은 내부적으로 `update-ref` 명령을 실행한다. 입력받은 브랜치 이름과 현 브랜치의 마지막 커밋의 SHA-1 값을 가져다 `update-ref` 명령을 실행한다. -[[_the_head]] +[[r_the_head]] ////////////////////////// ==== The HEAD ////////////////////////// @@ -199,10 +199,10 @@ It's like a branch reference, but it never moves – it always points to the sam 브랜치처럼 커밋 개체를 가리키지만 옮길 수는 없다. 태그 개체는 늘 그 이름이 뜻하는 커밋만 가리킨다. ////////////////////////// -As discussed in <<_git_basics_chapter>>, there are two types of tags: annotated and lightweight. +As discussed in <>, there are two types of tags: annotated and lightweight. You can make a lightweight tag by running something like this: ////////////////////////// -<<_git_basics_chapter>> 에서 배웠듯 태그는 Annotated 태그와 Lightweight 태그 두 종류로 나뉜다. +<> 에서 배웠듯 태그는 Annotated 태그와 Lightweight 태그 두 종류로 나뉜다. 먼저 아래와 같이 Lightweight 태그를 만들어 보자. [source,console] diff --git a/book/10-git-internals/sections/refspec.asc b/book/10-git-internals/sections/refspec.asc index c99366e4..8c1b9e71 100644 --- a/book/10-git-internals/sections/refspec.asc +++ b/book/10-git-internals/sections/refspec.asc @@ -1,4 +1,4 @@ -[[_refspec]] +[[r_refspec]] ////////////////////////// === The Refspec ////////////////////////// @@ -147,7 +147,7 @@ If you have a complex workflow process that has a QA team pushing branches, deve ////////////////////////// 좀 더 복잡한 것도 가능하다. QA 팀뿐만 아니라, 일반 개발자, 통합 팀 등이 사용하는 브랜치를 네임스페이스 별로 구분해 놓으면 좀 더 Git을 편리하게 사용할 수 있다. -[[_pushing_refspecs]] +[[r_pushing_refspecs]] ////////////////////////// ==== Pushing Refspecs ////////////////////////// diff --git a/book/A-git-in-other-environments/sections/guis.asc b/book/A-git-in-other-environments/sections/guis.asc index 7c563d11..3074fb61 100644 --- a/book/A-git-in-other-environments/sections/guis.asc +++ b/book/A-git-in-other-environments/sections/guis.asc @@ -229,10 +229,10 @@ If you already have a local repository, just drag its directory from the Finder ////////////////////////// Once it's installed and configured, you can use the GitHub client for many common Git tasks. The intended workflow for this tool is sometimes called the ``GitHub Flow.'' -We cover this in more detail in <<_github_flow>>, but the general gist is that (a) you'll be committing to a branch, and (b) you'll be syncing up with a remote repository fairly regularly. +We cover this in more detail in <>, but the general gist is that (a) you'll be committing to a branch, and (b) you'll be syncing up with a remote repository fairly regularly. ////////////////////////// 설치하고 설정을 마쳤으면 평소 Git을 사용하듯이 GitHub 클라이언트를 사용할 수 있다. -이 툴은 <<_github_flow>>에서 설명한 ``GitHub Flow''를 지원하도록 설계했다. +이 툴은 <>에서 설명한 ``GitHub Flow''를 지원하도록 설계했다. 하지만 하는 일을 매우 단순하게 나눠보면 브랜치에 커밋하거나 리모트 저장소와 동기화 시키는 일로 나눠 볼 수 있다. ////////////////////////// diff --git a/book/A-git-in-other-environments/sections/powershell.asc b/book/A-git-in-other-environments/sections/powershell.asc index 0734db1e..c06fc0ac 100644 --- a/book/A-git-in-other-environments/sections/powershell.asc +++ b/book/A-git-in-other-environments/sections/powershell.asc @@ -1,4 +1,4 @@ -[[_git_powershell]] +[[r_git_powershell]] ////////////////////////// === Git in Powershell ////////////////////////// diff --git a/book/A-git-in-other-environments/sections/visualstudio.asc b/book/A-git-in-other-environments/sections/visualstudio.asc index 5e5900f4..41bf73a0 100644 --- a/book/A-git-in-other-environments/sections/visualstudio.asc +++ b/book/A-git-in-other-environments/sections/visualstudio.asc @@ -30,15 +30,15 @@ image::images/vs-1.png[Team Explorer에서 Git 저장소에 연결하기.] ////////////////////////// Visual Studio remembers all of the projects you've opened that are Git-controlled, and they're available in the list at the bottom. If you don't see the one you want there, click the "Add" link and type in the path to the working directory. -Double clicking on one of the local Git repositories leads you to the Home view, which looks like <>. +Double clicking on one of the local Git repositories leads you to the Home view, which looks like <>. This is a hub for performing Git actions; when you're _writing_ code, you'll probably spend most of your time in the "Changes" view, but when it comes time to pull down changes made by your teammates, you'll use the "Unsynced Commits" and "Branches" views. ////////////////////////// Visual Studio는 한 번 열었던 Git 프로젝트는 모두 저장해두기 때문에 하단에 있는 목록에서 찾을 수 있다. 찾는 프로젝트가 목록에 없으면 "Add" 링크를 클릭해서 워킹 디렉토리의 경로를 입력한다. -로컬 Git 저장소 중 하나를 더블 클릭하면 Home 뷰로 이동한다. Home 뷰는 <> 처럼 생겼다. +로컬 Git 저장소 중 하나를 더블 클릭하면 Home 뷰로 이동한다. Home 뷰는 <> 처럼 생겼다. Home 뷰는 일종의 Git 센터다. 코드를 작성할 때는 "Changes" 뷰에서 많은 시간을 쓸 것이고 다른 동료가 커밋한 코드를 내려받을 때는 "Unsynced Commits"이나 "Branches" 뷰를 사용하게 된다. -[[vs_home]] +[[rvs_home]] ////////////////////////// .The "Home" view for a Git repository in Visual Studio. image::images/vs-2.png[The Home view for a Git repository in Visual Studio.] diff --git a/book/A-git-in-other-environments/sections/zsh.asc b/book/A-git-in-other-environments/sections/zsh.asc index 4439ad00..dcb3926e 100644 --- a/book/A-git-in-other-environments/sections/zsh.asc +++ b/book/A-git-in-other-environments/sections/zsh.asc @@ -91,14 +91,14 @@ vcs_info말고 Git에 들어 있는 `git-prompt.sh`를 직접 수정해서 사 Zsh is powerful enough that there are entire frameworks dedicated to making it better. One of them is called "oh-my-zsh", and it can be found at https://github.com/robbyrussell/oh-my-zsh[]. oh-my-zsh's plugin system comes with powerful git tab-completion, and it has a variety of prompt "themes", many of which display version-control data. -<> is just one example of what can be done with this system. +<> is just one example of what can be done with this system. ////////////////////////// Zsh의 강령함을 이끌어 내는 프레임워크가 있다. "oh-my-zsh"이 대표적인데 https://github.com/robbyrussell/oh-my-zsh[]에서 찾을 수 있다. Git 탭 자동완성도 "oh-my-zsh" 플러그인을 사용하면 되고 브랜치 이상의 정보를 보여주는 다양한 프롬프트 테마도 제공한다. -<>은 프롬프트 테마를 적용한 모습이다. +<>은 프롬프트 테마를 적용한 모습이다. -[[oh_my_zsh_git]] +[[roh_my_zsh_git]] ////////////////////////// .An example of an oh-my-zsh theme. image::images/zsh-oh-my.png[An example of an oh-my-zsh theme.] diff --git a/book/B-embedding-git/sections/jgit.asc b/book/B-embedding-git/sections/jgit.asc index 42be2ad2..93677a88 100644 --- a/book/B-embedding-git/sections/jgit.asc +++ b/book/B-embedding-git/sections/jgit.asc @@ -143,11 +143,11 @@ Ref 인스턴스는 태그 Ref와 개체를 나타내고 태그가 ``Peeled''인 ////////////////////////// The second line gets the target of the `master` reference, which is returned as an ObjectId instance. ObjectId represents the SHA-1 hash of an object, which might or might not exist in Git's object database. -The third line is similar, but shows how JGit handles the rev-parse syntax (for more on this, see <<_branch_references>>); you can pass any object specifier that Git understands, and JGit will return either a valid ObjectId for that object, or `null`. +The third line is similar, but shows how JGit handles the rev-parse syntax (for more on this, see <>); you can pass any object specifier that Git understands, and JGit will return either a valid ObjectId for that object, or `null`. ////////////////////////// 두 번째 라인은 `master`가 가리키는 ObjectId 인스턴스를 리턴한다. ObjectId는 객체의 SHA-1 해시 정보다. 실제로 객체가 Git 객체 데이터베이스에 존재하는지는 상관없다. -셋째 라인도 ObjectId 인스턴스를 리턴하는데 JGit에서 rev-parse 문법을 어떻게 다뤄야 하는지 보여준다. 이 문법은 <<_branch_references>>에서 설명했다. Git이 이해하는 표현은 전부 사용 가능하다. 표현식이 맞으면 해당 객체를 리턴하고 아니면 null을 리턴한다. +셋째 라인도 ObjectId 인스턴스를 리턴하는데 JGit에서 rev-parse 문법을 어떻게 다뤄야 하는지 보여준다. 이 문법은 <>에서 설명했다. Git이 이해하는 표현은 전부 사용 가능하다. 표현식이 맞으면 해당 객체를 리턴하고 아니면 null을 리턴한다. ////////////////////////// The next two lines show how to load the raw contents of an object. diff --git a/book/B-embedding-git/sections/libgit2.asc b/book/B-embedding-git/sections/libgit2.asc index c86c5750..c5675e63 100644 --- a/book/B-embedding-git/sections/libgit2.asc +++ b/book/B-embedding-git/sections/libgit2.asc @@ -50,7 +50,7 @@ There's also the `git_repository_open_ext` which includes options for searching, 저장소 경로를 정확히 모를 때는 `git_repository_open_ext` 메소드로 찾는다. `git_clone` 메소드와 관련된 메소드는 원격에 있는 저장소를 로컬에 Clone 할 때 사용한다. 그리고 `git_repository_init`은 저장소를 새로 만들 때 사용한다. ////////////////////////// -The second chunk of code uses rev-parse syntax (see <<_branch_references>> for more on this) to get the commit that HEAD eventually points to. +The second chunk of code uses rev-parse syntax (see <> for more on this) to get the commit that HEAD eventually points to. The type returned is a `git_object` pointer, which represents something that exists in the Git object database for a repository. `git_object` is actually a ``parent'' type for several different kinds of objects; the memory layout for each of the ``child'' types is the same as for `git_object`, so you can safely cast to the right one. In this case, `git_object_type(commit)` would return `GIT_OBJ_COMMIT`, so it's safe to cast to a `git_commit` pointer. @@ -162,10 +162,10 @@ commit = repo.lookup(commit_id) # <8> ////////////////////////// The Ruby code is nice and clean, but since Libgit2 is doing the heavy lifting, this code will run pretty fast, too. -If you're not a rubyist, we touch on some other bindings in <<_libgit2_bindings>>. +If you're not a rubyist, we touch on some other bindings in <>. ////////////////////////// Ruby 코드는 간결하고 깔끔하다. Libgit2을 사용하는 것이기 때문에 여전히 빠르다. -루비스트가 아니라면 <<_libgit2_bindings>>에 있는 다른 바인딩을 사용할 수 있다. +루비스트가 아니라면 <>에 있는 다른 바인딩을 사용할 수 있다. ////////////////////////// ==== Advanced Functionality @@ -272,7 +272,7 @@ Take a look at the `include/git2/sys/odb_backend.h` file in the Libgit2 source f 이 초기화 함수에서 구조체를 메모리를 할당하고 커스텀 멤버에 필요한 정보를 설정한다. 그리고 Libgit2에서 필요한 `parent` 구조체를 채운다. `include/git2/sys/odb_backend.h` 소스를 보면 `git_odb_backend` 구조체의 멤버가 어떤 것이 있는지 알 수 있다. 목적에 따라 어떻게 사용해야 하는지 확인해야 한다. -[[_libgit2_bindings]] +[[r_libgit2_bindings]] ////////////////////////// ==== Other Bindings ////////////////////////// diff --git a/book/dedication.asc b/book/dedication.asc new file mode 100644 index 00000000..2a77f47c --- /dev/null +++ b/book/dedication.asc @@ -0,0 +1,19 @@ +[dedication] +////////// +== Dedications +////////// +== 바치는 글 + +////////// +_To my wife, Becky, without whom this adventure never would have begun. — Ben_ +////////// +_나의 아내 Becky 없이는 이 모험을 시작하지 못했을 것입니다. — Ben_ + +////////// +_This edition is dedicated to my girls. +To my wife Jessica who has supported me for all of these years and to my daughter Josephine, +who will support me when I'm too old to know what's going on. — Scott_ +////////// +_이 책을 나의 여자들에게 바칩니다. +나의 아내 Jessica는 이 책을 쓰는 수년 동안 저를 지지해주었고, +나의 딸 Josephine은 제가 늙어서 정신이 없을 때쯤에 절 보살펴 줄 겁니다. — Scott_ diff --git a/book/license.asc b/book/license.asc new file mode 100644 index 00000000..490603e1 --- /dev/null +++ b/book/license.asc @@ -0,0 +1,4 @@ +[preface] +== Licence + +include::../LICENSE.asc[] diff --git a/book/preface_ben.asc b/book/preface_ben.asc new file mode 100644 index 00000000..bb2806de --- /dev/null +++ b/book/preface_ben.asc @@ -0,0 +1,20 @@ +[preface] +////////// +== Preface by Ben Straub +////////// +== Ben Straub + +////////// +The first edition of this book is what got me hooked on Git. This was my introduction to a style of making software that felt more natural than anything I had seen before. I had been a developer for several years by then, but this was the right turn that sent me down a much more interesting path than the one I was on. +////////// +Pro Git 1판이 바로 저를 Git 세상으로 빠뜨린 놈입니다. 전에 경험해 본 어떤 시스템보다도 소프트웨어를 개발하는데 자연스러운 스타일의 시스템입니다. 수년 동안 개발자로 일해왔지만, 예전보다 더 일하는 것이 즐겁습니다. + +////////// +Now, years later, I'm a contributor to a major Git implementation, I've worked for the largest Git hosting company, and I've traveled the world teaching people about Git. When Scott asked if I'd be interested in working on the second edition, I didn't even have to think. +////////// +몇년이 지난 지금 저는 Git 개발에 기여하고 있습니다. 가장 큰 Git 호스팅 회사에서 일하고 있으며 세계를 돌아다니며 사람들에게 Git을 알려주고 있습니다. Scott이 이 책의 2판에 대한 작업을 제안했을 때 그 즉시 수락했습니다. + +////////// +It's been a great pleasure and privilege to work on this book. I hope it helps you as much as it did me. +////////// +이 책 작업은 큰 기쁨이고 영광이었습니다. 제가 도움을 받은 만큼 이 책이 여러분에게도 도움이 되길 바랍니다. diff --git a/book/preface.asc b/book/preface_scott.asc similarity index 75% rename from book/preface.asc rename to book/preface_scott.asc index 0ac49260..1e9bb478 100644 --- a/book/preface.asc +++ b/book/preface_scott.asc @@ -1,10 +1,3 @@ -Pro Git -======= -:doctype: book -:docinfo: -:toc: -:toclevels: 2 - [preface] ////////// == Preface by Scott Chacon @@ -79,45 +72,3 @@ Git은 눈에 잘 띄지 않던 버전 관리 시스템이었습니다. 하지 I hope you enjoy this updated edition of Pro Git. ////////// Pro Git 2판에서 개정된 모든 내용이 여러분에게 기쁨을 드린다면 좋겠습니다. - -[preface] -////////// -== Preface by Ben Straub -////////// -== Ben Straub - -////////// -The first edition of this book is what got me hooked on Git. This was my introduction to a style of making software that felt more natural than anything I had seen before. I had been a developer for several years by then, but this was the right turn that sent me down a much more interesting path than the one I was on. -////////// -Pro Git 1판이 바로 저를 Git 세상으로 빠뜨린 놈입니다. 전에 경험해 본 어떤 시스템보다도 소프트웨어를 개발하는데 자연스러운 스타일의 시스템입니다. 수년 동안 개발자로 일해왔지만, 예전보다 더 일하는 것이 즐겁습니다. - -////////// -Now, years later, I'm a contributor to a major Git implementation, I've worked for the largest Git hosting company, and I've traveled the world teaching people about Git. When Scott asked if I'd be interested in working on the second edition, I didn't even have to think. -////////// -몇년이 지난 지금 저는 Git 개발에 기여하고 있습니다. 가장 큰 Git 호스팅 회사에서 일하고 있으며 세계를 돌아다니며 사람들에게 Git을 알려주고 있습니다. Scott이 이 책의 2판에 대한 작업을 제안했을 때 그 즉시 수락했습니다. - -////////// -It's been a great pleasure and privilege to work on this book. I hope it helps you as much as it did me. -////////// -이 책 작업은 큰 기쁨이고 영광이었습니다. 제가 도움을 받은 만큼 이 책이 여러분에게도 도움이 되길 바랍니다. - - -[preface] -////////// -== Dedications -////////// -== 바치는 글 - -////////// -_To my wife, Becky, without whom this adventure never would have begun. — Ben_ -////////// -_나의 아내 Becky 없이는 이 모험을 시작하지 못했을 것입니다. — Ben_ - -////////// -_This edition is dedicated to my girls. -To my wife Jessica who has supported me for all of these years and to my daughter Josephine, -who will support me when I'm too old to know what's going on. — Scott_ -////////// -_이 책을 나의 여자들에게 바칩니다. -나의 아내 Jessica는 이 책을 쓰는 수년 동안 저를 지지해주었고, -나의 딸 Josephine은 제가 늙어서 정신이 없을 때쯤에 절 보살펴 줄 겁니다. — Scott_ diff --git a/book/01-introduction/1-introduction.asc b/ch01-introduction.asc similarity index 78% rename from book/01-introduction/1-introduction.asc rename to ch01-introduction.asc index 6a701aa7..fad4fbe8 100644 --- a/book/01-introduction/1-introduction.asc +++ b/ch01-introduction.asc @@ -1,4 +1,5 @@ -[[_getting_started]] +[#ch01-introduction] +[[r_getting_started]] ////////////////////////// == Getting Started ////////////////////////// @@ -13,19 +14,19 @@ At the end of this chapter you should understand why Git is around, why you shou 먼저 버전 관리 도구에 대한 이해와 Git을 설치하는 방법을 설명하고 마지막으로 Git 서버를 설정하고 사용하는 방법을 설명한다. 이 장을 다 읽고 나면 Git 탄생 배경, Git을 사용하는 이유, Git을 설정하고 사용하는 방법을 터득하게 될 것이다. -include::sections/about-version-control.asc[] +include::book/01-introduction/sections/about-version-control.asc[] -include::sections/history.asc[] +include::book/01-introduction/sections/history.asc[] -include::sections/basics.asc[] +include::book/01-introduction/sections/basics.asc[] -include::sections/command-line.asc[] +include::book/01-introduction/sections/command-line.asc[] -include::sections/installing.asc[] +include::book/01-introduction/sections/installing.asc[] -include::sections/first-time-setup.asc[] +include::book/01-introduction/sections/first-time-setup.asc[] -include::sections/help.asc[] +include::book/01-introduction/sections/help.asc[] ////////////////////////// === Summary diff --git a/book/02-git-basics/1-git-basics.asc b/ch02-git-basics.asc similarity index 83% rename from book/02-git-basics/1-git-basics.asc rename to ch02-git-basics.asc index 2758514b..06b27b16 100644 --- a/book/02-git-basics/1-git-basics.asc +++ b/ch02-git-basics.asc @@ -1,4 +1,5 @@ -[[_git_basics_chapter]] +[#ch02-git-basics] +[[r_git_basics_chapter]] ////////////////////////// == Git Basics ////////////////////////// @@ -15,19 +16,19 @@ Git에서 자주 사용하는 명령어는 모두 2장에 등장한다. 2장을 다 읽으면 저장소를 만들고 설정하는 방법, 파일을 추적하거나(Track) 추적을 그만두는 방법, 변경 내용을 Stage 하고 커밋하는 방법을 알게 된다. 파일이나 파일 패턴을 무시하도록 Git을 설정하는 방법, 실수를 쉽고 빠르게 만회하는 방법, 프로젝트 히스토리를 조회하고 커밋을 비교하는 방법, 리모트 저장소에 Push 하고 Pull 하는 방법을 살펴본다. -include::sections/getting-a-repository.asc[] +include::book/02-git-basics/sections/getting-a-repository.asc[] -include::sections/recording-changes.asc[] +include::book/02-git-basics/sections/recording-changes.asc[] -include::sections/viewing-history.asc[] +include::book/02-git-basics/sections/viewing-history.asc[] -include::sections/undoing.asc[] +include::book/02-git-basics/sections/undoing.asc[] -include::sections/remotes.asc[] +include::book/02-git-basics/sections/remotes.asc[] -include::sections/tagging.asc[] +include::book/02-git-basics/sections/tagging.asc[] -include::sections/aliases.asc[] +include::book/02-git-basics/sections/aliases.asc[] ////////////////////////// === Summary diff --git a/book/03-git-branching/1-git-branching.asc b/ch03-git-branching.asc similarity index 88% rename from book/03-git-branching/1-git-branching.asc rename to ch03-git-branching.asc index aaf826f7..64ac305b 100644 --- a/book/03-git-branching/1-git-branching.asc +++ b/ch03-git-branching.asc @@ -1,4 +1,5 @@ -[[_git_branching]] +[#ch03-git-branching] +[[r_git_branching]] ////////////////////////// == Git Branching ////////////////////////// @@ -27,17 +28,17 @@ Git의 브랜치는 매우 가볍다. 순식간에 브랜치를 새로 만들고 심지어 하루에 수십 번씩해도 괜찮다. Git 브랜치에 능숙해지면 개발 방식이 완전히 바뀌고 다른 도구를 사용할 수 없게 된다. -include::sections/nutshell.asc[] +include::book/03-git-branching/sections/nutshell.asc[] -include::sections/basic-branching-and-merging.asc[] +include::book/03-git-branching/sections/basic-branching-and-merging.asc[] -include::sections/branch-management.asc[] +include::book/03-git-branching/sections/branch-management.asc[] -include::sections/workflows.asc[] +include::book/03-git-branching/sections/workflows.asc[] -include::sections/remote-branches.asc[] +include::book/03-git-branching/sections/remote-branches.asc[] -include::sections/rebasing.asc[] +include::book/03-git-branching/sections/rebasing.asc[] ////////////////////////// === Summary diff --git a/book/04-git-server/1-git-server.asc b/ch04-git-server.asc similarity index 91% rename from book/04-git-server/1-git-server.asc rename to ch04-git-server.asc index 58a64b8e..695f77fc 100644 --- a/book/04-git-server/1-git-server.asc +++ b/ch04-git-server.asc @@ -1,3 +1,4 @@ +[#ch04-git-server] ////////////////////////// == Git on the Server ////////////////////////// @@ -46,23 +47,23 @@ In the simplest terms, a bare repository is the contents of your project's `.git 이 저장소는 협업용이기 때문에 체크아웃이 필요 없다. 그냥 Git 데이터만 있으면 된다. 다시 말해서 Bare 저장소는 일반 프로젝트에서 `.git` 디렉토리만 있는 저장소다. -include::sections/protocols.asc[] +include::book/04-git-server/sections/protocols.asc[] -include::sections/git-on-a-server.asc[] +include::book/04-git-server/sections/git-on-a-server.asc[] -include::sections/generating-ssh-key.asc[] +include::book/04-git-server/sections/generating-ssh-key.asc[] -include::sections/setting-up-server.asc[] +include::book/04-git-server/sections/setting-up-server.asc[] -include::sections/git-daemon.asc[] +include::book/04-git-server/sections/git-daemon.asc[] -include::sections/smart-http.asc[] +include::book/04-git-server/sections/smart-http.asc[] -include::sections/gitweb.asc[] +include::book/04-git-server/sections/gitweb.asc[] -include::sections/gitlab.asc[] +include::book/04-git-server/sections/gitlab.asc[] -include::sections/hosted.asc[] +include::book/04-git-server/sections/hosted.asc[] ////////////////////////// === Summary diff --git a/book/05-distributed-git/1-distributed-git.asc b/ch05-distributed-git.asc similarity index 90% rename from book/05-distributed-git/1-distributed-git.asc rename to ch05-distributed-git.asc index 650ff586..3b4b5af8 100644 --- a/book/05-distributed-git/1-distributed-git.asc +++ b/ch05-distributed-git.asc @@ -1,4 +1,5 @@ -[[_distributed_git]] +[#ch05-distributed-git] +[[r_distributed_git]] ////////////////////////// == Distributed Git ////////////////////////// @@ -17,11 +18,11 @@ That is, you'll learn how to contribute code successfully to a project and make 이번 장에서는 분산 환경에서 Git을 어떻게 사용할 수 있을지 살펴본다. 프로젝트 기여자 입장과 여러 수정사항을 취합하는 관리자 입장에서 두루 살펴본다. 즉, 프로젝트 기여자 또는 관리자로서 작업물을 프로젝트에 어떻게 포함시킬지와 수 많은 개발자가 수행한 일을 취합하고 프로젝트를 운영하는 방법을 배운다. -include::sections/distributed-workflows.asc[] +include::book/05-distributed-git/sections/distributed-workflows.asc[] -include::sections/contributing.asc[] +include::book/05-distributed-git/sections/contributing.asc[] -include::sections/maintaining.asc[] +include::book/05-distributed-git/sections/maintaining.asc[] ////////////////////////// === Summary diff --git a/book/06-github/1-github.asc b/ch06-github.asc similarity index 88% rename from book/06-github/1-github.asc rename to ch06-github.asc index 2ad91382..acd66bb4 100644 --- a/book/06-github/1-github.asc +++ b/ch06-github.asc @@ -1,4 +1,5 @@ -[[_github]] +[#ch06-github] +[[r_github]] == GitHub (((GitHub))) @@ -19,9 +20,9 @@ We'll cover signing up for and managing an account, creating and using Git repos 계정을 생성해서 관리하는 방법, Git 저장소를 만들고 사용하는 방법, 프로젝트에 기여하거나 다른 사람의 기여를 받아들이는 방법, 프로그래밍 가능한 GitHub 인터페이스, 각종 팁으로 삶을 편하게 만드는 방법을 살펴본다. ////////////////////////// -If you are not interested in using GitHub to host your own projects or to collaborate with other projects that are hosted on GitHub, you can safely skip to <<_git_tools>>. +If you are not interested in using GitHub to host your own projects or to collaborate with other projects that are hosted on GitHub, you can safely skip to <>. ////////////////////////// -프로젝트를 GitHub에 만들 생각이 없거나 GitHub에 있는 프로젝트에 참여할 생각이 없으면 그냥 <<_git_tools>>로 넘어가도 된다. +프로젝트를 GitHub에 만들 생각이 없거나 GitHub에 있는 프로젝트에 참여할 생각이 없으면 그냥 <>로 넘어가도 된다. [WARNING] ////////////////////////// @@ -37,15 +38,15 @@ Hopefully the general idea of what we're trying to accomplish here will still be 사실 우리는 변하지 않고 멈춰줬으면 좋겠다. 최신 버전의 스크린샷이 포함된 버전을 읽고 싶다면 이 책의 온라인 버전을 읽어라. 아마 거기엔 좀 더 최신 스크린샷이 적용돼 있을 것이다. ==== -include::sections/1-setting-up-account.asc[] +include::book/06-github/sections/1-setting-up-account.asc[] -include::sections/2-contributing.asc[] +include::book/06-github/sections/2-contributing.asc[] -include::sections/3-maintaining.asc[] +include::book/06-github/sections/3-maintaining.asc[] -include::sections/4-managing-organization.asc[] +include::book/06-github/sections/4-managing-organization.asc[] -include::sections/5-scripting.asc[] +include::book/06-github/sections/5-scripting.asc[] ////////////////////////// === Summary diff --git a/book/07-git-tools/1-git-tools.asc b/ch07-git-tools.asc similarity index 73% rename from book/07-git-tools/1-git-tools.asc rename to ch07-git-tools.asc index 5b0c186e..aaff9558 100644 --- a/book/07-git-tools/1-git-tools.asc +++ b/ch07-git-tools.asc @@ -1,4 +1,5 @@ -[[_git_tools]] +[#ch07-git-tools] +[[r_git_tools]] ////////////////////////// == Git Tools ////////////////////////// @@ -16,33 +17,33 @@ Now you’ll explore a number of very powerful things that Git can do that you m ////////////////////////// 이 장에서는 일상적으로 사용하지는 않지만 위급한 상황에서 반드시 필요한 Git 도구를 살펴본다. -include::sections/revision-selection.asc[] +include::book/07-git-tools/sections/revision-selection.asc[] -include::sections/interactive-staging.asc[] +include::book/07-git-tools/sections/interactive-staging.asc[] -include::sections/stashing-cleaning.asc[] +include::book/07-git-tools/sections/stashing-cleaning.asc[] -include::sections/signing.asc[] +include::book/07-git-tools/sections/signing.asc[] -include::sections/searching.asc[] +include::book/07-git-tools/sections/searching.asc[] -include::sections/rewriting-history.asc[] +include::book/07-git-tools/sections/rewriting-history.asc[] -include::sections/reset.asc[] +include::book/07-git-tools/sections/reset.asc[] -include::sections/advanced-merging.asc[] +include::book/07-git-tools/sections/advanced-merging.asc[] -include::sections/rerere.asc[] +include::book/07-git-tools/sections/rerere.asc[] -include::sections/debugging.asc[] +include::book/07-git-tools/sections/debugging.asc[] -include::sections/submodules.asc[] +include::book/07-git-tools/sections/submodules.asc[] -include::sections/bundling.asc[] +include::book/07-git-tools/sections/bundling.asc[] -include::sections/replace.asc[] +include::book/07-git-tools/sections/replace.asc[] -include::sections/credentials.asc[] +include::book/07-git-tools/sections/credentials.asc[] ////////////////////////// === Summary diff --git a/book/08-customizing-git/1-customizing-git.asc b/ch08-customizing-git.asc similarity index 86% rename from book/08-customizing-git/1-customizing-git.asc rename to ch08-customizing-git.asc index 7b012e37..ef40bf9f 100644 --- a/book/08-customizing-git/1-customizing-git.asc +++ b/ch08-customizing-git.asc @@ -1,4 +1,5 @@ -[[_customizing_git]] +[#ch08-customizing-git] +[[r_customizing_git]] ////////////////////////// == Customizing Git ////////////////////////// @@ -13,13 +14,13 @@ With these tools, it's easy to get Git to work exactly the way you, your company 이 장에서는 먼저 많이 쓰이는 설정 그리고 훅 시스템을 먼저 설명한다. 그 후에 Git을 내게 맞추어(Customize) 본다. Git을 자신의 프로젝트에 맞추고 편하게 사용하자. -include::sections/config.asc[] +include::book/08-customizing-git/sections/config.asc[] -include::sections/attributes.asc[] +include::book/08-customizing-git/sections/attributes.asc[] -include::sections/hooks.asc[] +include::book/08-customizing-git/sections/hooks.asc[] -include::sections/policy.asc[] +include::book/08-customizing-git/sections/policy.asc[] ////////////////////////// === Summary diff --git a/book/09-git-and-other-scms/1-git-and-other-scms.asc b/ch09-git-and-other-scms.asc similarity index 87% rename from book/09-git-and-other-scms/1-git-and-other-scms.asc rename to ch09-git-and-other-scms.asc index e120e063..8e69fb1c 100644 --- a/book/09-git-and-other-scms/1-git-and-other-scms.asc +++ b/ch09-git-and-other-scms.asc @@ -1,3 +1,4 @@ +[#ch09-git-and-other-scms] ////////////////////////// == Git and Other Systems ////////////////////////// @@ -36,15 +37,15 @@ Git을 배운 많은 사람들은 만족스러워 한다. 다른 모든 팀원 Git은 이렇게 다른 VCS 시스템과 연결해 주는 여러 ``bridge''를 제공한다. 이어지는 내용을 통해 하나씩 둘러보자. -include::sections/client-svn.asc[] +include::book/09-git-and-other-scms/sections/client-svn.asc[] -include::sections/client-hg.asc[] +include::book/09-git-and-other-scms/sections/client-hg.asc[] -include::sections/client-p4.asc[] +include::book/09-git-and-other-scms/sections/client-p4.asc[] -include::sections/client-tfs.asc[] +include::book/09-git-and-other-scms/sections/client-tfs.asc[] -[[_migrating]] +[[r_migrating]] ////////////////////////// === Migrating to Git ////////////////////////// @@ -60,15 +61,15 @@ You'll learn how to import data from several of the bigger professionally used S 이번 절에서는 Git에 들어 있는 Importer를 살펴보고 직접 Importer를 만드는 방법도 알아본다. 우선 많이 사용하는 SCM 시스템으로부터 프로젝트를 이전하는 방법을 살펴본다. 아마도 저장소를 옮기려고 하는 대부분의 사람들은 이 방법을 참고하면 된다. 아주 괜찮은 Importer가 이미 Git에 들어 있다. -include::sections/import-svn.asc[] +include::book/09-git-and-other-scms/sections/import-svn.asc[] -include::sections/import-hg.asc[] +include::book/09-git-and-other-scms/sections/import-hg.asc[] -include::sections/import-p4.asc[] +include::book/09-git-and-other-scms/sections/import-p4.asc[] -include::sections/import-tfs.asc[] +include::book/09-git-and-other-scms/sections/import-tfs.asc[] -include::sections/import-custom.asc[] +include::book/09-git-and-other-scms/sections/import-custom.asc[] ////////////////////////// === Summary diff --git a/book/10-git-internals/1-git-internals.asc b/ch10-git-internals.asc similarity index 90% rename from book/10-git-internals/1-git-internals.asc rename to ch10-git-internals.asc index 41dd356a..4bc8268c 100644 --- a/book/10-git-internals/1-git-internals.asc +++ b/ch10-git-internals.asc @@ -1,4 +1,5 @@ -[[_git_internals]] +[#ch10-git-internals] +[[r_git_internals]] ////////////////////////// == Git Internals ////////////////////////// @@ -36,21 +37,21 @@ The content-addressable filesystem layer is amazingly cool, so I'll cover that f ////////////////////////// 우선 Content-addressable 파일 시스템은 정말 대단한 것이므로 먼저 다룬다. 그리고 나서 데이터 전송 원리를 배우고 마지막에는 저장소를 관리하는 법까지 배운다. -include::sections/plumbing-porcelain.asc[] +include::book/10-git-internals/sections/plumbing-porcelain.asc[] -include::sections/objects.asc[] +include::book/10-git-internals/sections/objects.asc[] -include::sections/refs.asc[] +include::book/10-git-internals/sections/refs.asc[] -include::sections/packfiles.asc[] +include::book/10-git-internals/sections/packfiles.asc[] -include::sections/refspec.asc[] +include::book/10-git-internals/sections/refspec.asc[] -include::sections/transfer-protocols.asc[] +include::book/10-git-internals/sections/transfer-protocols.asc[] -include::sections/maintenance.asc[] +include::book/10-git-internals/sections/maintenance.asc[] -include::sections/environment.asc[] +include::book/10-git-internals/sections/environment.asc[] ////////////////////////// === Summary diff --git a/book/06-github/images/2fa-1.png b/images/2fa-1.png similarity index 100% rename from book/06-github/images/2fa-1.png rename to images/2fa-1.png diff --git a/book/06-github/images/account-settings.png b/images/account-settings.png similarity index 100% rename from book/06-github/images/account-settings.png rename to images/account-settings.png diff --git a/book/03-git-branching/images/advance-master.png b/images/advance-master.png similarity index 100% rename from book/03-git-branching/images/advance-master.png rename to images/advance-master.png diff --git a/book/03-git-branching/images/advance-testing.png b/images/advance-testing.png similarity index 100% rename from book/03-git-branching/images/advance-testing.png rename to images/advance-testing.png diff --git a/book/01-introduction/images/areas.png b/images/areas.png similarity index 100% rename from book/01-introduction/images/areas.png rename to images/areas.png diff --git a/book/06-github/images/avatar-crop.png b/images/avatar-crop.png similarity index 100% rename from book/06-github/images/avatar-crop.png rename to images/avatar-crop.png diff --git a/book/03-git-branching/images/basic-branching-1.png b/images/basic-branching-1.png similarity index 100% rename from book/03-git-branching/images/basic-branching-1.png rename to images/basic-branching-1.png diff --git a/book/03-git-branching/images/basic-branching-2.png b/images/basic-branching-2.png similarity index 100% rename from book/03-git-branching/images/basic-branching-2.png rename to images/basic-branching-2.png diff --git a/book/03-git-branching/images/basic-branching-3.png b/images/basic-branching-3.png similarity index 100% rename from book/03-git-branching/images/basic-branching-3.png rename to images/basic-branching-3.png diff --git a/book/03-git-branching/images/basic-branching-4.png b/images/basic-branching-4.png similarity index 100% rename from book/03-git-branching/images/basic-branching-4.png rename to images/basic-branching-4.png diff --git a/book/03-git-branching/images/basic-branching-5.png b/images/basic-branching-5.png similarity index 100% rename from book/03-git-branching/images/basic-branching-5.png rename to images/basic-branching-5.png diff --git a/book/03-git-branching/images/basic-branching-6.png b/images/basic-branching-6.png similarity index 100% rename from book/03-git-branching/images/basic-branching-6.png rename to images/basic-branching-6.png diff --git a/book/03-git-branching/images/basic-merging-1.png b/images/basic-merging-1.png similarity index 100% rename from book/03-git-branching/images/basic-merging-1.png rename to images/basic-merging-1.png diff --git a/book/03-git-branching/images/basic-merging-2.png b/images/basic-merging-2.png similarity index 100% rename from book/03-git-branching/images/basic-merging-2.png rename to images/basic-merging-2.png diff --git a/book/03-git-branching/images/basic-rebase-1.png b/images/basic-rebase-1.png similarity index 100% rename from book/03-git-branching/images/basic-rebase-1.png rename to images/basic-rebase-1.png diff --git a/book/03-git-branching/images/basic-rebase-2.png b/images/basic-rebase-2.png similarity index 100% rename from book/03-git-branching/images/basic-rebase-2.png rename to images/basic-rebase-2.png diff --git a/book/03-git-branching/images/basic-rebase-3.png b/images/basic-rebase-3.png similarity index 100% rename from book/03-git-branching/images/basic-rebase-3.png rename to images/basic-rebase-3.png diff --git a/book/03-git-branching/images/basic-rebase-4.png b/images/basic-rebase-4.png similarity index 100% rename from book/03-git-branching/images/basic-rebase-4.png rename to images/basic-rebase-4.png diff --git a/book/05-distributed-git/images/benevolent-dictator.png b/images/benevolent-dictator.png similarity index 100% rename from book/05-distributed-git/images/benevolent-dictator.png rename to images/benevolent-dictator.png diff --git a/book/04-git-server/images/bitnami.png b/images/bitnami.png similarity index 100% rename from book/04-git-server/images/bitnami.png rename to images/bitnami.png diff --git a/book/06-github/images/blink-01-start.png b/images/blink-01-start.png similarity index 100% rename from book/06-github/images/blink-01-start.png rename to images/blink-01-start.png diff --git a/book/06-github/images/blink-02-pr.png b/images/blink-02-pr.png similarity index 100% rename from book/06-github/images/blink-02-pr.png rename to images/blink-02-pr.png diff --git a/book/06-github/images/blink-03-pull-request-open.png b/images/blink-03-pull-request-open.png similarity index 100% rename from book/06-github/images/blink-03-pull-request-open.png rename to images/blink-03-pull-request-open.png diff --git a/book/06-github/images/blink-04-email.png b/images/blink-04-email.png similarity index 100% rename from book/06-github/images/blink-04-email.png rename to images/blink-04-email.png diff --git a/book/06-github/images/blink-04-pr-comment.png b/images/blink-04-pr-comment.png similarity index 100% rename from book/06-github/images/blink-04-pr-comment.png rename to images/blink-04-pr-comment.png diff --git a/book/06-github/images/blink-05-general-comment.png b/images/blink-05-general-comment.png similarity index 100% rename from book/06-github/images/blink-05-general-comment.png rename to images/blink-05-general-comment.png diff --git a/book/06-github/images/blink-06-final.png b/images/blink-06-final.png similarity index 100% rename from book/06-github/images/blink-06-final.png rename to images/blink-06-final.png diff --git a/book/06-github/images/blink-pull-request-open copy.png b/images/blink-pull-request-open copy.png similarity index 100% rename from book/06-github/images/blink-pull-request-open copy.png rename to images/blink-pull-request-open copy.png diff --git a/book/06-github/images/blink-pull-request-open.png b/images/blink-pull-request-open.png similarity index 100% rename from book/06-github/images/blink-pull-request-open.png rename to images/blink-pull-request-open.png diff --git a/book/03-git-branching/images/branch-and-history.png b/images/branch-and-history.png similarity index 100% rename from book/03-git-branching/images/branch-and-history.png rename to images/branch-and-history.png diff --git a/book/A-git-in-other-environments/images/branch_widget_mac.png b/images/branch_widget_mac.png similarity index 100% rename from book/A-git-in-other-environments/images/branch_widget_mac.png rename to images/branch_widget_mac.png diff --git a/book/A-git-in-other-environments/images/branch_widget_win.png b/images/branch_widget_win.png similarity index 100% rename from book/A-git-in-other-environments/images/branch_widget_win.png rename to images/branch_widget_win.png diff --git a/book/01-introduction/images/centralized.png b/images/centralized.png similarity index 100% rename from book/01-introduction/images/centralized.png rename to images/centralized.png diff --git a/book/05-distributed-git/images/centralized_workflow.png b/images/centralized_workflow.png similarity index 100% rename from book/05-distributed-git/images/centralized_workflow.png rename to images/centralized_workflow.png diff --git a/book/03-git-branching/images/checkout-master.png b/images/checkout-master.png similarity index 100% rename from book/03-git-branching/images/checkout-master.png rename to images/checkout-master.png diff --git a/book/08-customizing-git/images/clean.png b/images/clean.png similarity index 100% rename from book/08-customizing-git/images/clean.png rename to images/clean.png diff --git a/book/06-github/images/collaborators.png b/images/collaborators.png similarity index 100% rename from book/06-github/images/collaborators.png rename to images/collaborators.png diff --git a/book/03-git-branching/images/commit-and-tree.png b/images/commit-and-tree.png similarity index 100% rename from book/03-git-branching/images/commit-and-tree.png rename to images/commit-and-tree.png diff --git a/book/03-git-branching/images/commits-and-parents.png b/images/commits-and-parents.png similarity index 100% rename from book/03-git-branching/images/commits-and-parents.png rename to images/commits-and-parents.png diff --git a/book/10-git-internals/images/data-model-1.png b/images/data-model-1.png similarity index 100% rename from book/10-git-internals/images/data-model-1.png rename to images/data-model-1.png diff --git a/book/10-git-internals/images/data-model-2.png b/images/data-model-2.png similarity index 100% rename from book/10-git-internals/images/data-model-2.png rename to images/data-model-2.png diff --git a/book/10-git-internals/images/data-model-3.png b/images/data-model-3.png similarity index 100% rename from book/10-git-internals/images/data-model-3.png rename to images/data-model-3.png diff --git a/book/10-git-internals/images/data-model-4.png b/images/data-model-4.png similarity index 100% rename from book/10-git-internals/images/data-model-4.png rename to images/data-model-4.png diff --git a/book/01-introduction/images/deltas.png b/images/deltas.png similarity index 100% rename from book/01-introduction/images/deltas.png rename to images/deltas.png diff --git a/book/01-introduction/images/distributed.png b/images/distributed.png similarity index 100% rename from book/01-introduction/images/distributed.png rename to images/distributed.png diff --git a/book/07-git-tools/images/double-dot.png b/images/double-dot.png similarity index 100% rename from book/07-git-tools/images/double-dot.png rename to images/double-dot.png diff --git a/book/A-git-in-other-environments/images/egit.png b/images/egit.png similarity index 100% rename from book/A-git-in-other-environments/images/egit.png rename to images/egit.png diff --git a/book/06-github/images/email-settings.png b/images/email-settings.png similarity index 100% rename from book/06-github/images/email-settings.png rename to images/email-settings.png diff --git a/book/06-github/images/emoji.png b/images/emoji.png similarity index 100% rename from book/06-github/images/emoji.png rename to images/emoji.png diff --git a/book/06-github/images/forkbutton.png b/images/forkbutton.png similarity index 100% rename from book/06-github/images/forkbutton.png rename to images/forkbutton.png diff --git a/book/A-git-in-other-environments/images/git-bash.png b/images/git-bash.png similarity index 100% rename from book/A-git-in-other-environments/images/git-bash.png rename to images/git-bash.png diff --git a/book/05-distributed-git/images/git-diff-check.png b/images/git-diff-check.png similarity index 100% rename from book/05-distributed-git/images/git-diff-check.png rename to images/git-diff-check.png diff --git a/book/09-git-and-other-scms/images/git-fusion-boot.png b/images/git-fusion-boot.png similarity index 100% rename from book/09-git-and-other-scms/images/git-fusion-boot.png rename to images/git-fusion-boot.png diff --git a/book/09-git-and-other-scms/images/git-fusion-perforce-graph.png b/images/git-fusion-perforce-graph.png similarity index 100% rename from book/09-git-and-other-scms/images/git-fusion-perforce-graph.png rename to images/git-fusion-perforce-graph.png diff --git a/book/A-git-in-other-environments/images/git-gui.png b/images/git-gui.png similarity index 100% rename from book/A-git-in-other-environments/images/git-gui.png rename to images/git-gui.png diff --git a/book/04-git-server/images/git-instaweb.png b/images/git-instaweb.png similarity index 100% rename from book/04-git-server/images/git-instaweb.png rename to images/git-instaweb.png diff --git a/book/01-introduction/images/git-osx-installer.png b/images/git-osx-installer.png similarity index 100% rename from book/01-introduction/images/git-osx-installer.png rename to images/git-osx-installer.png diff --git a/book/09-git-and-other-scms/images/git-tfs-ct.png b/images/git-tfs-ct.png similarity index 100% rename from book/09-git-and-other-scms/images/git-tfs-ct.png rename to images/git-tfs-ct.png diff --git a/book/A-git-in-other-environments/images/github_mac.png b/images/github_mac.png similarity index 100% rename from book/A-git-in-other-environments/images/github_mac.png rename to images/github_mac.png diff --git a/book/A-git-in-other-environments/images/github_win.png b/images/github_win.png similarity index 100% rename from book/A-git-in-other-environments/images/github_win.png rename to images/github_win.png diff --git a/book/A-git-in-other-environments/images/gitk.png b/images/gitk.png similarity index 100% rename from book/A-git-in-other-environments/images/gitk.png rename to images/gitk.png diff --git a/book/04-git-server/images/gitlab-broadcast.png b/images/gitlab-broadcast.png similarity index 100% rename from book/04-git-server/images/gitlab-broadcast.png rename to images/gitlab-broadcast.png diff --git a/images/gitlab-groups.png b/images/gitlab-groups.png new file mode 100644 index 0000000000000000000000000000000000000000..6dde95ebd67286fb1c89cafd3ca7646c8232b945 GIT binary patch literal 236758 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%0Dhy8chHg>a(Uj>Kl~ztwnc1XR6_AF;iY{;P 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%0D&tJdMr$?FvZu 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

xQe#7{h0?4L;sADqL59jW8jzuEm3T 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 JPDHLkV1n@n5vl+H literal 0 HcmV?d00001 diff --git a/images/gitlab-menu.png b/images/gitlab-menu.png new file mode 100644 index 0000000000000000000000000000000000000000..868ef91275de379395db3b30ace6d2e89badc934 GIT binary patch literal 29468 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 X$&{lKq0HpjvxyY%soX7=G4%UCwD{t# literal 0 HcmV?d00001 diff --git a/images/gitlab-users.png b/images/gitlab-users.png new file mode 100644 index 0000000000000000000000000000000000000000..ebc226b7bca4808e3988bbb5345b3ea03313a8e3 GIT binary patch literal 237381 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�$&GR99Ai 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�>6@*}f9;7Y&3#mzR~4KObbh11 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

CN<$MkNhh-D4 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 literal 0 HcmV?d00001 diff --git a/book/03-git-branching/images/head-to-master.png b/images/head-to-master.png similarity index 100% rename from book/03-git-branching/images/head-to-master.png rename to images/head-to-master.png diff --git a/book/03-git-branching/images/head-to-testing.png b/images/head-to-testing.png similarity index 100% rename from book/03-git-branching/images/head-to-testing.png rename to images/head-to-testing.png diff --git a/book/06-github/images/hubot.png b/images/hubot.png similarity index 100% rename from book/06-github/images/hubot.png rename to images/hubot.png diff --git a/book/05-distributed-git/images/integration-manager.png b/images/integration-manager.png similarity index 100% rename from book/05-distributed-git/images/integration-manager.png rename to images/integration-manager.png diff --git a/book/03-git-branching/images/interesting-rebase-1.png b/images/interesting-rebase-1.png similarity index 100% rename from book/03-git-branching/images/interesting-rebase-1.png rename to images/interesting-rebase-1.png diff --git a/book/03-git-branching/images/interesting-rebase-2.png b/images/interesting-rebase-2.png similarity index 100% rename from book/03-git-branching/images/interesting-rebase-2.png rename to images/interesting-rebase-2.png diff --git a/book/03-git-branching/images/interesting-rebase-3.png b/images/interesting-rebase-3.png similarity index 100% rename from book/03-git-branching/images/interesting-rebase-3.png rename to images/interesting-rebase-3.png diff --git a/book/03-git-branching/images/interesting-rebase-4.png b/images/interesting-rebase-4.png similarity index 100% rename from book/03-git-branching/images/interesting-rebase-4.png rename to images/interesting-rebase-4.png diff --git a/book/03-git-branching/images/interesting-rebase-5.png b/images/interesting-rebase-5.png similarity index 100% rename from book/03-git-branching/images/interesting-rebase-5.png rename to images/interesting-rebase-5.png diff --git a/book/05-distributed-git/images/large-merges-1.png b/images/large-merges-1.png similarity index 100% rename from book/05-distributed-git/images/large-merges-1.png rename to images/large-merges-1.png diff --git a/book/05-distributed-git/images/large-merges-2.png b/images/large-merges-2.png similarity index 100% rename from book/05-distributed-git/images/large-merges-2.png rename to images/large-merges-2.png diff --git a/book/02-git-basics/images/lifecycle.png b/images/lifecycle.png similarity index 100% rename from book/02-git-basics/images/lifecycle.png rename to images/lifecycle.png diff --git a/book/01-introduction/images/local.png b/images/local.png similarity index 100% rename from book/01-introduction/images/local.png rename to images/local.png diff --git a/book/03-git-branching/images/lr-branches-1.png b/images/lr-branches-1.png similarity index 100% rename from book/03-git-branching/images/lr-branches-1.png rename to images/lr-branches-1.png diff --git a/book/03-git-branching/images/lr-branches-2.png b/images/lr-branches-2.png similarity index 100% rename from book/03-git-branching/images/lr-branches-2.png rename to images/lr-branches-2.png diff --git a/book/06-github/images/maint-01-email.png b/images/maint-01-email.png similarity index 100% rename from book/06-github/images/maint-01-email.png rename to images/maint-01-email.png diff --git a/book/06-github/images/maint-02-merge.png b/images/maint-02-merge.png similarity index 100% rename from book/06-github/images/maint-02-merge.png rename to images/maint-02-merge.png diff --git a/book/06-github/images/maint-03-email-resp.png b/images/maint-03-email-resp.png similarity index 100% rename from book/06-github/images/maint-03-email-resp.png rename to images/maint-03-email-resp.png diff --git a/book/06-github/images/maint-04-target.png b/images/maint-04-target.png similarity index 100% rename from book/06-github/images/maint-04-target.png rename to images/maint-04-target.png diff --git a/book/06-github/images/maint-05-mentions.png b/images/maint-05-mentions.png similarity index 100% rename from book/06-github/images/maint-05-mentions.png rename to images/maint-05-mentions.png diff --git a/book/06-github/images/maint-06-unsubscribe.png b/images/maint-06-unsubscribe.png similarity index 100% rename from book/06-github/images/maint-06-unsubscribe.png rename to images/maint-06-unsubscribe.png diff --git a/book/06-github/images/maint-07-notifications.png b/images/maint-07-notifications.png similarity index 100% rename from book/06-github/images/maint-07-notifications.png rename to images/maint-07-notifications.png diff --git a/book/06-github/images/maint-08-notifications-page.png b/images/maint-08-notifications-page.png similarity index 100% rename from book/06-github/images/maint-08-notifications-page.png rename to images/maint-08-notifications-page.png diff --git a/book/06-github/images/maint-09-contrib.png b/images/maint-09-contrib.png similarity index 100% rename from book/06-github/images/maint-09-contrib.png rename to images/maint-09-contrib.png diff --git a/book/06-github/images/maint-10-default-branch.png b/images/maint-10-default-branch.png similarity index 100% rename from book/06-github/images/maint-10-default-branch.png rename to images/maint-10-default-branch.png diff --git a/book/06-github/images/maint-11-transfer.png b/images/maint-11-transfer.png similarity index 100% rename from book/06-github/images/maint-11-transfer.png rename to images/maint-11-transfer.png diff --git a/book/05-distributed-git/images/managed-team-1.png b/images/managed-team-1.png similarity index 100% rename from book/05-distributed-git/images/managed-team-1.png rename to images/managed-team-1.png diff --git a/book/05-distributed-git/images/managed-team-2.png b/images/managed-team-2.png similarity index 100% rename from book/05-distributed-git/images/managed-team-2.png rename to images/managed-team-2.png diff --git a/book/05-distributed-git/images/managed-team-3.png b/images/managed-team-3.png similarity index 100% rename from book/05-distributed-git/images/managed-team-3.png rename to images/managed-team-3.png diff --git a/images/managed-team-flow.png b/images/managed-team-flow.png new file mode 100644 index 0000000000000000000000000000000000000000..6d83ac4d710ea777a637d80c0d4275b5d1128a21 GIT binary patch literal 29831 zcma&NbyQT}7dJd2pp+oeA>G|GfV6a{G*TlCGaw+{-O>X{OA9DSgLGX|>5d^JM@m4S z@%wxJc-On$Ki;+O+Uw3fJ3c4Y+54WeCq`RSi2#=h7X$(ks3mka4fQ`!rk8;Tq6HEY6VZ~hGNfnfENG4_SkTMM9i_&stFGwc zU=M@2oU5~H~8go)i$hj658peqp z->ISS*6Ql!!s4Ed!p6|Ijql&rCntB@bPr6xzqEyRHa9n7VOzeId%MUBbT}LwmLL=Blm1(H+lMYuPcI_4zyTvHR}UtCb&61`;PGlAFNrR`R>; zfu^l5t;Z+FYemVc?}PW2r?x^pHadGY3knaA8wVTnYr*!XrZ17R16$=aNFS%|V290U z|K(5Br*Dkbv(nEk)R1YJ2O$ARZVs~@Ex)d=W(EgCXkU1s*Ic}(uBILcd(F4|ITJqN z#I&u2B(8kF!ZD2f*~Qc0NSa5PUslRQBUQjN$+cAUDw{Zk_+u_{{OeaX;N7c*_HAiq zyqzWR%ppbZFz4D=T>+VIUut|tJzqPUM5S${e>eIRbo|l3PRo2}E;so+_*b@orT))Y zwU2G^-r&}2qvwUUIk&Bo1qCiGLvN5jdUoC-Z?=C=fI1MZ%q;t%RGG^X=d`~ z>tNmsX30zj@|3*44oE8Ec?j)Wi`U5T`4&8K3JpM>D4rE+7OXg&ts@YkNv}rkTG5z7 znJ0r`9jzJ`n32c|4GlINZuuCc**!#=f?)eKi9^AV+9-I>O{)Q5_Pl|y(xMFzp)Jim zDjxRj?tTNq{-oyC=7J#$id?hInfj#mYK+oG{!_O_yNjybV5}N$p@vPD?woRZrN!s^ zbk5ZNphoL(Vfa}`029*NY5VRn0r8h?3(>=I{{%`rBlPxNBq2tLWfwmq@PG*ZjEU++rH~DsZ)FYxcl(X@Z+?JDtYjgNL&F`={7#dtxZ(# zKq$nB8H*ZHF!RM@prxjP8z;H*mT~E~36{tof#JSh&dM+45$m@SU8BxR50;lM>wj8s z$KUp9+Whs-^jN)C;jyHt&S9S*vwy73!L{Nhh?^q0@ zEY06P1}h@?ZttT)8RbamVu;tyTpAYcRp)wJp$$kDkGSRCrgN=yPsp=Y>LC0Vy=Fzy zgvh38wPntA`Fqh=MjI-oXZ$*NKVKN-%p3YbCX0uf>mVEIboBf`tmAsAe>s7hCA;WG zUuAFSr?+u#_#4T|$XzyZCi#`Vgs&@2eSNMPj?%_>O5)TBP!4MwfH&e7>@2j$-8xuQ7w4Clhy?n@apxA1w z3*niSrrwk=8=^z%5A7^c|5Wha0nFs-6hmGg^*gy9@tqDF<_~XX&>tCf!1tYbh7b`8 z9Gs#w7SnvBVy9bxH&N2%;Yu;Jn&>grUL&{4=pJdt?H)EUb;Ee?0d}J5t@IuD#y0p+ zP1X1em~7};!G7i7%aG~A;}Z(Ell~eoxY(kT&VLzsYNf;yBf`BOEfm9JfHJ{u9i(9$ zHoU+Ac5>_fZY|y{r|sw>;=Bzd0c0MzfrMN9o4qBC2{_f<&}3COj;LG$SZ*?k+N-P?A__%@Ha@`;U-497eKX_AoRw?e;FEV|pf4tLgJ^BZM1BYSrIyPJBM0I;M} zh<6??22<3vWNX0-ro)jt->=_(M}yh+$LWKr8F1Fy1yohFx?~HB+@-=D;FFo_gU&6} zIVM`mRvTcWUVS?7wO&ycHTUQ|#}xTR3v`R;cU>HT%I{4agmKN<1axxcVnUHAkq5g3 z*0x5T-fjI-=?T=!_lUdxwza#Z@j${P5#_%^jw;Ffa(E@;V@|%ot?Rl2rc=E4!cmUX zS*zHYqfdNDUvHkj9{0QN25sE~d(6Y0T3#oeVX!x$sPcej=u<>U_hnh7QHoFQ$0EYC z=Gm7moIMcpL?L}lphddh69;-S^@;S6xD6_I$EyP;UT9{Ci!HT2$PZ22}BUu}p2b6_m$qzmlPt|m{*d5k34f{Ym zFkCE8dMWP(fpkAUT*F8UmLEm)241TUPa+LB2`Jmk)I6|5;7I!%%-i3j#Vm8`RW8Dq zWPKe@nnrzJbDjKdcR2d{!Ntryd26`;>uY)>?DlZE;;9n20*vrJ@Zt!1DWi!L z^q+WtIA_);^x2UM^?R>{0Yz@|K~Blp=K$co=JqNlxI`7@w2ZGk|Wr;a1 zX|%v|LUAPg>`$QCZzpNR`qZQylTIQPjIJyzACNpEHn3LhtEWfwGu8DiOpQ(@g!{hN z$ouPL$N1Z7sm-D;GmJsPjxnAv1m4m^WOPxe&_-mVfT;bXzvBVa)80akU)1Say`7}YB=;Ks<4JZ-nCkbwtNIDtohb-JbJ-4bV~Fic%5P$A~F|Ke1c(iYMK8 zRC$Cd2N#j@YO~Tyk{J(aXCQ-`WR;Elo)n*jvKisv0NW~lD#z|c2a*Be4gZL*dV7Li zV((+HK`lD>_h1{SM7+~dNZ7ogr;$?>uM~5}4`TVA==cO;fn=vIM`JYx8$E4_)HUHX zZ<@YRk?T6IXAW||%ATR%s`+iO6(Y*s$p_5)j5!|d3V%okz3-~vqU6>U!JKr1=l zXKQlWg~lM}_~liP^ZqG0ca#0*HQ17 zYKhVO&{bd4Hva~h7S8#g7PoWO1@FC7>!O9SYdM>q6%k`l$9&=F?az=Mw7~!RG}84! zQ&;xEtnf1xU@5XXZL#wAH4irivUlFl*_6b2C8mb68D7yK@Q_>U-FIMIWMer#w%<2J zf~0@e)w$}@3*=l>$$8HUqMp%rp7G@5$|E+2Gh47?xo_>GFd&fUJvr+1bcYyuwH7l3$iqWenPt2u?aaF|ToD&lbJE?wHFAlmO^W6SvNnXB7bx z8+x(5SLq))h!j`Z$g|@Ymx%+m#8J8*NE@{0TqHEdP_L|^B`ToO;D`DT2R;YuKuSp4 zwT)o3gVrsFBBd#8?9;>=hP;ARPEd{4B*qeAbuF)GsY+BDNbLM<(wMg@;?|(7r!>$< z4?Li`I2RRz)@yr3zU8lFzX)w`KloG{&GMOPv#sFgxN$JMBQzWe*0Omz+AE`_Kv#3L zfB(l&LtJdLOHYC`K#aX~ElG%e-*#jFI?ba&QzK#>U-_Nu{WUo9;mb|`RR$cu)x3B* z*?^au+)dxq9&iHr@nX+){G!gAKJ%wvUk)}vpk z-qDvW9r=5b&A5Fid+~BoyI{S&fhm#QD8$`9wQM4E=W_w{8|#H+DIq_pf1H%ZpSV1s zz!;*)&FjB}Pi8XE*`2!QYp{kI(`I7eE7iHbvwq?LllvRY{`wO>>ZPR>@6*?NsC~Xo z^-C$2Z+%M`m{*0iKH^(TVYt2i_&dY~PtsPOPI+O@E3&5d;I1eKL zlsE)I_?^f#XVpqfS#QoTY<_brB8(Q_fRjOaTn-iH1nnSK^5s}BVB;ED5#zgj5;_19 zAzMG_ow&QVd0#3BuIn|f*e);noez(!sO zf{XD1%bzQS1n5t%h}W$2A9p3OBkVwAvY91C67-3m@jOjv^izJB7w&dqt;Vcb2IRnn za^U|DifW@E@&T?{^M#~LAxMhtZRwUBrTh1drMhF`^9_hRj`UR7Yc}LcwzXQQ;>mbg ziG99`>lnO=xnCU?cpx=NE)n@f$?WHB8$q}X{!5*SCspQBf^v+dn3W$yaM_ss9xxG5 ztju)d`R^3z&|TJC?zP%>G3HHtQ`1=axs&?!8q3$X1MxzB?N4=Q;jO7%#qitaGt`&C zVU314dT0#7hT;DoA-o)4EA^$1-|{Yx(YVDGadUml{`|qrM%kn|R%=dS7`=gWy{^hb zN>yAA+RE!<-M_9gy#0)+!C74X(wO-SSLUgN8?dWo*9Un)nBpg7lQ&8qP_^_T0>+CI z-gP(61w12x%5N`^e7dM2FP?23e@)@S$SZ72JsmdAqb&EcDfDO&w(TTAOC8AeXFqNI zO9<&-hCG@yw%eZK^0RnF(iI8`0dSc#vn495?3kn{jg6^9;e;Gy2eF_$gO@*zoJgxB z$RCPxjetG9oQp}Y#H)r=7iii-BSHYx^CTX2(U!P}c?Py)m+bFEl|4Q*hDJ}8y^#$C zcJ`~w7wfRNj&YQfXgzs#kQS0=q$lHC6#mh9M^*_q!qIX_LC*|J=>~cD*L#!g%n;!= z(TgRk-cM5}_<3rR3)EODi$w}*MSYBYvGz%gI^V<|UK>b9H%K70dY0LQHGWUsbEntX zCV#&T^U_|!<*gJ)cQUB1@vXxXi%sCc)EaMY@7T!HFAwo(s$ApKW&GV{jx*jxR9q9E z#F-!J?V=Q6!*2nRd#_1jEQu<5OXz{9X0Z&C*t65IDca3m{Mm0S@ilc(guM~*IHUQ@ zFt(I|c)(%VVQvTgscUWC*Gw$ar5+~M4?>=QY)_7JrU$-(5(^#@Ph}WqYOpfZr@Su8 zR<+L!sA=0d-d_pGq z?Yo$d#0!x}juBd`kdqv$yHBP09qXCWwJt4B2(Nd}ek)u_WbIj7@L_JpBk00}aLx;3 zvPD$Q7|3or^rZU4o+sknfuCaTrnx<&57pz~(_TG->1d|=6u!3pBeqJ){NPO$uxQR z&cT{2TEPObA`~Zg^y0?ldXV#HW;m(8Xec73u>*`J6o>!VJbRa|z3u?PfDEQaLpAk? z?2iOJyb^E!Op>odO-9{!a!QYe$OU{!3U%w{s+NdQh zd@uUDR2~WYaK5*qzG%Kn|3b%gk4AVeX?F$h{SP%cy~C1>Ng=ruAz0Hh==odMFl|ki z5!O30aDPSAC6}a7Eku%Y=x5!b`{@X>C!6 zwuTpjR(!Bdzo8b1B@chY6jYu(V4hQcGMj`rp@JR%_&TLgu3g-rl!B^}1I%-8{ZXDt z8>Pin@{+JljiHvfttgs_x0v4`ynJGLyxYrC+sorRf0K)mQ9WvgYbO{mS8~|#`CS=NP&A_ZeKU7o@J#mT@i~2JH@LtZ&p*j|IA@X zq+(;u;CG)Q(uin@6e3-sku!@<*-eHwD=AU)*VR71`l$`0Q)vkm$r`8uyOlFfvuebM zpfsUFUUtPTOh;5ej6ZdaA`2axCAz2LUOrYI%8?6ur_re4{IvzXWPmj`+$0eipq@g( zp+@YYt+`o*iKtrAXNxuf_(idk=Ir$g3at$rj^`3(wu}#7tLCt&DhjJPQJdJ9k?;T} z!VD_Taz{h@q1n1F50yvQcAQpEQs81rE1^qAPo{5gRv{MJB#rp&v8}cBq>qS(ki5;4zvE2d{4Cp)In_b)4V-hX~jZF8RD zoV=UdSaTo@WpW@(Ps0!97*Pr*P%Y8Ni2Ty0k0p9~d0zsek$)Pa0~sN~U-wVt+AUgW z9eLAP!X_d^rm-8hi}6&*URW`@L@7Z|H}R4u=CSWU2BAJh2=`%pnMb zmjw&qrwBSIt0Nb%gDgBmcPjgiwz*aKJHIr^R%=a#K!w>1|3=wsBnqrxVWe5(*P2-) zik&wxDjv0c`D2~#UoZG6UBOb_$p6!Pa^nxY)=jgJoA(E>Z(`Ij%KBO=So0owLkosp zS&bh-P0pzv8I_3AI&kCFK;Q5JDU_#jFEXhnZ)+VDEA*Y|J<$uT4cV|yjtKI3fI!W> zdIZAQQ#JaD86g z9!z9GsPCmXa4yG~GBogP7{*vQI_F_niGbt0$#7(YnLs%7rb*Cxc{}(%OlQ0O zkt9>O3J%gC})V$C6_r2gr_NBO$K?p+?4z8 zDaVtYnF)4!;_48ZP6P7Z|jbs9L-$xHy7-PHA=Y-5rO<6y^ zw3u*}pm+(?9Krx$UX{{qjCjLv(xjPzFO7RPyDL+h_L|vxy5<5>91duFbwFDt%5#_w!kY29$lG{K-OM0 z!xMMLT}t~atOZ>DjH)Ha-W0>mqZc=cndjzr&UQ~*EM)+(*&Rf`oRs%AlNc+ha2%?c zPQ>XOqzl{vPx`jtF>FFhv9JM3cm!F4cW1YL)f_;XEg^CPkC(P?+_F6dzP<3tuOBrT zOw=hya=;NK*KqL)^|t#ZS#vaYj#Or8Xar$YLdd9KbQmNE(_N0{$6iz&QY}UTz%p@ zJk3o&ua%~aYN^{h=Iw!#Jktn-OK&!=kKrftp#@RISx&+w0~8%0QiNLk(7}!YnZW?{ zi$Iu0B92I5u9UDQqoEeN|L+ELl$P2zQn^h=X)qv<*Ow2^CB2>yT+tGqmIMsl{7#0G zyFWSCQqmL?yL}g_q&Ns*O^a^(%MabuLmu4&Gvl38JukXcUmy8b6*D5K(OJN#v5)ux z1;w%+MF2bR#u#9eDYdKFM;H0qN98iJbgo6W)80mx3Z# zh(l@q6(Y=6lm*1>*#Oyc8|{BV{btv>4+7rvkvn4+gSn;zfc4649@Q<#06dL^Ncf;$ zJ0=dK84yKu!4X@eUPCP!Z#TGq`9E3Bf!C=Hi(x%ON88RI00>N6&OybknK`@r9{+ZH za#<6DV2ehipzb|(e@_e_L8PVi7d~~4rLLO;>Yc%Nu$-U?sjj%?Ul8A zU+e@x*kXA^#gVW}SQ&#i|5Y*@$B<)c38Z=ly?ozQdl;R!GNMX*b@j0f$ zana)G=)OVAX;C<6!<$~_TZ9gi2fID|-EIrYO)4N8f4O^e;lches>63~-=^^=lP?Dg zJrc`f^;Q`JVyW}g^BqB8%X@w^+|811m@M`@t0QNP?DWSy;i^g7G9vi7pa^LtNG6}~ z3Hh=F6Y`};1~?xCm@L|SD6@zEX#d=26terk_Fc_V*~G$U8%<5#tl@IRSp_}Jf&wZ) zOt`H+^5kJ5f3DD3B84U2zQ`E_>DBfttT6#SJJaBTral=US?IS(!ATy@eu=`jzmWqt zlz8n$0SVEZD4LWkMZ@M?=@;V9QoSR?e5L+Pw>7xyJ`M~1gSO3otpj_1drSlXs6eXC zuWFt65474Qhl66|%W{wB^M}N!nrNKhyD8bljOrJ&yNF4bjly$ZgHy~3JEh% zL;jTX|EhVLP8xh<4|!2>K4HR_2X)Va9DL{g>TLSXRI{nyEapoZ%ruZj9fKxkM;M*Z z;%&A!6ZRm!WOe@*Msa_WC-7N{^1+)1Z?`)GZE$x(zStLSY~4Z|v|clEK-Ew-`_179 z%NRan;xVLd)1HZaTaszJ-4-yV8#Y7iJi{AMVGGE5{I8WS8+BABObAW&#_T*`D;prJ z%U`9BMU+P&GRJPN6Zi?CE43g#F=YZ;HV150d0<8!7~MfcGw*Jgm6KU!%^hWQ^S$%z zv!a3JKZjWeLYvOsJ^@S?s1G!zH48Pm`INk}@F7}+5WaMwg^uhnA^1pm9chkw(3*l6 z0akuEqC5hTIgsI%{yTU7wA;5N^F3ay-S>|o{$a70 zTgj+j$*5_FQ`_y73_vyxihi4Y>Y_+1Q%;H=gn!`jgqRuK9zxP`%0n%<9(3D{W2VCG z{%>1>Q1usLSwv53qZQ(p2%eT4peGO1b!Q*d#mOQz-2GCQ8A4)`QSr$rE_ZB?`{H1+ zXhtLyj}V&tcac0<2o_jNWfCTc1sM%aF! z8A^{dz=d>4zHPtV-|%}RCJ>4+V%xrRQ`M(aG`R9!Hr#*Kl(3xW-3?jWCQWaSpaZS=_^}SD1_3-@O$hZPgYV$RGFQJy{SZ?pQ)2u zl8vC>ZJQr*)EfF`Tt9Gnx&BB(RO(0L0W;D}VAB4FMz?K|Um`+&rU=5fN5;J0w~fcu zw4oyC!e%QNl4f#Bfkg0O!VEiO`6&;Dli_c0Nufphg2UJkwR6eLQUV!0SWtliLxH0{r+B*68QU>>5sAZ^$<0YlEtKnFQT<|qC z^+C68YI=M;!l*;r!&SG3({RZ*yRCewZbGv;r zB1Q;>2%o2B2XPw@g>~&!YEqvSM}H_z3NLQ%LTS$x&1-K8~H1LsW?r%W!nhJSVjM4)%iu<~*^WfO%rNHlDZ!wbE5rVNa z*02=+K-ogecAFf)b*V~ShA!_w{z}aZRUF<5ZsTb|pz+lulU(Ovs7Ho{9%aM7T zL{b@B;76yr%+iql;;yTE@q`gcdXf%N+VPg4{vPG%EH$pNaNx^%S7qUer>pXmw5{v` zXf>3i%pyhT>85D`;kC;o3dY;gbR=wrgMc@=&>4e*5%S-iJTjiGy){Lge>$iKYr+2B zN%H;~{j>NC$@e-xSKzGcctsY&kazp;7EzV^J!<#~Bi@Og$oV3z|DyQ|@u8b5NVD~z z-?Jj=l>xF9I%wDW*nRX+;1Zh2+OSY3ws+L+0zkh*q<+-JnWlm z#@#S1KFR}nc$CO_{jD$CKW=&GS`ZhOZypV9>=^PRuq0Ig8u6Y&9m>68 z`Cv>)BrYLx&w?xR%9$R$*%Ck-NMp8ml!qW6KDkRJw)aXLB*SH1Z*V*ROu2!?VW{Ik zvf~+EVtfYZ5d$5w;qvX zYE2L2FxTdG`v5ZIjBq+7ALTe~z)W&j)hYPV@R?!h#i(kzC%wbgn6CO;eeKjg^bUG@ zwVp!g$>YmF0qAJRJ#)8L?57_E#~yAA^~f>O(<99m9q%#k2!v)yAwwU7es6s+QO=u{ zSo!=9E+eFI{EBF3K~NA>I;d4d1+$-lAhBz=%C8Yg;1y;%XR27`imf?CG`d2>jxu*v zqb3}LK4SRIjf|c8d%DrfKOOXTS6Jtz3#MrKx8g)T>17$Oc+c z7&jnn$?4>p(sMez(=+2j%qb}~Q|FOe%s{N&Z^|mn2#a#K@X$86@nJ#cld;HS~ z+fjd%nMDYUFO3(+d8!oJL z(|{k1`w9r0?p8aaq~ke<-6DI>M_RwRNl_`XV;SP+MW`6^!VDJZK$gpdSWAbd<_LQ)hm|2fzYpt9-Gcxt*SRT zxQL#cBxqiyhVGe>~ zA-gbv4fg?wmYxN4;t54RInwTlM(dJ7|1bLYA#}k1=T@fB%rGr@uu>UjuO%8?Ub$VK zpp}nltIV1BV1itq&8bx?{RBGTz5&Q5uhOjS!nvR6}F>eu(WU})!6ZS&AH)^`< z=CcuBe>!7|HMXyJEQgW@}#p&3eEtsTxA*%+AP*%y5!7dVD@*HY(l8bK zOj}2gJ>6~j(C$s?_z0%bDE_aa+mv7ev5%8ROST(2<7#S%{!qt{AAV}pws>bM2_yid z-CRfeG!)_#0p0?j;#~cQ5uY82hi+7^D(vsqzf@8*Vt*iobo(%Q`Hj3Ew2;tnn(OcO z2AU_nz;;D^-#mj_UEt{Az&WXrLssW2*^M3r%+Jjq=IJeQYpgdsWCiNOMO2B9%LEEp z;Bq!DsE!Ph)Ojkk8sqgzYxeVo_Csy^egD>jP*l-0Rm1_ODLhhSu66;kCN(z#Nei#> zh!OhRmmM^o&2M0l2f309*UPs@ruyd_2!6%~F%@eNkR$xorhC%iXEBXCzxGW5RD$yU z*9icnzrs5MYBPl>kMH=v-sFhFsXZGN#ElW+1`2GkAP<@$ zag`rVM{>(#&Rzhp9kZy&-!N^lO?tQFBZOO?)6STDUPvd6s896I(br+US&;f(O6*7I*DwuMC#P3s}K1FYn|dAmhq4tnd!o5wH#`GXq?kHQQu0k z4nZ_e4d#o<3Eu+J6W?I~MXqFptrI;H1m+NmWFZas?i)$xN=3UFazkL=49~DDbc640b^#(M-|9I4Ft1# zCo2IF-u9s>LWbKk@rZgxq}6sjDdZ6ow0a0a0kQECLPQ{jZzu$jUO!vyY_HU^X&^Qt z-hj#T%9r-{fw%e6BiloiRmSj6uF5fJz-;TQix6q*?K|@4$j?>h{$B2m*CfoyphAxy z)=s&MyS8Bnt%!c#6<+@%{6}8f{^IO_tKA_RkT-neEQ8S4usm*2WI)P*5f=-J9L=HI zG`NwCmz_JQxrp9Ecg@@O?Qv`fA^H-pB4GF#GweBTI0|^%{*ejU!w;5dOPfL@q>Kti zBI-UHduZmcQjSAb{D-wF1$kZsDg$#rs=>`ahTi~nZn>84=?VmE+%AvTMO^sfx32jF z)4poVukMtRq?5iT;AV@-HzUC*VzlH{rQ+7f zH*t0TBlVG_f3g^BpD&z-AW`Zm(o2mMSe$Do9$nDYcu8mk*T#j$cMjfI+DL*ig3HQy zWH!nwO2(~r9QuV%@H2h~@+%|eIJ3cB>Mjh4jR)Vo$>WGW_wIkhcmI10zu(+^JbL}r zJU2jB+as62vVVQEy<iAfq5sD9><_(%MV0L)Vy$TtY?^;`A+>0*%_@ZoFqA zsX4BR-LZYv24Tkb{6{K zja2Phu;_2`ABQkYf3DJ8qUj)n%*Ed#_Gf(W(PsaMq&kao|N7%Bif{s+AM3wnB3OTL z!~0&y{w}J~w|9XFILwel)O@p-L@tx>(*3~)SM3N$9A|j#)hu4?;fNi5ZR!$}`W*j` z32f~MX`9PUfOWS}x;MqIuN}jZHL>Qne8Gp=&@+U9bd?D2E37d4MoYKnxia+zPRFko z+H_o+A^PuSi;dv~p1eL2TgAPb>POGv&`R|`&zS+IbV z`$*d*qn>k(MvOGne@cCc>ETRfSHysf#mL6Drdj6k^0wQf$=Mnx-*}fKm=f|Q|pwHTuy-%Sj zsnJ4z&t5!0HkikQgK96N^D{y0CrdPhifE*afREl}D%>@F*L;^Fc-pbfN2t&EBYIJ4 z*lj_`kIpYvjl)*oz=Oriu+YviSe`*^PBmh7sxSTK5MCcIM7yNK%$|CXab$zH=+hH+ zs^h8bhgt&nKL3;l(Hi!|MmH*}^c(w`Pi}#Whp=UUqpRDRCy#taznr?G-IQ#`*UVPE z0v6vmzP#d`5Mx|H8dS%E4ACFRz9?gJ`svL_PT7?oQnO-PByw2f`bk2((~Z%mC&3M6({7k&YY6 z7^^QE%=auw=!3Jx%CC(J*+{fRuEMr6X|1aSgoDP|$GOkA+IF}7Vk2>vkj>4q>i;tQ zlW~5Zm3+!uYnL3c7Zs5d-{dwFg#Yl#Dx;6r#EL<=Fv7~>miunRB)n1Q!uXHe@5p6| z6iz>2K8tx?M2y2cH}FK&0aru$QE?Qb4^j9rqYou+C;fBD-(tDyV3I+M_Cznd2h zxyR>)S_Q~YOm;vv3X2^sWxVTOKZ4N8fLK-wBGc>u@~W{L+iX-nC;X4V0nXh!{r9Jh zh}(RjOCj*9B?8RAHp+o4d$exPW1~ZXzbwXCT-V0BffL53#7}lw2uOd<5tMi9xa6|p z3&Q~fp+b~s!pL=3zj5>lBn>N4o(BSn*1cqdJd*mTeLDt$uSTXL{A3@*^lK07$Y~WX z`fjHbQY$5a${WAci77`gAq|#WMjNML_g3CvGceg69x~ECRh~6}5|Ga;Pm16t7NykA zRryGJxg(ba~&|Uu`I8xnf zgFynFxNcJEX)zKYVBI4y+$HQDe$o9}75;z(I6LSwJ|yV%ow<6&Hk4~`bUUSKn1 zs}E4I-Yh+RFonhSI><&0#xzLA>B`b^#-XYfqYxnhD^;;mCp?S(Hh6wre6f{vZg01J!d|VN4 z*yaGzb`wzycU{dRe~M5>Jm||2;^IG|#$B7n!uSwS@^hZXefcn6_0|vflom=iLA+`+ z`L0`eNOFoPxgTN2fbCqSrg;w1W zyS7>JZ!+Ss+EJeN8Kf*9cKUdzLtgzT5oyvXb+rE!gK0C)S)0ys=+$%ZwYfyC*XNx$ zUv@TyUKSy!a(<^BpWP*S0QMuqYFSir*egNh(qJ5N0+s2-)ivm)vZqb|BA`y(E$*Vf z|3Djyh^%YrXt+R^`MtG1wTS`#ao}&~o|y zs^jY~hncj)tNb+p!N-X7)_R`5r+e`0CMw9VwRbe?uRNdh(XZ{{i=aOd1lcI)<#>U} zYx*a>-U1L2DwCx)S!JSdpLLA~LO3a!`{=t09xPhx6U&ZqpGm3j0aED8MhYO;k} zJk!ZOtYKEn#byQ0l`uQF-~MQ?TB3R?cdp!$YefuwF>3J$c~Fn9x`6{2IL0yRhN~Ygu><5GiwXO7< zTBe|WgUJil&05fRh=PB#UiT~j1p!I$T~Bn;CGv|qudyiDGrf^O&8wPhuv$LdUgm{s zLpgW}4(9lG&}{-9?eu=TGRjtHj>DImjuU+Fy|P9r`2_E?DQ*;vQ~moBjrh&mN2esC!OvuE}cf2Do4%DGD^{y8B36vc!V)z8bJ$eEwL}5kJc$f=X=(5}P=fJ>+$!e_Q zy5-GXZ1m~(;RgQV!so+oKJ|s0e^myHeCT>u$?dy53u&m~TdN9{ymbH@mdJzD?S>ro z>Q?-uvi_dC&ls$9#B@2k$e?h2nk22`tg6&3j$ltt3fQccMCP+3HS$ zN-u_xy|GMIGvZ@562|_{`2Wnh54iZme+Hgs<+Jhr&yjZgNp(sG`cJ+o@OCh|C3caKy*2u9a1-Km1*cgG*mLV8E#ffQ$n3nOgwwfHv8_-wBj5_?RI5s8dMFj1+o zN!iLMG*IJ1r1`dK7MiZKW;p4-7q^YWA3~(rwrN)8k$E%D1J`%Q$H&`Nx%5c7C`2*M zt&NaJR_n98pDxe-PiJo#7S;2{4-B~bOp@{1f{kU zm2-GyG*lHC3*=?_*Zy&qQO_r-i7FD2D*E6VXnBa#f1>__oY!~jVY0ris%f<8VE-&^ zSPnNmC5#Q8;C_D6-`{^Sd(&6{{5gli9a2#ZD>L5hHPOeHqIgouW{WmM3k;M`BSpMW z9;~h^Fq!n!86B}d)Jlr3Z{iNZ$2w-?Z=O}v^Wb8|gaYiAW#B`Dpy>|Xkl#Ip#Inuo zhrUv?R>@Md=C@n!Zq;^9~w*bH?-$jeB_=pE#vZb9-paY*fB>VO3I((Ul zYazq1)Z(@9-PVYlPjT?UyP1xT+Fa+qE0_CQkD_kVbSp`|`nMfAgCEtr{6>dixR*`r z55Z5Jwem*U*NJC+_@DHVfm}JHfM``lDOTc*(T~Z$YlgMA)zd`+vVPh>tQUS{+5r~01#B=7v&O9D^u_1ru%HA{EHN1k@{EM$9D znEA`C>%QyC3^&`|4Oq*J73_KXOJe9Q4sn9z(bd$O*)t=JN?#xS#N^D5`f$wyF)BA~ zv&d0R1l}uyp}Fuh&?llB00|K{gt!bs68fTR)QcErc~JWe;7{fFA09zz!j&uhL0avb z0ZLj{fpR7ru2_zS_#bcj{#)%@=n#aaQywJ@d3tF7`P31Y7N>GKxqY*2*O{sOMN-5_ zp>K``A$lM8?pR!ya4a?`$K?Z4l!FS&6NX|enwGZ0XS6d(Byr@EcTb=WfdeL# z;IQT2&N;=n$EGlVP)2RpmaSN8UHHPkzA#>DoM8`RD264#M)v62Tq$INe&1@A*?_(r zKxOY^oI5()kIRuVKJFp~lEs^M!;cqkgGKw}bO2V=hlbwFLDWL_DR7a13+=Wmk=GKk zOIE}P9)iPfn66z$J!clkf9}w+t!Ncs(pqxq!EgRnIDOF7lg%G_ii^AEZfy5;@acPD zGKfkm4z#|_GlP^yUL_MD?W*6}rSr}IC#Pzf(|*|;D@O1q*1nQ*%8>lqfvD*rrqc$` zhbC$7A`?Du&OgM!;f+mhey5IbYOHzk+S@)5DiaxHH!9iNHD@yWQ$u717!A2A>Db4PSyRN^m2XcS#$&(6? z3e|z3kK*Hxi%yd+)CVCJ_{b+@`!))Z9_S4TK@>Bk=DyvEheqwAQ9v|kc2++uvTec*X6{km{A;0HGp!>xEEc3`7>v zzL2;%_%}4n@M+G7S|l3Lx=IJBOsQGL_m$+<~y?D3f^2^uS8`R8)T^zt2DK4@+0Jp3t zKQv9Q`azT6&xx^cN51`+I)~QcI)G`ocH(!x#931j%2%8KZt)B{_MO%_0fD2mglu-7n#Y4}`xro!<2-$%`P&N?^WqGP#_BW}O;TyK zKq`8T1tf=@e0XHr^LF&HZ?9cs33nl;mA8ZdMdh9bMH7{Ijc6JMqrx=n-Vsr&bb!{5lxd-WZfa}q zmOQDh=wV0-F-+`Z%{EB7MSrvgTt#_WvRN+D+k~z=06``1mc4?8Om8uK)E`d3My|Wk zLhCi9#{Ag3`?_aG{6uShVnbnKaWyIV6=ICA_7&l$=YHDZ(GoDRm=7Fz3X7!b>cegFC_UL%6q{8gs; zr<^;2jeL2uqEa0{bau>57n?}0hnEe?tNF=uh$>a*mP!@KEG@_SOOs)G-{xiO`+n~<3NW92-P7v zRn(5PyFKf5M=}a@@StgWpuJSoqit^q?}9p1FVd z0tpgE=SpOG$h7+3-K35@b9c{#1hJv>r0m|UOYL0!J$@EM16A*c0G&MOfjLiSIC7l( z_r^Cg>DbYQ_y%%1(n{YnWQVVjwS<$NcElixAOUPVHm9a8G-p*DE=pDRc+k&*S05Hl zmkPGCDK5U*pUJ5XuY;^LTs}!>L;igRmg~C%?#`QE7kPJ|szO;6UCu=Tw+AI;Nnm0P z|AuXe$Qv!mwJkG^s|CN)I@4xm!wp@FyTmx93!DJ18RI?fDSRt$BoO4CaI)Hb`Rjx@ zN{3P6&-U%l_{6~dEMh~R;UtX9FA?@LiUvw+FfQRz4HozHIu5QzU2COv#;6V>w*3*& z>*-ITkD2d2)dpnhMMjL?!E%J9L`-Hl+ee1?kN%+jb7wQJ*-bMw4TQU}IvuQg!6hRx z7&;>oa>!6Jt|g&KeUd8juqOIExtd})e?pIRoh$KJ7kR>x(vq~ys@Y&3x_(r2`jb-jr zJ3UOdGYo(`p2K2*0+*p*F-N_AKK3W3&g9$8qXMq^Nt003sLd~fo{tRh*!)}hV5AD< z=5bGBc!aE&FN;^+dC*k9A=((X5u$wx^9|&*dHn1 z!?2+0FC{DX6jgAPf7$YrI`!&{VR35BY5~zU{76t!VW3#6miBI8x7wqL?J9wagvsue$qZ{21zQF_qx&| zKIE$fgY7S4Jvxw`FL`!F$2K1qa%wSdHbd+}#^spxjj7GXipzECIKAy`HOWIddVPwl z(qUYhApedKS3+uLqq*^vn(B-_>y^j_xQugGg@|#n6)(h4AK0gTAY0VNEk;1HZc4TC zcJjL+NZ_X$s}vI&Yra$15c-NJ`@W{uXY86|bBbg`iEwXGt4QI2_r&m%D(9oScS`!e z(3CSk|NE@LZudUT+UAB6$(=ho8I52$I{Pm8C~JGxz0Xf;a_G-vKml<_1;k%4kifCH zUIT}F=E%z!P}*l(ytmd1@gb#94+Qc6meY&Wt5|*qWQWcnD)Gfczhj}CU;Gid8S~15 zwXJ7#L`{s|@b+Yda{4QJhSz>h>eLcB7ehs!%L$Pyz4)1cnYZ`!f(2#~#|fXb>&s+) zja4;)&x?irdR37bGqHE*x$R9MA$#}p3|2rw;WX69gkG+u-{Aci;^ec9e|GZLV`_ZF zFqsiK{H#A0dKYkkem|RjDir(({}tMCkh{D3Z8$w(uGtnCO2>+Re$S6KWNxV`$uLo& z6^Du$K31O3=ln?9Qjncvf1wu%nVR(1iT$w%|5(t-N|I!4w;4WLVcPY#dJe7;LU@_!-lehy&G31(=vCDB^p!UQ?iA8kFCuBZ~e+pAC_ZZKCxg{n@c|9E*{GI zryl&)#5PZ=FrI;)41B>BYx=~=(D4^F^m{h*d1RD0jnb@0b-L)SCYeGa`wMs=Wk6cc z2T;CCKdZoExwQmA=i!d&?N#17+?WGnnkZX@G5}g`t@`a*=NSv{_=?qQau?^o{}_RZ80z9hx3I+}MS4>` ze%r23`Z0q*h*8qG&ok%vV4q{LlAkUdNl^3-ByMipqG{RgtyCoczIb4cuZKUrFMh@`||q z-wRaH2}^5JGJ2vvmon$$3D$w{#&jh{d{-LB*sVmaeSANz;BF~>zP*?JFaCn?e<5sc zlJ!5Q3!J)3-J|Cu)$wVv43665(m0el`(0sA4PV4>W`ss(4YPB~?a z_-A~6)^Xa`&vD8Yz%95qozLYa7{=+gH}m*-?%|(s*zdA!57cD4WRq0d(^t1nnb+s{ zTQ_o^UwW^S8lp^|S-7s5YYW(t4ZbsV+2j-jXC&C>=(Pwk-DNC#=6tk#eRr~V&OsHj zTE^{QVU4#;JRNC>1-~JEwD_~na4Q#RtC3J^Pb($RE0Cc5 zyuBs_=tBjJ3SiiWo}yVaVe5=Vf6yEm8Cv8YafV3N zx2)(|l9V1!U83sA^|mWn+rB;XHE(#?X;7s$)g}w+b;Bv4hzUUVuP+nVGNGC_Ir!#$ zkfqx8_I%&Q%(i)bOnaFYU76c69jfFrf#&^}XCm{*27HKpin~PasyxL58Oa7mhj$nV zrc?%+y_Uj{ozg}`)hp;P&KqlxL1u4nyd7kmFIisf5xv14R)LT7U`pzKX=sLGS&)gP#{k$L>}&CC9mfp29`Aps4BeADiCMqH}cb2c$)dh5NigC_Y; zdrgd7WHr7MVbq&m{;iIZHA!0tXK>*da+kwx6o9eh_vNH-?i!ef#W?po?QU?Zd;E2+ zsXz8bPyr~R-dR+x6od@W%R!h&iZR%|9yIy-v=`#CPvmI6JJ=1TxJEj?xOH|P%B0R5 z-6>eVqe6j$zEGQW_m7;n=%xdw2E?jP@t}W@SoF16vdBse=lTWLgSSHqRyN`YZ~U#% z;sa+y_C;9&+W%Nj!(bQ@O(Y=3!vIcscS$sl4MSFsXOwbr3}*83>rG6*!-ExKP?ciq zVWLlb{P4mZf3HqK9MLv6FR!fNR6(fZi_V2B`~*qw0yOpeomSRA3y*z&9rglNX!{!v zlc_bp^3cEJ%S-`aibV1&gY(vmv8AJcCk1$(k;`DqK<+^yXRue1uu-snEV75L>_Ey6 zW8JGhV_Z_2qH|9I2?S3HY+p2x(~;o6rRPnn%^F8}P>P+0At6ESmnvVn?;;V0LfzO= zZj#s$IrFY|Rtjk4V*$|t&hn~nc3t&`V6l{xVJh#FBIRZija}&=Z^S~Bs0Y-%6QuQ; zC3+L>T;u;lk)d_kGj0b`HLX$#7H}W{Xo(=P(=j0F_g-Xo%53@k2=@k_xxWna+Q5ZK z!BTnct(LFyphM0WH=zTTDHd3e$MQ&VK)8*>JvgyCo~?M^X(28N}=NrG`klW@{Yhm&b&Ve|D#<7E`!A z;DnczVo}XQ^?ZT~uedN7j4R|n^0IBFS@`Cv@-sW@>YvFM)`I6q=C-^WI{c!qYE!1% zlE8s$vC8>RC~w(%#VZMrxtcL5ud7zIMI_W?n*+jXF1~j{mP-UtWdGhZ+L=jKQh=kt z>B!#|6rOZ~ICI26PgZ8!Xb!y0)s+++CCYp}HXuTMAVvTvnEErfY#aNm3c*OAd8=Py zmbe)nBdz1imB|@>aKxVgJ@Z=IksDm%Zp`4QA4SO;k#6#9_XV~G4XdcU0xFdeI7A7E$d$(xAx>Q`(dnX4sty@|fKZ2o8Y8Vg(>;f~E zU9ZiQW&=)<$^+<43U9LeR)h}DPTsrjorfQQQM2N=Yt2<@5$A?5;)YjxT84YT zNw%c1*%pchf}>(KNwX`uno2Zp|31k61~;7Gnn(`R)ugn~#i@RXM<0T*cb4lUdSecO z>?exnEnBXFkNsx9PgK)LQvqF&SI9yUQE1G7$)x0PGLpt<>RV^v`tlE4EFagcgqpk; zGYb(_04u zd$2&gO{oV*q%s8(K2LH!EprXNFocVxQQsKwmC9M@l{Av3NDVZj3o=228X{?2sF$A{ z{iOKGgpWp}kAQ2uwVw%IT1_AYnVr(LEVjPjA=g{&ft`Tp6eFX3eX96YU}q+3o+0di zEwSK9N|Q3#=d_OQbg9~-hod2`MxO`qlpLORsdQA4-Zw&2NXov;PkWBaCAexLv zpCfI?Yn20??H>J4GJ|@LN;x=Alp3`&1;_>-1?XTwVXFej)@88|IjP{}R~hsiySTM{ z%yj=XNdx^(S#bY*NDn_dTgM=%;fFJ3gvf1p>_fjQRflrv99nGVP{ zdW5vr38}IPtgtI3ML- z`C+p)wI=a9;odI?Q79s`PVkVSB?#@_M%wEq&E@mW$UQa_QLl4yrereD70Sk;w!8zT z%hSi7-um;@pN1hYfXr;fON&cly`oEaI``iym|?Lc{@a|_Z&&=I;_`s3cf1TK;}Pd+ zl0WZQ2yb|Oc#{0|1SJ)bJzu59*H^gL86Tm_;FFC%)X9IDtWAFKMU~gB?MVewTtMD1 z%ul~s%#OBaD7dW>eP8O>w_F83_bw*$SSC4HBX0kYkDldW>&w;EzaKicG?|U#TVMP; zdo@!XouOD1qb^@Dq)}v3vB|w+^Ln(7v5)K9iBDK&Dkge}AE6dQRN+oIsLwX5LAkBE ze1`>3nt1k9PxY9vKEuO0_6Qga?0iH|Sdfu7Ek&n19Y zF5B~oc*bm>xRmHIBIC{tg{O)rkM!qg$t384=33{A!OC(`%69lO|?Z3W^yiTM*>i7E4LV(5qn3m&IMECO8o}k`wqL|!siPFiJ|MREGU0o zTYs%IyvqZ{q5A$<30VEdixkzd&!Z^Y$(xuM#XoUaNJF?bu5zVoyo`-|0IzryJ9@nN zw_F{L>OGY_#0x27++{-bF`;OzD#)WRKpc+x{$*8E@g)oCN-zk#G+=VTnULO2>!(Qh zp*5;v7Hy(x%z*_Cc%1c&E6W z0fy#=GYM=J50J9dNvgM%rw}H1sXx=c=jqVtbN0>gN=~?vx}RNB40>Bx5I|A}$eb9s zO5EAr!s{^5or(o{p33$y2gaba;_WHJSoEqCJ#j4Ypx>9vIML=Z0#-PD+)RRe8-OMY z?VdQyV4$|JksU{i$1YQ{jGe#M#)`%s>%V1O-QSOWv*W;u8VP@t$WEgwuZQQSYk8DC z(N0Fm_f+pP;#=jF_&XXeEhwtc(231bIi+l@Ku~7c9d@{I+_i&BTz~V)9|yN}Y*^gayjG5?G@@Vr(Wku~3jkO&vfgeU=1ISn8YTZg&fUh9I0BJ(=5h+W08S=AVo? zXI=7&LA{W|AI9T;D=l!}>8`d?p9eaqDajjU6HhK=&$+&OsNmChU+j^mm^$~IfLgqc zpDaWXR`%t>GzvFr#lk~6I7oj*Lb+>C6L>aM0?iA4w2F@E?EENU!JhC@gY+^xH9MV*4NMwYW&GIX4-#tf z%yN7hD~(R(S$dCsABd%71WFg%S#Y^rgAEHcyXo7d)EwkEpYw3a_T$TzH{p{Xed%qw z6zm?2v#R=Xp1`sM);N50^*`ZBII(t0kHhhS|-d1|*;X14%Kx{hC^ z$895Rw&V&4jmuE2YUQ76UVo12SU(CZ?LSQf+YTx0vR_wPeF9yoKU%K?4h5jOeZol0 zh}6HM3sdaRcT!1vR3`a$mbLplyYt6XoB_?Y1xo5eh=(38>In10FFGhn?GV2-IAsg4 zwzK(akAn^qEn1L_cbbS0Rd{zZ2@gP|HqFK%Q(r^H*0fN3oj+cU`=yu)Lpc=WT1{{% zDcFUTgQdQZFJ@-@CA2kIGIL?7HC^g&)4tOH-)+&y{(>Rtwz%{;`lHnl?vU4I8HvB5 zfe28{aSt|o_18#pseLyxlh%%wBlnH#qgcR`3fEee5ru0;fpmzwJNE5|Qy*XA4Skfa z4F_e1b6GKSsu`bqA8WQH`3c*7Wks*4jl0Wy5JK>))1=PuR4!!M-o8R0C;&7aDsJjjp10SqfQ1_*?0H|bYdTZP6 zSovXxI{#ZVW#yi-t6cLBFPQD=jnXtiro;=yDCF=6pcRM;8fw~zOS^G6DsK6)cEV1( z++4qeuvq+zzy(l$KCS+;ge!CCY!NT8`dc3kB!p(S7lqpqE_1O{d?g8a35XYPg^;qY>^5HE4rfq1#USz9w-hHftlpILA5>#jePb})$Cp?FC6^bj`m($l_@#FI5Vgq!FS zVVOmT12NvC64cXDlhAcqJJksw-D=Sak6&=~!?n2;S4zjeeq?Te&Rm&{0xHyF=XH7f z_%A|`P6DCKRZ~YS0lS7)c@M9$nwUm{M8%rGd6L9KOb#kCGBbOAqGiuu$gO5s{K#We z9%&>5Re%Ua0c$o`2<<+=XOu1xQfiI#9W^0F^xGnxGeFD;!ye#QMh*RL+yF2m1eMw? zi-dR_&EtD4{ui!16}%bR7Gv|q3n3*(hJS>;{Sk?%T`^h&#l<_l_Tg4_U9|je6E_3> zXgMV{JRXGfz!56SV>EZz-n)pM8sEvTEDgC=e@FtEdBg-Xlz6ORH7-sEAv-dI;%YwO znn-lZNs?@SUxo(lUWYEbxNp0rEWP5bX07`bAwlu?{SQN!M0UwG%{dfs0+EQAMA|eh zCxH$*k)CxKLkl))Loja(dBaxIM<(G@PpN)a?%en1*z5yq0){fE92&uBP#L}HM`K3S zu3E*0M{Ji74>rQ_;{fG{+a%w*HV01ao}Rv=EtL^eHle~Of@x-p0iGK%pRP=s!SPMHm&UKjq2FyP zg5JMr_57y39`O86-bAs#B(lb^;(Ib?6jGmi+|?D^T(jPw<+O6%IHYijQ{~wUWfq_j zi+3bi+QW@vXrY4%)z+e~+#Lp8`8|_I{fgGxG*g)8s6C5pzOnV8YwTzyg*^!|vg!R! zP0cMZ2bf_cQg{GihU~AzfR1+6Yy>JD{Qar$c9nsyB%HoP4epCbI0&ia@~Vy(BfetZmm~mIy*_qlVHin5mVJ=N*`x zF!#l}<7rxNW?Ljpd08mXk~Z~ak8kVx&yQS^(d{~3AMcs$0P(?wD{)Zp^VkbE+P7Rz zJ0rLUZ372>kBU-}3xv44;XRkAmbl z=nqX>jlQr>uW$=B8Pi+MujY?=nq$RHO|8BF$i<)cb9@~zbVw9Ro#^{L>NibCqpj@x zB+({Z7ayK(q@-Nsh8|Ko{i788NSv~H58j47A+xL zkXZ`=kCf^Q{;LYeoOszr*BH2zk`<0U>08ff~><~;JzNA z^B&#Yl#5;8dl5b_h|jq4>H`KO<-k=Y?b+{Qou+wcjKpC0d~>Tlavl~QXr0MyO30p@ zHT(lK^t~$U=Olz;JI-id`0Bb`KuMwL=kizH0~LG=b>I3`!T7cmBXxJ22C10rV3Hi5 zB7?Y|V4~=v2Up(H)K;<8)}K!-{{HjD!{x8Yaw{q0*pQJ8E9cDlaL*lHD90*6aq9^_ zji*8<73!wcFR^?bioAT!Tj!SR^^1L*5|4AjrGS!0zaltfJ8mw>1hS&9@AZPG_NyKj zYJ>64CzUhlg5Fu@wa0ws?T-{o!jvG(Qclt>l#{-%MqW5Y?i?y+eU2|zg^$Cc?iqt0sucehle0}!}Fo-i~ZjW^=)aEy;(FJcsS^HI}G_t&y zU(W`|;bR$owAS0@LFo2W_3@4~&Z%8jbJ zIDV0%p5$GX*qdoyA9il{c1pnvHJ8r@#m{oEj{s%uZcjHB`bZpy?9u+=pPQgOdoK2Q z`!Z2seYAc2?&mZEdx?i3!+F+C(|tP_1UVfjkM#`K|FQTf&shOA_9fNQQKgO|mQba) zKkv}q`*7-Ns(=F7GOw~3SNw1E63J*c=g-uKRgqRzxZ_oh32!efVI=<5VQbK$ZGIRR z(BM*!{&QAYtaNSI`u&UFT5BCMqRlP#Hdd~hN<<~fH|MtmV9RNe*b7B;>}PgsqT#+& zb&GwZT2sBj;S2Qk3(Z6Y=lM5rgw(%v?mTGFDgitwbcVs8@@TVvW)i19_%>yPNaK#wAe(L0aV+SQA9LGc4WVi3^LFcZ>t^JB77yb5W>LTXQ9|{` z(*@o)Ts7||mEX=Dcs&WNX};6&c>ngcS`c~n1n-S#nK%$jH2lv{QcrZ!~YhmcHJD}(( z^A`WEPk*L#Q$kX|izyLfF1JTPMDuLjI*0v)yDwPb&Xx+i(Yla80u_LtA~NRBY;VcC}({C`t|MU%b>v0JwGErFojM#Fy*OPW+DE- zaqe>!z)1b82q9ZnBsHFV4rPiH{Q>3Y0_$X$J7sNpkdo;y_qTjSZ@c~Sm>7_*B0i_^ zVn>!;9SZM$O`$$@F?W3P;!|pykAo9>@X6Nh7VuG8=w1ls=}pKzP6&^1n19;D z^30V=vZJ%fLe`EAGftJcA1lg?ZgWK(x$Kje%`%32l1L79RNFu(#LU7-s|=3ru~2ck zHzsvlz0-85A&7!azXdp#LrOPpN)e&cL~!HkhL`6JUZerhLl=xJ%O0b zX$_-*!(;~0jN9ndf1U3Iuh|QijjBK!)THP;5y#7%<2ZQ|Ikes|0%L}_;2M*rY_Ba z^@=FKGDbhp$5`s6AT8G@y*N(;O&#Xuk0?^QB;fC1>dwq{VXQ*-c>r`@zCKT)M#oXT zfc37-K21{L=cw=tE=f~Bl;c&d^j}J>51sDlsij-@1&^fJy>IY79^^JY!wxAO*)SIJ ze`?^$Wc>tq-%VG-S{vT5ks?00t%}3&Ng*g*kx>-Ypu2)D@7Un)y?kox)vi9JGsF8H zlA`&VM0(G&+b@iX9hpWCGi)*aLsMO{)w0^Eu`FZA=Q>?=N&}s}K;VGIrE}+f{e}2P zTx$g;RD)7%-)T)Vmwffn@YyUWss&OCPnL68{SJ)X8C)(&O?RmlixI8`1)?v^M_T#6 zf|p;6(f_q3xjbPm z`L=^1MWuG0hj=Y4@WZQfZ4p-fiRqp}4Sv0Nu}qw5O>+wJe2H@lQU=qZNMo<(pPadP zQIxLtuBZe9+VBtzqNPuGCjurCOVWaRFqhRJ!RO&-ecbrI+w1?*)v+x)*OYp(RT>)Q zk;Jx=h}9sBlj|(hZqUcp>{eEbY^Q+gpVglfHB&XM1HxNjesF=lBaTf|-Yk+dhvI*KLHsY#4#4!)GXSd*`~3XxRZU4-u|nP|^#1{S CETK~X literal 0 HcmV?d00001 diff --git a/book/06-github/images/markdown-01-example.png b/images/markdown-01-example.png similarity index 100% rename from book/06-github/images/markdown-01-example.png rename to images/markdown-01-example.png diff --git a/book/06-github/images/markdown-02-tasks.png b/images/markdown-02-tasks.png similarity index 100% rename from book/06-github/images/markdown-02-tasks.png rename to images/markdown-02-tasks.png diff --git a/book/06-github/images/markdown-03-task-summary.png b/images/markdown-03-task-summary.png similarity index 100% rename from book/06-github/images/markdown-03-task-summary.png rename to images/markdown-03-task-summary.png diff --git a/book/06-github/images/markdown-04-fenced-code.png b/images/markdown-04-fenced-code.png similarity index 100% rename from book/06-github/images/markdown-04-fenced-code.png rename to images/markdown-04-fenced-code.png diff --git a/book/06-github/images/markdown-05-quote.png b/images/markdown-05-quote.png similarity index 100% rename from book/06-github/images/markdown-05-quote.png rename to images/markdown-05-quote.png diff --git a/book/06-github/images/markdown-06-emoji-complete.png b/images/markdown-06-emoji-complete.png similarity index 100% rename from book/06-github/images/markdown-06-emoji-complete.png rename to images/markdown-06-emoji-complete.png diff --git a/book/06-github/images/markdown-07-emoji.png b/images/markdown-07-emoji.png similarity index 100% rename from book/06-github/images/markdown-07-emoji.png rename to images/markdown-07-emoji.png diff --git a/book/06-github/images/markdown-08-drag-drop.png b/images/markdown-08-drag-drop.png similarity index 100% rename from book/06-github/images/markdown-08-drag-drop.png rename to images/markdown-08-drag-drop.png diff --git a/book/06-github/images/mentions-01-syntax.png b/images/mentions-01-syntax.png similarity index 100% rename from book/06-github/images/mentions-01-syntax.png rename to images/mentions-01-syntax.png diff --git a/book/06-github/images/mentions-02-render.png b/images/mentions-02-render.png similarity index 100% rename from book/06-github/images/mentions-02-render.png rename to images/mentions-02-render.png diff --git a/book/06-github/images/mentions-03-closed.png b/images/mentions-03-closed.png similarity index 100% rename from book/06-github/images/mentions-03-closed.png rename to images/mentions-03-closed.png diff --git a/book/05-distributed-git/images/merging-workflows-1.png b/images/merging-workflows-1.png similarity index 100% rename from book/05-distributed-git/images/merging-workflows-1.png rename to images/merging-workflows-1.png diff --git a/book/05-distributed-git/images/merging-workflows-2.png b/images/merging-workflows-2.png similarity index 100% rename from book/05-distributed-git/images/merging-workflows-2.png rename to images/merging-workflows-2.png diff --git a/book/05-distributed-git/images/merging-workflows-3.png b/images/merging-workflows-3.png similarity index 100% rename from book/05-distributed-git/images/merging-workflows-3.png rename to images/merging-workflows-3.png diff --git a/book/05-distributed-git/images/merging-workflows-4 2.png b/images/merging-workflows-4 2.png similarity index 100% rename from book/05-distributed-git/images/merging-workflows-4 2.png rename to images/merging-workflows-4 2.png diff --git a/book/05-distributed-git/images/merging-workflows-4.png b/images/merging-workflows-4.png similarity index 100% rename from book/05-distributed-git/images/merging-workflows-4.png rename to images/merging-workflows-4.png diff --git a/book/05-distributed-git/images/merging-workflows-5.png b/images/merging-workflows-5.png similarity index 100% rename from book/05-distributed-git/images/merging-workflows-5.png rename to images/merging-workflows-5.png diff --git a/book/06-github/images/new-repo.png b/images/new-repo.png similarity index 100% rename from book/06-github/images/new-repo.png rename to images/new-repo.png diff --git a/book/06-github/images/neworg.png b/images/neworg.png similarity index 100% rename from book/06-github/images/neworg.png rename to images/neworg.png diff --git a/book/06-github/images/newrepo.png b/images/newrepo.png similarity index 100% rename from book/06-github/images/newrepo.png rename to images/newrepo.png diff --git a/book/06-github/images/newrepoform.png b/images/newrepoform.png similarity index 100% rename from book/06-github/images/newrepoform.png rename to images/newrepoform.png diff --git a/book/06-github/images/notifications.png b/images/notifications.png similarity index 100% rename from book/06-github/images/notifications.png rename to images/notifications.png diff --git a/book/06-github/images/orgs-01-page.png b/images/orgs-01-page.png similarity index 100% rename from book/06-github/images/orgs-01-page.png rename to images/orgs-01-page.png diff --git a/book/06-github/images/orgs-02-teams.png b/images/orgs-02-teams.png similarity index 100% rename from book/06-github/images/orgs-02-teams.png rename to images/orgs-02-teams.png diff --git a/book/06-github/images/orgs-03-audit.png b/images/orgs-03-audit.png similarity index 100% rename from book/06-github/images/orgs-03-audit.png rename to images/orgs-03-audit.png diff --git a/book/08-customizing-git/images/p4merge.png b/images/p4merge.png similarity index 100% rename from book/08-customizing-git/images/p4merge.png rename to images/p4merge.png diff --git a/book/03-git-branching/images/perils-of-rebasing-1.png b/images/perils-of-rebasing-1.png similarity index 100% rename from book/03-git-branching/images/perils-of-rebasing-1.png rename to images/perils-of-rebasing-1.png diff --git a/book/03-git-branching/images/perils-of-rebasing-2.png b/images/perils-of-rebasing-2.png similarity index 100% rename from book/03-git-branching/images/perils-of-rebasing-2.png rename to images/perils-of-rebasing-2.png diff --git a/book/03-git-branching/images/perils-of-rebasing-3.png b/images/perils-of-rebasing-3.png similarity index 100% rename from book/03-git-branching/images/perils-of-rebasing-3.png rename to images/perils-of-rebasing-3.png diff --git a/book/03-git-branching/images/perils-of-rebasing-4.png b/images/perils-of-rebasing-4.png similarity index 100% rename from book/03-git-branching/images/perils-of-rebasing-4.png rename to images/perils-of-rebasing-4.png diff --git a/book/03-git-branching/images/perils-of-rebasing-5.png b/images/perils-of-rebasing-5.png similarity index 100% rename from book/03-git-branching/images/perils-of-rebasing-5.png rename to images/perils-of-rebasing-5.png diff --git a/book/A-git-in-other-environments/images/posh-git.png b/images/posh-git.png similarity index 100% rename from book/A-git-in-other-environments/images/posh-git.png rename to images/posh-git.png diff --git a/book/06-github/images/pr-01-fail.png b/images/pr-01-fail.png similarity index 100% rename from book/06-github/images/pr-01-fail.png rename to images/pr-01-fail.png diff --git a/book/06-github/images/pr-02-merge-fix.png b/images/pr-02-merge-fix.png similarity index 100% rename from book/06-github/images/pr-02-merge-fix.png rename to images/pr-02-merge-fix.png diff --git a/book/05-distributed-git/images/public-small-1.png b/images/public-small-1.png similarity index 100% rename from book/05-distributed-git/images/public-small-1.png rename to images/public-small-1.png diff --git a/book/05-distributed-git/images/public-small-2.png b/images/public-small-2.png similarity index 100% rename from book/05-distributed-git/images/public-small-2.png rename to images/public-small-2.png diff --git a/book/05-distributed-git/images/public-small-3.png b/images/public-small-3.png similarity index 100% rename from book/05-distributed-git/images/public-small-3.png rename to images/public-small-3.png diff --git a/book/05-distributed-git/images/rebasing-1.png b/images/rebasing-1.png similarity index 100% rename from book/05-distributed-git/images/rebasing-1.png rename to images/rebasing-1.png diff --git a/book/05-distributed-git/images/rebasing-2.png b/images/rebasing-2.png similarity index 100% rename from book/05-distributed-git/images/rebasing-2.png rename to images/rebasing-2.png diff --git a/book/03-git-branching/images/remote-branches-1.png b/images/remote-branches-1.png similarity index 100% rename from book/03-git-branching/images/remote-branches-1.png rename to images/remote-branches-1.png diff --git a/book/03-git-branching/images/remote-branches-2.png b/images/remote-branches-2.png similarity index 100% rename from book/03-git-branching/images/remote-branches-2.png rename to images/remote-branches-2.png diff --git a/book/03-git-branching/images/remote-branches-3.png b/images/remote-branches-3.png similarity index 100% rename from book/03-git-branching/images/remote-branches-3.png rename to images/remote-branches-3.png diff --git a/book/03-git-branching/images/remote-branches-4.png b/images/remote-branches-4.png similarity index 100% rename from book/03-git-branching/images/remote-branches-4.png rename to images/remote-branches-4.png diff --git a/book/03-git-branching/images/remote-branches-5.png b/images/remote-branches-5.png similarity index 100% rename from book/03-git-branching/images/remote-branches-5.png rename to images/remote-branches-5.png diff --git a/book/07-git-tools/images/replace1.png b/images/replace1.png similarity index 100% rename from book/07-git-tools/images/replace1.png rename to images/replace1.png diff --git a/book/07-git-tools/images/replace2.png b/images/replace2.png similarity index 100% rename from book/07-git-tools/images/replace2.png rename to images/replace2.png diff --git a/book/07-git-tools/images/replace3.png b/images/replace3.png similarity index 100% rename from book/07-git-tools/images/replace3.png rename to images/replace3.png diff --git a/book/07-git-tools/images/replace4.png b/images/replace4.png similarity index 100% rename from book/07-git-tools/images/replace4.png rename to images/replace4.png diff --git a/book/07-git-tools/images/replace5.png b/images/replace5.png similarity index 100% rename from book/07-git-tools/images/replace5.png rename to images/replace5.png diff --git a/book/06-github/images/reposettingslink.png b/images/reposettingslink.png similarity index 100% rename from book/06-github/images/reposettingslink.png rename to images/reposettingslink.png diff --git a/book/07-git-tools/images/rerere1.png b/images/rerere1.png similarity index 100% rename from book/07-git-tools/images/rerere1.png rename to images/rerere1.png diff --git a/book/07-git-tools/images/rerere2.png b/images/rerere2.png similarity index 100% rename from book/07-git-tools/images/rerere2.png rename to images/rerere2.png diff --git a/book/07-git-tools/images/rerere3.png b/images/rerere3.png similarity index 100% rename from book/07-git-tools/images/rerere3.png rename to images/rerere3.png diff --git a/book/07-git-tools/images/reset-checkout.png b/images/reset-checkout.png similarity index 100% rename from book/07-git-tools/images/reset-checkout.png rename to images/reset-checkout.png diff --git a/book/07-git-tools/images/reset-ex1.png b/images/reset-ex1.png similarity index 100% rename from book/07-git-tools/images/reset-ex1.png rename to images/reset-ex1.png diff --git a/book/07-git-tools/images/reset-ex2.png b/images/reset-ex2.png similarity index 100% rename from book/07-git-tools/images/reset-ex2.png rename to images/reset-ex2.png diff --git a/book/07-git-tools/images/reset-ex3.png b/images/reset-ex3.png similarity index 100% rename from book/07-git-tools/images/reset-ex3.png rename to images/reset-ex3.png diff --git a/book/07-git-tools/images/reset-ex4.png b/images/reset-ex4.png similarity index 100% rename from book/07-git-tools/images/reset-ex4.png rename to images/reset-ex4.png diff --git a/book/07-git-tools/images/reset-ex5.png b/images/reset-ex5.png similarity index 100% rename from book/07-git-tools/images/reset-ex5.png rename to images/reset-ex5.png diff --git a/book/07-git-tools/images/reset-ex6.png b/images/reset-ex6.png similarity index 100% rename from book/07-git-tools/images/reset-ex6.png rename to images/reset-ex6.png diff --git a/book/07-git-tools/images/reset-hard.png b/images/reset-hard.png similarity index 100% rename from book/07-git-tools/images/reset-hard.png rename to images/reset-hard.png diff --git a/book/07-git-tools/images/reset-mixed.png b/images/reset-mixed.png similarity index 100% rename from book/07-git-tools/images/reset-mixed.png rename to images/reset-mixed.png diff --git a/book/07-git-tools/images/reset-path1.png b/images/reset-path1.png similarity index 100% rename from book/07-git-tools/images/reset-path1.png rename to images/reset-path1.png diff --git a/book/07-git-tools/images/reset-path2.png b/images/reset-path2.png similarity index 100% rename from book/07-git-tools/images/reset-path2.png rename to images/reset-path2.png diff --git a/book/07-git-tools/images/reset-path3.png b/images/reset-path3.png similarity index 100% rename from book/07-git-tools/images/reset-path3.png rename to images/reset-path3.png diff --git a/book/07-git-tools/images/reset-soft.png b/images/reset-soft.png similarity index 100% rename from book/07-git-tools/images/reset-soft.png rename to images/reset-soft.png diff --git a/book/07-git-tools/images/reset-squash-r1.png b/images/reset-squash-r1.png similarity index 100% rename from book/07-git-tools/images/reset-squash-r1.png rename to images/reset-squash-r1.png diff --git a/book/07-git-tools/images/reset-squash-r2.png b/images/reset-squash-r2.png similarity index 100% rename from book/07-git-tools/images/reset-squash-r2.png rename to images/reset-squash-r2.png diff --git a/book/07-git-tools/images/reset-squash-r3.png b/images/reset-squash-r3.png similarity index 100% rename from book/07-git-tools/images/reset-squash-r3.png rename to images/reset-squash-r3.png diff --git a/book/07-git-tools/images/reset-start.png b/images/reset-start.png similarity index 100% rename from book/07-git-tools/images/reset-start.png rename to images/reset-start.png diff --git a/book/07-git-tools/images/reset-workflow.png b/images/reset-workflow.png similarity index 100% rename from book/07-git-tools/images/reset-workflow.png rename to images/reset-workflow.png diff --git a/book/06-github/images/scripting-01-services.png b/images/scripting-01-services.png similarity index 100% rename from book/06-github/images/scripting-01-services.png rename to images/scripting-01-services.png diff --git a/book/06-github/images/scripting-02-email-service.png b/images/scripting-02-email-service.png similarity index 100% rename from book/06-github/images/scripting-02-email-service.png rename to images/scripting-02-email-service.png diff --git a/book/06-github/images/scripting-03-webhook.png b/images/scripting-03-webhook.png similarity index 100% rename from book/06-github/images/scripting-03-webhook.png rename to images/scripting-03-webhook.png diff --git a/book/06-github/images/scripting-04-webhook-debug.png b/images/scripting-04-webhook-debug.png similarity index 100% rename from book/06-github/images/scripting-04-webhook-debug.png rename to images/scripting-04-webhook-debug.png diff --git a/book/06-github/images/scripting-05-access-token.png b/images/scripting-05-access-token.png similarity index 100% rename from book/06-github/images/scripting-05-access-token.png rename to images/scripting-05-access-token.png diff --git a/book/06-github/images/scripting-06-comment.png b/images/scripting-06-comment.png similarity index 100% rename from book/06-github/images/scripting-06-comment.png rename to images/scripting-06-comment.png diff --git a/book/06-github/images/scripting-07-status.png b/images/scripting-07-status.png similarity index 100% rename from book/06-github/images/scripting-07-status.png rename to images/scripting-07-status.png diff --git a/book/06-github/images/signup.png b/images/signup.png similarity index 100% rename from book/06-github/images/signup.png rename to images/signup.png diff --git a/book/05-distributed-git/images/small-team-1.png b/images/small-team-1.png similarity index 100% rename from book/05-distributed-git/images/small-team-1.png rename to images/small-team-1.png diff --git a/book/05-distributed-git/images/small-team-2.png b/images/small-team-2.png similarity index 100% rename from book/05-distributed-git/images/small-team-2.png rename to images/small-team-2.png diff --git a/book/05-distributed-git/images/small-team-3.png b/images/small-team-3.png similarity index 100% rename from book/05-distributed-git/images/small-team-3.png rename to images/small-team-3.png diff --git a/book/05-distributed-git/images/small-team-4.png b/images/small-team-4.png similarity index 100% rename from book/05-distributed-git/images/small-team-4.png rename to images/small-team-4.png diff --git a/book/05-distributed-git/images/small-team-5.png b/images/small-team-5.png similarity index 100% rename from book/05-distributed-git/images/small-team-5.png rename to images/small-team-5.png diff --git a/book/05-distributed-git/images/small-team-6.png b/images/small-team-6.png similarity index 100% rename from book/05-distributed-git/images/small-team-6.png rename to images/small-team-6.png diff --git a/book/05-distributed-git/images/small-team-7.png b/images/small-team-7.png similarity index 100% rename from book/05-distributed-git/images/small-team-7.png rename to images/small-team-7.png diff --git a/book/05-distributed-git/images/small-team-flow.png b/images/small-team-flow.png similarity index 100% rename from book/05-distributed-git/images/small-team-flow.png rename to images/small-team-flow.png diff --git a/book/08-customizing-git/images/smudge.png b/images/smudge.png similarity index 100% rename from book/08-customizing-git/images/smudge.png rename to images/smudge.png diff --git a/book/01-introduction/images/snapshots.png b/images/snapshots.png similarity index 100% rename from book/01-introduction/images/snapshots.png rename to images/snapshots.png diff --git a/book/06-github/images/ssh-keys.png b/images/ssh-keys.png similarity index 100% rename from book/06-github/images/ssh-keys.png rename to images/ssh-keys.png diff --git a/book/03-git-branching/images/topic-branches-1.png b/images/topic-branches-1.png similarity index 100% rename from book/03-git-branching/images/topic-branches-1.png rename to images/topic-branches-1.png diff --git a/book/03-git-branching/images/topic-branches-2.png b/images/topic-branches-2.png similarity index 100% rename from book/03-git-branching/images/topic-branches-2.png rename to images/topic-branches-2.png diff --git a/book/03-git-branching/images/two-branches.png b/images/two-branches.png similarity index 100% rename from book/03-git-branching/images/two-branches.png rename to images/two-branches.png diff --git a/book/07-git-tools/images/undomerge-reset.png b/images/undomerge-reset.png similarity index 100% rename from book/07-git-tools/images/undomerge-reset.png rename to images/undomerge-reset.png diff --git a/book/07-git-tools/images/undomerge-revert.png b/images/undomerge-revert.png similarity index 100% rename from book/07-git-tools/images/undomerge-revert.png rename to images/undomerge-revert.png diff --git a/book/07-git-tools/images/undomerge-revert2.png b/images/undomerge-revert2.png similarity index 100% rename from book/07-git-tools/images/undomerge-revert2.png rename to images/undomerge-revert2.png diff --git a/book/07-git-tools/images/undomerge-revert3.png b/images/undomerge-revert3.png similarity index 100% rename from book/07-git-tools/images/undomerge-revert3.png rename to images/undomerge-revert3.png diff --git a/book/07-git-tools/images/undomerge-start.png b/images/undomerge-start.png similarity index 100% rename from book/07-git-tools/images/undomerge-start.png rename to images/undomerge-start.png diff --git a/book/A-git-in-other-environments/images/vs-1.png b/images/vs-1.png similarity index 100% rename from book/A-git-in-other-environments/images/vs-1.png rename to images/vs-1.png diff --git a/book/A-git-in-other-environments/images/vs-2.png b/images/vs-2.png similarity index 100% rename from book/A-git-in-other-environments/images/vs-2.png rename to images/vs-2.png diff --git a/book/06-github/images/your-profile.png b/images/your-profile.png similarity index 100% rename from book/06-github/images/your-profile.png rename to images/your-profile.png diff --git a/book/A-git-in-other-environments/images/zsh-oh-my.png b/images/zsh-oh-my.png similarity index 100% rename from book/A-git-in-other-environments/images/zsh-oh-my.png rename to images/zsh-oh-my.png diff --git a/book/A-git-in-other-environments/images/zsh-prompt.png b/images/zsh-prompt.png similarity index 100% rename from book/A-git-in-other-environments/images/zsh-prompt.png rename to images/zsh-prompt.png diff --git a/index.asc b/index.asc new file mode 100644 index 00000000..2df4a6b1 --- /dev/null +++ b/index.asc @@ -0,0 +1,3 @@ +[#index] +[index] += Index diff --git a/progit.asc b/progit.asc index 96f38f0d..91522e16 100644 --- a/progit.asc +++ b/progit.asc @@ -1,35 +1,53 @@ Pro Git ======= -:doctype: book +Scott Chacon, Ben Straub +$$VERSION$$, $$DATE$$ +:doctype: book :docinfo: :toc: :toclevels: 2 +:pagenums: :front-cover-image: image:book/cover.png[width=1050,height=1600] +:lang: ko -include::book/preface.asc[] +ifdef::ebook-format[:leveloffset: -1] -include::book/01-introduction/1-introduction.asc[] +include::book/license.asc[] -include::book/02-git-basics/1-git-basics.asc[] +include::book/preface_scott.asc[] -include::book/03-git-branching/1-git-branching.asc[] +include::book/preface_ben.asc[] -include::book/04-git-server/1-git-server.asc[] +include::book/dedication.asc[] -include::book/05-distributed-git/1-distributed-git.asc[] +//include::book/contributors.asc[] -include::book/06-github/1-github.asc[] +include::book/introduction.asc[] -include::book/07-git-tools/1-git-tools.asc[] +include::ch01-introduction.asc[] -include::book/08-customizing-git/1-customizing-git.asc[] +include::ch02-git-basics.asc[] -include::book/09-git-and-other-scms/1-git-and-other-scms.asc[] +include::ch03-git-branching.asc[] -include::book/10-git-internals/1-git-internals.asc[] +include::ch04-git-server.asc[] -include::book/A-git-in-other-environments/1-git-other-environments.asc[] +include::ch05-distributed-git.asc[] -include::book/B-embedding-git/1-embedding-git.asc[] +include::ch06-github.asc[] -include::book/C-git-commands/1-git-commands.asc[] +include::ch07-git-tools.asc[] + +include::ch08-customizing-git.asc[] + +include::ch09-git-and-other-scms.asc[] + +include::ch10-git-internals.asc[] + +include::A-git-in-other-environments.asc[] + +include::B-embedding-git.asc[] + +include::C-git-commands.asc[] + +ifndef::ebook-format[include::index.asc[]] From 69c4f5251f4cf43be42567039ee8b8f7c1039da9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-No=C3=ABl=20Avila?= Date: Sat, 24 Feb 2018 21:05:51 +0100 Subject: [PATCH 2/4] Fix asciidoc formating Most of the formating has been checked. --- C-git-commands.asc | 14 +- Rakefile | 2 +- .../sections/first-time-setup.asc | 8 +- book/01-introduction/sections/help.asc | 2 +- book/02-git-basics/sections/aliases.asc | 10 +- .../sections/getting-a-repository.asc | 6 +- .../sections/recording-changes.asc | 36 ++-- book/02-git-basics/sections/remotes.asc | 18 +- book/02-git-basics/sections/tagging.asc | 6 +- .../sections/viewing-history.asc | 19 ++- .../sections/basic-branching-and-merging.asc | 22 +-- .../sections/branch-management.asc | 10 +- book/03-git-branching/sections/nutshell.asc | 4 +- book/03-git-branching/sections/rebasing.asc | 31 ++-- .../sections/remote-branches.asc | 50 +++--- book/03-git-branching/sections/workflows.asc | 10 +- book/04-git-server/sections/git-daemon.asc | 4 +- .../sections/git-on-a-server.asc | 4 +- book/04-git-server/sections/gitlab.asc | 6 +- book/04-git-server/sections/gitweb.asc | 12 +- book/04-git-server/sections/protocols.asc | 14 +- .../sections/setting-up-server.asc | 16 +- book/04-git-server/sections/smart-http.asc | 12 +- .../sections/contributing.asc | 28 +-- .../sections/maintaining.asc | 38 ++--- .../sections/1-setting-up-account.asc | 2 +- book/06-github/sections/2-contributing.asc | 4 +- book/06-github/sections/3-maintaining.asc | 38 ++--- .../sections/4-managing-organization.asc | 12 +- book/06-github/sections/5-scripting.asc | 4 +- .../sections/advanced-merging.asc | 62 +++---- book/07-git-tools/sections/bundling.asc | 8 +- book/07-git-tools/sections/credentials.asc | 12 +- book/07-git-tools/sections/debugging.asc | 14 +- .../sections/interactive-staging.asc | 20 +-- book/07-git-tools/sections/replace.asc | 6 +- book/07-git-tools/sections/rerere.asc | 6 +- book/07-git-tools/sections/reset.asc | 26 +-- .../sections/revision-selection.asc | 56 +++--- .../sections/rewriting-history.asc | 26 +-- book/07-git-tools/sections/searching.asc | 10 +- book/07-git-tools/sections/signing.asc | 8 +- .../sections/stashing-cleaning.asc | 26 +-- book/07-git-tools/sections/submodules.asc | 14 +- book/07-git-tools/sections/subtree-merges.asc | 8 +- .../sections/attributes.asc | 30 ++-- book/08-customizing-git/sections/config.asc | 48 +++--- book/08-customizing-git/sections/hooks.asc | 22 +-- book/08-customizing-git/sections/policy.asc | 18 +- .../sections/client-hg.asc | 6 +- .../sections/client-p4.asc | 30 ++-- .../sections/client-svn.asc | 54 +++--- .../sections/client-tfs.asc | 20 +-- .../sections/import-custom.asc | 28 +-- .../sections/import-svn.asc | 10 +- .../sections/import-tfs.asc | 2 +- .../10-git-internals/sections/environment.asc | 160 +++++++++--------- .../10-git-internals/sections/maintenance.asc | 22 +-- book/10-git-internals/sections/objects.asc | 12 +- book/10-git-internals/sections/packfiles.asc | 2 +- book/10-git-internals/sections/refs.asc | 18 +- book/10-git-internals/sections/refspec.asc | 20 +-- .../sections/transfer-protocols.asc | 26 +-- .../sections/bash.asc | 12 +- .../sections/guis.asc | 26 +-- .../sections/powershell.asc | 4 +- .../sections/visualstudio.asc | 2 +- .../sections/zsh.asc | 8 +- book/B-embedding-git/sections/jgit.asc | 24 +-- book/B-embedding-git/sections/libgit2.asc | 16 +- 70 files changed, 688 insertions(+), 676 deletions(-) diff --git a/C-git-commands.asc b/C-git-commands.asc index f2628fc4..dee31b84 100644 --- a/C-git-commands.asc +++ b/C-git-commands.asc @@ -25,7 +25,7 @@ In this appendix, we'll go through all the Git commands we addressed throughout ////////////////////////// There are two commands that are used quite a lot, from the first invocations of Git to common every day tweaking and referencing, the `config` and `help` commands. ////////////////////////// -정말 많이 사용하는 명령어가 두 개 있다. 바로 `config`와 `help` 명령이다. 이 명령은 매일 사용한다. +정말 많이 사용하는 명령어가 두 개 있다. 바로 `config` 와 `help` 명령이다. 이 명령은 매일 사용한다. ==== git config @@ -116,7 +116,7 @@ We first introduce this in <>, where we show c ////////////////////////// We talk briefly about how you can change the default branch from ``master'' in <>. ////////////////////////// -``master''에서 다른 브랜치로 변경하는 방법은 <>에 소개한다. +``master'' 에서 다른 브랜치로 변경하는 방법은 <>에 소개한다. ////////////////////////// We use this command to create an empty bare repository for a server in <>. @@ -134,8 +134,8 @@ Finally, we go through some of the details of what it actually does behind the s The `git clone` command is actually something of a wrapper around several other commands. It creates a new directory, goes into it and runs `git init` to make it an empty Git repository, adds a remote (`git remote add`) to the URL that you pass it (by default named `origin`), runs a `git fetch` from that remote repository and then checks out the latest commit into your working directory with `git checkout`. ////////////////////////// -`git clone`은 사실 다른 명령어를 몇 개 실행한다. -디렉토리를 만들고 디렉토리로 들어가고 나서 `git init` 명령으로 빈 Git 저장소를 만든다. 그다음 입력한 URL을 `origin`이라는(기본값) 이름의 리모트로 추가하고(`git remote add`) `git fetch` 명령으로 리모트 저장소에서 데이터를 가져온다. 마지막으로 최종 커밋을 워킹 디렉토리에 Checkout 한다(`git checkout`). +`git clone` 은 사실 다른 명령어를 몇 개 실행한다. +디렉토리를 만들고 디렉토리로 들어가고 나서 `git init` 명령으로 빈 Git 저장소를 만든다. 그다음 입력한 URL을 `origin` 이라는(기본값) 이름의 리모트로 추가하고(`git remote add`) `git fetch` 명령으로 리모트 저장소에서 데이터를 가져온다. 마지막으로 최종 커밋을 워킹 디렉토리에 Checkout 한다(`git checkout`). ////////////////////////// The `git clone` command is used in dozens of places throughout the book, but we'll just list a few interesting places. @@ -332,7 +332,7 @@ We then cover it in quite some detail in <>, which i ////////////////////////// We use `git reset --hard` to abort a merge in <>, where we also use `git merge --abort`, which is a bit of a wrapper for the `git reset` command. ////////////////////////// -`git reset --hard` 명령으로 충돌 시 Merge를 취소할 수 있다. `git merge --abort`로도 같은 일을 할 수 있는데 이 명령은 `git reset` 명령어의 Wrapper다. 이 내용은 <>에서 설명한다. +`git reset --hard` 명령으로 충돌 시 Merge를 취소할 수 있다. `git merge --abort` 로도 같은 일을 할 수 있는데 이 명령은 `git reset` 명령어의 Wrapper다. 이 내용은 <>에서 설명한다. ==== git rm @@ -625,7 +625,7 @@ Fetch 하는 기본 Refspec을 수정하는 방법은 <> and show how to see what it will merge if you run it in <>. @@ -951,7 +951,7 @@ This is useful for receiving patches over email and applying them to your projec ////////////////////////// We covered usage and workflow around `git am` in <> including using the `--resolved`, `-i` and `-3` options. ////////////////////////// -`git am`을 언제 어떻게 사용하는지는 <>에서 다룬다. `--resolved`, `-i`, `-3` 옵션 사용법을 설명한다. +`git am` 을 언제 어떻게 사용하는지는 <>에서 다룬다. `--resolved`, `-i`, `-3` 옵션 사용법을 설명한다. ////////////////////////// There are also a number of hooks you can use to help with the workflow around `git am` and they are all covered in <>. diff --git a/Rakefile b/Rakefile index d2fed34a..ce80f727 100644 --- a/Rakefile +++ b/Rakefile @@ -76,7 +76,7 @@ namespace :book do repo = ENV['TRAVIS_REPO_SLUG'] puts "Converting to PDF... (this one takes a while)" - exec_or_raise("asciidoctor-pdf-cjk-kai_gen_gothic-install") + # exec_or_raise("asciidoctor-pdf-cjk-kai_gen_gothic-install") exec_or_raise("bundle exec asciidoctor-pdf -r asciidoctor-pdf-cjk -r asciidoctor-pdf-cjk-kai_gen_gothic -a pdf-style=KaiGenGothicKR #{progit_v}.asc") puts " -- PDF output at #{progit_v}.pdf" end diff --git a/book/01-introduction/sections/first-time-setup.asc b/book/01-introduction/sections/first-time-setup.asc index d138dc89..8167b041 100644 --- a/book/01-introduction/sections/first-time-setup.asc +++ b/book/01-introduction/sections/first-time-setup.asc @@ -31,12 +31,12 @@ These variables can be stored in three different places: `git config --system` 옵션으로 이 파일을 읽고 쓸 수 있다. 2. `~/.gitconfig`, `~/.config/git/config` 파일: 특정 사용자에게만 적용되는 설정이다. `git config --global` 옵션으로 이 파일을 읽고 쓸 수 있다. -3. `.git/config`: 이 파일은 Git 디렉토리에 있고 특정 저장소(혹은 현재 작업 중인 프로젝트)에만 적용된다. +3. `.git/config` : 이 파일은 Git 디렉토리에 있고 특정 저장소(혹은 현재 작업 중인 프로젝트)에만 적용된다. ////////////////////////// Each level overrides values in the previous level, so values in `.git/config` trump those in `/etc/gitconfig`. ////////////////////////// -각 설정은 역순으로 우선시 된다. 그래서 `.git/config`가 `/etc/gitconfig`보다 우선한다. +각 설정은 역순으로 우선시 된다. 그래서 `.git/config` 가 `/etc/gitconfig` 보다 우선한다. ////////////////////////// On Windows systems, Git looks for the `.gitconfig` file in the `$HOME` directory (`C:\Users\$USER` for most people). @@ -47,7 +47,7 @@ This config file can only be changed by `git config -f ` as an admin. ////////////////////////// Windows에서는 `$HOME` 디렉토리에서 `.gitconfig` 파일을 찾는다(아마도 `C:\Users\$USER` 디렉토리). Windows에서도 `/etc/gitconfig` 파일은 그 경로에서 찾는다. 이 경로는 아마도 MSys 루트의 상대경로일 텐데, MSys 루트는 인스톨러로 Git을 Windows에 설치할 때 결정된다. -'Git for Windows' 2.x 버전에서는 조금 다르다. Windows XP 사용자는 `C:\Documents and Settings\All Users\Application Data\Git\config` 디렉토리에서 찾을 수 있고 Windows Vista 이후 버전 사용자는 `C:\ProgramData\Git\config`에서 찾을 수 있다. +'Git for Windows' 2.x 버전에서는 조금 다르다. Windows XP 사용자는 `C:\Documents and Settings\All Users\Application Data\Git\config` 디렉토리에서 찾을 수 있고 Windows Vista 이후 버전 사용자는 `C:\ProgramData\Git\config` 에서 찾을 수 있다. 이 시스템 설정 파일의 경로는 `git config -f ` 명령으로 변경할 수 있다. 관리자 권한이 필요하다. ////////////////////////// @@ -174,7 +174,7 @@ color.diff=auto You may see keys more than once, because Git reads the same key from different files (`/etc/gitconfig` and `~/.gitconfig`, for example). In this case, Git uses the last value for each unique key it sees. ////////////////////////// -Git은 같은 키를 여러 파일(`/etc/gitconfig`와 `~/.gitconfig` 같은)에서 읽기 때문에 같은 키가 여러 개 있을 수도 있다. +Git은 같은 키를 여러 파일(`/etc/gitconfig` 와 `~/.gitconfig` 같은)에서 읽기 때문에 같은 키가 여러 개 있을 수도 있다. 그러면 Git은 나중 값을 사용한다. ////////////////////////// diff --git a/book/01-introduction/sections/help.asc b/book/01-introduction/sections/help.asc index bb50b694..db5e31c2 100644 --- a/book/01-introduction/sections/help.asc +++ b/book/01-introduction/sections/help.asc @@ -32,5 +32,5 @@ If the manpages and this book aren't enough and you need in-person help, you can These channels are regularly filled with hundreds of people who are all very knowledgeable about Git and are often willing to help.(((IRC))) ////////////////////////// 도움말은 언제 어디서나 볼 수 있다. 오프라인으로도 볼 수 있다. -도움말과 이 책으로 부족하면 다른 사람의 도움을 받는 것이 필요하다. Freenode IRC 서버(irc.freenode.net)에 있는 `#git`이나 `#github` 채널로 찾아가라. +도움말과 이 책으로 부족하면 다른 사람의 도움을 받는 것이 필요하다. Freenode IRC 서버(irc.freenode.net)에 있는 `#git` 이나 `#github` 채널로 찾아가라. 이 채널에는 보통 수백 명의 사람이 접속해 있다. 모두 Git에 대해 잘 알고 있다. 기꺼이 도와줄 것이다.(((IRC))) diff --git a/book/02-git-basics/sections/aliases.asc b/book/02-git-basics/sections/aliases.asc index 1a5674bb..0d14ffd2 100644 --- a/book/02-git-basics/sections/aliases.asc +++ b/book/02-git-basics/sections/aliases.asc @@ -18,7 +18,7 @@ If you don't want to type the entire text of each of the Git commands, you can e Here are a couple of examples you may want to set up: ////////////////////////// 명령을 완벽하게 입력하지 않으면 Git은 알아듣지 못한다. -Git의 명령을 전부 입력하는 것이 귀찮다면 `git config`를 사용하여 각 명령의 Alias을 쉽게 만들 수 있다.(((git commands, config))) +Git의 명령을 전부 입력하는 것이 귀찮다면 `git config` 를 사용하여 각 명령의 Alias을 쉽게 만들 수 있다.(((git commands, config))) 아래는 Alias을 만드는 예이다. [source,console] @@ -33,7 +33,7 @@ $ git config --global alias.st status This means that, for example, instead of typing `git commit`, you just need to type `git ci`. As you go on using Git, you'll probably use other commands frequently as well; don't hesitate to create new aliases. ////////////////////////// -이제 `git commit` 대신 `git ci`만으로도 커밋할 수 있다. +이제 `git commit` 대신 `git ci` 만으로도 커밋할 수 있다. Git을 계속 사용한다면 다른 명령어도 자주 사용하게 될 것이다. 주저말고 자주 사용하는 명령은 Alias을 만들어 편하게 사용하시길 바란다. ////////////////////////// @@ -93,13 +93,13 @@ As you can tell, Git simply replaces the new command with whatever you alias it However, maybe you want to run an external command, rather than a Git subcommand. In that case, you start the command with a `!` character. This is useful if you write your own tools that work with a Git repository. -We can demonstrate by aliasing `git visual` to run `gitk`: +We can demonstrate by aliasing `git visual` to run `gitk` : ////////////////////////// 이것으로 쉽게 새로운 명령을 만들 수 있다. 그리고 Git의 명령어뿐만 아니라 외부 명령어도 실행할 수 있다. -`!`를 제일 앞에 추가하면 외부 명령을 실행한다. +`!` 를 제일 앞에 추가하면 외부 명령을 실행한다. 커스텀 스크립트를 만들어서 사용할 때 매우 유용하다. -아래 명령은 `git visual`이라고 입력하면 `gitk`가 실행된다. +아래 명령은 `git visual` 이라고 입력하면 `gitk` 가 실행된다. [source,console] ---- diff --git a/book/02-git-basics/sections/getting-a-repository.asc b/book/02-git-basics/sections/getting-a-repository.asc index 571ccfb6..a1d98e1d 100644 --- a/book/02-git-basics/sections/getting-a-repository.asc +++ b/book/02-git-basics/sections/getting-a-repository.asc @@ -74,7 +74,7 @@ At this point, nothing in your project is tracked yet. ////////////////////////// If you want to start version-controlling existing files (as opposed to an empty directory), you should probably begin tracking those files and do an initial commit. -You can accomplish that with a few `git add` commands that specify the files you want to track, followed by a `git commit`: +You can accomplish that with a few `git add` commands that specify the files you want to track, followed by a `git commit` : ////////////////////////// Git이 파일을 관리하게 하려면 저장소에 파일을 추가하고 커밋해야 한다. `git add` 명령으로 파일을 추가하고 `git commit` 명령으로 커밋한다: @@ -109,7 +109,7 @@ In fact, if your server disk gets corrupted, you can often use nearly any of the 다른 프로젝트에 참여하려거나(Contribute) Git 저장소를 복사하고 싶을 때 `git clone` 명령을 사용한다. 이미 Subversion 같은 VCS에 익숙한 사용자에게는 "checkout" 이 아니라 "clone" 이라는 점이 도드라져 보일 것이다. Git이 Subversion과 다른 가장 큰 차이점은 서버에 있는 거의 모든 데이터를 복사한다는 것이다. -`git clone`을 실행하면 프로젝트 히스토리를 전부 받아온다. +`git clone` 을 실행하면 프로젝트 히스토리를 전부 받아온다. 실제로 서버의 디스크가 망가져도 클라이언트 저장소 중에서 아무거나 하나 가져다가 복구하면 된다(서버에만 적용했던 설정은 복구하지 못하지만 모든 데이터는 복구된다 - <>에서 좀 더 자세히 다룬다). ////////////////////////// @@ -149,5 +149,5 @@ The previous example uses the `https://` protocol, but you may also see `git://` <> will introduce all of the available options the server can set up to access your Git repository and the pros and cons of each. ////////////////////////// Git은 다양한 프로토콜을 지원한다. -이제까지는 `https://` 프로토콜을 사용했지만 `git://`를 사용할 수도 있고 `user@server:path/to/repo.git` 처럼 SSH 프로토콜을 사용할 수도 있다. +이제까지는 `https://` 프로토콜을 사용했지만 `git://` 를 사용할 수도 있고 `user@server:path/to/repo.git` 처럼 SSH 프로토콜을 사용할 수도 있다. 자세한 내용은 <>에서 다루며 각 프로토콜의 장단점과 Git 저장소에 접근하는 방법을 설명한다. diff --git a/book/02-git-basics/sections/recording-changes.asc b/book/02-git-basics/sections/recording-changes.asc index 92ec5913..a660fc56 100644 --- a/book/02-git-basics/sections/recording-changes.asc +++ b/book/02-git-basics/sections/recording-changes.asc @@ -74,7 +74,7 @@ Let's say you add a new file to your project, a simple README file. If the file didn't exist before, and you run `git status`, you see your untracked file like so: ////////////////////////// 프로젝트에 `README` 파일을 만들어보자. -`README` 파일은 새로 만든 파일이기 때문에 `git status`를 실행하면 'Untracked files'에 들어 있다: +`README` 파일은 새로 만든 파일이기 때문에 `git status` 를 실행하면 'Untracked files'에 들어 있다: [source,console] ---- @@ -143,7 +143,7 @@ You may recall that when you ran `git init` earlier, you then ran `git add (file The `git add` command takes a path name for either a file or a directory; if it's a directory, the command adds all the files in that directory recursively. ////////////////////////// ``Changes to be committed'' 에 들어 있는 파일은 Staged 상태라는 것을 의미한다. -커밋하면 `git add`를 실행한 시점의 파일이 커밋되어 저장소 히스토리에 남는다. +커밋하면 `git add` 를 실행한 시점의 파일이 커밋되어 저장소 히스토리에 남는다. 앞에서 `git init` 명령을 실행한 후, `git add (files)` 명령을 실행했던 걸 기억할 것이다. 이 명령을 통해 디렉토리에 있는 파일을 추적하고 관리하도록 한다.(((git commands, init)))(((git commands, add))) `git add` 명령은 파일 또는 디렉토리의 경로를 아규먼트로 받는다. 디렉토리면 아래에 있는 모든 파일들까지 재귀적으로 추가한다. @@ -244,7 +244,7 @@ If you commit now, the version of `CONTRIBUTING.md` as it was when you last ran If you modify a file after you run `git add`, you have to run `git add` again to stage the latest version of the file: ////////////////////////// 헉! -`CONTRIBUTING.md`가 Staged 상태이면서 _동시에_ Unstaged 상태로 나온다. +`CONTRIBUTING.md` 가 Staged 상태이면서 _동시에_ Unstaged 상태로 나온다. 어떻게 이런 일이 가능할까? `git add` 명령을 실행하면 Git은 파일을 바로 Staged 상태로 만든다. 지금 이 시점에서 커밋을 하면 `git commit` 명령을 실행하는 시점의 버전이 커밋되는 것이 아니라 마지막으로 `git add` 명령을 실행했을 때의 버전이 커밋된다. @@ -293,10 +293,10 @@ There are two columns to the output - the left-hand column indicates the status So for example in that output, the `README` file is modified in the working directory but not yet staged, while the `lib/simplegit.rb` file is modified and staged. The `Rakefile` was modified, staged and then modified again, so there are changes to it that are both staged and unstaged. ////////////////////////// -아직 추적하지 않는 새 파일 앞에는 `??`표시가 붙는다. Staged 상태로 추가한 파일 중 새로 생성한 파일 앞에는 `A` 표시가, 수정한 파일 앞에는 `M` 표시가 붙는다. +아직 추적하지 않는 새 파일 앞에는 `??` 표시가 붙는다. Staged 상태로 추가한 파일 중 새로 생성한 파일 앞에는 `A` 표시가, 수정한 파일 앞에는 `M` 표시가 붙는다. 위 명령의 결과에서 상태정보 컬럼에는 두 가지 정보를 보여준다. 왼쪽에는 Staging Area에서의 상태를, 오른쪽에는 Working Tree에서의 상태를 표시한다. `README` 파일 같은 경우 내용을 변경했지만 아직 Staged 상태로 추가하지는 않았다. `lib/simplegit.rb` 파일은 내용을 변경하고 Staged 상태로 추가까지 한 상태이다. 위 결과에서 차이점을 비교해보자. -`Rakefile`은 변경하고 Staged 상태로 추가한 후 또 내용을 변경해서 Staged 이면서 Unstaged 상태인 파일이다. +`Rakefile` 은 변경하고 Staged 상태로 추가한 후 또 내용을 변경해서 Staged 이면서 Unstaged 상태인 파일이다. [[r_ignoring]] ////////////////////////// @@ -328,8 +328,8 @@ The second line tells Git to ignore all files that end with a tilde (`~`), which You may also include a log, tmp, or pid directory; automatically generated documentation; and so on. Setting up a `.gitignore` file before you get going is generally a good idea so you don't accidentally commit files that you really don't want in your Git repository. ////////////////////////// -첫번째 라인은 확장자가 ``.o'' 나 ``.a'' 인 파일을 Git이 무시하라는 것이고 둘째 라인은 `~`로 끝나는 모든 파일을 무시하라는 것이다. 보통 대부분의 텍스트 편집기에서 임시파일로 사용하는 파일 이름이기 때문이다. -``.o'' 와 ``.a'' 는 각각 빌드 시스템이 만들어내는 오브젝트와 아카이브 파일이고 `~`로 끝나는 파일은 Emacs나 VI 같은 텍스트 편집기가 임시로 만들어내는 파일이다. +첫번째 라인은 확장자가 ``.o'' 나 ``.a'' 인 파일을 Git이 무시하라는 것이고 둘째 라인은 `~` 로 끝나는 모든 파일을 무시하라는 것이다. 보통 대부분의 텍스트 편집기에서 임시파일로 사용하는 파일 이름이기 때문이다. +``.o'' 와 ``.a'' 는 각각 빌드 시스템이 만들어내는 오브젝트와 아카이브 파일이고 `~` 로 끝나는 파일은 Emacs나 VI 같은 텍스트 편집기가 임시로 만들어내는 파일이다. 또 log, tmp, pid 같은 디렉토리나, 자동으로 생성하는 문서 같은 것들도 추가할 수 있다. `.gitignore` 파일은 보통 처음에 만들어 두는 것이 편리하다. 그래서 Git 저장소에 커밋하고 싶지 않은 파일을 실수로 커밋하는 일을 방지할 수 있다. @@ -357,7 +357,7 @@ An asterisk (`*`) matches zero or more characters; `[abc]` matches any character You can also use two asterisks to match nested directories; `a/**/z` would match `a/z`, `a/b/z`, `a/b/c/z`, and so on. ////////////////////////// Glob 패턴은 정규표현식을 단순하게 만든 것으로 생각하면 되고 보통 쉘에서 많이 사용한다. -애스터리스크(`*`)는 문자가 하나도 없거나 하나 이상을 의미하고, `[abc]`는 중괄호 안에 있는 문자 중 하나를 의미한다(그러니까 이 경우에는 a, b, c). 물음표(`?`)는 문자 하나를 말하고, `[0-9]`처럼 중괄호 안의 캐릭터 사이에 하이픈(`-`)을 사용하면 그 캐릭터 사이에 있는 문자 하나를 말한다. +애스터리스크(`*`)는 문자가 하나도 없거나 하나 이상을 의미하고, `[abc]` 는 중괄호 안에 있는 문자 중 하나를 의미한다(그러니까 이 경우에는 a, b, c). 물음표(`?`)는 문자 하나를 말하고, `[0-9]` 처럼 중괄호 안의 캐릭터 사이에 하이픈(`-`)을 사용하면 그 캐릭터 사이에 있는 문자 하나를 말한다. 애스터리스크 2개를 사용하여 디렉토리 안의 디렉토리 까지 지정할 수 있다. `a/**/z` 패턴은 `a/z`, `a/b/z`, `a/b/c/z` 디렉토리에 사용할 수 있다. ////////////////////////// @@ -432,7 +432,7 @@ Although `git status` answers those questions very generally by listing the file 단순히 파일이 변경됐다는 사실이 아니라 어떤 내용이 변경됐는지 살펴보려면 `git status` 명령이 아니라 `git diff` 명령을 사용해야 한다.(((git commands, diff))) 보통 우리는 '수정했지만, 아직 Staged 파일이 아닌 것?'과 '어떤 파일이 Staged 상태인지?'가 궁금하기 때문에 `git status` 명령으로도 충분하다. 더 자세하게 볼 때는 `git diff` 명령을 사용하는데 Patch처럼 어떤 라인을 추가했고 삭제했는지가 궁금할 때 사용한다. -`git diff`는 나중에 더 자세히 다룬다. +`git diff` 는 나중에 더 자세히 다룬다. ////////////////////////// Let's say you edit and stage the `README` file again and then edit the `CONTRIBUTING.md` file without staging it. @@ -512,7 +512,7 @@ index 0000000..03902a1 It's important to note that `git diff` by itself doesn't show all changes made since your last commit – only changes that are still unstaged. This can be confusing, because if you've staged all of your changes, `git diff` will give you no output. ////////////////////////// -꼭 잊지 말아야 할 것이 있는데 `git diff` 명령은 마지막으로 커밋한 후에 수정한 것들 전부를 보여주지 않는다. `git diff`는 Unstaged 상태인 것들만 보여준다. +꼭 잊지 말아야 할 것이 있는데 `git diff` 명령은 마지막으로 커밋한 후에 수정한 것들 전부를 보여주지 않는다. `git diff` 는 Unstaged 상태인 것들만 보여준다. 이 부분이 조금 헷갈릴 수 있다. 수정한 파일을 모두 Staging Area에 넣었다면 `git diff` 명령은 아무것도 출력하지 않는다. ////////////////////////// @@ -600,7 +600,7 @@ Run `git difftool --tool-help` to see what is available on your system. 이 책에서는 계속 `git diff` 명령으로 여기저기서 써 먹는다. 즐겨 쓰거나 결과를 아름답게 보여주는 Diff 도구가 있으면 사용할 수 있다. `git diff` 대신 `git difftool` 명령을 사용해서 emerge, vimdiff 같은 도구로 비교할 수 있다. 상용 제품도 사용할 수 있다. -`git difftool --tool-help`라는 명령은 사용가능한 도구를 보여준다. +`git difftool --tool-help` 라는 명령은 사용가능한 도구를 보여준다. ==== [[r_committing_changes]] @@ -614,13 +614,13 @@ Now that your staging area is set up the way you want it, you can commit your ch Remember that anything that is still unstaged – any files you have created or modified that you haven't run `git add` on since you edited them – won't go into this commit. They will stay as modified files on your disk. In this case, let's say that the last time you ran `git status`, you saw that everything was staged, so you're ready to commit your changes.(((git commands, status))) -The simplest way to commit is to type `git commit`:(((git commands, commit))) +The simplest way to commit is to type `git commit` :(((git commands, commit))) ////////////////////////// 수정한 것을 커밋하기 위해 Staging Area에 파일을 정리했다. Unstaged 상태의 파일은 커밋되지 않는다는 것을 기억해야 한다. Git은 생성하거나 수정하고 나서 `git add` 명령으로 추가하지 않은 파일은 커밋하지 않는다. 그 파일은 여전히 Modified 상태로 남아 있다. 커밋하기 전에 `git status` 명령으로 모든 것이 Staged 상태인지 확인할 수 있다.(((git commands, status))) -그 후에 `git commit`을 실행하여 커밋한다.(((git commands, commit))) +그 후에 `git commit` 을 실행하여 커밋한다.(((git commands, commit))) [source,console] ---- @@ -666,7 +666,7 @@ When you exit the editor, Git creates your commit with that commit message (with 자동으로 생성되는 커밋 메시지의 첫 라인은 비어 있고 둘째 라인부터 `git status` 명령의 결과가 채워진다. 커밋한 내용을 쉽게 기억할 수 있도록 이 메시지를 포함할 수도 있고 메시지를 전부 지우고 새로 작성할 수 있다 (정확히 뭘 수정했는지도 보여줄 수 있는데, -`git commit`에 -v 옵션을 추가하면 편집기에 diff 메시지도 추가된다). +`git commit` 에 -v 옵션을 추가하면 편집기에 diff 메시지도 추가된다). 내용을 저장하고 편집기를 종료하면 Git은 입력된 내용(#로 시작하는 내용을 제외한)으로 새 커밋을 하나 완성한다. ////////////////////////// @@ -796,7 +796,7 @@ If you modified the file and added it to the index already, you must force the r This is a safety feature to prevent accidental removal of data that hasn't yet been recorded in a snapshot and that can't be recovered from Git. ////////////////////////// 커밋하면 파일은 삭제되고 Git은 이 파일을 더는 추적하지 않는다. -이미 파일을 수정했거나 Index에(역주 - Staging Area을 Git Index라고도 부른다) 추가했다면 `-f`옵션을 주어 강제로 삭제해야 한다. +이미 파일을 수정했거나 Index에(역주 - Staging Area을 Git Index라고도 부른다) 추가했다면 `-f` 옵션을 주어 강제로 삭제해야 한다. 이 점은 실수로 데이터를 삭제하지 못하도록 하는 안전장치다. 커밋 하지 않고 수정한 데이터는 Git으로 복구할 수 없기 때문이다. ////////////////////////// @@ -833,7 +833,8 @@ This is necessary because Git does its own filename expansion in addition to you This command removes all files that have the `.log` extension in the `log/` directory. Or, you can do something like this: ////////////////////////// -`*`앞에 `\`을 사용한 것을 기억하자. + +`*` 앞에 `\` 을 사용한 것을 기억하자. 파일명 확장 기능은 쉘에만 있는 것이 아니라 Git 자체에도 있기 때문에 필요하다. 이 명령은 `log/` 디렉토리에 있는 `.log` 파일을 모두 삭제한다. 아래의 예제처럼 할 수도 있다. @@ -846,7 +847,7 @@ $ git rm \*~ ////////////////////////// This command removes all files that end with `~`. ////////////////////////// -이 명령은 `~`로 끝나는 파일을 모두 삭제한다. +이 명령은 `~` 로 끝나는 파일을 모두 삭제한다. [[r_git_mv]] ////////////////////////// @@ -868,6 +869,7 @@ Git은 똑똑해서 굳이 파일 이름이 변경되었다는 것을 추적하 Thus it's a bit confusing that Git has a `mv` command. If you want to rename a file in Git, you can run something like: ////////////////////////// + 이렇게 말하고 Git에 `mv` 명령이 있는 게 좀 이상하겠지만, 아래와 같이 파일이름을 변경할 수 있다. [source,console] diff --git a/book/02-git-basics/sections/remotes.asc b/book/02-git-basics/sections/remotes.asc index ec140d31..a99e179c 100644 --- a/book/02-git-basics/sections/remotes.asc +++ b/book/02-git-basics/sections/remotes.asc @@ -50,7 +50,7 @@ origin ////////////////////////// You can also specify `-v`, which shows you the URLs that Git has stored for the shortname to be used when reading and writing to that remote: ////////////////////////// -`-v`옵션을 주어 단축이름과 URL을 함께 볼 수 있다. +`-v` 옵션을 주어 단축이름과 URL을 함께 볼 수 있다. [source,console] ---- @@ -122,7 +122,7 @@ pb https://github.com/paulboone/ticgit (push) ////////////////////////// Now you can use the string `pb` on the command line in lieu of the whole URL. -For example, if you want to fetch all the information that Paul has but that you don't yet have in your repository, you can run `git fetch pb`: +For example, if you want to fetch all the information that Paul has but that you don't yet have in your repository, you can run `git fetch pb` : ////////////////////////// 이제 URL 대신에 `pb` 라는 이름을 사용할 수 있다. 예를 들어 로컬 저장소에는 없지만 Paul의 저장소에 있는 것을 가져오려면 아래과 같이 실행한다. @@ -143,7 +143,7 @@ From https://github.com/paulboone/ticgit Paul's master branch is now accessible locally as `pb/master` – you can merge it into one of your branches, or you can check out a local branch at that point if you want to inspect it. (We'll go over what branches are and how to use them in much more detail in <>.) ////////////////////////// -로컬에서 `pb/master`가 Paul의 master 브랜치이다. 이 브랜치를 로컬 브랜치중 하나에 Merge 하거나 Checkout 해서 브랜치 내용을 자세히 확인할 수 있다. (브랜치를 어떻게 사용하는지는 <> 에서 자세히 살펴본다) +로컬에서 `pb/master` 가 Paul의 master 브랜치이다. 이 브랜치를 로컬 브랜치중 하나에 Merge 하거나 Checkout 해서 브랜치 내용을 자세히 확인할 수 있다. (브랜치를 어떻게 사용하는지는 <> 에서 자세히 살펴본다) [[r_fetching_and_pulling]] ////////////////////////// @@ -259,7 +259,7 @@ It also lists all the remote references it has pulled down. ////////////////////////// That is a simple example you're likely to encounter. -When you're using Git more heavily, however, you may see much more information from `git remote show`: +When you're using Git more heavily, however, you may see much more information from `git remote show` : ////////////////////////// 좀 더 Git을 열심히 사용하다 보면 `git remote show` 명령으로 더 많은 정보를 보는 날이 온다. 여러분도 언젠가는 아래와 같은 메시지(역주 - 다수의 브랜치를 사용하는 메시지)를 볼 날이 올 것이다. @@ -302,10 +302,10 @@ It also shows you which remote branches on the server you don't yet have, which ////////////////////////// If you want to rename a reference you can run `git remote rename` to change a remote's shortname.(((git commands, remote))) -For instance, if you want to rename `pb` to `paul`, you can do so with `git remote rename`: +For instance, if you want to rename `pb` to `paul`, you can do so with `git remote rename` : ////////////////////////// `git remote rename` 명령으로 리모트 저장소의 이름을 변경할 수 있다.(((git commands, remote))) -예를 들어 `pb`를 `paul`로 변경하려면 `git remote rename` 명령을 사용한다. +예를 들어 `pb` 를 `paul` 로 변경하려면 `git remote rename` 명령을 사용한다. [source,console] ---- @@ -320,12 +320,12 @@ It's worth mentioning that this changes all your remote-tracking branch names, t What used to be referenced at `pb/master` is now at `paul/master`. ////////////////////////// 로컬에서 관리하던 리모트 저장소의 브랜치 이름도 바뀐다는 점을 생각해두자. -여태까지 `pb/master`로 리모트 저장소 브랜치를 사용했으면 이제는 `paul/master`라고 사용해야 한다. +여태까지 `pb/master` 로 리모트 저장소 브랜치를 사용했으면 이제는 `paul/master` 라고 사용해야 한다. ////////////////////////// -If you want to remove a remote for some reason – you've moved the server or are no longer using a particular mirror, or perhaps a contributor isn't contributing anymore – you can either use `git remote remove` or `git remote rm`: +If you want to remove a remote for some reason – you've moved the server or are no longer using a particular mirror, or perhaps a contributor isn't contributing anymore – you can either use `git remote remove` or `git remote rm` : ////////////////////////// -리모트 저장소를 삭제해야 한다면 `git remote remove`나 `git remote rm` 명령을 사용한다. 서버 정보가 바뀌었을 때, 더는 별도의 미러가 필요하지 않을 때, 더는 기여자가 활동하지 않을 때 필요하다. +리모트 저장소를 삭제해야 한다면 `git remote remove` 나 `git remote rm` 명령을 사용한다. 서버 정보가 바뀌었을 때, 더는 별도의 미러가 필요하지 않을 때, 더는 기여자가 활동하지 않을 때 필요하다. [source,console] ---- diff --git a/book/02-git-basics/sections/tagging.asc b/book/02-git-basics/sections/tagging.asc index ff5db338..73fca7b0 100644 --- a/book/02-git-basics/sections/tagging.asc +++ b/book/02-git-basics/sections/tagging.asc @@ -21,7 +21,7 @@ In this section, you'll learn how to list the available tags, how to create new ////////////////////////// Listing the available tags in Git is straightforward. -Just type `git tag`:(((git commands, tag))) +Just type `git tag` :(((git commands, tag))) ////////////////////////// 우선 `git tag` 명령으로 이미 만들어진 태그가 있는지 확인할 수 있다.(((git commands, tag))) @@ -172,7 +172,7 @@ v1.5 This time, if you run `git show` on the tag, you don't see the extra tag information.(((git commands, show))) The command just shows the commit: ////////////////////////// -이 태그에 `git show`를 실행하면 별도의 태그 정보를 확인할 수 없다.(((git commands, show))) +이 태그에 `git show` 를 실행하면 별도의 태그 정보를 확인할 수 없다.(((git commands, show))) 이 명령은 단순히 커밋 정보만을 보여준다. [source,console] @@ -286,7 +286,7 @@ To git@github.com:schacon/simplegit.git If you have a lot of tags that you want to push up at once, you can also use the `--tags` option to the `git push` command. This will transfer all of your tags to the remote server that are not already there. ////////////////////////// -만약 한 번에 태그를 여러 개 Push 하고 싶으면 `--tags` 옵션을 추가하여 `git push`명령을 실행한다. +만약 한 번에 태그를 여러 개 Push 하고 싶으면 `--tags` 옵션을 추가하여 `git push` 명령을 실행한다. 이 명령으로 리모트 서버에 없는 태그를 모두 전송할 수 있다. [source,console] diff --git a/book/02-git-basics/sections/viewing-history.asc b/book/02-git-basics/sections/viewing-history.asc index 49d2fad7..83d8a9dc 100644 --- a/book/02-git-basics/sections/viewing-history.asc +++ b/book/02-git-basics/sections/viewing-history.asc @@ -9,7 +9,7 @@ After you have created several commits, or if you have cloned a repository with The most basic and powerful tool to do this is the `git log` command. ////////////////////////// 새로 저장소를 만들어서 몇 번 커밋을 했을 수도 있고, 커밋 히스토리가 있는 저장소를 Clone 했을 수도 있다. 어쨌든 가끔 저장소의 히스토리를 보고 싶을 때가 있다. -Git에는 히스토리를 조회하는 명령어인 `git log`가 있다. +Git에는 히스토리를 조회하는 명령어인 `git log` 가 있다. ////////////////////////// These examples use a very simple project called ``simplegit''. @@ -61,6 +61,7 @@ As you can see, this command lists each commit with its SHA-1 checksum, the auth A huge number and variety of options to the `git log` command are available to show you exactly what you're looking for. Here, we'll show you some of the most popular. ////////////////////////// + 원하는 히스토리를 검색할 수 있도록 `git log` 명령은 매우 다양한 옵션을 지원한다. 여기에서는 자주 사용하는 옵션을 설명한다. @@ -68,7 +69,8 @@ Here, we'll show you some of the most popular. One of the more helpful options is `-p`, which shows the difference introduced in each commit. You can also use `-2`, which limits the output to only the last two entries: ////////////////////////// -여러 옵션 중 `-p`는 굉장히 유용한 옵션이다. `-p`는 각 커밋의 diff 결과를 보여준다. + +여러 옵션 중 `-p` 는 굉장히 유용한 옵션이다. `-p` 는 각 커밋의 diff 결과를 보여준다. 다른 유용한 옵션으로 `-2`가 있는데 최근 두 개의 결과만 보여주는 옵션이다: [source,console] @@ -122,6 +124,7 @@ This is very helpful for code review or to quickly browse what happened during a You can also use a series of summarizing options with `git log`. For example, if you want to see some abbreviated stats for each commit, you can use the `--stat` option: ////////////////////////// + 이 옵션은 직접 diff를 실행한 것과 같은 결과를 출력하기 때문에 동료가 무엇을 커밋했는지 리뷰하고 빨리 조회하는데 유용하다. 또 `git log` 명령에는 히스토리의 통계를 보여주는 옵션도 있다. @@ -164,6 +167,7 @@ Date: Sat Mar 15 10:31:28 2008 -0700 As you can see, the `--stat` option prints below each commit entry a list of modified files, how many files were changed, and how many lines in those files were added and removed. It also puts a summary of the information at the end. ////////////////////////// + 이 결과에서 `--stat` 옵션은 어떤 파일이 수정됐는지, 얼마나 많은 파일이 변경됐는지, 또 얼마나 많은 라인을 추가하거나 삭제했는지 보여준다. 요약정보는 가장 뒤쪽에 보여준다. @@ -174,6 +178,7 @@ A few prebuilt options are available for you to use. The `oneline` option prints each commit on a single line, which is useful if you're looking at a lot of commits. In addition, the `short`, `full`, and `fuller` options show the output in roughly the same format but with less or more information, respectively: ////////////////////////// + 다른 또 유용한 옵션은 `--pretty` 옵션이다. 이 옵션을 통해 히스토리 내용을 보여줄 때 기본 형식 이외에 여러 가지 중에 하나를 선택할 수 있다. 몇개 선택할 수 있는 옵션의 값이 있다. @@ -231,7 +236,7 @@ a11bef0 - Scott Chacon, 6 years ago : first commit | `%s` | Subject |================================ ////////////////////////// -.`git log --pretty=format에 쓸 몇가지 유용한 옵션` +.`git log --pretty=format` 에 쓸 몇가지 유용한 옵션` [cols="1,4",options="header"] |================================ | 옵션 | 설명 @@ -267,6 +272,7 @@ _저자(Author)_ 와 _커미터(Committer)_ 를 구분하는 것이 조금 이 The `oneline` and `format` options are particularly useful with another `log` option called `--graph`. This option adds a nice little ASCII graph showing your branch and merge history: ////////////////////////// + `oneline` 옵션과 `format` 옵션은 `--graph` 옵션과 함께 사용할 때 더 빛난다. 이 명령은 브랜치와 머지 히스토리를 보여주는 아스키 그래프를 출력한다. @@ -340,6 +346,7 @@ You've seen one such option already – the `-2` option, which show only the las In fact, you can do `-`, where `n` is any integer to show the last `n` commits. In reality, you're unlikely to use that often, because Git by default pipes all output through a pager so you see only one page of log output at a time. ////////////////////////// + 출력 형식과 관련된 옵션을 살펴봤지만 `git log` 명령은 조회 범위를 제한하는 옵션들도 있다. 히스토리 전부가 아니라 부분만 조회한다. 이미 최근 두 개만 조회하는 `-2` 옵션은 살펴봤다. 실제 사용법은 `-`이고 n은 최근 n개의 커밋을 의미한다. @@ -349,7 +356,7 @@ In reality, you're unlikely to use that often, because Git by default pipes all However, the time-limiting options such as `--since` and `--until` are very useful. For example, this command gets the list of commits made in the last two weeks: ////////////////////////// -반면 `--since`나 `--until`같은 시간을 기준으로 조회하는 옵션은 매우 유용하다. +반면 `--since` 나 `--until` 같은 시간을 기준으로 조회하는 옵션은 매우 유용하다. 지난 2주 동안 만들어진 커밋들만 조회하는 명령은 아래와 같다. [source,console] @@ -375,7 +382,7 @@ The `--author` option allows you to filter on a specific author, and the `--grep Another really helpful filter is the `-S` option which takes a string and only shows the commits that introduced a change to the code that added or removed that string. For instance, if you wanted to find the last commit that added or removed a reference to a specific function, you could call: ////////////////////////// -진짜 유용한 옵션으로 `-S`가 있는데 이 옵션은 코드에서 추가되거나 제거된 내용 중에 특정 텍스트가 포함되어 있는지를 검색한다. +진짜 유용한 옵션으로 `-S` 가 있는데 이 옵션은 코드에서 추가되거나 제거된 내용 중에 특정 텍스트가 포함되어 있는지를 검색한다. 예를 들어 어떤 함수가 추가되거나 제거된 커밋만을 찾아보려면 아래와 같은 명령을 사용한다. [source,console] @@ -390,7 +397,7 @@ This is always the last option and is generally preceded by double dashes (`--`) ////////////////////////// 마지막으로 파일 경로로 검색하는 옵션이 있는데 이것도 정말 유용하다. 디렉토리나 파일 이름을 사용하여 그 파일이 변경된 log의 결과를 검색할 수 있다. -이 옵션은 `--`와 함께 경로 이름을 사용하는데 명령어 끝 부분에 쓴다(역주 - `git log -- path1 path2`). +이 옵션은 `--` 와 함께 경로 이름을 사용하는데 명령어 끝 부분에 쓴다(역주 - `git log -- path1 path2`). ////////////////////////// In <> we'll list these and a few other common options for your reference. diff --git a/book/03-git-branching/sections/basic-branching-and-merging.asc b/book/03-git-branching/sections/basic-branching-and-merging.asc index 227da109..00ebe311 100644 --- a/book/03-git-branching/sections/basic-branching-and-merging.asc +++ b/book/03-git-branching/sections/basic-branching-and-merging.asc @@ -61,7 +61,7 @@ You've decided that you're going to work on issue #53 in whatever issue-tracking To create a branch and switch to it at the same time, you can run the `git checkout` command with the `-b` switch: ////////////////////////// 이슈 관리 시스템에 등록된 53번 이슈를 처리한다고 하면 이 이슈에 집중할 수 있는 브랜치를 새로 하나 만든다. -브랜치를 만들면서 Checkout까지 한 번에 하려면 `git checkout` 명령에 `-b`라는 옵션을 추가한다. +브랜치를 만들면서 Checkout까지 한 번에 하려면 `git checkout` 명령에 `-b` 라는 옵션을 추가한다. [source,console] ---- @@ -91,7 +91,7 @@ image::images/basic-branching-2.png[브랜치 포인터를 새로 만듦] You work on your website and do some commits. Doing so moves the `iss53` branch forward, because you have it checked out (that is, your `HEAD` is pointing to it): ////////////////////////// -`iss53` 브랜치를 Checkout 했기 때문에(즉, `HEAD`는 `iss53` 브랜치를 가리킨다) +`iss53` 브랜치를 Checkout 했기 때문에(즉, `HEAD` 는 `iss53` 브랜치를 가리킨다) 뭔가 일을 하고 커밋하면 `iss53` 브랜치가 앞으로 나아간다. [source,console] @@ -113,7 +113,7 @@ With Git, you don't have to deploy your fix along with the `iss53` changes you'v All you have to do is switch back to your `master` branch. ////////////////////////// 다른 상황을 가정해보자. 만드는 사이트에 문제가 생겨서 즉시 고쳐야 한다. -버그를 해결한 Hotfix에 `iss53`이 섞이는 것을 방지하기 위해 `iss53`과 관련된 코드를 어딘가에 저장해두고 원래 운영 환경의 소스로 복구해야 한다. +버그를 해결한 Hotfix에 `iss53` 이 섞이는 것을 방지하기 위해 `iss53` 과 관련된 코드를 어딘가에 저장해두고 원래 운영 환경의 소스로 복구해야 한다. Git을 사용하면 이런 노력을 들일 필요 없이 그냥 `master` 브랜치로 돌아가면 된다. ////////////////////////// @@ -207,7 +207,7 @@ image::images/basic-branching-5.png[Merge 후 `hotfix` 같은 것을 가리키 ////////////////////////// After your super-important fix is deployed, you're ready to switch back to the work you were doing before you were interrupted. However, first you'll delete the `hotfix` branch, because you no longer need it – the `master` branch points at the same place. -You can delete it with the `-d` option to `git branch`: +You can delete it with the `-d` option to `git branch` : ////////////////////////// 급한 문제를 해결하고 master 브랜치에 적용하고 나면 다시 일하던 브랜치로 돌아가야 한다. 이제 더 이상 필요없는 hotfix 브랜치는 삭제한다. @@ -245,8 +245,8 @@ image::images/basic-branching-6.png[master와 별개로 진행하는 iss53 브 It's worth noting here that the work you did in your `hotfix` branch is not contained in the files in your `iss53` branch. If you need to pull it in, you can merge your `master` branch into your `iss53` branch by running `git merge master`, or you can wait to integrate those changes until you decide to pull the `iss53` branch back into `master` later. ////////////////////////// -위에서 작업한 `hotfix`가 `iss53` 브랜치에 영향을 끼치지 않는다는 점을 이해하는 것이 중요하다. -`git merge master` 명령으로 `master` 브랜치를 `iss53` 브랜치에 Merge 하면 `iss53` 브랜치에 `hotfix`가 적용된다. 아니면 `iss53` 브랜치가 `master`에 Merge 할 수 있는 수준이 될 때까지 기다렸다가 Merge 하면 `hotfix`와 `iss53` 브랜치가 합쳐진다. +위에서 작업한 `hotfix` 가 `iss53` 브랜치에 영향을 끼치지 않는다는 점을 이해하는 것이 중요하다. +`git merge master` 명령으로 `master` 브랜치를 `iss53` 브랜치에 Merge 하면 `iss53` 브랜치에 `hotfix` 가 적용된다. 아니면 `iss53` 브랜치가 `master` 에 Merge 할 수 있는 수준이 될 때까지 기다렸다가 Merge 하면 `hotfix` 와 `iss53` 브랜치가 합쳐진다. [[r_basic_merging]] ////////////////////////// @@ -280,7 +280,7 @@ In this case, your development history has diverged from some older point. Because the commit on the branch you're on isn't a direct ancestor of the branch you're merging in, Git has to do some work. In this case, Git does a simple three-way merge, using the two snapshots pointed to by the branch tips and the common ancestor of the two. ////////////////////////// -`hotfix`를 Merge 했을 때와 메시지가 다르다. +`hotfix` 를 Merge 했을 때와 메시지가 다르다. 현재 브랜치가 가리키는 커밋이 Merge 할 브랜치의 조상이 아니므로 Git은 'Fast-forward'로 Merge 하지 않는다. 이 경우에는 Git은 각 브랜치가 가리키는 커밋 두 개와 공통 조상 하나를 사용하여 3-way Merge를 한다. @@ -339,7 +339,7 @@ If your fix for issue #53 modified the same part of a file as the `hotfix`, you' ////////////////////////// 가끔씩 3-way Merge가 실패할 때도 있다. Merge 하는 두 브랜치에서 같은 파일의 한 부분을 동시에 수정하고 Merge 하면 Git은 해당 부분을 Merge 하지 못한다. -예를 들어, 53번 이슈와 `hotfix`가 같은 부분을 수정했다면 Git은 Merge 하지 못하고 아래와 같은 충돌(Conflict) 메시지를 출력한다. +예를 들어, 53번 이슈와 `hotfix` 가 같은 부분을 수정했다면 Git은 Merge 하지 못하고 아래와 같은 충돌(Conflict) 메시지를 출력한다. [source,console] ---- @@ -352,7 +352,7 @@ Automatic merge failed; fix conflicts and then commit the result. ////////////////////////// Git hasn't automatically created a new merge commit. It has paused the process while you resolve the conflict. -If you want to see which files are unmerged at any point after a merge conflict, you can run `git status`: +If you want to see which files are unmerged at any point after a merge conflict, you can run `git status` : ////////////////////////// Git은 자동으로 Merge 하지 못해서 새 커밋이 생기지 않는다. 변경사항의 충돌을 개발자가 해결하지 않는 한 Merge 과정을 진행할 수 없다. @@ -444,7 +444,7 @@ Hit return to start merge resolution tool (opendiff): If you want to use a merge tool other than the default (Git chose `opendiff` in this case because the command was run on a Mac), you can see all the supported tools listed at the top after ``one of the following tools.'' Just type the name of the tool you'd rather use. ////////////////////////// -기본 도구 말고 사용할 수 있는 다른 Merge 도구도 있는데(Mac에서는 `opendiff`가 실행된다), ``one of the following tools.'' 부분에 보여준다. +기본 도구 말고 사용할 수 있는 다른 Merge 도구도 있는데(Mac에서는 `opendiff` 가 실행된다), ``one of the following tools.'' 부분에 보여준다. 여기에 표시된 도구 중 하나를 고를 수 있다. [NOTE] @@ -463,7 +463,7 @@ If you tell the script that it was, it stages the file to mark it as resolved fo You can run `git status` again to verify that all conflicts have been resolved: ////////////////////////// Merge 도구를 종료하면 Git은 잘 Merge 했는지 물어본다. -잘 마쳤다고 입력하면 자동으로 `git add`가 수행되고 해당 파일이 Staging Area에 저장된다. +잘 마쳤다고 입력하면 자동으로 `git add` 가 수행되고 해당 파일이 Staging Area에 저장된다. `git status` 명령으로 충돌이 해결된 상태인지 다시 한번 확인해볼 수 있다. [source,console] diff --git a/book/03-git-branching/sections/branch-management.asc b/book/03-git-branching/sections/branch-management.asc index 3e5473eb..a6cb5f80 100644 --- a/book/03-git-branching/sections/branch-management.asc +++ b/book/03-git-branching/sections/branch-management.asc @@ -28,7 +28,7 @@ $ git branch ////////////////////////// Notice the `*` character that prefixes the `master` branch: it indicates the branch that you currently have checked out (i.e., the branch that `HEAD` points to). This means that if you commit at this point, the `master` branch will be moved forward with your new work. -To see the last commit on each branch, you can run `git branch -v`: +To see the last commit on each branch, you can run `git branch -v` : ////////////////////////// `*` 기호가 붙어 있는 `master` 브랜치는 현재 Checkout 해서 작업하는 브랜치를 나타낸다. 즉, 지금 수정한 내용을 커밋하면 `master` 브랜치에 커밋되고 포인터가 앞으로 한 단계 나아간다. @@ -44,9 +44,9 @@ $ git branch -v ////////////////////////// The useful `--merged` and `--no-merged` options can filter this list to branches that you have or have not yet merged into the branch you're currently on. -To see which branches are already merged into the branch you're on, you can run `git branch --merged`: +To see which branches are already merged into the branch you're on, you can run `git branch --merged` : ////////////////////////// -각 브랜치가 지금 어떤 상태인지 확인하기에 좋은 옵션도 있다. 현재 Checkout 한 브랜치를 기준으로 `--merged`와 `--no-merged` 옵션을 사용하여 Merge 된 브랜치인지 그렇지 않은지 필터링해 볼 수 있다. +각 브랜치가 지금 어떤 상태인지 확인하기에 좋은 옵션도 있다. 현재 Checkout 한 브랜치를 기준으로 `--merged` 와 `--no-merged` 옵션을 사용하여 Merge 된 브랜치인지 그렇지 않은지 필터링해 볼 수 있다. `git branch --merged` 명령으로 이미 Merge 한 브랜치 목록을 확인한다. [source,console] @@ -58,13 +58,13 @@ $ git branch --merged ////////////////////////// Because you already merged in `iss53` earlier, you see it in your list. -Branches on this list without the `*` in front of them are generally fine to delete with `git branch -d`; you've already incorporated their work into another branch, so you're not going to lose anything. +Branches on this list without the `*` in front of them are generally fine to delete with `git branch -d` ; you've already incorporated their work into another branch, so you're not going to lose anything. ////////////////////////// `iss53` 브랜치는 앞에서 이미 Merge 했기 때문에 목록에 나타난다. `*` 기호가 붙어 있지 않은 브랜치는 `git branch -d` 명령으로 삭제해도 되는 브랜치다. 이미 다른 브랜치와 Merge 했기 때문에 삭제해도 정보를 잃지 않는다. ////////////////////////// -To see all the branches that contain work you haven't yet merged in, you can run `git branch --no-merged`: +To see all the branches that contain work you haven't yet merged in, you can run `git branch --no-merged` : ////////////////////////// 반대로 현재 Checkout 한 브랜치에 Merge 하지 않은 브랜치를 살펴보려면 `git branch --no-merged` 명령을 사용한다. diff --git a/book/03-git-branching/sections/nutshell.asc b/book/03-git-branching/sections/nutshell.asc index 0d17763c..edd0ba0f 100644 --- a/book/03-git-branching/sections/nutshell.asc +++ b/book/03-git-branching/sections/nutshell.asc @@ -38,7 +38,7 @@ $ git commit -m 'The initial commit of my project' When you create the commit by running `git commit`, Git checksums each subdirectory (in this case, just the root project directory) and stores those tree objects in the Git repository. Git then creates a commit object that has the metadata and a pointer to the root project tree so it can re-create that snapshot when needed.(((git commands, commit))) ////////////////////////// -`git commit`으로 커밋하면 먼저 루트 디렉토리와 각 하위 디렉토리의 트리 개체를 체크섬과 함께 저장소에 저장한다. +`git commit` 으로 커밋하면 먼저 루트 디렉토리와 각 하위 디렉토리의 트리 개체를 체크섬과 함께 저장소에 저장한다. 그다음에 커밋 개체를 만들고 메타데이터와 루트 디렉토리 트리 개체를 가리키는 포인터 정보를 커밋 개체에 넣어 저장한다. 그래서 필요하면 언제든지 스냅샷을 다시 만들 수 있다.(((git commands, commit))) ////////////////////////// @@ -305,7 +305,7 @@ You can also see this easily with the `git log` command. If you run `git log --oneline --decorate --graph --all` it will print out the history of your commits, showing where your branch pointers are and how your history has diverged. ////////////////////////// `git log` 명령으로 쉽게 확인할 수 있다. -현재 브랜치가 가리키고 있는 히스토리가 무엇이고 어떻게 갈라져 나왔는지 보여준다. `git log --oneline --decorate --graph --all`이라고 실행하면 히스토리를 출력한다. +현재 브랜치가 가리키고 있는 히스토리가 무엇이고 어떻게 갈라져 나왔는지 보여준다. `git log --oneline --decorate --graph --all` 이라고 실행하면 히스토리를 출력한다. [source,console] ---- diff --git a/book/03-git-branching/sections/rebasing.asc b/book/03-git-branching/sections/rebasing.asc index efca3040..45b4bf66 100644 --- a/book/03-git-branching/sections/rebasing.asc +++ b/book/03-git-branching/sections/rebasing.asc @@ -48,7 +48,8 @@ However, there is another way: you can take the patch of the change that was int In Git, this is called _rebasing_. With the `rebase` command, you can take all the changes that were committed on one branch and replay them on another one.(((git commands, rebase))) ////////////////////////// -비슷한 결과를 만드는 다른 방식으로, `C3`에서 변경된 사항을 Patch로 만들고 이를 다시 `C4`에 적용시키는 방법이 있다. + +비슷한 결과를 만드는 다른 방식으로, `C3` 에서 변경된 사항을 Patch로 만들고 이를 다시 `C4` 에 적용시키는 방법이 있다. Git에서는 이런 방식을 _Rebase_라고 한다. `rebase` 명령으로 한 브랜치에서 변경된 사항을 다른 브랜치에 적용할 수 있다.(((git commands, rebase))) @@ -68,6 +69,7 @@ Applying: added staged command ////////////////////////// It works by going to the common ancestor of the two branches (the one you're on and the one you're rebasing onto), getting the diff introduced by each commit of the branch you're on, saving those diffs to temporary files, resetting the current branch to the same commit as the branch you are rebasing onto, and finally applying each change in turn. ////////////////////////// + 실제로 일어나는 일을 설명하자면 일단 두 브랜치가 나뉘기 전인 공통 커밋으로 이동하고 나서 그 커밋부터 지금 Checkout 한 브랜치가 가리키는 커밋까지 diff를 차례로 만들어 어딘가에 임시로 저장해 놓는다. Rebase 할 브랜치(역주 - experiment)가 합칠 브랜치(역주 - master)가 가리키는 커밋을 가리키게 하고 아까 저장해 놓았던 변경사항을 차례대로 적용한다. ////////////////////////// @@ -100,7 +102,7 @@ Now, the snapshot pointed to by `C4'` is exactly the same as the one that was po There is no difference in the end product of the integration, but rebasing makes for a cleaner history. If you examine the log of a rebased branch, it looks like a linear history: it appears that all the work happened in series, even when it originally happened in parallel. ////////////////////////// -`C4'`로 표시된 커밋에서의 내용은 Merge 예제에서 살펴본 `C5` 커밋에서의 내용과 같을 것이다. +`C4'` 로 표시된 커밋에서의 내용은 Merge 예제에서 살펴본 `C5` 커밋에서의 내용과 같을 것이다. Merge 이든 Rebase 든 둘 다 합치는 관점에서는 서로 다를 게 없다. 하지만, Rebase가 좀 더 깨끗한 히스토리를 만든다. Rebase 한 브랜치의 Log를 살펴보면 히스토리가 선형이다. 일을 병렬로 동시에 진행해도 Rebase 하고 나면 모든 작업이 차례대로 수행된 것처럼 보인다. @@ -110,13 +112,14 @@ In this case, you'd do your work in a branch and then rebase your work onto `ori That way, the maintainer doesn't have to do any integration work – just a fast-forward or a clean apply. ////////////////////////// Rebase는 보통 리모트 브랜치에 커밋을 깔끔하게 적용하고 싶을 때 사용한다. 아마 이렇게 Rebase 하는 리모트 브랜치는 직접 관리하는 것이 아니라 그냥 참여하는 브랜치일 것이다. -메인 프로젝트에 Patch를 보낼 준비가 되면 하는 것이 Rebase 니까 브랜치에서 하던 일을 완전히 마치고 `origin/master`로 Rebase 한다. +메인 프로젝트에 Patch를 보낼 준비가 되면 하는 것이 Rebase 니까 브랜치에서 하던 일을 완전히 마치고 `origin/master` 로 Rebase 한다. 이렇게 Rebase 하고 나면 프로젝트 관리자는 어떠한 통합작업도 필요 없다. 그냥 master 브랜치를 Fast-forward 시키면 된다. ////////////////////////// Note that the snapshot pointed to by the final commit you end up with, whether it's the last of the rebased commits for a rebase or the final merge commit after a merge, is the same snapshot – it's only the history that is different. Rebasing replays changes from one line of work onto another in the order they were introduced, whereas merging takes the endpoints and merges them together. ////////////////////////// + Rebase를 하든지, Merge를 하든지 최종 결과물은 같고 커밋 히스토리만 다르다는 것이 중요하다. Rebase 의 경우는 브랜치의 변경사항을 순서대로 다른 브랜치에 적용하면서 합치고 Merge 의 경우는 두 브랜치의 최종결과만을 가지고 합친다. @@ -148,10 +151,10 @@ image::images/interesting-rebase-1.png[다른 토픽 브랜치에서 갈라져 ////////////////////////// Suppose you decide that you want to merge your client-side changes into your mainline for a release, but you want to hold off on the server-side changes until it's tested further. -You can take the changes on client that aren't on server (`C8` and `C9`) and replay them on your `master` branch by using the `--onto` option of `git rebase`: +You can take the changes on client that aren't on server (`C8` and `C9`) and replay them on your `master` branch by using the `--onto` option of `git rebase` : ////////////////////////// -이때 테스트가 덜 된 `server` 브랜치는 그대로 두고 `client` 브랜치만 `master`로 합치려는 상황을 생각해보자. -`server`와는 아무 관련이 없는 `client` 커밋은 `C8`, `C9`이다. 이 두 커밋을 `master` 브랜치에 적용하기 위해서 `--onto` 옵션을 사용하여 아래와 같은 명령을 실행한다: +이때 테스트가 덜 된 `server` 브랜치는 그대로 두고 `client` 브랜치만 `master` 로 합치려는 상황을 생각해보자. +`server` 와는 아무 관련이 없는 `client` 커밋은 `C8`, `C9` 이다. 이 두 커밋을 `master` 브랜치에 적용하기 위해서 `--onto` 옵션을 사용하여 아래와 같은 명령을 실행한다: [source,console] ---- @@ -195,7 +198,7 @@ image::images/interesting-rebase-3.png[master 브랜치를 client 브랜치 위 Let's say you decide to pull in your server branch as well. You can rebase the server branch onto the `master` branch without having to check it out first by running `git rebase [basebranch] [topicbranch]` – which checks out the topic branch (in this case, `server`) for you and replays it onto the base branch (`master`): ////////////////////////// -`server` 브랜치의 일이 다 끝나면 `git rebase [basebranch] [topicbranch]`라는 명령으로 Checkout 하지 않고 바로 `server` 브랜치를 `master` 브랜치로 Rebase 할 수 있다. +`server` 브랜치의 일이 다 끝나면 `git rebase [basebranch] [topicbranch]` 라는 명령으로 Checkout 하지 않고 바로 `server` 브랜치를 `master` 브랜치로 Rebase 할 수 있다. 이 명령은 토픽(server) 브랜치를 Checkout 하고 베이스(master) 브랜치에 Rebase 한다. [source,console] @@ -230,7 +233,7 @@ $ git merge server ////////////////////////// You can remove the `client` and `server` branches because all the work is integrated and you don't need them anymore, leaving your history for this entire process looking like <>: ////////////////////////// -모든 것이 `master` 브랜치에 통합됐기 때문에 더 필요하지 않다면 `client`나 `server` 브랜치는 삭제해도 된다. 브랜치를 삭제해도 커밋 히스토리는 <> 같이 여전히 남아 있다. +모든 것이 `master` 브랜치에 통합됐기 때문에 더 필요하지 않다면 `client` 나 `server` 브랜치는 삭제해도 된다. 브랜치를 삭제해도 커밋 히스토리는 <> 같이 여전히 남아 있다. [source,console] ---- @@ -275,7 +278,7 @@ When you rebase stuff, you're abandoning existing commits and creating new ones If you push commits somewhere and others pull them down and base work on them, and then you rewrite those commits with `git rebase` and push them up again, your collaborators will have to re-merge their work and things will get messy when you try to pull their work back into yours. ////////////////////////// Rebase는 기존의 커밋을 그대로 사용하는 것이 아니라 내용은 같지만 다른 커밋을 새로 만든다. -새 커밋을 서버에 Push 하고 동료 중 누군가가 그 커밋을 Pull 해서 작업을 한다고 하자. 그런데 그 커밋을 `git rebase`로 바꿔서 Push 해버리면 동료가 다시 Push 했을 때 동료는 다시 Merge 해야 한다. 그리고 동료가 다시 Merge 한 내용을 Pull 하면 내 코드는 정말 엉망이 된다. +새 커밋을 서버에 Push 하고 동료 중 누군가가 그 커밋을 Pull 해서 작업을 한다고 하자. 그런데 그 커밋을 `git rebase` 로 바꿔서 Push 해버리면 동료가 다시 Push 했을 때 동료는 다시 Merge 해야 한다. 그리고 동료가 다시 Merge 한 내용을 Pull 하면 내 코드는 정말 엉망이 된다. ////////////////////////// Let's look at an example of how rebasing work that you've made public can cause problems. @@ -327,7 +330,7 @@ Now you're both in a pickle. If you do a `git pull`, you'll create a merge commit which includes both lines of history, and your repository will look like this: ////////////////////////// 자 이렇게 되면 짬뽕이 된다. -`git pull`로 서버의 내용을 가져와서 Merge 하면 같은 내용의 수정사항을 포함한 Merge 커밋이 아래와 같이 만들어진다. +`git pull` 로 서버의 내용을 가져와서 Merge 하면 같은 내용의 수정사항을 포함한 Merge 커밋이 아래와 같이 만들어진다. [[r_merge_rebase_work]] ////////////////////////// @@ -342,7 +345,7 @@ If you run a `git log` when your history looks like this, you'll see two commits Furthermore, if you push this history back up to the server, you'll reintroduce all those rebased commits to the central server, which can further confuse people. It's pretty safe to assume that the other developer doesn't want `C4` and `C6` to be in the history; that's why they rebased in the first place. ////////////////////////// -`git log`로 히스토리를 확인해보면 저자, 커밋 날짜, 메시지가 같은 커밋이 두 개 있다(C4, C4'). 이렇게 되면 혼란스럽다. +`git log` 로 히스토리를 확인해보면 저자, 커밋 날짜, 메시지가 같은 커밋이 두 개 있다(C4, C4'). 이렇게 되면 혼란스럽다. 게다가 이 히스토리를 서버에 Push 하면 같은 커밋이 두 개 있기 때문에 다른 사람들도 혼란스러워한다. `C4`와 `C6`는 포함되지 말았어야 할 커밋이다. 애초에 서버로 데이터를 보내기 전에 Rebase로 커밋을 정리했어야 했다. @@ -411,8 +414,8 @@ Otherwise the rebase won't be able to tell that it's a duplicate and will add an You can also simplify this by running a `git pull --rebase` instead of a normal `git pull`. Or you could do it manually with a `git fetch` followed by a `git rebase teamone/master` in this case. ////////////////////////// -`git pull` 명령을 실행할 때 옵션을 붙여서 `git pull --rebase`로 Rebase 할 수도 있다. -물론 `git fetch`와 `git rebase teamone/master`이 두 명령을 직접 순서대로 실행해도 된다. +`git pull` 명령을 실행할 때 옵션을 붙여서 `git pull --rebase` 로 Rebase 할 수도 있다. +물론 `git fetch` 와 `git rebase teamone/master` 이 두 명령을 직접 순서대로 실행해도 된다. ////////////////////////// If you are using `git pull` and want to make `--rebase` the default, you can set the `pull.rebase` config value with something like `git config --global pull.rebase true`. @@ -429,7 +432,7 @@ Push 하기 전에 정리하려고 Rebase 하는 것은 괜찮다. 또 절대 ////////////////////////// If you or a partner does find it necessary at some point, make sure everyone knows to run `git pull --rebase` to try to make the pain after it happens a little bit simpler. ////////////////////////// -나중에 후회하지 말고 `git pull --rebase`로 문제를 미리 방지할 수 있다는 것을 같이 작업하는 동료와 모두 함께 공유하기 바란다. +나중에 후회하지 말고 `git pull --rebase` 로 문제를 미리 방지할 수 있다는 것을 같이 작업하는 동료와 모두 함께 공유하기 바란다. ////////////////////////// ==== Rebase vs. Merge diff --git a/book/03-git-branching/sections/remote-branches.asc b/book/03-git-branching/sections/remote-branches.asc index 18992066..be3b834b 100644 --- a/book/03-git-branching/sections/remote-branches.asc +++ b/book/03-git-branching/sections/remote-branches.asc @@ -29,7 +29,7 @@ For instance, if you wanted to see what the `master` branch on your `origin` rem If you were working on an issue with a partner and they pushed up an `iss53` branch, you might have your own local `iss53` branch; but the branch on the server would point to the commit at `origin/iss53`. ////////////////////////// 리모트 브랜치의 이름은 `(remote)/(branch)` 형식으로 되어 있다. -예를 들어 리모트 저장소 `origin`의 `master` 브랜치를 보고 싶다면 `origin/master`라는 이름으로 브랜치를 확인하면 된다. +예를 들어 리모트 저장소 `origin` 의 `master` 브랜치를 보고 싶다면 `origin/master` 라는 이름으로 브랜치를 확인하면 된다. 다른 팀원과 함께 어떤 이슈를 구현할 때 그 팀원이 `iss53` 브랜치를 서버로 Push 했고 당신도 로컬에 `iss53` 브랜치가 있다고 가정하자. 이때 서버의 `iss53` 브랜치가 가리키는 커밋은 로컬에서 `origin/iss53`이 가리키는 커밋이다. ////////////////////////// @@ -39,9 +39,9 @@ If you clone from this, Git's `clone` command automatically names it `origin` fo Git also gives you your own local `master` branch starting at the same place as origin's `master` branch, so you have something to work from. ////////////////////////// 다소 헷갈릴 수 있으니 예제를 좀 더 살펴보자. -`git.ourcompany.com`이라는 Git 서버가 있고 이 서버의 저장소를 하나 Clone 하면 Git은 자동으로 `origin`이라는 이름을 붙인다. -`origin`으로부터 저장소 데이터를 모두 내려받고 `master` 브랜치를 가리키는 포인터를 만든다. 이 포인터는 `origin/master`라고 부르고 멋대로 조종할 수 없다. -그리고 Git은 로컬의 `master` 브랜치가 `origin/master`를 가리키게 한다. 이제 이 `master` 브랜치에서 작업을 시작할 수 있다. +`git.ourcompany.com` 이라는 Git 서버가 있고 이 서버의 저장소를 하나 Clone 하면 Git은 자동으로 `origin` 이라는 이름을 붙인다. +`origin` 으로부터 저장소 데이터를 모두 내려받고 `master` 브랜치를 가리키는 포인터를 만든다. 이 포인터는 `origin/master` 라고 부르고 멋대로 조종할 수 없다. +그리고 Git은 로컬의 `master` 브랜치가 `origin/master` 를 가리키게 한다. 이제 이 `master` 브랜치에서 작업을 시작할 수 있다. [NOTE] ////////////////////////// @@ -103,7 +103,7 @@ Name this remote `teamone`, which will be your shortname for that whole URL. 리모트 저장소를 여러 개 운영하는 상황을 이해할 수 있도록 개발용으로 사용할 Git 저장소를 팀 내부에 하나 추가해 보자. 이 저장소의 주소가 `git.team1.ourcompany.com` 이며 <>에서 살펴본 `git remote add` 명령으로 현재 작업 중인 프로젝트에 팀의 저장소를 추가한다. -이름을 `teamone`으로 짓고 긴 서버 주소 대신 사용한다. +이름을 `teamone` 으로 짓고 긴 서버 주소 대신 사용한다. ////////////////////////// .Adding another server as a remote @@ -117,14 +117,14 @@ Now, you can run `git fetch teamone` to fetch everything the remote `teamone` se Because that server has a subset of the data your `origin` server has right now, Git fetches no data but sets a remote-tracking branch called `teamone/master` to point to the commit that `teamone` has as its `master` branch. ////////////////////////// 서버를 추가하고 나면 `git fetch teamone` 명령으로 `teamone` 서버의 데이터를 내려받는다. -명령을 실행해도 `teamone` 서버의 데이터는 모두 `origin` 서버에도 있는 것들이라서 아무것도 내려받지 않는다. 하지만, 이 명령은 리모트 트래킹 브랜치 `teamone/master`가 `teamone` 서버의 `master` 브랜치가 가리키는 커밋을 가리키게 한다. +명령을 실행해도 `teamone` 서버의 데이터는 모두 `origin` 서버에도 있는 것들이라서 아무것도 내려받지 않는다. 하지만, 이 명령은 리모트 트래킹 브랜치 `teamone/master` 가 `teamone` 서버의 `master` 브랜치가 가리키는 커밋을 가리키게 한다. ////////////////////////// .Remote tracking branch for `teamone/master` image::images/remote-branches-5.png[Remote tracking branch for `teamone/master`.] ////////////////////////// -.`teamone/master`의 리모트 트래킹 브랜치 -image::images/remote-branches-5.png[`teamone/master`의 리모트 트래킹 브랜치] +.`teamone/master` 의 리모트 트래킹 브랜치 +image::images/remote-branches-5.png[`teamone/master` 의 리모트 트래킹 브랜치] [[r_pushing_branches]] ////////////////////////// @@ -146,7 +146,7 @@ That way, you can use private branches for work you don't want to share, and pus If you have a branch named `serverfix` that you want to work on with others, you can push it up the same way you pushed your first branch. Run `git push `:(((git commands, push))) ////////////////////////// -`serverfix`라는 브랜치를 다른 사람과 공유할 때도 브랜치를 처음 Push 하는 것과 같은 방법으로 Push 한다. +`serverfix` 라는 브랜치를 다른 사람과 공유할 때도 브랜치를 처음 Push 하는 것과 같은 방법으로 Push 한다. 아래와 같이 `git push ` 명령을 사용한다.(((git commands, push))) [source,console] @@ -169,12 +169,12 @@ You can also do `git push origin serverfix:serverfix`, which does the same thing You can use this format to push a local branch into a remote branch that is named differently. If you didn't want it to be called `serverfix` on the remote, you could instead run `git push origin serverfix:awesomebranch` to push your local `serverfix` branch to the `awesomebranch` branch on the remote project. ////////////////////////// -Git은 serverfix라는 브랜치 이름을 `refs/heads/serverfix:refs/heads/serverfix`로 확장한다. -이것은 `serverfix`라는 로컬 브랜치를 서버로 Push 하는데 리모트의 `serverfix` 브랜치로 업데이트한다는 것을 의미한다. -나중에 <>에서 `refs/heads/`의 뜻을 자세히 알아볼 것이기 때문에 일단 넘어가도록 한다. -`git push origin serverfix:serverfix`라고 Push 하는 것도 같은 의미인데 이것은 ``로컬의 serverfix 브랜치를 리모트 저장소의 serverfix 브랜치로 Push 하라'' 라는 뜻이다. +Git은 serverfix라는 브랜치 이름을 `refs/heads/serverfix:refs/heads/serverfix` 로 확장한다. +이것은 `serverfix` 라는 로컬 브랜치를 서버로 Push 하는데 리모트의 `serverfix` 브랜치로 업데이트한다는 것을 의미한다. +나중에 <>에서 `refs/heads/` 의 뜻을 자세히 알아볼 것이기 때문에 일단 넘어가도록 한다. +`git push origin serverfix:serverfix` 라고 Push 하는 것도 같은 의미인데 이것은 ``로컬의 serverfix 브랜치를 리모트 저장소의 serverfix 브랜치로 Push 하라'' 라는 뜻이다. 로컬 브랜치의 이름과 리모트 서버의 브랜치 이름이 다를 때 필요하다. -리모트 저장소에 `serverfix`라는 이름 대신 다른 이름을 사용하려면 `git push origin serverfix:awesomebranch`처럼 사용한다. +리모트 저장소에 `serverfix` 라는 이름 대신 다른 이름을 사용하려면 `git push origin serverfix:awesomebranch` 처럼 사용한다. [NOTE] ////////////////////////// @@ -201,9 +201,9 @@ HTTPS URL로 시작하는 리모트 저장소를 사용한다면 아마도 Push ==== ////////////////////////// -The next time one of your collaborators fetches from the server, they will get a reference to where the server's version of `serverfix` is under the remote branch `origin/serverfix`: +The next time one of your collaborators fetches from the server, they will get a reference to where the server's version of `serverfix` is under the remote branch `origin/serverfix` : ////////////////////////// -나중에 누군가 저장소를 Fetch 하고 나서 서버에 있는 `serverfix` 브랜치에 접근할 때 `origin/serverfix`라는 이름으로 접근할 수 있다. +나중에 누군가 저장소를 Fetch 하고 나서 서버에 있는 `serverfix` 브랜치에 접근할 때 `origin/serverfix` 라는 이름으로 접근할 수 있다. [source,console] ---- @@ -221,7 +221,7 @@ It's important to note that when you do a fetch that brings down new remote-trac In other words, in this case, you don't have a new `serverfix` branch – you only have an `origin/serverfix` pointer that you can't modify. ////////////////////////// 여기서 짚고 넘어가야 할 게 있다. Fetch 명령으로 리모트 트래킹 브랜치를 내려받는다고 해서 로컬 저장소에 수정할 수 있는 브랜치가 새로 생기는 것이 아니다. -다시 말해서 `serverfix`라는 브랜치가 생기는 것이 아니라 그저 수정 못 하는 `origin/serverfix` 브랜치 포인터가 생기는 것이다. +다시 말해서 `serverfix` 라는 브랜치가 생기는 것이 아니라 그저 수정 못 하는 `origin/serverfix` 브랜치 포인터가 생기는 것이다. ////////////////////////// To merge this work into your current working branch, you can run `git merge origin/serverfix`. @@ -240,7 +240,7 @@ Switched to a new branch 'serverfix' ////////////////////////// This gives you a local branch that you can work on that starts where `origin/serverfix` is. ////////////////////////// -그러면 `origin/serverfix`에서 시작하고 수정할 수 있는 `serverfix`라는 로컬 브랜치가 만들어진다. +그러면 `origin/serverfix` 에서 시작하고 수정할 수 있는 `serverfix` 라는 로컬 브랜치가 만들어진다. [[r_tracking_branches]] ////////////////////////// @@ -265,7 +265,7 @@ The simple case is the example you just saw, running `git checkout -b [branch] [ This is a common enough operation that Git provides the `--track` shorthand: ////////////////////////// 서버로부터 저장소를 Clone을 하면 Git은 자동으로 `master` 브랜치를 `origin/master` 브랜치의 트래킹 브랜치로 만든다. -트래킹 브랜치를 직접 만들 수 있는데 리모트를 `origin`이 아닌 다른 리모트로 할 수도 있고, 브랜치도 `master`가 아닌 다른 브랜치로 추적하게 할 수 있다. +트래킹 브랜치를 직접 만들 수 있는데 리모트를 `origin` 이 아닌 다른 리모트로 할 수도 있고, 브랜치도 `master` 가 아닌 다른 브랜치로 추적하게 할 수 있다. `git checkout -b [branch] [remotename]/[branch]` 명령으로 간단히 트래킹 브랜치를 만들 수 있다. `--track` 옵션을 사용하여 로컬 브랜치 이름을 자동으로 생성할 수 있다. @@ -303,12 +303,12 @@ Switched to a new branch 'sf' ////////////////////////// Now, your local branch `sf` will automatically pull from `origin/serverfix`. ////////////////////////// -이제 `sf` 브랜치에서 Push 나 Pull 하면 자동으로 `origin/serverfix`로 데이터를 보내거나 가져온다. +이제 `sf` 브랜치에서 Push 나 Pull 하면 자동으로 `origin/serverfix` 로 데이터를 보내거나 가져온다. ////////////////////////// If you already have a local branch and want to set it to a remote branch you just pulled down, or want to change the upstream branch you're tracking, you can use the `-u` or `--set-upstream-to` option to `git branch` to explicitly set it at any time. ////////////////////////// -이미 로컬에 존재하는 브랜치가 리모트의 특정 브랜치를 추적하게 하려면 `git branch` 명령에 `-u`나 `--set-upstream-to` 옵션을 붙여서 아래와 같이 설정한다. +이미 로컬에 존재하는 브랜치가 리모트의 특정 브랜치를 추적하게 하려면 `git branch` 명령에 `-u` 나 `--set-upstream-to` 옵션을 붙여서 아래와 같이 설정한다. [source,console] ---- @@ -326,7 +326,7 @@ So if you're on the `master` branch and it's tracking `origin/master`, you can s ////////////////////////// .Upstream 별명 ==== -추적 브랜치를 설정했다면 추적 브랜치 이름을 `@{upstream}`이나 `@{u}`로 짧게 대체하여 사용할 수 있다. +추적 브랜치를 설정했다면 추적 브랜치 이름을 `@{upstream}` 이나 `@{u}` 로 짧게 대체하여 사용할 수 있다. `master` 브랜치가 `origin/master` 브랜치를 추적하는 경우라면 `git merge origin/master` 명령과 `git merge @{u}` 명령을 똑같이 사용할 수 있다.(((+++@{u}+++)))(((+++@{upstream}+++))) ==== @@ -388,12 +388,12 @@ If you have a tracking branch set up as demonstrated in the last section, either `git fetch` 명령을 실행하면 서버에는 존재하지만, 로컬에는 아직 없는 데이터를 받아와서 저장한다. 이 때 워킹 디렉토리의 파일 내용은 변경되지 않고 그대로 남는다. 서버로부터 데이터를 가져와서 저장해두고 사용자가 Merge 하도록 준비만 해둔다. 간단히 말하면 `git pull` 명령은 대부분 `git fetch` 명령을 실행하고 나서 자동으로 `git merge` 명령을 수행하는 것 뿐이다. -바로 앞 절에서 살펴본 대로 `clone`이나 `checkout` 명령을 실행하여 추적 브랜치가 설정되면 `git pull` 명령은 서버로부터 데이터를 가져와서 현재 로컬 브랜치와 서버의 추적 브랜치를 Merge 한다. +바로 앞 절에서 살펴본 대로 `clone` 이나 `checkout` 명령을 실행하여 추적 브랜치가 설정되면 `git pull` 명령은 서버로부터 데이터를 가져와서 현재 로컬 브랜치와 서버의 추적 브랜치를 Merge 한다. ////////////////////////// Generally it's better to simply use the `fetch` and `merge` commands explicitly as the magic of `git pull` can often be confusing. ////////////////////////// -일반적으로 `fetch`와 `merge` 명령을 명시적으로 사용하는 것이 `pull` 명령으로 한번에 두 작업을 하는 것보다 낫다. +일반적으로 `fetch` 와 `merge` 명령을 명시적으로 사용하는 것이 `pull` 명령으로 한번에 두 작업을 하는 것보다 낫다. [[r_delete_branches]] ////////////////////////// @@ -409,7 +409,7 @@ If you want to delete your `serverfix` branch from the server, you run the follo ////////////////////////// 동료와 협업하기 위해 리모트 브랜치를 만들었다가 작업을 마치고 `master` 브랜치로 Merge 했다. 협업하는 데 사용했던 그 리모트 브랜치는 이제 더 이상 필요하지 않기에 삭제할 수 있다. `git push` 명령에 `--delete` 옵션을 사용하여 리모트 브랜치를 삭제할 수 있다. -`serverfix`라는 리모트 브랜치를 삭제하려면 아래와 같이 실행한다. +`serverfix` 라는 리모트 브랜치를 삭제하려면 아래와 같이 실행한다. [source,console] ---- diff --git a/book/03-git-branching/sections/workflows.asc b/book/03-git-branching/sections/workflows.asc index 14ccfa72..72270552 100644 --- a/book/03-git-branching/sections/workflows.asc +++ b/book/03-git-branching/sections/workflows.asc @@ -29,7 +29,7 @@ They have another parallel branch named `develop` or `next` that they work from It's used to pull in topic branches (short-lived branches, like your earlier `iss53` branch) when they're ready, to make sure they pass all the tests and don't introduce bugs. ////////////////////////// 이런 접근법에 따라서 Git 개발자가 많이 선호하는 워크플로가 하나 있다. 배포했거나 배포할 코드만 `master` 브랜치에 Merge 해서 안정 버전의 코드만 `master` 브랜치에 둔다. -개발을 진행하고 안정화하는 브랜치는 `develop`이나 `next`라는 이름으로 추가로 만들어 사용한다. 이 브랜치는 언젠가 안정 상태가 되겠지만, 항상 안정 상태를 유지해야 하는 것이 아니다. 테스트를 거쳐서 안정적이라고 판단되면 `master` 브랜치에 Merge 한다. +개발을 진행하고 안정화하는 브랜치는 `develop` 이나 `next` 라는 이름으로 추가로 만들어 사용한다. 이 브랜치는 언젠가 안정 상태가 되겠지만, 항상 안정 상태를 유지해야 하는 것이 아니다. 테스트를 거쳐서 안정적이라고 판단되면 `master` 브랜치에 Merge 한다. 토픽 브랜치(앞서 살펴본 `iss53` 브랜치 같은 짧은 호흡 브랜치)에도 적용할 수 있는데, 해당 토픽을 처리하고 테스트해서 버그도 없고 안정적이면 그때 Merge 한다. ////////////////////////// @@ -66,7 +66,7 @@ The idea is that your branches are at various levels of stability; when they rea Again, having multiple long-running branches isn't necessary, but it's often helpful, especially when you're dealing with very large or complex projects. ////////////////////////// 코드를 여러 단계로 나누어 안정성을 높여가며 운영할 수 있다. -프로젝트 규모가 크면 `proposed` 혹은 `pu`(proposed updates)라는 이름의 브랜치를 만들고 `next`나 `master` 브랜치에 아직 Merge 할 준비가 되지 않은 것을 일단 Merge 시킨다. +프로젝트 규모가 크면 `proposed` 혹은 `pu` (proposed updates)라는 이름의 브랜치를 만들고 `next` 나 `master` 브랜치에 아직 Merge 할 준비가 되지 않은 것을 일단 Merge 시킨다. 중요한 개념은 브랜치를 이용해 여러 단계에 걸쳐서 안정화해 나아가면서 충분히 안정화가 됐을 때 안정 브랜치로 Merge 한다는 점이다. 다시 말해서 Long-Running의 브랜치가 여러 개일 필요는 없지만 정말 유용하다는 점이다. 특히 규모가 크고 복잡한 프로젝트일수록 그 유용성이 반짝반짝 빛난다. @@ -94,7 +94,7 @@ You did a few commits on them and deleted them directly after merging them into This technique allows you to context-switch quickly and completely – because your work is separated into silos where all the changes in that branch have to do with that topic, it's easier to see what has happened during code review and such. You can keep the changes there for minutes, days, or months, and merge them in when they're ready, regardless of the order in which they were created or worked on. ////////////////////////// -앞서 사용한 `iss53`이나 `hotfix` 브랜치가 토픽 브랜치다. +앞서 사용한 `iss53` 이나 `hotfix` 브랜치가 토픽 브랜치다. 우리는 브랜치를 새로 만들고 어느 정도 커밋하고 나서 다시 `master` 브랜치에 Merge 하고 브랜치 삭제도 해 보았다. 보통 주제별로 브랜치를 만들고 각각은 독립돼 있기 때문에 매우 쉽게 컨텍스트 사이를 옮겨 다닐 수 있다. 묶음별로 나눠서 일하면 내용별로 검토하기에도, 테스트하기에도 더 편하다. 각 작업을 하루든 한 달이든 유지하다가 `master` 브랜치에 Merge 할 시점이 되면 순서에 관계없이 그때 Merge 하면 된다. @@ -126,8 +126,8 @@ Your history then looks like this: .History after merging `dumbidea` and `iss91v2` image::images/topic-branches-2.png[History after merging `dumbidea` and `iss91v2`.] ////////////////////////// -.`dumbidea`와 `iss91v2` 브랜치를 Merge 하고 난 후의 모습 -image::images/topic-branches-2.png[`dumbidea`와 `iss91v2` 브랜치를 Merge 하고 난 후의 모습] +.`dumbidea` 와 `iss91v2` 브랜치를 Merge 하고 난 후의 모습 +image::images/topic-branches-2.png[`dumbidea` 와 `iss91v2` 브랜치를 Merge 하고 난 후의 모습] ////////////////////////// We will go into more detail about the various possible workflows for your Git project in <>, so before you decide which branching scheme your next project will use, be sure to read that chapter. diff --git a/book/04-git-server/sections/git-daemon.asc b/book/04-git-server/sections/git-daemon.asc index 0580c42d..d6e5de83 100644 --- a/book/04-git-server/sections/git-daemon.asc +++ b/book/04-git-server/sections/git-daemon.asc @@ -36,7 +36,7 @@ $ git daemon --reuseaddr --base-path=/srv/git/ /srv/git/ `--reuseaddr` allows the server to restart without waiting for old connections to time out, the `--base-path` option allows people to clone projects without specifying the entire path, and the path at the end tells the Git daemon where to look for repositories to export. If you're running a firewall, you'll also need to punch a hole in it at port 9418 on the box you're setting this up on. ////////////////////////// -`--reuseaddr`는 서버가 기존의 연결이 타임아웃될 때까지 기다리지 말고 바로 재시작하게 하는 옵션이다. `--base-path` 옵션을 사용하면 사람들이 프로젝트를 Clone 할 때 전체 경로를 사용하지 않아도 된다. 그리고 마지막에 있는 경로는 노출할 저장소의 위치를 Git 데몬에 알려주는 것이다. +`--reuseaddr` 는 서버가 기존의 연결이 타임아웃될 때까지 기다리지 말고 바로 재시작하게 하는 옵션이다. `--base-path` 옵션을 사용하면 사람들이 프로젝트를 Clone 할 때 전체 경로를 사용하지 않아도 된다. 그리고 마지막에 있는 경로는 노출할 저장소의 위치를 Git 데몬에 알려주는 것이다. 마지막으로 방화벽을 사용하고 있으면 9418 포트를 열어서 지금 작업하는 서버의 숨통을 틔워주어야 한다. ////////////////////////// @@ -74,7 +74,7 @@ respawn For security reasons, it is strongly encouraged to have this daemon run as a user with read-only permissions to the repositories – you can easily do this by creating a new user 'git-ro' and running the daemon as them. For the sake of simplicity we'll simply run it as the same 'git' user that Gitosis is running as. ////////////////////////// -보안을 위해서 저장소를 읽을 수만 있는 사용자로 데몬을 실행시킬 것을 강력하게 권고한다. `git-ro`라는 계정을 새로 만들고 그 계정으로 데몬을 실행시키는 것이 좋다. +보안을 위해서 저장소를 읽을 수만 있는 사용자로 데몬을 실행시킬 것을 강력하게 권고한다. `git-ro` 라는 계정을 새로 만들고 그 계정으로 데몬을 실행시키는 것이 좋다. 하지만 여기에서는 쉽게 설명하려고 그냥 `git` 계정을 사용한다. ////////////////////////// diff --git a/book/04-git-server/sections/git-on-a-server.asc b/book/04-git-server/sections/git-on-a-server.asc index c26fd5b5..d24fc018 100644 --- a/book/04-git-server/sections/git-on-a-server.asc +++ b/book/04-git-server/sections/git-on-a-server.asc @@ -73,7 +73,7 @@ Let's say you've set up a server called `git.example.com` that you have SSH acce Assuming that `/srv/git` exists on that server, you can set up your new repository by copying your bare repository over: ////////////////////////// Bare 저장소는 이제 만들었으니까 서버에 넣고 프로토콜을 설정한다. -`git.example.com`라는 이름의 서버를 하나 준비하자. 그리고 그 서버에 SSH로 접속할 수 있게 만들고 Git 저장소를 `/srv/git` 디렉토리에 저장할 것이다. +`git.example.com` 라는 이름의 서버를 하나 준비하자. 그리고 그 서버에 SSH로 접속할 수 있게 만들고 Git 저장소를 `/srv/git` 디렉토리에 저장할 것이다. 서버에 `/srv/git` 디렉토리가 있다고 가정하고 아래와 같이 Bare 저장소를 복사한다. [source,console] @@ -172,7 +172,7 @@ You may not want to run `adduser` and set temporary passwords for every user. ////////////////////////// 팀원들이 접속할 수 있도록 하는 방법은 몇 가지가 있다. 첫째로 모두에게 계정을 만들어 주는 방법이 있다. 이 방법이 제일 단순하지만 다소 귀찮다. -팀원마다 `adduser`를 실행시키고 임시 암호를 부여해야 하기 때문에 보통 이 방법을 쓰고 싶어 하지 않는다. +팀원마다 `adduser` 를 실행시키고 임시 암호를 부여해야 하기 때문에 보통 이 방법을 쓰고 싶어 하지 않는다. ////////////////////////// A second method is to create a single 'git' user on the machine, ask every user who is to have write access to send you an SSH public key, and add that key to the `~/.ssh/authorized_keys` file of your new 'git' user. diff --git a/book/04-git-server/sections/gitlab.asc b/book/04-git-server/sections/gitlab.asc index bcc609b2..798dd3cb 100644 --- a/book/04-git-server/sections/gitlab.asc +++ b/book/04-git-server/sections/gitlab.asc @@ -64,7 +64,7 @@ Once logged in, click the ``Admin area'' icon in the menu at the top right. ////////////////////////// GitLab의 관리자 도구는 웹 페이지로 되어있다. 웹 브라우저로 GitLab이 설치된 곳의 주소에 들어가면 그냥 보인다. 그리고 관리자로 로그인하자. -기본 사용자이름은 `admin@local.host`, 암호는 `5iveL!fe`이다(이건 로그인 후에 바꿀 수 있다). +기본 사용자이름은 `admin@local.host`, 암호는 `5iveL!fe` 이다(이건 로그인 후에 바꿀 수 있다). 로그인하고 나서 메뉴 오른쪽 위에 있는 ``Admin area''를 클릭한다. [[rgitlab_menu]] @@ -211,7 +211,7 @@ For an existing local repository, this command will create a remote named `gitla 프로젝트가 만들어졌으면 로컬 Git 저장소랑 연결하자. HTTPS나 SSH 프로토콜을 이용해 프로젝트를 Git 리모트로 등록한다. 저장소 URL은 프로젝트 홈페이지 위 쪽에 있다. -아래와 같이 명령어를 이용해 로컬 저장소에 `gitlab`이라는 이름으로 리모트 저장소를 등록한다. +아래와 같이 명령어를 이용해 로컬 저장소에 `gitlab` 이라는 이름으로 리모트 저장소를 등록한다. [source,console] ---- @@ -258,7 +258,7 @@ This model allows the owner to be in full control of what goes into the reposito ////////////////////////// Merge 요청을 하도록 해서 통제권을 유지한 채로 협업하는 방법도 있다. 프로젝트에 접근할 수 있는 모든 사용자가 프로젝트에 기여할 수 있다. -사용자는 마음껏 브랜치를 만들고 커밋, Push 하고 나서 이 브랜치를 `master`나 다른 브랜치에 Merge 해달라고 요청한다. +사용자는 마음껏 브랜치를 만들고 커밋, Push 하고 나서 이 브랜치를 `master` 나 다른 브랜치에 Merge 해달라고 요청한다. Push 권한이 없는 사용자는 저장소를 ``fork''한 다음에 ``fork''한 _자신의 저장소_에 Push 한다. 그리고는 원래 저장소에 내 저장소에 있는 브랜치를 Merge 해달라고 요청하면 된다. 소유자는 이걸로 자신의 저장소에 대한 모든 통제 권한을 가진다. 어떤 데이터가 들어올 수 있는지 언제 들어오는지 소유자가 결정할 수 있다. diff --git a/book/04-git-server/sections/gitweb.asc b/book/04-git-server/sections/gitweb.asc index ddad47d5..c21551c2 100644 --- a/book/04-git-server/sections/gitweb.asc +++ b/book/04-git-server/sections/gitweb.asc @@ -25,10 +25,10 @@ On Linux machines, `lighttpd` is often installed, so you may be able to get it t If you're running a Mac, Leopard comes preinstalled with Ruby, so `webrick` may be your best bet. To start `instaweb` with a non-lighttpd handler, you can run it with the `--httpd` option.(((git commands, instaweb))) ////////////////////////// -Git은 GitWeb을 쉽게 사용해 볼 수 있도록 서버를 즉시 띄우는 명령을 제공한다. 시스템에 `lighttpd`나 `webrick` 같은 경량 웹 서버가 설치돼 있어야 이 명령을 사용할 수 있다. -Linux에서는 `lighttpd`를 많이 사용한다. `lighttpd`가 설치돼 있으면 프로젝트 디렉토리에서 그냥 `git instaweb`을 실행하면 바로 실행될 것이다. -Mac의 Leopard 버전은 Ruby가 미리 설치돼 있기 때문에 `webrick`이 더 나은 선택이다. -사용할 웹 서버가 `lighttpd`가 아니라면 아래와 같이 `--httpd` 옵션을 사용해야 한다.(((git commands, instaweb))) +Git은 GitWeb을 쉽게 사용해 볼 수 있도록 서버를 즉시 띄우는 명령을 제공한다. 시스템에 `lighttpd` 나 `webrick` 같은 경량 웹 서버가 설치돼 있어야 이 명령을 사용할 수 있다. +Linux에서는 `lighttpd` 를 많이 사용한다. `lighttpd` 가 설치돼 있으면 프로젝트 디렉토리에서 그냥 `git instaweb` 을 실행하면 바로 실행될 것이다. +Mac의 Leopard 버전은 Ruby가 미리 설치돼 있기 때문에 `webrick` 이 더 나은 선택이다. +사용할 웹 서버가 `lighttpd` 가 아니라면 아래와 같이 `--httpd` 옵션을 사용해야 한다.(((git commands, instaweb))) [source,console] ---- @@ -58,7 +58,7 @@ We'll walk though installing GitWeb manually very quickly. First, you need to get the Git source code, which GitWeb comes with, and generate the custom CGI script: ////////////////////////// 자신의 프로젝트에서 언제나 웹 인터페이스를 운영하려면 먼저 웹 서버에 이 CGI 스크립트를 설치해야 한다. -몇몇 리눅스 배포판에서는 `apt`나 `yum`으로 설치할 수 있게 `gitweb` 패키지를 제공한다. 그러니 패키지로 설치할 수 있는지 확인해 보는 것이 좋다. +몇몇 리눅스 배포판에서는 `apt` 나 `yum` 으로 설치할 수 있게 `gitweb` 패키지를 제공한다. 그러니 패키지로 설치할 수 있는지 확인해 보는 것이 좋다. 여기에서는 GitWeb을 수동으로 설치하는 방법을 간단히 살펴보자. 먼저 GitWeb이 포함된 Git 소스 코드를 구한 다음 아래의 CGI 스크립트를 빌드한다. @@ -103,4 +103,4 @@ Again, GitWeb can be served with any CGI or Perl capable web server; if you pref At this point, you should be able to visit `http://gitserver/` to view your repositories online. ////////////////////////// 다시 말해서 GitWeb은 CGI나 Perl을 지원하는 웹 서버라면 아무거나 사용할 수 있다. -이제 `http://gitserver/`에 접속하여 온라인으로 저장소를 확인할 수 있다. +이제 `http://gitserver/` 에 접속하여 온라인으로 저장소를 확인할 수 있다. diff --git a/book/04-git-server/sections/protocols.asc b/book/04-git-server/sections/protocols.asc index af6b00a4..b877a468 100644 --- a/book/04-git-server/sections/protocols.asc +++ b/book/04-git-server/sections/protocols.asc @@ -56,10 +56,10 @@ If you specify `file://`, Git fires up the processes that it normally uses to tr The main reason to specify the `file://` prefix is if you want a clean copy of the repository with extraneous references or objects left out – generally after an import from another version-control system or something similar (see <> for maintenance tasks). We'll use the normal path here because doing so is almost always faster. ////////////////////////// -Git은 파일 경로를 직접 쓸 때와 `file://`로 시작하는 URL을 사용할 때를 약간 다르게 처리한다. +Git은 파일 경로를 직접 쓸 때와 `file://` 로 시작하는 URL을 사용할 때를 약간 다르게 처리한다. 디렉토리 경로를 그대로 사용하면 Git은 필요한 파일을 직접 복사하거나 하드 링크를 사용한다. -하지만 `file://`로 시작하면 Git은 네트워크를 통해서 데이터를 전송할 때처럼 프로세스를 별도로 생성하여 처리한다. -이 프로세스로 데이터를 전송하는 것은 효율이 좀 떨어지지만 그래도 `file://`를 사용하는 이유가 있다. +하지만 `file://` 로 시작하면 Git은 네트워크를 통해서 데이터를 전송할 때처럼 프로세스를 별도로 생성하여 처리한다. +이 프로세스로 데이터를 전송하는 것은 효율이 좀 떨어지지만 그래도 `file://` 를 사용하는 이유가 있다. 이것은 외부 Refs나 개체들이 포함된 저장소의 복사본을 깨끗한 상태로 남겨두고자 함이다. 보통은 다른 버전 관리 시스템들에서 임포트한 후에 사용한다(9장에서 자세히 다룬다). 여기서는 속도가 빠른 디렉토리 경로를 사용한다. @@ -212,7 +212,7 @@ The `post-update` hook that comes with Git by default runs the appropriate comma This command is run when you push to this repository (over SSH perhaps); then, other people can clone via something like ////////////////////////// 다 됐다.(((hooks, post-update))) -`post-update` 훅은 Git에 포함되어 있으며 `git update-server-info`라는 명령어를 실행시킨다. 이 명령어를 써야 HTTP로 Fetch와 Clone 명령이 제대로 동작한다. +`post-update` 훅은 Git에 포함되어 있으며 `git update-server-info` 라는 명령어를 실행시킨다. 이 명령어를 써야 HTTP로 Fetch와 Clone 명령이 제대로 동작한다. 누군가 SSH를 통해서 저장소에 Push 하면 `post-update` 훅이 실행된다. 그럼 다른 사용자들은 Push 된 파일을 아래와 같이 Clone 할 수 있다. [source,console] @@ -224,7 +224,7 @@ $ git clone https://example.com/gitproject.git In this particular case, we're using the `/var/www/htdocs` path that is common for Apache setups, but you can use any static web server – just put the bare repository in its path. The Git data is served as basic static files (see <> for details about exactly how it's served). ////////////////////////// -여기서는 Apache 서버를 사용해서 기본 루트 디렉토리인 `/var/www/htdocs`를 사용하지만 다른 웹 서버를 사용해도 된다. 단순히 Bare 저장소를 HTTP 문서 루트에 넣으면 된다. +여기서는 Apache 서버를 사용해서 기본 루트 디렉토리인 `/var/www/htdocs` 를 사용하지만 다른 웹 서버를 사용해도 된다. 단순히 Bare 저장소를 HTTP 문서 루트에 넣으면 된다. Git 데이터는 일반적인 정적 파일처럼 취급된다( <> 에서 정확히 어떻게 처리하는지 다룬다). ////////////////////////// @@ -304,7 +304,7 @@ Git의 대표 프로토콜은 SSH이다. SSH를 이용하면 아무런 외부 ////////////////////////// To clone a Git repository over SSH, you can specify ssh:// URL like this: ////////////////////////// -SSH를 통해 Git 저장소를 Clone 하려면 `ssh://`로 시작하는 URL을 사용한다: +SSH를 통해 Git 저장소를 Clone 하려면 `ssh://` 로 시작하는 URL을 사용한다: [source,console] ---- @@ -410,7 +410,7 @@ Behind big corporate firewalls, this obscure port is commonly blocked. ////////////////////////// Git 프로토콜의 단점은 인증 메커니즘이 없다는 것이다. Git 프로토콜만으로 접근할 수 있는 프로젝트는 바람직하지 못하다. -일반적으로 SSH나 HTTPS 프로토콜과 함께 사용한다. 소수의 개발자만 Push 할 수 있고 대다수 사람은 `git://`을 사용하여 읽을 수만 있게 하는 것이다. +일반적으로 SSH나 HTTPS 프로토콜과 함께 사용한다. 소수의 개발자만 Push 할 수 있고 대다수 사람은 `git://` 을 사용하여 읽을 수만 있게 하는 것이다. 어쩌면 가장 설치하기 어려운 방법일 수도 있다. 별도의 데몬이 필요하고 프로젝트에 맞게 설정해야 한다. 자원을 아낄 수 있도록 xinetd 같은 것도 설정해야 하고 방화벽을 통과할 수 있도록 9418 포트도 열어야 한다. diff --git a/book/04-git-server/sections/setting-up-server.asc b/book/04-git-server/sections/setting-up-server.asc index 9dabaa65..f5d80827 100644 --- a/book/04-git-server/sections/setting-up-server.asc +++ b/book/04-git-server/sections/setting-up-server.asc @@ -59,7 +59,7 @@ $ cat /tmp/id_rsa.jessica.pub >> ~/.ssh/authorized_keys ////////////////////////// Now, you can set up an empty repository for them by running `git init` with the `--bare` option, which initializes the repository without a working directory:(((git commands, init, bare))) ////////////////////////// -`--bare` 옵션을 주고 `git init`를 실행해서 워킹 디렉토리가 없는 빈 저장소를 하나 만든다.(((git commands, init, bare))) +`--bare` 옵션을 주고 `git init` 를 실행해서 워킹 디렉토리가 없는 빈 저장소를 하나 만든다.(((git commands, init, bare))) [source,console] ---- @@ -78,8 +78,8 @@ If you're running it internally, and you set up DNS for `gitserver` to point to ////////////////////////// 이제 John, Josie, Jessica는 이 저장소를 리모트 저장소로 등록하고 나서 브랜치를 Push 할 수 있다. 프로젝트마다 적어도 한 명은 서버에 접속해서 Bare 저장소를 만들어야 한다. -git 계정과 저장소를 만든 서버의 호스트 이름이 `gitserver`라고 하자. -만약 이 서버가 내부망에 있고 `gitserver`가 그 서버를 가리키도록 DNS에 설정하면 아래와 같은 명령을 사용할 수 있다(`myproject` 프로젝트가 이미 있다고 가정한다). +git 계정과 저장소를 만든 서버의 호스트 이름이 `gitserver` 라고 하자. +만약 이 서버가 내부망에 있고 `gitserver` 가 그 서버를 가리키도록 DNS에 설정하면 아래와 같은 명령을 사용할 수 있다(`myproject` 프로젝트가 이미 있다고 가정한다). [source,console] ---- @@ -124,10 +124,10 @@ If you set this as your 'git' user's login shell, then the 'git' user can't have To use this, specify `git-shell` instead of bash or csh for your user's login shell. To do so, you must first add `git-shell` to `/etc/shells` if it's not already there: ////////////////////////// -단순히 로그인 셸을 `git-shell`로 바꾸기만 하면 _git_ 계정으로는 git만 사용할 수 있다. +단순히 로그인 셸을 `git-shell` 로 바꾸기만 하면 _git_ 계정으로는 git만 사용할 수 있다. 이 로그인 셸은 서버의 다른 부분은 건들 수 없도록 돼있다. -`git-shell`을 사용자의 로그인 셸로 지정해야 한다. -`/etc/shells`에 `git-shell`를 추가한다. 아래를 보자. +`git-shell` 을 사용자의 로그인 셸로 지정해야 한다. +`/etc/shells` 에 `git-shell` 를 추가한다. 아래를 보자. [source,console] ////////////////////////// @@ -138,7 +138,7 @@ $ sudo vim /etc/shells # and add the path to git-shell from last command ---- ////////////////////////// ---- -$ cat /etc/shells # 이미 `git-shell`이 등록돼 있는지 확인 +$ cat /etc/shells # 이미 `git-shell` 이 등록돼 있는지 확인 $ which git-shell # git-shell 실행파일이 설치돼 있는지 확인 $ sudo vim /etc/shells # 바로 위 명령으로 확인한 git-shell 실행파일의 절대경로를 추가 ---- @@ -180,6 +180,6 @@ For instance, you can restrict the Git commands that the server will accept or y Run `git help shell` for more information on customizing the shell.(((git commands, help))) ////////////////////////// 이제 Git은 제대로 동작하면서 개발자들이 셸을 얻지 못하게 되었다. -위의 출력에서 볼 수 있듯이 _git_ 계정의 홈 디렉토리에 `git-shell-commands` 디렉토리를 만들어 `git-shell`의 동작을 조금 바꿀 수 있다. +위의 출력에서 볼 수 있듯이 _git_ 계정의 홈 디렉토리에 `git-shell-commands` 디렉토리를 만들어 `git-shell` 의 동작을 조금 바꿀 수 있다. 예를 들면 서버에서 사용할 수 있는 Git 명령어를 제한할 수 있다. 또 명령어를 실행했을 때 나오는 메시지도 변경 할 수 있다. `git help shell` 명령어를 실행하면 Git 셸을 꾸미는 데에 필요한 정보를 얻을 수 있다. (((git commands, help))) diff --git a/book/04-git-server/sections/smart-http.asc b/book/04-git-server/sections/smart-http.asc index 9372fcff..98563a83 100644 --- a/book/04-git-server/sections/smart-http.asc +++ b/book/04-git-server/sections/smart-http.asc @@ -12,7 +12,7 @@ If the CGI sees that the client is smart, it will communicate smartly with it, o ////////////////////////// 지금까지 인증 기능을 갖춘 SSH와 인증 기능이 없는 git 프로토콜을 배웠다. 이제는 이 두 기능을 한꺼번에 가진 프로토콜을 알아보자. 서버에서 `git-http-backend` 명령어를 이용해 일단 기본적인 스마트 HTTP를 지원하는 Git 서버를 실행한다.((git commands, "http-backend")) -Git 클라이언트에서 `git fetch`나 `git push`를 실행하면 서버로 HTTP 요청을 보낸다. 서버는 그 요청을 보고 경로와 헤더를 읽어 클라이언트가 HTTP로 통신하려 하는지 감지한다. 이는 1.6.6 버전 이상의 클라이언트에서 동작한다. +Git 클라이언트에서 `git fetch` 나 `git push` 를 실행하면 서버로 HTTP 요청을 보낸다. 서버는 그 요청을 보고 경로와 헤더를 읽어 클라이언트가 HTTP로 통신하려 하는지 감지한다. 이는 1.6.6 버전 이상의 클라이언트에서 동작한다. 서버는 클라이언트가 스마트 HTTP 프로토콜을 지원한다고 판단되면 스마트 HTTP 프로토콜을 사용하고 아니면 멍청한 프로토콜을 계속 사용한다. 덕분에 하위 호환성이 잘 유지된다. ////////////////////////// @@ -31,12 +31,12 @@ $ a2enmod cgi alias env rewrite ////////////////////////// This also enables the `mod_cgi`, `mod_alias`, `mod_env`, and `mod_rewrite` modules, which are all needed for this to work properly. ////////////////////////// -이 명령어 한 방이면 `mod_cgi`, `mod_alias`, `mod_env`, `mod_rewrite`도 사용할 수 있다. 다 앞으로 사용할 모듈들이다. +이 명령어 한 방이면 `mod_cgi`, `mod_alias`, `mod_env`, `mod_rewrite` 도 사용할 수 있다. 다 앞으로 사용할 모듈들이다. ////////////////////////// You’ll also need to set the Unix user group of the `/opt/git` directories to `www-data` so your web server can read- and write-access the repositories, because the Apache instance running the CGI script will (by default) be running as that user: ////////////////////////// -`/srv/git` 디렉토리의 Unix 사용자 그룹도 `www-data`로 설정해야 한다. 그래야 웹 서버가 저장소를 읽고 쓸 수 있다. Apache 인스턴스는 CGI 스크립트를 이 사용자로 실행시킨다(기본 설정이다). +`/srv/git` 디렉토리의 Unix 사용자 그룹도 `www-data` 로 설정해야 한다. 그래야 웹 서버가 저장소를 읽고 쓸 수 있다. Apache 인스턴스는 CGI 스크립트를 이 사용자로 실행시킨다(기본 설정이다). [source,console] ---- @@ -46,7 +46,7 @@ $ chgrp -R www-data /srv/git ////////////////////////// Next we need to add some things to the Apache configuration to run the `git http-backend` as the handler for anything coming into the `/git` path of your web server. ////////////////////////// -그리고 Apache 설정 파일을 수정한다. 그러면 `git http-backend`를 실행했을 때 모든 요청을 `/git` 경로로 받을 수 있다. +그리고 Apache 설정 파일을 수정한다. 그러면 `git http-backend` 를 실행했을 때 모든 요청을 `/git` 경로로 받을 수 있다. [source,console] ---- @@ -63,7 +63,7 @@ If you leave out `GIT_HTTP_EXPORT_ALL` environment variable, then Git will only ////////////////////////// Finally you'll want to tell Apache to allow requests to `git-http-backend` and make writes be authenticated somehow, possibly with an Auth block like this: ////////////////////////// -마지막으로 Apache가 `git-http-backend`에 요청하는 것을 허용하고 쓰기 접근 시 인증하게 한다. +마지막으로 Apache가 `git-http-backend` 에 요청하는 것을 허용하고 쓰기 접근 시 인증하게 한다. [source,console] ---- @@ -111,7 +111,7 @@ It does not implement any authentication itself, but that can easily be controll You can do this with nearly any CGI-capable web server, so go with the one that you know best. ////////////////////////// 웹 서버는 Apache 말고도 다른 서버를 사용할 수도 있고, 인증 방식도 다르므로 Apache 설정에 대해서 길게 이야기하지 않는다. -대신 이것만 알아두었으면 한다. HTTP를 이용한 모든 통신에서는 `git http-backend`와 Git을 함께 사용한다는 것이다. +대신 이것만 알아두었으면 한다. HTTP를 이용한 모든 통신에서는 `git http-backend` 와 Git을 함께 사용한다는 것이다. Git 그 자체로는 인증 기능을 가지고 있지 않다. 하지만 웹 서버의 인증 레이어와 손쉽게 연동할 수 있다. CGI를 실행할 수 있는 웹 서버라면 어떤 서버든지 붙일 수 있다. 가장 좋아하는 서버를 사용하길 바란다. diff --git a/book/05-distributed-git/sections/contributing.asc b/book/05-distributed-git/sections/contributing.asc index 415cbc53..7106a8ae 100644 --- a/book/05-distributed-git/sections/contributing.asc +++ b/book/05-distributed-git/sections/contributing.asc @@ -93,8 +93,8 @@ Git은 공백문자를 검사해볼 수 있는 간단한 명령을 제공한다. .Output of `git diff -check`. image::images/git-diff-check.png[Output of `git diff -check`.] ////////////////////////// -.`git diff --check`의 결과. -image::images/git-diff-check.png[`git diff --check`의 결과.] +.`git diff --check` 의 결과. +image::images/git-diff-check.png[`git diff --check` 의 결과.] ////////////////////////// If you run that command before committing, you can tell if you're about to commit whitespace issues that may annoy other developers. @@ -646,11 +646,11 @@ image::images/managed-team-1.png[Jessica의 저장소.] ////////////////////////// She's ready to push up her work, but gets an email from Josie that a branch with some initial work on it was already pushed to the server as `featureBee`. Jessica first needs to merge those changes in with her own before she can push to the server. -She can then fetch Josie's changes down with `git fetch`: +She can then fetch Josie's changes down with `git fetch` : ////////////////////////// 작업을 마치고 Push 하려고 하는데 Jesie가 이미 일부 작업을 하고 서버에 `featureBee` 브랜치로 Push 했다는 이메일을 보내왔다. Jessica는 Jesie의 작업을 먼저 Merge 해야만 Push 할 수 있다. -Merge 하기 위해서 우선 `git fetch`로 Fetch 한다. +Merge 하기 위해서 우선 `git fetch` 로 Fetch 한다. [source,console] ---- @@ -661,7 +661,7 @@ From jessica@githost:simplegit ---- ////////////////////////// -Jessica can now merge this into the work she did with `git merge`: +Jessica can now merge this into the work she did with `git merge` : ////////////////////////// Fetch 해 온 브랜치를 `git merge` 명령으로 Merge 한다. @@ -703,7 +703,7 @@ Next, John emails Jessica to say he's pushed some changes to the `featureA` bran She runs a `git fetch` to pull down those changes: ////////////////////////// John이 몇 가지 작업을 하고 나서 `featureA` 에 Push 했고 확인해 달라는 내용의 이메일을 보내왔다. -Jessica는 `git fetch`로 Push 한 작업을 Fetch 한다. +Jessica는 `git fetch` 로 Push 한 작업을 Fetch 한다. [source,console] ---- @@ -714,7 +714,7 @@ From jessica@githost:simplegit ---- ////////////////////////// -Then, she can see what has been changed with `git log`: +Then, she can see what has been changed with `git log` : ////////////////////////// 어떤 것이 업데이트됐는지 `git log` 명령으로 확인한다. @@ -776,7 +776,7 @@ image::images/managed-team-2.png[마지막 Push 하고 난 후의 Jessica의 저 Jessica, Josie, and John inform the integrators that the `featureA` and `featureBee` branches on the server are ready for integration into the mainline. After the integrators merge these branches into the mainline, a fetch will bring down the new merge commit, making the history look like this: ////////////////////////// -그럼 `featureA`와 `featureBee` 브랜치가 프로젝트의 메인 브랜치로 Merge 할 준비가 되었다고 Integration-Manager에게 알려준다. +그럼 `featureA` 와 `featureBee` 브랜치가 프로젝트의 메인 브랜치로 Merge 할 준비가 되었다고 Integration-Manager에게 알려준다. Integration-Manager가 두 브랜치를 모두 Merge 하고 난 후에 메인 브랜치를 Fetch 하면 아래와 같은 모양이 된다. ////////////////////////// @@ -852,7 +852,7 @@ You may want to use `rebase -i` to squash your work down to a single commit, or ////////////////////////// When your branch work is finished and you're ready to contribute it back to the maintainers, go to the original project page and click the ``Fork'' button, creating your own writable fork of the project. -You then need to add in this new repository URL as a second remote, in this case named `myfork`: +You then need to add in this new repository URL as a second remote, in this case named `myfork` : ////////////////////////// 일단 프로젝트의 웹사이트로 가서 ``Fork'' 버튼을 누르면 원래 프로젝트 저장소에서 갈라져 나온, 쓰기 권한이 있는 저장소가 하나 만들어진다. 그러면 로컬에서 수정한 커밋을 원래 저장소에 Push 할 수 있다. 그 저장소를 로컬 저장소의 리모트 저장소로 등록한다. 예를 들어 myfork로 등록한다. @@ -922,7 +922,7 @@ On a project for which you're not the maintainer, it's generally easier to have Having work themes isolated into topic branches also makes it easier for you to rebase your work if the tip of the main repository has moved in the meantime and your commits no longer apply cleanly. For example, if you want to submit a second topic of work to the project, don't continue working on the topic branch you just pushed up – start over from the main repository's `master` branch: ////////////////////////// -프로젝트 관리자가 아니라고 해도 보통 `origin/master`를 추적하는 `master` 브랜치는 가지고 있다. 그래도 토픽 브랜치를 만들고 일을 하면 관리자가 수정 내용을 거부할 때 쉽게 버릴 수 있다. +프로젝트 관리자가 아니라고 해도 보통 `origin/master` 를 추적하는 `master` 브랜치는 가지고 있다. 그래도 토픽 브랜치를 만들고 일을 하면 관리자가 수정 내용을 거부할 때 쉽게 버릴 수 있다. 토픽 브랜치를 만들어서 주제별로 독립적으로 일을 하는 동안에도 주 저장소의 `master` 브랜치는 계속 수정된다. 하지만 주 저장소의 브랜치의 최근 커밋 이후로 Rebase 하면 깨끗하게 Merge 할 수 있다. 그리고 다른 주제의 일을 하려고 할 때는 앞서 Push 한 토픽 브랜치에서 시작하지 말고 주 저장소의 `master` 브랜치로부터 만들어야 한다. @@ -954,7 +954,7 @@ Let's say the project maintainer has pulled in a bunch of other patches and trie In this case, you can try to rebase that branch on top of `origin/master`, resolve the conflicts for the maintainer, and then resubmit your changes: ////////////////////////// 프로젝트 관리자가 사람들의 수정 사항을 Merge 하고 나서 Jessica의 브랜치를 Merge 하려고 할 때 충돌이 날 수도 있다. -그러면 Jessica가 자신의 브랜치를 `origin/master`에 Rebase 해서 충돌을 해결하고 다시 Pull Request을 보낸다. +그러면 Jessica가 자신의 브랜치를 `origin/master` 에 Rebase 해서 충돌을 해결하고 다시 Pull Request을 보낸다. [source,console] ---- @@ -990,7 +990,7 @@ You start a new branch based off the current `origin/master` branch, squash the ////////////////////////// 또 다른 시나리오를 하나 더 살펴보자. 프로젝트 관리자는 `featureB` 브랜치의 내용은 좋지만, 상세 구현은 다르게 하고 싶다. 관리자는 `featureB` 담당자에게 상세 구현을 다르게 해달라고 요청한다. `featureB` 담당자는 하는 김에 `featureB` 브랜치를 프로젝트의 최신 `master` 브랜치 기반으로 옮긴다. -먼저 `origin/master` 브랜치에서 `featureBv2` 브랜치를 새로 하나 만들고, `featureB`의 커밋들을 모두 Squash 해서 Merge 하고, 만약 충돌이 나면 해결하고, 상세 구현을 수정하고, 새 브랜치를 Push 한다. +먼저 `origin/master` 브랜치에서 `featureBv2` 브랜치를 새로 하나 만들고, `featureB` 의 커밋들을 모두 Squash 해서 Merge 하고, 만약 충돌이 나면 해결하고, 상세 구현을 수정하고, 새 브랜치를 Push 한다. (((git commands, merge, squash))) [source,console] @@ -1118,7 +1118,7 @@ You can also edit these patch files to add more information for the email list t If you add text between the `---` line and the beginning of the patch (the `diff --git` line), then developers can read it; but applying the patch excludes it. ////////////////////////// 메일링리스트에 이메일을 보내기 전에 각 Patch 파일을 손으로 고칠 수 있다. -`---` 라인과 Patch가 시작되는 라인(`diff --git`로 시작하는 라인) 사이에 내용을 추가하면 다른 개발자는 읽을 수 있지만, 나중에 Patch에 적용되지는 않는다. +`---` 라인과 Patch가 시작되는 라인(`diff --git` 로 시작하는 라인) 사이에 내용을 추가하면 다른 개발자는 읽을 수 있지만, 나중에 Patch에 적용되지는 않는다. ////////////////////////// To email this to a mailing list, you can either paste the file into your email program or send it via a command-line program. @@ -1154,7 +1154,7 @@ You can set each value separately with a series of `git config` commands, or you If your IMAP server doesn't use SSL, the last two lines probably aren't necessary, and the host value will be `imap://` instead of `imaps://`. When that is set up, you can use `git imap-send` to place the patch series in the Drafts folder of the specified IMAP server: ////////////////////////// -IMAP 서버가 SSL을 사용하지 않으면 마지막 두 라인은 필요 없고 host에서 `imaps://` 대신 `imap://`로 한다. +IMAP 서버가 SSL을 사용하지 않으면 마지막 두 라인은 필요 없고 host에서 `imaps://` 대신 `imap://` 로 한다. 이렇게 설정하면 `git imap-send` 명령으로 Patch 파일을 IMAP 서버의 Draft 폴더에 이메일로 보낼 수 있다. [source,console] diff --git a/book/05-distributed-git/sections/maintaining.asc b/book/05-distributed-git/sections/maintaining.asc index 478bada2..474e575c 100644 --- a/book/05-distributed-git/sections/maintaining.asc +++ b/book/05-distributed-git/sections/maintaining.asc @@ -75,8 +75,8 @@ Patch를 적용하는 방법은 `git apply` 명령을 사용하는 것과 `git a If you received the patch from someone who generated it with the `git diff` or a Unix `diff` command (which is not recommended; see the next section), you can apply it with the `git apply` command. Assuming you saved the patch at `/tmp/patch-ruby-client.patch`, you can apply the patch like this: ////////////////////////// -`git diff`나 Unix의 `diff` 명령(다음 절에서 다루겠지만 추천하지 않는 방법)으로 만든 Patch 파일을 적용할 때는 `git apply` 명령을 사용한다. -Patch 파일이 `/tmp/patch-ruby-client.patch`라고 하면 아래와 같은 명령으로 Patch를 적용할 수 있다. +`git diff` 나 Unix의 `diff` 명령(다음 절에서 다루겠지만 추천하지 않는 방법)으로 만든 Patch 파일을 적용할 때는 `git apply` 명령을 사용한다. +Patch 파일이 `/tmp/patch-ruby-client.patch` 라고 하면 아래와 같은 명령으로 Patch를 적용할 수 있다. [source,console] ---- @@ -93,10 +93,10 @@ It won't create a commit for you – after running it, you must stage and commit ////////////////////////// 위 명령을 실행하면 Patch 파일 내용에 따라 현재 디렉토리의 파일들을 변경한다. 위 명령은 `patch -p1` 명령과 거의 같다. 하지만, 이 명령이 `patch` 명령보다 훨씬 더 꼼꼼하게 비교한다. -`git diff`로 생성한 Patch 파일에 파일을 추가하거나, 파일을 삭제하고, 파일의 이름을 변경하는 내용이 들어 있으면 그대로 적용된다. 이런 것은 `patch` 명령으로 할 수 없다. -그리고 `git apply`는 ``모두 적용, 아니면 모두 취소'' 모델을 사용하기 때문에 Patch를 적용하는 데 실패하면 Patch를 적용하기 이전 상태로 전부 되돌려 놓는다. +`git diff` 로 생성한 Patch 파일에 파일을 추가하거나, 파일을 삭제하고, 파일의 이름을 변경하는 내용이 들어 있으면 그대로 적용된다. 이런 것은 `patch` 명령으로 할 수 없다. +그리고 `git apply` 는 ``모두 적용, 아니면 모두 취소'' 모델을 사용하기 때문에 Patch를 적용하는 데 실패하면 Patch를 적용하기 이전 상태로 전부 되돌려 놓는다. `patch` 명령은 여러 파일에 적용하다가 중간에 실패하면 거기서 그대로 중단하기 때문에 깔끔하지 못하다. -`git apply`는 `patch` 명령보다 훨씬 보수적이다. 이 명령은 자동으로 커밋해 주지 않기 때문에 변경된 파일을 직접 Staging Area에 추가하고 커밋해야 한다. +`git apply` 는 `patch` 명령보다 훨씬 보수적이다. 이 명령은 자동으로 커밋해 주지 않기 때문에 변경된 파일을 직접 Staging Area에 추가하고 커밋해야 한다. ////////////////////////// You can also use `git apply` to see if a patch applies cleanly before you try actually applying it – you can run `git apply --check` with the patch: @@ -131,15 +131,15 @@ You should only have to use `git apply` for legacy patches and things like that. ////////////////////////// 프로젝트 기여자가 Git의 format-patch 명령을 잘 사용하면 관리자의 작업은 훨씬 쉬워진다. format-patch 명령으로 만든 Patch 파일은 기여자의 정보와 커밋 정보가 포함되어 있기 때문이다. 그래서 기여자가 diff보다 format-patch를 사용하도록 권해야 한다. -`git apply`는 기존 Patch 파일에만 사용한다. +`git apply` 는 기존 Patch 파일에만 사용한다. ////////////////////////// To apply a patch generated by `format-patch`, you use `git am` (the command is named `am` as it is used to "apply a series of patches from a mailbox"). Technically, `git am` is built to read an mbox file, which is a simple, plain-text format for storing one or more email messages in one text file. It looks something like this: ////////////////////////// -`format-patch` 명령으로 생성한 Patch 파일은 `git am` 명령으로 적용한다(`am`은 "apply a series of patches from a mailbox"의 약자다). -`git am`은 mbox 파일을 읽어 그 안에 이메일 메시지가 한 개가 있든 여러 개가 있든 처리할 수 있다. +`format-patch` 명령으로 생성한 Patch 파일은 `git am` 명령으로 적용한다(`am` 은 "apply a series of patches from a mailbox"의 약자다). +`git am` 은 mbox 파일을 읽어 그 안에 이메일 메시지가 한 개가 있든 여러 개가 있든 처리할 수 있다. mbox 파일은 간단한 텍스트 파일이고 그 내용은 아래와 같다. [source,console] @@ -160,7 +160,7 @@ If you run a mail client that can save several emails out in mbox format, you ca ////////////////////////// 이 내용은 `format-patch` 명령으로 생성한 파일의 앞부분이다. 이 파일은 mbox 형식이다. -받은 메일이 `git send-email`로 만든 메일이라면 mbox 형식으로 저장하고 이 mbox 파일을 `git am` 명령으로 적용한다. +받은 메일이 `git send-email` 로 만든 메일이라면 mbox 형식으로 저장하고 이 mbox 파일을 `git am` 명령으로 적용한다. 사용하는 메일 클라이언트가 여러 이메일을 mbox 파일 하나로 저장할 수 있다면 메일 여러 개를 한 번에 Patch 할 수 있다. ////////////////////////// @@ -180,7 +180,7 @@ The author information is taken from the email's `From` and `Date` headers, and For example, if this patch was applied from the mbox example above, the commit generated would look something like this: ////////////////////////// Patch가 성공하면 자동으로 새로운 커밋이 하나 만들어진다. -이메일의 `From`과 `Date`에서 저자 정보가, 이메일의 제목과 메시지에서 커밋 메시지가 추출돼 사용된다. +이메일의 `From` 과 `Date` 에서 저자 정보가, 이메일의 제목과 메시지에서 커밋 메시지가 추출돼 사용된다. 예를 들어 위의 mbox 예제 파일을 적용해서 생성되는 커밋은 아래와 같다. [source,console] @@ -578,9 +578,9 @@ At this point, the topics are evaluated to determine whether they're safe and re If they're safe, they're merged into `next`, and that branch is pushed up so everyone can try the topics integrated together. ////////////////////////// Git을 개발하는 프로젝트는 Long-Running의 브랜치를 4개 운영한다. -각 브랜치 이름은 `master`, `next`, `pu` (Proposed Updates), `maint` 이다. `maint`는 마지막으로 릴리즈한 버전을 지원하는 브랜치다. +각 브랜치 이름은 `master`, `next`, `pu` (Proposed Updates), `maint` 이다. `maint` 는 마지막으로 릴리즈한 버전을 지원하는 브랜치다. 기여자가 새로운 기능을 제안하면 관리자는 <> 처럼 자신의 저장소에 토픽 브랜치를 만들어 관리한다. -그리고 토픽에 부족한 점은 없는지, 안정적인지 계속 테스트한다. 안정화되면 `next`로 Merge 하고 저장소에 Push 한다. 그러면 모두가 잘 통합됐는지 확인할 수 있다. +그리고 토픽에 부족한 점은 없는지, 안정적인지 계속 테스트한다. 안정화되면 `next` 로 Merge 하고 저장소에 Push 한다. 그러면 모두가 잘 통합됐는지 확인할 수 있다. [[rmerwf_f]] ////////////////////////// @@ -596,10 +596,10 @@ When it's determined that they're totally stable, the topics are re-merged into The `next` and `pu` branches are then rebuilt from the `master`. This means `master` almost always moves forward, `next` is rebased occasionally, and `pu` is rebased even more often: ////////////////////////// -토픽 브랜치가 좀 더 개선돼야 하면 `next`가 아니라 `pu`에 Merge 한다. +토픽 브랜치가 좀 더 개선돼야 하면 `next` 가 아니라 `pu` 에 Merge 한다. 충분히 검증을 했을 때에만 `master` 브랜치로 Merge 한다. `master` 브랜치에 Merge하고 나면 `next` 브랜치와 `pu` 브랜치는 `master` 브랜치를 기반으로 다시 만든다. -즉 `next` 브랜치는 정말 가끔 Rebase 하고 `pu`는 자주 Rebase 하지만 `master`는 항상 Fast-forward 한다. +즉 `next` 브랜치는 정말 가끔 Rebase 하고 `pu` 는 자주 Rebase 하지만 `master` 는 항상 Fast-forward 한다. ////////////////////////// .Merging contributed topic branches into long-term integration branches. @@ -761,7 +761,7 @@ user: "Scott Chacon " ////////////////////////// If you do sign your tags, you may have the problem of distributing the public PGP key used to sign your tags. The maintainer of the Git project has solved this issue by including their public key as a blob in the repository and then adding a tag that points directly to that content. -To do this, you can figure out which key you want by running `gpg --list-keys`: +To do this, you can figure out which key you want by running `gpg --list-keys` : ////////////////////////// 태그에 서명하면 서명에 사용한 PGP 공개키도 배포해야 한다. Git 개발 프로젝트는 관리자의 PGP 공개키를 Blob 형식으로 Git 저장소에 함께 배포한다. 이 Blob 파일을 사용하여 태그에 서명했다. @@ -780,7 +780,7 @@ sub 2048g/45D02282 2009-02-09 [expires: 2010-02-09] ////////////////////////// Then, you can directly import the key into the Git database by exporting it and piping that through `git hash-object`, which writes a new blob with those contents into Git and gives you back the SHA-1 of the blob: ////////////////////////// -`git hash-object`라는 명령으로 공개키를 바로 Git 저장소에 넣을 수 있다. 이 명령은 Git 저장소 안에 Blob 형식으로 공개키를 저장해주고 그 Blob의 SHA-1 값을 알려준다. +`git hash-object` 라는 명령으로 공개키를 바로 Git 저장소에 넣을 수 있다. 이 명령은 Git 저장소 안에 Blob 형식으로 공개키를 저장해주고 그 Blob의 SHA-1 값을 알려준다. [source,console] ---- @@ -851,7 +851,7 @@ The `git describe` command favors annotated tags (tags created with the `-a` or You can also use this string as the target of a checkout or show command, although it relies on the abbreviated SHA-1 value at the end, so it may not be valid forever. For instance, the Linux kernel recently jumped from 8 to 10 characters to ensure SHA-1 object uniqueness, so older `git describe` output names were invalidated. ////////////////////////// -`git describe` 명령은 `-a`나 `-s` 옵션을 주고 만든 Annotated 태그가 필요하다. 릴리즈 태그는 `git describe` 명령으로 만드니까 꼭 이름이 적당한지 사전에 확인해야 한다. +`git describe` 명령은 `-a` 나 `-s` 옵션을 주고 만든 Annotated 태그가 필요하다. 릴리즈 태그는 `git describe` 명령으로 만드니까 꼭 이름이 적당한지 사전에 확인해야 한다. 그리고 이 값은 checkout이나 show 명령에도 사용할 수 있지만, 전적으로 이름 뒤에 붙은 SHA-1 값을 사용한다. 그래서 이 값으로는 해당 커밋을 못 찾을 수도 있다. 최근 Linux 커널은 충돌 때문에 축약된 SHA-1가 8자에서 10자로 늘어났다. 이제는 8자일 때 생성한 값은 사용할 수 없다. @@ -865,7 +865,7 @@ For instance, the Linux kernel recently jumped from 8 to 10 characters to ensure ////////////////////////// Now you want to release a build. One of the things you'll want to do is create an archive of the latest snapshot of your code for those poor souls who don't use Git. -The command to do this is `git archive`: +The command to do this is `git archive` : ////////////////////////// 배포할 릴리즈 버전이 준비되었다. 먼저 Git을 사용하지 않는 사람을 위해 소스코드 스냅샷을 압축한다. @@ -880,7 +880,7 @@ v1.6.2-rc1-20-g8c5b85c.tar.gz ////////////////////////// If someone opens that tarball, they get the latest snapshot of your project under a project directory. -You can also create a zip archive in much the same way, but by passing the `--format=zip` option to `git archive`: +You can also create a zip archive in much the same way, but by passing the `--format=zip` option to `git archive` : ////////////////////////// 이 압축 파일을 풀면 프로젝트의 가장 마지막 스냅샷이 나온다. ZIP 형식으로 압축 파일을 만들려면 `--format=zip` 옵션을 사용한다. diff --git a/book/06-github/sections/1-setting-up-account.asc b/book/06-github/sections/1-setting-up-account.asc index 22c83e0a..087fb1aa 100644 --- a/book/06-github/sections/1-setting-up-account.asc +++ b/book/06-github/sections/1-setting-up-account.asc @@ -88,7 +88,7 @@ image::images/ssh-keys.png[The ``SSH keys'' link.] image::images/ssh-keys.png[``SSH keys'' 링크.] ////////////////////////// -From there, click the "`Add an SSH key`" button, give your key a name, paste the contents of your `~/.ssh/id_rsa.pub` (or whatever you named it) public-key file into the text area, and click ``Add key''. +From there, click the "`Add an SSH key` " button, give your key a name, paste the contents of your `~/.ssh/id_rsa.pub` (or whatever you named it) public-key file into the text area, and click ``Add key''. ////////////////////////// 여기서 ``Add an SSH key'' 버튼을 클릭한다. 키 이름을 적당히 입력하고 `~/.ssh/id_rsa.pub` 파일의 내용을 입력 칸에 복사해 넣는다. 그리고 ``Add key'' 버튼을 클릭한다. diff --git a/book/06-github/sections/2-contributing.asc b/book/06-github/sections/2-contributing.asc index d5ce4298..23c4af39 100644 --- a/book/06-github/sections/2-contributing.asc +++ b/book/06-github/sections/2-contributing.asc @@ -87,7 +87,7 @@ Here's how it generally works: ////////////////////////// 보통은 아래와 같이 일한다. -1. `master`에서 토픽 브랜치를 만든다. +1. `master` 에서 토픽 브랜치를 만든다. 2. 뭔가 수정해서 커밋한다. 3. 자신의 GitHub 프로젝트에 브랜치를 Push 한다. 4. GitHub에 Pull Request를 연다. @@ -134,7 +134,7 @@ Our user name here is ``tonychacon'' so our copy of this project is at `https:// We will clone it locally, create a topic branch, make the code change and finally push that change back up to GitHub. ////////////////////////// 앞서 설명했던 것처럼 'Fork' 버튼을 클릭해서 프로젝트를 복사한다. -사용자 이름이 ``tonychacon''이라면 `https://github.com/tonychacon/blink`에 프로젝트가 복사된다. 이 프로젝트는 본인 프로젝트이고 수정할 수 있다. +사용자 이름이 ``tonychacon''이라면 `https://github.com/tonychacon/blink` 에 프로젝트가 복사된다. 이 프로젝트는 본인 프로젝트이고 수정할 수 있다. 이 프로젝트를 로컬에 Clone 해서 토픽 브랜치를 만들고 코드를 수정하고 나서 GitHub에 다시 Push 한다. [source,shell] diff --git a/book/06-github/sections/3-maintaining.asc b/book/06-github/sections/3-maintaining.asc index a8971b9e..1c0a04b9 100644 --- a/book/06-github/sections/3-maintaining.asc +++ b/book/06-github/sections/3-maintaining.asc @@ -102,7 +102,7 @@ Ben과 Jeff, Louise라는 동료가 있는데 그들이 내 저장소에 Push ////////////////////////// Click the ``Settings'' link at the bottom of the right-hand sidebar. ////////////////////////// -오른쪽 밑에 있는 ``Settings`` 링크를 클릭한다. +오른쪽 밑에 있는 ``Settings` ` 링크를 클릭한다. ////////////////////////// .The repository settings link. @@ -196,7 +196,7 @@ Pull Request로 직접 Merge 해도 된다. The other interesting URLs are the `.diff` and `.patch` URLs, which as you may guess, provide unified diff and patch versions of the Pull Request. You could technically merge in the Pull Request work with something like this: ////////////////////////// -그리고 눈치챘을 테지만 `.diff`와 `.patch` URL은 Pull Request의 'Unified Diff'와 Patch 버전의 URL이다. +그리고 눈치챘을 테지만 `.diff` 와 `.patch` URL은 Pull Request의 'Unified Diff'와 Patch 버전의 URL이다. 이 URL로 아래와 같이 Pull Request를 Merge 할 수 있다. [source,shell] @@ -282,7 +282,7 @@ GitHub가 자동으로 해주기 때문에 바로 이용하면 된다. To demonstrate this, we're going to use a low-level command (often referred to as a ``plumbing'' command, which we'll read about more in <>) called `ls-remote`. This command is generally not used in day-to-day Git operations but it's useful to show us what references are present on the server. ////////////////////////// -이걸 해보려면 저수준(``plumbing'') 명령어인 `ls-remote`가 필요하다. +이걸 해보려면 저수준(``plumbing'') 명령어인 `ls-remote` 가 필요하다. 이 명령어는 아무래도 매일 쓰는 명령어는 아니지만, 서버에 어떤 Ref가 있는지 보여 준다. ``plumbing'' 명령어는 <>에서 자세히 설명한다. ////////////////////////// @@ -306,20 +306,20 @@ a5a7751a33b7e86c5e9bb07b26001bb17d775d1a refs/pull/4/head ////////////////////////// Of course, if you're in your repository and you run `git ls-remote origin` or whatever remote you want to check, it will show you something similar to this. ////////////////////////// -저장소 안이라면 `git ls-remote origin`이라고 실행시켜도 된다. 저장된 리모트 이름을 사용할 수 있다. +저장소 안이라면 `git ls-remote origin` 이라고 실행시켜도 된다. 저장된 리모트 이름을 사용할 수 있다. ////////////////////////// If the repository is on GitHub and you have any Pull Requests that have been opened, you'll get these references that are prefixed with `refs/pull/`. These are basically branches, but since they're not under `refs/heads/` you don't get them normally when you clone or fetch from the server -- the process of fetching ignores them normally. ////////////////////////// -GitHub 저장소에 어떤 Pull Reqeust라도 열려있다면 `refs/pull/`로 시작하는 이름으로 Ref가 생성된다. 이것도 브랜치지만 `refs/heads/`로 시작하는 브랜치와는 달리 Clone과 Fetch 할 때 받아지지 않는다. 기본적으로 무시된다. +GitHub 저장소에 어떤 Pull Reqeust라도 열려있다면 `refs/pull/` 로 시작하는 이름으로 Ref가 생성된다. 이것도 브랜치지만 `refs/heads/` 로 시작하는 브랜치와는 달리 Clone과 Fetch 할 때 받아지지 않는다. 기본적으로 무시된다. ////////////////////////// There are two references per Pull Request - the one that ends in `/head` points to exactly the same commit as the last commit in the Pull Request branch. So if someone opens a Pull Request in our repository and their branch is named `bug-fix` and it points to commit `a5a775`, then in *our* repository we will not have a `bug-fix` branch (since that's in their fork), but we _will_ have `pull//head` that points to `a5a775`. This means that we can pretty easily pull down every Pull Request branch in one go without having to add a bunch of remotes. ////////////////////////// -Pull Request에는 두 종류의 Ref가 있다. `/head`로 끝나는 것은 Pull Request 브랜치가 가리키는 마지막 커밋이다. -누군가 우리 저장소에 `bug-fix`라는 브랜치를 Pull Request로 보내는 상황을 살펴보자. 이 브랜치는 `a5a775` 커밋을 가리킨다. `bug-fix` 브랜치는 Fork 한 저장소에 있는 브랜치라서 우리 저장소에 없다. 그럼에도 `a5a775`를 가리키는 `pull//head` 형식의 브랜치가 자동으로 생긴다. +Pull Request에는 두 종류의 Ref가 있다. `/head` 로 끝나는 것은 Pull Request 브랜치가 가리키는 마지막 커밋이다. +누군가 우리 저장소에 `bug-fix` 라는 브랜치를 Pull Request로 보내는 상황을 살펴보자. 이 브랜치는 `a5a775` 커밋을 가리킨다. `bug-fix` 브랜치는 Fork 한 저장소에 있는 브랜치라서 우리 저장소에 없다. 그럼에도 `a5a775`를 가리키는 `pull//head` 형식의 브랜치가 자동으로 생긴다. 그래서 매번 다른 저장소를 리모트로 등록하지 않고서도 Pull Request 브랜치를 쉽게 Pull 할 수 있다. ////////////////////////// @@ -340,9 +340,9 @@ Git happily obeys, and downloads everything you need to construct that ref, and You can follow that up with `git merge FETCH_HEAD` into a branch you want to test it in, but that merge commit message looks a bit weird. Also, if you're reviewing a *lot* of pull requests, this gets tedious. ////////////////////////// -``리모트의 브랜치 `origin`을 `refs/pull/958/head`로 Fetch 한다''는 뜻이다. -Git은 충실하게 전부 내려받고 마지막 커밋을 `.git/FETCH_HEAD`에 저장한다. -`git merge FETCH_HEAD`으로 Merge 해서 테스트할 수 있다. 이렇게 Merge 하면 Merge 커밋 메시지가 약간 이상해진다. 또한 많은 Pull Request를 처리해야 하는 경우, 쓸데없는 Merge 커밋도 많아진다. +``리모트의 브랜치 `origin` 을 `refs/pull/958/head` 로 Fetch 한다''는 뜻이다. +Git은 충실하게 전부 내려받고 마지막 커밋을 `.git/FETCH_HEAD` 에 저장한다. +`git merge FETCH_HEAD` 으로 Merge 해서 테스트할 수 있다. 이렇게 Merge 하면 Merge 커밋 메시지가 약간 이상해진다. 또한 많은 Pull Request를 처리해야 하는 경우, 쓸데없는 Merge 커밋도 많아진다. ////////////////////////// There's also a way to fetch _all_ of the pull requests, and keep them up to date whenever you connect to the remote. @@ -366,9 +366,9 @@ It's a way of mapping names on the remote with names in your local `.git` direct This particular one tells Git, "the things on the remote that are under `refs/heads` should go in my local repository under `refs/remotes/origin`." You can modify this section to add another refspec: ////////////////////////// -`fetch =`로 시작하는 라인이 ``refspec.''이라는 거다. +`fetch =` 로 시작하는 라인이 ``refspec'' 이라는 거다. 리모트 이름과 로컬 `.git` 디렉토리를 어떻게 매핑하는지 나타낸다. -여기서는 해당 리모트에서 `refs/heads`에 해당하는 이름이 `refs/remotes/origin` 디렉토리에 매핑된다는 의미다. +여기서는 해당 리모트에서 `refs/heads` 에 해당하는 이름이 `refs/remotes/origin` 디렉토리에 매핑된다는 의미다. Refspec을 새로 추가해보자. [source,ini] @@ -381,10 +381,10 @@ Refspec을 새로 추가해보자. ////////////////////////// That last line tells Git, ``All the refs that look like `refs/pull/123/head` should be stored locally like `refs/remotes/origin/pr/123`.'' -Now, if you save that file, and do a `git fetch`: +Now, if you save that file, and do a `git fetch` : ////////////////////////// -추가한 마지막 라인의 의미는 `` `refs/pull/123/head` 같은 Ref를 `refs/remotes/origin/pr/123`에 저장'' 한다는 의미다. -`git fetch`라고 실행하면 새 Refspec의 브랜치도 가져온다. +추가한 마지막 라인의 의미는 `refs/pull/123/head` 같은 Ref를 `refs/remotes/origin/pr/123` 에 저장'' 한다는 의미다. +`git fetch` 라고 실행하면 새 Refspec의 브랜치도 가져온다. [source,shell] ---- @@ -415,7 +415,7 @@ Switched to a new branch 'pr/2' The eagle-eyed among you would note the `head` on the end of the remote portion of the refspec. There's also a `refs/pull/#/merge` ref on the GitHub side, which represents the commit that would result if you push the ``merge'' button on the site. This can allow you to test the merge before even hitting the button. ////////////////////////// -`head`로 끝나는 Refspec에 대해서 살펴봤고 이제 `refs/pull/#/merge` 처럼 생긴 Refspec을 알아보자. 이 브랜치는 GitHub에서 Merge 버튼으로 Merge 했을 때 적용되는 결과다. GitHub에서 실제로 Merge 하기 전에 로컬로 가져와서 먼저 테스트할 수 있다. +`head` 로 끝나는 Refspec에 대해서 살펴봤고 이제 `refs/pull/#/merge` 처럼 생긴 Refspec을 알아보자. 이 브랜치는 GitHub에서 Merge 버튼으로 Merge 했을 때 적용되는 결과다. GitHub에서 실제로 Merge 하기 전에 로컬로 가져와서 먼저 테스트할 수 있다. ////////////////////////// ===== Pull Requests on Pull Requests @@ -426,7 +426,7 @@ There's also a `refs/pull/#/merge` ref on the GitHub side, which represents the Not only can you open Pull Requests that target the main or `master` branch, you can actually open a Pull Request targeting any branch in the network. In fact, you can even target another Pull Request. ////////////////////////// -Pull Request를 Merge 할 브랜치는 `master`가 아니어도 된다. 주 브랜치를 고를 수도 있고 Pull Request를 열 때 다른 브랜치를 골라도 된다. +Pull Request를 Merge 할 브랜치는 `master` 가 아니어도 된다. 주 브랜치를 고를 수도 있고 Pull Request를 열 때 다른 브랜치를 골라도 된다. 심지어 다른 Pull Request를 고를 수도 있다. ////////////////////////// @@ -612,7 +612,7 @@ There are a couple of interesting things here. If you want to highlight or re-route emails to this particular project or even Pull Request, the information in `Message-ID` gives you all the data in `///` format. If this were an issue, for example, the `` field would have been ``issues'' rather than ``pull''. ////////////////////////// -프로젝트에 따라 혹은 Pull Request인지에 따라 분류하거나 다른 주소로 재전송하고 싶다면 `Message-ID`를 이용하는 게 좋다. +프로젝트에 따라 혹은 Pull Request인지에 따라 분류하거나 다른 주소로 재전송하고 싶다면 `Message-ID` 를 이용하는 게 좋다. 이 데이터는 `///` 형식으로 돼 있다. 만약 이슈에 대한 데이터면 ``부분이 ``pull''이 아니라 ``issues''라고 돼 있을 것이다. @@ -620,7 +620,7 @@ If this were an issue, for example, the `` field would have been ``issues' The `List-Post` and `List-Unsubscribe` fields mean that if you have a mail client that understands those, you can easily post to the list or ``Unsubscribe'' from the thread. That would be essentially the same as clicking the ``mute'' button on the web version of the notification or ``Unsubscribe'' on the Issue or Pull Request page itself. ////////////////////////// -`List-Post`와 `List-Unsubscribe` 필드를 인식하는 메일 클라이언트를 사용하고 있으면 좀 더 편리하게 사용할 수 있다. `List-Post`는 이메일로 리스트에 글을 올리는 데 사용하고 `List-Unsubscribe`는 이메일 클라이언트에서 알림을 그만 받도록 할 수 있다. +`List-Post` 와 `List-Unsubscribe` 필드를 인식하는 메일 클라이언트를 사용하고 있으면 좀 더 편리하게 사용할 수 있다. `List-Post` 는 이메일로 리스트에 글을 올리는 데 사용하고 `List-Unsubscribe` 는 이메일 클라이언트에서 알림을 그만 받도록 할 수 있다. 이슈와 Pull Request페이지의 ``Unsubscribe'' 버튼을 클릭하거나 웹 알림 페이지에서 ``Mute'' 버튼을 클릭하는 것과 같다. ////////////////////////// diff --git a/book/06-github/sections/4-managing-organization.asc b/book/06-github/sections/4-managing-organization.asc index 36af11c2..e81ba367 100644 --- a/book/06-github/sections/4-managing-organization.asc +++ b/book/06-github/sections/4-managing-organization.asc @@ -14,7 +14,7 @@ Normally these accounts are used for Open Source groups (such as ``perl'' or ``r GitHub에는 Organization이라는 계정도 있다. 개인 계정처럼 Organizaiton 계정도 프로젝트 네임스페이스지만 다른 점이 많다. 이 계정은 여러 명이 같은 프로젝트를 관리하는 데 사용하는 그룹 계정이고 사람들을 서브 그룹을 나누어 관리하는 도구도 있다. -이 계정은 ``perl''이나 ``rails'' 같은 오픈소스 그룹이나 ``goolge''이나 ``twitter''같은 회사가 사용한다. +이 계정은 ``perl'' 이나 ``rails'' 같은 오픈소스 그룹이나 ``google'' 이나 ``twitter'' 같은 회사가 사용한다. ////////////////////////// ==== Organization Basics @@ -24,7 +24,7 @@ GitHub에는 Organization이라는 계정도 있다. ////////////////////////// An organization is pretty easy to create; just click on the ``+'' icon at the top-right of any GitHub page, and select ``New organization'' from the menu. ////////////////////////// -Organization을 만드는 것은 매우 쉽다. GitHub 페이지 오른쪽 위에 있는 ``+'' 아이콘을 클릭하고 메뉴에서 ``New organization''을 선택하면 된다. +Organization을 만드는 것은 매우 쉽다. GitHub 페이지 오른쪽 위에 있는 ``+'' 아이콘을 클릭하고 메뉴에서 ``New organization'' 을 선택하면 된다. ////////////////////////// .The ``New organization'' menu item. @@ -75,7 +75,7 @@ Organization 계정이 개인 계정과 다른 점이 있는데 그 점들을 ////////////////////////// Organizations are associated with individual people by way of teams, which are simply a grouping of individual user accounts and repositories within the organization and what kind of access those people have in those repositories. ////////////////////////// -Organization과 개인은 팀을 통해 연결된다. Organizatoin의 사용자와 저장소는 팀으로 관리되고 저장소의 권한 설정도 팀으로 관리한다. +Organization과 개인은 팀을 통해 연결된다. Organization의 사용자와 저장소는 팀으로 관리되고 저장소의 권한 설정도 팀으로 관리한다. ////////////////////////// For example, say your company has three repositories: `frontend`, `backend`, and `deployscripts`. @@ -83,7 +83,7 @@ You'd want your HTML/CSS/JavaScript developers to have access to `frontend` and Teams make this easy, without having to manage the collaborators for every individual repository. ////////////////////////// 만약 회사에 `frontend`, `backend`, `deployscripts` 이렇게 저장소가 세 개 있다고 하자. -HTML/CSS/JavaScript 개발자는 `frontend` 저장소에 접근 권한이 있어야 한다. 반대로 운영하는 사람들은 `backend`나 `deployscripts` 같은 저장소에 접근 권한이 있어야 한다. +HTML/CSS/JavaScript 개발자는 `frontend` 저장소에 접근 권한이 있어야 한다. 반대로 운영하는 사람들은 `backend` 나 `deployscripts` 같은 저장소에 접근 권한이 있어야 한다. Organization에서 팀은 저장소에서 함께 일하는 사람을 관리하는 효과적인 도구다. ////////////////////////// @@ -127,7 +127,7 @@ When you invite someone to a team, they will get an email letting them know they Additionally, team `@mentions` (such as `@acmecorp/frontend`) work much the same as they do with individual users, except that *all* members of the team are then subscribed to the thread. This is useful if you want the attention from someone on a team, but you don't know exactly who to ask. ////////////////////////// -개인 사용자에 멘션하는 것처럼 팀 `@mentions`도 사용할 수 있다. `@acmecorp/frontend`처럼 하면 팀의 모든 멤버가 참여하게 된다. +개인 사용자에 멘션하는 것처럼 팀 `@mentions` 도 사용할 수 있다. `@acmecorp/frontend` 처럼 하면 팀의 모든 멤버가 참여하게 된다. 정확히 누구한테 물어야 할지 모를 때는 그냥 팀 전체에 문의하는 것도 방법이다. ////////////////////////// @@ -135,7 +135,7 @@ A user can belong to any number of teams, so don't limit yourself to only access Special-interest teams like `ux`, `css`, or `refactoring` are useful for certain kinds of questions, and others like `legal` and `colorblind` for an entirely different kind. ////////////////////////// 사용자가 속하는 팀의 수는 제한이 없다. 단순히 팀을 권한 관리 용도로 사용하지 마라. -`ux`, `css`, `refactoring`과 같이 팀은 어떤 질문 등을 관리하기에 좋고 `legal`, `colorblind` 같은 팀은 또 다른 이슈를 처리하는 데 좋다. +`ux`, `css`, `refactoring` 과 같이 팀은 어떤 질문 등을 관리하기에 좋고 `legal`, `colorblind` 같은 팀은 또 다른 이슈를 처리하는 데 좋다. ////////////////////////// ==== Audit Log diff --git a/book/06-github/sections/5-scripting.asc b/book/06-github/sections/5-scripting.asc index 2211f9ea..4563be7f 100644 --- a/book/06-github/sections/5-scripting.asc +++ b/book/06-github/sections/5-scripting.asc @@ -408,7 +408,7 @@ You could also use this to check if the commit message is properly formatted, if ////////////////////////// Let's say you set up a webhook on your repository that hits a small web service that checks for a `Signed-off-by` string in the commit message. ////////////////////////// -커밋 메시지에 `Signed-off-by`라는 스트링이 있는지 검사하는 웹 서비스를 만들어 보자. 먼저 저장소에 이 웹 서비스를 호출하는 웹훅을 등록한다. +커밋 메시지에 `Signed-off-by` 라는 스트링이 있는지 검사하는 웹 서비스를 만들어 보자. 먼저 저장소에 이 웹 서비스를 호출하는 웹훅을 등록한다. [source,ruby] ---- @@ -496,7 +496,7 @@ Though we've been doing nearly everything through `curl` and simple HTTP request At the time of this writing, the supported languages include Go, Objective-C, Ruby, and .NET. Check out http://github.com/octokit[] for more information on these, as they handle much of the HTTP for you. ////////////////////////// -이 책에서는 단순한 HTTP 요청을 보냈기 때문에 `curl`만 사용했다. 하지만, 더 편리하게 API를 사용할 수 있게 해주는 오픈소스 라이브러리가 있다. +이 책에서는 단순한 HTTP 요청을 보냈기 때문에 `curl` 만 사용했다. 하지만, 더 편리하게 API를 사용할 수 있게 해주는 오픈소스 라이브러리가 있다. 이 책을 쓰는 시점에서는 Go와 Objective-C, Ruby, .NET을 지원한다. 자세한 정보는 http://github.com/octokit[]에 가서 확인하면 되고 이미 많은 기능을 지원한다. diff --git a/book/07-git-tools/sections/advanced-merging.asc b/book/07-git-tools/sections/advanced-merging.asc index 0fa67c67..a0cfd6da 100644 --- a/book/07-git-tools/sections/advanced-merging.asc +++ b/book/07-git-tools/sections/advanced-merging.asc @@ -208,7 +208,7 @@ If you see that you have a lot of whitespace issues in a merge, you can simply a The first option ignores whitespace *completely* when comparing lines, the second treats sequences of one or more whitespace characters as equivalent. /////////////////// 기본 Merge 전략은 공백의 변화는 무시하도록 하는 옵션을 주는 것이다. -Merge 할 때 무수한 공백 때문에 문제가 생기면 그냥 Merge를 취소한 다음 `-Xignore-all-space`나 `-Xignore-space-change` 옵션을 주어 다시 Merge 한다. +Merge 할 때 무수한 공백 때문에 문제가 생기면 그냥 Merge를 취소한 다음 `-Xignore-all-space` 나 `-Xignore-space-change` 옵션을 주어 다시 Merge 한다. 첫 번째 옵션은 *모든* 공백을 무시하고 두 번째 옵션은 뭉쳐 있는 공백을 하나로 취급한다. [source,console] @@ -247,7 +247,7 @@ Merge 작업할 때 공백 처리 옵션을 사용하면 Git이 꽤 잘해준다 What we really need to do is run the file we're trying to merge in through a `dos2unix` program before trying the actual file merge. So how would we do that? /////////////////// -파일을 `dos2unix`로 변환하고 Merge 하면 된다. +파일을 `dos2unix` 로 변환하고 Merge 하면 된다. 이걸 Git에서 어떻게 하는지 살펴보자. /////////////////// @@ -262,7 +262,7 @@ Stage 1 is the common anecestor, stage 2 is your version and stage 3 is from the /////////////////// 우선 세 가지 버전의 파일을 얻는 건 쉽다. Git은 세 버전의 모든 파일에 ``stages'' 숫자를 붙여서 Index에 다 가지고 있다. -Stage 1는 공통 조상 파일, Stage 2는 현재 개발자의 버전에 해당하는 파일, Stage 3은 `MERGE_HEAD`가 가리키는 커밋의 파일이다. +Stage 1는 공통 조상 파일, Stage 2는 현재 개발자의 버전에 해당하는 파일, Stage 3은 `MERGE_HEAD` 가 가리키는 커밋의 파일이다. /////////////////// You can extract a copy of each of these versions of the conflicted file with the `git show` command and a special syntax. @@ -292,7 +292,7 @@ $ git ls-files -u /////////////////// The `:1:hello.rb` is just a shorthand for looking up that blob SHA-1. /////////////////// -`:1:hello.rb`는 그냥 Blob SHA-1를 지칭하는 줄임말이다. +`:1:hello.rb` 는 그냥 Blob SHA-1를 지칭하는 줄임말이다. /////////////////// Now that we have the content of all three stages in our working directory, we can manually fix up theirs to fix the whitespace issue and re-merge the file with the little-known `git merge-file` command which does just that. @@ -337,7 +337,7 @@ In the `ignore-all-space` merge, we actually ended up with a few lines with DOS If you want to get an idea before finalizing this commit about what was actually changed between one side or the other, you can ask `git diff` to compare what is in your working directory that you're about to commit as the result of the merge to any of these stages. Let's go through them all. /////////////////// -Merge 커밋을 완료하기 전에 양쪽 부모에 대해서 무엇이 바뀌었는지 확인하려면 `git diff`를 사용한다. 이 명령을 이용하면 Merge 의 결과로 워킹 디렉토리에 무엇이 바뀌었는지 알 수 있다. +Merge 커밋을 완료하기 전에 양쪽 부모에 대해서 무엇이 바뀌었는지 확인하려면 `git diff` 를 사용한다. 이 명령을 이용하면 Merge 의 결과로 워킹 디렉토리에 무엇이 바뀌었는지 알 수 있다. 한번 자세히 살펴보자. /////////////////// @@ -373,7 +373,7 @@ So here we can easily see that what happened in our branch, what we're actually If we want to see how the result of the merge differed from what was on their side, you can run `git diff --theirs`. In this and the following example, we have to use `-b` to strip out the whitespace because we're comparing it to what is in Git, not our cleaned up `hello.theirs.rb` file. /////////////////// -Merge 할 파일을 가져온 쪽과 비교해서 무엇이 바뀌었는지 보려면 `git diff --theirs`를 실행한다. +Merge 할 파일을 가져온 쪽과 비교해서 무엇이 바뀌었는지 보려면 `git diff --theirs` 를 실행한다. 아래 예제에서는 공백을 빼고 비교하기 위해 `-b` 옵션을 같이 써주었다. [source,console] @@ -396,7 +396,7 @@ index e85207e..44d0a25 100755 /////////////////// Finally, you can see how the file has changed from both sides with `git diff --base`. /////////////////// -마지막으로 `git diff --base`를 사용해서 양쪽 모두와 비교하여 바뀐 점을 알아본다. +마지막으로 `git diff --base` 를 사용해서 양쪽 모두와 비교하여 바뀐 점을 알아본다. [source,console] ---- @@ -466,7 +466,7 @@ $ git log --graph --oneline --decorate --all We now have three unique commits that live only on the `master` branch and three others that live on the `mundo` branch. If we try to merge the `mundo` branch in, we get a conflict. /////////////////// -`master`에만 있는 세 개의 커밋과 `mundo` 브랜치에만 존재하는 또 다른 세 개의 커밋이 있다. +`master` 에만 있는 세 개의 커밋과 `mundo` 브랜치에만 존재하는 또 다른 세 개의 커밋이 있다. `master` 브랜치에서 `mundo` 브랜치를 Merge 하면 충돌이 난다. [source,console] @@ -526,8 +526,8 @@ This can be useful if you want to reset the markers and try to resolve them agai You can pass `--conflict` either `diff3` or `merge` (which is the default). If you pass it `diff3`, Git will use a slightly different version of conflict markers, not only giving you the ``ours'' and ``theirs'' versions, but also the ``base'' version inline to give you more context. /////////////////// -`--conflict` 옵션에는 `diff3`나 `merge`를 넘길 수 있고 `merge`가 기본 값이다. -`--conflict` 옵션에 `diff3`를 사용하면 Git은 약간 다른 모양의 충돌 표시를 남긴다. ``ours''나 ``theirs''말고도 ``base''버전의 내용까지 제공한다. +`--conflict` 옵션에는 `diff3`나 `merge` 를 넘길 수 있고 `merge` 가 기본 값이다. +`--conflict` 옵션에 `diff3` 를 사용하면 Git은 약간 다른 모양의 충돌 표시를 남긴다. ``ours'' 나 ``theirs'' 말고도 ``base'' 버전의 내용까지 제공한다. [source,console] ---- @@ -559,7 +559,7 @@ hello() /////////////////// If you like this format, you can set it as the default for future merge conflicts by setting the `merge.conflictstyle` setting to `diff3`. /////////////////// -이런 형태의 충돌 표시를 계속 보고 싶다면 기본으로 사용하도록 `merge.conflictstyle` 설정 값을 `diff3`로 설정한다. +이런 형태의 충돌 표시를 계속 보고 싶다면 기본으로 사용하도록 `merge.conflictstyle` 설정 값을 `diff3` 로 설정한다. [source,console] ---- @@ -569,7 +569,7 @@ $ git config --global merge.conflictstyle diff3 /////////////////// The `git checkout` command can also take `--ours` and `--theirs` options, which can be a really fast way of just choosing either one side or the other without merging things at all. /////////////////// -`git checkout` 명령도 `--ours`와 `--theirs` 옵션을 지원한다. 이 옵션은 Merge 하지 않고 둘 중 한쪽만을 선택할 때 사용한다. +`git checkout` 명령도 `--ours` 와 `--theirs` 옵션을 지원한다. 이 옵션은 Merge 하지 않고 둘 중 한쪽만을 선택할 때 사용한다. /////////////////// This can be particularly useful for conflicts of binary files where you can simply choose one side, or where you only want to merge certain files in from another branch - you can do the merge and then checkout certain files from one side or the other before committing. @@ -630,7 +630,7 @@ $ git log --oneline --left-right --merge If you run that with the `-p` option instead, you get just the diffs to the file that ended up in conflict. This can be *really* helpful in quickly giving you the context you need to help understand why something conflicts and how to more intelligently resolve it. /////////////////// -`--merge`대신 `-p`를 사용하면 충돌 난 파일의 변경사항만 볼 수 있다. +`--merge` 대신 `-p` 를 사용하면 충돌 난 파일의 변경사항만 볼 수 있다. 이건 왜 충돌이 났는지 또 이를 해결하기 위해 어떻게 해야 하는지 이해하는 데 *진짜로* 유용하다. /////////////////// @@ -675,13 +675,13 @@ index 0399cd5,59727f0..0000000 The format is called ``Combined Diff'' and gives you two columns of data next to each line. The first column shows you if that line is different (added or removed) between the ``ours'' branch and the file in your working directory and the second column does the same between the ``theirs'' branch and your working directory copy. /////////////////// -이런 형식을 ``Combined Diff''라고 한다. 각 라인은 두 개의 컬럼으로 구분할 수 있다. -첫 번째 컬럼은 ``ours'' 브랜치와 워킹 디렉토리의 차이(추가 또는 삭제)를 보여준다. 두 번째 컬럼은 ``theirs''와 워킹 디렉토리사이의 차이를 나타낸다. +이런 형식을 ``Combined Diff'' 라고 한다. 각 라인은 두 개의 컬럼으로 구분할 수 있다. +첫 번째 컬럼은 ``ours'' 브랜치와 워킹 디렉토리의 차이(추가 또는 삭제)를 보여준다. 두 번째 컬럼은 ``theirs'' 와 워킹 디렉토리사이의 차이를 나타낸다. /////////////////// So in that example you can see that the `<<<<<<<` and `>>>>>>>` lines are in the working copy but were not in either side of the merge. This makes sense because the merge tool stuck them in there for our context, but we're expected to remove them. /////////////////// -이 예제에서 `<<<<<<<`와 `>>>>>>>` 충돌 마커 표시는 어떤 쪽에도 존재하지 않고 추가된 코드라는 것을 알 수 있다. 이 표시는 Merge 도구가 만들어낸 코드이기 때문이다. 물론 이 표시는 지워야 하는 라인이다. +이 예제에서 `<<<<<<<` 와 `>>>>>>>` 충돌 마커 표시는 어떤 쪽에도 존재하지 않고 추가된 코드라는 것을 알 수 있다. 이 표시는 Merge 도구가 만들어낸 코드이기 때문이다. 물론 이 표시는 지워야 하는 라인이다. /////////////////// If we resolve the conflict and run `git diff` again, we'll see the same thing, but it's a little more useful. @@ -712,7 +712,7 @@ index 0399cd5,59727f0..0000000 This shows us that ``hola world'' was in our side but not in the working copy, that ``hello mundo'' was in their side but not in the working copy and finally that ``hola mundo'' was not in either side but is now in the working copy. This can be useful to review before committing the resolution. /////////////////// -이 결과는 세 가지 사실을 보여준다. ``hola world''는 Our 브랜치에 있었지만 워킹 디렉토리에는 없다. ``hello mundo''는 Their 브랜치에 있었지만 워킹 디렉토리에는 없다. ``hola mundo''는 어느 쪽 브랜치에도 없고 워킹 디렉토리에는 있다. +이 결과는 세 가지 사실을 보여준다. ``hola world'' 는 Our 브랜치에 있었지만 워킹 디렉토리에는 없다. ``hello mundo'' 는 Their 브랜치에 있었지만 워킹 디렉토리에는 없다. ``hola mundo'' 는 어느 쪽 브랜치에도 없고 워킹 디렉토리에는 있다. 충돌을 해결하고 마지막으로 확인하고 나서 커밋하는 데 유용하다. /////////////////// @@ -720,7 +720,7 @@ You can also get this from the `git log` for any merge to see how something was Git will output this format if you run `git show` on a merge commit, or if you add a `--cc` option to a `git log -p` (which by default only shows patches for non-merge commits). /////////////////// 이 정보를 `git log` 명령을 통해서도 얻을 수 있다. Merge 후에 무엇이 어떻게 바뀌었는지 알아야 할 때 유용하다. -Merge 커밋에 대해서 `git show` 명령을 실행하거나 `git log -p`에 `--cc` 옵션을 추가해도 같은 결과를 얻을 수 있다. `git log -p` 명령은 기본적으로 Merge 커밋이 아닌 커밋의 Patch를 출력한다. +Merge 커밋에 대해서 `git show` 명령을 실행하거나 `git log -p` 에 `--cc` 옵션을 추가해도 같은 결과를 얻을 수 있다. `git log -p` 명령은 기본적으로 Merge 커밋이 아닌 커밋의 Patch를 출력한다. [source,console] ---- @@ -769,7 +769,7 @@ Merge commits are no different. Let's say you started work on a topic branch, accidentally merged it into `master`, and now your commit history looks like this: /////////////////// Merge 커밋도 예외는 아니다. -토픽 브랜치에서 일을 하다가 `master`로 잘못 Merge 했다고 생각해보자. 커밋 히스토리는 아래와 같다. +토픽 브랜치에서 일을 하다가 `master` 로 잘못 Merge 했다고 생각해보자. 커밋 히스토리는 아래와 같다. /////////////////// .Accidental merge commit @@ -806,7 +806,7 @@ image::images/undomerge-reset.png[`git reset --hard HEAD~` 실행 후의 히스 We covered `reset` back in <>, so it shouldn't be too hard to figure out what's going on here. Here's a quick refresher: `reset --hard` usually goes through three steps: /////////////////// -`reset`에 대해서는 이미 앞의 <>에서 다뤘었기 때문에 이 내용이 그리 어렵진 않을 것이다. +`reset` 에 대해서는 이미 앞의 <>에서 다뤘었기 때문에 이 내용이 그리 어렵진 않을 것이다. 간단하게 복습해보자. `reset --hard` 명령은 아래의 세 단계로 수행한다. /////////////////// @@ -854,7 +854,7 @@ When you invoke a merge into `HEAD` (`git merge topic`), the new commit has two In this case, we want to undo all the changes introduced by merging in parent #2 (`C4`), while keeping all the content from parent #1 (`C6`). /////////////////// `-m 1` 옵션은 부모가 보호되어야 하는 ``mainline'' 이라는 것을 나타낸다. -`HEAD`로 Merge를 했을 때(`git merge topic1`) Merge 커밋은 두 개의 부모 커밋을 가진다. 첫 번째 부모 커밋은 `HEAD`(`C6`)이고 두 번째 부모 커밋은 Merge 대상 브랜치(`C4`)이다. +`HEAD` 로 Merge를 했을 때(`git merge topic1`) Merge 커밋은 두 개의 부모 커밋을 가진다. 첫 번째 부모 커밋은 `HEAD` (`C6`)이고 두 번째 부모 커밋은 Merge 대상 브랜치(`C4`)이다. 두 번째 부모 커밋(`C4`)에서 받아온 모든 변경사항을 되돌리고 첫 번째 부모(`C6`)로부터 받아온 변경사항은 남겨두고자 하는 상황이다. /////////////////// @@ -870,10 +870,10 @@ image::images/undomerge-revert.png[History after `git revert -m 1`.] image::images/undomerge-revert.png[`git revert -m 1` 실행 후의 히스토리.] /////////////////// -The new commit `^M` has exactly the same contents as `C6`, so starting from here it's as if the merge never happened, except that the now-unmerged commits are still in `HEAD`'s history. +The new commit `^M` has exactly the same contents as `C6`, so starting from here it's as if the merge never happened, except that the now-unmerged commits are still in `HEAD` 's history. Git will get confused if you try to merge `topic` into `master` again: /////////////////// -새로 만든 커밋 `^M`은 `C6`과 내용이 완전히 똑같다. 잘못 Merge 한 커밋까지 `HEAD`의 히스토리에서 볼 수 있다는 것 말고는 Merge 하지 않은 것과 같다. +새로 만든 커밋 `^M` 은 `C6` 과 내용이 완전히 똑같다. 잘못 Merge 한 커밋까지 `HEAD` 의 히스토리에서 볼 수 있다는 것 말고는 Merge 하지 않은 것과 같다. `topic` 브랜치를 `master` 브랜치에 다시 Merge 하면 Git은 아래와 같이 어리둥절해한다. [source,console] @@ -887,7 +887,7 @@ There's nothing in `topic` that isn't already reachable from `master`. What's worse, if you add work to `topic` and merge again, Git will only bring in the changes _since_ the reverted merge: /////////////////// 이미 Merge 했던 `topic` 브랜치에는 더는 `master` 브랜치로 Merge 할 내용이 없다. -상황을 더 혼란스럽게 하는 경우는 `topic`에서 뭔가 더 일을 하고 다시 Merge를 하는 경우이다. Git은 Merge _이후에_ 새로 만들어진 커밋만 가져온다. +상황을 더 혼란스럽게 하는 경우는 `topic` 에서 뭔가 더 일을 하고 다시 Merge를 하는 경우이다. Git은 Merge _이후에_ 새로 만들어진 커밋만 가져온다. /////////////////// .History with a bad merge @@ -919,8 +919,8 @@ image::images/undomerge-revert3.png[되돌린 Merge를 다시 Merge 한 후의 In this example, `M` and `^M` cancel out. `^^M` effectively merges in the changes from `C3` and `C4`, and `C8` merges in the changes from `C7`, so now `topic` is fully merged. /////////////////// -위 예제에서는 `M`과 `^M`이 상쇄됐다. -`^^M`는 `C3`와 `C4`의 변경 사항을 담고 있고 `C8`은 `C7`의 내용을 훌륭하게 Merge 했다. 이리하여 현재 `topic` 브랜치를 완전히 Merge 한 상태가 됐다. +위 예제에서는 `M` 과 `^M` 이 상쇄됐다. +`^^M` 는 `C3` 와 `C4` 의 변경 사항을 담고 있고 `C8` 은 `C7` 의 내용을 훌륭하게 Merge 했다. 이리하여 현재 `topic` 브랜치를 완전히 Merge 한 상태가 됐다. /////////////////// ==== Other Types of Merges @@ -942,14 +942,14 @@ First of all, there is another useful thing we can do with the normal ``recursiv We've already seen the `ignore-all-space` and `ignore-space-change` options which are passed with a `-X` but we can also tell Git to favor one side or the other when it sees a conflict. /////////////////// 먼저 일반적인 ``recursive'' 전략을 사용하는 Merge 작업을 할 때 유용한 옵션을 소개한다. -앞에서 `ignore-all-space`와 `ignore-space-change` 기능을 `-X` 옵션에 붙여 쓰는 것을 보았다. 이 `-X` 옵션은 충돌이 났을 때 어떤 한 쪽을 선택할 때도 사용한다. +앞에서 `ignore-all-space` 와 `ignore-space-change` 기능을 `-X` 옵션에 붙여 쓰는 것을 보았다. 이 `-X` 옵션은 충돌이 났을 때 어떤 한 쪽을 선택할 때도 사용한다. /////////////////// By default, when Git sees a conflict between two branches being merged, it will add merge conflict markers into your code and mark the file as conflicted and let you resolve it. If you would prefer for Git to simply choose a specific side and ignore the other side instead of letting you manually resolve the conflict, you can pass the `merge` command either a `-Xours` or `-Xtheirs`. /////////////////// 아무 옵션도 지정하지 않고 두 브랜치를 Merge 하면 Git은 코드에 충돌 난 곳을 표시하고 해당 파일을 충돌 난 파일로 표시해준다. -충돌을 직접 해결하는 게 아니라 미리 Git에게 충돌이 났을 때 두 브랜치 중 한쪽을 선택하라고 알려줄 수 있다. `merge` 명령을 사용할 때 `-Xours`나 `Xtheirs` 옵션을 추가하면 된다. +충돌을 직접 해결하는 게 아니라 미리 Git에게 충돌이 났을 때 두 브랜치 중 한쪽을 선택하라고 알려줄 수 있다. `merge` 명령을 사용할 때 `-Xours` 나 `Xtheirs` 옵션을 추가하면 된다. /////////////////// If Git sees this, it will not add conflict markers. @@ -977,7 +977,7 @@ Automatic merge failed; fix conflicts and then commit the result. /////////////////// However if we run it with `-Xours` or `-Xtheirs` it does not. /////////////////// -하지만 `-Xours`나 `-Xtheirs` 옵션을 주면 충돌이 났다는 소리가 없다. +하지만 `-Xours` 나 `-Xtheirs` 옵션을 주면 충돌이 났다는 소리가 없다. [source,console] ---- @@ -994,8 +994,8 @@ Merge made by the 'recursive' strategy. In that case, instead of getting conflict markers in the file with ``hello mundo'' on one side and ``hola world'' on the other, it will simply pick ``hola world''. However, all the other non-conflicting changes on that branch are merged successfully in. /////////////////// -한쪽 파일에는 ``hello mundo''가 있고 다른 파일에는 ``hola world''가 있다. -이 Merge에서 충돌 표시를 하는 대신 간단히 ``hola world''를 선택한다. 충돌 나지 않은 나머지는 잘 Merge 된다. +한쪽 파일에는 ``hello mundo'' 가 있고 다른 파일에는 ``hola world'' 가 있다. +이 Merge에서 충돌 표시를 하는 대신 간단히 ``hola world'' 를 선택한다. 충돌 나지 않은 나머지는 잘 Merge 된다. /////////////////// This option can also be passed to the `git merge-file` command we saw earlier by running something like `git merge-file --ours` for individual file merges. diff --git a/book/07-git-tools/sections/bundling.asc b/book/07-git-tools/sections/bundling.asc index e6f52bfd..24003c80 100644 --- a/book/07-git-tools/sections/bundling.asc +++ b/book/07-git-tools/sections/bundling.asc @@ -22,14 +22,14 @@ Git에는 ``Bundle''이란 것이 있다. 데이터를 한 파일에 몰아넣 예를 들어 네트워크가 불통인데 변경사항을 동료에게 보낼 때, 출장을 나갔는데 보안상의 이유로 로컬 네트워크에 접속하지 못할 때, 통신 인터페이스 장비가 고장났을 때, -갑자기 공용 서버에 접근하지 못할 때, 누군가에게 수정사항을 이메일로 보내야 하는데 40개 씩이나 되는 커밋을 `format-patch`로 보내고 싶지 않을 때를 예로 들 수 있다. +갑자기 공용 서버에 접근하지 못할 때, 누군가에게 수정사항을 이메일로 보내야 하는데 40개 씩이나 되는 커밋을 `format-patch` 로 보내고 싶지 않을 때를 예로 들 수 있다. /////////// This is where the `git bundle` command can be helpful. The `bundle` command will package up everything that would normally be pushed over the wire with a `git push` command into a binary file that you can email to someone or put on a flash drive, then unbundle into another repository. /////////// -바로 이럴 때 `git bundle`이 한 줄기 빛이 되어준다. -`bundle` 명령은 보통 `git push`명령으로 올려 보낼 모든 것을 감싸서 한 바이너리 파일로 만든다. 이 파일을 이메일로 보내거나 USB로 다른 사람에게 보내서 다른 저장소에 풀어서(Unbundle) 사용한다. +바로 이럴 때 `git bundle` 이 한 줄기 빛이 되어준다. +`bundle` 명령은 보통 `git push` 명령으로 올려 보낼 모든 것을 감싸서 한 바이너리 파일로 만든다. 이 파일을 이메일로 보내거나 USB로 다른 사람에게 보내서 다른 저장소에 풀어서(Unbundle) 사용한다. /////////// Let's see a simple example. @@ -74,7 +74,7 @@ Now you have a file named `repo.bundle` that has all the data needed to re-creat With the `bundle` command you need to list out every reference or specific range of commits that you want to be included. If you intend for this to be cloned somewhere else, you should add HEAD as a reference as well as we've done here. /////////// -이렇게 `repo.bundle` 이라는 이름의 파일을 생성할 수 있다. 이 파일에는 이 저장소의 `master`브랜치를 다시 만드는 데 필요한 모든 정보가 다 들어 있다. +이렇게 `repo.bundle` 이라는 이름의 파일을 생성할 수 있다. 이 파일에는 이 저장소의 `master` 브랜치를 다시 만드는 데 필요한 모든 정보가 다 들어 있다. `bundle` 명령으로 모든 Refs를 포함하거나 Bundle에 포함할 특정 구간의 커밋을 지정할 수 있다. 이 Bundle을 다른 곳에서 Clone 하려면 위의 명령처럼 HEAD Refs를 포함해야 한다. diff --git a/book/07-git-tools/sections/credentials.asc b/book/07-git-tools/sections/credentials.asc index 10e84cae..3bbafd53 100644 --- a/book/07-git-tools/sections/credentials.asc +++ b/book/07-git-tools/sections/credentials.asc @@ -195,7 +195,7 @@ For the `get` action, however, Git is very interested in what the helper has to If the helper doesn't know anything useful, it can simply exit with no output, but it it does know, it should augment the provided information with the information it has stored. The output is treated like a series of assignment statements; anything provided will replace what Git already knows. //////////////////// -`store`나 `erase` 액션은 따로 결과를 출력할 필요가 없다(Git은 결과를 무시). +`store` 나 `erase` 액션은 따로 결과를 출력할 필요가 없다(Git은 결과를 무시). `get` 액션의 결과는 Git이 주의 깊게 관찰해서 가져다 사용하므로 매우 중요하다. Helper는 전달받은 내용으로 인증정보를 찾고 저장된 인증정보가 없다면 아무런 결과도 출력하지 않고 종료하면 된다. 적당한 인증정보를 찾았을 때는 전달받은 내용에 찾은 인증정보를 추가하여 결과로 응답한다. 결과는 몇 라인의 할당 구문으로 구성하며, Git은 이 결과를 받아서 사용한다. @@ -246,7 +246,7 @@ It's just a series of lines, each of which contains a credential-decorated URL. The `osxkeychain` and `wincred` helpers use the native format of their backing stores, while `cache` uses its own in-memory format (which no other process can read). //////////////////// 단순한 텍스트파일로 인증정보가 포함된 URL 형태로 저장한다. -`osxkeychain`이나 `wincred` Helper를 사용하면 OS에서 제공하는 좀 더 안전한 저장소에 인증정보를 저장한다. `cache` Helper의 경우 나름의 형식으로 메모리에 인증정보를 저장하고 다른 프로세스에서는 (메모리의 내용을) 읽어갈 수 없다. +`osxkeychain` 이나 `wincred` Helper를 사용하면 OS에서 제공하는 좀 더 안전한 저장소에 인증정보를 저장한다. `cache` Helper의 경우 나름의 형식으로 메모리에 인증정보를 저장하고 다른 프로세스에서는 (메모리의 내용을) 읽어갈 수 없다. //////////////////// ==== A Custom Credential Cache @@ -261,7 +261,7 @@ These are stored in a shared directory, but you don't want to copy them to your None of the existing helpers cover this case; let's see what it would take to write our own. There are several key features this program needs to have: //////////////////// -`git-credential-store`나 다른 명령도 독립된 프로그램이다. **아무** 스크립트나 프로그램도 Git Credential Helper가 될 수 있다. +`git-credential-store` 나 다른 명령도 독립된 프로그램이다. **아무** 스크립트나 프로그램도 Git Credential Helper가 될 수 있다. 이미 Git이 제공하는 Helper로도 충분하지만 모든 경우를 커버하지 않는다. 예를 들어 어떤 인증정보는 팀 전체가 공유해야 한다. 배포에 사용하는 인증정보가 그렇다. 이 인증정보는 공유하는 디렉토리에 저장해두고 사용한다. 이 인증정보는 자주 변경되기 때문에 로컬 Credential 저장소에 저장하지 않고 사용하고자 한다. @@ -269,11 +269,11 @@ There are several key features this program needs to have: 맞춤 Helper는 아래와 같은 기능을 제공해야 한다. //////////////////// -. The only action we need to pay attention to is `get`; `store` and `erase` are write operations, so we'll just exit cleanly when they're received. +. The only action we need to pay attention to is `get` ; `store` and `erase` are write operations, so we'll just exit cleanly when they're received. . The file format of the shared-credential file is the same as that used by `git-credential-store`. . The location of that file is fairly standard, but we should allow the user to pass a custom path just in case. //////////////////// -. 새 맞춤 Helper가 집중해야 할 액션은 `get` 뿐이다. `store`나 `erase` 액션은 저장하는 기능이기 때문에 이 액션을 받으면 깔끔하게 바로 종료한다. +. 새 맞춤 Helper가 집중해야 할 액션은 `get` 뿐이다. `store` 나 `erase` 액션은 저장하는 기능이기 때문에 이 액션을 받으면 깔끔하게 바로 종료한다. . 공유하는 Credential 파일은 `git-credential-store` 명령이 저장하는 형식과 같은 형식을 사용한다. . Credential 파일의 위치는 기본 값을 사용해도 되지만 파일 경로를 넘길 수 있다. @@ -308,7 +308,7 @@ include::../git-credential-read-only[] We'll save our helper as `git-credential-read-only`, put it somewhere in our `PATH` and mark it executable. Here's what an interactive session looks like: //////////////////// -이 파일을 `git-credential-read-only`로 저장하고 `PATH`에 등록된 디렉토리 중 하나에 위치시키고 실행 권한을 부여한다. +이 파일을 `git-credential-read-only` 로 저장하고 `PATH` 에 등록된 디렉토리 중 하나에 위치시키고 실행 권한을 부여한다. Helper를 실행하면 아래와 같다. [source,console] diff --git a/book/07-git-tools/sections/debugging.asc b/book/07-git-tools/sections/debugging.asc index 7467d8d3..fd322e36 100644 --- a/book/07-git-tools/sections/debugging.asc +++ b/book/07-git-tools/sections/debugging.asc @@ -49,7 +49,7 @@ Also note the `^4832fe2` commit lines, which designate that those lines were in That commit is when this file was first added to this project, and those lines have been unchanged since. This is a tad confusing, because now you’ve seen at least three different ways that Git uses the `^` to modify a commit SHA, but that is what it means here. ////////////////////////// -첫 항목은 그 라인을 마지막으로 수정한 커밋 SHA-1 값이다. 그다음 두 항목은 누가, 언제 그 라인을 커밋했는지 보여준다. 그래서 누가, 언제 커밋했는지 쉽게 찾을 수 있다. 그 뒤에 파일의 라인 번호와 내용을 보여준다. 그리고 `^4832fe2` 커밋이 궁금할 텐데 이 표시가 붙어 있으면 그 커밋에서 해당 라인이 처음 커밋됐다는 것을 의미한다. 그러니까 해당 라인들은 `4832fe2`에서 커밋한 후 변경된 적이 없다. 지금까지 커밋을 가리킬 때 `^` 기호의 사용법을 적어도 세 가지 이상 배웠기 때문에 약간 헷갈릴 수 있으니 어노테이션에서의 의미를 혼동하지 말자. +첫 항목은 그 라인을 마지막으로 수정한 커밋 SHA-1 값이다. 그다음 두 항목은 누가, 언제 그 라인을 커밋했는지 보여준다. 그래서 누가, 언제 커밋했는지 쉽게 찾을 수 있다. 그 뒤에 파일의 라인 번호와 내용을 보여준다. 그리고 `^4832fe2` 커밋이 궁금할 텐데 이 표시가 붙어 있으면 그 커밋에서 해당 라인이 처음 커밋됐다는 것을 의미한다. 그러니까 해당 라인들은 `4832fe2` 에서 커밋한 후 변경된 적이 없다. 지금까지 커밋을 가리킬 때 `^` 기호의 사용법을 적어도 세 가지 이상 배웠기 때문에 약간 헷갈릴 수 있으니 어노테이션에서의 의미를 혼동하지 말자. ////////////////////////// Another cool thing about Git is that it doesn’t track file renames explicitly. @@ -59,7 +59,7 @@ If you pass `-C` to `git blame`, Git analyzes the file you’re annotating and t For example, say you are refactoring a file named `GITServerHandler.m` into multiple files, one of which is `GITPackUpload.m`. By blaming `GITPackUpload.m` with the `-C` option, you can see where sections of the code originally came from: ////////////////////////// -Git은 파일 이름을 변경한 이력을 별도로 기록해두지 않는다. 하지만, 원래 이 정보들은 각 스냅샷에 저장되고 이 정보를 이용하여 변경 이력을 만들어 낼 수 있다. 그러니까 파일에 생긴 변화는 무엇이든지 알아낼 수 있다. Git은 파일 어노테이션을 분석하여 코드들이 원래 어떤 파일에서 커밋된 것인지 찾아준다. 예를 들어 `GITServerHandler.m`을 여러 개의 파일로 리팩토링했는데 그 중 한 파일이 `GITPackUpload.m` 이라는 파일이었다. 이 경우 `-C` 옵션으로 `GITPackUpload.m` 파일을 추적해서 각 코드가 원래 어떤 파일로 커밋된 것인지 알 수 있었다. +Git은 파일 이름을 변경한 이력을 별도로 기록해두지 않는다. 하지만, 원래 이 정보들은 각 스냅샷에 저장되고 이 정보를 이용하여 변경 이력을 만들어 낼 수 있다. 그러니까 파일에 생긴 변화는 무엇이든지 알아낼 수 있다. Git은 파일 어노테이션을 분석하여 코드들이 원래 어떤 파일에서 커밋된 것인지 찾아준다. 예를 들어 `GITServerHandler.m` 을 여러 개의 파일로 리팩토링했는데 그 중 한 파일이 `GITPackUpload.m` 이라는 파일이었다. 이 경우 `-C` 옵션으로 `GITPackUpload.m` 파일을 추적해서 각 코드가 원래 어떤 파일로 커밋된 것인지 알 수 있었다. [source,console] ---- @@ -106,7 +106,7 @@ You can bisect the code to find out. First you run `git bisect start` to get things going, and then you use `git bisect bad` to tell the system that the current commit you’re on is broken. Then, you must tell bisect when the last known good state was, using `git bisect good [good_commit]`: ////////////////////////// -코드를 운용 환경에 배포하고 난 후에 개발할 때 발견하지 못한 버그가 있다고 보고받았다. 그런데 왜 그런 현상이 발생하는지 아직 이해하지 못하는 상황을 가정해보자. 해당 이슈를 다시 만들고 작업하기 시작했는데 뭐가 잘못됐는지 알아낼 수 없다. 이럴 때 bisect 명령을 사용하여 코드를 뒤져 보는 게 좋다. 먼저 `git bisect start` 명령으로 이진 탐색을 시작하고 `git bisect bad`를 실행하여 현재 커밋에 문제가 있다고 표시를 남기고 나서 문제가 없는 마지막 커밋을 `git bisect good [good_commit]` 명령으로 표시한다. +코드를 운용 환경에 배포하고 난 후에 개발할 때 발견하지 못한 버그가 있다고 보고받았다. 그런데 왜 그런 현상이 발생하는지 아직 이해하지 못하는 상황을 가정해보자. 해당 이슈를 다시 만들고 작업하기 시작했는데 뭐가 잘못됐는지 알아낼 수 없다. 이럴 때 bisect 명령을 사용하여 코드를 뒤져 보는 게 좋다. 먼저 `git bisect start` 명령으로 이진 탐색을 시작하고 `git bisect bad` 를 실행하여 현재 커밋에 문제가 있다고 표시를 남기고 나서 문제가 없는 마지막 커밋을 `git bisect good [good_commit]` 명령으로 표시한다. [source,console] ---- @@ -123,7 +123,7 @@ At this point, you can run your test to see if the issue exists as of this commi If it does, then it was introduced sometime before this middle commit; if it doesn’t, then the problem was introduced sometime after the middle commit. It turns out there is no issue here, and you tell Git that by typing `git bisect good` and continue your journey: ////////////////////////// -이 예제에서 마지막으로 괜찮았던 커밋(v1.0)과 현재 문제가 있는 커밋 사이에 있는 커밋은 전부 12개이고 Git은 그 중간에 있는 커밋을 Checkout 해준다. 여기에서 해당 이슈가 구현됐는지 테스트해보고 만약 이슈가 있으면 그 중간 커밋 이전으로 범위를 좁히고 이슈가 없으면 그 중간 커밋 이후로 범위를 좁힌다. 이슈를 발견하지 못하면 `git bisect good`으로 이슈가 아직 없음을 알리고 계속 진행한다. +이 예제에서 마지막으로 괜찮았던 커밋(v1.0)과 현재 문제가 있는 커밋 사이에 있는 커밋은 전부 12개이고 Git은 그 중간에 있는 커밋을 Checkout 해준다. 여기에서 해당 이슈가 구현됐는지 테스트해보고 만약 이슈가 있으면 그 중간 커밋 이전으로 범위를 좁히고 이슈가 없으면 그 중간 커밋 이후로 범위를 좁힌다. 이슈를 발견하지 못하면 `git bisect good` 으로 이슈가 아직 없음을 알리고 계속 진행한다. [source,console] ---- @@ -134,9 +134,9 @@ Bisecting: 3 revisions left to test after this ////////////////////////// Now you’re on another commit, halfway between the one you just tested and your bad commit. -You run your test again and find that this commit is broken, so you tell Git that with `git bisect bad`: +You run your test again and find that this commit is broken, so you tell Git that with `git bisect bad` : ////////////////////////// -현재 문제가 있는 커밋과 지금 테스트한 커밋 사이에서 중간에 있는 커밋이 Checkout 됐다. 다시 테스트해보고 이슈가 있으면 `git bisect bad`로 이슈가 있다고 알린다. +현재 문제가 있는 커밋과 지금 테스트한 커밋 사이에서 중간에 있는 커밋이 Checkout 됐다. 다시 테스트해보고 이슈가 있으면 `git bisect bad` 로 이슈가 있다고 알린다. [source,console] ---- @@ -193,4 +193,4 @@ $ git bisect run test-error.sh Doing so automatically runs `test-error.sh` on each checked-out commit until Git finds the first broken commit. You can also run something like `make` or `make tests` or whatever you have that runs automated tests for you. ////////////////////////// -문제가 생긴 첫 커밋을 찾을 때까지 Checkout 할 때마다 `test-error.sh`를 실행한다. `make`가 됐든지 `make tests`가 됐든지 어쨌든 이슈를 찾는 테스트를 실행하여 찾는다. +문제가 생긴 첫 커밋을 찾을 때까지 Checkout 할 때마다 `test-error.sh` 를 실행한다. `make` 가 됐든지 `make tests` 가 됐든지 어쨌든 이슈를 찾는 테스트를 실행하여 찾는다. diff --git a/book/07-git-tools/sections/interactive-staging.asc b/book/07-git-tools/sections/interactive-staging.asc index b89f1873..6ee99bd7 100644 --- a/book/07-git-tools/sections/interactive-staging.asc +++ b/book/07-git-tools/sections/interactive-staging.asc @@ -15,7 +15,7 @@ Git은 대화형 스크립트도 제공해서 명령을 좀 더 쉽게 사용할 여기서 소개하는 몇 가지 대화형 명령을 이용하면 바로 전문가처럼 능숙하게 커밋할 수 있다. 스크립트를 통해 커밋할 파일을 고르고 수정된 파일의 일부분만 커밋할 수도 있다. 스크립트는 수정하는 파일이 매우 많아서 통째로 커밋하기 어려울 때 이슈별로 나눠서 커밋하기에 좋다. 이슈별로 나눠서 커밋하면 함께 일하는 동료가 검토하기 쉬워진다. -`git add` 명령에 `-i`나 `--interactive` 옵션을 주고 실행하면 Git은 아래와 같은 대화형 모드로 들어간다. +`git add` 명령에 `-i` 나 `--interactive` 옵션을 주고 실행하면 Git은 아래와 같은 대화형 모드로 들어간다. [source,console] ---- @@ -53,7 +53,7 @@ Here you can do a number of things, including staging files, unstaging files, st ////////////////////////// If you type `2` or `u` at the `What now>` prompt, the script prompts you for which files you want to stage: ////////////////////////// -`What now>` 프롬프트에서 `2`나 `u`를(update) 입력하면 Staging Area에 추가할 수 있는 파일을 전부 보여준다. +`What now>` 프롬프트에서 `2` 나 `u` 를(update) 입력하면 Staging Area에 추가할 수 있는 파일을 전부 보여준다. [source,console] ---- @@ -107,7 +107,7 @@ Now you can see that the TODO and index.html files are staged and the simplegit. If you want to unstage the TODO file at this point, you use the `3` or `r` (for revert) option: ////////////////////////// 이제 TODO와 index.html 파일은 Stage했고 simplegit.rb 파일만 아직 Unstaged 상태로 남아 있다. -이제 TODO 파일을 다시 Unstage 하고 싶으면 `3`이나 `r`을(revert) 입력한다. +이제 TODO 파일을 다시 Unstage 하고 싶으면 `3` 이나 `r` 을(revert) 입력한다. [source,console] ---- @@ -150,9 +150,9 @@ To see the diff of what you’ve staged, you can use the `6` or `d` (for diff) c It shows you a list of your staged files, and you can select the ones for which you would like to see the staged diff. This is much like specifying `git diff --cached` on the command line: ////////////////////////// -Staged 파일들의 변경내용을 보려면 `6`이나 `d`를(diff) 입력한다. +Staged 파일들의 변경내용을 보려면 `6` 이나 `d` 를(diff) 입력한다. 그러면 먼저 Staged 상태인 파일들을 보여준다. 그리고 그중에서 파일 하나를 선택한다. -그 결과는 커맨드라인에서 `git diff --cached`라고 실행한 결과와 같다. +그 결과는 커맨드라인에서 `git diff --cached` 라고 실행한 결과와 같다. [source,console] ---- @@ -195,7 +195,7 @@ Git will ask you which files you would like to partially stage; then, for each s ////////////////////////// 파일의 일부분만 Staging Area에 추가하는 것도 가능하다. 예를 들어 simplegit.rb 파일은 고친 부분이 두 군데이다. 그 중 하나를 추가하고 나머지는 그대로 두고 싶다. Git에서는 이런 작업도 매우 쉽게 할 수 있다. -대화형 프롬프트에서 `5`, `p`를(patch) 입력한다. +대화형 프롬프트에서 `5`, `p` 를(patch) 입력한다. 그러면 Git은 부분적으로 Staging Area에 추가할 파일이 있는지 묻는다. 파일을 선택하면 파일의 특정 부분을 Staging Area에 추가할 것인지 부분별로 구분하여 묻는다. [source,console] @@ -220,7 +220,7 @@ Stage this hunk [y,n,a,d,/,j,J,g,e,?]? You have a lot of options at this point. Typing `?` shows a list of what you can do: ////////////////////////// -여기에서 `?`를 입력하면 선택할 수 있는 명령을 설명해준다. +여기에서 `?` 를 입력하면 선택할 수 있는 명령을 설명해준다. [source,console] ---- @@ -244,7 +244,7 @@ e - manually edit the current hunk Generally, you’ll type `y` or `n` if you want to stage each hunk, but staging all of them in certain files or skipping a hunk decision until later can be helpful too. If you stage one part of the file and leave another part unstaged, your status output will look like this: ////////////////////////// -`y`나 `n`을 입력하면 각 부분을 Stage 할지 말지 결정할 수 있다. 하지만, 파일을 통째로 Stage 하거나 필요할 때까지 아예 그대로 남겨 두는 것이 다음부터 더 유용할지도 모른다. +`y` 나 `n` 을 입력하면 각 부분을 Stage 할지 말지 결정할 수 있다. 하지만, 파일을 통째로 Stage 하거나 필요할 때까지 아예 그대로 남겨 두는 것이 다음부터 더 유용할지도 모른다. 어쨌든 파일의 어떤 부분은 Stage 하고 다른 부분은 Unstaged 상태로 남겨놓고 status 명령으로 확인해보면 결과는 아래와 같다. [source,console] @@ -270,11 +270,11 @@ simplegit.rb 파일의 상태를 보자. ////////////////////////// You also don’t need to be in interactive add mode to do the partial-file staging – you can start the same script by using `git add -p` or `git add --patch` on the command line. ////////////////////////// -대화형 스크립트로만 파일 일부분을 Stage 할 수 있는 것은 아니다. `git add -p`나 `git add --patch`로도 같은 일을 할 수 있다. +대화형 스크립트로만 파일 일부분을 Stage 할 수 있는 것은 아니다. `git add -p` 나 `git add --patch` 로도 같은 일을 할 수 있다. ////////////////////////// Furthermore, you can use patch mode for partially resetting files with the `reset --patch` command, for checking out parts of files with the `checkout --patch` command and for stashing parts of files with the `stash save --patch` command. We'll go into more details on each of these as we get to more advanced usages of these commands. ////////////////////////// -`reset --patch` 명령을 사용해서 파일 일부만 Stage Area에서 내릴 수 있다. 또, `checkout --patch`를 사용해서 파일 일부를 다시 Checkout 받을 수 있다. `stash save --patch` 명령으로는 파일 일부만 Stash 할 수 있다. +`reset --patch` 명령을 사용해서 파일 일부만 Stage Area에서 내릴 수 있다. 또, `checkout --patch` 를 사용해서 파일 일부를 다시 Checkout 받을 수 있다. `stash save --patch` 명령으로는 파일 일부만 Stash 할 수 있다. 각 명령에 대해서 더 자세히 알아보자 diff --git a/book/07-git-tools/sections/replace.asc b/book/07-git-tools/sections/replace.asc index c5bbe962..c43f37c8 100644 --- a/book/07-git-tools/sections/replace.asc +++ b/book/07-git-tools/sections/replace.asc @@ -13,7 +13,7 @@ Git의 `replace` 명령은 "어떤 개체를 읽을 때 항상 다른 개체로 //////////////////// For example, let's say you have a huge code history and want to split your repository into one short history for new developers and one much longer and larger history for people interested in data mining. -You can graft one history onto the other by `replace`ing the earliest commit in the new line with the latest commit on the older one. +You can graft one history onto the other by `replace` ing the earliest commit in the new line with the latest commit on the older one. This is nice because it means that you don't actually have to rewrite every commit in the new history, as you would normally have to do to join them together (because the parentage effects the SHAs). //////////////////// 예를 들어 현재 프로젝트의 히스토리가 아주 방대한 상태다. 히스토리를 둘로 나누어서 새로 시작하는 개발자에게는 히스토리를 아주 간단한 몇 개의 커밋으로 만들어서 제공하고, 프로젝트 히스토리를 분석할 사람에게는 전체 히스토리를 제공하는 상황을 생각해보자. @@ -243,7 +243,7 @@ c1822cf first commit //////////////////// Cool, right? Without having to change all the SHA-1s upstream, we were able to replace one commit in our history with an entirely different commit and all the normal tools (`bisect`, `blame`, etc) will work how we would expect them to. //////////////////// -히스토리가 그럴듯하다. 연결한 네 번째 커밋 이후의 커밋을 재작성하지 않고도 `replace` 명령으로 간단하게 히스토리를 변경했다. 변경한 히스토리에서도 `bisect`나 `blame` 같은 다른 Git 명령을 사용할 수 있다. +히스토리가 그럴듯하다. 연결한 네 번째 커밋 이후의 커밋을 재작성하지 않고도 `replace` 명령으로 간단하게 히스토리를 변경했다. 변경한 히스토리에서도 `bisect` 나 `blame` 같은 다른 Git 명령을 사용할 수 있다. image::images/replace5.png[] @@ -268,7 +268,7 @@ fourth commit //////////////////// Remember that the actual parent of `81a708d` was our placeholder commit (`622e88e`), not `9c68fdce` as it states here. //////////////////// -Replace 이전 네 번째 커밋 `81a708d` 해시의 부모는 `622e88e` 해시이므로 위의 `9c68fdce`로 나오는 내용은 변경한 대상인 `c6e1e95` 해시의 내용이다. +Replace 이전 네 번째 커밋 `81a708d` 해시의 부모는 `622e88e` 해시이므로 위의 `9c68fdce` 로 나오는 내용은 변경한 대상인 `c6e1e95` 해시의 내용이다. //////////////////// Another interesting thing is that this data is kept in our references: diff --git a/book/07-git-tools/sections/rerere.asc b/book/07-git-tools/sections/rerere.asc index bb33e1f9..b078072e 100644 --- a/book/07-git-tools/sections/rerere.asc +++ b/book/07-git-tools/sections/rerere.asc @@ -67,7 +67,7 @@ end /////////////////// In one branch we change the word ``hello'' to ``hola'', then in another branch we change the ``world'' to ``mundo'', just like before. /////////////////// -이전 예제와 마찬가지로 한 브랜치에서는 ``hello''를 ``hola''로 바꿨다. 그리고 다른 브랜치에서는 ``world''를 ``mundo''로 바꿨다. +이전 예제와 마찬가지로 한 브랜치에서는 ``hello'' 를 ``hola'' 로 바꿨다. 그리고 다른 브랜치에서는 ``world'' 를 ``mundo'' 로 바꿨다. image::images/rerere1.png[] @@ -109,7 +109,7 @@ $ git status ---- /////////////////// -However, `git rerere` will also tell you what it has recorded the pre-merge state for with `git rerere status`: +However, `git rerere` will also tell you what it has recorded the pre-merge state for with `git rerere status` : /////////////////// `git rerere status` 명령으로 충돌 난 파일을 확인할 수 있다. @@ -184,7 +184,7 @@ $ git rerere diff /////////////////// So that basically says, when Git sees a hunk conflict in a `hello.rb` file that has ``hello mundo'' on one side and ``hola world'' on the other, it will resolve it to ``hola mundo''. /////////////////// -간단하게 말해서 Git은 `hello.rb` 파일에서 충돌이 발생했을 때 한쪽엔 ``hello mundo''이고 다른 한쪽에는 ``hola world''이면 이를 ``hola mundo''로 해결한다. +간단하게 말해서 Git은 `hello.rb` 파일에서 충돌이 발생했을 때 한쪽엔 ``hello mundo'' 이고 다른 한쪽에는 ``hola world'' 이면 이를 ``hola mundo'' 로 해결한다. /////////////////// Now we can mark it as resolved and commit it: diff --git a/book/07-git-tools/sections/reset.asc b/book/07-git-tools/sections/reset.asc index 18b53361..3bd35efc 100644 --- a/book/07-git-tools/sections/reset.asc +++ b/book/07-git-tools/sections/reset.asc @@ -10,7 +10,7 @@ These commands are two of the most confusing parts of Git when you first encount They do so many things, that it seems hopeless to actually understand them and employ them properly. For this, we recommend a simple metaphor. ////////////////////////// -Git의 다른 특별한 도구를 더 살펴보기 보기 전에 `reset`과 `checkout`에 대해 이야기를 해보자. +Git의 다른 특별한 도구를 더 살펴보기 보기 전에 `reset` 과 `checkout` 에 대해 이야기를 해보자. 이 두 명령은 Git을 처음 사용하는 사람을 가장 헷갈리게 하는 부분이다. 제대로 이해하고 사용할 수 없을 것으로 보일 정도로 많은 기능을 지녔다. 이해하기 쉽게 간단한 비유를 들어 설명해보자. @@ -25,7 +25,7 @@ An easier way to think about `reset` and `checkout` is through the mental frame By ``tree'' here we really mean ``collection of files'', not specifically the data structure. (There are a few cases where the index doesn't exactly act like a tree, but for our purposes it is easier to think about it this way for now.) ////////////////////////// -Git을 서로 다른 세 트리를 관리하는 컨텐츠 관리자로 생각하면 `reset`과 `checkout`을 좀 더 쉽게 이해할 수 있다. +Git을 서로 다른 세 트리를 관리하는 컨텐츠 관리자로 생각하면 `reset` 과 `checkout` 을 좀 더 쉽게 이해할 수 있다. 여기서 ``트리'' 란 실제로는 ``파일의 묶음'' 이다. 자료구조의 트리가 아니다 (세 트리 중 Index는 트리도 아니지만, 이해를 쉽게 하려고 일단 트리라고 한다). @@ -87,7 +87,7 @@ $ git ls-tree -r HEAD ////////////////////////// The `cat-file` and `ls-tree` commands are ``plumbing'' commands that are used for lower level things and not really used in day-to-day work, but they help us see what's going on here. ////////////////////////// -`cat-file`와 `ls-tree` 명령은 일상적으로는 잘 사용하지 않는 저수준 명령이다. 이런 저수준 명령을 ``plumbing'' 명령이라고 한다. Git이 실제로 무슨 일을 하는지 볼 때 유용하다. +`cat-file` 와 `ls-tree` 명령은 일상적으로는 잘 사용하지 않는 저수준 명령이다. 이런 저수준 명령을 ``plumbing'' 명령이라고 한다. Git이 실제로 무슨 일을 하는지 볼 때 유용하다. [[r_the_index]] ////////////////////////// @@ -174,7 +174,7 @@ Now we run `git init`, which will create a Git repository with a HEAD reference ////////////////////////// 이 과정을 시각화해보자. 파일이 하나 있는 디렉토리로 이동한다. 이걸 파일의 **v1**이라고 하고 파란색으로 표시한다. -`git init` 명령을 실행하면 Git 저장소가 생기고 HEAD는 아직 없는 브랜치를 가리킨다(`master`는 아직 없다). +`git init` 명령을 실행하면 Git 저장소가 생기고 HEAD는 아직 없는 브랜치를 가리킨다(`master` 는 아직 없다). image::images/reset-ex1.png[] @@ -193,7 +193,7 @@ image::images/reset-ex2.png[] ////////////////////////// Then we run `git commit`, which takes the contents of the Index and saves it as a permanent snapshot, creates a commit object which points to that snapshot, and updates `master` to point to that commit. ////////////////////////// -그리고 `git commit` 명령을 실행한다. 그러면 Index의 내용을 스냅샷으로 영구히 저장하고 그 스냅샷을 가리키는 커밋 객체를 만든다. 그리고는 `master`가 그 커밋 객체를 가리키도록 한다. +그리고 `git commit` 명령을 실행한다. 그러면 Index의 내용을 스냅샷으로 영구히 저장하고 그 스냅샷을 가리키는 커밋 객체를 만든다. 그리고는 `master` 가 그 커밋 객체를 가리키도록 한다. image::images/reset-ex3.png[] @@ -304,7 +304,7 @@ You could now update the Index and run `git commit` again to accomplish what `gi ////////////////////////// 이제 위의 다이어그램을 보고 어떤 일이 일어난 것인지 생각해보자. `reset` 명령은 가장 최근의 `git commit` 명령을 되돌린다. `git commit` 명령을 실행하면 Git은 새로운 커밋을 생성하고 HEAD가 가리키는 브랜치가 새로운 커밋을 가리키도록 업데이트한다. -`reset` 명령 뒤에 `HEAD~`(HEAD의 부모 커밋)를 주면 Index나 워킹 디렉토리는 그대로 놔두고 브랜치가 가리키는 커밋만 이전으로 되돌린다. +`reset` 명령 뒤에 `HEAD~` (HEAD의 부모 커밋)를 주면 Index나 워킹 디렉토리는 그대로 놔두고 브랜치가 가리키는 커밋만 이전으로 되돌린다. Index를 업데이트한 다음에 `git commit` 명령를 실행하면 `git commit --amend` 명령의 결과와 같아진다(<>를 참조). ////////////////////////// @@ -335,7 +335,7 @@ This is also the default, so if you specify no option at all (just `git reset HE Now take another second to look at that diagram and realize what happened: it still undid your last `commit`, but also _unstaged_ everything. You rolled back to before you ran all your `git add` and `git commit` commands. ////////////////////////// -위의 다이어그램을 보고 어떤 일이 일어날지 한 번 더 생각해보자. 가리키는 대상을 가장 최근의 `커밋`으로 되돌리는 것은 같다. 그러고 나서 _Staging Area_를 비우기까지 한다. +위의 다이어그램을 보고 어떤 일이 일어날지 한 번 더 생각해보자. 가리키는 대상을 가장 최근의 `커밋` 으로 되돌리는 것은 같다. 그러고 나서 _Staging Area_ 를 비우기까지 한다. `git commit` 명령도 되돌리고 `git add` 명령까지 되돌리는 것이다. ////////////////////////// @@ -357,7 +357,7 @@ So let's think about what just happened. You undid your last commit, the `git add` and `git commit` commands, *and* all the work you did in your working directory. ////////////////////////// 이 과정은 어떻게 동작하는지 가늠해보자. -`reset` 명령을 통해 `git add`와 `git commit` 명령으로 생성한 마지막 커밋을 되돌린다. *그리고* 워킹 디렉토리의 내용까지도 되돌린다. +`reset` 명령을 통해 `git add` 와 `git commit` 명령으로 생성한 마지막 커밋을 되돌린다. *그리고* 워킹 디렉토리의 내용까지도 되돌린다. ////////////////////////// It's important to note that this flag (`--hard`) is the only way to make the `reset` command dangerous, and one of the very few cases where Git will actually destroy data. @@ -366,7 +366,7 @@ In this particular case, we still have the *v3* version of our file in a commit ////////////////////////// 이 `--hard` 옵션은 매우 매우 중요하다. `reset` 명령을 위험하게 만드는 유일한 옵션이다. Git에는 데이터를 실제로 삭제하는 방법이 별로 없다. 이 삭제하는 방법은 그 중 하나다. `reset` 명령을 어떻게 사용하더라도 간단히 결과를 되돌릴 수 있다. 하지만 `--hard` 옵션은 되돌리는 것이 불가능하다. 이 옵션을 사용하면 워킹 디렉토리의 파일까지 강제로 덮어쓴다. -이 예제는 파일의 **v3**버전을 아직 Git이 커밋으로 보관하고 있기 때문에 `reflog`를 이용해서 다시 복원할 수 있다. 만약 커밋한 적 없다면 Git이 덮어쓴 데이터는 복원할 수 없다. +이 예제는 파일의 **v3**버전을 아직 Git이 커밋으로 보관하고 있기 때문에 `reflog` 를 이용해서 다시 복원할 수 있다. 만약 커밋한 적 없다면 Git이 덮어쓴 데이터는 복원할 수 없다. ////////////////////////// ===== Recap @@ -408,7 +408,7 @@ So, assume we run `git reset file.txt`. This form (since you did not specify a commit SHA-1 or branch, and you didn't specify `--soft` or `--hard`) is shorthand for `git reset --mixed HEAD file.txt`, which will: ////////////////////////// 예를 들어 `git reset file.txt` 명령을 실행한다고 가정하자. -이 형식은(커밋의 해시 값이나 브랜치도 표기하지 않고 `--soft`나 `--hard`도 표기하지 않은) `git reset --mixed HEAD file.txt`를 짧게 쓴 것이다. +이 형식은(커밋의 해시 값이나 브랜치도 표기하지 않고 `--soft` 나 `--hard` 도 표기하지 않은) `git reset --mixed HEAD file.txt` 를 짧게 쓴 것이다. ////////////////////////// 1. Move the branch HEAD points to _(skipped)_ @@ -478,7 +478,7 @@ Say you have a series of commits with messages like ``oops.'', ``WIP'' and ``for You can use `reset` to quickly and easily squash them into a single commit that makes you look really smart. (<> shows another way to do this, but in this example it's simpler to use `reset`.) ////////////////////////// -``oops.''나 ``WIP'', ``forgot this file'' 같은 깃털같이 가벼운 커밋들이 있다고 해보자. +``oops.'' 나 ``WIP'', ``forgot this file'' 같은 깃털같이 가벼운 커밋들이 있다고 해보자. 이럴 때는 `reset` 명령으로 커밋들을 하나로 합쳐서 남들에게 똑똑한 척할 수 있다. (<>를 하는 명령어가 따로 있지만, 여기서는 `reset` 명령을 쓰는 것이 더 간단할 때도 있다는 것을 보여준다.) @@ -556,7 +556,7 @@ If we run `git reset master`, `develop` itself will now point to the same commit If we instead run `git checkout master`, `develop` does not move, HEAD itself does. HEAD will now point to `master`. ////////////////////////// -예를 들어 각각 다른 커밋을 가리키는 `master`와 `develop` 브랜치가 있고 현재 워킹 디렉토리는 `develop` 브랜치라고 가정해보자(즉 HEAD는 `develop` 브랜치를 가리킨다). +예를 들어 각각 다른 커밋을 가리키는 `master` 와 `develop` 브랜치가 있고 현재 워킹 디렉토리는 `develop` 브랜치라고 가정해보자(즉 HEAD는 `develop` 브랜치를 가리킨다). `git reset master` 명령을 실행하면 `develop` 브랜치는 `master` 브랜치가 가리키는 커밋과 같은 커밋을 가리키게 된다. 반면 `git checkout master` 명령을 실행하면 `develop` 브랜치가 가리키는 커밋은 바뀌지 않고 HEAD가 `master` 브랜치를 가리키도록 업데이트된다. 이제 HEAD는 `master` 브랜치를 가리키게 된다. @@ -587,7 +587,7 @@ It would be exactly like `git reset --hard [branch] file` (if `reset` would let ////////////////////////// Also, like `git reset` and `git add`, `checkout` will accept a `--patch` option to allow you to selectively revert file contents on a hunk-by-hunk basis. ////////////////////////// -`git reset`이나 `git add` 명령처럼 `checkout` 명령도 `--patch` 옵션을 사용해서 Hunk 단위로 되돌릴 수 있다. +`git reset` 이나 `git add` 명령처럼 `checkout` 명령도 `--patch` 옵션을 사용해서 Hunk 단위로 되돌릴 수 있다. ////////////////////////// ==== Summary diff --git a/book/07-git-tools/sections/revision-selection.asc b/book/07-git-tools/sections/revision-selection.asc index f47cbe9c..9a798317 100644 --- a/book/07-git-tools/sections/revision-selection.asc +++ b/book/07-git-tools/sections/revision-selection.asc @@ -77,7 +77,7 @@ $ git show 1c002d Git can figure out a short, unique abbreviation for your SHA-1 values. If you pass `--abbrev-commit` to the `git log` command, the output will use shorter values but keep them unique; it defaults to using seven characters but makes them longer if necessary to keep the SHA-1 unambiguous: ////////////////////////// -`git log` 명령에 `--abbrev-commit`이라는 옵션을 추가하면 짧고 중복되지 않는 해시 값을 보여준다. 기본으로 7자를 보여주고 해시 값이 중복되는 경우 더 긴 해시 값을 보여준다. +`git log` 명령에 `--abbrev-commit` 이라는 옵션을 추가하면 짧고 중복되지 않는 해시 값을 보여준다. 기본으로 7자를 보여주고 해시 값이 중복되는 경우 더 긴 해시 값을 보여준다. [source,console] ---- @@ -149,11 +149,11 @@ SHA-1 값의 크기는 20 바이트(160비트)이다. ////////////////////////// The most straightforward way to specify a commit requires that it have a branch reference pointed at it. Then, you can use a branch name in any Git command that expects a commit object or SHA-1 value. -For instance, if you want to show the last commit object on a branch, the following commands are equivalent, assuming that the `topic1` branch points to `ca82a6d`: +For instance, if you want to show the last commit object on a branch, the following commands are equivalent, assuming that the `topic1` branch points to `ca82a6d` : ////////////////////////// 브랜치를 사용하는 것이 커밋을 나타내는 가장 쉬운 방법이다. 커밋 개체나 SHA-1 값이 필요한 곳이면 브랜치 이름을 사용할 수 있다. -만약 `topic1` 브랜치의 최근 커밋을 보고 싶으면 아래와 같이 실행한다. `topic1` 브랜치가 `ca82a6d`를 가리키고 있기 때문에 두 명령의 결과는 같다. +만약 `topic1` 브랜치의 최근 커밋을 보고 싶으면 아래와 같이 실행한다. `topic1` 브랜치가 `ca82a6d` 를 가리키고 있기 때문에 두 명령의 결과는 같다. [source,console] ---- @@ -167,8 +167,8 @@ You can see <> for more information about However, it can be helpful sometimes when you need to see what’s really going on. Here you can run `rev-parse` on your branch. ////////////////////////// -브랜치가 가리키는 개체의 SHA-1 값에 대한 궁금증은 `rev-parse`이라는 Plumbing 도구가 해결해 준다. -<>에서 이 뚫어뻥에 대해 시원하게 설명한다. 기본적으로 `rev-parse`은 저수준 명령이기 때문에 평소에는 전혀 필요하지 않다. +브랜치가 가리키는 개체의 SHA-1 값에 대한 궁금증은 `rev-parse` 이라는 Plumbing 도구가 해결해 준다. +<>에서 이 뚫어뻥에 대해 시원하게 설명한다. 기본적으로 `rev-parse` 은 저수준 명령이기 때문에 평소에는 전혀 필요하지 않다. 그래도 한번 사용해보고 어떤 결과가 나오는지 알아 두자. [source,console] @@ -189,9 +189,9 @@ One of the things Git does in the background while you’re working away is keep Git은 자동으로 브랜치와 HEAD가 지난 몇 달 동안에 가리켰었던 커밋을 모두 기록하는데 이 로그를 ``Reflog''라고 부른다. ////////////////////////// -You can see your reflog by using `git reflog`: +You can see your reflog by using `git reflog` : ////////////////////////// -`git reflog`를 실행하면 Reflog를 볼 수 있다. +`git reflog` 를 실행하면 Reflog를 볼 수 있다. [source,console] ---- @@ -237,7 +237,7 @@ This technique only works for data that’s still in your reflog, so you can’t 이 명령은 어제 master 브랜치가 가리키고 있던 것이 무엇인지 보여준다. Reflog에 남아있을 때만 조회할 수 있기 때문에 너무 오래된 커밋은 조회할 수 없다. ////////////////////////// -To see reflog information formatted like the `git log` output, you can run `git log -g`: +To see reflog information formatted like the `git log` output, you can run `git log -g` : ////////////////////////// `git log -g` 명령을 사용하면 `git reflog` 결과를 `git log` 명령과 같은 형태로 볼 수 있다. @@ -278,7 +278,7 @@ The other main way to specify a commit is via its ancestry. If you place a `^` at the end of a reference, Git resolves it to mean the parent of that commit. Suppose you look at the history of your project: ////////////////////////// -계통 관계로도 커밋을 표현할 수 있다. 이름 끝에 `^`를 붙이면 Git은 해당 커밋의 부모를 찾는다. 프로젝트 히스토리가 아래와 같을 때는 아래처럼 한다. +계통 관계로도 커밋을 표현할 수 있다. 이름 끝에 `^` 를 붙이면 Git은 해당 커밋의 부모를 찾는다. 프로젝트 히스토리가 아래와 같을 때는 아래처럼 한다. [source,console] ---- @@ -296,7 +296,7 @@ $ git log --pretty=format:'%h %s' --graph ////////////////////////// Then, you can see the previous commit by specifying `HEAD^`, which means ``the parent of HEAD'': ////////////////////////// -`HEAD^`는 바로 ``HEAD의 부모''를 의미하므로 바로 이전 커밋을 보여준다. +`HEAD^` 는 바로 ``HEAD의 부모'' 를 의미하므로 바로 이전 커밋을 보여준다. [source,console] ---- @@ -314,7 +314,7 @@ You can also specify a number after the `^` – for example, `d921970^2` means ` This syntax is only useful for merge commits, which have more than one parent. The first parent is the branch you were on when you merged, and the second is the commit on the branch that you merged in: ////////////////////////// -`^`뒤에 숫자도 사용할 수 있다. 예를 들어 `d921970^2`는 ``d921970의 두 번째 부모''를 의미한다. +`^` 뒤에 숫자도 사용할 수 있다. 예를 들어 `d921970^2` 는 ``d921970의 두 번째 부모'' 를 의미한다. 그래서 두 번째 부모가 있는 Merge 커밋에만 사용할 수 있다. 첫 번째 부모는 Merge 할 때 Checkout 했던 브랜치를 말하고 두 번째 부모는 Merge 한 대상 브랜치를 의미한다. @@ -342,10 +342,10 @@ The difference becomes apparent when you specify a number. `HEAD~2` means ``the first parent of the first parent,'' or ``the grandparent'' – it traverses the first parents the number of times you specify. For example, in the history listed earlier, `HEAD~3` would be ////////////////////////// -계통을 표현하는 방법으로 `~`라는 것도 있다. -`HEAD~`와 `HEAD^`는 똑같이 첫 번째 부모를 가리킨다. +계통을 표현하는 방법으로 `~` 라는 것도 있다. +`HEAD~` 와 `HEAD^` 는 똑같이 첫 번째 부모를 가리킨다. 하지만, 그 뒤에 숫자를 사용하면 달라진다. -`HEAD~2`는 명령을 실행할 시점의 ``첫 번째 부모의 첫 번째 부모'', 즉 ``조부모''를 가리킨다. 위의 예제에서 `HEAD~3`은 아래와 같다. +`HEAD~2` 는 명령을 실행할 시점의 ``첫 번째 부모의 첫 번째 부모'' , 즉 ``조부모'' 를 가리킨다. 위의 예제에서 `HEAD~3` 은 아래와 같다. [source,console] ---- @@ -360,7 +360,7 @@ Date: Fri Nov 7 13:47:59 2008 -0500 ////////////////////////// This can also be written `HEAD^^^`, which again is the first parent of the first parent of the first parent: ////////////////////////// -이것은 `HEAD^^^`와 같은 표현이다. 부모의 부모의 부모 즉 증조 부모쯤 되겠다. +이것은 `HEAD^^^` 와 같은 표현이다. 부모의 부모의 부모 즉 증조 부모쯤 되겠다. [source,console] ---- @@ -375,7 +375,7 @@ Date: Fri Nov 7 13:47:59 2008 -0500 ////////////////////////// You can also combine these syntaxes – you can get the second parent of the previous reference (assuming it was a merge commit) by using `HEAD~3^2`, and so on. ////////////////////////// -이 두 표현을 같이 사용할 수도 있다. 위의 예제에서 `HEAD~3^2`를 사용하면 증조부모의 Merge 커밋의 부모의 부모를 조회한다. +이 두 표현을 같이 사용할 수도 있다. 위의 예제에서 `HEAD~3^2` 를 사용하면 증조부모의 Merge 커밋의 부모의 부모를 조회한다. [[r_commit_ranges]] ////////////////////////// @@ -388,7 +388,7 @@ Now that you can specify individual commits, let’s see how to specify ranges o This is particularly useful for managing your branches – if you have a lot of branches, you can use range specifications to answer questions such as, ``What work is on this branch that I haven’t yet merged into my main branch?'' ////////////////////////// 커밋을 하나씩 조회할 수도 있지만, 범위를 주고 여러 커밋을 한꺼번에 조회할 수도 있다. -범위를 사용하여 조회할 수 있으면 브랜치를 관리할 때 유용하다. 상당히 많은 브랜치를 가지고 있고 ``왜 이 브랜치들은 아직도 주 브랜치에 Merge도 안 되고 뭐임?''라는 의문이 들면 범위를 주고 어떤 브랜치인지 쉽게 찾을 수 있다. +범위를 사용하여 조회할 수 있으면 브랜치를 관리할 때 유용하다. 상당히 많은 브랜치를 가지고 있고 ``왜 이 브랜치들은 아직도 주 브랜치에 Merge도 안 되고 뭐임?'' 라는 의문이 들면 범위를 주고 어떤 브랜치인지 쉽게 찾을 수 있다. ===== Double Dot @@ -414,8 +414,8 @@ You want to see what is in your experiment branch that hasn’t yet been merged You can ask Git to show you a log of just those commits with `master..experiment` – that means ``all commits reachable by experiment that aren’t reachable by master.'' For the sake of brevity and clarity in these examples, I’ll use the letters of the commit objects from the diagram in place of the actual log output in the order that they would display: ////////////////////////// -experiment 브랜치의 커밋들 중에서 아직 master 브랜치에 Merge 하지 않은 것들만 보고 싶으면 `master..experiment`라고 사용한다. -이 표현은 ``master에는 없지만, experiment에는 있는 커밋''을 의미한다. +experiment 브랜치의 커밋들 중에서 아직 master 브랜치에 Merge 하지 않은 것들만 보고 싶으면 `master..experiment` 라고 사용한다. +이 표현은 ``master에는 없지만, experiment에는 있는 커밋'' 을 의미한다. 여기에서는 설명을 쉽게 하려고 실제 조회 결과가 아니라 <>의 문자를 사용한다. [source,console] @@ -427,10 +427,10 @@ C ////////////////////////// If, on the other hand, you want to see the opposite – all commits in `master` that aren’t in `experiment` – you can reverse the branch names. -`experiment..master` shows you everything in `master` not reachable from `experiment`: +`experiment..master` shows you everything in `master` not reachable from `experiment` : ////////////////////////// -반대로 `experiment`에는 없고 `master`에만 있는 커밋이 궁금하면 브랜치 순서를 거꾸로 사용한다. -`experiment..master`는 `experiment`에는 없고 `master`에만 있는 것을 알려준다. +반대로 `experiment` 에는 없고 `master` 에만 있는 커밋이 궁금하면 브랜치 순서를 거꾸로 사용한다. +`experiment..master` 는 `experiment` 에는 없고 `master` 에만 있는 것을 알려준다. [source,console] ---- @@ -458,9 +458,9 @@ You can also leave off one side of the syntax to have Git assume HEAD. For example, you can get the same results as in the previous example by typing `git log origin/master..` – Git substitutes HEAD if one side is missing. ////////////////////////// 이 명령은 `origin` 저장소의 `master` 브랜치에는 없고 현재 Checkout 중인 브랜치에만 있는 커밋을 보여준다. -Checkout 한 브랜치가 `origin/master`라면 `git log origin/master..HEAD`가 보여주는 커밋이 Push 하면 서버에 전송될 커밋들이다. +Checkout 한 브랜치가 `origin/master` 라면 `git log origin/master..HEAD` 가 보여주는 커밋이 Push 하면 서버에 전송될 커밋들이다. 그리고 한쪽의 Refs를 생략하면 Git은 HEAD라고 가정하기 때문에 -`git log origin/master..`는 `git log origin/master..HEAD`와 같다. +`git log origin/master..` 는 `git log origin/master..HEAD` 와 같다. ////////////////////////// ===== Multiple Points @@ -472,8 +472,8 @@ The double-dot syntax is useful as a shorthand; but perhaps you want to specify Git allows you to do this by using either the `^` character or `--not` before any reference from which you don’t want to see reachable commits. Thus these three commands are equivalent: ////////////////////////// -Double Dot은 간단하고 유용하지만 두 개 이상의 브랜치에는 사용할 수 없다. 그러니까 현재 작업 중인 브랜치에는 있지만 다른 여러 브랜치에는 없는 커밋을 보고 싶으면 `..`으로는 확인할 수 없다. -Git은 `^`이나 `--not` 옵션 뒤에 브랜치 이름을 넣으면 그 브랜치에 없는 커밋을 찾아준다. +Double Dot은 간단하고 유용하지만 두 개 이상의 브랜치에는 사용할 수 없다. 그러니까 현재 작업 중인 브랜치에는 있지만 다른 여러 브랜치에는 없는 커밋을 보고 싶으면 `..` 으로는 확인할 수 없다. +Git은 `^` 이나 `--not` 옵션 뒤에 브랜치 이름을 넣으면 그 브랜치에 없는 커밋을 찾아준다. 아래의 명령 세 가지는 모두 같은 명령이다. [source,console] @@ -488,7 +488,7 @@ This is nice because with this syntax you can specify more than two references i For instance, if you want to see all commits that are reachable from `refA` or `refB` but not from `refC`, you can type one of these: ////////////////////////// 이 옵션들은 Double Dot으로는 할 수 없는, 세 개 이상의 Refs에 사용할 수 있는 장점이 있다. -예를 들어 `refA`나 `refB`에는 있지만 `refC`에는 없는 커밋을 보려면 아래 중 한 명령을 사용한다. +예를 들어 `refA` 나 `refB` 에는 있지만 `refC` 에는 없는 커밋을 보려면 아래 중 한 명령을 사용한다. [source,console] ---- @@ -511,7 +511,7 @@ If you want to see what is in `master` or `experiment` but not any common refere ////////////////////////// Triple Dot은 양쪽에 있는 두 Refs 사이에서 공통으로 가지는 것을 제외하고 서로 다른 커밋만 보여준다. <>의 커밋 히스토리를 다시 보자. -만약 `master`와 `experiment`의 공통부분은 빼고 다른 커밋만 보고 싶으면 아래와 같이 하면 된다. +만약 `master` 와 `experiment` 의 공통부분은 빼고 다른 커밋만 보고 싶으면 아래와 같이 하면 된다. [source,console] ---- diff --git a/book/07-git-tools/sections/rewriting-history.asc b/book/07-git-tools/sections/rewriting-history.asc index 8a04eca9..629aab22 100644 --- a/book/07-git-tools/sections/rewriting-history.asc +++ b/book/07-git-tools/sections/rewriting-history.asc @@ -87,7 +87,7 @@ You must indicate how far back you want to rewrite commits by telling the comman For example, if you want to change the last three commit messages, or any of the commit messages in that group, you supply as an argument to `git rebase -i` the parent of the last commit you want to edit, which is `HEAD~2^` or `HEAD~3`. It may be easier to remember the `~3` because you’re trying to edit the last three commits; but keep in mind that you’re actually designating four commits ago, the parent of the last commit you want to edit: ////////////////////////// -마지막 커밋 메시지 세 개를 모두 수정하거나 그 중 몇 개를 수정하는 시나리오를 살펴보자. `git rebase -i`의 인자로 편집하려는 마지막 커밋의 부모를 `HEAD~2^`나 `HEAD~3`로 해서 넘긴다. +마지막 커밋 메시지 세 개를 모두 수정하거나 그 중 몇 개를 수정하는 시나리오를 살펴보자. `git rebase -i` 의 인자로 편집하려는 마지막 커밋의 부모를 `HEAD~2^`나 `HEAD~3`로 해서 넘긴다. 마지막 세 개의 커밋을 수정하는 것이기 때문에 `~3`이 좀 더 기억하기 쉽다. 그렇지만, 실질적으로 가리키게 되는 것은 수정하려는 커밋의 부모인 네 번째 이전 커밋이다. [source,console] @@ -164,7 +164,7 @@ To do so, change the word `pick' to the word `edit' for each of the commits you For example, to modify only the third commit message, you change the file to look like this: ////////////////////////// 특정 커밋에서 실행을 멈추게 하려면 스크립트를 수정해야 한다. -`pick`이라는 단어를 'edit'로 수정하면 그 커밋에서 멈춘다. +`pick` 이라는 단어를 'edit'로 수정하면 그 커밋에서 멈춘다. 가장 오래된 커밋 메시지를 수정하려면 아래와 같이 편집한다. [source,console] @@ -259,7 +259,7 @@ pick f7f3f6d changed my name a bit When you save and exit the editor, Git rewinds your branch to the parent of these commits, applies `310154e` and then `f7f3f6d`, and then stops. You effectively change the order of those commits and remove the ``added cat-file'' commit completely. ////////////////////////// -수정한 내용을 저장하고 편집기를 종료하면 Git은 브랜치를 이 커밋의 부모로 이동시키고서 `310154e`와 `f7f3f6d`를 순서대로 적용한다. +수정한 내용을 저장하고 편집기를 종료하면 Git은 브랜치를 이 커밋의 부모로 이동시키고서 `310154e` 와 `f7f3f6d` 를 순서대로 적용한다. 명령이 끝나고 나면 커밋 순서가 변경됐고 ``added cat-file'' 커밋이 제거된 것을 확인할 수 있다. [[r_squashing]] @@ -362,9 +362,9 @@ There, you can do a mixed reset of that commit with `git reset HEAD^`, which eff Now you can stage and commit files until you have several commits, and run `git rebase --continue` when you’re done: ////////////////////////// 저장하고 나서 명령 프롬프트로 넘어간 다음에 그 커밋을 해제하고 그 내용을 다시 두 개로 나눠서 커밋하면 된다. -저장하고 편집기를 종료하면 Git은 제일 오래된 커밋의 부모로 이동하고서 `f7f3f6d`과 `310154e`을 처리하고 콘솔 프롬프트를 보여준다. +저장하고 편집기를 종료하면 Git은 제일 오래된 커밋의 부모로 이동하고서 `f7f3f6d` 과 `310154e` 을 처리하고 콘솔 프롬프트를 보여준다. 여기서 커밋을 해제하는 `git reset HEAD^` 라는 명령으로 커밋을 해제한다. 그러면 수정했던 파일은 Unstaged 상태가 된다. -그다음에 파일을 Stage 한 후 커밋하는 일을 원하는 만큼 반복하고 나서 `git rebase --continue`라는 명령을 실행하면 남은 Rebase 작업이 끝난다. +그다음에 파일을 Stage 한 후 커밋하는 일을 원하는 만큼 반복하고 나서 `git rebase --continue` 라는 명령을 실행하면 남은 Rebase 작업이 끝난다. [source,console] ---- @@ -407,9 +407,9 @@ However, it can be very useful. You’ll learn a few of the common uses so you can get an idea of some of the things it’s capable of. ////////////////////////// 수정해야 하는 커밋이 너무 많아서 Rebase 스크립트로 수정하기 어려울 것 같으면 다른 방법을 사용하는 것이 좋다. 모든 커밋의 이메일 주소를 변경하거나 어떤 파일을 삭제하는 경우를 살펴보자. -`filter-branch`라는 명령으로 수정할 수 있는데 Rebase가 삽이라면 이 명령은 포크레인이라고 할 수 있다. `filter-branch`도 역시 수정하려는 커밋이 이미 공개돼서 다른 사람과 함께 공유하는 중이라면 사용하지 말아야 한다. +`filter-branch` 라는 명령으로 수정할 수 있는데 Rebase가 삽이라면 이 명령은 포크레인이라고 할 수 있다. `filter-branch` 도 역시 수정하려는 커밋이 이미 공개돼서 다른 사람과 함께 공유하는 중이라면 사용하지 말아야 한다. 하지만, 잘 쓰면 꽤 유용하다. -`filter-branch`가 유용한 경우를 예로 들어 설명하기 때문에 여기에서 대충 어떤 경우에 유용할지 배울 수 있다. +`filter-branch` 가 유용한 경우를 예로 들어 설명하기 때문에 여기에서 대충 어떤 경우에 유용할지 배울 수 있다. [[r_removing_file_every_commit]] ////////////////////////// @@ -422,12 +422,12 @@ This occurs fairly commonly. Someone accidentally commits a huge binary file with a thoughtless `git add .`, and you want to remove it everywhere. Perhaps you accidentally committed a file that contained a password, and you want to make your project open source. `filter-branch` is the tool you probably want to use to scrub your entire history. -To remove a file named `passwords.txt` from your entire history, you can use the `--tree-filter` option to `filter-branch`: +To remove a file named `passwords.txt` from your entire history, you can use the `--tree-filter` option to `filter-branch` : ////////////////////////// 갑자기 누군가 생각 없이 `git add .` 같은 명령을 실행해서 공룡 똥 덩어리를 커밋했거나 실수로 암호가 포함된 파일을 커밋해서 이런 파일을 다시 삭제해야 하는 상황을 살펴보자. 이런 상황은 생각보다 자주 발생한다. -`filter-branch`는 히스토리 전체에서 필요한 것만 골라내는 데 사용하는 도구다. -`filter-branch`의 `--tree-filter`라는 옵션을 사용하면 히스토리에서 `passwords.txt` 파일을 아예 제거할 수 있다. +`filter-branch` 는 히스토리 전체에서 필요한 것만 골라내는 데 사용하는 도구다. +`filter-branch` 의 `--tree-filter` 라는 옵션을 사용하면 히스토리에서 `passwords.txt` 파일을 아예 제거할 수 있다. [source,console] ---- @@ -443,7 +443,7 @@ If you want to remove all accidentally committed editor backup files, you can ru ////////////////////////// `--tree-filter` 옵션은 프로젝트를 Checkout 한 후에 각 커밋에 명시한 명령을 실행시키고 그 결과를 다시 커밋한다. 이 경우에는 각 스냅샷에 `passwords.txt` 파일이 있으면 그 파일을 삭제한다. -실수로 편집기의 백업파일을 커밋했으면 `git filter-branch --tree-filter 'rm -f *~' HEAD`라고 실행해서 삭제할 수 있다. +실수로 편집기의 백업파일을 커밋했으면 `git filter-branch --tree-filter 'rm -f *~' HEAD` 라고 실행해서 삭제할 수 있다. ////////////////////////// You’ll be able to watch Git rewriting trees and commits and then move the branch pointer at the end. @@ -488,9 +488,9 @@ Git은 입력한 디렉토리와 관련이 없는 커밋을 자동으로 삭제 ////////////////////////// Another common case is that you forgot to run `git config` to set your name and email address before you started working, or perhaps you want to open-source a project at work and change all your work email addresses to your personal address. In any case, you can change email addresses in multiple commits in a batch with `filter-branch` as well. -You need to be careful to change only the email addresses that are yours, so you use `--commit-filter`: +You need to be careful to change only the email addresses that are yours, so you use `--commit-filter` : ////////////////////////// -프로젝트를 오픈소스로 공개할 때 아마도 회사 이메일 주소로 커밋된 것을 개인 이메일 주소로 변경해야 한다. 아니면 아예 `git config`로 이름과 이메일 주소를 설정하는 것을 잊었을 수도 있다. +프로젝트를 오픈소스로 공개할 때 아마도 회사 이메일 주소로 커밋된 것을 개인 이메일 주소로 변경해야 한다. 아니면 아예 `git config` 로 이름과 이메일 주소를 설정하는 것을 잊었을 수도 있다. 자신의 이메일 주소만 변경하도록 조심해야 한다. `filter-branch` 명령의 `--commit-filter` 옵션을 사용하여 해당 커밋만 골라서 이메일 주소를 수정할 수 있다. diff --git a/book/07-git-tools/sections/searching.asc b/book/07-git-tools/sections/searching.asc index b959bcd9..e14a6ef1 100644 --- a/book/07-git-tools/sections/searching.asc +++ b/book/07-git-tools/sections/searching.asc @@ -53,7 +53,7 @@ There are a number of interesting options you can provide the `grep` command. ////////////////////////// For instance, instead of the previous call, you can have Git summarize the output by just showing you which files matched and how many matches there were in each file with the `--count` option: ////////////////////////// -예를 들어 위의 결과 대신 어떤 파일에서 몇 개나 찾았는지만 알고 싶다면 `--count`옵션을 이용한다. +예를 들어 위의 결과 대신 어떤 파일에서 몇 개나 찾았는지만 알고 싶다면 `--count` 옵션을 이용한다. [source,console] ---- @@ -66,7 +66,7 @@ git-compat-util.h:2 ---- ////////////////////////// -If you want to see what method or function it thinks it has found a match in, you can pass `-p`: +If you want to see what method or function it thinks it has found a match in, you can pass `-p` : ////////////////////////// 매칭되는 라인이 있는 함수나 메서드를 찾고 싶다면 `-p` 옵션을 준다. @@ -94,7 +94,7 @@ For instance, let's look for any lines that define a constant with either the st ////////////////////////// Here we'll also use the `--break` and `--heading` options which help split up the output into a more readable format. ////////////////////////// -`--break`와 `--heading` 옵션을 붙여 더 읽기 쉬운 형태로 잘라서 출력할 수도 있다. +`--break` 와 `--heading` 옵션을 붙여 더 읽기 쉬운 형태로 잘라서 출력할 수도 있다. [source,console] ---- @@ -155,7 +155,7 @@ ef49a7a zlib: zlib can only process 4GB at a time ////////////////////////// If we look at the diff of those commits we can see that in `ef49a7a` the constant was introduced and in `e01503b` it was modified. ////////////////////////// -위 두 커밋의 변경 사항을 살펴보면 `ef49a7a`에서 `ZLIB_BUF_MAX` 상수가 처음 나오고 `e01503b` 에서는 변경된 것을 알 수 있다. +위 두 커밋의 변경 사항을 살펴보면 `ef49a7a` 에서 `ZLIB_BUF_MAX` 상수가 처음 나오고 `e01503b` 에서는 변경된 것을 알 수 있다. ////////////////////////// If you need to be more specific, you can provide a regular expression to search for with the `-G` option. @@ -174,7 +174,7 @@ It is called with the `-L` option to `git log` and will show you the history of ////////////////////////// 진짜 미친 듯이 좋은 로그 검색 도구가 또 있다. 라인 히스토리 검색이다. 비교적 최근에 추가된 기능이어서 잘 알려지진 않았지만, 진짜 좋다. -`git log`를 쓸 때 `-L` 옵션을 붙이면 어떤 함수나 한 라인의 히스토리를 볼 수 있다. +`git log` 를 쓸 때 `-L` 옵션을 붙이면 어떤 함수나 한 라인의 히스토리를 볼 수 있다. ////////////////////////// For example, if we wanted to see every change made to the function `git_deflate_bound` in the `zlib.c` file, we could run `git log -L :git_deflate_bound:zlib.c`. diff --git a/book/07-git-tools/sections/signing.asc b/book/07-git-tools/sections/signing.asc index 99c7c627..ec894361 100644 --- a/book/07-git-tools/sections/signing.asc +++ b/book/07-git-tools/sections/signing.asc @@ -44,7 +44,7 @@ gpg --gen-key ////////////////////////// Once you have a private key to sign with, you can configure Git to use it for signing things by setting the `user.signingkey` config setting. ////////////////////////// -서명에 사용할 수 있는 개인키가 이미 있다면 Git 설정 중에 `user.signingkey`로 설정해서 사용할 수 있다. +서명에 사용할 수 있는 개인키가 이미 있다면 Git 설정 중에 `user.signingkey` 로 설정해서 사용할 수 있다. [source,console] ---- @@ -63,10 +63,10 @@ Now Git will use your key by default to sign tags and commits if you want. ////////////////////////// If you have a GPG private key setup, you can now use it to sign new tags. -All you have to do is use `-s` instead of `-a`: +All you have to do is use `-s` instead of `-a` : ////////////////////////// GPG 개인키 설정을 마쳤으면 새로 만드는 태그들에 서명할 수 있다. -서명하려면 `-a` 대신 `-s`만 쓰면 된다. +서명하려면 `-a` 대신 `-s` 만 쓰면 된다. [source,console] ---- @@ -199,7 +199,7 @@ Date: Wed Jun 4 19:49:17 2014 -0700 ////////////////////////// Additionally, you can configure `git log` to check any signatures it finds and list them in its output with the `%G?` format. ////////////////////////// -`git log`로 출력한 로그에서 커밋에 대한 서명 정보를 알려면 `%G?` 포맷을 이용한다. +`git log` 로 출력한 로그에서 커밋에 대한 서명 정보를 알려면 `%G?` 포맷을 이용한다. [source,console] ---- diff --git a/book/07-git-tools/sections/stashing-cleaning.asc b/book/07-git-tools/sections/stashing-cleaning.asc index bd3e3aed..7c1138c9 100644 --- a/book/07-git-tools/sections/stashing-cleaning.asc +++ b/book/07-git-tools/sections/stashing-cleaning.asc @@ -11,7 +11,7 @@ The answer to this issue is the `git stash` command. ////////////////////////// 당신이 어떤 프로젝트에서 한 부분을 담당하고 있다고 하자. 그리고 여기에서 뭔가 작업하던 일이 있고 다른 요청이 들어와서 잠시 브랜치를 변경해야 할 일이 생겼다고 치자. 그런데 이런 상황에서 아직 완료하지 않은 일을 커밋하는 것이 껄끄럽다는 것이 문제다. 커밋하지 않고 나중에 다시 돌아와서 작업을 다시 하고 싶을 것이다. -이 문제는 `git stash`라는 명령으로 해결할 수 있다. +이 문제는 `git stash` 라는 명령으로 해결할 수 있다. ////////////////////////// Stashing takes the dirty state of your working directory – that is, your modified tracked files and staged changes – and saves it on a stack of unfinished changes that you can reapply at any time. @@ -47,10 +47,10 @@ Changes not staged for commit: ////////////////////////// Now you want to switch branches, but you don’t want to commit what you’ve been working on yet; so you’ll stash the changes. -To push a new stash onto your stack, run `git stash` or `git stash save`: +To push a new stash onto your stack, run `git stash` or `git stash save` : ////////////////////////// 이제 브랜치를 변경해 보자. 아직 작업 중인 파일은 커밋할 게 아니라서 모두 Stash 한다. -`git stash`나 `git stash save`를 실행하면 스택에 새로운 Stash가 만들어진다. +`git stash` 나 `git stash save` 를 실행하면 스택에 새로운 Stash가 만들어진다. [source,console] ---- @@ -75,10 +75,10 @@ nothing to commit, working directory clean ////////////////////////// At this point, you can easily switch branches and do work elsewhere; your changes are stored on your stack. -To see which stashes you’ve stored, you can use `git stash list`: +To see which stashes you’ve stored, you can use `git stash list` : ////////////////////////// 이제 아무 브랜치나 골라서 쉽게 바꿀 수 있다. 수정하던 것을 스택에 저장했다. -아래와 같이 `git stash list`를 사용하여 저장한 Stash를 확인한다. +아래와 같이 `git stash list` 를 사용하여 저장한 Stash를 확인한다. [source,console] ---- @@ -95,7 +95,7 @@ If you want to apply one of the older stashes, you can specify it by naming it, If you don’t specify a stash, Git assumes the most recent stash and tries to apply it: ////////////////////////// Stash 두 개는 원래 있었다. 그래서 현재 총 세 개의 Stash를 사용할 수 있다. -이제 `git stash apply`를 사용하여 Stash를 다시 적용할 수 있다. `git stash` 명령을 실행하면 Stash를 다시 적용하는 방법도 알려줘서 편리하다. +이제 `git stash apply` 를 사용하여 Stash를 다시 적용할 수 있다. `git stash` 명령을 실행하면 Stash를 다시 적용하는 방법도 알려줘서 편리하다. `git stash apply stash@{2}`처럼 Stash 이름을 입력하면 골라서 적용할 수 있다. 이름이 없으면 Git은 가장 최근의 Stash를 적용한다. @@ -169,7 +169,7 @@ Dropped stash@{0} (364e91f3f268f0900bc3ee613f9f733e82aaed43) ////////////////////////// You can also run `git stash pop` to apply the stash and then immediately drop it from your stack. ////////////////////////// -그리고 `git stash pop`이라는 명령도 있는데 이 명령은 Stash를 적용하고 나서 바로 스택에서 제거해준다. +그리고 `git stash pop` 이라는 명령도 있는데 이 명령은 Stash를 적용하고 나서 바로 스택에서 제거해준다. ////////////////////////// ==== Creative Stashing @@ -182,7 +182,7 @@ The first option that is quite popular is the `--keep-index` option to the `stas This tells Git to not stash anything that you've already staged with the `git add` command. ////////////////////////// Stash를 만드는 방법은 여러 가지다. -주로 사용하는 옵션으로 `stash save` 명령과 같이 쓰는 `--keep-index`이다. +주로 사용하는 옵션으로 `stash save` 명령과 같이 쓰는 `--keep-index` 이다. 이 옵션을 이용하면 이미 Staging Area에 들어 있는 파일을 Stash 하지 않는다. ////////////////////////// @@ -210,8 +210,8 @@ By default, `git stash` will only store files that are already in the index. If you specify `--include-untracked` or `-u`, Git will also stash any untracked files you have created. ////////////////////////// 추적하지 않는 파일과 추적 중인 파일을 같이 Stash 하는 일도 꽤 빈번하다. -기본적으로 `git stash`는 추적 중인 파일만 저장한다. -추적 중이지 않은 파일을 같이 저장하려면 Stash 명령을 사용할 때 `--include-untracked`나 `-u` 옵션을 붙여준다. +기본적으로 `git stash` 는 추적 중인 파일만 저장한다. +추적 중이지 않은 파일을 같이 저장하려면 Stash 명령을 사용할 때 `--include-untracked` 나 `-u` 옵션을 붙여준다. [source,console] ---- @@ -328,7 +328,7 @@ Assuming you do want to remove cruft files or clean your working directory, you To remove all the untracked files in your working directory, you can run `git clean -f -d`, which removes any files and also any subdirectories that become empty as a result. The `-f` means 'force' or "really do this". ////////////////////////// -워킹 디렉토리의 불필요한 파일들을 전부 지우려면 `git clean`을 사용한다. +워킹 디렉토리의 불필요한 파일들을 전부 지우려면 `git clean` 을 사용한다. 추적 중이지 않은 모든 정보를 워킹 디렉토리에서 지우고 싶다면 `git clean -f -d` 명령을 사용하자. 이 명령은 하위 디렉토리까지 모두 지워버린다. `-f` 옵션은 강제(force)의 의미이며 "진짜로 그냥 해라"라는 뜻이다. @@ -350,7 +350,7 @@ Any file that matches a pattern in your `.gitignore` or other ignore files will If you want to remove those files too, such as to remove all `.o` files generated from a build so you can do a fully clean build, you can add a `-x` to the clean command. ////////////////////////// `git clean` 명령은 추적 중이지 않은 파일만 지우는 게 기본 동작이다. -`.gitignore`에 명시했거나 해서 무시되는 파일은 지우지 않는다. 무시된 파일까지 함께 지우려면 `-x` 옵션이 필요하다. +`.gitignore` 에 명시했거나 해서 무시되는 파일은 지우지 않는다. 무시된 파일까지 함께 지우려면 `-x` 옵션이 필요하다. 그래서 `.o` 파일 같은 빌드 파일까지도 지울 수 있다. [source,console] @@ -374,7 +374,7 @@ Would remove tmp/ If you don't know what the `git clean` command is going to do, always run it with a `-n` first to double check before changing the `-n` to a `-f` and doing it for real. The other way you can be careful about the process is to run it with the `-i` or ``interactive'' flag. ////////////////////////// -`git clean`이 무슨 짓을 할지 확신이 안들 때는 항상 `-n` 옵션을 붙여서 먼저 실행해보자. +`git clean` 이 무슨 짓을 할지 확신이 안들 때는 항상 `-n` 옵션을 붙여서 먼저 실행해보자. clean 명령을 대화형으로 실행하려면 `-i` 옵션을 붙이면 된다. ////////////////////////// diff --git a/book/07-git-tools/sections/submodules.asc b/book/07-git-tools/sections/submodules.asc index 4508ab08..fcee86d4 100644 --- a/book/07-git-tools/sections/submodules.asc +++ b/book/07-git-tools/sections/submodules.asc @@ -137,7 +137,7 @@ URL을 상대경로로 적을 수 있으면 상대경로를 사용하는 것이 The other listing in the `git status` output is the project folder entry. If you run `git diff` on that, you see something interesting: ////////////////////////// -`.gitmodules`은 살펴봤고 이제 프로젝트 폴더에 대해 살펴보자. +`.gitmodules` 은 살펴봤고 이제 프로젝트 폴더에 대해 살펴보자. `git diff` 명령을 실행시키면 흥미로운 점을 발견할 수 있다. [source,console] @@ -162,7 +162,7 @@ Git은 `DbConnector` 디렉토리를 서브모듈로 취급하기 때문에 해 /////////// If you want a little nicer diff output, you can pass the `--submodule` option to `git diff`. /////////// -`git diff`에 `--submodule` 옵션을 더하면 서브모듈에 대해 더 자세히 나온다. +`git diff` 에 `--submodule` 옵션을 더하면 서브모듈에 대해 더 자세히 나온다. [source,console] ---- @@ -347,7 +347,7 @@ Now if you go back into the main project and run `git diff --submodule` you can If you don't want to type `--submodule` every time you run `git diff`, you can set it as the default format by setting the `diff.submodule` config value to ``log''. /////////// 메인 프로젝트로 돌아와서 `git diff --submodule` 명령을 실행하면 업데이트된 서브모듈과 각 서브모듈에 추가된 커밋을 볼 수 있다. -매번 `--submodule` 옵션을 쓰고 싶지 않다면 `diff.submodule`의 값을 ``log''로 설정하면 된다. +매번 `--submodule` 옵션을 쓰고 싶지 않다면 `diff.submodule` 의 값을 ``log''로 설정하면 된다. [source,console] ---- @@ -599,7 +599,7 @@ Submodule path 'DbConnector': merged in '92c7337b30ef9e0893e758dac2459d07362ab5e If we go into the DbConnector directory, we have the new changes already merged into our local `stable` branch. Now let's see what happens when we make our own local change to the library and someone else pushes another change upstream at the same time. /////////// -DbConnector 디렉토리로 들어가면 새로 수정한 내용이 로컬 브랜치 `stable`에 이미 Merge 된 것을 확인할 수 있다. +DbConnector 디렉토리로 들어가면 새로 수정한 내용이 로컬 브랜치 `stable` 에 이미 Merge 된 것을 확인할 수 있다. 이제 다른 사람이 DbConnector 라이브러리를 수정해서 Upstream 저장소에 Push 한 상태에서 우리가 DbConnector 라이브러리를 수정하면 무슨 일이 일어나는지 살펴보자. [source,console] @@ -638,7 +638,7 @@ Submodule path 'DbConnector': checked out '5d60ef9bbebf5a0c1c1050f242ceeb54ad58d /////////// If this happens, don't worry, you can simply go back into the directory and check out your branch again (which will still contain your work) and merge or rebase `origin/stable` (or whatever remote branch you want) manually. /////////// -일이 이렇게 되더라도 문제가 안 된다. Reset이 된 서브모듈 디렉토리로 가서 작업하던 브랜치를 Checkout 하고 직접 `origin/stable`(아니면 원하는 어떠한 리모트 브랜치든)을 Merge 하거나 Rebase 하면 된다. +일이 이렇게 되더라도 문제가 안 된다. Reset이 된 서브모듈 디렉토리로 가서 작업하던 브랜치를 Checkout 하고 직접 `origin/stable` (아니면 원하는 어떠한 리모트 브랜치든)을 Merge 하거나 Rebase 하면 된다. /////////// If you haven't committed your changes in your submodule and you run a submodule update that would cause issues, Git will fetch the changes but not overwrite unsaved work in your submodule directory. @@ -869,7 +869,7 @@ SHA 해시 값을 명시하여 곧바로 Merge 할 수도 있고 대상이 되 /////////// So, we will go into our submodule directory, create a branch based on that second SHA-1 from `git diff` and manually merge. /////////// -문제를 해결하기 위해 서브모듈 디렉토리로 이동해서 `git diff`에서 나온 두 번째 SHA를 브랜치로 만들고 직접 Merge 한다. +문제를 해결하기 위해 서브모듈 디렉토리로 이동해서 `git diff` 에서 나온 두 번째 SHA를 브랜치로 만들고 직접 Merge 한다. [source,console] ---- @@ -1268,7 +1268,7 @@ Then, when you switch back, you get an empty `CryptoLibrary` directory for some You may need to go into your submodule directory and run a `git checkout .` to get all your files back. You could run this in a `submodule foreach` script to run it for multiple submodules. ////////////////////////// -후에 다시 서브모듈을 추가했던 브랜치로 Checkout 하면 서브모듈 디렉토리 `CryptoLibrary`는 비어 있다. 간혹 `git submodule update` 명령으로 서브모듈을 초기화하더라도 서브모듈 코드가 살아나지 않을 수 있다. +후에 다시 서브모듈을 추가했던 브랜치로 Checkout 하면 서브모듈 디렉토리 `CryptoLibrary` 는 비어 있다. 간혹 `git submodule update` 명령으로 서브모듈을 초기화하더라도 서브모듈 코드가 살아나지 않을 수 있다. 이럴 때는 서브모듈 디렉토리로 이동해서 `git checkout .` 명령을 실행하면 서브모듈 코드가 나타난다. 서브모듈을 여러 개 사용하는 경우 `submodule foreach` 명령으로 한꺼번에 코드를 복구할 수 있다. diff --git a/book/07-git-tools/sections/subtree-merges.asc b/book/07-git-tools/sections/subtree-merges.asc index 0783cb06..224f6d2a 100644 --- a/book/07-git-tools/sections/subtree-merges.asc +++ b/book/07-git-tools/sections/subtree-merges.asc @@ -48,7 +48,7 @@ Now we have the root of the Rack project in our `rack_branch` branch and our own If you check out one and then the other, you can see that they have different project roots: /////////////////// (역주 - `git fetch rack_remote` 명령의 결과에서 `warning: no common commits` 메시지를 주목해야 한다.) -Rack 프로젝트의 브랜치인 `rack_branch`를 만들었다. 원 프로젝트는 `master` 브랜치에 있다. +Rack 프로젝트의 브랜치인 `rack_branch` 를 만들었다. 원 프로젝트는 `master` 브랜치에 있다. `checkout` 명령으로 두 브랜치를 이동하면 전혀 다른 두 프로젝트가 한 저장소에 있는 것처럼 보인다. [source,console] @@ -80,7 +80,7 @@ We just switched back to your `master` branch, and we pull the `rack_branch` bra Rack 프로젝트를 `master` 브랜치의 하위 디렉토리로 만들 수 있다. 이는 `git read-tree` 명령을 사용한다. `read-tree` 명령과 같이 저수준 명령에 관련된 많은 내용은 <>에서 다룬다. 간단히 말하자면 `read-tree` 명령은 어떤 브랜치로부터 루트 트리를 읽어서 현재 Staging Area나 워킹 디렉토리로 가져온다. -`master` 브랜치로 다시 Checkout 하고 `rack_branch` 브랜치를 `rack`이라는 `master` 브랜치의 하위 디렉토리로 만들어보자. +`master` 브랜치로 다시 Checkout 하고 `rack_branch` 브랜치를 `rack` 이라는 `master` 브랜치의 하위 디렉토리로 만들어보자. [source,console] ---- @@ -124,7 +124,7 @@ All the changes from the Rack project are merged in and ready to be committed lo You can also do the opposite – make changes in the `rack` subdirectory of your master branch and then merge them into your `rack_branch` branch later to submit them to the maintainers or push them upstream. /////////////////// 위 명령을 실행하면 Rack 프로젝트에서 변경된 모든 부분이 `master` 브랜치로 반영되고 커밋할 준비가 완료된다. -반대로 `rack` 하위 디렉토리에서 변경한 내용을 `rack_branch`로 Merge 하는 것도 가능하다. 변경한 것을 메인테이너에게 보내거나 Upstream에 Push 한다. +반대로 `rack` 하위 디렉토리에서 변경한 내용을 `rack_branch` 로 Merge 하는 것도 가능하다. 변경한 것을 메인테이너에게 보내거나 Upstream에 Push 한다. /////////////////// This gives us a way to have a workflow somewhat similar to the submodule workflow without using submodules (which we will cover in <>). @@ -141,7 +141,7 @@ However, it has other drawbacks in that it's a bit more complex and easier to ma Another slightly weird thing is that to get a diff between what you have in your `rack` subdirectory and the code in your `rack_branch` branch – to see if you need to merge them – you can’t use the normal `diff` command. Instead, you must run `git diff-tree` with the branch you want to compare to: /////////////////// -`diff` 명령으로 `rack` 하위 디렉토리와 `rack_branch`의 차이를 볼 때도 이상하다. Merge 하기 전에 두 차이를 보고 싶어도 `diff` 명령을 사용할 수 없다. +`diff` 명령으로 `rack` 하위 디렉토리와 `rack_branch` 의 차이를 볼 때도 이상하다. Merge 하기 전에 두 차이를 보고 싶어도 `diff` 명령을 사용할 수 없다. 대신 `git diff-tree` 명령이 준비돼 있다. [source,console] diff --git a/book/08-customizing-git/sections/attributes.asc b/book/08-customizing-git/sections/attributes.asc index 2127fe8e..1437669a 100644 --- a/book/08-customizing-git/sections/attributes.asc +++ b/book/08-customizing-git/sections/attributes.asc @@ -6,7 +6,7 @@ Some of these settings can also be specified for a path, so that Git applies tho These path-specific settings are called Git attributes and are set either in a `.gitattributes` file in one of your directories (normally the root of your project) or in the `.git/info/attributes` file if you don't want the attributes file committed with your project. ////////////////////////// 디렉토리와 파일 단위로 다른 설정을 적용할 수도 있다. 이렇게 경로별로 설정하는 것을 Git Attribute 라고 부른다. -이 설정은 `.gitattributes`라는 파일에 저장하고 아무 디렉토리에나 둘 수 있지만, 보통은 프로젝트 최상위 디렉토리에 둔다. 그리고 이 파일을 커밋하고 싶지 않으면 `.gitattributes`가 아니라 `.git/info/attributes`로 파일을 만든다. +이 설정은 `.gitattributes` 라는 파일에 저장하고 아무 디렉토리에나 둘 수 있지만, 보통은 프로젝트 최상위 디렉토리에 둔다. 그리고 이 파일을 커밋하고 싶지 않으면 `.gitattributes` 가 아니라 `.git/info/attributes` 로 파일을 만든다. ////////////////////////// Using attributes, you can do things like specify separate merge strategies for individual files or directories in your project, tell Git how to diff non-text files, or have Git filter content before you check it into or out of Git. @@ -61,7 +61,7 @@ To tell Git to treat all `pbxproj` files as binary data, add the following line ////////////////////////// Now, Git won't try to convert or fix CRLF issues; nor will it try to compute or print a diff for changes in this file when you run `git show` or `git diff` on your project. ////////////////////////// -이제 `pbxproj` 파일은 CRLF 변환이 적용되지 않는다. `git show`나 `git diff` 같은 명령을 실행할 때도 통계를 계산하거나 diff를 출력하지 않는다. +이제 `pbxproj` 파일은 CRLF 변환이 적용되지 않는다. `git show` 나 `git diff` 같은 명령을 실행할 때도 통계를 계산하거나 diff를 출력하지 않는다. ////////////////////////// ===== Diffing Binary Files @@ -84,7 +84,7 @@ If you run `git diff` normally, you only see something like this: 먼저 이 기술을 인류에게 알려진 가장 귀찮은 문제 중 하나인 Word 문서를 버전 관리하는 상황을 살펴보자. 모든 사람이 Word가 가장 끔찍한 편집기라고 말하지만 애석하게도 모두 Word를 사용한다. Git 저장소에 넣고 이따금 커밋하는 것만으로도 Word 문서의 버전을 관리할 수 있다. -그렇지만 `git diff`를 실행하면 아래와 같은 메시지를 볼 수 있을 뿐이다. +그렇지만 `git diff` 를 실행하면 아래와 같은 메시지를 볼 수 있을 뿐이다. [source,console] ---- @@ -120,7 +120,7 @@ Here you'll configure Git to use the `docx2txt` program to convert Word document Word 문서에서 사람이 읽을 수 있는 텍스트를 추출해주는 `docx2txt` 프로그램을 사용하여 Diff에 이용한다. ////////////////////////// -First, you'll need to install `docx2txt`; you can download it from http://docx2txt.sourceforge.net[]. +First, you'll need to install `docx2txt` ; you can download it from http://docx2txt.sourceforge.net[]. Follow the instructions in the `INSTALL` file to put it somewhere your shell can find it. Next, you'll write a wrapper script to convert output to the format Git expects. Create a file that's somewhere in your path called `docx2txt`, and add these contents: @@ -140,7 +140,7 @@ docx2txt.pl "$1" - Don't forget to `chmod a+x` that file. Finally, you can configure Git to use this script: ////////////////////////// -`chmod a+x`로 실행권한을 설정해두고 +`chmod a+x` 로 실행권한을 설정해두고 아래와 같이 Git 설정을 추가한다. [source,console] @@ -152,7 +152,7 @@ $ git config diff.word.textconv docx2txt Now Git knows that if it tries to do a diff between two snapshots, and any of the files end in `.docx`, it should run those files through the ``word'' filter, which is defined as the `docx2txt` program. This effectively makes nice text-based versions of your Word files before attempting to diff them. ////////////////////////// -이제 Git은 확장자가 `.docx`인 파일의 스냅샷을 Diff 할 때 ``word'' 필터로 정의한 `docx2txt` 프로그램을 사용한다. +이제 Git은 확장자가 `.docx` 인 파일의 스냅샷을 Diff 할 때 ``word'' 필터로 정의한 `docx2txt` 프로그램을 사용한다. 이 프로그램은 Word 파일을 텍스트 파일로 변환해 주기 때문에 Diff 할 수 있다. ////////////////////////// @@ -162,7 +162,7 @@ Here's what `git diff` shows: ////////////////////////// 이 책의 1장을 Word 파일로 만들어서 Git에 넣고 나서 단락 하나를 수정하고 저장하는 예를 살펴본다. 새로 단락을 하나 추가하고 나서 -`git diff`를 실행하면 어디가 달려졌는지 확인할 수 있다. +`git diff` 를 실행하면 어디가 달려졌는지 확인할 수 있다. [source,console] ---- @@ -217,7 +217,7 @@ $ git config diff.exif.textconv exiftool ////////////////////////// If you replace an image in your project and run `git diff`, you see something like this: ////////////////////////// -프로젝트에 들어 있는 이미지 파일을 변경하고 `git diff`를 실행하면 아래와 같이 보여준다. +프로젝트에 들어 있는 이미지 파일을 변경하고 `git diff` 를 실행하면 아래와 같이 보여준다. [source,diff] ---- @@ -366,7 +366,7 @@ The `cat` program does essentially nothing: it spits out the same data that it c This combination effectively filters all C source code files through `indent` before committing. ////////////////////////// `*.c` 파일을 커밋하면 indent 프로그램을 통해서 커밋되고 Checkout 하면 `cat` 프로그램을 통해 Checkout된다. -`cat`은 입력된 데이터를 그대로 다시 내보내는 사실 아무것도 안 하는 프로그램이다. +`cat` 은 입력된 데이터를 그대로 다시 내보내는 사실 아무것도 안 하는 프로그램이다. 이렇게 설정하면 모든 C 소스 파일은 `indent` 프로그램을 통해 커밋된다. ////////////////////////// @@ -374,7 +374,7 @@ Another interesting example gets `$Date$` keyword expansion, RCS style. To do this properly, you need a small script that takes a filename, figures out the last commit date for this project, and inserts the date into the file. Here is a small Ruby script that does that: ////////////////////////// -이제 RCS처럼 `$Date$`를 치환하는 예제를 살펴보자. +이제 RCS처럼 `$Date$` 를 치환하는 예제를 살펴보자. 이 기능을 구현하려면 간단한 스크립트가 하나 필요하다. 이 스크립트는 `$Date$` 필드를 프로젝트의 마지막 커밋 일자로 치환한다. 표준 입력을 읽어서 `$Date$` 필드를 치환한다. 아래는 Ruby로 구현한 스크립트다. @@ -393,9 +393,9 @@ Now, you need to set up a filter in Git (call it `dater`) and tell it to use you You'll use a Perl expression to clean that up on commit: ////////////////////////// `git log` 명령으로 마지막 커밋 정보를 얻고 표준 입력(STDIN)에서 `$Date$` 스트링을 찾아서 치환한다. 스크립트는 자신이 편한 언어로 만든다. -이 스크립트의 이름을 `expand_date`라고 짓고 실행 경로에 넣는다. -그리고 `dater`라는 Git 필터를 정의한다. -Checkout시 실행하는 smudge 필터로 `expand_date`를 사용하고 커밋할 때 실행하는 clean 필터는 Perl을 사용한다. +이 스크립트의 이름을 `expand_date` 라고 짓고 실행 경로에 넣는다. +그리고 `dater` 라는 Git 필터를 정의한다. +Checkout시 실행하는 smudge 필터로 `expand_date` 를 사용하고 커밋할 때 실행하는 clean 필터는 Perl을 사용한다. [source,console] ---- @@ -484,7 +484,7 @@ Now, when you run `git archive` to create a tarball of your project, that direct ===== `export-subst` ////////////////////////// -When exporting files for deployment you can apply `git log`'s formatting and keyword-expansion processing to selected portions of files marked with the +When exporting files for deployment you can apply `git log` 's formatting and keyword-expansion processing to selected portions of files marked with the `export-subst` attribute. ////////////////////////// 아카이브를 만들어서 배포할 때도 `git log` 같은 포맷 규칙을 적용할 수 있다. `export-subst` Attribute로 설정한 파일들의 @@ -565,7 +565,7 @@ Say you have a database settings file called `database.xml` that is different in You can set up an attribute like this: ////////////////////////// 이 설정은 다양한 환경에서 운영하려고 만든 환경 브랜치를 Merge 할 때 좋다. 이때는 환경 설정과 관련된 파일은 Merge 하지 않고 무시하는 게 편리하다. -브랜치에 `database.xml`이라는 데이터베이스 설정파일이 있는데 이 파일은 브랜치마다 다르다. Database 설정 파일은 Merge 하면 안된다. +브랜치에 `database.xml` 이라는 데이터베이스 설정파일이 있는데 이 파일은 브랜치마다 다르다. Database 설정 파일은 Merge 하면 안된다. Attribute를 아래와 같이 설정하면 이 파일은 그냥 두고 Merge 한다. [source,ini] diff --git a/book/08-customizing-git/sections/config.asc b/book/08-customizing-git/sections/config.asc index d0e81f80..dbf77389 100644 --- a/book/08-customizing-git/sections/config.asc +++ b/book/08-customizing-git/sections/config.asc @@ -49,7 +49,7 @@ These values are specific to that single repository. ////////////////////////// Each of these ``levels'' (system, global, local) overwrites values in the previous level, so values in `.git/config` trump those in `/etc/gitconfig`, for instance. ////////////////////////// -각 설정 파일에 중복된 설정이 있으면 설명한 ``순서대로'' 덮어쓴다. 예를 들어 `.git/config`와 `/etc/gitconfig`에 같은 설정이 들어 있다면 `.git/config`에 있는 설정을 사용한다. +각 설정 파일에 중복된 설정이 있으면 설명한 ``순서대로'' 덮어쓴다. 예를 들어 `.git/config` 와 `/etc/gitconfig` 에 같은 설정이 들어 있다면 `.git/config` 에 있는 설정을 사용한다. [NOTE] ////////////////////////// @@ -100,7 +100,7 @@ http://git-scm.com/docs/git-config.html[] 페이지에서도 같은 내용을 By default, Git uses whatever you've set as your default text editor (`$VISUAL` or `$EDITOR`) or else falls back to the `vi` editor to create and edit your commit and tag messages. To change that default to something else, you can use the `core.editor` setting: ////////////////////////// -Git은 편집기를 설정(`$VISUAL`, `$EDITOR` 변수로 설정)하지 않았거나 설정한 편집기를 찾을 수 없으면 `vi`를 실행한다. 커밋할 때나 tag 메시지를 편집할 때 설정한 편집기를 실행한다. +Git은 편집기를 설정(`$VISUAL`, `$EDITOR` 변수로 설정)하지 않았거나 설정한 편집기를 찾을 수 없으면 `vi` 를 실행한다. 커밋할 때나 tag 메시지를 편집할 때 설정한 편집기를 실행한다. `code.editor` 설정으로 편집기를 설정한다. [source,console] @@ -135,7 +135,7 @@ what happened ////////////////////////// To tell Git to use it as the default message that appears in your editor when you run `git commit`, set the `commit.template` configuration value: ////////////////////////// -이 파일을 `commit.template`에 설정하면 Git은 `git commit` 명령이 실행하는 편집기에 이 메시지를 기본으로 넣어준다. +이 파일을 `commit.template` 에 설정하면 Git은 `git commit` 명령이 실행하는 편집기에 이 메시지를 기본으로 넣어준다. [source,console] ---- @@ -180,8 +180,8 @@ If your team has a commit-message policy, then putting a template for that polic This setting determines which pager is used when Git pages output such as `log` and `diff`. You can set it to `more` or to your favorite pager (by default, it's `less`), or you can turn it off by setting it to a blank string: ////////////////////////// -Git은 `log`나 `diff`같은 명령의 메시지를 출력할 때 페이지로 나누어 보여준다. -기본으로 사용하는 명령은 `less`다. `more`를 더 좋아하면 `more`라고 설정한다. 페이지를 나누고 싶지 않으면 빈 문자열로 설정한다. +Git은 `log` 나 `diff` 같은 명령의 메시지를 출력할 때 페이지로 나누어 보여준다. +기본으로 사용하는 명령은 `less` 다. `more` 를 더 좋아하면 `more` 라고 설정한다. 페이지를 나누고 싶지 않으면 빈 문자열로 설정한다. [source,console] ---- @@ -224,7 +224,7 @@ $ git tag -s ////////////////////////// You can put patterns in your project's `.gitignore` file to have Git not see them as untracked files or try to stage them when you run `git add` on them, as discussed in <>. ////////////////////////// -Git에서 `git add` 명령으로 추적할 파일에 포함하지 않을 파일은 `.gitignore`에 해당 패턴을 적으면 된다고 <>에서 설명했다. +Git에서 `git add` 명령으로 추적할 파일에 포함하지 않을 파일은 `.gitignore` 에 해당 패턴을 적으면 된다고 <>에서 설명했다. ////////////////////////// But sometimes you want to ignore certain files for all repositories that you work with. @@ -275,7 +275,7 @@ Git helpfully tries to figure out what you meant, but it still refuses to do it. If you set `help.autocorrect` to 1, Git will actually run this command for you: ////////////////////////// Git은 어떤 명령을 입력하려고 했을지 추측해서 보여주긴 하지만 직접 실행하진 않는다. -그러나 `help.autocorrect`를 1로 설정하면 명령어를 잘못 입력해도 Git이 자동으로 해당 명령어를 찾아서 실행해준다. +그러나 `help.autocorrect` 를 1로 설정하면 명령어를 잘못 입력해도 Git이 자동으로 해당 명령어를 찾아서 실행해준다. [source,console] ---- @@ -322,14 +322,14 @@ $ git config --global color.ui false ////////////////////////// The default setting is `auto`, which colors output when it's going straight to a terminal, but omits the color-control codes when the output is redirected to a pipe or a file. ////////////////////////// -컬러 설정의 기본 값은 `auto`로 터미널에 출력할 때는 색칠하지만, 결과가 리다이렉션되거나 파일로 출력되면 색칠하지 않는다. +컬러 설정의 기본 값은 `auto` 로 터미널에 출력할 때는 색칠하지만, 결과가 리다이렉션되거나 파일로 출력되면 색칠하지 않는다. ////////////////////////// You can also set it to `always` to ignore the difference between terminals and pipes. You'll rarely want this; in most scenarios, if you want color codes in your redirected output, you can instead pass a `--color` flag to the Git command to force it to use color codes. The default setting is almost always what you'll want. ////////////////////////// -`always`로 설정하면 터미널이든 다른 출력이든 상관없이 색칠하여 내보낸다. +`always` 로 설정하면 터미널이든 다른 출력이든 상관없이 색칠하여 내보낸다. 대개 이 값을 설정해서 사용하지 않는다. `--color` 옵션을 사용하면 강제로 결과를 색칠해서 내도록 할 수 있기 때문이다. 대부분은 기본 값이 낫다. @@ -337,7 +337,7 @@ The default setting is almost always what you'll want. ////////////////////////// If you want to be more specific about which commands are colored and how, Git provides verb-specific coloring settings. -Each of these can be set to `true`, `false`, or `always`: +Each of these can be set to `true`, `false`, or `always` : ////////////////////////// Git은 좀 더 꼼꼼하게 컬러를 설정하는 방법을 제공한다. 아래와 같은 설정들이 있다. 모두 `true`, `false`, `always` 중 하나를 고를 수 있다. @@ -397,8 +397,8 @@ Set up a merge wrapper script named `extMerge` that calls your binary with all t ////////////////////////// 먼저 https://www.perforce.com/product/components/perforce-visual-merge-and-diff-tools[] 에서 P4Merge를 내려받는다. 그 후에 P4Merge 에 쓸 Wrapper 스크립트를 만든다. -필자는 Mac 사용자라서 Mac 경로를 사용한다. 어떤 시스템이든 `p4merge`가 설치된 경로를 사용하면 된다. -예제에서는 `extMerge`라는 Merge 용 Wrapper 스크립트를 만들고 이 스크립트로 넘어오는 모든 아규먼트를 p4merge 프로그램으로 넘긴다. +필자는 Mac 사용자라서 Mac 경로를 사용한다. 어떤 시스템이든 `p4merge` 가 설치된 경로를 사용하면 된다. +예제에서는 `extMerge` 라는 Merge 용 Wrapper 스크립트를 만들고 이 스크립트로 넘어오는 모든 아규먼트를 p4merge 프로그램으로 넘긴다. [source,console] ---- @@ -422,7 +422,7 @@ path old-file old-hex old-mode new-file new-hex new-mode ////////////////////////// Because you only want the `old-file` and `new-file` arguments, you use the wrapper script to pass the ones you need. ////////////////////////// -이 중에서 `old-file`과 `new-file` 만 사용하는 wrapper 스크립트를 만든다. +이 중에서 `old-file` 과 `new-file` 만 사용하는 wrapper 스크립트를 만든다. [source,console] ---- @@ -448,7 +448,7 @@ This takes a number of custom settings: `merge.tool` to tell Git what strategy t So, you can either run four config commands ////////////////////////// Git config 파일에 이 스크립트를 모두 추가한다. 설정해야 하는 옵션이 좀 많다. -`merge.tool`로 무슨 Merge 도구를 사용할지, `mergetool.*.cmd`로 실제로 어떻게 명령어를 실행할지, `mergetool.trustExitCode`로 Merge 도구가 반환하는 exit 코드가 Merge의 성공 여부를 나타내는지, `diff.external`은 diff 할 때 실행할 명령어가 무엇인지를 설정할 때 사용한다. +`merge.tool` 로 무슨 Merge 도구를 사용할지, `mergetool.*.cmd` 로 실제로 어떻게 명령어를 실행할지, `mergetool.trustExitCode` 로 Merge 도구가 반환하는 exit 코드가 Merge의 성공 여부를 나타내는지, `diff.external` 은 diff 할 때 실행할 명령어가 무엇인지를 설정할 때 사용한다. 모두 `git config` 명령으로 설정한다. [source,console] @@ -494,7 +494,7 @@ diff 결과가 터미널에 출력되는 대신 P4Merge가 실행되어 아래 image::images/p4merge.png[P4Merge.] ////////////////////////// -If you try to merge two branches and subsequently have merge conflicts, you can run the command `git mergetool`; it starts P4Merge to let you resolve the conflicts through that GUI tool. +If you try to merge two branches and subsequently have merge conflicts, you can run the command `git mergetool` ; it starts P4Merge to let you resolve the conflicts through that GUI tool. ////////////////////////// 브랜치를 Merge 할 때 충돌이 나면 `git mergetool` 명령을 실행한다. 이 명령을 실행하면 GUI 도구로 충돌을 해결할 수 있도록 P4Merge를 실행해준다. @@ -503,7 +503,7 @@ The nice thing about this wrapper setup is that you can change your diff and mer For example, to change your `extDiff` and `extMerge` tools to run the KDiff3 tool instead, all you have to do is edit your `extMerge` file: ////////////////////////// Wrapper를 만들어 설정해두면 다른 Diff, Merge 도구로 바꾸기도 쉽다. -예를 들어, KDiff3를 사용하도록 `extDiff`와 `extMerge` 스크립트를 수정한다. +예를 들어, KDiff3를 사용하도록 `extDiff` 와 `extMerge` 스크립트를 수정한다. [source,console] ---- @@ -567,7 +567,7 @@ $ git config --global merge.tool kdiff3 ////////////////////////// If you run this instead of setting up the `extMerge` and `extDiff` files, Git will use KDiff3 for merge resolution and the normal Git diff tool for diffs. ////////////////////////// -`extMerge`와 `extDiff` 파일을 만들지 않고 이렇게 Merge 도구만 `kdiff3`로 설정하고 Diff 도구는 Git에 원래 들어 있는 것을 사용할 수 있다. +`extMerge` 와 `extDiff` 파일을 만들지 않고 이렇게 Merge 도구만 `kdiff3`로 설정하고 Diff 도구는 Git에 원래 들어 있는 것을 사용할 수 있다. ==== Formatting and Whitespace @@ -625,10 +625,10 @@ This setup should leave you with CRLF endings in Windows checkouts, but LF endin 이 설정을 이용하면 Windows에서는 CRLF를 사용하고 Mac, Linux, 저장소에서는 LF를 사용할 수 있다. ////////////////////////// -If you're a Windows programmer doing a Windows-only project, then you can turn off this functionality, recording the carriage returns in the repository by setting the config value to `false`: +If you're a Windows programmer doing a Windows-only project, then you can turn off this functionality, recording the carriage returns in the repository by setting the config value to `false` : ////////////////////////// Windows 플랫폼에서만 개발하면 이 기능이 필요 없다. -이 옵션을 `false`라고 설정하면 이 기능이 꺼지고 CR 문자도 저장소에도 저장된다. +이 옵션을 `false` 라고 설정하면 이 기능이 꺼지고 CR 문자도 저장소에도 저장된다. [source,console] ---- @@ -647,12 +647,12 @@ Git에는 공백 문자를 다루는 방법으로 네 가지가 미리 정의돼 ////////////////////////// The three that are turned on by default are `blank-at-eol`, which looks for spaces at the end of a line; `blank-at-eof`, which notices blank lines at the end of a file; and `space-before-tab`, which looks for spaces before tabs at the beginning of a line. ////////////////////////// -먼저 기본적으로 켜져 있는 것을 살펴보자. `blank-at-eol`는 각 라인 끝에 공백이 있는지 찾고, `blank-at-eof`는 파일 끝에 추가한 빈 라인이 있는지 찾고, `space-before-tab`은 모든 라인에서 처음에 tab보다 공백이 먼저 나오는지 찾는다. +먼저 기본적으로 켜져 있는 것을 살펴보자. `blank-at-eol` 는 각 라인 끝에 공백이 있는지 찾고, `blank-at-eof` 는 파일 끝에 추가한 빈 라인이 있는지 찾고, `space-before-tab` 은 모든 라인에서 처음에 tab보다 공백이 먼저 나오는지 찾는다. ////////////////////////// The three that are disabled by default but can be turned on are `indent-with-non-tab`, which looks for lines that begin with spaces instead of tabs (and is controlled by the `tabwidth` option); `tab-in-indent`, which watches for tabs in the indentation portion of a line; and `cr-at-eol`, which tells Git that carriage returns at the end of lines are OK. ////////////////////////// -기본적으로 꺼져 있는 나머지 세 개는 `indent-with-non-tab`과 `tab-in-indent`과 `cr-at-eol`이다. `intent-with-non-tab`은 tab이 아니라 공백으로(`tabwidth` 설정에 영향받음) 시작하는 라인이 있는지 찾고 `cr-at-eol`은 라인 끝에 CR 문자가 있어도 괜찮다고 Git에 알리는 것이다. +기본적으로 꺼져 있는 나머지 세 개는 `indent-with-non-tab` 과 `tab-in-indent` 과 `cr-at-eol` 이다. `intent-with-non-tab` 은 tab이 아니라 공백으로(`tabwidth` 설정에 영향받음) 시작하는 라인이 있는지 찾고 `cr-at-eol` 은 라인 끝에 CR 문자가 있어도 괜찮다고 Git에 알리는 것이다. ////////////////////////// You can tell Git which of these you want enabled by setting `core.whitespace` to the values you want on or off, separated by commas. @@ -660,7 +660,7 @@ You can disable an option by prepending a `-` in front of its name, or use the d For example, if you want all but `space-before-tab` to be set, you can do this (with `trailing-space` being a short-hand to cover both `blank-at-eol` and `blank-at-eof`): ////////////////////////// `core.whitespace` 옵션으로 이 네 가지 방법을 켜고 끌 수 있다. -설정에서 해당 옵션을 빼버리거나 이름이 `-`로 시작하면 기능이 꺼진다. +설정에서 해당 옵션을 빼버리거나 이름이 `-` 로 시작하면 기능이 꺼진다. 예를 들어, 다른 건 다 켜고 `space-before-tab` 옵션만 끄려면 아래와 같이 설정한다. `trailing-space` 옵션은 `blank-at-eol` 옵션과 `blank-at-eof` 옵션을 의미한다. [source,console] @@ -741,7 +741,7 @@ This is generally good policy; but in the case of the rebase, you may determine 보통은 이런 정책이 좋고 `git push` 명령에 `-f` 옵션을 주면 강제로 Push 할 수 있다. ////////////////////////// -To tell Git to refuse force-pushes, set `receive.denyNonFastForwards`: +To tell Git to refuse force-pushes, set `receive.denyNonFastForwards` : ////////////////////////// `receive.denyNonFastForwards` 옵션을 켜면 Fast-forward로 Push 할 수 없는 브랜치는 아예 Push 하지 못한다. @@ -763,7 +763,7 @@ That approach lets you do more complex things like deny non-fast-forwards to a c One of the workarounds to the `denyNonFastForwards` policy is for the user to delete the branch and then push it back up with the new reference. To avoid this, set `receive.denyDeletes` to true: ////////////////////////// -`receive.denyNonFastForwards`와 비슷한 정책으로 `receive.denyDeletes`라는 것이 있다. +`receive.denyNonFastForwards` 와 비슷한 정책으로 `receive.denyDeletes` 라는 것이 있다. 이 설정을 켜면 브랜치를 삭제하는 Push가 거절된다. [source,console] diff --git a/book/08-customizing-git/sections/hooks.asc b/book/08-customizing-git/sections/hooks.asc index ec0f54ac..dd0bf20b 100644 --- a/book/08-customizing-git/sections/hooks.asc +++ b/book/08-customizing-git/sections/hooks.asc @@ -25,11 +25,11 @@ When you initialize a new repository with `git init`, Git populates the hooks di All the examples are written as shell scripts, with some Perl thrown in, but any properly named executable scripts will work fine – you can write them in Ruby or Python or whatever language you are familiar with. If you want to use the bundled hook scripts, you'll have to rename them; their file names all end with `.sample`. ////////////////////////// -훅은 Git 디렉토리 밑에 `hooks`라는 디렉토리에 저장한다. -기본 훅 디렉토리는 `.git/hooks`이다. +훅은 Git 디렉토리 밑에 `hooks` 라는 디렉토리에 저장한다. +기본 훅 디렉토리는 `.git/hooks` 이다. 이 디렉토리에 가보면 Git이 자동으로 넣어준 매우 유용한 스크립트 예제가 몇 개 있다. 그리고 스크립트가 입력받는 값이 어떤 값인지 파일 안에 자세히 설명돼 있다. 모든 예제는 쉘과 Perl 스크립트로 작성돼 있지만 실행할 수만 있으면 되고 Ruby나 Python같은 익숙한 언어로 만들어도 된다. -예제 스크립트의 파일 이름에는 `.sample`이라는 확장자가 붙어 있다. 그래서 이름만 바꿔주면 그 훅을 바로 사용할 수 있다. +예제 스크립트의 파일 이름에는 `.sample` 이라는 확장자가 붙어 있다. 그래서 이름만 바꿔주면 그 훅을 바로 사용할 수 있다. ////////////////////////// To enable a hook script, put a file in the `hooks` subdirectory of your .git directory that is named appropriately (without any extension) and is executable. @@ -82,7 +82,7 @@ You can do things like check for code style (run `lint` or something equivalent) ////////////////////////// `pre-commit` 훅은 커밋할 때 가장 먼저 호출되는 훅으로 커밋 메시지를 작성하기 전에 호출된다. 이 훅에서 커밋하는 Snapshot을 점검한다. 빠트린 것은 없는지, 테스트는 확실히 했는지 등을 검사한다. 커밋할 때 꼭 확인해야 할 게 있으면 이 훅으로 확인한다. -그리고 이 훅의 Exit 코드가 0이 아니면 커밋은 취소된다. 물론 `git commit --no-verify`라고 실행하면 이 훅을 일시적으로 생략할 수 있다. +그리고 이 훅의 Exit 코드가 0이 아니면 커밋은 취소된다. 물론 `git commit --no-verify` 라고 실행하면 이 훅을 일시적으로 생략할 수 있다. `lint` 같은 프로그램으로 코드 스타일을 검사하거나, 라인 끝의 공백 문자를 검사하거나(예제로 들어 있는 `pre-commit` 훅이 하는 게 이 일이다), 새로 추가한 코드에 주석을 달았는지 검사하는 일은 이 훅으로 하는 것이 좋다. ////////////////////////// @@ -137,7 +137,7 @@ It takes a single argument: the name of the temporary file that contains the pro Git aborts the patch if this script exits non-zero. You can use this to make sure a commit message is properly formatted, or to normalize the message by having the script edit it in place. ////////////////////////// -제일 먼저 실행하는 훅은 `applypatch-msg`이다. +제일 먼저 실행하는 훅은 `applypatch-msg` 이다. 이 훅의 아규먼트는 Author가 보내온 커밋 메시지 파일의 이름이다. 이 스크립트가 종료할 때 0이 아닌 값을 반환하면 Git은 Patch 하지 않는다. 커밋 메시지가 규칙에 맞는지 확인하거나 자동으로 메시지를 수정할 때 이 훅을 사용한다. @@ -148,7 +148,7 @@ Somewhat confusingly, it is run _after_ the patch is applied but before a commit You can run tests or otherwise inspect the working tree with this script. If something is missing or the tests don't pass, exiting non-zero aborts the `git am` script without committing the patch. ////////////////////////// -`git am`으로 Patch 할 때 두 번째로 실행되는 훅이 `pre-applypatch`이다. +`git am` 으로 Patch 할 때 두 번째로 실행되는 훅이 `pre-applypatch` 이다. 이 훅은 아규먼트가 없고 단순히 Patch를 적용하고 나서 실행된다. 그래서 커밋할 스냅샷을 검사하는 데 사용한다. 이 스크립트로 테스트를 수행하고 파일을 검사할 수 있다. 테스트에 실패하거나 뭔가 부족하면 0이 아닌 값을 반환시켜서 `git am` 명령을 취소시킬 수 있다. @@ -158,7 +158,7 @@ The last hook to run during a `git am` operation is `post-applypatch`, which run You can use it to notify a group or the author of the patch you pulled in that you've done so. You can't stop the patching process with this script. ////////////////////////// -`git am` 명령에서 마지막으로 실행되는 훅은 `post-applypatch`다. +`git am` 명령에서 마지막으로 실행되는 훅은 `post-applypatch` 다. 이 스크립트를 이용하면 자동으로 Patch를 보낸 사람이나 그룹에게 알림 메시지를 보낼 수 있다. 이 스크립트로는 Patch를 중단시킬 수 없다. @@ -175,7 +175,7 @@ The example `pre-rebase` hook that Git installs does this, although it makes som ////////////////////////// `pre-rebase` 훅은 Rebase 하기 전에 실행된다. 이 훅이 0이 아닌 값을 반환하면 Rebase가 취소된다. 이 훅으로 이미 Push 한 커밋을 Rebase 하지 못하게 할 수 있다. -Git이 자동으로 넣어주는 `pre-rebase` 예제가 바로 그 예제다. 이 예제에는 기준 브랜치가 `next`라고 돼 있다. 참고하여 실제로 적용할 브랜치 이름으로 사용하면 된다. +Git이 자동으로 넣어주는 `pre-rebase` 예제가 바로 그 예제다. 이 예제에는 기준 브랜치가 `next` 라고 돼 있다. 참고하여 실제로 적용할 브랜치 이름으로 사용하면 된다. ////////////////////////// The `post-rewrite` hook is run by commands that replace commits, such as `git commit --amend` and `git rebase` (though not by `git filter-branch`). @@ -183,7 +183,7 @@ Its single argument is which command triggered the rewrite, and it receives a li This hook has many of the same uses as the `post-checkout` and `post-merge` hooks. ////////////////////////// `post-rewrite` 훅은 커밋을 변경하는 명령을 실행했을 때 실행된다. 예를 들어 `git commit --amend` 이나 `git rebase` 같은 명령이 해당한다. `git filter-branch` 명령은 해당하지 않는다. -아규먼트로 커밋을 변경하게 한 명령이 전달되고 `stdin`으로 변경된 커밋 목록이 전달된다. +아규먼트로 커밋을 변경하게 한 명령이 전달되고 `stdin` 으로 변경된 커밋 목록이 전달된다. 훅의 용도는 `post-checkout` 이나 `post-merge` 훅과 비슷하다고 볼 수 있다. ////////////////////////// @@ -208,7 +208,7 @@ It receives the name and location of the remote as parameters, and a list of to- You can use it to validate a set of ref updates before a push occurs (a non-zero exit code will abort the push). ////////////////////////// `pre-push` 훅은 `git push` 명령을 실행하면 동작하는데 리모트 정보를 업데이트 하고 난 후 리모트로 데이터를 전송하기 전에 동작한다. -리모트의 이름과 주소를 파라미터로 전달받으며 `stdin`을 통해 업데이트 할 해시 리스트를 전달받는다. +리모트의 이름과 주소를 파라미터로 전달받으며 `stdin` 을 통해 업데이트 할 해시 리스트를 전달받는다. Push 하기 전에 커밋이 유효한지 확인하는 용도로 사용할 수 있다. 훅에서 0이 아닌 값을 반환하면 Push를 중지시킨다. ////////////////////////// @@ -252,7 +252,7 @@ Instead of reading from stdin, this script takes three arguments: the name of th If the update script exits non-zero, only that reference is rejected; other references can still be updated. ////////////////////////// update 스크립트는 각 브랜치마다 한 번씩 실행된다는 것을 제외하면 `pre-receive` 스크립트와 거의 같다. -한 번에 브랜치를 여러 개 Push 하면 `pre-receive`는 딱 한 번만 실행되지만, update는 브랜치마다 실행된다. +한 번에 브랜치를 여러 개 Push 하면 `pre-receive` 는 딱 한 번만 실행되지만, update는 브랜치마다 실행된다. 이 스크립트는 표준 입력으로 데이터를 입력받는 것이 아니라 아규먼트로 브랜치 이름, 원래 가리키던 SHA-1 값, 사용자가 Push 하는 SHA-1 값을 입력받는다. update 스크립트가 0이 아닌 값을 반환하면 해당 Refs만 거절되고 나머지 다른 Refs는 상관없다. diff --git a/book/08-customizing-git/sections/policy.asc b/book/08-customizing-git/sections/policy.asc index 16f5eae4..9ed3e7a6 100644 --- a/book/08-customizing-git/sections/policy.asc +++ b/book/08-customizing-git/sections/policy.asc @@ -89,8 +89,8 @@ You can get a list of the SHA-1 values of all the commits that are being pushed This is basically the `git log` command, but by default it prints out only the SHA-1 values and no other information. So, to get a list of all the commit SHAs introduced between one commit SHA and another, you can run something like this: ////////////////////////// -`$newrev`, `$oldrev` 변수와 `git rev-list`라는 Plumbing 명령어를 이용해서 Push 하는 모든 커밋의 SHA-1 값을 알 수 있다. -`git log`와 근본적으로 같은 명령이고 옵션을 하나도 주지 않으면 다른 정보 없이 SHA-1 값만 보여준다. +`$newrev`, `$oldrev` 변수와 `git rev-list` 라는 Plumbing 명령어를 이용해서 Push 하는 모든 커밋의 SHA-1 값을 알 수 있다. +`git log` 와 근본적으로 같은 명령이고 옵션을 하나도 주지 않으면 다른 정보 없이 SHA-1 값만 보여준다. 이 명령으로 두 커밋 사이에 있는 커밋들의 SHA-1 값을 살펴보고자 아래와 같은 명령을 사용할 수 있다. [source,console] @@ -114,7 +114,7 @@ To get the raw commit data, you can use another plumbing command called `git cat We'll go over all these plumbing commands in detail in <>; but for now, here's what that command gives you: ////////////////////////// 커밋 메시지를 얻는 방법을 알아보자. -커밋의 raw 데이터는 `git cat-file`이라는 Plumbing 명령어로 얻을 수 있다. +커밋의 raw 데이터는 `git cat-file` 이라는 Plumbing 명령어로 얻을 수 있다. <> 에서 Plumbing 명령어에 대해 자세히 다루니까 지금은 커밋 메시지 얻는 것에 집중하자. [source,console] @@ -133,7 +133,7 @@ A simple way to get the commit message from a commit when you have the SHA-1 val You can do so with the `sed` command on Unix systems: ////////////////////////// 이 명령이 출력하는 메시지에서 커밋 메시지만 잘라내야 한다. -첫 번째 빈 라인 다음부터가 커밋 메시지니까 유닉스 명령어 `sed`로 첫 빈 라인 이후를 잘라낸다. +첫 번째 빈 라인 다음부터가 커밋 메시지니까 유닉스 명령어 `sed` 로 첫 빈 라인 이후를 잘라낸다. [source,console] ---- @@ -186,7 +186,7 @@ You'll have the `update` hook look at those rules, see what files are being intr ////////////////////////// 진행하는 프로젝트에 모듈이 여러 개라서 모듈마다 특정 사용자들만 Push 할 수 있게 ACL(Access Control List)을 설정해야 한다고 가정하자. 모든 권한을 다 가진 사람들도 있고 특정 디렉토리나 파일만 Push 할 수 있는 사람도 있다. -이런 일을 강제하려면 먼저 서버의 Bare 저장소에 `acl`이라는 파일을 만들고 거기에 규칙을 기술한다. +이런 일을 강제하려면 먼저 서버의 Bare 저장소에 `acl` 이라는 파일을 만들고 거기에 규칙을 기술한다. 그리고 `update` 훅에서 Push 하는 파일이 무엇인지 확인하고 ACL과 비교해서 Push 할 수 있는지 없는지 결정한다. ////////////////////////// @@ -195,13 +195,13 @@ Here you'll use a format very much like the CVS ACL mechanism: it uses a series All of these fields are delimited by a pipe (`|`) character. ////////////////////////// 우선 ACL부터 작성한다. -CVS에서 사용하는 것과 비슷한 ACL을 만든다. 규칙은 한 라인에 하나씩 기술한다. 각 라인의 첫 번째 필드는 `avail`이나 `unavail`이고 두 번째 필드는 규칙을 적용할 사용자들의 목록을 CSV(Comma-Separated Values) 형식으로 적는다. 마지막 필드엔 규칙을 적용할 경로를 적는다. 만약 마지막 필드가 비워져 있으면 모든 경로를 의미한다. +CVS에서 사용하는 것과 비슷한 ACL을 만든다. 규칙은 한 라인에 하나씩 기술한다. 각 라인의 첫 번째 필드는 `avail` 이나 `unavail` 이고 두 번째 필드는 규칙을 적용할 사용자들의 목록을 CSV(Comma-Separated Values) 형식으로 적는다. 마지막 필드엔 규칙을 적용할 경로를 적는다. 만약 마지막 필드가 비워져 있으면 모든 경로를 의미한다. 이 필드는 파이프(`|`) 문자로 구분한다. ////////////////////////// In this case, you have a couple of administrators, some documentation writers with access to the `doc` directory, and one developer who only has access to the `lib` and `tests` directories, and your ACL file looks like this: ////////////////////////// -예를 하나 들어보자. 어떤 모듈의 모든 권한을 가지는 관리자도 여러 명이고 `doc` 디렉토리만 접근해서 문서를 만드는 사람도 여러 명이다. 하지만 `lib`과 `tests` 디렉토리에 접근하는 사람은 한 명이다. 이런 상황을 ACL로 만들면 아래와 같다. +예를 하나 들어보자. 어떤 모듈의 모든 권한을 가지는 관리자도 여러 명이고 `doc` 디렉토리만 접근해서 문서를 만드는 사람도 여러 명이다. 하지만 `lib` 과 `tests` 디렉토리에 접근하는 사람은 한 명이다. 이런 상황을 ACL로 만들면 아래와 같다. [source] ---- @@ -217,7 +217,7 @@ In this case, to keep the example simple, you'll only enforce the `avail` direct Here is a method that gives you an associative array where the key is the user name and the value is an array of paths to which the user has write access: ////////////////////////// 이 ACL 정보는 스크립트에서 읽어 사용한다. -설명을 쉽게 하고자 여기서는 `avail`만 처리한다. +설명을 쉽게 하고자 여기서는 `avail` 만 처리한다. 아래의 메소드는 Associative Array를 반환하는데, 키는 사용자이름이고 값은 사용자가 Push 할 수 있는 경로의 목록이다. [source,ruby] @@ -465,7 +465,7 @@ end ////////////////////////// If that script is in place (in `.git/hooks/commit-msg`) and executable, and you commit with a message that isn't properly formatted, you see this: ////////////////////////// -이 스크립트를 `.git/hooks/commit-msg`라는 파일로 만들고 실행권한을 준다. 커밋이 메시지 규칙을 어기면 아래와 같은 메시지를 보여 준다. +이 스크립트를 `.git/hooks/commit-msg` 라는 파일로 만들고 실행권한을 준다. 커밋이 메시지 규칙을 어기면 아래와 같은 메시지를 보여 준다. [source,console] ---- diff --git a/book/09-git-and-other-scms/sections/client-hg.asc b/book/09-git-and-other-scms/sections/client-hg.asc index 1e78b0d6..fc9962a0 100644 --- a/book/09-git-and-other-scms/sections/client-hg.asc +++ b/book/09-git-and-other-scms/sections/client-hg.asc @@ -153,7 +153,7 @@ So the `refs/hg` directory is kind of like a fake `refs/remotes/origin`, but it ////////////////////////// git-remote-hg는 Git 스타일로 동작하도록 만들어 주는데 속으로 하는 일은 Git과 Mercurial을 매핑해 준다. 리모트 Ref를 `refs/hg` 디렉토리에 저장한다. -예를 들어 `refs/hg/origin/branches/default`는 Git Ref 파일로 내용은 `master` 브랜치가 가리키는 커밋인 ``ac7955c''로 시작하는 SHA 해시값이다. +예를 들어 `refs/hg/origin/branches/default` 는 Git Ref 파일로 내용은 `master` 브랜치가 가리키는 커밋인 ``ac7955c''로 시작하는 SHA 해시값이다. `refs/hg` 디렉토리는 일종의 `refs/remotes/origin` 같은 것이지만 북마크와 브랜치가 구분된다는 점이 다르다. ////////////////////////// @@ -190,7 +190,7 @@ Once we dig down to one of the tree items, we find that inside it is a blob name ////////////////////////// `refs/notes/hg` 파일은 트리 하나를 가리킨다. 이 트리는 다른 객체와 그 이름의 목록인 Git 객체 데이터베이스다. `git ls-tree` 명령은 이 트리 객체 안에 포함된 모드, 타입, 객체 해시, 파일 이름으로 된 여러 항목을 보여준다. -트리 객체에 포함된 한 항목을 더 자세히 살펴보면 ``ac9117f'' 으로 시작하는 이름(`master`가 가리키는 커밋의 SHA-1 해시)의 Blob 객체를 확인할 수 있다. ``ac9117f''이 가리키는 내용은 ``0a04b98''로 시작하는 해시로 `default` 브랜치가 가리키는 Mercurial Changeset ID이다. +트리 객체에 포함된 한 항목을 더 자세히 살펴보면 ``ac9117f'' 으로 시작하는 이름(`master` 가 가리키는 커밋의 SHA-1 해시)의 Blob 객체를 확인할 수 있다. ``ac9117f''이 가리키는 내용은 ``0a04b98''로 시작하는 해시로 `default` 브랜치가 가리키는 Mercurial Changeset ID이다. ////////////////////////// The good news is that we mostly don't have to worry about all of this. @@ -371,7 +371,7 @@ summary: More documentation Note the line that begins with ``branch''. Git can't really replicate this (and doesn't need to; both types of branch can be represented as a Git ref), but git-remote-hg needs to understand the difference, because Mercurial cares. ////////////////////////// -``branch''로 시작하는 라인이 있는 것을 볼 수 있다. +``branch'' 로 시작하는 라인이 있는 것을 볼 수 있다. Git은 이런 방식을 흉내낼 수(흉내낼 필요도) 없다(Git의 ref로 표현할 수는 있겠다). 하지만 Mercurial이 필요로 하는 정보이기에 git-remote-hg는 이런 비슷한 정보가 필요하다. ////////////////////////// diff --git a/book/09-git-and-other-scms/sections/client-p4.asc b/book/09-git-and-other-scms/sections/client-p4.asc index 95471e7e..bfd56d1d 100644 --- a/book/09-git-and-other-scms/sections/client-p4.asc +++ b/book/09-git-and-other-scms/sections/client-p4.asc @@ -23,7 +23,7 @@ The first one we'll cover is the ``Git Fusion'' bridge from the makers of Perfor The second is git-p4, a client-side bridge that lets you use Git as a Perforce client, without requiring any reconfiguration of the Perforce server. ////////////////////////// Perforce와 Git을 함께 사용하는 방법은 두 가지다. -첫 번째는 Perforce가 제공하는 ``Git Fusion''이다. Perforce Depot의 서브트리를 읽고 쓸 수 있는 Git 저장소로 노출 시켜 준다. +첫 번째는 Perforce가 제공하는 ``Git Fusion'' 이다. Perforce Depot의 서브트리를 읽고 쓸 수 있는 Git 저장소로 노출 시켜 준다. 두 번째 방법은 git-p4라는 클라이언트 Bridge를 사용하여 Git을 Perforce의 클라이언트로 사용하는 것이다. 이 방법은 Perforce 서버를 건드리지 않아도 된다. [[r_p4_git_fusion]] @@ -69,7 +69,7 @@ Then use these commands to create a user: ////////////////////////// 화면의 IP 주소는 계속 사용할 거라서 기억해두어야 한다. 다음은 Perforce 사용자를 생성해보자. -``Login'' 항목으로 이동해서 엔터키를 누르면(또는 SSH로 접속하면) `root`로 로그인한다. +``Login'' 항목으로 이동해서 엔터키를 누르면(또는 SSH로 접속하면) `root` 로 로그인한다. 그리고 아래 명령으로 Perforce 사용자를 생성한다. [source,console] @@ -84,7 +84,7 @@ The first one will open a VI editor to customize the user, but you can accept th The second one will prompt you to enter a password twice. That's all we need to do with a shell prompt, so exit out of the session. ////////////////////////// -첫 번째 명령을 실행하면 VI 편집기가 뜨고 생성한 사용자의 정보를 수정할 수 있다. 기본으로 입력되어있는 정보를 그대로 사용하려면 간단히 `:wq`를 키보드로 입력하고 엔터키를 누른다. +첫 번째 명령을 실행하면 VI 편집기가 뜨고 생성한 사용자의 정보를 수정할 수 있다. 기본으로 입력되어있는 정보를 그대로 사용하려면 간단히 `:wq` 를 키보드로 입력하고 엔터키를 누른다. 두 번째 명령을 실행하면 생성한 Perforce 사용자의 암호를 묻는데 안전하게 두 번 묻는다. 쉘에서 하는 작업은 여기까지이므로 쉘에서 나온다. @@ -126,7 +126,7 @@ The virtual-machine image comes equipped with a sample project that you can clon Here we're cloning over HTTPS, with the `john` user that we created above; Git asks for credentials for this connection, but the credential cache will allow us to skip this step for any subsequent requests. ////////////////////////// Perforce가 제공한 가상머신 이미지는 안에 샘플 프로젝트가 하나 들어 있다. -HTTPS 프로토콜로 프로젝트를 Clone 할 때 Git은 인증정보를 묻는다. 앞서 만든 `john`이라는 사용자이름과 암호를 입력한다. +HTTPS 프로토콜로 프로젝트를 Clone 할 때 Git은 인증정보를 묻는다. 앞서 만든 `john` 이라는 사용자이름과 암호를 입력한다. Credential 캐시로 사용자이름과 암호를 저장해 두면 이 단계를 건너뛴다. ////////////////////////// @@ -418,7 +418,7 @@ To https://10.0.1.254/Jam ////////////////////////// Git thinks it worked. -Let's take a look at the history of the `README` file from Perforce's point of view, using the revision graph feature of `p4v`: +Let's take a look at the history of the `README` file from Perforce's point of view, using the revision graph feature of `p4v` : ////////////////////////// Git은 이렇게 Merge 하고 Push 하면 잘 되었겠거니 한다. Perforce의 관점에서 `README` 파일의 히스토리를 생각해보자. Perforce 히스토리는 `p4v` 그래프 기능으로 볼 수 있다. @@ -447,7 +447,7 @@ Perforce didn't have a named branch to store the `1` and `2` commits, so it made This will also happen for named Git branches that don't correspond to a named Perforce branch (and you can later map them to a Perforce branch using the configuration file). ////////////////////////// Perforce의 히스토리 그래프상으로는 Git의 히스토리와 똑 같아 보인다. -하지만, Perforce는 `1`과 `2` 커밋을 저장할 만한 브랜치가 없다. 그래서 `.git-fusion` 디렉토리 안에 ``익명`` 브랜치를 만든다. +하지만, Perforce는 `1` 과 `2` 커밋을 저장할 만한 브랜치가 없다. 그래서 `.git-fusion` 디렉토리 안에 ``익명'' 브랜치를 만든다. Git 브랜치가 Perforce의 브랜치와 매치되지 않은 경우에도 이와 같은 모양이 된다(브랜치간 매핑은 나중에 설정할 수도 있다). ////////////////////////// @@ -498,7 +498,7 @@ As of this writing, it is freely available at http://www.perforce.com/downloads/ ====== ////////////////////////// ====== -git-p4가 잘 동작하려면 `p4` 명령을 어디에서나 사용할 수 있게 `PATH`에 등록해두어야 한다. +git-p4가 잘 동작하려면 `p4` 명령을 어디에서나 사용할 수 있게 `PATH` 에 등록해두어야 한다. `p4`는 무료로 http://www.perforce.com/downloads/Perforce/20-User[] 에서 다운로드 받을 수 있다. ====== @@ -578,7 +578,7 @@ No remotes exist in this repository at all. Git-p4 has created some refs to represent the state of the server, and they look like remote refs to `git log`, but they're not managed by Git itself, and you can't push to them. ////////////////////////// 확인해보면 리모트가 전혀 없다. -git-p4는 리모트 서버의 상태를 보여주기 위해 몇 가지 Ref를 만든다. 이 Ref는 `git log`에서는 리모트인 것처럼 보이지만 사실 Git이 관리하는 리모트가 아니라서 Push 할 수 없다. +git-p4는 리모트 서버의 상태를 보여주기 위해 몇 가지 Ref를 만든다. 이 Ref는 `git log` 에서는 리모트인 것처럼 보이지만 사실 Git이 관리하는 리모트가 아니라서 Push 할 수 없다. ////////////////////////// ====== Workflow @@ -650,7 +650,7 @@ Applying: Change page title You can probably tell from the output, but `git p4 rebase` is a shortcut for `git p4 sync` followed by `git rebase p4/master`. It's a bit smarter than that, especially when working with multiple branches, but this is a good approximation. ////////////////////////// -실행 결과를 보면 단순히 `git p4 rebase`는 `git rebase p4/master` 하고 `git p4 sync` 명령을 실행한 것 처럼 보일 수 있다. +실행 결과를 보면 단순히 `git p4 rebase` 는 `git rebase p4/master` 하고 `git p4 sync` 명령을 실행한 것 처럼 보일 수 있다. 브랜치가 여러개인 상황에서 훨씬 효과를 보이지만 이렇게 생각해도 괜찮다. ////////////////////////// @@ -659,7 +659,7 @@ The `git p4 submit` command will try to create a new Perforce revision for every Running it drops us into our favorite editor, and the contents of the file look something like this: ////////////////////////// 이제 커밋 히스토리가 일직선이 됐고 Perforce 서버로 공유할 준비를 마쳤다. -`git p4 submit` 명령은 `p4/master`와 `master` 사이에 있는 모든 커밋에 대해 새 Perforce 리비전을 생성한다. +`git p4 submit` 명령은 `p4/master` 와 `master` 사이에 있는 모든 커밋에 대해 새 Perforce 리비전을 생성한다. 명령을 실행하면 주로 쓰는 편집기가 뜨고 아래와 같은 내용으로 채워진다. [source,console] @@ -716,7 +716,7 @@ This is mostly the same content you'd see by running `p4 submit`, except the stu Git-p4 tries to honor your Git and Perforce settings individually when it has to provide a name for a commit or changeset, but in some cases you want to override it. For example, if the Git commit you're importing was written by a contributor who doesn't have a Perforce user account, you may still want the resulting changeset to look like they write it (and not you). ////////////////////////// -이 내용은 `p4 submit`을 실행했을 때 보이는 내용과 같다. 다만 git-p4는 아래쪽에 도움이 될 만한 내용을 덧 붙여 준다. +이 내용은 `p4 submit` 을 실행했을 때 보이는 내용과 같다. 다만 git-p4는 아래쪽에 도움이 될 만한 내용을 덧 붙여 준다. git-p4는 커밋이나 Changeset을 생성할 때 최대한 Git과 Perforce에 있는 정보를 이용한다. 하지만 경우에 따라 변환할 때 직접 입력해줘야 할 수도 있다. 보내려고 하는 커밋의 저자가 Perforce에 계정이 없을 때도 그 저자가 작성한 Changeset으로 기록되길 바랄 것이다. @@ -725,7 +725,7 @@ Git-p4 has helpfully imported the message from the Git commit as the content for The resulting shell output will look something like this: ////////////////////////// git-p4가 Git 커밋의 내용을 바탕으로 Perforce Changeset의 메시지를 생성하기 때문에 보통 그냥 내용을 저장하고 편집기를 종료하면 된다. 커밋이 두 개 있으므로 저장하고 종료하기를 두 번 한다. -어쨌든간에 `git p4 submit`의 실행한 결과는 아래와 같다. +어쨌든간에 `git p4 submit` 의 실행한 결과는 아래와 같다. [source,console] ---- @@ -764,7 +764,7 @@ $ git log --oneline --all --graph --decorate ////////////////////////// The result is as though we just did a `git push`, which is the closest analogy to what actually did happen. ////////////////////////// -`git p4 submit`에 가까운 Git의 명령은 `push`이며 위의 결과를 보면 `git push` 명령을 실행한 것과 비슷하다. +`git p4 submit` 에 가까운 Git의 명령은 `push` 이며 위의 결과를 보면 `git push` 명령을 실행한 것과 비슷하다. ////////////////////////// Note that during this process every Git commit is turned into a Perforce changeset; if you want to squash them down into a single changeset, you can do that with an interactive rebase before running `git p4 submit`. @@ -837,7 +837,7 @@ The `-n` flag is short for `--dry-run`, which tries to report what would happen In this case, it looks like we'd be creating three Perforce changesets, which correspond to the three non-merge commits that don't yet exist on the Perforce server. That sounds like exactly what we want, let's see how it turns out: ////////////////////////// -`-n` 옵션은 `--dry-run`의 단축 옵션으로 명령일 실제로 실행하기 전에 어떻게 동작하는 지 미리 확인해 볼 수 있다. +`-n` 옵션은 `--dry-run` 의 단축 옵션으로 명령일 실제로 실행하기 전에 어떻게 동작하는 지 미리 확인해 볼 수 있다. 결과를 보면 로컬에만 있는 커밋 3개가 Perforce Changeset으로 잘 만들어지는 것으로 보인다. 확실히 이 결과는 우리가 원하던 바이다. 실제로 실행하자. @@ -953,7 +953,7 @@ If we now `git checkout -b dev p4/project/dev` and make some commits, git-p4 is Unfortunately, git-p4 can't mix shallow clones and multiple branches; if you have a huge project and want to work on more than one branch, you'll have to `git p4 clone` once for each branch you want to submit to. ////////////////////////// 이제 `git checkout -b dev p4/project/dev` 하고 커밋을 쌓으면, `git p4 submit` 명령을 실행할 때 git-p4가 똘똘하게 알아서 브랜치를 잘 찾아 준다. -안타깝게도 마지막 리비전만 받아 오는 Shallow Clone을 해야 하는 상황에서는 동시에 브랜치를 여러개 쓸 수 없다. 엄청나게 큰 Perforce이고 여러 브랜치를 오가며 작업해야 한다면 브랜치 별로 `git p4 clone`을 따로 하는 수 밖에 없다. +안타깝게도 마지막 리비전만 받아 오는 Shallow Clone을 해야 하는 상황에서는 동시에 브랜치를 여러개 쓸 수 없다. 엄청나게 큰 Perforce이고 여러 브랜치를 오가며 작업해야 한다면 브랜치 별로 `git p4 clone` 을 따로 하는 수 밖에 없다. ////////////////////////// For creating or integrating branches, you'll have to use a Perforce client. diff --git a/book/09-git-and-other-scms/sections/client-svn.asc b/book/09-git-and-other-scms/sections/client-svn.asc index 54875474..31de3d16 100644 --- a/book/09-git-and-other-scms/sections/client-svn.asc +++ b/book/09-git-and-other-scms/sections/client-svn.asc @@ -22,10 +22,10 @@ This means you can do local branching and merging, use the staging area, use reb It's a good way to sneak Git into the corporate environment and help your fellow developers become more efficient while you lobby to get the infrastructure changed to support Git fully. The Subversion bridge is the gateway drug to the DVCS world. ////////////////////////// -Git이 자랑하는 또 하나의 기능은 `git svn`이라는 양방향 Subversion 지원 도구이다. +Git이 자랑하는 또 하나의 기능은 `git svn` 이라는 양방향 Subversion 지원 도구이다. Git을 Subversion 클라이언트로 사용할 수 있기 때문에 로컬에서는 Git의 기능을 활용하고 Push 할 때는 Subversion 서버에 Push 한다. 로컬 브랜치와 Merge, Staging Area, Rebase, Cherry-pick 등의 Git 기능을 충분히 사용할 수 있다. 같이 일하는 동료는 빛 한줄기 없는 선사시대 동굴에서 일하겠지만 말이다. -`git svn`은 기업에서 git을 사용할 수 있도록 돕는 출발점이다. 회사가 아직 공식적으로 Git을 사용하지 않더라도 동료들과 먼저 Git을 이용해 더 효율적으로 일할 수 있다. +`git svn` 은 기업에서 git을 사용할 수 있도록 돕는 출발점이다. 회사가 아직 공식적으로 Git을 사용하지 않더라도 동료들과 먼저 Git을 이용해 더 효율적으로 일할 수 있다. 이 Subversion 지원 도구는 우리를 DVCS 세상으로 인도하는 붉은 알약과 같다. ===== `git svn` @@ -34,7 +34,7 @@ Git을 Subversion 클라이언트로 사용할 수 있기 때문에 로컬에서 The base command in Git for all the Subversion bridging commands is `git svn`. It takes quite a few commands, so we'll show the most common while going through a few simple workflows. ////////////////////////// -Git과 Subversion을 이어주는 명령은 `git svn`으로 시작한다. +Git과 Subversion을 이어주는 명령은 `git svn` 으로 시작한다. 이 명령 뒤에 추가하는 명령이 몇 가지 더 있으며 간단한 예제를 보여주고 설명한다. ////////////////////////// @@ -63,9 +63,9 @@ To demonstrate this functionality, you need a typical SVN repository that you ha If you want to copy these examples, you'll have to make a writeable copy of my test repository. In order to do that easily, you can use a tool called `svnsync` that comes with Subversion. ////////////////////////// -`git svn`을 사용하려면 SVN 저장소가 하나 필요하다. 저장소에 쓰기 권한이 있어야 한다. +`git svn` 을 사용하려면 SVN 저장소가 하나 필요하다. 저장소에 쓰기 권한이 있어야 한다. 필자의 test 저장소를 복사해서 해보자. -Subversion에 포함된 `svnsync`라는 도구를 사용하여 SVN 저장소를 복사한다. +Subversion에 포함된 `svnsync` 라는 도구를 사용하여 SVN 저장소를 복사한다. ////////////////////////// To follow along, you first need to create a new local Subversion repository: @@ -167,7 +167,7 @@ This can take a while. The test project has only about 75 commits and the codebase isn't that big, but Git has to check out each version, one at a time, and commit it individually. For a project with hundreds or thousands of commits, this can literally take hours or even days to finish. ////////////////////////// -이 명령은 사실 SVN 저장소 주소를 주고 `git svn init`과 `git svn fetch` 명령을 순서대로 실행한 것과 같다. +이 명령은 사실 SVN 저장소 주소를 주고 `git svn init` 과 `git svn fetch` 명령을 순서대로 실행한 것과 같다. 이 명령은 시간이 좀 걸린다. 테스트용 프로젝트는 커밋이 75개 정도밖에 안되서 시간이 오래 걸리지 않는다. Git은 커밋을 한 번에 하나씩 일일이 기록해야 한다. 커밋이 수천개인 프로젝트라면 몇 시간 혹은 몇 일이 걸릴 수도 있다. @@ -212,7 +212,7 @@ Subversion 태그를 리모트 브랜치처럼 관리하는 것을 알아두어 (((git commands, show-ref))) ////////////////////////// -Let's take a closer look with the Git plumbing command `show-ref`: +Let's take a closer look with the Git plumbing command `show-ref` : ////////////////////////// Plumbing 명령어인 `show-ref` 명령으로 리모트 브랜치의 정확한 이름을 확인할 수 있다. @@ -247,7 +247,7 @@ c3dcbe8488c6240392e8a5d7553bbffcb0f94ef0 refs/remotes/origin/master ////////////////////////// Git fetches the tags directly into `refs/tags`, rather than treating them remote branches. ////////////////////////// -Git 서버로부터 받은 태그라면 `refs/tags`에 넣어서 관리한다. +Git 서버로부터 받은 태그라면 `refs/tags` 에 넣어서 관리한다. ////////////////////////// ===== Committing Back to Subversion @@ -298,7 +298,7 @@ If you look at the last commit, you can see the new `git-svn-id` that was added: 이 명령은 새로 추가한 커밋을 모두 Subversion에 커밋하고 로컬 Git 커밋을 다시 만든다. 커밋을 다시 만들기 때문에 이미 저장된 커밋의 SHA-1 체크섬이 바뀐다. 그래서 리모트 Git 저장소와 Subversion 저장소를 함께 사용하면 안된다. -새로 만들어진 커밋을 살펴보면 아래와 같이 `git-svn-id`가 추가된다. +새로 만들어진 커밋을 살펴보면 아래와 같이 `git-svn-id` 가 추가된다. [source,console] ---- @@ -316,8 +316,8 @@ Date: Thu Jul 24 03:08:36 2014 +0000 Notice that the SHA-1 checksum that originally started with `4af61fd` when you committed now begins with `95e0222`. If you want to push to both a Git server and a Subversion server, you have to push (`dcommit`) to the Subversion server first, because that action changes your commit data. ////////////////////////// -원래 `4af61fd`로 시작하는 SHA-1 체크섬이 지금은 `95e0222`로 시작한다. -만약 Git 서버와 Subversion 서버에 함께 Push 하고 싶으면 우선 Subversion 서버에 `dcommit`으로 Push를 하고 그 다음에 Git 서버에 Push 해야 한다. +원래 `4af61fd` 로 시작하는 SHA-1 체크섬이 지금은 `95e0222` 로 시작한다. +만약 Git 서버와 Subversion 서버에 함께 Push 하고 싶으면 우선 Subversion 서버에 `dcommit` 으로 Push를 하고 그 다음에 Git 서버에 Push 해야 한다. ////////////////////////// ===== Pulling in New Changes @@ -374,7 +374,7 @@ Please see the above messages for details. ---- ////////////////////////// -Now, all your work is on top of what is on the Subversion server, so you can successfully `dcommit`: +Now, all your work is on top of what is on the Subversion server, so you can successfully `dcommit` : ////////////////////////// 그러면 서버 코드 위에 변경사항을 적용하기 때문에 성공적으로 `dcommit` 명령을 마칠 수 있다. @@ -394,8 +394,8 @@ Resetting to the latest refs/remotes/origin/trunk Note that unlike Git, which requires you to merge upstream work you don't yet have locally before you can push, `git svn` makes you do that only if the changes conflict (much like how Subversion works). If someone else pushes a change to one file and then you push a change to another file, your `dcommit` will work fine: ////////////////////////// -Push 하기 전에 Upstream과 Merge 해야 하는 Git과 달리 `git svn`은 충돌이 날때만 서버에 업데이트할 것이 있다고 알려 준다(Subversion 처럼). 이 점을 꼭 기억해야 한다. -만약 다른 사람이 한 파일을 수정하고 내가 그 사람과 다른 파일을 수정한다면 `dcommit`은 성공적으로 수행된다. +Push 하기 전에 Upstream과 Merge 해야 하는 Git과 달리 `git svn` 은 충돌이 날때만 서버에 업데이트할 것이 있다고 알려 준다(Subversion 처럼). 이 점을 꼭 기억해야 한다. +만약 다른 사람이 한 파일을 수정하고 내가 그 사람과 다른 파일을 수정한다면 `dcommit` 은 성공적으로 수행된다. [source,console] ---- @@ -457,8 +457,8 @@ If you're pushing to a Subversion server via `git svn`, you may want to rebase y The reason to prefer rebasing is that Subversion has a linear history and doesn't deal with merges like Git does, so `git svn` follows only the first parent when converting the snapshots into Subversion commits. ////////////////////////// Git에 익숙한 사람이면 일을 할 때 먼저 토픽 브랜치를 만들고, 일을 끝낸 다음에, Merge 하는 방식을 쓰려고 할 것이다. -하지만, `git svn`으로 Subversion 서버에 Push 할 때는 브랜치를 Merge 하지 않고 Rebase 해야 한다. -Subversion은 일직선 히스토리 밖에 모르고 Git의 Merge 도 알지 못한다. 그래서 `git svn`은 첫 번째 부모 정보만 사용해서 Git 커밋을 Subversion 커밋으로 변경한다. +하지만, `git svn` 으로 Subversion 서버에 Push 할 때는 브랜치를 Merge 하지 않고 Rebase 해야 한다. +Subversion은 일직선 히스토리 밖에 모르고 Git의 Merge 도 알지 못한다. 그래서 `git svn` 은 첫 번째 부모 정보만 사용해서 Git 커밋을 Subversion 커밋으로 변경한다. ////////////////////////// Suppose your history looks like the following: you created an `experiment` branch, did two commits, and then merged them back into `master`. @@ -491,7 +491,7 @@ Running `dcommit` on a branch with merged history works fine, except that when y Merge 커밋이 들어 있는 히스토리에서 `dcommit` 명령을 실행한다. 그리고 나서 Git 히스토리를 살펴보면 `experiment` 브랜치의 커밋은 재작성되지 않았다. 대신 Merge 커밋만 SVN 서버로 전송됐을 뿐이다. ////////////////////////// -When someone else clones that work, all they see is the merge commit with all the work squashed into it, as though you ran `git merge --squash`; they don't see the commit data about where it came from or when it was committed. +When someone else clones that work, all they see is the merge commit with all the work squashed into it, as though you ran `git merge --squash` ; they don't see the commit data about where it came from or when it was committed. ////////////////////////// 누군가 이 것을 내려 받으면 `git merge --squash` 한 것 마냥 결과가 합쳐진 Merge 커밋 하나만 볼 수 있다. 다른 사람은 언제 어디서 커밋한 것인지 알 수 없다. @@ -505,7 +505,7 @@ Branching in Subversion isn't the same as branching in Git; if you can avoid usi However, you can create and commit to branches in Subversion using `git svn`. ////////////////////////// Subversion의 브랜치는 Git의 브랜치와 달라서 가능한 사용을 하지 않는 것이 좋다. -하지만 `git svn`으로도 Subversion 브랜치를 관리할 수 있다. +하지만 `git svn` 으로도 Subversion 브랜치를 관리할 수 있다. ////////////////////////// ===== Creating a New SVN Branch @@ -549,7 +549,7 @@ Git figures out what branch your dcommits go to by looking for the tip of any of If you want to work on more than one branch simultaneously, you can set up local branches to `dcommit` to specific Subversion branches by starting them at the imported Subversion commit for that branch. If you want an `opera` branch that you can work on separately, you can run ////////////////////////// -동시에 여러 브랜치에서 작업하려면 Subversion 브랜치에 `dcommit`할 수 있는 로컬 브랜치가 필요하다. 이 브랜치는 Subversion 커밋에서 시작하는 브랜치다. +동시에 여러 브랜치에서 작업하려면 Subversion 브랜치에 `dcommit` 할 수 있는 로컬 브랜치가 필요하다. 이 브랜치는 Subversion 커밋에서 시작하는 브랜치다. 아래와 같이 `opera` 브랜치를 만들면 독립적으로 일 할 수 있다. [source,console] @@ -575,7 +575,7 @@ To avoid issues, you should delete the local branch (in this case, `opera`) afte `git merge` 명령으로 Merge 한다는 것에 주목하자. Git은 자동으로 공통 커밋을 찾아서 Merge 에 참고하기 때문에 Subversion에서 하는 것보다 Merge가 더 잘된다. 여기서 생성되는 Merge 커밋은 일반적인 Merge 커밋과 다르다. 이 커밋을 Subversion 서버에 Push 해야 하지만 Subversion에서는 부모가 2개인 커밋이 있을 수 없다. 그래서 Push 하면 브랜치에서 만들었던 커밋 여러개가 하나로 합쳐진(squash된) 것처럼 Push 된다. 그래서 일단 Merge 하면 취소하거나 해당 브랜치에서 계속 작업하기 어렵다. -`dcommit` 명령을 수행하면 Merge 한 브랜치의 정보를 어쩔 수 없이 잃어버리게 된다. Merge Base도 찾을 수 없게 된다.`dcommit` 명령은 Merge 한 것을 `git merge --squash`로 Merge 한 것과 똑 같이 만들어 버린다. +`dcommit` 명령을 수행하면 Merge 한 브랜치의 정보를 어쩔 수 없이 잃어버리게 된다. Merge Base도 찾을 수 없게 된다.`dcommit` 명령은 Merge 한 것을 `git merge --squash` 로 Merge 한 것과 똑 같이 만들어 버린다. Branch를 Merge 한 정보는 저장되지 않기 때문에 이 문제를 해결할 방법이 없다. 문제를 최소화하려면 trunk에 Merge 하자마자 해당 브랜치를(여기서는 `opera`) 삭제하는 것이 좋다. @@ -627,7 +627,7 @@ Second, it only shows you commits that have been committed up to the Subversion Local Git commits that you haven't dcommited don't show up; neither do commits that people have made to the Subversion server in the meantime. It's more like the last known state of the commits on the Subversion server. ////////////////////////// -`git svn log`명령에서 기억해야 할 것은 두 가지다. +`git svn log` 명령에서 기억해야 할 것은 두 가지다. 우선 오프라인에서 동작한다는 점이다. SVN의 `svn log` 명령어는 히스토리 데이터를 조회할 때 서버가 필요하다. 둘째로 이미 서버로 전송한 커밋만 출력해준다. 아직 `dcommit` 명령으로 서버에 전송하지 않은 로컬 Git 커밋은 보여주지 않는다. Subversion 서버에는 있지만 아직 내려받지 않은 변경사항도 보여주지 않는다. @@ -673,7 +673,7 @@ Again, it doesn't show commits that you did locally in Git or that have been pus ====== SVN 서버 정보 ////////////////////////// -You can also get the same sort of information that `svn info` gives you by running `git svn info`: +You can also get the same sort of information that `svn info` gives you by running `git svn info` : ////////////////////////// `svn info` 명령은 `git svn info` 명령으로 대신할 수 있다. @@ -695,7 +695,7 @@ Last Changed Date: 2009-05-02 16:07:37 -0700 (Sat, 02 May 2009) ////////////////////////// This is like `blame` and `log` in that it runs offline and is up to date only as of the last time you communicated with the Subversion server. ////////////////////////// -`blame`이나 `log`명령이 오프라인으로 동작하듯이 이 명령도 오프라인으로 동작한다. 서버에서 가장 최근에 내려받은 정보를 출력한다. +`blame` 이나 `log` 명령이 오프라인으로 동작하듯이 이 명령도 오프라인으로 동작한다. 서버에서 가장 최근에 내려받은 정보를 출력한다. ////////////////////////// ====== Ignoring What Subversion Ignores @@ -708,13 +708,13 @@ If you clone a Subversion repository that has `svn:ignore` properties set anywhe The first is `git svn create-ignore`, which automatically creates corresponding `.gitignore` files for you so your next commit can include them. ////////////////////////// Subversion 저장소를 클론하면 쓸데 없는 파일을 커밋하지 않도록 `svn:ignore` 속성을 `.gitignore` 파일로 만들고 싶을 것이다. -`git svn`에는 이 문제와 관련된 명령이 두 가지 있다. +`git svn` 에는 이 문제와 관련된 명령이 두 가지 있다. 하나는 `git svn create-ignore` 명령이다. 해당 위치에 커밋할 수 있는 `.gitignore` 파일을 생성해준다. ////////////////////////// The second command is `git svn show-ignore`, which prints to stdout the lines you need to put in a `.gitignore` file so you can redirect the output into your project exclude file: ////////////////////////// -두 번째 방법은 `git svn show-ignore` 명령이다. `.gitignore`에 추가할 목록을 출력해 준다. 프로젝트의 exclude 파일로 결과를 리다이렉트할 수 있다. +두 번째 방법은 `git svn show-ignore` 명령이다. `.gitignore` 에 추가할 목록을 출력해 준다. 프로젝트의 exclude 파일로 결과를 리다이렉트할 수 있다. [source,console] ---- @@ -749,11 +749,11 @@ Git과 Subversion은 다르기 때문에 혼란이 빚어질 수도 있다. Possibly have one to speed up clones for new developers, but don't push anything to it that doesn't have a `git-svn-id` entry. You may even want to add a `pre-receive` hook that checks each commit message for a `git-svn-id` and rejects pushes that contain commits without it. ////////////////////////// -* Git 히스토리를 일직선으로 유지하라. `git merge`로 Merge 커밋이 생기지 않도록 하라. +* Git 히스토리를 일직선으로 유지하라. `git merge` 로 Merge 커밋이 생기지 않도록 하라. Merge 말고 Rebase로 변경사항을 Master 브랜치에 적용하라. * 따로 Git 저장소 서버를 두지 말라. 클론을 빨리 하기 위해서 잠깐 하나 만들어 쓰는 것은 무방하나 절대로 Git 서버에 Push 하지는 말아야 한다. - `pre-receive` 훅에서 `git-svn-id`가 들어 있는 커밋 메시지는 거절하는 방법도 괜찮다. + `pre-receive` 훅에서 `git-svn-id` 가 들어 있는 커밋 메시지는 거절하는 방법도 괜찮다. ////////////////////////// If you follow those guidelines, working with a Subversion server can be more bearable. diff --git a/book/09-git-and-other-scms/sections/client-tfs.asc b/book/09-git-and-other-scms/sections/client-tfs.asc index 869109f8..94c8f019 100644 --- a/book/09-git-and-other-scms/sections/client-tfs.asc +++ b/book/09-git-and-other-scms/sections/client-tfs.asc @@ -86,10 +86,10 @@ Codeplex(https://www.codeplex.com[])나 Visual Studio 온라인 (http://www.visu //////////// The first thing you do, just as with any Git project, is clone. -Here's what that looks like with `git-tf`: +Here's what that looks like with `git-tf` : //////////// 먼저 해야 할 것은 여느 Git 프로젝트에서 했던 것처럼 Clone 이다. -`git-tf`에서는 아래과 같이 한다. +`git-tf` 에서는 아래과 같이 한다. [source,console] ---- @@ -152,7 +152,7 @@ They aren't necessary (and in fact you can turn them off with `git config git-tf //////////// `TFS_C35189` 태그를 보자. 어떤 Git 커밋이 어떤 TFVC의 Changeset과 연결되는지 보여준다. 로그 명령어로 간단하게 어떤 TFVC의 스냅샷과 연결되는지 알 수 있다. -이 기능은 필수가 아니고 `git config git-tf.tag false`명령어로 끌 수 있다. git-tf는 커밋-Changeset 매핑 정보를 `.git/git-tf`에 보관한다. +이 기능은 필수가 아니고 `git config git-tf.tag false` 명령어로 끌 수 있다. git-tf는 커밋-Changeset 매핑 정보를 `.git/git-tf` 에 보관한다. //////////// @@ -218,9 +218,9 @@ There are two local branches, `master` and `featureA`, which represent the initi You can also see that the `tfs` ``remote'' has a couple of refs too: `default` and `featureA`, which represent TFVC branches. Git-tfs maps the branch you cloned from to `tfs/default`, and others get their own names. //////////// -보면 로컬 브랜치가 두 개다. `master`와 `featureA`가 있는데 TFVC의 `Trunk`와 그 자식 브랜치 `featureA`에 해당된다. -그리고 TFS 서버를 나타내는 `tfs` ``리모트''에는 TFS의 브랜치인 `default`와 `featureA`가 있다. -git-tfs는 Clone 한 브랜치를 `tfs/default`라는 이름으로 매핑하고 다른 브랜치는 원래 이름을 그대로 부여한다. +보면 로컬 브랜치가 두 개다. `master` 와 `featureA` 가 있는데 TFVC의 `Trunk` 와 그 자식 브랜치 `featureA` 에 해당된다. +그리고 TFS 서버를 나타내는 `tfs` ``리모트''에는 TFS의 브랜치인 `default` 와 `featureA` 가 있다. +git-tfs는 Clone 한 브랜치를 `tfs/default` 라는 이름으로 매핑하고 다른 브랜치는 원래 이름을 그대로 부여한다. //////////// Another thing to notice is the `git-tfs-id:` lines in the commit messages. @@ -290,7 +290,7 @@ In the interest of brevity, what we'll cover here is the happy path, which sides Let's say you've done some work, made a couple of Git commits on `master`, and you're ready to share your progress on the TFVC server. Here's our Git repository: //////////// -어떤 일을 마치고 Git으로 `master`에 커밋을 두 개 생성했다. 그리고 이 커밋을 TFVC 서버로 올려 팀원들과 공유하고자 한다. +어떤 일을 마치고 Git으로 `master` 에 커밋을 두 개 생성했다. 그리고 이 커밋을 TFVC 서버로 올려 팀원들과 공유하고자 한다. 이때 Git 저장소는 상태는 아래와 같다. [source,console] @@ -346,7 +346,7 @@ This is where Git shines, but we have two choices of how to proceed: . Rebasing makes our commit history linear, which means we have the option of converting each of our Git commits into a TFVC changeset. Since this leaves the most options open, we recommend you do it this way; git-tf even makes it easy for you with `git tf pull --rebase`. //////////// -. 평범하게 Merge 커밋을 만든다. 여기까지가 `git pull`이 하는 일이다. git-tf에서는 `git tf pull` 명령로 한다. +. 평범하게 Merge 커밋을 만든다. 여기까지가 `git pull` 이 하는 일이다. git-tf에서는 `git tf pull` 명령로 한다. 하지만 주의사항이 있다. TFVC는 이런 방법을 이해하지 못한다. Merge 커밋을 Push 하면 서버와 클라이언트의 히스토리가 달라진다. 좀 혼란스럽다. 모든 변경 사항을 Changeset 하나로 합쳐서 올리려고 한다면 이 방법이 제일 쉽다. . Rebase로 히스토리를 평평하게 편다. 이렇게 하면 Git 커밋 하나를 TFVC Changeset 하나로 변환할 수 있다. @@ -476,7 +476,7 @@ PS> git log --all --oneline --graph --decorate //////////// Yes, it turns out our coworker has added a new TFVC changeset, which shows up as the new `aea74a0` commit, and the `tfs/default` remote branch has moved. //////////// -다른 동료가 새로운 Changeset을 만들었다. Git에서 `aea74a0`으로 보인다. 그리고 리모트 브랜치 `tfs/default`가 전진했다. +다른 동료가 새로운 Changeset을 만들었다. Git에서 `aea74a0` 으로 보인다. 그리고 리모트 브랜치 `tfs/default` 가 전진했다. //////////// As with git-tf, we have two fundamental options for how to resolve this divergent history: @@ -615,7 +615,7 @@ Note also that git-tfs *created* the `tfs/featureBee` remote branch, but `HEAD` If you want to work on the newly-minted branch, you'll want to base your new commits on the `1d54865` commit, perhaps by creating a topic branch from that commit. //////////// TFVC에 브랜치를 만들면 현재 있는 브랜치에 Changeset이 하나 추가된다. 이 Changeset은 Git의 커밋으로 표현된다. -*git-tfs*는 `tfs/featureBee`라는 리모트 브랜치를 만들었지만, `HEAD`는 여전히 `master`를 가리킨다. +*git-tfs*는 `tfs/featureBee` 라는 리모트 브랜치를 만들었지만, `HEAD` 는 여전히 `master` 를 가리킨다. 방금 만든 브랜치에서 작업을 하려면 새로 만든 커밋 `1d54865`에서 시작하면 된다. 이 커밋부터 새로운 토픽 브랜치가 만들어진다. //////////// diff --git a/book/09-git-and-other-scms/sections/import-custom.asc b/book/09-git-and-other-scms/sections/import-custom.asc index 59edde28..e0e95933 100644 --- a/book/09-git-and-other-scms/sections/import-custom.asc +++ b/book/09-git-and-other-scms/sections/import-custom.asc @@ -15,11 +15,11 @@ This way, you can write an import script that reads the necessary information ou You can then run this program and pipe its output through `git fast-import`. ////////////////////////// 사용하는 VCS가 앞서 살펴본 시스템이 아니면 인터넷에서 적당한 Importer를 찾아봐야 한다. CVS, Clear Case, Visual Source Safe 같은 시스템용 Importer가 좋은게 많다. 심지어 단순히 디렉토리 아카이브용 Importer에도 좋은게 있다. -사람들이 잘 안쓰는 시스템을 사용하고 있는데 적당한 Importer를 못 찾았거나 부족해서 좀 더 고쳐야 한다면 `git fast-import`를 사용한다. +사람들이 잘 안쓰는 시스템을 사용하고 있는데 적당한 Importer를 못 찾았거나 부족해서 좀 더 고쳐야 한다면 `git fast-import` 를 사용한다. 이 명령은 표준입력으로 데이터를 입력받는다. <> 에서 배우는 저수준 명령어와 내부 객체를 직접 다루는 것보다 훨씬 쉽다. 먼저 사용하는 VCS에서 필요한 정보를 수집해서 표준출력으로 출력하는 스크립트를 만든다. -그리고 그 결과를 `git fast-import`의 표준입력으로 보낸다. +그리고 그 결과를 `git fast-import` 의 표준입력으로 보낸다. ////////////////////////// To quickly demonstrate, you'll write a simple importer. @@ -27,7 +27,7 @@ Suppose you work in `current`, you back up your project by occasionally copying Your directory structure looks like this: ////////////////////////// 간단한 Importer를 작성해보자. -`current` 디렉토리에서 작업하고 `back_YYYY_MM_DD`이라는 디렉토리에 백업하면서 진행했던 프로젝트를 살펴 보자. +`current` 디렉토리에서 작업하고 `back_YYYY_MM_DD` 이라는 디렉토리에 백업하면서 진행했던 프로젝트를 살펴 보자. Importer를 만들 때 디렉토리 상태는 아래와 같다. [source,console] @@ -48,7 +48,7 @@ Your strategy will be to go through the snapshots one at a time and create commi ////////////////////////// Importer를 만들기 전에 우선 Git이 어떻게 데이터를 저장하는지 알아야 한다. 이미 알고 있듯이 Git은 기본적으로 스냅샷을 가리키는 커밋 개체가 연결된 리스트이다. -스냅샷이 뭐고, 그걸 가리키는 커밋은 또 뭐고, 그 커밋의 순서가 어떻게 되는지 `fast-import`에 알려 줘야 한다. 이 것이 해야할 일의 전부다. +스냅샷이 뭐고, 그걸 가리키는 커밋은 또 뭐고, 그 커밋의 순서가 어떻게 되는지 `fast-import` 에 알려 줘야 한다. 이 것이 해야할 일의 전부다. 그러면 디렉토리마다 스냅샷을 만들고, 그 스냅샷을 가리키는 커밋 개체를 만들고, 이전 커밋과 연결 시킨다. ////////////////////////// @@ -91,9 +91,9 @@ You run `print_export` inside each directory, which takes the manifest and mark ``Mark'' is the `fast-import` term for an identifier you give to a commit; as you create commits, you give each one a mark that you can use to link to it from other commits. So, the first thing to do in your `print_export` method is generate a mark from the directory name: ////////////////////////// -각 디렉토리에서 `print_export`를 호출하는데 이 함수는 아규먼트로 디렉토리와 이전 스냅샷 Mark를 전달받고 현 스냅샷 Mark를 반환한다. 그래서 적절히 연결 시킬 수 있다. -`fast-import`에서 ``Mark''는 커밋의 식별자를 말한다. 커밋을 하나 만들면 ``Mark''도 같이 만들어 이 ``Mark''로 다른 커밋과 연결 시킨다. -그래서 `print_export`에서 우선 해야 하는 일은 각 디렉토리 이름으로 ``Mark''를 생성하는 것이다. +각 디렉토리에서 `print_export` 를 호출하는데 이 함수는 아규먼트로 디렉토리와 이전 스냅샷 Mark를 전달받고 현 스냅샷 Mark를 반환한다. 그래서 적절히 연결 시킬 수 있다. +`fast-import` 에서 ``Mark''는 커밋의 식별자를 말한다. 커밋을 하나 만들면 ``Mark''도 같이 만들어 이 ``Mark''로 다른 커밋과 연결 시킨다. +그래서 `print_export` 에서 우선 해야 하는 일은 각 디렉토리 이름으로 ``Mark''를 생성하는 것이다. [source,ruby] ---- @@ -125,7 +125,7 @@ The next line in your `print_export` file is: ////////////////////////// 각 커밋을 가리키는 정수 Mark를 만들었고 다음에는 커밋 메타데이터에 넣을 날짜 정보가 필요하다. 이 날짜는 디렉토리 이름에 있는 것을 가져다 사용한다. -`print_export`의 두 번째 라인은 아래와 같다. +`print_export` 의 두 번째 라인은 아래와 같다. [source,ruby] ---- @@ -135,7 +135,7 @@ date = convert_dir_to_date(dir) ////////////////////////// where `convert_dir_to_date` is defined as: ////////////////////////// -`convert_dir_to_date`는 아래와 같이 정의한다. +`convert_dir_to_date` 는 아래와 같이 정의한다. [source,ruby] ---- @@ -197,10 +197,10 @@ data (size)\n(contents) ////////////////////////// The format consists of the word data, the size of the data to be read, a newline, and finally the data. -Because you need to use the same format to specify the file contents later, you create a helper method, `export_data`: +Because you need to use the same format to specify the file contents later, you create a helper method, `export_data` : ////////////////////////// 이 형식은 ``data''라는 단어, 읽을 데이터의 크기, 라인 바꿈 문자, 실 데이터로 구성된다. -이 형식을 여러 곳에서 사용해야 하므로 `export_data`라는 Helper 메소드로 만들어 놓는게 좋다. +이 형식을 여러 곳에서 사용해야 하므로 `export_data` 라는 Helper 메소드로 만들어 놓는게 좋다. [source,ruby] ---- @@ -215,7 +215,7 @@ This is easy, because you have each one in a directory – you can print out the Git will then record each snapshot appropriately: ////////////////////////// 이제 남은 것은 스냅샷에 파일 내용를 포함시키는 것 뿐이다. -디렉토리로 구분돼 있기 때문에 어렵지 않다. 우선 `deleteall`이라는 명령을 출력하고 그 뒤에 모든 파일의 내용을 출력한다. +디렉토리로 구분돼 있기 때문에 어렵지 않다. 우선 `deleteall` 이라는 명령을 출력하고 그 뒤에 모든 파일의 내용을 출력한다. 그러면 Git은 스냅샷을 잘 저장한다. [source,ruby] @@ -234,7 +234,7 @@ If this is better suited to your data, check the `fast-import` man page for deta ////////////////////////// Note: 대부분의 VCS는 리비전을 커밋간의 변화로 생각하기 때문에 fast-import에 추가/삭제/변경된 부분만 입력할 수도 있다. 스냅샷 사이의 차이를 구해서 fast-import에 넘길 수도 있지만 훨씬 복잡하다. 줄 수 있는 데이터는 전부 Git에 줘서 Git이 계산하게 해야 한다. -꼭 이렇게 해야 한다면 어떻게 데이터를 전달해야 하는지 `fast-import`의 ManPage를 참고하라. +꼭 이렇게 해야 한다면 어떻게 데이터를 전달해야 하는지 `fast-import` 의 ManPage를 참고하라. ////////////////////////// The format for listing the new file contents or specifying a modified file with the new contents is as follows: @@ -294,7 +294,7 @@ $stdout.binmode ////////////////////////// ==== Windows에서 실행할 때는 추가 작업이 하나 더 필요하다. -앞에서 얘기했지만 Windows는 CRLF를 사용하지만 `git fast-import`는 LF를 사용한다. +앞에서 얘기했지만 Windows는 CRLF를 사용하지만 `git fast-import` 는 LF를 사용한다. 이 문제를 해결 하려면 Ruby가 CRLF 대신 LF를 사용하도록 알려 줘야 한다. [source,ruby] diff --git a/book/09-git-and-other-scms/sections/import-svn.asc b/book/09-git-and-other-scms/sections/import-svn.asc index e6729f07..8e0893db 100644 --- a/book/09-git-and-other-scms/sections/import-svn.asc +++ b/book/09-git-and-other-scms/sections/import-svn.asc @@ -6,7 +6,7 @@ If you read the previous section about using `git svn`, you can easily use those instructions to `git svn clone` a repository; then, stop using the Subversion server, push to a new Git server, and start using that. If you want the history, you can accomplish that as quickly as you can pull the data out of the Subversion server (which may take a while). ////////////////////////// -`git svn`을 설명하는 절을 읽었으면 쉽게 `git svn clone` 명령으로 저장소를 가져올 수 있다. 가져오고 나서 Subversion 서버는 중지하고 Git 서버를 만들고 사용하면 된다. +`git svn` 을 설명하는 절을 읽었으면 쉽게 `git svn clone` 명령으로 저장소를 가져올 수 있다. 가져오고 나서 Subversion 서버는 중지하고 Git 서버를 만들고 사용하면 된다. 만약 히스토리 정보가 필요하면 (느린) Subversion 서버 없이 로컬에서 조회할 수 있다. ////////////////////////// @@ -20,9 +20,9 @@ Create a file called `users.txt` that has this mapping in a format like this: 하지만 이 가져오기 기능에 문제가 좀 있다. 가져오는데 시간이 많이 드니까 일단 시작하는 것이 좋다. 첫 번째 문제는 Author 정보이다. Subversion에서는 커밋하려면 해당 시스템 계정이 있어야 한다. -`blame`이나 `git svn log` 같은 명령에서 `schacon`이라는 이름을 봤을 것이다. +`blame` 이나 `git svn log` 같은 명령에서 `schacon` 이라는 이름을 봤을 것이다. 이 정보를 Git 형식의 정보로 변경하려면 Subversion 사용자와 Git Author를 연결시켜줘야 한다. -Subversion 사용자이름과 Git Author 간에 매핑할 수 있게 해줘야 한다. `users.txt`라는 파일을 아래와 같이 만든다. +Subversion 사용자이름과 Git Author 간에 매핑할 수 있게 해줘야 한다. `users.txt` 라는 파일을 아래와 같이 만든다. [source] ---- @@ -110,7 +110,7 @@ For one thing, you should clean up the weird references that `git svn` set up. First you'll move the tags so they're actual tags rather than strange remote branches, and then you'll move the rest of the branches so they're local. ////////////////////////// 이제 뒷 정리를 할 차례다. -`git svn`이 만들어 준 이상한 브랜치나 태그를 제거한다. +`git svn` 이 만들어 준 이상한 브랜치나 태그를 제거한다. 우선 이상한 리모트 태그를 모두 진짜 Git 태그로 옮긴다. 그리고 리모트 브랜치도 로컬 브랜치로 옮긴다. ////////////////////////// @@ -126,7 +126,7 @@ $ for t in $(git for-each-ref --format='%(refname:short)' refs/remotes/tags); do ////////////////////////// This takes the references that were remote branches that started with `refs/remotes/tags/` and makes them real (lightweight) tags. ////////////////////////// -`refs/remotes/tags/`로 시작하는 리모트 브랜치를 가져다 Lightweight 태그로 만들었다. +`refs/remotes/tags/` 로 시작하는 리모트 브랜치를 가져다 Lightweight 태그로 만들었다. ////////////////////////// Next, move the rest of the references under `refs/remotes` to be local branches: diff --git a/book/09-git-and-other-scms/sections/import-tfs.asc b/book/09-git-and-other-scms/sections/import-tfs.asc index b1df7bd4..fdb55c0f 100644 --- a/book/09-git-and-other-scms/sections/import-tfs.asc +++ b/book/09-git-and-other-scms/sections/import-tfs.asc @@ -28,7 +28,7 @@ You can get this information from the `tf` command-line client, like so: //////////// 먼저 사용자이름을 대응시킨다. TFVC Changeset의 Author 필드는 형식이 자유롭지만 Git에는 사람이 읽을 수 있는 이름과 E-mail 주소로 정해져 있다. -이 정보는 커맨드라인 클라이언트인 `tf`로 가져온다. +이 정보는 커맨드라인 클라이언트인 `tf` 로 가져온다. [source,powershell] ---- diff --git a/book/10-git-internals/sections/environment.asc b/book/10-git-internals/sections/environment.asc index 15a30c48..48f71999 100644 --- a/book/10-git-internals/sections/environment.asc +++ b/book/10-git-internals/sections/environment.asc @@ -23,45 +23,45 @@ Some of Git's general behavior as a computer program depends on environment vari Git의 여러 기능 중 일반적인 기능이 동작할 때 영향을 미치는 주요 환경변수는 아래와 같다. ////////////////////////// -*`GIT_EXEC_PATH`* determines where Git looks for its sub-programs (like `git-commit`, `git-diff`, and others). +*`GIT_EXEC_PATH` * determines where Git looks for its sub-programs (like `git-commit`, `git-diff`, and others). You can check the current setting by running `git --exec-path`. ////////////////////////// -*`GIT_EXEC_PATH`* 변수는 Git의 여러 Subprogram(예를 들어 `git-commit`, `git-diff` 같은 것들)이 어디에 있는지를 설정한다. +*`GIT_EXEC_PATH` * 변수는 Git의 여러 Subprogram(예를 들어 `git-commit`, `git-diff` 같은 것들)이 어디에 있는지를 설정한다. 현재 설정을 확인하려면 `git --exec-path` 명령을 실행한다. ////////////////////////// -*`HOME`* isn't usually considered customizable (too many other things depend on it), but it's where Git looks for the global configuration file. +*`HOME` * isn't usually considered customizable (too many other things depend on it), but it's where Git looks for the global configuration file. If you want a truly portable Git installation, complete with global configuration, you can override `HOME` in the portable Git's shell profile. ////////////////////////// -*`HOME`* 변수는 일반적으로 변경하지 않는 변수이다. 아주 많은 프로그램이 이 변수를 참조하기 때문이다. Git이 이 변수에 영향을 받는 부분은 사용자(User) 전체에 영향을 주는 Git 환경설정 파일을 찾을 때이다. +*`HOME` * 변수는 일반적으로 변경하지 않는 변수이다. 아주 많은 프로그램이 이 변수를 참조하기 때문이다. Git이 이 변수에 영향을 받는 부분은 사용자(User) 전체에 영향을 주는 Git 환경설정 파일을 찾을 때이다. Git을 포터블로 설치하거나 해서 사용자 환경설정 파일의 위치를 강제로 지정해야 하면 Git을 실행하는 셸의 `HOME` 변수에 원하는 값을 설정한다. ////////////////////////// -*`PREFIX`* is similar, but for the system-wide configuration. +*`PREFIX` * is similar, but for the system-wide configuration. Git looks for this file at `$PREFIX/etc/gitconfig`. ////////////////////////// -*`PREFIX`* 변수도 비슷한 성격으로 사용자 수준이 아닌 시스템 수준의 환경설정 파일을 찾을 위치를 설정한다. +*`PREFIX` * 변수도 비슷한 성격으로 사용자 수준이 아닌 시스템 수준의 환경설정 파일을 찾을 위치를 설정한다. Git이 찾을 위치는 `$PREFIX/etc/gitconfig` 이다. ////////////////////////// -*`GIT_CONFIG_NOSYSTEM`*, if set, disables the use of the system-wide configuration file. +*`GIT_CONFIG_NOSYSTEM` *, if set, disables the use of the system-wide configuration file. This is useful if your system config is interfering with your commands, but you don't have access to change or remove it. ////////////////////////// -*`GIT_CONFIG_NOSYSTEM`* 변수를 설정하면 시스템 수준의 환경설정 파일을 적용하지 않는다. +*`GIT_CONFIG_NOSYSTEM` * 변수를 설정하면 시스템 수준의 환경설정 파일을 적용하지 않는다. 이 변수는 시스템 수준의 환경설정 파일이 자꾸 방해되는데 고칠 권한이 없는 경우 설정하면 유용하다. ////////////////////////// -*`GIT_PAGER`* controls the program used to display multi-page output on the command line. +*`GIT_PAGER` * controls the program used to display multi-page output on the command line. If this is unset, `PAGER` will be used as a fallback. ////////////////////////// -*`GIT_PAGER`* 변수는 Git이 화면에 출력할 내용이 한 화면이 넘어갈 때 사용할 프로그램을 설정한다. +*`GIT_PAGER` * 변수는 Git이 화면에 출력할 내용이 한 화면이 넘어갈 때 사용할 프로그램을 설정한다. 이 변수에 값을 설정하지 않으면 `PAGER` 변수의 내용도 참고한다. ////////////////////////// -*`GIT_EDITOR`* is the editor Git will launch when the user needs to edit some text (a commit message, for example). +*`GIT_EDITOR` * is the editor Git will launch when the user needs to edit some text (a commit message, for example). If unset, `EDITOR` will be used. ////////////////////////// -*`GIT_EDITOR`* 변수는 커밋 내용을 입력하는 상황과 같이 Git이 사용자로부터 어떤 내용을 입력받는 경우 실행시킬 편집기를 설정하는 변수이다. +*`GIT_EDITOR` * 변수는 커밋 내용을 입력하는 상황과 같이 Git이 사용자로부터 어떤 내용을 입력받는 경우 실행시킬 편집기를 설정하는 변수이다. 이 변수에 값을 설정하지 않으면 `EDITOR` 변수의 내용도 참고한다. @@ -76,41 +76,41 @@ Git uses several environment variables to determine how it interfaces with the c Git은 현재 작업 중인 저장소를 참조할 때 아래와 같은 환경변수에 영향을 받는다. ////////////////////////// -*`GIT_DIR`* is the location of the `.git` folder. +*`GIT_DIR` * is the location of the `.git` folder. If this isn't specified, Git walks up the directory tree until it gets to `~` or `/`, looking for a `.git` directory at every step. ////////////////////////// -*`GIT_DIR`* 변수는 `.git` 디렉토리의 위치를 설정하는 변수다. -이 변수의 값을 설정하지 않으면 현재 디렉토리에서부터 `~`나 `/` 까지 한 단계씩 위로 올라가면서 `.git` 디렉토리가 있는지 찾는다. +*`GIT_DIR` * 변수는 `.git` 디렉토리의 위치를 설정하는 변수다. +이 변수의 값을 설정하지 않으면 현재 디렉토리에서부터 `~` 나 `/` 까지 한 단계씩 위로 올라가면서 `.git` 디렉토리가 있는지 찾는다. ////////////////////////// -*`GIT_CEILING_DIRECTORIES`* controls the behavior of searching for a `.git` directory. +*`GIT_CEILING_DIRECTORIES` * controls the behavior of searching for a `.git` directory. If you access directories that are slow to load (such as those on a tape drive, or across a slow network connection), you may want to have Git stop trying earlier than it might otherwise, especially if Git is invoked when building your shell prompt. ////////////////////////// -*`GIT_CEILING_DIRECTORIES`* 변수는 `.git` 디렉토리를 찾으려고 한 단계씩 위로 올라가는 작업을 제어한다. +*`GIT_CEILING_DIRECTORIES` * 변수는 `.git` 디렉토리를 찾으려고 한 단계씩 위로 올라가는 작업을 제어한다. 사용하는 시스템의 저장장치를 읽고 쓰는 속도가 무지하게 느리면 이 변수를 적절하게 설정한다. 불필요하게 `.git` 디렉토리를 찾아서 계속 저장장치의 디렉토리를 돌아다니지 않아도 된다. ////////////////////////// -*`GIT_WORK_TREE`* is the location of the root of the working directory for a non-bare repository. +*`GIT_WORK_TREE` * is the location of the root of the working directory for a non-bare repository. If not specified, the parent directory of `$GIT_DIR` is used. ////////////////////////// -*`GIT_WORK_TREE`* 변수는 Git 저장소가 관리하는 실제 소스코드와 같은 파일이 위치한 디렉토리를 설정한다. 물론 실제 파일을 사용하므로 Bare 저장소가 아닌 경우에만 해당한다. -이 변수를 설정하지 않으면 `$GIT_DIR`에 설정된 디렉토리의 상위 디렉토리를 사용한다. +*`GIT_WORK_TREE` * 변수는 Git 저장소가 관리하는 실제 소스코드와 같은 파일이 위치한 디렉토리를 설정한다. 물론 실제 파일을 사용하므로 Bare 저장소가 아닌 경우에만 해당한다. +이 변수를 설정하지 않으면 `$GIT_DIR` 에 설정된 디렉토리의 상위 디렉토리를 사용한다. ////////////////////////// -*`GIT_INDEX_FILE`* is the path to the index file (non-bare repositories only). +*`GIT_INDEX_FILE` * is the path to the index file (non-bare repositories only). ////////////////////////// -*`GIT_INDEX_FILE`* 변수는 Index 파일의 위치를 설정한다. Bare 저장소가 아닌 경우에만 해당한다. +*`GIT_INDEX_FILE` * 변수는 Index 파일의 위치를 설정한다. Bare 저장소가 아닌 경우에만 해당한다. ////////////////////////// -*`GIT_OBJECT_DIRECTORY`* can be used to specify the location of the directory that usually resides at `.git/objects`. +*`GIT_OBJECT_DIRECTORY` * can be used to specify the location of the directory that usually resides at `.git/objects`. ////////////////////////// -*`GIT_OBJECT_DIRECTORY`* 변수는 `.git/objects` 디렉토리 위치를 설정한다. Bare 저장소가 아닌 경우에만 해당한다. +*`GIT_OBJECT_DIRECTORY` * 변수는 `.git/objects` 디렉토리 위치를 설정한다. Bare 저장소가 아닌 경우에만 해당한다. ////////////////////////// -*`GIT_ALTERNATE_OBJECT_DIRECTORIES`* is a colon-separated list (formatted like `/dir/one:/dir/two:…`) which tells Git where to check for objects if they aren't in `GIT_OBJECT_DIRECTORY`. +*`GIT_ALTERNATE_OBJECT_DIRECTORIES` * is a colon-separated list (formatted like `/dir/one:/dir/two:…`) which tells Git where to check for objects if they aren't in `GIT_OBJECT_DIRECTORY`. If you happen to have a lot of projects with large files that have the exact same contents, this can be used to avoid storing too many copies of them. ////////////////////////// -*`GIT_ALTERNATE_OBJECT_DIRECTORIES`* 변수는 콜론으로 구분된 디렉토리 리스트(예, `/dir/one:/dir/two:…`)로 `GIT_OBJECT_DIRECTORY`에서 찾을 수 없는 개체를 찾을 때 사용할 디렉토리를 설정한다. +*`GIT_ALTERNATE_OBJECT_DIRECTORIES` * 변수는 콜론으로 구분된 디렉토리 리스트(예, `/dir/one:/dir/two:…`)로 `GIT_OBJECT_DIRECTORY` 에서 찾을 수 없는 개체를 찾을 때 사용할 디렉토리를 설정한다. 크기가 무지하게 큰 파일을 여러 프로젝트에서 공유하고 있다면 이 변수를 적절히 사용한다. 중복되는 내용을 지우고 특정 위치에서 개체를 공유해서 사용하므로 저장공간 낭비를 줄일 수 있다. ////////////////////////// @@ -126,23 +126,23 @@ These are used in the `.gitignore` file, but also on the command-line (`git add `.gitignore` 파일에서도 사용하고 git 명령(예, `git add *.c`)에서도 사용한다. ////////////////////////// -*`GIT_GLOB_PATHSPECS` and `GIT_NOGLOB_PATHSPECS`* control the default behavior of wildcards in pathspecs. +*`GIT_GLOB_PATHSPECS` and `GIT_NOGLOB_PATHSPECS` * control the default behavior of wildcards in pathspecs. If `GIT_GLOB_PATHSPECS` is set to 1, wildcard characters act as wildcards (which is the default); if `GIT_NOGLOB_PATHSPECS` is set to 1, wildcard characters only match themselves, meaning something like `*.c` would only match a file _named_ ``*.c'', rather than any file whose name ends with `.c`. You can override this in individual cases by starting the pathspec with `:(glob)` or `:(literal)`, as in `:(glob)*.c`. ////////////////////////// -*`GIT_GLOB_PATHSPECS`, `GIT_NOGLOB_PATHSPECS`* 변수로는 Pathspec을 사용할 때 와일드카드 문자로 어떤 동작을 하게 할 지 설정한다. +`GIT_GLOB_PATHSPECS`, `GIT_NOGLOB_PATHSPECS` 변수로는 Pathspec을 사용할 때 와일드카드 문자로 어떤 동작을 하게 할 지 설정한다. `GIT_GLOB_PATHSPECS` 변수의 값을 1로 설정하면 와일드카드 문자는 보통 사용하듯 와일드카드 문자의 역할을 한다(기본값). `GIT_NOGLOB_PATHSPECS` 변수의 값을 1로 설정하면 와일드카드 문자를 진짜 파일 이름의 와일드카드 문자로만 인식한다. `*.c` 라고 하면 진짜 파일이름이 ``*.c'' 인 파일만 해당하고 확장자가 `.c` 파일은 해당하지 않는다. -환경 변수에 독립적으로 각 명령에서 이를 선택하여 사용할 때는 `:(glob)` 또는 `:(literal)`를 명시해서 사용할 수 있다. 예를 들어 `:(glob)*.c` 같이 말이다. +환경 변수에 독립적으로 각 명령에서 이를 선택하여 사용할 때는 `:(glob)` 또는 `:(literal)` 를 명시해서 사용할 수 있다. 예를 들어 `:(glob)*.c` 같이 말이다. ////////////////////////// -*`GIT_LITERAL_PATHSPECS`* disables both of the above behaviors; no wildcard characters will work, and the override prefixes are disabled as well. +*`GIT_LITERAL_PATHSPECS` * disables both of the above behaviors; no wildcard characters will work, and the override prefixes are disabled as well. ////////////////////////// -*`GIT_LITERAL_PATHSPECS`* 변수를 설정하면 위 설정 둘 다 적용하지 않는다. 와일드카드 문자는 아무런 쓸모도 없게 되고, 변수에 독립적으로 사용하는 접두어도 마찬가지로 쓸 수 없게 된다. +*`GIT_LITERAL_PATHSPECS` * 변수를 설정하면 위 설정 둘 다 적용하지 않는다. 와일드카드 문자는 아무런 쓸모도 없게 되고, 변수에 독립적으로 사용하는 접두어도 마찬가지로 쓸 수 없게 된다. ////////////////////////// -*`GIT_ICASE_PATHSPECS`* sets all pathspecs to work in a case-insensitive manner. +*`GIT_ICASE_PATHSPECS` * sets all pathspecs to work in a case-insensitive manner. ////////////////////////// -*`GIT_ICASE_PATHSPECS`* 변수를 설정하면 대문자와 소문자를 가리지 않게 된다. +*`GIT_ICASE_PATHSPECS` * 변수를 설정하면 대문자와 소문자를 가리지 않게 된다. ////////////////////////// @@ -156,40 +156,40 @@ The final creation of a Git commit object is usually done by `git-commit-tree`, Git이 커밋을 만드는 작업에서 대부분 `git-commit-tree` 명령을 실행하고 나면 커밋 개체가 만들어진다. 이 명령이 커밋을 만들 때 커밋에 채워넣을 정보를 가져오거나 참고하는 환경변수는 아래와 같다. 환경변수를 설정하지 않는 경우는 환경설정 파일의 내용을 가져와 적용한다. ////////////////////////// -*`GIT_AUTHOR_NAME`* is the human-readable name in the ``author'' field. +*`GIT_AUTHOR_NAME` * is the human-readable name in the ``author'' field. ////////////////////////// -*`GIT_AUTHOR_NAME`* 변수는 ``author'' 정보로 사용할 이름. +*`GIT_AUTHOR_NAME` * 변수는 ``author'' 정보로 사용할 이름. ////////////////////////// -*`GIT_AUTHOR_EMAIL`* is the email for the ``author'' field. +*`GIT_AUTHOR_EMAIL` * is the email for the ``author'' field. ////////////////////////// -*`GIT_AUTHOR_EMAIL`* 변수는 ``author'' 정보로 사용할 이메일 주소. +*`GIT_AUTHOR_EMAIL` * 변수는 ``author'' 정보로 사용할 이메일 주소. ////////////////////////// -*`GIT_AUTHOR_DATE`* is the timestamp used for the ``author'' field. +*`GIT_AUTHOR_DATE` * is the timestamp used for the ``author'' field. ////////////////////////// -*`GIT_AUTHOR_DATE`* 변수는 ``author'' 정보로 사용할 타임스탬프 값. +*`GIT_AUTHOR_DATE` * 변수는 ``author'' 정보로 사용할 타임스탬프 값. ////////////////////////// -*`GIT_COMMITTER_NAME`* sets the human name for the ``committer'' field. +*`GIT_COMMITTER_NAME` * sets the human name for the ``committer'' field. ////////////////////////// -*`GIT_COMMITTER_NAME`* 변수는 ``committer'' 정보로 사용할 이름. +*`GIT_COMMITTER_NAME` * 변수는 ``committer'' 정보로 사용할 이름. ////////////////////////// -*`GIT_COMMITTER_EMAIL`* is the email address for the ``committer'' field. +*`GIT_COMMITTER_EMAIL` * is the email address for the ``committer'' field. ////////////////////////// -*`GIT_COMMITTER_EMAIL`* 변수는 ``committer'' 정보로 사용할 이메일 주소. +*`GIT_COMMITTER_EMAIL` * 변수는 ``committer'' 정보로 사용할 이메일 주소. ////////////////////////// -*`GIT_COMMITTER_DATE`* is used for the timestamp in the ``committer'' field. +*`GIT_COMMITTER_DATE` * is used for the timestamp in the ``committer'' field. ////////////////////////// -*`GIT_COMMITTER_DATE`* 변수는 ``committer'' 정보로 사용할 타임스탬프 값. +*`GIT_COMMITTER_DATE` * 변수는 ``committer'' 정보로 사용할 타임스탬프 값. ////////////////////////// -*`EMAIL`* is the fallback email address in case the `user.email` configuration value isn't set. +*`EMAIL` * is the fallback email address in case the `user.email` configuration value isn't set. If _this_ isn't set, Git falls back to the system user and host names. ////////////////////////// -*`EMAIL`* 변수는 어떤 환경설정 파일에도 `user.email` 설정을 찾을 수 없는 경우 참조하는 변수다. 이 변수마저 설정하지 않으면 Git은 시스템의 현재 사용자정보와 시스템 호스트 정보를 조합하여 사용한다. +*`EMAIL` * 변수는 어떤 환경설정 파일에도 `user.email` 설정을 찾을 수 없는 경우 참조하는 변수다. 이 변수마저 설정하지 않으면 Git은 시스템의 현재 사용자정보와 시스템 호스트 정보를 조합하여 사용한다. ////////////////////////// ==== Networking @@ -197,27 +197,27 @@ If _this_ isn't set, Git falls back to the system user and host names. ==== 네트워크 관련 변수 ////////////////////////// -Git uses the `curl` library to do network operations over HTTP, so *`GIT_CURL_VERBOSE`* tells Git to emit all the messages generated by that library. +Git uses the `curl` library to do network operations over HTTP, so *`GIT_CURL_VERBOSE` * tells Git to emit all the messages generated by that library. This is similar to doing `curl -v` on the command line. ////////////////////////// Git은 HTTP 프로토콜로 데이터를 전송할 때 `curl` 라이브러리를 사용한다. `GIT_CURL_VERBOSE` 변수를 설정하면 `curl` 라이브러리가 출력하는 상세한 정보를 볼 수 있다. `curl -v` 명령을 사용한 경우와 비슷하다. ////////////////////////// -*`GIT_SSL_NO_VERIFY`* tells Git not to verify SSL certificates. +*`GIT_SSL_NO_VERIFY` * tells Git not to verify SSL certificates. This can sometimes be necessary if you're using a self-signed certificate to serve Git repositories over HTTPS, or you're in the middle of setting up a Git server but haven't installed a full certificate yet. ////////////////////////// `GIT_SSL_NO_VERIFY` 변수를 설정하면 SSL 인증서를 확인하지 않는다. HTTPS 프로토콜로 저장소를 사용하는데 Self-signed 인증서를 사용할 때 이 변수를 사용한다. 혹은 아직 인증서를 정상적으로 발급하진 않았지만, 테스트를 위해 테스트용 인증서를 사용하는 경우를 예로 들 수도 있다. ////////////////////////// -If the data rate of an HTTP operation is lower than *`GIT_HTTP_LOW_SPEED_LIMIT`* bytes per second for longer than *`GIT_HTTP_LOW_SPEED_TIME`* seconds, Git will abort that operation. +If the data rate of an HTTP operation is lower than *`GIT_HTTP_LOW_SPEED_LIMIT` * bytes per second for longer than *`GIT_HTTP_LOW_SPEED_TIME` * seconds, Git will abort that operation. These values override the `http.lowSpeedLimit` and `http.lowSpeedTime` configuration values. ////////////////////////// `GIT_HTTP_LOW_SPEED_TIME` 변수에 설정한 시간 동안 `GIT_HTTP_LOW_SPEED_LIMIT` 변수에 설정한 초당 전송 바이트 수에 미치지 못하는 HTTP 전송속도가 나오면 Git은 데이터 전송을 중지한다. 이 설정은 설정파일의 `http.lowSpeedLimit`, `http.lowSpeedTime` 항목보다 우선한다. ////////////////////////// -*`GIT_HTTP_USER_AGENT`* sets the user-agent string used by Git when communicating over HTTP. +*`GIT_HTTP_USER_AGENT` * sets the user-agent string used by Git when communicating over HTTP. The default is a value like `git/2.0.0`. ////////////////////////// `GIT_HTTP_USER_AGENT` 변수는 Git이 HTTP 데이터 전송을 할 때 헤더에 사용자 에이전트 값으로 사용할 문자열을 설정한다. @@ -230,31 +230,31 @@ The default is a value like `git/2.0.0`. ==== Diff/Merge 관련 변수 ////////////////////////// -*`GIT_DIFF_OPTS`* is a bit of a misnomer. +*`GIT_DIFF_OPTS` * is a bit of a misnomer. The only valid values are `-u` or `--unified=`, which controls the number of context lines shown in a `git diff` command. ////////////////////////// -*`GIT_DIFF_OPTS`* 변수는 이름이 잘못 지어진 변수다. +*`GIT_DIFF_OPTS` * 변수는 이름이 잘못 지어진 변수다. `git diff` 명령을 실행했을 때 변경된 부분 아래위로 보여주는 라인의 개수를 조절한다. 명령의 옵션으로 사용할 때는 `-u` 이나 `--unified=`로 사용한다. ////////////////////////// -*`GIT_EXTERNAL_DIFF`* is used as an override for the `diff.external` configuration value. +*`GIT_EXTERNAL_DIFF` * is used as an override for the `diff.external` configuration value. If it's set, Git will invoke this program when `git diff` is invoked. ////////////////////////// -*`GIT_EXTERNAL_DIFF`* 변수는 `diff.external` 설정보다 우선한다. +*`GIT_EXTERNAL_DIFF` * 변수는 `diff.external` 설정보다 우선한다. `git diff` 명령을 실행하면 이 변수에 설정한 명령을 실행한다. ////////////////////////// -*`GIT_DIFF_PATH_COUNTER`* and *`GIT_DIFF_PATH_TOTAL`* are useful from inside the program specified by `GIT_EXTERNAL_DIFF` or `diff.external`. +*`GIT_DIFF_PATH_COUNTER` * and *`GIT_DIFF_PATH_TOTAL` * are useful from inside the program specified by `GIT_EXTERNAL_DIFF` or `diff.external`. The former represents which file in a series is being diffed (starting with 1), and the latter is the total number of files in the batch. ////////////////////////// -*`GIT_DIFF_PATH_COUNTER`* 변수나 *`GIT_DIFF_PATH_TOTAL`* 변수의 설정은 `GIT_EXTERNAL_DIFF` 또는 `diff.external`에 설정된 프로그램 안에서 유용하게 사용한다. +*`GIT_DIFF_PATH_COUNTER` * 변수나 *`GIT_DIFF_PATH_TOTAL` * 변수의 설정은 `GIT_EXTERNAL_DIFF` 또는 `diff.external` 에 설정된 프로그램 안에서 유용하게 사용한다. `GIT_DIFF_PATH_TOTAL` 변수는 diff 명령이 실행할 때 보여주는 모든 파일의 개수를 나타낸다. `GIT_DIFF_PATH_COUNTER` 변수는 그 파일 중 지금 몇 번째 파일을 보여주고 있는지를 1로 시작하는 Index를 담고 있다. ////////////////////////// -*`GIT_MERGE_VERBOSITY`* controls the output for the recursive merge strategy. +*`GIT_MERGE_VERBOSITY` * controls the output for the recursive merge strategy. The allowed values are as follows: ////////////////////////// -*`GIT_MERGE_VERBOSITY`* 변수는 Recursive Merge 전략에 따른 메시지 출력을 제어한다. +*`GIT_MERGE_VERBOSITY` * 변수는 Recursive Merge 전략에 따른 메시지 출력을 제어한다. 이 변수가 사용할 수 있는 값은 아래와 같이 5개의 수준이다. ////////////////////////// @@ -296,13 +296,13 @@ Git은 거의 모든 내부 동작에 대한 Trace 로그를 남길 수 있으 * An absolute path starting with `/` – the trace output will be written to that file. ////////////////////////// * ``true'', ``1'', ``2'' – stderr 표준에러출력으로 Trace 로그를 출력함(1 이상 10 이하의 숫자는 해당 FD로 출력함). -* `/`로 시작하는 절대 경로 – Trace 로그를 해당 경로의 파일에 기록함. +* `/` 로 시작하는 절대 경로 – Trace 로그를 해당 경로의 파일에 기록함. ////////////////////////// -*`GIT_TRACE`* controls general traces, which don't fit into any specific category. +*`GIT_TRACE` * controls general traces, which don't fit into any specific category. This includes the expansion of aliases, and delegation to other sub-programs. ////////////////////////// -*`GIT_TRACE`* 변수에 위와 같은 값을 설정하면 특정 카테고리로 지정하지 않은 모든 Trace 메시지를 대상에 기록하거나 출력한다. +*`GIT_TRACE` * 변수에 위와 같은 값을 설정하면 특정 카테고리로 지정하지 않은 모든 Trace 메시지를 대상에 기록하거나 출력한다. Alias를 적용하거나 명령에 따라 Subprogram을 실행시킨다거나 하는 Trace를 확인할 수 있다. [source,console] @@ -317,10 +317,10 @@ $ GIT_TRACE=true git lga ---- ////////////////////////// -*`GIT_TRACE_PACK_ACCESS`* controls tracing of packfile access. +*`GIT_TRACE_PACK_ACCESS` * controls tracing of packfile access. The first field is the packfile being accessed, the second is the offset within that file: ////////////////////////// -*`GIT_TRACE_PACK_ACCESS`* 변수에 따라 Packfile 사용 내용을 출력한다. +*`GIT_TRACE_PACK_ACCESS` * 변수에 따라 Packfile 사용 내용을 출력한다. 출력 내용을 보면 첫 번째 열은 접근하는 Packfile의 이름을, 두 번째 열은 Packfile 안에서 오프셋 정보를 보여준다. [source,console] @@ -338,9 +338,9 @@ nothing to commit, working directory clean ---- ////////////////////////// -*`GIT_TRACE_PACKET`* enables packet-level tracing for network operations. +*`GIT_TRACE_PACKET` * enables packet-level tracing for network operations. ////////////////////////// -*`GIT_TRACE_PACKET`* 변수는 네트워크 데이터 전송을 하는 경우 패킷 수준의 Trace 정보를 보여준다. +*`GIT_TRACE_PACKET` * 변수는 네트워크 데이터 전송을 하는 경우 패킷 수준의 Trace 정보를 보여준다. [source,console] ---- @@ -354,10 +354,10 @@ $ GIT_TRACE_PACKET=true git ls-remote origin ---- ////////////////////////// -*`GIT_TRACE_PERFORMANCE`* controls logging of performance data. +*`GIT_TRACE_PERFORMANCE` * controls logging of performance data. The output shows how long each particular `git` invocation takes. ////////////////////////// -*`GIT_TRACE_PERFORMANCE`* 변수를 설정하면 Git의 성능에 관련된 Trace를 출력한다. +*`GIT_TRACE_PERFORMANCE` * 변수를 설정하면 Git의 성능에 관련된 Trace를 출력한다. 출력한 내용을 살펴보면 어떤 작업이 얼마나 시간이 걸려 실행되었는지 확인할 수 있다. [source,console] @@ -381,9 +381,9 @@ Checking connectivity: 170994, done. ---- ////////////////////////// -*`GIT_TRACE_SETUP`* shows information about what Git is discovering about the repository and environment it's interacting with. +*`GIT_TRACE_SETUP` * shows information about what Git is discovering about the repository and environment it's interacting with. ////////////////////////// -*`GIT_TRACE_SETUP`* 변수를 설정하면 Git이 현재 어떤 저장소와 어떤 환경 위에서 동작하고 있는지 파악한 정보를 보여준다. +*`GIT_TRACE_SETUP` * 변수를 설정하면 Git이 현재 어떤 저장소와 어떤 환경 위에서 동작하고 있는지 파악한 정보를 보여준다. [source,console] ---- @@ -403,46 +403,46 @@ nothing to commit, working directory clean ==== 잡동사니 변수 ////////////////////////// -*`GIT_SSH`*, if specified, is a program that is invoked instead of `ssh` when Git tries to connect to an SSH host. +*`GIT_SSH` *, if specified, is a program that is invoked instead of `ssh` when Git tries to connect to an SSH host. It is invoked like `$GIT_SSH [username@]host [-p ] `. Note that this isn't the easiest way to customize how `ssh` is invoked; it won't support extra command-line parameters, so you'd have to write a wrapper script and set `GIT_SSH` to point to it. It's probably easier just to use the `~/.ssh/config` file for that. ////////////////////////// -*`GIT_SSH`* 변수를 설정하면 Git이 SSH 리모트로 연결할 때 `ssh` 명령 대신 설정된 명령을 사용한다. +*`GIT_SSH` * 변수를 설정하면 Git이 SSH 리모트로 연결할 때 `ssh` 명령 대신 설정된 명령을 사용한다. 즉 `$GIT_SSH [username@]host [-p ] ` 명령을 실행한 것과 같다. `GIT_SSH` 변수를 설정하는 방식이 `ssh` 명령을 사용자 입맛에 맞게끔 고치는 가장 좋은 방법은 아니다. `ssh` 명령의 다양한 옵션을 사용할 수 없는 방식이기 때문이다. 따로 원하는 옵션들을 적용한 스크립트를 하나 만들고 이 스크립트를 변수에 설정하면 원하는 `ssh` 옵션을 사용할 수 있다. `~/.ssh/config` 환경설정 파일을 편집하여 사용하는 것이 더 나을 수도 있다. ////////////////////////// -*`GIT_ASKPASS`* is an override for the `core.askpass` configuration value. +*`GIT_ASKPASS` * is an override for the `core.askpass` configuration value. This is the program invoked whenever Git needs to ask the user for credentials, which can expect a text prompt as a command-line argument, and should return the answer on `stdout`. (See <> for more on this subsystem.) ////////////////////////// -*`GIT_ASKPASS`* 변수는 `core.askpass` 설정보다 우선한다. +*`GIT_ASKPASS` * 변수는 `core.askpass` 설정보다 우선한다. 이 변수에 설정하는 스크립트나 프로그램은 Git이 사용자에게 암호를 입력받는 상황에서 실행되어 `stdout` 표준출력으로 출력하는 메시지를 암호로 받아서 처리한다. (<> 에서 더 자세한 내용을 확인할 수 있다.) ////////////////////////// -*`GIT_NAMESPACE`* controls access to namespaced refs, and is equivalent to the `--namespace` flag. +*`GIT_NAMESPACE` * controls access to namespaced refs, and is equivalent to the `--namespace` flag. This is mostly useful on the server side, where you may want to store multiple forks of a single repository in one repository, only keeping the refs separate. ////////////////////////// -*`GIT_NAMESPACE`* 변수를 설정하면 Ref에 접근할 때 네임스페이스로 사용한다. `--namespace` 옵션과 같다. +*`GIT_NAMESPACE` * 변수를 설정하면 Ref에 접근할 때 네임스페이스로 사용한다. `--namespace` 옵션과 같다. 이 변수는 서버 측에서 유용하게 사용할 수 있다. 하나의 저장소 안에 여러 Fork를 운영하는 경우 이 변수를 사용하여 Ref를 분리하여 사용할 수 있다. ////////////////////////// -*`GIT_FLUSH`* can be used to force Git to use non-buffered I/O when writing incrementally to stdout. +*`GIT_FLUSH` * can be used to force Git to use non-buffered I/O when writing incrementally to stdout. A value of 1 causes Git to flush more often, a value of 0 causes all output to be buffered. The default value (if this variable is not set) is to choose an appropriate buffering scheme depending on the activity and the output mode. ////////////////////////// -*`GIT_FLUSH`* 변수를 설정하면 Git이 메시지를 화면에 출력할 때 버퍼를 사용하지 않고 즉시즉시 출력한다. +*`GIT_FLUSH` * 변수를 설정하면 Git이 메시지를 화면에 출력할 때 버퍼를 사용하지 않고 즉시즉시 출력한다. 값을 1로 설정하면 평소보다 훨씬 빈번하게 메시지 출력하고 0으로 설정하면 항상 버퍼를 사용한다. 이 변수에 값을 설정하지 않으면 기본적으로 Git은 상황에 맞게 조절하여 출력한다. ////////////////////////// -*`GIT_REFLOG_ACTION`* lets you specify the descriptive text written to the reflog. +*`GIT_REFLOG_ACTION` * lets you specify the descriptive text written to the reflog. Here's an example: ////////////////////////// -*`GIT_REFLOG_ACTION`* 변수는 `reflog`의 설명에 사용된다. 이 변수에 작업 내용에 대한 설명을 담아두고 Git 명령을 실행하면 된다. +*`GIT_REFLOG_ACTION` * 변수는 `reflog` 의 설명에 사용된다. 이 변수에 작업 내용에 대한 설명을 담아두고 Git 명령을 실행하면 된다. 예를 들어 아래와 같다. [source,console] diff --git a/book/10-git-internals/sections/maintenance.asc b/book/10-git-internals/sections/maintenance.asc index 2dde880b..19f74dec 100644 --- a/book/10-git-internals/sections/maintenance.asc +++ b/book/10-git-internals/sections/maintenance.asc @@ -44,7 +44,7 @@ You can modify these limits with the `gc.auto` and `gc.autopacklimit` config set ////////////////////////// 이 명령을 실행해도 보통은 아무 일도 일어나지 않는다. Loose 개체가 7천 개가 넘거나 Packfile이 50개가 넘지 않으면 Git은 실제로 `gc` 작업을 실행하지 않는다. -원한다면 `gc.auto`나 `gc.autopacklimit` 설정으로 그 숫자를 조절할 수 있다. +원한다면 `gc.auto` 나 `gc.autopacklimit` 설정으로 그 숫자를 조절할 수 있다. ////////////////////////// The other thing `gc` will do is pack up your references into a single file. @@ -66,7 +66,7 @@ $ find .git/refs -type f If you run `git gc`, you'll no longer have these files in the `refs` directory. Git will move them for the sake of efficiency into a file named `.git/packed-refs` that looks like this: ////////////////////////// -`git gc`를 실행하면 `refs`에 있는 파일은 사라진다. +`git gc` 를 실행하면 `refs` 에 있는 파일은 사라진다. 대신 Git은 그 파일을 `.git/packed-refs` 파일로 압축해서 효율을 높인다. [source,console] @@ -87,7 +87,7 @@ However, if you can't find a reference in the `refs` directory, it's probably in ////////////////////////// 이 상태에서 Refs를 수정하면 파일을 수정하는 게 아니라 `refs/heads` 폴더에 파일을 새로 만든다. Git은 Refs가 가리키는 SHA 값을 찾을 때 먼저 `refs` 디렉토리에서 찾고 없으면 `packed-refs` 파일에서 찾는다. -그러니까 어떤 Refs가 있는데 `refs` 디렉토리에서 못 찾으면 `packed-refs`에 있을 것이다. +그러니까 어떤 Refs가 있는데 `refs` 디렉토리에서 못 찾으면 `packed-refs` 에 있을 것이다. ////////////////////////// Notice the last line of the file, which begins with a `^`. @@ -157,11 +157,11 @@ Often, the quickest way is to use a tool called `git reflog`. As you're working, Git silently records what your HEAD is every time you change it. Each time you commit or change branches, the reflog is updated. The reflog is also updated by the `git update-ref` command, which is another reason to use it instead of just writing the SHA value to your ref files, as we covered in <>. -You can see where you've been at any time by running `git reflog`: +You can see where you've been at any time by running `git reflog` : ////////////////////////// 보통 `git reflog` 명령을 사용하는 게 가장 쉽다. HEAD가 가리키는 커밋이 바뀔 때마다 Git은 남몰래 자동으로 그 커밋이 무엇인지 기록한다. -새로 커밋하거나 브랜치를 바꾸면 Reflog도 늘어난다. <> 절에서 배운 `git update-ref` 명령으로도 Reflog를 남길 수 있다. 이런 상황을 대비할 수 있다는 점이 `git update-ref`를 꼭 사용해야 하는 이유 중 하나다. +새로 커밋하거나 브랜치를 바꾸면 Reflog도 늘어난다. <> 절에서 배운 `git update-ref` 명령으로도 Reflog를 남길 수 있다. 이런 상황을 대비할 수 있다는 점이 `git update-ref` 를 꼭 사용해야 하는 이유 중 하나다. `git reflog` 명령만 실행하면 언제나 발자취를 돌아볼 수 있다. [source,console] @@ -204,7 +204,7 @@ It looks like the bottom commit is the one you lost, so you can recover it by cr For example, you can start a branch named `recover-branch` at that commit (ab1afef): ////////////////////////// 두 번째 커밋을 잃어버린 것이니까 그 커밋을 가리키는 브랜치를 만들어 복구한다. -그 커밋(ab1afef)을 가리키는 브랜치 `recover-branch`를 만든다. +그 커밋(ab1afef)을 가리키는 브랜치 `recover-branch` 를 만든다. [source,console] ---- @@ -223,7 +223,7 @@ Next, suppose your loss was for some reason not in the reflog – you can simula Now the first two commits aren't reachable by anything: ////////////////////////// `master` 브랜치가 가리키던 커밋을 `recover-branch` 브랜치가 가리키게 했다. 이 커밋 두 개는 다시 도달할 수 있다. -이보다 안 좋은 상황을 가정해보자. 잃어 버린 두 커밋을 Reflog에서 못 찾았다. `recover-branch`를 다시 삭제하고 Reflog를 삭제하여 이 상황을 재연하자. +이보다 안 좋은 상황을 가정해보자. 잃어 버린 두 커밋을 Reflog에서 못 찾았다. `recover-branch` 를 다시 삭제하고 Reflog를 삭제하여 이 상황을 재연하자. 그러면 그 두 커밋은 다시 도달할 수 없게 된다. [source,console] @@ -383,7 +383,7 @@ You can also pipe it through the `tail` command because you're only interested i 먼저 파일을 찾는다. 뭐, 지금은 무슨 파일인지 이미 알고 있지만 모른다고 가정한다. 어떤 파일이 용량이 큰지 어떻게 찾아낼까? -게다가 `git gc`를 실행됐으면 전부 Packfile 안에 있어서 더 찾기 어렵다. Plumbing 명령어 `git verify-pack`로 파일과 그 크기 정보를 수집하고 세 번째 필드를 기준으로 그 결과를 정렬한다. 세 번째 필드가 파일 크기다. +게다가 `git gc` 를 실행됐으면 전부 Packfile 안에 있어서 더 찾기 어렵다. Plumbing 명령어 `git verify-pack` 로 파일과 그 크기 정보를 수집하고 세 번째 필드를 기준으로 그 결과를 정렬한다. 세 번째 필드가 파일 크기다. 가장 큰 파일 몇 개만 삭제할 것이기 때문에 tail 명령으로 가장 큰 파일 3개만 골라낸다. [source,console] @@ -446,7 +446,7 @@ Ref 'refs/heads/master' was rewritten ////////////////////////// The `--index-filter` option is similar to the `--tree-filter` option used in <>, except that instead of passing a command that modifies files checked out on disk, you're modifying your staging area or index each time. ////////////////////////// -`--index-filter` 옵션은 <> 에서 배운 `--tree-filter`와 비슷하다. `--tree-filter`는 디스크에 Checkout 해서 파일을 수정하지만 `--index-filter`는 Staging Area에서 수정한다. +`--index-filter` 옵션은 <> 에서 배운 `--tree-filter` 와 비슷하다. `--tree-filter` 는 디스크에 Checkout 해서 파일을 수정하지만 `--index-filter` 는 Staging Area에서 수정한다. ////////////////////////// Rather than remove a specific file with something like `rm file`, you have to remove it with `git rm --cached` – you must remove it from the index, not from disk. @@ -458,7 +458,7 @@ Otherwise, it will start from the beginning and will unnecessarily take longer. ////////////////////////// 삭제도 `rm file` 명령이 아니라 `git rm --cached` 명령으로 삭제한다. 디스크에서 삭제하는 것이 아니라 Index에서 삭제하는 것이다. 이렇게 하는 이유는 속도가 빠르기 때문이다. Filter를 실행할 때마다 각 리비전을 디스크에 Checkout 하지 않기 때문에 이것이 울트라 캡숑 더 빠르다. -`--tree-filter`로도 같은 작업을 할 수 있다. 단지 느릴 뿐이다. +`--tree-filter` 로도 같은 작업을 할 수 있다. 단지 느릴 뿐이다. 그리고 `git rm` 명령에 `--ignore-unmatch` 옵션을 주면 파일이 없는 경우에 에러를 출력하지 않는다. 마지막으로 문제가 생긴 것은 `6df7640` 커밋부터라서 `filter-branch` 명령에 `6df7640` 커밋부터 재작성하라고 알려줘야 한다. 그렇지 않으면 첫 커밋부터 시작해서 불필요한 것까지 재작성해 버린다. @@ -469,7 +469,7 @@ However, your reflog and a new set of refs that Git added when you did the `filt You need to get rid of anything that has a pointer to those old commits before you repack: ////////////////////////// 히스토리에서는 더는 그 파일을 가리키지 않는다. -하지만, Reflog나 filter-branch를 실행할 때 생기는 Refs가 남아있다. `filter-branch`는 `.git/refs/original` 디렉토리에 실행될 때의 상태를 저장한다. 그래서 이 파일도 삭제하고 데이터베이스를 다시 압축해야 한다. +하지만, Reflog나 filter-branch를 실행할 때 생기는 Refs가 남아있다. `filter-branch` 는 `.git/refs/original` 디렉토리에 실행될 때의 상태를 저장한다. 그래서 이 파일도 삭제하고 데이터베이스를 다시 압축해야 한다. 압축하기 전에 해당 개체를 가리키는 Refs는 모두 없애야 한다. [source,console] diff --git a/book/10-git-internals/sections/objects.asc b/book/10-git-internals/sections/objects.asc index 02ec0ef4..516178f5 100644 --- a/book/10-git-internals/sections/objects.asc +++ b/book/10-git-internals/sections/objects.asc @@ -159,7 +159,7 @@ version 2 ////////////////////////// But remembering the SHA-1 key for each version of your file isn't practical; plus, you aren't storing the filename in your system – just the content. This object type is called a blob. -You can have Git tell you the object type of any object in Git, given its SHA-1 key, with `cat-file -t`: +You can have Git tell you the object type of any object in Git, given its SHA-1 key, with `cat-file -t` : ////////////////////////// 파일의 SHA-1 키를 외워서 사용하는 것은 너무 어렵다. 게다가 원래 파일의 이름은 저장하지도 않았다. 단지 파일 내용만 저장했을 뿐이다. 이런 종류의 개체를 Blob 개체라고 부른다. @@ -251,8 +251,8 @@ In this case, you're specifying a mode of `100644`, which means it's a normal fi Other options are `100755`, which means it's an executable file; and `120000`, which specifies a symbolic link. The mode is taken from normal UNIX modes but is much less flexible – these three modes are the only ones that are valid for files (blobs) in Git (although other modes are used for directories and submodules). ////////////////////////// -여기서 파일 모드는 보통의 파일을 나타내는 `100644`로 지정했다. -실행파일이라면 `100755`로 지정하고 심볼릭 링크라면 `120000`으로 지정한다. +여기서 파일 모드는 보통의 파일을 나타내는 `100644` 로 지정했다. +실행파일이라면 `100755` 로 지정하고 심볼릭 링크라면 `120000` 으로 지정한다. 이런 파일 모드는 유닉스에서 가져오긴 했지만, 유닉스 모드를 전부 사용하지는 않는다. Blob 파일에는 이 세 가지 모드만 사용한다. 디렉토리나 서브모듈에는 다른 모드를 사용한다. ////////////////////////// @@ -315,7 +315,7 @@ $ git cat-file -p 0155eb4229851634a0f03eb265b69f5a2d56f341 Notice that this tree has both file entries and also that the `test.txt` SHA-1 is the ``version 2'' SHA-1 from earlier (`1f7a7a`). Just for fun, you'll add the first tree as a subdirectory into this one. You can read trees into your staging area by calling `read-tree`. -In this case, you can read an existing tree into your staging area as a subtree by using the `--prefix` option to `read-tree`: +In this case, you can read an existing tree into your staging area as a subtree by using the `--prefix` option to `read-tree` : ////////////////////////// 이 Tree 개체에는 파일이 두 개 있고 `test.txt` 파일의 SHA 값도 두 번째 버전인 `1f7a7a1` 이다. 재미난 걸 해보자. 처음에 만든 Tree 개체를 하위 디렉토리로 만들 수 있다. @@ -378,7 +378,7 @@ fdf4fc3344e67ab068f836878b6c4951e3b15f3d ////////////////////////// You will get a different hash value because of different creation time and author data. Replace commit and tag hashes with your own checksums further in this chapter. -Now you can look at your new commit object with `cat-file`: +Now you can look at your new commit object with `cat-file` : ////////////////////////// 물론 위의 명령을 실행한 시간이나 Author 정보가 다르기 때문에 Hash 값은 다를 것이다. 이어지는 내용에서 커밋과 태그에 사용하는 해시 값을 위의 값을 그대로 사용하지 말고 독자가 실행해서 얻은 해시 값을 사용해야 한다. @@ -535,7 +535,7 @@ Git concatenates the header and the original content and then calculates the SHA You can calculate the SHA-1 value of a string in Ruby by including the SHA1 digest library with the `require` command and then calling `Digest::SHA1.hexdigest()` with the string: ////////////////////////// Git은 헤더와 원래 내용을 합쳐서 SHA-1 체크섬을 계산한다. -Ruby에서도 `require`로 SHA1 라이브러리를 가져다가 흉내 낼 수 있다. `require`로 라이브러리를 포함하고 나서 `Digest::SHA1.hexdigest()`를 호출한다. +Ruby에서도 `require` 로 SHA1 라이브러리를 가져다가 흉내 낼 수 있다. `require` 로 라이브러리를 포함하고 나서 `Digest::SHA1.hexdigest()`를 호출한다. [source,console] ---- diff --git a/book/10-git-internals/sections/packfiles.asc b/book/10-git-internals/sections/packfiles.asc index e94d8919..18ff86cd 100644 --- a/book/10-git-internals/sections/packfiles.asc +++ b/book/10-git-internals/sections/packfiles.asc @@ -220,7 +220,7 @@ The third column in the output is the size of the object in the pack, so you can What is also interesting is that the second version of the file is the one that is stored intact, whereas the original version is stored as a delta – this is because you're most likely to need faster access to the most recent version of the file. ////////////////////////// `033b4` Blob이 처음 추가한 `repo.rb` 파일인데, 이 Blob은 두 번째 버전인 `b042a` Blob을 가리킨다. -결과에서 세 번째 컬럼은 압축된 개체의 크기를 나타낸다. `b042a`의 크기는 22K지만 `033b4`는 9바이트밖에 안 된다. +결과에서 세 번째 컬럼은 압축된 개체의 크기를 나타낸다. `b042a` 의 크기는 22K지만 `033b4`는 9바이트밖에 안 된다. 특이한 점은 원본을 그대로 저장하는 것이 첫 번째가 아니라 두 번째 버전이라는 것이다. 첫 번째 버전은 차이점만 저장된다. 최신 버전에 접근할 때가 더 많고 최신 버전에 접근하는 속도가 더 빨라야 하기 때문에 이렇게 한다. ////////////////////////// diff --git a/book/10-git-internals/sections/refs.asc b/book/10-git-internals/sections/refs.asc index d44e15a7..b68d32b7 100644 --- a/book/10-git-internals/sections/refs.asc +++ b/book/10-git-internals/sections/refs.asc @@ -8,14 +8,14 @@ You can run something like `git log 1a410e` to look through your whole history, but you still have to remember that `1a410e` is the last commit in order to walk that history to find all those objects. You need a file in which you can store the SHA-1 value under a simple name so you can use that pointer rather than the raw SHA-1 value. ////////////////////////// -`git log 1a410e`라고 실행하면 전체 히스토리를 볼 수 있지만, 여전히 `1a410e`를 기억해야 한다. 이 커밋은 마지막 커밋이기 때문에 히스토리를 따라 모든 개체를 조회할 수 있다. +`git log 1a410e` 라고 실행하면 전체 히스토리를 볼 수 있지만, 여전히 `1a410e` 를 기억해야 한다. 이 커밋은 마지막 커밋이기 때문에 히스토리를 따라 모든 개체를 조회할 수 있다. SHA-1 값을 날로 사용하기보다 쉬운 이름으로 된 포인터가 있으면 그걸 사용하는 게 더 좋다. 외우기 쉬운 이름으로 된 파일에 SHA-1 값을 저장한다. ////////////////////////// In Git, these are called ``references'' or ``refs''; you can find the files that contain the SHA-1 values in the `.git/refs` directory. In the current project, this directory contains no files, but it does contain a simple structure: ////////////////////////// -Git에서는 이런 것을 ''References`` 또는 ''Refs``라고 부른다. SHA-1 값이 든 파일은 `.git/refs` 디렉토리에 있다. +Git에서는 이런 것을 ''References'' 또는 ''Refs'' 라고 부른다. SHA-1 값이 든 파일은 `.git/refs` 디렉토리에 있다. 아직 `.git/refs` 디렉토리 안에 파일은 없고 디렉토리만 몇 개 있다. [source,console] @@ -52,7 +52,7 @@ fdf4fc3344e67ab068f836878b6c4951e3b15f3d first commit ////////////////////////// You aren't encouraged to directly edit the reference files. -Git provides a safer command to do this if you want to update a reference called `update-ref`: +Git provides a safer command to do this if you want to update a reference called `update-ref` : ////////////////////////// Refs 파일을 직접 고치는 것이 좀 못마땅하다. Git에는 좀 더 안전하게 바꿀 수 있는 `update-ref` 명령이 있다. @@ -133,7 +133,7 @@ ref: refs/heads/master ////////////////////////// If you run `git checkout test`, Git updates the file to look like this: ////////////////////////// -`git checkout test`를 실행하면 Git은 HEAD 파일을 아래와 같이 바꾼다. +`git checkout test` 를 실행하면 Git은 HEAD 파일을 아래와 같이 바꾼다. [source,console] ---- @@ -144,13 +144,13 @@ ref: refs/heads/test ////////////////////////// When you run `git commit`, it creates the commit object, specifying the parent of that commit object to be whatever SHA-1 value the reference in HEAD points to. ////////////////////////// -`git commit`을 실행하면 커밋 개체가 만들어지는데, 지금 HEAD가 가리키고 있던 커밋의 SHA-1 값이 그 커밋 개체의 부모로 사용된다. +`git commit` 을 실행하면 커밋 개체가 만들어지는데, 지금 HEAD가 가리키고 있던 커밋의 SHA-1 값이 그 커밋 개체의 부모로 사용된다. ////////////////////////// You can also manually edit this file, but again a safer command exists to do so: `symbolic-ref`. You can read the value of your HEAD via this command: ////////////////////////// -이 파일도 손으로 직접 편집할 수 있지만 `symbolic-ref`라는 명령어가 있어서 좀 더 안전하게 사용할 수 있다. +이 파일도 손으로 직접 편집할 수 있지만 `symbolic-ref` 라는 명령어가 있어서 좀 더 안전하게 사용할 수 있다. 이 명령으로 HEAD의 값을 읽을 수 있다. [source,console] @@ -287,7 +287,7 @@ For instance, you can add a remote called `origin` and push your `master` branch ////////////////////////// 리모트 Refs라는 것도 있다. 리모트를 추가하고 Push 하면 Git은 각 브랜치마다 Push 한 마지막 커밋이 무엇인지 `refs/remotes` 디렉토리에 저장한다. -예를 들어, `origin`이라는 리모트를 추가하고 `master` 브랜치를 Push 한다. +예를 들어, `origin` 이라는 리모트를 추가하고 `master` 브랜치를 Push 한다. [source,console] ---- @@ -304,7 +304,7 @@ To git@github.com:schacon/simplegit-progit.git ////////////////////////// Then, you can see what the `master` branch on the `origin` remote was the last time you communicated with the server, by checking the `refs/remotes/origin/master` file: ////////////////////////// -`origin`의 `master` 브랜치에서 서버와 마지막으로 교환한 커밋이 어떤 것인지 `refs/remotes/origin/master` 파일에서 확인할 수 있다. +`origin` 의 `master` 브랜치에서 서버와 마지막으로 교환한 커밋이 어떤 것인지 `refs/remotes/origin/master` 파일에서 확인할 수 있다. [source,console] ---- @@ -317,5 +317,5 @@ Remote references differ from branches (`refs/heads` references) mainly in that You can `git checkout` to one, but Git won't point HEAD at one, so you'll never update it with a `commit` command. Git manages them as bookmarks to the last known state of where those branches were on those servers. ////////////////////////// -`refs/heads`에 있는 Refs인 브랜치와 달리 리모트 Refs는 Checkout 할 수 없고 읽기 용도로만 쓸 수 있는 브랜치인 것이다. +`refs/heads` 에 있는 Refs인 브랜치와 달리 리모트 Refs는 Checkout 할 수 없고 읽기 용도로만 쓸 수 있는 브랜치인 것이다. 이 리모트 Refs는 서버의 브랜치가 가리키는 커밋이 무엇인지 적어둔 일종의 북마크이다. diff --git a/book/10-git-internals/sections/refspec.asc b/book/10-git-internals/sections/refspec.asc index 8c1b9e71..c6386f9f 100644 --- a/book/10-git-internals/sections/refspec.asc +++ b/book/10-git-internals/sections/refspec.asc @@ -32,14 +32,14 @@ It adds a section to your `.git/config` file, specifying the name of the remote The format of the refspec is an optional `+`, followed by `:`, where `` is the pattern for references on the remote side and `` is where those references will be written locally. The `+` tells Git to update the reference even if it isn't a fast-forward. ////////////////////////// -Refspec 형식은 `+`와 `:`로 돼 있다. `+`는 생략 가능하고, ``는 리모트 저장소의 Refs 패턴이고 ``는 매핑되는 로컬 저장소의 Refs 패턴이다. -`+`는 Fast-forward가 아닌 업데이트를 허용하는 것이다. +Refspec 형식은 `+`와 `:` 로 돼 있다. `+` 는 생략 가능하고, `` 는 리모트 저장소의 Refs 패턴이고 `` 는 매핑되는 로컬 저장소의 Refs 패턴이다. +`+` 는 Fast-forward가 아닌 업데이트를 허용하는 것이다. ////////////////////////// In the default case that is automatically written by a `git remote add` command, Git fetches all the references under `refs/heads/` on the server and writes them to `refs/remotes/origin/` locally. So, if there is a `master` branch on the server, you can access the log of that branch locally via ////////////////////////// -기본적으로 Git은 `git remote add` 명령으로 생성한 설정을 참고하여 리모트 서버에서 `refs/heads/`에 있는 Refs를 가져다 로컬의 `refs/remotes/origin/`에 기록한다. +기본적으로 Git은 `git remote add` 명령으로 생성한 설정을 참고하여 리모트 서버에서 `refs/heads/` 에 있는 Refs를 가져다 로컬의 `refs/remotes/origin/` 에 기록한다. 로컬에서 서버에 있는 `master` 브랜치에 접근할 때는 아래와 같이 한다. [source,console] @@ -53,7 +53,7 @@ $ git log refs/remotes/origin/master They're all equivalent, because Git expands each of them to `refs/remotes/origin/master`. ////////////////////////// 이 세 명령의 결과가 모두 같다. -Git은 모두 `refs/remotes/origin/master`라고 해석한다. +Git은 모두 `refs/remotes/origin/master` 라고 해석한다. ////////////////////////// If you want Git instead to pull down only the `master` branch each time, and not every other branch on the remote server, you can change the fetch line to @@ -72,7 +72,7 @@ To pull the `master` branch on the remote down to `origin/mymaster` locally, you ////////////////////////// 이는 해당 리모트 저장소에서 `git fetch` 명령을 실행할 때 자동으로 사용되는 Refspec이다. 다른 Refspec을 가져오려면 명령의 아규먼트로 넘긴다. -리모트 브랜치 `master`를 로컬 브랜치 `origin/mymaster`로 가져오려면 아래와 같이 실행한다. +리모트 브랜치 `master` 를 로컬 브랜치 `origin/mymaster` 로 가져오려면 아래와 같이 실행한다. [source,console] ---- @@ -100,14 +100,14 @@ In this case, the `master` branch pull was rejected because it wasn't a fast-for You can override that by specifying the `+` in front of the refspec. ////////////////////////// 여기서 `master` 브랜치는 Fast-forward가 아니라서 거절된다. -하지만, Refspec 앞에 `+`를 추가하면 강제로 덮어쓴다. +하지만, Refspec 앞에 `+` 를 추가하면 강제로 덮어쓴다. ////////////////////////// You can also specify multiple refspecs for fetching in your configuration file. If you want to always fetch the `master` and `experiment` branches, add two lines: ////////////////////////// 설정 파일에도 Refspec을 여러 개 적을 수 있다. -`master`와 `experiment` 브랜치를 둘 다 적으면 항상 함께 가져온다. +`master` 와 `experiment` 브랜치를 둘 다 적으면 항상 함께 가져온다. [source,ini] ---- @@ -163,7 +163,7 @@ You accomplish that by using refspecs to push. ////////////////////////// If the QA team wants to push their `master` branch to `qa/master` on the remote server, they can run ////////////////////////// -QA 팀이 `master` 브랜치를 리모트 저장소에 `qa/master`로 Push 하려면 아래와 같이 한다. +QA 팀이 `master` 브랜치를 리모트 저장소에 `qa/master` 로 Push 하려면 아래와 같이 한다. [source,console] ---- @@ -173,7 +173,7 @@ $ git push origin master:refs/heads/qa/master ////////////////////////// If they want Git to do that automatically each time they run `git push origin`, they can add a `push` value to their config file: ////////////////////////// -`git push origin`을 실행할 때마다 Git이 자동으로 Push 하게 하려면 아래와 같이 설정 파일에 `push` 항목을 추가한다. +`git push origin` 을 실행할 때마다 Git이 자동으로 Push 하게 하려면 아래와 같이 설정 파일에 `push` 항목을 추가한다. [source,ini] ---- @@ -186,7 +186,7 @@ If they want Git to do that automatically each time they run `git push origin`, ////////////////////////// Again, this will cause a `git push origin` to push the local `master` branch to the remote `qa/master` branch by default. ////////////////////////// -다시 말하자면 위와 같이 설정은 `git push origin`을 실행할 때 로컬 브랜치 `master`를 리모트 브랜치 `qa/master`로 Push 하도록 하는 설정이다. +다시 말하자면 위와 같이 설정은 `git push origin` 을 실행할 때 로컬 브랜치 `master` 를 리모트 브랜치 `qa/master` 로 Push 하도록 하는 설정이다. ////////////////////////// ==== Deleting References diff --git a/book/10-git-internals/sections/transfer-protocols.asc b/book/10-git-internals/sections/transfer-protocols.asc index 64cbea30..9d530e1a 100644 --- a/book/10-git-internals/sections/transfer-protocols.asc +++ b/book/10-git-internals/sections/transfer-protocols.asc @@ -79,7 +79,7 @@ Because your starting point is the `ca82a6` commit object you saw in the `info/r ////////////////////////// 데이터 전송을 마치면 `master` 브랜치를 Checkout 해야 한다. 지금은 아직 전송을 시작하는 시점이다. -`info/refs`에 `ca82a6` 커밋에서 시작해야 한다고 나와 있다. 그래서 그 커밋을 기점으로 Fetch 한다. +`info/refs` 에 `ca82a6` 커밋에서 시작해야 한다고 나와 있다. 그래서 그 커밋을 기점으로 Fetch 한다. [source] ---- @@ -219,8 +219,8 @@ Dumb 프로토콜은 매우 단순하다는 장점이 있으나 데이터를 효 To upload data to a remote process, Git uses the `send-pack` and `receive-pack` processes. The `send-pack` process runs on the client and connects to a `receive-pack` process on the remote side. ////////////////////////// -리모트 서버로 데이터를 업로드하는 과정은 `send-pack`과 `receive-pack` 과정으로 나눌 수 있다. -클라이언트에서 실행되는 `send-pack`과 서버의 `receive-pack`은 서로 연결된다. +리모트 서버로 데이터를 업로드하는 과정은 `send-pack` 과 `receive-pack` 과정으로 나눌 수 있다. +클라이언트에서 실행되는 `send-pack` 과 서버의 `receive-pack` 은 서로 연결된다. ====== SSH @@ -230,7 +230,7 @@ Git fires up the `send-pack` process, which initiates a connection over SSH to y It tries to run a command on the remote server via an SSH call that looks something like this: ////////////////////////// `origin` URL이 SSH URL인 상태에서 `git push origin master` 명령을 실행하면 -Git은 `send-pack`을 시작한다. +Git은 `send-pack` 을 시작한다. 이 과정에서는 SSH 연결을 만들고 이 SSH 연결을 통해서 아래와 같은 명령어를 실행한다. [source,console] @@ -337,7 +337,7 @@ The client then makes another request, this time a `POST`, with the data that `s The `POST` request includes the `send-pack` output and the packfile as its payload. The server then indicates success or failure with its HTTP response. ////////////////////////// -`POST` 요청은 `send-pack`의 결과와 Packfile을 데이터로 전송한다. +`POST` 요청은 `send-pack` 의 결과와 Packfile을 데이터로 전송한다. 전송한 데이터가 서버에서 처리된 결과가 HTTP 응답으로 전달된다. ////////////////////////// @@ -350,15 +350,15 @@ The server then indicates success or failure with its HTTP response. When you download data, the `fetch-pack` and `upload-pack` processes are involved. The client initiates a `fetch-pack` process that connects to an `upload-pack` process on the remote side to negotiate what data will be transferred down. ////////////////////////// -데이터를 다운로드하는 것는 `fetch-pack`과 `upload-pack` 과정으로 나뉜다. -클라이언트가 `fetch-pack`을 시작하면 서버의 `upload-pack`에 연결되고 서로 어떤 데이터를 내려받을지 결정한다. +데이터를 다운로드하는 것는 `fetch-pack` 과 `upload-pack` 과정으로 나뉜다. +클라이언트가 `fetch-pack` 을 시작하면 서버의 `upload-pack` 에 연결되고 서로 어떤 데이터를 내려받을지 결정한다. ====== SSH ////////////////////////// If you're doing the fetch over SSH, `fetch-pack` instead runs something like this: ////////////////////////// -SSH 프로토콜을 사용하면 `fetch-pack`은 아래와 같이 실행한다. +SSH 프로토콜을 사용하면 `fetch-pack` 은 아래와 같이 실행한다. [source,console] ---- @@ -368,7 +368,7 @@ $ ssh -x git@server "git-upload-pack 'simplegit-progit.git'" ////////////////////////// After `fetch-pack` connects, `upload-pack` sends back something like this: ////////////////////////// -`fetch-pack`과 연결된 `upload-pack`은 아래와 같은 데이터를 전송한다. +`fetch-pack` 과 연결된 `upload-pack` 은 아래와 같은 데이터를 전송한다. [source] ---- @@ -384,7 +384,7 @@ After `fetch-pack` connects, `upload-pack` sends back something like this: This is very similar to what `receive-pack` responds with, but the capabilities are different. In addition, it sends back what HEAD points to (`symref=HEAD:refs/heads/master`) so the client knows what to check out if this is a clone. ////////////////////////// -위 `receive-pack`의 응답과 매우 비슷하지만, Capability 부분은 다르다. +위 `receive-pack` 의 응답과 매우 비슷하지만, Capability 부분은 다르다. HEAD Refs(`symref=HEAD:refs/heads/master`)도 알려주기 때문에 저장소를 Clone 하면 무엇을 Checkout 해야 할지 안다. ////////////////////////// @@ -392,8 +392,8 @@ At this point, the `fetch-pack` process looks at what objects it has and respond It sends all the objects it already has with ``have'' and then the SHA. At the end of this list, it writes ``done'' to initiate the `upload-pack` process to begin sending the packfile of the data it needs: ////////////////////////// -`fetch-pack`은 이 정보를 살펴보고 이미 가지는 개체에는 ``have''를 붙이고 내려받아야 하는 개체는 ``want''를 붙인 정보를 만든다. -마지막 라인에 ``done''이라고 적어서 보내면 서버의 `upload-pack`은 해당 데이터를 Packfile로 만들어 전송한다. +`fetch-pack` 은 이 정보를 살펴보고 이미 가지는 개체에는 ``have'' 를 붙이고 내려받아야 하는 개체는 ``want'' 를 붙인 정보를 만든다. +마지막 라인에 ``done'' 이라고 적어서 보내면 서버의 `upload-pack` 은 해당 데이터를 Packfile로 만들어 전송한다. [source] ---- @@ -455,5 +455,5 @@ The protocol includes many other features, such as `multi_ack` or `side-band` ca We've tried to give you a sense of the general back-and-forth between client and server; if you need more knowledge than this, you'll probably want to take a look at the Git source code. ////////////////////////// 이번 절을 통해 Git이 사용하는 데이터 전송 프로토콜을 간단하게 살펴보았다. -Git이 사용하는 데이터 전송 프로토콜에는 `multi_ack`나 `side-band` 같은 추가적인 많은 기능도 포함하고 있지만, 이 책에서 다룰 수 없어 설명하지는 않는다. +Git이 사용하는 데이터 전송 프로토콜에는 `multi_ack` 나 `side-band` 같은 추가적인 많은 기능도 포함하고 있지만, 이 책에서 다룰 수 없어 설명하지는 않는다. 이 책의 내용은 Git이 어떻게 클라이언트와 서버 간에 데이터를 주고받는지 기본적인 느낌을 전달하기 위해 노력한다. 데이터 전송 프로토콜의 많은 기능을 활용해보고 싶다면 Git 소스코드를 살펴보는 것이 좋다. diff --git a/book/A-git-in-other-environments/sections/bash.asc b/book/A-git-in-other-environments/sections/bash.asc index c9fdb4e5..4ee99b7c 100644 --- a/book/A-git-in-other-environments/sections/bash.asc +++ b/book/A-git-in-other-environments/sections/bash.asc @@ -13,9 +13,9 @@ Git에는 쉘에 유용한 플러그인이 들어있는데 자동으로 적용 ////////////////////////// First, you need to get a copy of the `contrib/completion/git-completion.bash` file out of the Git source code. -Copy it somewhere handy, like your home directory, and add this to your `.bashrc`: +Copy it somewhere handy, like your home directory, and add this to your `.bashrc` : ////////////////////////// -먼저 Git 소스에 들어 있는 `contrib/completion/git-completion.bash`을 가져다가 홈 디렉토리 어디엔가 넣는다. 그리고 `.bashrc` 파일에 추가한다. +먼저 Git 소스에 들어 있는 `contrib/completion/git-completion.bash` 을 가져다가 홈 디렉토리 어디엔가 넣는다. 그리고 `.bashrc` 파일에 추가한다. [source,console] ----- @@ -36,13 +36,13 @@ $ git chec …and Bash will auto-complete to `git checkout`. This works with all of Git's subcommands, command-line parameters, and remotes and ref names where appropriate. ////////////////////////// -`git checkout`이라고 자동완성 된다. +`git checkout` 이라고 자동완성 된다. Git 하위 명령어와 파라미터, 리모트, Refs까지 관련된 모든 것이 전부 자동완성된다. ////////////////////////// It's also useful to customize your prompt to show information about the current directory's Git repository. This can be as simple or complex as you want, but there are generally a few key pieces of information that most people want, like the current branch, and the status of the working directory. -To add these to your prompt, just copy the `contrib/completion/git-prompt.sh` file from Git's source repository to your home directory, add something like this to your `.bashrc`: +To add these to your prompt, just copy the `contrib/completion/git-prompt.sh` file from Git's source repository to your home directory, add something like this to your `.bashrc` : ////////////////////////// 게다가 프롬프트에 Git 저장소의 정보를 보여줄 수 있다. 단순하게 보여주는 것도 가능하고 꼼꼼하게 보여주는 것도 가능하다. 여기서는 사람들이 공통적으로 사용하는 현 브랜치 이름과 워킹디렉토리 상태 정보를 보여주는 것을 살펴본다. @@ -59,7 +59,7 @@ export PS1='\w$(__git_ps1 " (%s)")\$ ' The `\w` means print the current working directory, the `\$` prints the `$` part of the prompt, and `__git_ps1 " (%s)"` calls the function provided by `git-prompt.sh` with a formatting argument. Now your bash prompt will look like this when you're anywhere inside a Git-controlled project: ////////////////////////// -`\w`는 현 워킹 디렉토리를, `\$`는 `$`를 출력하고, `__git_ps1 " (%s)"`는 `git-prompt.sh`에 있는 함수에 포맷을 아규먼트로 주고 호출하는 것이다. +`\w` 는 현 워킹 디렉토리를, `\$` 는 `$` 를 출력하고, `__git_ps1 " (%s)"` 는 `git-prompt.sh` 에 있는 함수에 포맷을 아규먼트로 주고 호출하는 것이다. 이제부터는 Git 프로젝트 디렉토리에 들어가면 아래와 같이 보인다. ////////////////////////// @@ -72,4 +72,4 @@ image::images/git-bash.png[`bash` 프롬프트.] ////////////////////////// Both of these scripts come with helpful documentation; take a look at the contents of `git-completion.bash` and `git-prompt.sh` for more information. ////////////////////////// -여기서 소개한 두 스크립트 `git-completion.bash`와 `git-prompt.sh`에 대해 자세히 알고 싶으면 코드를 읽어 보는 게 좋다. +여기서 소개한 두 스크립트 `git-completion.bash` 와 `git-prompt.sh` 에 대해 자세히 알고 싶으면 코드를 읽어 보는 게 좋다. diff --git a/book/A-git-in-other-environments/sections/guis.asc b/book/A-git-in-other-environments/sections/guis.asc index 3074fb61..2413b9f8 100644 --- a/book/A-git-in-other-environments/sections/guis.asc +++ b/book/A-git-in-other-environments/sections/guis.asc @@ -27,21 +27,21 @@ Git의 기능을 엄선해서 제공하는 클라이언트 프로그램이 있 ////////////////////////// ==== `gitk` and `git-gui` ////////////////////////// -==== `gitk`과 `git-gui` +==== `gitk` 과 `git-gui` (((git commands, gitk)))(((git commands, gui)))(((gitk))) ////////////////////////// When you install Git, you also get its visual tools, `gitk` and `git-gui`. ////////////////////////// -Git을 설치하면 `gitk`와 `git-gui`도 같이 설치된다. +Git을 설치하면 `gitk` 와 `git-gui` 도 같이 설치된다. ////////////////////////// `gitk` is a graphical history viewer. Think of it like a powerful GUI shell over `git log` and `git grep`. This is the tool to use when you're trying to find something that happened in the past, or visualize your project's history. ////////////////////////// -`gitk`는 히스토리를 그래프로 보여준다. -`git log`와 `git grep`을 합쳐놓은 GUI 도구라고 생각하면 된다. +`gitk` 는 히스토리를 그래프로 보여준다. +`git log` 와 `git grep` 을 합쳐놓은 GUI 도구라고 생각하면 된다. 프로젝트 히스토리를 시각화해서 무슨 일이 있었는지 살펴볼 때 이 도구를 사용한다. ////////////////////////// @@ -61,8 +61,8 @@ Gitk accepts many command-line options, most of which are passed through to the Probably one of the most useful is the `--all` flag, which tells gitk to show commits reachable from _any_ ref, not just HEAD. Gitk's interface looks like this: ////////////////////////// -Gitk를 실행할 때 옵션을 주고 실행할 수 있는데 대부분 `git log`의 것과 같다. -유용한 옵션으로 `--all`이 있는데 HEAD의 히스토리가 아니라 저장소의 모든 커밋을 보여달라고 하는 옵션이다. +Gitk를 실행할 때 옵션을 주고 실행할 수 있는데 대부분 `git log` 의 것과 같다. +유용한 옵션으로 `--all` 이 있는데 HEAD의 히스토리가 아니라 저장소의 모든 커밋을 보여달라고 하는 옵션이다. Gitk는 아래와 같이 생겼다. ////////////////////////// @@ -73,12 +73,12 @@ image::images/gitk.png[The `gitk` history viewer.] image::images/gitk.png[`gitk` 히스토리 뷰어.] ////////////////////////// -On the top is something that looks a bit like the output of `git log --graph`; each dot represents a commit, the lines represent parent relationships, and refs are shown as colored boxes. +On the top is something that looks a bit like the output of `git log --graph` ; each dot represents a commit, the lines represent parent relationships, and refs are shown as colored boxes. The yellow dot represents HEAD, and the red dot represents changes that are yet to become a commit. At the bottom is a view of the selected commit; the comments and patch on the left, and a summary view on the right. In between is a collection of controls used for searching history. ////////////////////////// -위에 있는 히스토리는 `git log --graph`의 출력과 비슷하게 생겼다. 점은 커밋을 선은 부자관계를 나타내고 색칠된 박스가 Ref다. +위에 있는 히스토리는 `git log --graph` 의 출력과 비슷하게 생겼다. 점은 커밋을 선은 부자관계를 나타내고 색칠된 박스가 Ref다. 노란색 점은 HEAD를 빨간 점은 아직 커밋하지 변경 내역이다. 커밋을 하나 선택하면 왼쪽에 코멘트와 패치를 보여주고 오른쪽에 요약정보를 보여준다. 그리고 중간에는 히스토리를 검색하는 입력 폼이 있다. @@ -87,7 +87,7 @@ In between is a collection of controls used for searching history. `git-gui`, on the other hand, is primarily a tool for crafting commits. It, too, is easiest to invoke from the command line: ////////////////////////// -`git-gui`는 꼼꼼하게 커밋하는데 사용하는 커밋 도구다. +`git-gui` 는 꼼꼼하게 커밋하는데 사용하는 커밋 도구다. 정말 쉽게 실행할 수 있다. [source,console] @@ -128,7 +128,7 @@ You can also choose to amend the last commit by choosing the ``Amend'' radio but Then you can simply stage or unstage some changes, alter the commit message, and click ``Commit'' again to replace the old commit with a new one. ////////////////////////// 오른쪽 하단에는 커밋 메시지와 버튼들이 있다. -텍스트 박스에 메시지를 입력하고 ``Commit'' 버튼을 클릭하면 `git commit`을 실행한 것과 같다. +텍스트 박스에 메시지를 입력하고 ``Commit'' 버튼을 클릭하면 `git commit` 을 실행한 것과 같다. ``Amend'' 라디오 버튼을 선택하면 최근 커밋도 수정할 수 있다. ``Staged Changes'' 영역에는 마지막 커밋 내용이 표시된다. 빠트린 것을 Stage 하거나 잘못 커밋한 것을 Unstage 하고 커밋 메시지를 수정하고 나서 다시 ``Commit'' 버튼을 클릭하면 새 커밋으로 변경된다. @@ -136,8 +136,8 @@ Then you can simply stage or unstage some changes, alter the commit message, and `gitk` and `git-gui` are examples of task-oriented tools. Each of them is tailored for a specific purpose (viewing history and creating commits, respectively), and omit the features not necessary for that task. ////////////////////////// -`gitk`와 `git-gui`는 특정 일에 맞춰진 도구다. -`gitk`는 히스토리 조회용이고 `git-gui`는 커밋용 도구다. 이 도구로 다른 일은 할 수 없다. +`gitk` 와 `git-gui` 는 특정 일에 맞춰진 도구다. +`gitk` 는 히스토리 조회용이고 `git-gui` 는 커밋용 도구다. 이 도구로 다른 일은 할 수 없다. ////////////////////////// ==== GitHub for Mac and Windows @@ -284,7 +284,7 @@ Git은 Push, Fetch, Merge, Rebase 각각 다른 기능이지만 GitHub 클라이 . `git push`. ////////////////////////// . `git pull --rebase`. - 충돌이 생기는 경우에는 `git pull --no-rebase`이 실행된다. + 충돌이 생기는 경우에는 `git pull --no-rebase` 이 실행된다. . `git push`. ////////////////////////// diff --git a/book/A-git-in-other-environments/sections/powershell.asc b/book/A-git-in-other-environments/sections/powershell.asc index c06fc0ac..5ff8db53 100644 --- a/book/A-git-in-other-environments/sections/powershell.asc +++ b/book/A-git-in-other-environments/sections/powershell.asc @@ -11,7 +11,7 @@ The standard command-line terminal on Windows (`cmd.exe`) isn't really capable o A package called Posh-Git (https://github.com/dahlbyk/posh-git[]) provides powerful tab-completion facilities, as well as an enhanced prompt to help you stay on top of your repository status. It looks like this: ////////////////////////// -Windows의 표준 CLI 터미널인 `cmd.exe`는 Git을 사용하기에 별로 좋지 않다. 그래서 Powershell을 쓸 줄 안다면 Powershell을 사용하는 것이 낫다. +Windows의 표준 CLI 터미널인 `cmd.exe` 는 Git을 사용하기에 별로 좋지 않다. 그래서 Powershell을 쓸 줄 안다면 Powershell을 사용하는 것이 낫다. 'Posh-Git'(https://github.com/dahlbyk/posh-git[])이라는 프로젝트가 있어서 Tab 자동완성과 저장소 상태를 보여주는 프롬프트도 사용할 수 있다. ////////////////////////// @@ -38,4 +38,4 @@ Then open a Powershell prompt as the administrator, and do this: ////////////////////////// This will add the proper line to your `profile.ps1` file, and posh-git will be active the next time you open your prompt. ////////////////////////// -이렇게 `profile.ps1` 파일에 추가한 `posh-git`은 프롬프트를 새로 열 때 부터 적용된다. +이렇게 `profile.ps1` 파일에 추가한 `posh-git` 은 프롬프트를 새로 열 때 부터 적용된다. diff --git a/book/A-git-in-other-environments/sections/visualstudio.asc b/book/A-git-in-other-environments/sections/visualstudio.asc index 41bf73a0..3793323d 100644 --- a/book/A-git-in-other-environments/sections/visualstudio.asc +++ b/book/A-git-in-other-environments/sections/visualstudio.asc @@ -17,7 +17,7 @@ Visual Studio 2013은 Git에 어울리는 워크플로를 따를 수 있도록 G To locate the feature, open a project that's controlled by Git (or just `git init` an existing project), and select View > Team Explorer from the menu. You'll see the "Connect" view, which looks a bit like this: ////////////////////////// -Git으로 관리하는 프로젝트나 `git init`을 해서 새로 관리하도록 설정한 프로젝트를 열면 이 기능을 사용할 수 있다. View > Team Explorer 메뉴를 선택한다. +Git으로 관리하는 프로젝트나 `git init` 을 해서 새로 관리하도록 설정한 프로젝트를 열면 이 기능을 사용할 수 있다. View > Team Explorer 메뉴를 선택한다. 그럼 "Connect" 뷰를 보여주는데 아래와 같이 생겼다. ////////////////////////// diff --git a/book/A-git-in-other-environments/sections/zsh.asc b/book/A-git-in-other-environments/sections/zsh.asc index dcb3926e..016b4764 100644 --- a/book/A-git-in-other-environments/sections/zsh.asc +++ b/book/A-git-in-other-environments/sections/zsh.asc @@ -42,7 +42,7 @@ Zsh 프롬프트는 Bash과 많이 비슷하지만 오른쪽 프롬프트가 더 Zsh ships with a framework for getting information from version control systems, called `vcs_info`. To include the branch name in the prompt on the right side, add these lines to your `~/.zshrc` file: ////////////////////////// -Zsh에는 `vcs_info`라는 프레임워크가 포함돼 있다. 여기에는 현재 사용하는 VCS정보가 들어있다. +Zsh에는 `vcs_info` 라는 프레임워크가 포함돼 있다. 여기에는 현재 사용하는 VCS정보가 들어있다. `~/.zshrc` 파일에 아래 라인을 추가하면 오른쪽 프롬프트에 브랜치 이름이 표시된다. [source,console] @@ -81,11 +81,11 @@ vcs_info에 대한 자세한 정보는 `zshcontrib(1)` 메뉴얼 페이지를 http://zsh.sourceforge.net/Doc/Release/User-Contributions.html#Version-Control-Information[]에서 확인한다. ////////////////////////// -Instead of vcs_info, you might prefer the prompt customization script that ships with Git, called `git-prompt.sh`; see https://github.com/git/git/blob/master/contrib/completion/git-prompt.sh[] for details. +Instead of vcs_info, you might prefer the prompt customization script that ships with Git, called `git-prompt.sh` ; see https://github.com/git/git/blob/master/contrib/completion/git-prompt.sh[] for details. `git-prompt.sh` is compatible with both Bash and Zsh. ////////////////////////// -vcs_info말고 Git에 들어 있는 `git-prompt.sh`를 직접 수정해서 사용해도 된다. 자세한 내용은 https://github.com/git/git/blob/master/contrib/completion/git-prompt.sh[]에서 확인한다. -`git-prompt.sh`는 Bash와 Zsh 모두 호환된다. +vcs_info말고 Git에 들어 있는 `git-prompt.sh` 를 직접 수정해서 사용해도 된다. 자세한 내용은 https://github.com/git/git/blob/master/contrib/completion/git-prompt.sh[]에서 확인한다. +`git-prompt.sh` 는 Bash와 Zsh 모두 호환된다. ////////////////////////// Zsh is powerful enough that there are entire frameworks dedicated to making it better. diff --git a/book/B-embedding-git/sections/jgit.asc b/book/B-embedding-git/sections/jgit.asc index 93677a88..abec11b2 100644 --- a/book/B-embedding-git/sections/jgit.asc +++ b/book/B-embedding-git/sections/jgit.asc @@ -35,7 +35,7 @@ JGit을 프로젝트에 추가해서 코딩을 시작하는 방법은 여러 가 The `version` will most likely have advanced by the time you read this; check http://mvnrepository.com/artifact/org.eclipse.jgit/org.eclipse.jgit[] for updated repository information. Once this step is done, Maven will automatically acquire and use the JGit libraries that you'll need. ////////////////////////// -`version`은 시간에 따라 올라갈 것이기 때문에 http://mvnrepository.com/artifact/org.eclipse.jgit/org.eclipse.jgit[]에서 최신 버전을 확인해야 한다. +`version` 은 시간에 따라 올라갈 것이기 때문에 http://mvnrepository.com/artifact/org.eclipse.jgit/org.eclipse.jgit[]에서 최신 버전을 확인해야 한다. 추가하면 Maven이 우리가 명시한 버전의 JGit을 자동으로 추가해준다. ////////////////////////// @@ -62,10 +62,10 @@ JGit의 API는 크게 Plumbing과 Porcelain으로 나눌 수 있다. ////////////////////////// The starting point for most JGit sessions is the `Repository` class, and the first thing you'll want to do is create an instance of it. -For a filesystem-based repository (yes, JGit allows for other storage models), this is accomplished using `FileRepositoryBuilder`: +For a filesystem-based repository (yes, JGit allows for other storage models), this is accomplished using `FileRepositoryBuilder` : ////////////////////////// JGit을 사용하는 것은 `Repository` 클래스의 인스턴스를 만드는 것으로 시작한다. -파일 시스템에 있는 저장소에 접근할 때는 `FileRepostiorybuilder`를 사용한다. +파일 시스템에 있는 저장소에 접근할 때는 `FileRepostiorybuilder` 를 사용한다. [source,java] ---- @@ -136,16 +136,16 @@ You can get the name (`.getName()`), and either the target object of a direct re Ref objects are also used to represent tag refs and objects, so you can ask if the tag is ``peeled,'' meaning that it points to the final target of a (potentially long) string of tag objects. ////////////////////////// 첫 라인에서 `master` Ref를 얻었다. -Jgit은 `refs/heads/master`에 있는 _진짜_ master Ref를 가져와서 인스턴스를 리턴한다. 이 객체로 Ref에 대한 정보를 얻을 수 있다. +Jgit은 `refs/heads/master` 에 있는 _진짜_ master Ref를 가져와서 인스턴스를 리턴한다. 이 객체로 Ref에 대한 정보를 얻을 수 있다. 이름(`.getName()`), Ref가 가리키는 개체(`.getObjectId()`), Symbolic Ref가 가리키는 Ref(`.getTarget()`)를 이 객체로 얻을 수 있다. -Ref 인스턴스는 태그 Ref와 개체를 나타내고 태그가 ``Peeled''인지도 확인할 수 있다. ``Peeled''은 껍질을 다 벗긴 상태 그러니까 커밋 개체를 가리키는 상태를 말한다. +Ref 인스턴스는 태그 Ref와 개체를 나타내고 태그가 ``Peeled'' 인지도 확인할 수 있다. ``Peeled'' 은 껍질을 다 벗긴 상태 그러니까 커밋 개체를 가리키는 상태를 말한다. ////////////////////////// The second line gets the target of the `master` reference, which is returned as an ObjectId instance. ObjectId represents the SHA-1 hash of an object, which might or might not exist in Git's object database. The third line is similar, but shows how JGit handles the rev-parse syntax (for more on this, see <>); you can pass any object specifier that Git understands, and JGit will return either a valid ObjectId for that object, or `null`. ////////////////////////// -두 번째 라인은 `master`가 가리키는 ObjectId 인스턴스를 리턴한다. +두 번째 라인은 `master` 가 가리키는 ObjectId 인스턴스를 리턴한다. ObjectId는 객체의 SHA-1 해시 정보다. 실제로 객체가 Git 객체 데이터베이스에 존재하는지는 상관없다. 셋째 라인도 ObjectId 인스턴스를 리턴하는데 JGit에서 rev-parse 문법을 어떻게 다뤄야 하는지 보여준다. 이 문법은 <>에서 설명했다. Git이 이해하는 표현은 전부 사용 가능하다. 표현식이 맞으면 해당 객체를 리턴하고 아니면 null을 리턴한다. @@ -156,7 +156,7 @@ For large objects (where `.isLarge()` returns `true`), you can call `.openStream ////////////////////////// 그다음 두 라인은 객체의 내용을 읽어서 보여준다. `ObjectLoader.copyTo()` 함수로 객체의 내용을 표준출력으로 출력(Stream)했다. ObjectLoader에는 객체의 타입과 크기를 알려주거나 객체의 내용을 바이트 배열에 담아서 리턴하는 메소드도 있다. -파일이 큰지도 확인할 수 있다. `.isLarge()`라는 메소드가 `true`를 리턴하면 큰 파일이다. 큰 파일이면 `.openStream()`호출해서 `ObjectStream` 인스턴스를 얻는다. 이 인스턴스는 일종의 InputStream으로 한 번에 전부 메모리로 올리지 않고 데이터를 처리할 수 있게 해준다. +파일이 큰지도 확인할 수 있다. `.isLarge()` 라는 메소드가 `true` 를 리턴하면 큰 파일이다. 큰 파일이면 `.openStream()` 호출해서 `ObjectStream` 인스턴스를 얻는다. 이 인스턴스는 일종의 InputStream으로 한 번에 전부 메모리로 올리지 않고 데이터를 처리할 수 있게 해준다. ////////////////////////// The next few lines show what it takes to create a new branch. @@ -165,15 +165,15 @@ Directly following this is the code to delete that same branch. Note that `.setForceUpdate(true)` is required for this to work; otherwise the `.delete()` call will return `REJECTED`, and nothing will happen. ////////////////////////// 그다음 몇 라인은 새 브랜치를 만드는 것을 보여준다. -RefUpdate 인스턴스를 만들고, 파라미터를 설정하고 나서 `.update()`를 호출하면 브랜치가 생성된다. +RefUpdate 인스턴스를 만들고, 파라미터를 설정하고 나서 `.update()` 를 호출하면 브랜치가 생성된다. 그다음 몇 라인은 만든 브랜치를 삭제하는 코드다. -`.setForceUpdate(true)`는 꼭 필요하다. 이것을 빼먹으면 `.delete()`는 `REJECTED`를 리턴하고 아무 일도 일어나지 않는다. +`.setForceUpdate(true)` 는 꼭 필요하다. 이것을 빼먹으면 `.delete()` 는 `REJECTED` 를 리턴하고 아무 일도 일어나지 않는다. ////////////////////////// The last example shows how to fetch the `user.name` value from the Git configuration files. This Config instance uses the repository we opened earlier for local configuration, but will automatically detect the global and system configuration files and read values from them as well. ////////////////////////// -마지막 예제는 `user.name`이라는 설정 값을 가져오는 것이다. +마지막 예제는 `user.name` 이라는 설정 값을 가져오는 것이다. 이 코드는 마치 해당 저장소의 local 설정만 읽어서 Config 객체를 리턴하는 것 같지만, global 설정과 system 설정까지 잘 찾아서 적용해준다. ////////////////////////// @@ -203,7 +203,7 @@ Git git = new Git(repo); ////////////////////////// The Git class has a nice set of high-level _builder_-style methods that can be used to construct some pretty complex behavior. -Let's take a look at an example – doing something like `git ls-remote`: +Let's take a look at an example – doing something like `git ls-remote` : ////////////////////////// Git 클래스는 _빌더_ 스타일의 메소드의 집합이라서 복잡해 보이는 일을 쉽게 할 수 있다. `git ls-remote` 명령어처럼 동작하는 예제를 살펴보자. @@ -227,7 +227,7 @@ This is a common pattern with the Git class; the methods return a command object In this case, we're asking the `origin` remote for tags, but not heads. Also notice the use of a `CredentialsProvider` object for authentication. ////////////////////////// -Git 클래스는 이런 식으로 사용한다. 메소드가 해당 Command 인스턴스를 리턴하면 체이닝으로 메소드를 호출해서 파라미터를 설정하고 `.call()`을 호출하는 시점에 실제로 실행된다. +Git 클래스는 이런 식으로 사용한다. 메소드가 해당 Command 인스턴스를 리턴하면 체이닝으로 메소드를 호출해서 파라미터를 설정하고 `.call()` 을 호출하는 시점에 실제로 실행된다. 이 예제는 `origin` 리모트의 'tag'를 요청하는 예제다. 'head'는 빼고 요청한다. 사용자 인증은 `CredentialsProvider` 객체를 사용한다는 점을 기억하자. diff --git a/book/B-embedding-git/sections/libgit2.asc b/book/B-embedding-git/sections/libgit2.asc index c5675e63..28fc0554 100644 --- a/book/B-embedding-git/sections/libgit2.asc +++ b/book/B-embedding-git/sections/libgit2.asc @@ -47,7 +47,7 @@ There's also the `git_repository_open_ext` which includes options for searching, 첫 두 라인은 Git 저장소를 여는 코드다. `git_repository` 타입은 메모리에 있는 저장소 정보에 대한 핸들을 나타낸다. `git_repository_open` 메소드는 워킹 디렉토리나 `.git` 폴더 경로를 알 때 사용한다. -저장소 경로를 정확히 모를 때는 `git_repository_open_ext` 메소드로 찾는다. `git_clone` 메소드와 관련된 메소드는 원격에 있는 저장소를 로컬에 Clone 할 때 사용한다. 그리고 `git_repository_init`은 저장소를 새로 만들 때 사용한다. +저장소 경로를 정확히 모를 때는 `git_repository_open_ext` 메소드로 찾는다. `git_clone` 메소드와 관련된 메소드는 원격에 있는 저장소를 로컬에 Clone 할 때 사용한다. 그리고 `git_repository_init` 은 저장소를 새로 만들 때 사용한다. ////////////////////////// The second chunk of code uses rev-parse syntax (see <> for more on this) to get the commit that HEAD eventually points to. @@ -57,15 +57,15 @@ In this case, `git_object_type(commit)` would return `GIT_OBJ_COMMIT`, so it's s ////////////////////////// rev-parse 문법을 사용하는 두 번째 코드는 HEAD가 가리키는 커밋을 가져온다. `git_object` 포인터는 Git 개체 데이터베이스에 있는 개체를 가리킨다. -`git_object`는 몇 가지 ``자식'' 타입의 ``부모'' 타입이다. 이 ``자식'' 타입들은 `git_object`에 해당하는 부분에 대해서는 메모리 구조가 같다. 그래서 맞는 자식이라면 이렇게 캐스팅해도 안전하다. -`git_object_type(commit)`처럼 호출하면 `GIT_OBJ_COMMIT`을 리턴한다. 그래서 `git_commit` 포인터로 캐스팅해도 된다. +`git_object` 는 몇 가지 ``자식'' 타입의 ``부모'' 타입이다. 이 ``자식'' 타입들은 `git_object` 에 해당하는 부분에 대해서는 메모리 구조가 같다. 그래서 맞는 자식이라면 이렇게 캐스팅해도 안전하다. +`git_object_type(commit)` 처럼 호출하면 `GIT_OBJ_COMMIT` 을 리턴한다. 그래서 `git_commit` 포인터로 캐스팅해도 된다. ////////////////////////// The next chunk shows how to access the commit's properties. The last line here uses a `git_oid` type; this is Libgit2's representation for a SHA-1 hash. ////////////////////////// 그다음 블록은 커밋 정보를 읽는 코드다. -마지막 라인의 `git_oid`는 Libgit2에서 SHA-1 값을 나타내는 타입이다 +마지막 라인의 `git_oid` 는 Libgit2에서 SHA-1 값을 나타내는 타입이다 ////////////////////////// From this sample, a couple of patterns have started to emerge: @@ -111,7 +111,7 @@ Secondly, there's no explicit freeing of resources, since Ruby is garbage-collec Let's take a look at a slightly more complicated example: crafting a commit from scratch ////////////////////////// 비교해보면 코드가 더 간결해졌다. -Rugged는 예외를 사용해서 더 간결하다. 하지만 `ConfigError`나 `ObjectError` 같은 에러가 발생할 수 있다. +Rugged는 예외를 사용해서 더 간결하다. 하지만 `ConfigError` 나 `ObjectError` 같은 에러가 발생할 수 있다. 그리고 Ruby는 가비지 콜렉션을 사용하는 언어라서 리소스를 해제하지 않아도 된다. 좀 더 복잡한 예제를 살펴보자. 새로 커밋하는 예제다. @@ -226,7 +226,7 @@ But what is this `git_odb_backend_mine` thing? Well, that's the constructor for your own ODB implementation, and you can do whatever you want in there, so long as you fill in the `git_odb_backend` structure properly. Here's what it _could_ look like: ////////////////////////// -그런데 `git_odb_backend_mine`는 뭘까? +그런데 `git_odb_backend_mine` 는 뭘까? 이 함수는 우리의 ODB 생성자다. 여기서 원하는 대로 Backend를 만들어 주고 `git_odb_backend` 구조체만 잘 채우면 된다. 아래처럼 만든다. @@ -259,10 +259,10 @@ int git_odb_backend_mine(git_odb_backend **backend_out, /*…*/) ---- ////////////////////////// -The subtlest constraint here is that `my_backend_struct`'s first member must be a `git_odb_backend` structure; this ensures that the memory layout is what the Libgit2 code expects it to be. +The subtlest constraint here is that `my_backend_struct` 's first member must be a `git_odb_backend` structure; this ensures that the memory layout is what the Libgit2 code expects it to be. The rest of it is arbitrary; this structure can be as large or small as you need it to be. ////////////////////////// -`my_backend_struct`의 첫 번째 맴버는 반드시 `git_odb_backend`가 돼야 한다. Libgit2가 동작하는 메모리 구조에 맞아야 한다. +`my_backend_struct` 의 첫 번째 맴버는 반드시 `git_odb_backend` 가 돼야 한다. Libgit2가 동작하는 메모리 구조에 맞아야 한다. 나머지 멤버는 상관없다. 구조체 크기는 커도 되고 작아도 된다. ////////////////////////// From 5e395349e4d44b9c39f27f8837aa598febf5b3e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-No=C3=ABl=20Avila?= Date: Sat, 24 Feb 2018 21:06:35 +0100 Subject: [PATCH 3/4] Add travis recipe --- .travis.yml | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000..cd6f15ad --- /dev/null +++ b/.travis.yml @@ -0,0 +1,34 @@ +language: ruby +sudo: false +git: + depth: false +cache: bundler +before_install: + - wget https://raw.githubusercontent.com/progit/progit2-pub/master/bootstrap.sh + - sh bootstrap.sh +script: bundle exec rake book:build +after_success: bundle exec rake book:tag +deploy: + provider: releases + file_glob: true + file: + - progit*.epub + - progit*.mobi + - progit*.pdf + skip_cleanup: true + on: + tags: true + api-key: $GITHUB_API_TOKEN +branches: + only: + - master + - /^2\.1(\.\d+)+$/ + +addons: + apt: + packages: + - epubcheck +notifications: + email: + on_success: never + on_failure: always From 5b52f06dd49dd2f07af77e35bbe68b470d42d3ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-No=C3=ABl=20Avila?= Date: Sat, 24 Feb 2018 21:34:01 +0100 Subject: [PATCH 4/4] add build status --- README.asc | 1 + 1 file changed, 1 insertion(+) diff --git a/README.asc b/README.asc index ac245517..44247d17 100644 --- a/README.asc +++ b/README.asc @@ -1,3 +1,4 @@ +image::https://travis-ci.org/progit/progit2-ko.svg?branch=master[] = Pro Git, 2판 짜잔, Pro Git 책의 2판입니다.