Sự khác biệt giữa chi nhánh địa phương, chi nhánh theo dõi địa phương, chi nhánh từ xa và chi nhánh theo dõi từ xa là gì?


158

Tôi mới bắt đầu sử dụng Git và tôi đã thực sự bối rối giữa các chi nhánh khác nhau. Bất cứ ai có thể giúp tôi tìm ra các loại chi nhánh sau đây là gì?

  • chi nhánh địa phương
  • chi nhánh theo dõi địa phương
  • chi nhánh từ xa
  • chi nhánh theo dõi từ xa

sự khác biệt giữa chúng là gì? Và làm thế nào để họ làm việc với nhau?

Một mã demo nhanh sẽ thực sự hữu ích tôi đoán.

Câu trả lời:


123

Một chi nhánh địa phương là một chi nhánh mà chỉ có bạn (người dùng địa phương) có thể nhìn thấy. Nó chỉ tồn tại trên máy cục bộ của bạn.

git branch myNewBranch        # Create local branch named "myNewBranch"

Một nhánh từ xa là một nhánh trên một vị trí từ xa (trong hầu hết các trường hợp origin). Bạn có thể đẩy chi nhánh địa phương mới được tạo ra myNewBranchđể origin. Bây giờ người dùng khác có thể theo dõi nó.

git push -u origin myNewBranch   # Pushes your newly created local branch "myNewBranch"
                                 # to the remote "origin".
                                 # So now a new branch named "myNewBranch" is
                                 # created on the remote machine named "origin"

Một chi nhánh theo dõi từ xa là một bản sao cục bộ của một chi nhánh từ xa. Khi myNewBranchđược đẩy sang originsử dụng lệnh trên, một nhánh theo dõi từ xa có tên origin/myNewBranchđược tạo trên máy của bạn. Chi nhánh theo dõi từ xa này theo dõi các chi nhánh từ xa myNewBranchtrên origin. Bạn có thể cập nhật nhánh theo dõi từ xa của mình để đồng bộ hóa với nhánh từ xa bằng cách sử dụng git fetchhoặc git pull.

git pull origin myNewBranch      # Pulls new commits from branch "myNewBranch" 
                                 # on remote "origin" into remote tracking
                                 # branch on your machine "origin/myNewBranch".
                                 # Here "origin/myNewBranch" is your copy of
                                 # "myNewBranch" on "origin"

Một chi nhánh theo dõi cục bộ là một chi nhánh địa phương được theo dõi chi nhánh khác. Điều này là để bạn có thể đẩy / kéo cam kết đến / từ nhánh khác. Các nhánh theo dõi cục bộ trong hầu hết các trường hợp theo dõi một nhánh theo dõi từ xa. Khi bạn đẩy một chi nhánh địa phương để originsử dụng git push commandvới một -utùy chọn (như hình trên), bạn thiết lập các chi nhánh địa phương myNewBranchđể theo dõi các chi nhánh theo dõi từ xa origin/myNewBranch. Điều này là cần thiết để sử dụng git pushgit pullkhông chỉ định một dòng ngược để đẩy hoặc kéo từ.

git checkout myNewBranch      # Switch to myNewBranch
git pull                      # Updates remote tracking branch "origin/myNewBranch"
                              # to be in sync with the remote branch "myNewBranch"
                              # on "origin".
                              # Pulls these new commits from "origin/myNewBranch"
                              # to local branch "myNewBranch which you just switched to.

Đối với định nghĩa nhánh theo dõi cục bộ, không giống với nhánh cục bộ sau khi đẩy nó ra từ xa?
mskw

2
@mskw Không, một nhánh theo dõi cục bộ và một nhánh cục bộ (không theo dõi) khác nhau về sự liên kết. Một chi nhánh địa phương KHÔNG được liên kết với bất kỳ chi nhánh. Nó chỉ đơn giản là một nhánh tồn tại trên máy cục bộ của bạn trong sự cô lập. Một nhánh theo dõi cục bộ được liên kết với một nhánh theo dõi từ xa. Vì vậy, bạn có thể đẩy / kéo cam kết đến / từ nhau.
SNce

196

Đây là câu trả lời dài.

Điều khiển từ xa:

Nếu bạn đang sử dụng Git một cách hợp tác, có thể bạn sẽ cần phải đồng bộ hóa các cam kết của mình với các máy hoặc vị trí khác. Mỗi máy hoặc vị trí được gọi là một điều khiển từ xa , theo thuật ngữ của Git và mỗi máy có thể có một hoặc nhiều nhánh. Thông thường, bạn sẽ chỉ có một, được đặt tên origin. Để liệt kê tất cả các điều khiển từ xa, hãy chạy git remote:

$ git remote
bitbucket
origin

Bạn có thể xem những vị trí mà các tên từ xa này là lối tắt cho, bằng cách chạy git remote -v:

$ git remote -v
bitbucket git@bitbucket.org:flimm/example.git (fetch)
bitbucket git@bitbucket.org:flimm/example.git (push)
origin git@github.com:Flimm/example.git (fetch)
origin git@github.com:Flimm/example.git (push)

