Cách sử dụng branch trong Git

Trong bài này chúng ta sẽ đi vào ví dụ cụ thể cách sử dụng branch trong Git. Các bạn sẽ học được cách tạo branch, chuyển sang branch khác, merge branch (gộp branch), xóa branch sau khi sử dụng xong, xử lý conflict khi merge giữa các branch.

0/ Chuẩn bị repository
– Đầu tiên chúng ta sẽ khởi tạo 1 repository như sau (trong thư mục laptrinhinfo)

– Tiếp theo chúng ta tạo 1 file test.txt với nội dung như bên dưới

– Kế đến hãy commit những lịch sử thay đổi của file txt bên trên

1/ Tạo branch mới

– Chúng ta tạo 1 branch tên là “feature” bằng dòng lệnh sau

– Sau khi tạo xong chúng ta sẽ kiểm tra lại bằng cách hiển thị ra toàn bộ branch đang có trong repository

– Danh sách các branch đang có sẽ hiện ra, hiện tại bạn đang ở branch master nên sẽ có dấu * phía trước tên branch master

2/ Chuyển branch

– Bây giờ chúng ta sẽ chuyển qua branch feature bằng lệnh sau

*** Chúng ta có thể gộp 2 bước tạo branch mới và chuyển ngay sang branch mới bằng cách sau

– Lúc này các bạn thử thêm nội dung vào file test.txt, ví dụ

– Sau đó hãy commit lên, lúc này những commit của bạn sau khi chuyển sang branch feature chỉ được ghi nhận trong lịch sử của branch feature, branch master hoàn toàn không lưu lại những thay đổi này

3/ Merge branch (gộp branch)

– Bây giờ mục tiêu của chúng ta là merge branch feature vào branch master. Để merge branch, chúng ta cần chuyển sang branch cần merge vào, đó là branch master

– Kế đến ta sẽ merge branch feature vào branch master bằng lệnh sau

– Nếu merge thành công không bị lỗi hay conflict, kết quả sẽ hiện lên màn hình như bên trên. Bây giờ bạn hãy kiểm tra nội dung file test.txt ở branch master, những gì bạn đã chỉnh sửa ở branch feature đã được cập nhật.

4/ Xóa branch

– Sau khi tạo branch mới và làm việc trên branch đó, sau khi đã merge branch đã tạo vào 1 branch khác, nếu bạn không cần sử dụng branch đó nữa thì có thể xóa nó bằng lệnh sau (trong ví dụ này tôi sẽ xóa branch feature)

– Bạn có thể kiểm tra xem branch đã được xóa thành công chưa bằng lệnh hiển thị toàn bộ branch: git branch

5/ Làm việc song song trên nhiều branch và xử lý conflict khi merge branch

– Bây giờ chúng ta sẽ giả định tình huống 2 người trong cùng 1 team làm việc trên 2 branch khác nhau. Ví dụ user A làm việc trên branch feature1, user B làm việc trên branch feature2. Lúc này 2 user sẽ sửa cùng chung 1 file trên 2 branch khác nhau và conflict sẽ xảy ra khi merge 2 branch này vào branch master. Đầu tiên chúng ta sẽ tạo 2 branch feature1 và feature2 sau đó sẽ chuyển qua branch feature1 (đóng vai trò là user A)

– User A lúc này sửa nội dung file test.txt như sau

– Ở đây ta đã thấy user A thêm mới vào nội dung ở dòng 3 đoạn text “User A da them vao 1 dong nay” và chỉnh sửa nội dung ở dòng 1 từ “su dung Git branch” sang “[su dung Git branch]” . Bây giờ chúng ta sẽ lưu thay đổi ở branch feature1 bằng lệnh commit

– Tiếp theo chúng ta chuyển qua branch feature2 (đóng vai trò là user B).

– Lúc này user B sẽ thêm 1 đoạn text mới ở dòng 3 và chỉnh sửa dòng 1, thao tác có vẻ tương tự user A nhưng nội dung thêm mới và chỉnh sửa hoàn toàn khác nhau

