Cách chuyển branch để làm việc với branch khác
Trong khi làm việc với Git, bạn đã quá quen thuộc với việc chỉnh sửa mã nguồn, sau đó là commit mỗi khi chỉnh sửa xong và push lên remote repository nếu cần thiết. Nhưng bây giờ mình có một ví dụ đặt ra là mình muốn tạo một phiên bản thử nghiệm với mã nguồn đang làm việc trong working tree hiện tại mà không gây ảnh hưởng đến các code hiện tại. Vậy thì làm cách nào? Không lẽ clone một repository từ chính cái working tree hiện tại rồi sửa đổi hay sao? Như thế rất là mất
công, mà lại không tối ưu và không thể đồng bộ hóa hoặc rất khó khăn để đồng bộ hóa.
Show Mà trong Git, chúng ta sẽ sử dụng một giải pháp khác tuyệt vời hơn, dễ dàng hơn gọi là phân nhánh (branching), mà cụ thể là phân nhánh cái gì? Đó là phân nhánh trong working tree hiện tại bạn đang làm việc đấy, và mỗi nhánh chúng ta sẽ gọi nó là một branch. Branch trong Git là gì?Khi bắt đầu khởi tạo một repository hoặc clone một repository, bạn sẽ
có một nhánh (branch) chính tên là Đó là lý do tại sao, ở các phần trước khi chúng ta push hoặc pull hay làm một số việc khác thì lại có tham số Nhánh Master là nhánh chính mặc định trong working tree. Bạn có thể tạo ra một (hoặc nhiều nhánh mới) với tên là Develop chẳng hạn. Bây giờ nếu bạn muốn tạo một sự thay đổi nào đó mà có thể trực tiếp sử dụng trên working tree hoặc commit, push lên repository mà không ảnh hưởng đến branch master thì sẽ cần tạo ra một branch mới với tên là Giờ mình lấy một ví dụ đơn giản, bên branch Giải thích thì hơi dài dòng, cứ vào làm ví dụ cụ thể cho dễ hiểu nhé. HEAD – con trỏ vị tríTrước khi nói tiếp về branch thì mình xin nói qua một xíu về Như ảnh trên
thì có nghĩa là mình đang ở branch Ngoài ra còn một cách khác để kiểm tra đó là đọc tập tin $ cat .git/HEAD
ref: refs/heads/master Cách tạo một branchTrước tiên bạn có thể xem toàn bộ các branch mà bạn đang có trong working tree bằng lệnh $ git branch develop Bây giờ bạn có thể gõ lại lệnh Checkout một branchCheckout ở đây nghĩa là bạn truy cập kiểm tra mã nguồn trong branch đó để làm việc đấy. Để làm việc này, bạn sử dụng lệnh $ git checkout develop
Switched to branch 'develop' Lúc này bạn đã đổi sang branch Bây giờ bạn sẽ làm việc trong branch mới chuyển hay nói đúng hơn là bạn đang làm việc ở chỗ mà cái HEAD đang trỏ tới. Để chuyển về branch chính thì gõ Bây giờ bạn thử tạo một tập tin nào đó, sau đó commit ở branch
$ touch develop.html $ git add . $ git commit -m "Commit develop.html from develop branch" [develop 8c68896] Commit develop.html from develop branch 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 develop.html $ git checkout master Switched to branch 'master' Your branch is ahead of 'thach/master' by 3 commits. (use "git push" to publish your local commits) $ ls faq.html README.md tag.html version1.txt Tương tự với việc sửa tập tin hay bất kỳ làm việc gì khác nó cũng chỉ áp dụng thay đổi ở branch bạn đang trỏ tới. Gộp dữ liệu từ một branchNếu mỗi branch nó nằm riêng như vậy thì bạn muốn sử dụng các thay đổi ở một branch nào đó cho master thì sao? À, chúng ta có thể sử dụng lệnh git merge để chuyển dữ liệu từ một branch nào đó về branch mà bạn đang trỏ đến. Lưu ý là ở branch cần chuyển về đã phải được commit. Ví dụ mình cần chuyển dữ liệu từ branch develop về master thì sẽ làm lần lượt các lệnh sau: $ git checkout master Already on 'master' Your branch is ahead of 'thach/master' by 3 commits. (use "git push" to publish your local commits) $ git merge develop Updating 83e9976..8c68896 Fast-forward develop.html | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 develop.html $ ls develop.html faq.html README.md tag.html version1.txt Xóa branchNếu bạn không cần dùng tới branch nào nữa thì có thể xóa với lệnh git branch -d tên_branch. Lưu ý là cái branch muốn xóa phải được gộp dữ liệu (merge) về master. $ git branch -d develop
Deleted branch develop (was 8c68896). Sau khi xóa xong, nó sẽ báo branch đó đã được móc vào commit với mã checksum nào (8c68896). Làm việc với remote branchQuay lại một xíu với bài remote repository, bây giờ bạn hãy tạo thêm một remote mới từ địa chỉ https://github.com/csswizardry/inuit.css và đặt tên cho remote này là inuit vào working tree của bạn. $ git remote add inuit https://github.com/csswizardry/inuit.css $ git remote -v inuit https://github.com/csswizardry/inuit.css (fetch) inuit https://github.com/csswizardry/inuit.css (push) thach https://github.com/thachphamblog/hoc-git.git (fetch) thach https://github.com/thachphamblog/hoc-git.git (push) Bây giờ bạn có thể xem toàn bộ branch của cái remote $ git remote show inuit
* remote inuit
Fetch URL: https://github.com/csswizardry/inuit.css
Push URL: https://github.com/csswizardry/inuit.css
HEAD branch: master
Remote branches:
feature/docs new (next fetch will store in remotes/inuit)
feature/grids new (next fetch will store in remotes/inuit)
fix/beautons new (next fetch will store in remotes/inuit)
fix/grids new (next fetch will store in remotes/inuit)
gh-pages new (next fetch will store in remotes/inuit)
incoming new (next fetch will store in remotes/inuit)
master new (next fetch will store in remotes/inuit)
v5.0.1 new (next fetch will store in remotes/inuit)
v5.1 new (next fetch will store in remotes/inuit)
v5.1.0 new (next fetch will store in remotes/inuit) Bây giờ bạn có thể chọn một cái remote branche cần
fetch dữ liệu về. Ví dụ bây giờ mình sẽ tạo một branch mới cho working tree của mình tên là $ git branch fix_ui $ git checkout fix_ui Switched to branch 'fix_ui' $ git pull inuit gh-pages warning: no common commits remote: Counting objects: 309, done. remote: Compressing objects: 100% (33/33), done. remote: Total 309 (delta 4), reused 2 (delta 2), pack-reused 274 Receiving objects: 100% (309/309), 135.63 KiB | 0 bytes/s, done. Resolving deltas: 100% (106/106), done. From https://github.com/csswizardry/inuit.css * branch gh-pages -> FETCH_HEAD * [new branch] gh-pages -> inuit/gh-pages Auto-merging README.md CONFLICT (add/add): Merge conflict in README.md Automatic merge failed; fix conflicts and then commit the result. Có thể nó sẽ xảy ra lỗi conflict khi gộp file README.md cũng không quan trọng lắm nên bạn có thể bỏ qua bằng cách gõ lệnh Bây giờ bạn có thể commit nó và thử push nó lên repository của bạn. $ git commit -m "Commit from fix_ui" [fix_ui c1eb301] Commit from fix_ui $ git push thach fix_ui Username for 'https://github.com': thachphamblog Password for 'https://[email protected]': Counting objects: 317, done. Delta compression using up to 4 threads. Compressing objects: 100% (201/201), done. Writing objects: 100% (317/317), 135.77 KiB | 0 bytes/s, done. Total 317 (delta 113), reused 304 (delta 106) To https://github.com/thachphamblog/hoc-git.git * [new branch] fix_ui -> fix_ui Nhắc lại rằng, Và dĩ nhiên, bạn cũng có thể qua một branch khác và sử dụng lệnh Ngoài ra, kiến thức về branch còn có một kỹ thuật nữa cũng khá thú vị mà khi làm việc nhóm có thể sẽ cần đến, đó là rebase branch với mục đích hoán đổi vị trí của những lần commit. Tuy nhiên ở đây là serie cơ bản nên mình sẽ không nói qua mà bạn chỉ cần sử dụng thành thạo các kỹ thuật mà mình đã liệt kê trong đây là được. Lời kếtVậy là tới đây mình đã kết thúc hướng dẫn xong các kỹ thuật quan trọng nhất trong Git mà bạn dù bất cứ sử dụng Git trong mục đích nào cũng phải sử dụng. Mình cũng đã hướng dẫn cặn kẽ nhất theo cách hiểu của mình theo hướng đơn giản nhất nên mình hy vọng bạn có thể hiểu nó. Tiếp tục ở bài sau, mình sẽ không nói qua về các kỹ thuật trong Git nữa mà mình sẽ giới thiệu cho các bạn một số dịch vụ máy chủ repository dành cho Git tốt nhất và đặc biệt là có gói miễn phí để bạn có thêm nhiều lựa chọn. Thạch PhạmBé Thạch 18 tuổi, hiện công tác tại AZDIGI với vị trí giữ xe và viết thuê tại ThachPham.Com. Sở thích nghiên cứu về website, DevOps, SysAdmin và xăm mình nữa. Phương châm sống của bé là "No Pain, No Gain". Hiện tại blog tạm đóng bình luận vì mình cần tập trung thời gian vào cập nhật bài viết. Bình luận sẽ mở ra cho đến khi mình sẵn sàng. |