Mỗi điều khiển từ xa có một thư mục dưới git/refs/remotes/đây:

$ ls -F .git/refs/remotes/
bitbucket/ origin/

Chi nhánh trên máy của bạn:

TLDR: trên máy cục bộ của bạn, bạn đã có ba loại nhánh: nhánh không theo dõi cục bộ, nhánh theo dõi cục bộ và nhánh theo dõi từ xa. Trên một máy từ xa, bạn vừa có một loại chi nhánh.

1. Chi nhánh địa phương

Bạn có thể xem danh sách tất cả các chi nhánh địa phương trên máy của mình bằng cách chạy git branch:

$ git branch
master
new-feature

Mỗi chi nhánh địa phương có một tệp theo .git/refs/heads/:

$ ls -F .git/refs/heads/
master new-feature

Có hai loại nhánh cục bộ trên máy của bạn: nhánh không theo dõi cục bộ và theo dõi nhánh nhánh cục bộ.

1.1 Chi nhánh địa phương không theo dõi

Các chi nhánh địa phương không theo dõi không được liên kết với bất kỳ chi nhánh khác. Bạn tạo một cái bằng cách chạy git branch <branchname>.

1.2. Theo dõi các chi nhánh địa phương

Theo dõi các chi nhánh địa phương được liên kết với một chi nhánh khác, thường là một chi nhánh theo dõi từ xa. Bạn tạo một cái bằng cách chạy git branch --track <branchname> [<start-point>].

Bạn có thể xem một trong những chi nhánh địa phương của bạn đang theo dõi các chi nhánh bằng cách sử dụng git branch -vv:

$ git branch -vv
master      b31f87c85 [origin/master] Example commit message
new-feature b760e04ed Another example commit message

Từ đầu ra của lệnh này, bạn có thể thấy rằng nhánh cục bộ masterđang theo dõi nhánh theo dõi từ xa origin/mastervà nhánh cục bộ new-featurekhông theo dõi bất cứ thứ gì.

Một cách khác để xem các chi nhánh đang theo dõi các chi nhánh là bằng cách xem xét .git/config.

Theo dõi các chi nhánh địa phương là hữu ích. Chúng cho phép bạn chạy git pullgit push, mà không chỉ định sử dụng nhánh ngược dòng nào. Nếu chi nhánh không được thiết lập để theo dõi chi nhánh khác, bạn sẽ gặp lỗi như thế này:

$ git checkout new-feature
$ git pull
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details

    git pull <remote> <branch>

If you wish to set tracking information for this branch you can do so with:

    git branch --set-upstream new-feature <remote>/<branch>

2. Chi nhánh theo dõi từ xa (vẫn trên máy của bạn)

Bạn có thể xem danh sách tất cả các nhánh theo dõi từ xa trên máy của mình bằng cách chạy git branch -r:

$ git branch -r
bitbucket/master
origin/master
origin/new-branch

Mỗi nhánh theo dõi từ xa có một tệp trong .git/refs/<remote>/:

$ tree -F .git/refs/remotes/
.git/refs/remotes/
├── bitbucket/
│   └── master
└── origin/
    ├── master
    └── new-branch

Hãy nghĩ về các nhánh theo dõi từ xa của bạn như bộ đệm cục bộ của bạn cho những gì các máy từ xa chứa. Bạn có thể cập nhật các chi nhánh theo dõi từ xa bằng cách sử dụnggit fetch , trong đó git pullsử dụng đằng sau hậu trường.

Mặc dù tất cả dữ liệu cho một nhánh theo dõi từ xa được lưu trữ cục bộ trên máy của bạn (như bộ đệm), nó vẫn không bao giờ được gọi là một nhánh cục bộ. (Ít nhất, tôi sẽ không gọi nó như vậy!) Nó chỉ được gọi là một nhánh theo dõi từ xa.

Chi nhánh trên một máy từ xa:

Bạn có thể xem tất cả các nhánh từ xa (nghĩa là các nhánh trên máy từ xa), bằng cách chạy git remote show <remote>:

$ git remote show origin
* remote origin
  Fetch URL: git@github.com:Flimm/example.git
  Push  URL: git@github.com:Flimm/example.git
  HEAD branch: master
  Remote branches:
    io-socket-ip            new (next fetch will store in remotes/origin)
    master                  tracked
    new-branch              tracked
  Local ref configured for 'git pull':
    master     merges with remote master
    new-branch merges with remote new-branch
  Local ref configured for 'git push':
    master     pushes to master     (up to date)
    new-branch pushes to new-branch (fast-forwardable)

git remoteLệnh này truy vấn máy từ xa qua mạng về các nhánh của nó. Nó không cập nhật các nhánh theo dõi từ xa trên máy cục bộ của bạn, sử dụng git fetchhoặc git pullcho điều đó.

Từ đầu ra, bạn có thể thấy tất cả các nhánh tồn tại trên máy từ xa bằng cách xem dưới tiêu đề "Các nhánh từ xa" (bỏ qua các dòng được đánh dấu là "cũ").