– Và user B cũng commit để lưu lại thay đổi của mình ở branch feature2

– Vậy là chúng ta đã thấy user A và user B đã làm việc song song trên 2 branch khác nhau và đã lưu lại những gì họ đã làm tại 2 branch trên. Bây giờ tôi sẽ đóng vai trò 1 user khác (user C) quản lý branch master và hoàn toàn không biết những gì user A và user B đã thay đổi trên branch của họ. Nhiệm vụ của tôi là merge 2 branch trên vào branch master để đồng bộ code lại. Đầu tiên tôi sẽ chuyển sang branch master và merge branch feature1 vào

– Mọi thứ có vẻ ổn không có vấn đề gì sau khi merge branch feature1 vào master, file test.txt đã hiển thị đúng những gì user A đã làm. Bây giờ chúng ta hãy merge branch feature2 vào master

– Lần này thì mọi việc có vẻ không ổn như khi merge lần đầu. Đã có lỗi conflict xảy ra. Bây giờ chúng ta sẽ kiểm tra nội dung file test.txt để xem nó đã bị conflict như thế nào

– Lúc này ta thấy từ đoạn <<<<<<< HEAD cho đến ======= là nội dung file test.txt ở branch master sau khi đã merge branch feature1 vào. Còn đoạn ======= cho đến >>>>>>> feature2 là nội dung file test.txt của user B đã sửa ở feature2 do bị conflict với đoạn trên nên không thể merge vào. Bây giờ tôi (user C) sẽ sửa nội dung file test.txt bằng cách hợp nhất kết quả của user A và user B đã làm

(Lưu ý: cách sửa conflict trên chỉ là ví dụ, trong trường hợp thực tế có thể user A và user B sẽ họp chung lại với nhau để thống nhất kết quả theo 1 cách khác. Cách sửa conflict của tôi ở đây là giữ lại toàn bộ những gì user A và user B đã thêm vào và đã sửa)

– Và khi đã sửa xong conflict, đừng quên commit ở branch master

– Vậy là conflict đã được xử lý xong xuôi. Đương nhiên trên thực tế khi làm việc, conflict thường phức tạp hơn vậy nhiều và có thể xảy ra trên rất nhiều file. Và dĩ nhiên sẽ tốn thời gian ngồi so sánh 2 kết quả để để sửa lại file theo cách tối ưu nhất.

 

Tổng quan về branch trong Git

Branch là gì?

Nói đơn giản dễ hiểu branch là phân nhánh, là nhiều version của 1 repository. Hay nói dễ hiểu hơn trong lĩnh vực lập trình là nhiều version khác nhau của 1 phần mềm (web, phone app, game …). Bạn có bao giờ thắc mắc khi sử dụng phần mềm của các hãng lớn khi họ có rất nhiều phiên bản như alpha, beta, … rồi mới đến bản final? Một phần mềm khi phát triển bao gồm rất nhiều công đoạn và nhiều thành viên tham gia vào lập trình. Có thể kể ra như: phát triển frontend, phát triển backend, sửa lỗi … , rồi trong mỗi công đoạn to lại có những công đoạn nhỏ hơn như phát triển tính năng A, phát triển tính năng B, …..

Tại sao branch lại rất quan trọng trong Git?

Thông thường trong Git, branch master là branch để release sản phẩm chạy hoàn hảo nhất, không lỗi, là sản phẩm gọi là chạy ổn định của phần mềm đó. Vậy nên chức năng branch giúp chúng ta chia nhánh ra để giúp đội ngũ phát triển có thể phát triển thêm những tính năng mới, fix bug những tính năng đang phát triển và có thể của tính năng cũ … mà không ảnh hưởng đến branch chính đang release sản phẩm.

Sơ đồ dưới đây sẽ giúp bạn hiểu rõ hơn tại sao lại phải tạo branch (phân nhánh) trong Git

