Đâ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/master
và nhánh cục bộ new-feature
khô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 pull
và git 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 pull
sử 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 remote
Lệ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 fetch
hoặc git pull
cho đ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ì --track
cờ 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-kitty
vàgit 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.