Git - Quản lý chi nhánh

Hoạt động nhánh cho phép tạo ra một dòng phát triển khác. Chúng ta có thể sử dụng thao tác này để tách quá trình phát triển thành hai hướng khác nhau. Ví dụ: chúng tôi đã phát hành một sản phẩm cho phiên bản 6.0 và chúng tôi có thể muốn tạo một nhánh để việc phát triển các tính năng của 7.0 có thể tách biệt với các bản sửa lỗi 6.0.

Tạo chi nhánh

Tom tạo một nhánh mới bằng lệnh git branch <tên nhánh>. Chúng ta có thể tạo một nhánh mới từ nhánh hiện có. Chúng ta có thể sử dụng một cam kết hoặc thẻ cụ thể làm điểm bắt đầu. Nếu bất kỳ ID cam kết cụ thể nào không được cung cấp, thì chi nhánh sẽ được tạo với HEAD làm điểm bắt đầu.

[jerry@CentOS src]$ git branch new_branch

[jerry@CentOS src]$ git branch
* master
new_branch

Một nhánh mới được tạo; Tom đã sử dụng lệnh git branch để liệt kê các nhánh có sẵn. Git hiển thị một dấu hoa thị trước khi chi nhánh hiện đã thanh toán.

Hình ảnh đại diện của hoạt động tạo nhánh được hiển thị bên dưới:

Chuyển đổi giữa các chi nhánh

Jerry sử dụng lệnh git checkout để chuyển đổi giữa các nhánh.

[jerry@CentOS src]$ git checkout new_branch
Switched to branch 'new_branch'
[jerry@CentOS src]$ git branch
master
* new_branch

Lối tắt để tạo và chuyển nhánh

Trong ví dụ trên, chúng ta đã sử dụng hai lệnh để tạo và chuyển các nhánh tương ứng. Git cung cấp–btùy chọn với lệnh thanh toán; hoạt động này tạo ra một nhánh mới và ngay lập tức chuyển sang nhánh mới.

[jerry@CentOS src]$ git checkout -b test_branch
Switched to a new branch 'test_branch'

[jerry@CentOS src]$ git branch
master
new_branch
* test_branch

Xóa chi nhánh

Một nhánh có thể bị xóa bằng cách cung cấp tùy chọn –D với lệnh git branch. Nhưng trước khi xóa nhánh hiện có, hãy chuyển sang nhánh khác.

Jerry hiện đang ở test_branchvà anh ta muốn loại bỏ nhánh đó. Vì vậy, anh ta chuyển nhánh và xóa nhánh như hình dưới đây.

[jerry@CentOS src]$ git branch
master
new_branch
* test_branch

[jerry@CentOS src]$ git checkout master
Switched to branch 'master'

[jerry@CentOS src]$ git branch -D test_branch
Deleted branch test_branch (was 5776472).

Bây giờ, Git sẽ chỉ hiển thị hai nhánh.

[jerry@CentOS src]$ git branch
* master
new_branch

Đổi tên chi nhánh

Jerry quyết định thêm hỗ trợ cho các ký tự rộng trong dự án hoạt động chuỗi của mình. Anh ấy đã tạo một nhánh mới, nhưng tên nhánh không phù hợp. Vì vậy, anh ta thay đổi tên chi nhánh bằng cách sử dụng–m theo sau là tùy chọn old branch namenew branch name.

[jerry@CentOS src]$ git branch
* master
new_branch

[jerry@CentOS src]$ git branch -m new_branch wchar_support

Bây giờ, lệnh git branch sẽ hiển thị tên chi nhánh mới.

[jerry@CentOS src]$ git branch
* master
wchar_support

Hợp nhất hai nhánh

Jerry thực hiện một hàm để trả về độ dài chuỗi của chuỗi ký tự rộng. Mã mới sẽ xuất hiện như sau:

[jerry@CentOS src]$ git branch
master
* wchar_support

[jerry@CentOS src]$ pwd
/home/jerry/jerry_repo/project/src

[jerry@CentOS src]$ git diff

Lệnh trên tạo ra kết quả sau:

t a/src/string_operations.c b/src/string_operations.c
index 8ab7f42..8fb4b00 100644
--- a/src/string_operations.c
+++ b/src/string_operations.c
@@ -1,4 +1,14 @@
#include <stdio.h>
+#include <wchar.h>
+
+size_t w_strlen(const wchar_t *s)
+
{
   +
   const wchar_t *p = s;
   +
   +
   while (*p)
   + ++p;
   + return (p - s);
   +
}

Sau khi thử nghiệm, anh ấy cam kết và đẩy những thay đổi của mình sang nhánh mới.

[jerry@CentOS src]$ git status -s
M string_operations.c
?? string_operations

[jerry@CentOS src]$ git add string_operations.c

[jerry@CentOS src]$ git commit -m 'Added w_strlen function to return string lenght of wchar_t
string'

[wchar_support 64192f9] Added w_strlen function to return string lenght of wchar_t string
1 files changed, 10 insertions(+), 0 deletions(-)