Sau khi đã phát triển xong những tính năng mới, và fix bugs. Việc kế đến là làm sao để những thay đổi đó có hiệu lực trên phiên bản phần mềm đang release (nhánh master). Lúc này chúng ta sử dụng đến tính năng merge branch của Git, gọi là gộp nhánh (theo nghĩa tiếng Việt). Sau khi merge branch, tất cả những thay đổi của các branch sẽ được gộp chung vào branch master để chúng ta có thể release phiên bản mới của phần mềm.

Các branch được tạo ra có thể phát triển 1 cách song song, nghĩa là chúng ta có thể giao cho nhiều người làm việc trên nhiều branch. Cách chia branch này vô cùng hiệu quả để có thể quản lý được công việc, quản lý được task, mà không gây ảnh hưởng giữa các thành viên trong team.

Để dễ hiểu hơn quy trình chia branch và merge branch, bạn có thể tham khảo sơ đồ dưới đây

Cài đặt Git

1/ Cài đặt Git trên Windows

– Đầu tiên bạn cần tải về file cài đặt Git cho Windows tại https://gitforwindows.org/

– Nhấp đúp vào file exe cài đặt và làm theo hướng dẫn để quá trình cài đặt được hoàn tất



– Mở command line của Windows (cmd) hoặc GitBash (Git sẽ tự động cài đặt GitBash) và chạy đoạn lệnh sau để thiết lập ban đầu cho Git (bao gồm username và email)

*** Đối với ai đang sử TortoiseGit trên Windows thì có thể thiết lập username và email nhanh chóng thông qua giao diện GUI rất trực quan của TortoiseGit. Click phải chuột và chọn TortoiseGit > Settings



– Chọn mục Git bên tay trái, sau đó điền vào Name & Email, sau đó bấm OK để hoàn thành thiết lập ban đầu cho Git



2/ Cài đặt Git trên Linux


Đối với Linux phiên bản Debian/Ubuntu (apt-get)

Chạy dòng lệnh dưới đây

Sau khi hoàn tất cài đặt bạn có thể kiểm tra mình đã cài đặt thành công Git chưa bằng cách

Nếu kết quả trả về là tên version của Git nghĩa là bạn đã cài đặt thành công. Bước tiếp theo là bạn cấu hình username và email cho Git (tương tự như trên Windows)

Đối với Linux phiên bản Fedora/CentOS (dnf/yum)

Bạn chạy dòng lệnh sau

Hoặc

Sau đó bạn kiểm tra cài đặt hoàn tất chưa tương tự như trên Linux phiên bản Ubuntu, và kế đó thiết lập username và email tương tự như trên (xem lại phần cài đặt trên Windows hoặc Linux phiên bản Ubuntu)


 

Cách push code lên nhiều repository cùng 1 lúc

– Nếu bạn đang muốn nhân bản source code trên máy của mình có thể push code lên nhiều git repository cùng 1 lúc thì đây là giải pháp cho bạn. Lưu ý rằng bạn chỉ được push lên nhiều repository còn khi pull thì đương nhiên chỉ có thể pull từ 1 git repository chính mà thôi.

– Bạn mở file config của git trong thư mục ẩn .git/config, đây là ví dụ trên máy của tôi, phần [remote = “origin”]

– Thêm vào bên dưới 2 dòng pushurl đến git chính và git phụ của bạn như sau

– Trong đó dòng trên là git chính của bạn, giá trị sẽ giống với phần url = , còn dòng dưới là git phụ khi bạn push code lên sẽ push luôn vào git phụ đó, bạn có thể thêm nhiều git phụ tùy thích.

Quản lý branch với TortoiseGit

Tạo 1 branch mới (nhánh mới)

– Việc đầu tiên khi tạo 1 branch mới, chúng ta sẽ tạo nó dưới local (máy của mình). Click phải vào thư mục chứa repository, trong menu chuột phải hiện ra bạn chọn “Create Branch …”

create-local-branch

– Bạn gõ tên branch mới vào mục Branch (trong ví dụ này là branch1) và click OK

name-branch

– Tiếp theo bạn sẽ chuyển từ branch hiện tại sang branch mới (nếu bạn đã chọn Switch to new branch ở bước trên thì không cần). Click phải vào thư mục chứa repository, chọn Switch/Checkout …

