Edit branch.txt
[gitmagic/gitmagic.git] / vi / branch.txt
blobeb8382893ceef3203013052c77dab55737ee3ab3
1 == Branch Wizardry ==
3 Instant branching and merging are the most lethal of Git's killer features.
5 *Problem*: External factors inevitably necessitate context switching. A severe
6 bug manifests in the released version without warning. The deadline for a
7 certain feature is moved closer. A developer whose help you need for a key section of the project is about to leave. In all cases, you must abruptly drop what you are doing and focus on a completely different task.
9 Interrupting your train of thought can be detrimental to your productivity, and the more cumbersome it is to switch contexts, the greater the loss. With centralized version control we must download a fresh working copy from the central server. Distributed systems fare better, as we can clone the desired version locally.
11 But cloning still entails copying the whole working directory as well as the entire history up to the given point. Dù là Git reduces the cost of this with file sharing and hard links, the project files themselves must be recreated in their entirety in the new working directory.
13 *Solution*: Git có một công cụ tốt hơn để sử lý tình huống này that is much faster and more space-efficient hơn là cloning: *git branch*.
15 With this magic word, the files in your directory suddenly shapeshift from one version to another. This transformation can do more than merely go back or forward in history. Your files can morph from the last release to the experimental version to the current development version to your friend's version and so on.
17 === The Boss Key ===
19 Ever played one of those games where at the push of a button (``the boss key''), the screen would instantly display a spreadsheet or something? So if the boss walked in the office while you were playing the game you could quickly hide it away?
21 Ở thư mục nào đó:
23  $ echo "I'm smarter than my boss" > myfile.txt
24  $ git init
25  $ git add .
26  $ git commit -m "Lần commit bắt đầu"
28 Chúng ta đã tạo ra kho chứa Git mà nó theo dõi một tệp tin văn bản có chứa một thông điệp đã biết trước. Giờ hãy gõ:
30  $ git checkout -b boss  # nothing seems to change after this
31  $ echo "My boss is smarter than me" > myfile.txt
32  $ git commit -a -m "Another commit"
34 It looks like we've just overwritten our file and committed it. Nhưng đó chỉ là ảo tưởng. Gõ:
36  $ git checkout master  # switch to original version of the file
38 Ối trời ơi! Tệp tin văn bản lại trở về như cũ mất rồi. And if the boss decides to snoop around this directory, gõ:
40  $ git checkout boss  # switch to version suitable for boss' eyes
42 Bạn có thể hoán chuyển giữa hai phiên bản của tệp tin tùy thích, và commit to each independently.
44 === Dirty Work ===
46 [[branch]]
47 Say you're working on some feature, và vì lý do nào đó, bạn muốn quay trở lại bản cách đây ba bản và tạm thời đặt vài dòng lệnh
48 in print để có thể thấy được một số thứ hoạt động như thế nào. Thế thì:
50  $ git commit -a
51  $ git checkout HEAD~3
53 Giờ thì bạn có thể thêm những dòng code tạm thờiNow you can add ugly temporary code all over the place. You can even commit these changes. Khi bạn đã làm xong,
55  $ git checkout master
57 để quay lại công việc chính. Observe that any uncommitted changes are carried over.
59 What if you wanted to save the temporary changes after all? Rất dễ:
61  $ git checkout -b dirty
63 and commit before switching back to the master branch. Whenever you want to return to the dirty changes, simply type:
65  $ git checkout dirty
67 We touched upon this command in an earlier chapter, when discussing loading old states. At last we can tell the whole story: the files change to the requested state, but we must leave the master branch. Any commits made from now on take your files down a different road, which can be named later.
69 In other words, after checking out an old state, Git automatically puts you in a new, unnamed branch, which can be named and saved with *git checkout -b*.
71 === Quick Fixes ===
73 You're in the middle of something when you are told to drop everything and fix a newly discovered bug in commit `1b6d...`:
75  $ git commit -a
76  $ git checkout -b fixes 1b6d
78 Then once you've fixed the bug:
80  $ git commit -a -m "Bug fixed"
81  $ git push  # to the central repository
82  $ git checkout master
84 and resume work on your original task.
86 You can even 'merge' in the bugfix you just made, dùng một trong hai lệnh sau:
88  $ git merge fixes
90 hay là:
92  $ git pull
94 since you have already pushed the bugfix to the main repository.
96 === Merging ===
98 Với một số hệ thống quản lý mã nguồn, việc tạo các nhánh rất dễ dàng nhưng trộn chúng
99 trở lại là một bài toán hóc búa. Với Git, việc trộn là dễ dàng that you might be
100 unaware of it happening.
102 We actually encountered merging long ago. The *pull* command in fact 'fetches'
103 commits and then merges them into your current branch. If you have no local
104 changes, then the merge is a 'fast forward', a degenerate case akin to fetching
105 the latest version in a centralized version control system. But if you do have
106 local changes, Git will automatically merge, and report any conflicts.
108 Ordinarily, a commit has exactly one 'parent commit', namely, the previous
109 commit. Merging branches together produces a commit with at least two parents.
110 This begs the question: what commit does `HEAD~10` really refer to? A commit
111 could have multiple parents, so which one do we follow?
113 It turns out this notation chooses the first parent every time. This is
114 desirable because the current branch becomes the first parent during a merge;
115 frequently you're only concerned with the changes you made in the current
116 branch, as opposed to changes merged in from other branches.
118 You can refer to a specific parent with a caret. Ví dụ, để hiển thị
119 the logs from the second parent:
121  $ git log HEAD^2
123 You may omit the number for the first parent. Ví dụ, để hiển thị
124 sự khác nhau với differences with the first parent:
126  $ git diff HEAD^
128 You can combine this notation with other types. Ví dụ:
130  $ git checkout 1b6d^^2~10 -b ancient
132 starts a new branch ``ancient'' representing the state 10 commits back from the
133 second parent of the first parent of the commit starting with 1b6d.
135 === Uninterrupted Workflow ===
137 Often in hardware projects, the second step of a plan must await the completion of the first step. A car undergoing repairs might sit idly in a garage until a particular part arrives from the factory. A prototype might wait for a chip to be fabricated before construction can continue.
139 Software projects can be similar. The second part of a new feature may have to
140 wait until the first part has been released and tested. Some projects require
141 your code to be reviewed before accepting it, so you might wait until the first
142 part is approved before starting the second part.
144 Thanks to painless branching and merging, we can bend the rules and work on
145 Part II before Part I is officially ready. Suppose you have committed Part I
146 and sent it for review. Let's say you're in the `master` branch. Then branch
147 off:
149  $ git checkout -b part2
151 Next, work on Part II, committing your changes along the way. To err is human,
152 and often you'll want to go back and fix something in Part I.
153 Nếu may mắn,If you're lucky, or very good, you can skip these lines.
155  $ git checkout master  # Go back to Part I.
156  $ fix_problem
157  $ git commit -a        # Commit the fixes.
158  $ git checkout part2   # Go back to Part II.
159  $ git merge master     # Merge in those fixes.
161 Cuối cùng, Part I is approved:
163  $ git checkout master  # Go back to Part I.
164  $ submit files         # Release to the world!
165  $ git merge part2      # Merge in Part II.
166  $ git branch -d part2
168 Now you're in the `master` branch again, with Part II in the working directory.
170 It's easy to extend this trick for any number of parts. It's also easy to
171 branch off retroactively: suppose you belatedly realize you should have created
172 a branch 7 commits ago. Then type:
174  $ git branch -m master part2
175  $  # Rename "master" branch to "part2".
176  $ git checkout HEAD~7 -b master
178 The `master` branch now contains just Part I, and the `part2` branch contains
179 the rest.
181 === Reorganizing a Medley ===
183 Perhaps you like to work on all aspects of a project in the same branch. You want to keep works-in-progress to yourself and want others to see your commits only when they have been neatly organized. Start a couple of branches:
185   $ git checkout -b sanitized
186   $ git checkout -b medley
188 Next, work on anything: sửa lỗi, thêm các đặc tính kỹ thuật, thêm mã lệnh tạm thời, vân vân, committing often along the way. Then:
190   $ git checkout sanitized
191   $ git cherry-pick medley^^
193 applies the grandparent of the head commit of the ``medley'' branch to the ``sanitized'' branch. With appropriate cherry-picks you can construct a branch that contains only permanent code, and has related commits grouped together.
195 === Managing Branches ===
197 Liệt kê tất cả các nhánh bằng cách gõ:
199  $ git branch
201 Theo mặc định, bạn bắt đầu tại nhánh có tên ``master''. Some advocate leaving the
202 ``master'' branch untouched và tạo các nhánh mới cho các chỉnh sửa của riêng mình.
204 Các tùy chọn *-d* and *-m* cho phép bạn xóa hay di chuyểm (đổi tên) các nhánh.
205 Xem thêm *git help branch*.
207 Nhánh ``master'' branch is a useful custom. Others may assume that your
208 repository has a branch with this name, and that it contains the official
209 version of your project. Although you can rename or obliterate the ``master''
210 branch, you might as well respect this convention.
212 === Nhánh Tạm ===
214 After a while you may realize you are creating short-lived branches
215 frequently for similar reasons: every other branch merely serves to
216 save the current state so you can briefly hop back to an older state to
217 fix a high-priority bug or something.
219 Điều này cũng tương tự như việc chuyển kênh trên TV một cách tạm thời để thấy chương trình khác đang chiếu.
220 Nhưng thay vì chỉ cần nhấn vài cái nút, bạn phải tạo, check out,
221 trộn và xóa nhánh tạm đó. May mắn thay, Git có cách ngắn gọn tiện lợi
222 chẳng thua kém gì chiếc điều khiển từ xa của một chiếc TV:
224  $ git stash
226 This saves the current state in a temporary location (một 'stash') and
227 restores the previous state. Your working directory appears exactly as it was
228 before you started editing, and you can fix bugs, pull in upstream changes, and
229 so on. When you want to go back to the stashed state, type:
231  $ git stash apply  # Bạn có thể phải giải quyết các xung đột.
233 You can have multiple stashes, and manipulate them in various ways. See
234 *git help stash*. As you may have guessed, Git maintains branches behind the scenes to perform this magic trick.
236 === Làm Theo Cách Của Mình ===
238 You might wonder if branches are worth the bother. After all, clones are almost
239 as fast, and you can switch between them with *cd* instead of esoteric Git
240 commands.
242 Consider web browsers. Tại sao hỗ trợ mở nhiều tab thì cũng tốt như mở trên nhiều cửa sổ khác nhau?
243 Bởi vì cả hai điều này thể hiện tính đa dạng của quan điểm, phong cách sống. Một số người sử dụng lại thích
244 chỉ giữ một cửa sổ trình duyệt được mở, và sử dụng các tab để hiển thị nhiều trang web một lúc. Những người khác
245 có lẽ lại khăng khăng cực đoan cho rằng: mở trên nhiều cửa sổ khác nhau và chẳng cần tab nữa.
246 Một nhóm khác lại thích cả hai một lúc.
248 Việc tạo nhánh thì cũng giống như các tab cho thư mục làm việc của bạn, việc nhân bản thì giống như việc mở một cửa sổ duyệt mới. Những việc này nhanh chóng và nội bộ, thế thì sao lại không
249 thử nghiệm để tìm thấy cách thực hiện thích hợp nhất cho mình? Git giúp bạn làm việc chính xác
250 như bạn muốn.