Lưu ý rằng Jerry đang đẩy những thay đổi này sang chi nhánh mới, đó là lý do tại sao anh ta sử dụng tên chi nhánh wchar_support thay vì master chi nhánh.

[jerry@CentOS src]$ git push origin wchar_support   <−−− Observer branch_name

Lệnh trên sẽ cho kết quả như sau.

Counting objects: 7, done.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 507 bytes, done.
Total 4 (delta 1), reused 0 (delta 0)
To [email protected]:project.git
* [new branch]
wchar_support -> wchar_support

Sau khi thực hiện các thay đổi, nhánh mới sẽ xuất hiện như sau:

Tom tò mò về những gì Jerry đang làm trong chi nhánh riêng của mình và anh ấy kiểm tra nhật ký từ wchar_support chi nhánh.

[tom@CentOS src]$ pwd
/home/tom/top_repo/project/src

[tom@CentOS src]$ git log origin/wchar_support -2

Lệnh trên sẽ cho kết quả như sau.

commit 64192f91d7cc2bcdf3bf946dd33ece63b74184a3
Author: Jerry Mouse <[email protected]>
Date: Wed Sep 11 16:10:06 2013 +0530

Added w_strlen function to return string lenght of wchar_t string


commit 577647211ed44fe2ae479427a0668a4f12ed71a1
Author: Tom Cat <[email protected]>
Date: Wed Sep 11 10:21:20 2013 +0530

Removed executable binary

Bằng cách xem các thông báo cam kết, Tom nhận ra rằng Jerry đã triển khai hàm strlen cho nhân vật rộng và anh ta muốn có cùng chức năng trong nhánh chính. Thay vì thực hiện lại, anh ta quyết định lấy mã của Jerry bằng cách hợp nhất chi nhánh của mình với chi nhánh chủ.

[tom@CentOS project]$ git branch
* master

[tom@CentOS project]$ pwd
/home/tom/top_repo/project

[tom@CentOS project]$ git merge origin/wchar_support
Updating 5776472..64192f9
Fast-forward
src/string_operations.c | 10 ++++++++++
1 files changed, 10 insertions(+), 0 deletions(-)

Sau thao tác hợp nhất, nhánh chính sẽ xuất hiện như sau:

Bây giờ, chi nhánh wchar_supportđã được hợp nhất với nhánh chính. Chúng tôi có thể xác minh nó bằng cách xem thông báo cam kết hoặc bằng cách xem các sửa đổi được thực hiện trong tệp string_operation.c.

[tom@CentOS project]$ cd src/

[tom@CentOS src]$ git log -1

commit 64192f91d7cc2bcdf3bf946dd33ece63b74184a3
Author: Jerry Mouse 
Date: Wed Sep 11 16:10:06 2013 +0530

Added w_strlen function to return string lenght of wchar_t string

[tom@CentOS src]$ head -12 string_operations.c

Lệnh trên sẽ cho kết quả như sau.

#include <stdio.h>
#include <wchar.h>
size_t w_strlen(const wchar_t *s)
{
   const wchar_t *p = s;

   while (*p)
      ++p;

   return (p - s);
}

Sau khi thử nghiệm, anh ta đẩy các thay đổi mã của mình sang nhánh chính.

[tom@CentOS src]$ git push origin master
Total 0 (delta 0), reused 0 (delta 0)
To [email protected]:project.git
5776472..64192f9 master −> master

Rebase Chi nhánh

Lệnh Git rebase là một lệnh hợp nhất nhánh, nhưng sự khác biệt là nó sửa đổi thứ tự của các cam kết.

Lệnh Git merge cố gắng đặt các cam kết từ các nhánh khác lên trên HEAD của nhánh cục bộ hiện tại. Ví dụ: nhánh cục bộ của bạn có cam kết A−> B−> C−> D và nhánh hợp nhất có cam kết A−> B−> X−> Y, thì git merge sẽ chuyển đổi nhánh cục bộ hiện tại thành một cái gì đó giống như A−> B−> C−> D−> X−> Y

Lệnh Git rebase cố gắng tìm ra tổ tiên chung giữa nhánh cục bộ hiện tại và nhánh hợp nhất. Sau đó, nó đẩy các cam kết đến chi nhánh cục bộ bằng cách sửa đổi thứ tự các cam kết trong chi nhánh cục bộ hiện tại. Ví dụ: nếu nhánh cục bộ của bạn có commit A−> B−> C−> D và nhánh hợp nhất có commit A−> B−> X−> Y, thì Git rebase sẽ chuyển đổi nhánh cục bộ hiện tại thành một cái gì đó giống như A− > B−> X−> Y−> C−> D.

Khi nhiều nhà phát triển làm việc trên một kho lưu trữ từ xa, bạn không thể sửa đổi thứ tự của các cam kết trong kho lưu trữ từ xa. Trong trường hợp này, bạn có thể sử dụng thao tác rebase để đặt các cam kết cục bộ của mình lên trên các cam kết của kho lưu trữ từ xa và bạn có thể đẩy các thay đổi này.