switch_checkout_branch

– Trong cửa sổ hiện ra, bạn chọn branch lúc nãy đã tạo và nhấn OK

switch-to-new-branch

– Bạn có thể commit những thay đổi vào branch mới tạo bằng cách click phải, chọn Git Commit -> [tên-branch-mới]

commit-to-new-branch

Push branch (nhánh) trên local lên trên Git server

– Khi chúng ta tạo branch mới và commit vào branch đó thì Git chỉ hiểu đó là local branch (branch được tạo trên máy của bạn), để cập nhật branch mới lên Git server cho người khác pull về máy của họ được, bạn cần push branch đã tạo ở local lên trên Git server.

push-local-branch-to-git-server

– Một cửa sổ hiện ra tương tự hình bên dưới và bạn nhấn OK

choose-local-branch-to-push

– Để chắc chắn branch mới có được tạo trên Git server hay không thì kết quả trả về nếu có dòng “* [new branch] branch1 -> branch1” nghĩa là bạn đã thực hiện thành công việc push 1 local branch lên trên Git server.

push-local-branch-success

– Sau khi bạn đã thực hiện việc push local branch thành công, thì trong các lần push sau, tên branch đã push sẽ xuất hiện trong phần Destination > Remote như hình bên dưới

push-local-branch-2nd

– Và màn hình kết quả sẽ không còn hiển thị [new branch] nữa

push-local-branch-success-2nd

Fetching the remote branch (lấy nhánh trên Git server về local)

– Sau khi bạn tạo branch (nhánh) mới và push nó lên Git server, những người khác muốn fetch nhánh đó về máy của họ, họ có thể làm như sau: click phải và chọn Create Branch …

create-branch-from-remote

– Tại cửa sổ hiện ra bạn điền tên branch vào mục Name, và chọn branch (nhánh) trên Git server mà bạn muốn lấy về (trong ví dụ này là remotes/origin/branch1) và nhấn OK

name-remote-branch

– Bạn có thể đánh dấu check vào Switch to new branch để tự động chuyển sang branch mới sang khi lấy về, hoặc bạn có thể chuyển branch theo hướng dẫn phía trên. Và đây là kết quả mỗi khi bạn commit và push lên nhánh mới sau khi chuyển nhánh.

push-local-branch-3rd

Merge branch (gộp nhánh)

– Khi chúng ta muốn merge những thay đổi của branch (nhánh) hiện tại đang làm việc vào branch master (nhánh chính), chúng ta sử dụng menu Checkout/Switch để chuyển sang lại branch master

switch-to-master-branch

– Tiếp theo chúng ta sẽ sử dụng menu Merge … để gộp nhánh (merge branch)

merge-branch

– Tại cửa sổ hiện ta, chúng ta sẽ chọn nhánh muốn merge vào nhánh master (trong ví dụ này chúng ta sẽ chọn nhánh branch1 để merge vào master)

merge-branch1-to-master

– Sau khi việc merge branch ở local đã được hoàn tất, đừng quên mọi thay đổi mới chỉ ở local, chúng ta cần push tất cả những thay đổi sau khi merge nhánh lên Git server. Ở đây chúng ta sẽ push nhánh master sau khi được merge thêm từ branch1 lên nhánh master ở trên Git server.

push-local-master-to-remote-master

Xóa nhánh ở local (Deleting the local branch)

– Sau khi đã merge 1 nhánh vào nhánh master, nếu không còn sử dụng nhánh đó bạn có thể xóa nhánh đó ở local bằng cách sau: menu chuột phải và chọn Checkout/Switch

checkout-switch-to-delete-local-branch

– Tiếp theo chọn […] để hiện ra toàn bộ nhánh ở local như hình bên dưới, chọn mục Refs > heads và xóa nhánh bằng cách chọn Delete Branch

delete-local-branch

Xóa nhánh trên Git server (Delete the remote branch)

– Để xóa nhánh không còn xài đến trên Git server, bạn làm tương tự như cách xóa nhánh local, nhưng ở mục Refs sẽ chọn remote

delete-remote-branch