[Git] Branch – Kỹ thuật phân nhánh [NEW]

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 đó thực hiện từng lần chỉnh sửa và đẩy đến kho lưu trữ từ xa nếu cần. Nhưng bây giờ tôi có một ví dụ mà tôi muốn tạo phiên bản thử nghiệm với mã nguồn hoạt động trong cây làm việc hiện tại mà không ảnh hưởng đến mã hiện có. Sau đó như thế nào? Không thể sao chép một kho lưu trữ từ cây làm việc hiện tại và sau đó sửa đổi nó? Việc đó rất tốn công nhưng không tối ưu và không đồng bộ được hoặc rất khó đồng bộ.

Nhưng trong Git, chúng tôi sẽ sử dụng một giải pháp tuyệt vời, dễ dàng hơn có tên là phân nhánh (phân nhánh), nhưng cụ thể là phân nhánh gì? Đó là nhánh trong cây làm việc mà bạn hiện đang làm việc và mỗi nhánh chúng tôi sẽ gọi nó là chi nhánh.

Chi nhánh trong Git là gì?

Khi bắt đầu tạo một kho lưu trữ hoặc sao chép một kho lưu trữ, bạn sẽ có một nhánh chính có tên master (có thể hiểu master là cái hòm). Đây là nhánh sẽ chứa tất cả mã nguồn chính trong kho lưu trữ.

Đó là lý do tại sao, trong các phần trước khi chúng ta đẩy hoặc kéo hoặc làm một số việc khác, có một tham số master trong tuyên bố, điều đó có nghĩa là chúng tôi đang thực hiện hoạt động trên chi nhánh master.

[Git] Branch – Kỹ thuật phân nhánh [NEW]

Nhánh Master là nhánh chính mặc định trong cây làm việc. Bạn có thể tạo một (hoặc nhiều nhánh mới) với tên Develop chẳng hạn.

Bây giờ nếu bạn muốn thực hiện một thay đổi có thể được sử dụng trực tiếp trên cây làm việc hoặc cam kết, đẩy đến kho lưu trữ mà không ảnh hưởng đến nhánh chính, bạn sẽ cần tạo một nhánh mới có tên develop Như là. Và kể từ đó, mỗi khi bạn thực hiện kiểm tra trên một chi nhánh, tất cả mã nguồn trên cây làm việc của bạn sẽ được thay đổi thành môi trường cho chi nhánh đó.

Bây giờ tôi lấy một ví dụ đơn giản, trên nhánh master bạn tạo một tệp master.html sau đó cam kết, bây giờ khi bạn đi đến chi nhánh develop (đã tạo trước đó) thì tệp master.html cái kia sẽ không ở đó vì nó đã được cam kết bởi chi nhánhmasterkhông có gì để làm vớidevelop. Tương tự, những thay đổi của bạn bên trong develop Nó cũng sẽ không ảnh hưởng đến bữa tiệc master trưởng phòng. Điều này có một điều thú vị là nó tương tác trực tiếp trên máy tính của bạn, ví dụ: tệp index.html của master có nội dung khác và index.html bên trong develop thì khi bạn sử dụng lệnh checkout, nội dung trên máy tính sẽ tự động thay đổi tương ứng, đó là lý do bạn có thể test nhiều phiên bản trên máy tính mà không cần thay đổi thư mục, chỉ cần kiểm tra nhánh.

Giải thích hơi dài dòng, mình xin làm ví dụ cụ thể cho dễ hiểu.

HEAD – con trỏ vị trí

Trước khi nói về các nhánh, tôi muốn nói một chút vềHEAD. Trong Git, từ khóa HEAD sẽ đại diện cho một con trỏ hiển thị cho bạn vị trí của bạn. Bây giờ hãy xem lại hướng dẫn cam kết nhật ký của tôi, tìm phần tối ưu hóa nhật ký và cài đặt nó. Sau đó gõ lệnh git lg và bạn sẽ thấy từ khóa HEAD cho bạn biết bạn đang ở đâu trong cây làm việc.

git-head-tips

Như hình trên, có nghĩa là tôi đang ở trong chi nhánhmaster.

Ngoài ra còn có một cách khác để kiểm tra đó là đọc tệp .git/HEAD

$ cat .git/HEAD
ref: refs/heads/master

Cách tạo một nhánh

Trước tiên, bạn có thể xem tất cả các nhánh mà bạn hiện có trong cây làm việc bằng lệnh git branch. Sau đó, nếu bạn muốn tạo thêm nhánh, chỉ cần gõ lệnh git branch tên_brand. Ví dụ: tôi cần tạo một nhánhdevelop.

$ git branch develop

Bây giờ bạn có thể gõ lại lệnh git branch một lần nữa để xem sẽ thấy tên thương hiệu phát triển xuất hiện.

Kiểm tra một chi nhánh

Checkout ở đây có nghĩa là bạn vào tra mã nguồn ở nhánh đó để thực hiện. Để làm điều này, bạn sử dụng lệnh git checkout tên_branch.

