Edit multiplayer.txt
[gitmagic/gitmagic.git] / vi / multiplayer.txt
blob9839757c0fdc963dfcb3b336e74e2ec7b70f42b8
1 == Multiplayer Git ==
3 Lúc đầu tôi sử dụng Git cho dự án riêng mà tôi là người duy nhất phát triển nó.
4 Trong số những lệnh liên quan đến bản chất phân tán của Git, tôi chỉ cần lệnh *pull*
5 và *clone* để giữ cùng một dự án nhưng ở những địa điểm khác nhau.
7 Sau đó tôi muốn mã nguồn của mình được phổ biến trên mạng bằng việc sử dụng Git, và bao gồm cả những thay đổi từ
8 những người đóng góp. Tôi đã phải học cách làm thế nào để quản lý các dự án có nhiều người phát triển phần mềm
9 ở khắp nơi trên toàn thế giới. May mắn thay, đây là sở trường của Git, và người ta có thể nói đây là
10 điều sống còn của một hệ thống quản lý mã nguồn.
13 === Tôi Là Ai? ===
15 Mỗi lần commit sẽ lưu giữ tên và địa chỉ thư điện tử, điều này có thể nhìn thấy bằng lệnh *git log*.
16 Theo mặc định, Git sử dụng các trường để lưu giữ các cài đặt trong hệ thống của mình.
17 Để chỉ định chúng một cách rõ ràng, hãy gõ:
19   $ git config --global user.name "John Doe"
20   $ git config --global user.email johndoe@example.com
22 Bỏ qua cờ global để đặt những thông tin này chỉ sử dụng cho kho chứa hiện tại.
24 === Git Thông Qua SSH, HTTP ===
26 Giả sử bạn có thể truy cập vào một máy chủ web qua SSH, nhưng Git lại chưa được cài đặt ở đây. Mặc dù
27 không hiệu quả như giao thức nguyên bản của nó, nhưng Git vẫn có thể truyền thông thông qua HTTP.
29 Tải về, dịch và cài Git bằng tài khoản của bạn, và tạo kho chứa tại
30 thư mục chứa trang web của bạn:
32  $ GIT_DIR=proj.git git init
33  $ cd proj.git
34  $ git --bare update-server-info
35  $ cp hooks/post-update.sample hooks/post-update
37 Với các phiên bản Git cũ, lệnh copy không thực hiện được và bạn phải chạy:
39  $ chmod a+x hooks/post-update
41 Từ giờ bạn có thể xuất bản mới nhất của mình thông qua SSH từ một bản sao bất kỳ:
43  $ git push web.server:/path/to/proj.git master
45 và mọi người có thể lấy dự án của bạn với lệnh:
47  $ git clone http://web.server/proj.git
49 === Git Thông Qua Mọi Thứ ===
51 Bạn muốn đồng bộ hóa kho chứa nhưng lại không có máy chủ hay là mạng?
52 Need to improvise during an emergency? We've seen <<makinghistory, *git
53 fast-export* và *git fast-import* có thể chuyển đổi một kho chứa thành một tệp tin đơn
54 và ngược lại>>. We could shuttle such files back and forth to transport git
55 repositories thông qua bất kỳ phương tiện nào, nhưng có một công cụ hiệu quả hơn đó chính là *git bundle*.
57 Người gửi tạo một 'bundle':
59  $ git bundle create somefile HEAD
61 sau đó gửi bundle, +somefile+, tới người cần bằng cách nào đó: thư điện tử,
62 ổ đĩa USB, và *xxd* printout and an OCR scanner, reading bits over the phone,
63 tín hiệu khói, v.v.. Người nhận khôi phục lại các lần commit từ bundle bằng cách gõ:
65  $ git pull somefile
67 The receiver can even do this from an empty repository. Despite its
68 size, +somefile+ contains the entire original git repository.
70 Trong các dự án lớn hơn, việc triệt tiêu lãng phí bằng bundling only changes the other
71 repository lacks. Ví dụ, giả sử lần commit ``1b6d...'' là lần commit gần nhất
72 đã được chia sẻ giữa cả hai thành viên:
74  $ git bundle create somefile HEAD ^1b6d
76 Nếu làm thường xuyên, one could easily forget which commit was last sent. The
77 help page suggests using tags to solve this. Ấy là, sau khi bạn gửi một bundle,
78 gõ:
80  $ git tag -f lastbundle HEAD
82 và tạo một bản bundles mới với:
84  $ git bundle create newbundle HEAD ^lastbundle
86 === Vá: The Global Currency ===
88 Miếng vá được trình bày ở dạng văn bản các thay đổi của bạn, nó dễ dàng được đọc hiểu bởi
89 con người cũng như là máy tính. Điều này mang lại cho chúng universal appeal. Bạn có thể gửi miếng vá qua
90 thư điện tử cho những nhà phát triển phần mềm khác mà chẳng cần lo họ đang sử dụng hệ thống mã nguồn nào. As long
91 as your audience can read their email, they can see your edits. Tương tự thế, về phía mình,
92 những thứ bạn cần là có một địa chỉ thư điện tử: ở đây chẳng cần cài đặt kho chứa Git trên mạng.
94 Recall from the first chapter:
96  $ git diff 1b6d > my.patch
98 đầu ra là một miếng vá mà bạn có thể dán vào một thư điện tử để thảo luận. Ở kho Git,
99 gõ:
101  $ git apply < my.patch
103 để áp dụng miếng vá.
105 In more formal settings, when author names and perhaps signatures should be
106 recorded, generate the corresponding patches past a certain point by typing:
108  $ git format-patch 1b6d
110 The resulting files can be given to *git-send-email*, hay có thể gửi thủ công. Bạn cũng có thể chỉ định rõ một vùng commit:
112  $ git format-patch 1b6d..HEAD^^
114 Ở phía người nhận cuối, ghi lại thư điện tử thành tệp tin, sau đó gõ:
116  $ git am < email.txt
118 Lệnh này sẽ áp dụng cho miếng vá nhận được, đồng thời tạo ra một lần commit, bao gồm các thông tin như là tác giả.
120 Với một chương trình đọc thư điện tử, bạn có thể sử dụng con chuột để to see the email in its raw original form trước khi ghi miếng vá thành một tệp tin.
122 There are slight differences for mbox-based email clients, nhưng nếu bạn sử dụng một trong
123 số chúng, you're probably the sort of person who can figure them out easily
124 without reading tutorials!
126 === Rất tiếc! Tôi đã chuyển đi ===
128 Sau khi nhân bản kho chứa, việc chạy lệnh *git push* hay *git pull* sẽ tự động
129 push tới hay pull từ URL gốc. Git đã làm điều này như thế nào? Bí mật nằm ở chỗ
130 các tùy chọn config đã được tạo ra cùng với bản sao. Hãy xem thử:
132  $ git config --list
134 Tùy chọn +remote.origin.url+ sẽ lưu giữ URL; ``origin'' là cái tên
135 được đặt cho kho nguồn. Với nhánh ``master'' theo như thường lệ, chúng ta có thể
136 thay đổi hay xóa các tên này nhưng chẳng có lý do gì để phải làm như thế cả.
138 Nếu kho chứa nguyên bản đã chuyển chỗ, chúng ta có thể cập nhật URL thông qua:
140  $ git config remote.origin.url git://new.url/proj.git
142 The +branch.master.merge+ option specifies the default remote branch in
143 a *git pull*. Trong suốt quá trình During the initial clone, nó được đặt cho nhánh hiện hành của kho chứa
144 mã nguồn, so even if the HEAD of the source repository subsequently
145 moves to a different branch, a later pull will faithfully follow the
146 original branch.
148 This option only applies to the repository we first cloned from, which is
149 recorded in the option +branch.master.remote+. Nếu chúng ta pull từ kho
150 chứa khác chúng ta phải chỉ đích xác nhánh mà chúng ta muốn:
152  $ git pull git://example.com/other.git master
154 Phần phía trên giải thích tại sao một số lệnh push và pull ví dụ của chúng ta lại không có
155 tham số.
157 === Remote Branches ===
159 Khi bạn nhân bản một kho chứa, bạn cũng đồng thời nhân bản tất cả các nhánh của nó. Bạn sẽ không nhận
160 được cảnh báo này bởi vì Git giấu chúng đi: bạn phải hỏi mới có thể biết chính xác.
161 This prevents branches in the remote repository from interfering with
162 your branches, và cũng làm cho Git dễ dàng hơn với người mới dùng.
164 Ta liệt kê các nhánh bằng lệnh:
166  $ git branch -r
168 Bạn nhận được kết quả trông giống như thế này:
170  origin/HEAD
171  origin/master
172  origin/experimental
174 These represent branches and the HEAD of the remote repository, and can be used
175 trong các lệnh Git thông thường. Ví dụ như là, suppose you have made many commits, and
176 wish to compare against the last fetched version. You could search through the
177 logs for the appropriate SHA1 hash, but it's much easier to type:
179  $ git diff origin/HEAD
181 Hay bạn có thể xem nhánh ``experimental'' đang làm gì:
183  $ git log origin/experimental
185 === Multiple Remotes ===
187 Giả sử hai người cùng phát triển trên một sự án của chúng ta, và họ muốn
188 keep tabs on both. Chúng ta theo dõi hơn một kho chứa tại một thời điểm với lệnh:
190  $ git remote add other git://example.com/some_repo.git
191  $ git pull other some_branch
193 Bây giờ chúng ta có thể trộn với nhánh của kho chứa thứ hai, và chúng ta
194 dễ dàng truy cập tất cả các nhánh của tất cả các kho chứa:
196  $ git diff origin/experimental^ other/some_branch~5
198 Nhưng chúng ta chỉ muốn so sánh sự khác nhau giữ chúng nhưng không áp dụng các thay đổi này với chúng ta? Nói cách khác, chúng ta khảo sát các nhánh của họ nhưng không thay đổi những gì đang có trong thư mục làm việc của mình. Thế thì thay vì pull, ta dùng lệnh:
200  $ git fetch        # Lấy về từ nguyên gốc, theo mặc định.
201  $ git fetch other  # Lấy về từ lập trình viên thứ hai.
203 Lệnh này chỉ mang về phần lịch sử. Mặc dù thư mục làm việc vẫn còn nguyên chưa bị động đến,
204 we can refer to any branch of any repository in a Git command because we now
205 possess a local copy.
207 Recall that behind the scenes, lệnh pull đơn giản là *fetch* sau đó *merge*.
208 Thông thường chúng ta *pull* bởi vì chúng ta muốn trộn với lần commit cuối cùng sau khi fetch;
209 việc làm này this situation is a notable exception.
211 Xem *git help remote* để biết cách làm thế nào để gỡ bỏ kho chứa trên mạng, bỏ qua các nhánh
212 xác định, và những thứ khác nữa.
214 === Sở Thích Riêng Của Tôi ===
216 Với dự án của mình, tôi thích những người cộng tác tạo các kho chứa ở nơi mà tôi có thể
217 pull. Một số dịch vụ Git cho phép bạn đặt nhánh riêng của mình từ một dự án trên đó
218 chỉ cần sử dụng chuột.
220 Sau khi tôi fetch một cây (tree), I run Git commands to navigate và xem xét các thay đổi,
221 which ideally are well-organized and well-described. Tôi trộn với các thay đổi của chính mình,
222 và có thể sẽ sửa thêm chút nữa. Khi đã hài lòng, tôi push tới kho chứa chính.
224 Mặc dù tôi ít nhận được sự cộng tác, nhưng tôi tin rằng việc này sẽ thay đổi theo chiều hướng
225 tốt lên. Hãy đọc
226 http://torvalds-family.blogspot.com/2009/06/happiness-is-warm-scm.html[blog của Linus Torvalds].
228 Trong thế giới Git world is slightly thuận lợi hơn việc vá các tệp tin, cũng như là nó
229 tiết kiệm công sức cho việc chuyển đổi chúng thành những lần commit dành cho Git. Hơn thế nữa, Git giữ các thông tin rất chi tiết
230 như là ghi lại tên và địa chỉ thư điện tử của tác giả, cũng như là ngày tháng và
231 thời gian, và nó cũng đòi hỏi tác giả phải mô tả về những thay đổi của họ.