Merge pull request #26 from aaferrari/master
[gitmagic.git] / vi / multiplayer.txt
blob0b38fb8b4c99638b195b9e6f386915c915e3777b
1 == Đa Người Dùng ==
3 Lúc đầu tôi sử dụng Git cho dự án riêng của mình mà tôi cũng 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 chỗ 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ủ và cũng không có mạng?
52 Bạn cần trong những trường hợp khẩn cấp? Chúng ta đã biết lệnh <<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>>. Chúng ta có thể chuyển qua chuyển lại như vậy để truyền kho Git
55 đi thông qua bất kỳ phương tiện nào, nhưng có một công cụ hiệu quả hơn đó chính là *git bundle*.
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à bản in *xxd* và một bộ quét nhận dạng chữ OCR, đọc các bit thông qua điện thoại,
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 nhận được bằng cách gõ:
65  $ git pull somefile
67 Bộ nhận thậm chí có thể làm được việc này từ một kho chứa rỗng. Mặc dù kích
68 thước của nó, +somefile+ chứa các mục kho Git nguyên thủy.
70 Trong các dự án lớn hơn, việc triệt tiêu lãng phí bằng cách chỉ bundle những thay đổi còn thiếu
71 kho chứa khác. 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 phải làm việc này thường xuyên, một khó khăn là bạn không thể nhớ được chính xác lần commit tương ứng với lần gửi cuối. Trang
77 trợ giúp sẽ gợi ý cho bạn cách sử dụng các thẻ (tag) để giải quyết vấn đề này. Ấy là, sau khi bạn gửi một bundle,
78 thì hãy 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á: Sự Thịnh Hành Toàn Cầu ===
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 sức lôi cuốn toàn cầu. 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 quản lý mã nguồn nào. Chừng nào
91 mà độc giả của bạn có thể đọc được thư điện tử của mình thì họ còn có thể thấy được phần chỉnh sửa của bạn. Tương tự thế, về phía mình,
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 nào trên mạng.
94 Sử dụng lại ví dụ từ chương đầu tiên:
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ử để trao đổi với người khác. Ở kho Git,
99 gõ:
101  $ git apply < my.patch
103 để áp dụng miếng vá.
105 Còn một hình thức định dạng khác nữa, tên và có lẽ cả chữ ký của tác giả cũng được
106 ghi lại, tạo miếng vá tương ứng với một thời điểm chính xác trong quá khứ bằng cách gõ:
108  $ git format-patch 1b6d
110 Tệp tin lưu kết quả có thể chuyển cho lệnh *git-send-email*, hay có thể làm 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 đó chạy lệnh:
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 để chuyển định dạng thư về dạng văn bản thuần  trước khi ghi miếng vá thành một tệp tin.
122 Có một số khác biệt nhỏ giữa các trình đọc đọc thư điện tử, nhưng nếu bạn sử dụng một trong
123 số chúng, bạn hầu như chắc chắn là người mà có thể cấu hình chúng một cách dễ dàng
124 mà chẳng cần phải đọc hướng dẫn sử dụng!
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 Tùy chọn +branch.master.merge+ chỉ ra nhánh remote mặc định trong
143 lệnh *git pull*. Trong suốt quá trình nhân bản, nó được đặt cho nhánh hiện hành của kho chứa
144 mã nguồn, như thế cho dù HEAD của kho nguồn về sau có
145 di chuyển đến một nhánh khác, lệnh pull sau này sẽ trung thành với
146 nhánh nguyên gốc.
148 Tùy chọn này chỉ áp dụng cho kho chứa chúng ta lần đầu tiên nhân bản từ, nó
149 được ghi trong tùy chọn +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 tên 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 === Nhánh Trên Mạng ===
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 không thông báo cho bạn: bạn phải hỏi mới có thể biết chính xác.
161 Việc làm này giúp ngăn ngừa phiền phức do nhánh mạng gây ra cho
162 các nhánh của bạn, 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 Những nhánh tương ứng và HEAD của kho chứa remote, và bạn có thể sử dụng
175 trong các lệnh Git thông thường. Ví dụ như là, giả sử bạn làm nhiều lần commit, và
176 muốn so sánh chúng với bản đã fetch cuối cùng. Bạn cũng có thể tìm kiếm trong tệp tin
177 log để có được giá trị băm SHA1 thích hợp, nhưng dễ dàng hơn việc gõ:
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 === Đa Máy chủ ===
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 giữ lại sự khác biệt trên cả hai. 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 chúng ta có thể xét bất kỳ nhánh nào của bất kỳ kho chứa nào trong một lệnh Git bởi vì chúng ta bây giờ
205 đang làm việc trên bản sao trên máy của mình.
207 Giờ ta xét đến phần hậu trường, 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 là một ngoại lệ đáng chú ý.
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), tôi chạy lệnh Git để di chuyển và xem xét các thay đổi,
221 với ý tưởng là để tổ chức và mô tả tốt hơn. 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 ít. Sau khi đã hài lòng, tôi push nó lên 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 Git thuận lợi trong việc tạo các miếng vá, cũng như là nó
229 tiết kiệm công sức cho chúng ta trong việc chuyển đổi chúng thành những lần commit dành cho Git. Hơn thế nữa, Git lưu giữ các thông tin rất chi tiết
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 mà họ đã tạo ra.