$ git checkout develop
Switched to branch 'develop'

Bây giờ bạn đã thay đổi thành chi nhánh develop sau đó, để đảm bảo bạn có thể gõ các lệnh kiểm tra HEAD ở trên.

Bây giờ bạn sẽ làm việc trong chi nhánh mới được chuyển đến hay đúng hơn là bạn đang làm việc ở nơi HEAD đang trỏ đến. Để chuyển về nhánh chính, hãy nhập git checkout master.

Bây giờ hãy thử tạo một tệp, sau đó cam kết trong nhánh develop sau đó chuyển trở lại nhánh cái và bạn sẽ thấy những gì bạn đã làm trong nhánh develop hoàn toàn vô nghĩa trongmaster. Đây là một ví dụ về việc ở trên chi nhánh master không có tệp Develop.html nào được tạo từ nhánh develop.

$ 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ự như chỉnh sửa tệp hoặc bất kỳ thứ gì khác, nó chỉ áp dụng các thay đổi cho nhánh bạn đang trỏ đến.

Hợp nhất dữ liệu từ một chi nhánh

Nếu mỗi nhánh riêng biệt như vậy, nếu bạn muốn sử dụng các thay đổi trong một nhánh nhất định cho chính thì sao? Chúng ta có thể sử dụng lệnh git merge để di chuyển dữ liệu từ một nhánh nhất định đến nhánh mà bạn đang trỏ tới. Lưu ý rằng chi nhánh cần được chuyển trở lại phải được cam kết. Ví dụ: nếu mình cần chuyển dữ liệu từ branch development sang master, mình sẽ thực hiện 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 chi nhánh

Nếu bạn không cần thêm nhánh nào nữa, bạn có thể xóa chúng bằng lệnh git branch -d name_branch. Lưu ý rằng nhánh bạn muốn xóa phải được hợp nhất vào chính.

$ git branch -d develop
Deleted branch develop (was 8c68896).

Sau khi quá trình xóa hoàn tất, nó sẽ cho bạn biết rằng chi nhánh đã được kết nối với cam kết bằng mã tổng kiểm tra (8c68896).

Làm việc với các chi nhánh ở xa

Quay trở lại một chút với bài đăng về kho lưu trữ từ xa, bây giờ hãy tạo một điều khiển từ xa mới từ https://github.com/csswizardry/inuit.css và đặt tên cho bộ điều khiển từ xa này trong cây làm việc 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ộ chi nhánh của điều khiển từ xa inuit chỉ được thêm bằng lệnh git remote show inuit.

$ 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 nhánh từ xa để lấy dữ liệu. Ví dụ: bây giờ tôi sẽ tạo một nhánh mới cho cây làm việc của tôi có tênfix_uisau đó tải dữ liệu trong nhánh gh-pages sau đó inuit Tôi sẽ lần lượt làm như sau.

$ 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ể sẽ xảy ra xung đột khi gộp tệp README.md, điều này không quan trọng lắm nên bạn có thể bỏ qua bằng cách gõ lệnh git add README.md để theo dõi tệp này, bởi vì bây giờ nếu bạn gõ lệnh ls Tôi đã có các tệp từ inuit.

Bây giờ bạn có thể cam kết nó và cố gắng đẩy nó vào kho lưu trữ 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ớ lại rằng, thach có nghĩa là tên từ xa của kho lưu trữ mà tôi cần đẩy và fix_ui là tên của chi nhánh tôi cần đẩy. Và đây là kết quả sau khi đẩy đến kho lưu trữ của tôi.

git-push-remote-branch

Và tất nhiên, bạn cũng có thể đi đến một nhánh khác và sử dụng lệnh git merge để hợp nhất dữ liệu của nhánh này.

Ngoài ra, kiến ​​thức về các nhánh còn một kỹ thuật thú vị khác có thể cần khi làm việc nhóm, đó là chi nhánh rebase với mục đích hoán đổi vị trí của các cam kết. Tuy nhiên, đây là một loạt bài cơ bản nên tôi sẽ không nói về nó, mà bạn chỉ cần nắm vững các kỹ thuật mà tôi đã liệt kê ở đây.

Phần kết

Vậy là đến đây mình đã hướng dẫn xong những kỹ thuật quan trọng nhất trong Git mà bạn phải sử dụng cho dù bạn sử dụng Git cho mục đích gì. Mình cũng hướng dẫn chi tiết nhất theo cách hiểu của mình một cách đơn giản nhất mong các bạn thông cảm. Tiếp tục ở bài sau mình sẽ không nói về các kỹ thuật trong Git nữa mà sẽ giới thiệu đến các bạn một số dịch vụ máy chủ kho lưu trữ Git tốt nhất và đặc biệt là gói miễn phí để bạn có thêm. nhiều lựa chọn.

3.7 / 5 – (3 phiếu bầu)

Tiếp tục đọc trong bộ truyện