l10n: vi: Update Vietnamese translation:
[gitmagic.git] / vi / grandmaster.txt
blobf6674dda3afa417867438ee7b599b0cd8b3caeb3
1 == Trở Thành Kiện Tướng ==
3 Bây giờ, bạn có thể thông qua lệnh *git help* để bật trang trợ giúp lên và có thể hiểu
4 gần như tất cả mọi thứ. Tuy nhiên, việc xác định chính xác lệnh cần sử dụng để giải quyết
5 các vấn đề thực tế đặt ra có lẽ chẳng dễ dàng gì. Có thể tôi có thể giúp bạn tiết kiệm được thời gian: bên dưới là một vài
6 cách giải quyết các vấn đề thực tế đặt ra mà tôi đã từng sử dụng trong quá khứ.
8 === Phát hành Mã Nguồn ===
10 Với dự án của tôi, Git giữ theo dõi chính xác các tệp tin tôi muốn lưu trữ và phát hành tới
11 người dùng. Để tạo gói tarball cho mã nguồn, tôi chạy:
13  $ git archive --format=tar --prefix=proj-1.2.3/ HEAD
15 === Chỉ Commit Những Gì Thay Đổi ===
17 Việc phải thông báo với Git khi bạn thêm, xóa hay đổi tên các tệp tin là việc rầy rà với
18 các dự án nào đó. Thay vào đó, bạn có thể gõ:
20  $ git add .
21  $ git add -u
23 Git sẽ xem tất cả các tệp tin trong thư mục hiện tại và làm công việc mà nó phải
24 làm. Thay vì chạy lệnh add thứ hai, hãy chạy  `git commit -a` nếu bạn cũng có
25 ý định commit vào lúc này. Xem *git help ignore* để biết làm cách nào để chỉ ra
26 các tệp tin bỏ qua.
28 Bạn có thể thi hành những điều trên chỉ cần một dòng lệnh:
30  $ git ls-files -d -m -o -z | xargs -0 git update-index --add --remove
32 Tùy chọn *-z* và *-0* dùng để ngăn ngừa sai hỏng không mong muốn từ những tệp tin có chứa
33 các ký tự đặc biệt. Bởi vì lệnh này bổ xung những tệp tin đã bị bỏ qua, bạn có thể muốn sử dụng
34 tùy chọn `-x` hay `-X`.
36 === Lần commit này Nhiều Quá! ===
38 Bạn quên việc commit quá lâu? Bạn quá mải mê với việc viết mã nguồn mà quên đi
39 việc quản lý nó? Bạn muốn những thay đổi liên quan đến nhau phải được commit riêng từng lần và nối tiếp nhau, bởi vì
40 đây là phong cách của bạn?
42 Đừng lo lắng. Chạy:
44  $ git add -p
46 Với mỗi lần thay đổi mà bạn tạo ra, Git sẽ hiện cho bạn biết từng đoạn mã đã bị thay đổi,
47 và hỏi nó có phải là một bộ phận của lần commit tiếp theo. Trả lời là  "y" hay "n". Bạn
48 có các sự lựa chọn khác, như là hoãn lại; gõ "?" để biết thêm chi tiết.
50 Khi nào bạn thỏa mãn thì gõ
52  $ git commit
54 để commit chính xác các thay đổi mà bạn đã chọn lựa (các thay đổi về 'staged'). Hãy chắc chắn là
55 bạn đã không dùng tùy chọn *-a*, nếu không thì Git sẽ commit tất cả.
57 Nhưng bạn lại có những tài liệu đã được chỉnh sửa đặt tại nhiều chỗ khác nhau? Việc duyệt từng cái một
58 sẽ làm bạn nản lòng. Trong trường hợp này, sử dụng lệnh *git add -i*, với giao diện
59 không ít rắc rối hơn, nhưng uyển chuyển hơn. Chỉ cần gõ vài cái,
60 bạn có thể đưa vào hay gỡ bỏ nhiều tệp tin vào một trạng thái cùng một lúc, hay xem xét và chọn các thay đổi
61 chỉ trong các tệp tin riêng biệt. Có một sự lựa chọn khác, chạy lệnh *git commit \--interactive* mà nó
62 sẽ tự động commit sau khi bạn làm xong.
64 === Mục Lục: Vùng trạng thái của Git ===
66 Chúng ta trốn tránh chưa muốn nói đến một thứ nổi tiếng của Git đó là 'index' (mục lục), nhưng chúng ta phải đối mặt với nó để mà
67 giảng giải những điều ở trên. Chỉ mục là vùng trạng thái tạm thời. Git ít khi di chuyển
68 dữ liệu qua lại một cách trực tiếp giữa dự án của bạn và lịch sử của nó. Đúng hơn là Git đầu tiên ghi
69 dữ liệu vào mục lục, và sau đó sao chép dữ liệu trong chỉ mục vào chỗ cần ghi
70 cuối.
72 Ví dụ, lệnh *commit -a* thực sự bao gồm hai quá trình. Bước thứ nhất là đặt
73 toàn bộ dữ liệu hiện tại của mọi tệp tin cần theo dõi vào bảng mục lục. Bước thứ
74 hai là ghi vào bảng mục lục. Việc commit không sử dụng tùy chọn
75 *-a* chỉ thi hành bước thứ hai, và nó chỉ có ý nghĩa sau khi chạy lệnh
76 mà lệnh này bằng cách này hay cách khác thay đổi bảng chỉ mục, như là lệnh *git add* chẳng hạn.
78 Thường thường chúng ta bỏ qua mục lục và lấy cớ là chúng ta đang đọc trực tiếp và ghi thẳng vào trong lịch sử. Vì lý do này, chúng ta muốn việc điều khiển chính xác, như vậy chúng ta chỉnh sửa mục lục bằng cách thủ công. Chúng ta đặt một dữ liệu hiện hành của một số, không phải tất cả, các thay đổi của chúng ta vào bảng mục lục, và sau đó ghi những cái này vào lịch sử.
80 === Đừng Quên HEAD Của Mình ===
82 Thẻ HEAD giống như một con trỏ, nó trỏ đến lần commit cuối cùng, tự động di chuyển theo mỗi lần commit mới. Một số lệnh của Git giúp bạn di chuyển nó. Ví dụ như:
84  $ git reset HEAD~3
86 sẽ chuyển HEAD lên vị trí lần commit cách đây ba lần. Thế thì tất cả các lệnh Git thi hành như khi bạn ở vị trí commit này, trong khi các tệp tin của bạn vẫn nằm ở hiện tại. Xem thêm phần trợ giúp cho một số ứng dụng.
88 Nhưng ta lại muốn quay trở lại phần sau này? Lần commit cũ không biết gì về phần sau này cả.
90 Nếu bạn có giá trị băm SHA1 của HEAD gốc thì:
92  $ git reset 1b6d
94 Nhưng giả sử bạn không có được nó? Đừng lo: với những lệnh như thế, Git ghi lại HEAD gốc với thẻ có tên là ORIG_HEAD, và bạn có thể trở về ngon lành và an toàn với lệnh:
96  $ git reset ORIG_HEAD
98 === Tìm HEAD ===
100 Có thể ORIG_HEAD là chưa đủ. Có lẽ bạn vừa nhận thấy mình vừa tạo ra một sai sót có quy mô lớn và bạn cần phải quay lại một lần commit cách đây lâu lắm rồi trong một nhánh mà bạn đã quên rồi vì nó đã quá lâu.
102 Theo mặc định, Git giữ một lần commit ít nhất là hai tuần lễ, ngay cả khi bạn đã ra lệnh
103 cho Git phá hủy nhánh chứa nó. Sự khó khăn là ở chỗ làm thế nào để tìm được giá trị băm
104 thích hợp. Bạn có thể tìm kiếm tất cả các giá trị băm trong `.git/objects` và sử dụng phương pháp thử sai tất cả các giá trị
105 để có được thứ mình muốn. Nhưng còn có cách dễ dàng hơn.
107 Git ghi lại mọi giá trị băm của mọi lần commit trong máy tính tại thư mục `.git/logs`. Thư mục con `refs` chứa lịch sử của tất cả các hoạt động trên tất cả cách nhánh, trong khi tệp tin `HEAD` giữ tất cả các giá trị băm mà nó từng có được. Phần sau có thể được sử dụng để tìm kiếm giá trị băm của các lần commits trên các nhánh cái mà đã bị cắt đi một cách tình cờ.
109 Lệnh reflog cung cấp cho chúng ta một giao diện thân thiện dành cho các tệp tin log. Bạn có thể thử bằng lệnh:
111   $ git reflog
113 Thay vì phải cắt và dán giá trị băm từ reflog, hãy thử:
115  $ git checkout "@{10 minutes ago}"
117 Hay checkout lần thứ 5 kể từ lần commit cuối viếng thăm thông qua lệnh:
119  $ git checkout "@{5}"
121 Xem chương ``Specifying Revisions'' (tạm dịch: chỉ định các điểm xét duyệt) từ lệnh *git help rev-parse* để biết thêm chi tiết.
123 Bạn muốn cấu hình thời gian gia hạn lâu hơn việc xóa bỏ những lần commit. Ví
124 dụ:
126   $ git config gc.pruneexpire "30 days"
128 có nghĩa là việc xóa một lần commit sẽ chỉ thực sự xảy ra khi 30 ngày đã qua và
129 lệnh *git gc* được triệu gọi.
131 Bạn cũng có thể không cho phép chạy lệnh *git gc* một cách tự động:
133   $ git config gc.auto 0
135 trong trường hợp này những lần commit sẽ chỉ bị xóa bỏ khi bạn chạy lệnh *git gc*.
137 === Xây Dựng trên Git ===
139 Tuân thủ theo phong thái UNIX, Git được thiết kế cho phép nó dễ dàng được sử dụng như là một thành phần thực thi bên dưới của các chương trình khác, như là cho giao diện đồ họa GUI và giao diện Web để thay thế cho giao diện dòng lệnh, công cụ quản lý các miếng vá, các công cụ xuất/nhập và chuyển đổi, và những thứ tương tự như thế. Trên thực tế, một số lệnh Git bản chất nó cũng là các kịch bản đứng trên vai của những người khổng lồ, chính là hệ điều hành. Chỉ cần sửa đổi một chút, bạn có thể bắt Git làm việc phù hợp với sở thích của mình.
141 Một mẹo nhỏ là sử dụng một tính năng sẵn có trong Git bằng cách gán bí danh cho các lệnh để nó trở nên ngắn gọn hơn
142 như sau:
144   $ git config --global alias.co checkout   # gán bí danh cho lệnh checkout là co
145   $ git config --global --get-regexp alias  # hiển thị bí danh hiện hành
146   alias.co checkout
147   $ git co foo                              # có kết quả giống như chạy lệnh 'git checkout foo'
149 Một thứ khác là hiển thị nhánh hiện hành lên màn hình hay thanh tiêu đề của cửa sổ.
150 Gọi lệnh:
152   $ git symbolic-ref HEAD
154 sẽ hiển thị tên của nhánh hiện hành. Trong thực tiễn, bạn thích hợp nhất muốn gỡ bỏ
155 "refs/heads/" và tránh các lỗi:
157   $ git symbolic-ref HEAD 2> /dev/null | cut -b 12-
159 Thư mục con +contrib+ là một kho báu được tìm thấy trong số các công cụ được xây dựng dành cho Git.
160 Đúng lúc, một số trong số chúng có thể được xúc tiến thành lệnh chính thức. Trên hệ thống Debian và
161 Ubuntu, thư mục này ở tại +/usr/share/doc/git-core/contrib+.
163 Một thư mục phổ biến khác là +workdir/git-new-workdir+. Thông qua các liên kết tài tình, đoạn kịch bản này tạo ra một thư mục làm việc mới trong khi phần lịch sử thì chia sẻ với kho chứa nguyên gốc:
165   $ git-new-workdir an/existing/repo new/directory
167 Thư mục mới và các tệp tin trong nó có thể được coi như một bản sao, ngoại trừ phần lịch sử được chia sẻ dùng chung, hai cây được tự động đồng bộ hóa. Ở đây không cần có sự trộn, push, hay pull.
169 === Cứ Phiêu Lưu ===
171 Ngày nay, người sử dụng Git rất khó phá hủy dữ liệu.
172 Nhưng nếu như bạn biết mình đang làm gì, bạn có thể vượt qua sự bảo vệ dành cho các lệnh
173 thông thường đó.
175 *Checkout*: Không commit các thay đổi là nguyên nhân của việc checkout gặp lỗi. Để phá hủy sự thay đổi của mình, và dẫu sao cũng checkout commit đã cho, sử dụng cờ bắt buộc (force):
177   $ git checkout -f HEAD^
179 Mặt khác, nếu bạn chỉ định rõ một đường dẫn chi tiết cho lệnh, thế thì ở đây không có sự kiểm tra an toàn nào cả. Đường dẫn được áp dụng sẽ bị âm thầm ghi đè lên. Hãy cẩn thận nếu bạn sử dụng lệnh checkout theo cách này.
181 *Reset*: Lệnh reset cũng xảy ra lỗi khi không commit các thay đổi. Để bắt buộc nó, chạy:
183   $ git reset --hard 1b6d
185 *Branch*: Việc xóa các nhánh cũng gặp lỗi nếu đó là nguyên nhân khiến các thay đổi bị mất. Để ép buộc việc này, hãy gõ:
187   $ git branch -D dead_branch  #thay vì sử dụng tùy chọn -d
189 Cũng tương tự như thế, việc cố gắng ghi đè lên một nhánh bằng cách di chuyển nhánh khác đến nó cũng gây ra lỗi. Để ép buộc sự di chuyển nhánh, gõ:
191   $ git branch -M source target  # thay vì sử dụng tùy chọn -m
193 Không giống như checkout và reset, hai lệnh trên trì hoãn việc phá hủy dữ liệu. Các
194 thay đổi vẫn còn lưu giữ trong thư mục con .git, và có thể lấy lại được bằng cách
195 lấy giá trị băm `.git/logs` thích hợp (xem phần "Tìm - HEAD" ở phía trên).
196 Theo mặc định, chúng sẽ giữ ít nhất là hai tuần lễ.
198 *Clean*: Một số lệnh Git từ chối thi hành bởi vì chúng lo lắng về việc làm như thế
199 làm mất dấu hoàn toàn các tệp tin. Nếu bạn chắc chắn về tất cả các tệp tin và thư mục không cần Git
200 theo dõi nữa và muốn phá hủy chúng đi, thế thì xóa chúng triệt để với lệnh:
202   $ git clean -f -d
204 Sau này, lệnh rầy rà đó sẽ hoạt động!
206 === Ngăn Ngừa Commit Sai ===
208 Có một số lỗi ngớ ngẩn đã xảy ra với tôi. Điều tồi tệ nhất là để sót các tệp tin bởi vì
209 quên lệnh *git add*. Ít tệ hại hơn là các ký tự khoảng trắng và
210 những xung đột không cần phải trộn: mặc dù cũng chẳng tệ hại lắm, tôi mong rằng những điều này sẽ không xảy ra
211 với mọi người.
213 Tôi đã tránh được các lỗi ngu ngốc đó bằng cách sử dụng một _hook_ để nó cảnh báo người dùng khi có những vấn đề:
215  $ cd .git/hooks
216  $ cp pre-commit.sample pre-commit  # Với phiên bản Git cũ cần chạy lệnh: chmod +x pre-commit
218 Ngày nay Git sẽ không commit nếu khi nó trộn nó chỉ tìm thấy những khoảng trắng vô ích hay
219 những xung đột không cần giải trộn.
221 Với bản hướng dẫn này, tôi cuối cùng đã thêm vào dòng đầu của
222 hook *pre-commit* để đề phòng khi ta lơ đãng:
224  if git ls-files -o | grep '\.txt$'; then
225    echo FAIL! Untracked .txt files.
226    exit 1
227  fi
229 Nhiều hoạt động của Git hỗ trợ hook; hãy xem *git help hooks*. Chúng tôi đã kích hoạt
230 một hook mẫu là *post-update* trước khi nói đến Git thông qua HTTP. Cái này chạy
231 mỗi khi head di chuyển. Đoạn script ví dụ post-update cập nhật các tệp tin Git cần
232 cho việc truyền thông thông qua Git-agnostic chuyên chở bằng giao thức giống như là HTTP.