Nếu bạn có thể đăng nhập vào máy từ xa và tìm kho lưu trữ trong hệ thống tệp, bạn có thể xem tất cả các nhánh của nó bên dưới refs/heads/ .

Cheat tờ:

  • Để xóa một chi nhánh địa phương, cho dù theo dõi hay không theo dõi, một cách an toàn:

    git branch -d <branchname>
    
  • Để xóa một chi nhánh địa phương, cho dù theo dõi hay không theo dõi, mạnh mẽ:

    git branch -D <branchname>
    
  • Để xóa một nhánh theo dõi từ xa:

    git branch -rd <remote>/<branchname>
    
  • Để tạo một nhánh không theo dõi cục bộ mới:

    git branch <branchname> [<start-point>]
    
  • Để tạo một nhánh theo dõi cục bộ mới: (Lưu ý rằng nếu <start-point>được chỉ định và là một nhánh theo dõi từ xa như thế origin/foobar, thì --trackcờ sẽ được tự động đưa vào)

    git branch --track <branchname> [<start-point]
    

    Thí dụ:

    git branch --track hello-kitty origin/hello-kitty
    
  • Để xóa một nhánh trên một máy từ xa:

    git push --delete <remote> <branchname>
    
  • Để xóa tất cả các nhánh theo dõi từ xa đã cũ, nghĩa là, nơi các nhánh tương ứng trên máy từ xa không còn tồn tại:

    git remote prune <remote>
    

Bạn có thể nhận thấy rằng trong một số lệnh, bạn sử dụng <remote>/<branch>và các lệnh khác , <remote> <branch>. Ví dụ: git branch origin/hello-kittygit push --delete origin hello-kitty .

Nó có vẻ độc đoán, nhưng có một cách đơn giản để nhớ khi nào nên sử dụng dấu gạch chéo và khi nào nên sử dụng dấu cách. Khi bạn đang sử dụng dấu gạch chéo, bạn đang đề cập đến một nhánh theo dõi từ xa trên máy của chính bạn, trong khi đó khi bạn đang sử dụng một khoảng trắng, bạn thực sự đang xử lý một nhánh trên một máy từ xa qua mạng.


Tôi sẽ sử dụng để tạo chi nhánh và đi đến chi nhánh trong một cmd như: git checkout -b mynewbranch
Zeta

Tôi yêu điểm cuối cùng về sự khác biệt giữa không gian và dấu gạch chéo!
aderchox

12

Chi nhánh địa phương:

Một nhánh trên máy của bạn mà bạn có thể làm việc và thêm các cam kết. Bạn có thể liệt kê các chi nhánh với git branch.

Chi nhánh địa phương (Có theo dõi):

Một nhánh cục bộ thông thường được cấu hình để tương ứng với một nhánh từ xa. Điều này có các trang phục như khả năng git pullgit pushkhông phải chỉ định kho lưu trữ và tên chi nhánh. Theo dõi cũng là nguyên nhân git statusđể thông báo cho bạn khi chi nhánh của bạn ở phía trước hoặc phía sau điều khiển từ xa.

Chi nhánh từ xa:

Đơn giản chỉ là một nhánh trên kho lưu trữ từ xa, điển hình là trên một máy chủ như GitHub, v.v.

Chi nhánh theo dõi từ xa:

Một bản sao địa phương của một chi nhánh từ xa. Chi nhánh này không bao giờ nên được chỉnh sửa. Mục đích của nó là để theo dõi trạng thái hiện tại của một chi nhánh từ xa. Các nhánh theo dõi từ xa có thể được xem cùng git branch -rvà thường trông giống như origin/master(tên repo theo sau là dấu gạch chéo theo sau là tên nhánh). Chạy git fetchsẽ cập nhật các nhánh theo dõi từ xa để phản ánh trạng thái của các nhánh từ xa tương ứng.

git branch -avvlà sở thích cá nhân của tôi để hiển thị tổng quan nhanh về các nhánh trên máy của tôi, nhánh nào ở trên điều khiển từ xa và cam kết mới nhất trong mỗi nhánh. Phần -axác định rằng tất cả các nhánh sẽ được hiển thị (từ xa và cục bộ). Chữ vcuối ở cuối là dài dòng (nó hiển thị thông báo và hàm băm cam kết cuối cùng). Cảm ơn @Flimm đã chỉ ra rằng phần thứ hai vthêm thông tin về chi nhánh địa phương nào đang theo dõi từ xa nào.


1
tôi không hiểu sự khác biệt giữa các nhánh theo dõi cục bộ và theo dõi từ xa - cái trước tương ứng với nguồn gốc và cái sau với máy từ xa. Nhưng đó không phải là những điều tương tự? không phải đó chỉ là repo thường có trên github sao?
akantoword

1
@akantoword Mình cập nhật câu trả lời để thử làm rõ một chút. Về cơ bản, nhánh theo dõi từ xa chỉ đơn giản là một bản sao cục bộ của nhánh từ xa không có ý định làm việc. Một nhánh địa phương có theo dõi là để làm việc.
Eric Mathison
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.