git: chuyển nhánh mà không cần tách đầu


101

Tôi có một kho lưu trữ trên github với một nhánh chính (chính) và một nhánh cho một số công việc thử nghiệm. Tôi đã thực hiện một số cam kết và đẩy sang nhánh thử nghiệm và mọi thứ đều ổn.

Bây giờ, trên một máy khác nhau, tôi cố gắng để bản sao của tôi kho (git clone kho ) và sau đó chuyển sang chi nhánh thực nghiệm (git checkout BRANCHNAME ) nhưng mỗi khi tôi làm đầu tôi này được tách ra và tôi không thể đẩy thay đổi của tôi. Tôi đang làm gì sai? Tôi có cảm giác mình đang bỏ lỡ một khái niệm git cơ bản ở đâu đó nhưng việc đọc các trang git man ngẫu nhiên không mang lại cho tôi bất kỳ manh mối nào.

Tôi mới sử dụng git nên tôi xin lỗi nếu tôi là một tên ngốc nhưng tôi không thể tìm thấy bất cứ điều gì trong tài liệu sẽ giúp tôi gắn lại đầu của mình.

BIÊN TẬP

Khái niệm về một nhánh theo dõi là những gì tôi đã thiếu. Bây giờ tôi tìm hiểu khái niệm đó, mọi thứ đã rõ ràng. Cá nhân tôi thấy git branch --trackcú pháp trực quan hơn nhiều git checkout -b branch-name origin/branch-name.

Cảm ơn đã giúp đỡ!


Để chuyển nhánh mà không cần tách đầu, với Git 2.23 (tháng 8 năm 2019), hãy sử dụng git switch: xem câu trả lời của tôi bên dưới .
VonC

Câu trả lời:


114
# first time: make origin/branchname locally available as localname
git checkout -b localname origin/branchname 

# othertimes 
git checkout localname 

git push origin

Để thuận tiện, bạn có thể sử dụng cùng một chuỗi cho localname & tên nhánh
Khi bạn kiểm tra, origin/branchnamebạn không thực sự kiểm tra một chi nhánh. origin/branchnamelà một tên "từ xa" và bạn có thể nhận được danh sách chúng với

branch -a 

Nếu bạn đã bật màu, các nhánh cục bộ sẽ có một màu và từ xa là một màu khác.

Trước tiên, bạn phải tạo một chi nhánh từ xa được theo dõi cục bộ để có thể chuyển sang và làm việc trên nó.


9
Trời ơi, tại sao "git checkout origin / branchname" không bắt đầu theo dõi chi nhánh tự động nếu nó chưa được theo dõi?
Martin Konicek

4
vì bạn vẫn cần tên địa phương cho chi nhánh nước ngoài.
Kent Fredric

Đây là những gì tôi đang làm và thông báo lỗi: $ git checkout -b topic / fetch ngược dòng / topic / fetch Fat: git checkout: cập nhật đường dẫn không tương thích với việc chuyển đổi các nhánh. Bạn có định kiểm tra 'ngược dòng / chủ đề / tìm nạp' mà không thể được giải quyết như cam kết không?
ulu

2
Cảm ơn vì mẹo về màu sắc. Để kích hoạt màu sắc:git config --global --add color.ui true
PonyEars 25/09/13

1
Điều đáng chú ý là "origin / branchname" theo nghĩa đen có thể là bất cứ thứ gì phân giải thành SHA1, hoặc SHA1 tự thân =). Tôi thường xuyên sử dụng điều đó để tạo ra các nhánh tùy ý với bộ rễ tùy ý.
Kent Fredric

16
git clone git@github.com:abc/def.git
cd def

Bây giờ hãy tạo một nhánh theo dõi:

git branch --track experimental origin/experimental
git checkout experimental

Sau đó, sau khi làm việc ở đó, chỉ cần đẩy lên github bằng cách

git push

3
git branch -t origin / Experiment # không cần phải nhập quá nhiều :)
Dustin

Nhánh tôi muốn theo dõi được gọi là chủ đề / tìm nạp. Khi tôi đang cố gắng thực hiện $ git branch --track topic / tìm nạp ngược dòng / chủ đề / tìm nạp, nó nói rằng: Tên đối tượng không hợp lệ: 'ngược dòng / chủ đề / tìm nạp'.
ulu

1
@Dustin, lệnh đó tạo một nhánh cục bộ 'origin / testing' để theo dõi cục bộ chính. Tôi đoán đó là một lỗi khá phổ biến.
PDug

1
@PDug% git checkout -t origin / testing Nhánh thử nghiệm được thiết lập để theo dõi thử nghiệm nhánh từ xa từ nguồn gốc bằng cách khôi phục. Chuyển sang chi nhánh mới 'thử nghiệm'
Dustin

11

Để mở rộng câu trả lời của Kent, sau khi bạn nhân bản, nhánh duy nhất bạn sẽ có (không tính số điều khiển từ xa) là nhánh đang hoạt động trong kho lưu trữ mà bạn đã nhân bản - chính trong trường hợp của bạn.

Vì vậy, trước tiên bạn sẽ muốn tạo một nhánh mới để theo dõi nhánh thử nghiệm từ xa:

$ git branch experimental origin/experimental

và sau đó kiểm tra nó ra:

$ git checkout experimental

Tuy nhiên, Kent đúng - hai lệnh này có thể kết hợp với nhau

$ git checkout -b experimental origin/experimental

3

Với Git 2.23 (tháng 8 năm 2019), bạn sẽ sử dụng git switchlệnh

Nếu bạn có một chi nhánh từ xa cùng tên, nó sẽ được tự động theo dõi:

$ git switch new-topic
Branch 'new-topic' set up to track remote branch 'new-topic' from 'origin'
Switched to a new branch 'new-topic'
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.