Câu hỏi Làm thế nào để sao chép một nhánh Git cụ thể? [bản sao]


Câu hỏi này đã có câu trả lời ở đây:

Git clone sẽ cư xử sao chép nhánh làm việc hiện tại từ xa vào local.

Có cách nào để sao chép một nhánh cụ thể một mình mà không cần chuyển nhánh trên kho lưu trữ từ xa không?


2100
2017-12-15 23:06


gốc


@domokun Jorge thêm câu trả lời của anh ấy một năm sau Michael. Vì vậy, nó thường xuyên xảy ra trên SO rằng câu trả lời tốt nhất được thêm vào sau khi một câu trả lời khác đã được chấp nhận. (IOW, ít nhất hãy quét 3-4 câu trả lời hàng đầu cho bất kỳ câu hỏi nào.) - Ryan Ballantyne
@ scud: nếu bạn vẫn còn trên SO, bạn có muốn sửa câu trả lời được chấp nhận để người khác có thể thấy nó dễ dàng hơn không? - mikemaccana
tại sao SO yêu cầu @Scud chỉnh sửa câu trả lời? Sau 5000 phiếu bầu, cộng đồng chung nên có tiếng nói trong những gì được đánh dấu là câu trả lời chính xác. - gdbj
Thay đổi câu trả lời được chấp nhận, vui lòng SO người kiểm duyệt. - user1271772
Bỏ phiếu xuống câu trả lời được chấp nhận. Có lẽ SO cuối cùng sẽ thay đổi nó nếu nó đi tiêu cực. - user1271772


Các câu trả lời:


Xin vui lòng xem thêm câu trả lời khác mà nhiều người thích.

Bạn cũng có thể muốn chắc chắn rằng bạn hiểu sự khác biệt, không giống như phần lớn các bình luận tức giận và downvoters. Và sự khác biệt là: bằng cách gọi git clone -b branch url bạn đang tìm nạp tất cả các các chi nhánh và kiểm tra một. Điều đó có thể, ví dụ, có nghĩa là kho lưu trữ của bạn có tài liệu 5kB hoặc nhánh wiki và nhánh dữ liệu 5GB. Và bất cứ khi nào bạn muốn chỉnh sửa trang chủ của mình, bạn có thể sẽ nhân bản 5GB dữ liệu.

Một lần nữa, đó không phải là để nói git clone -b không phải là cách để thực hiện điều đó, nó chỉ là nó không luôn luôn những gì bạn muốn thực hiện, khi bạn hỏi về nhân bản một nhánh cụ thể.

Câu trả lời tôi sẽ viết hôm nay, với ý nghĩ của ngày hôm nay sẽ là

git clone --single-branch -b branch host:/dir.git

tại thời điểm viết câu trả lời ban đầu dưới đây, git không có --single-branch tùy chọn, nhưng chúng ta hãy giữ nó cho sự hài lòng đầy đủ của những con ong giận dữ.

Câu trả lời rất không thích bởi copypasters là:

git init
git remote add -t refspec remotename host:/dir.git
git fetch

240
2017-12-15 23:09



Cảm ơn. Tôi đã tìm ra bằng cách sử dụng phương pháp dưới đây. git clone <remote_repo> git checkout -b <wanted_branch> origin / <wanted_branch> git branch -D master - Scud
Tôi nghĩ vậy, và bạn sẽ nhận được [remote "origin"] fetch = + refs / heads / (refspec): refs / remotes / origin / (refspec) thay vì fetch = + refs / heads / *: refs / remotes / origin / * - Scud
cái này dễ dàng hơn và phù hợp hơn stackoverflow.com/a/4568323/636762 - Syed Rakib Al Hasan
Guys, hãy chắc chắn để xem câu trả lời thực sự dưới đây. - BrainSlugs83
@ Scud, bạn có thể vui lòng chấp nhận câu trả lời khác, tôi hơi mệt mỏi với tâm trí rực rỡ thu hút, mỗi cố gắng đóng góp ý kiến ​​độc đáo của họ không giống như hàng triệu người trước họ. - Michael Krelin - hacker


git clone -b <branch> <remote_repo>

Thí dụ:

git clone -b my-branch git@github.com:user/myproject.git

Với Git 1.7.10 trở lên, hãy thêm --single-branch để ngăn tìm nạp tất cả các nhánh. Ví dụ, với chi nhánh OpenCV 2.4:

git clone -b opencv-2.4 --single-branch https://github.com/Itseez/opencv.git

6683
2017-12-31 05:36



pierr: Tôi không chắc chắn nếu điều này trả lời mô tả của vấn đề được đưa ra ở trên, nhưng nó làm trả lời câu hỏi thực tế - cách sao chép một nhánh cụ thể của một kho lưu trữ. Tôi đã bình chọn điều này vì đó là câu trả lời tôi đã googling khi tôi đến trang này. - Jaime Bellmyer
Những công việc này. Nó chỉ HEAD mới tại nhánh được chỉ định thay vì ở nhánh HEAD trong dự án của tôi. Tuy nhiên, nó vẫn tìm nạp tất cả các các chi nhánh. Xem câu trả lời của @ edmar-miyake. - cdunn2001
Xem câu trả lời này cho tin tức: stackoverflow.com/a/14930421/755257 - cbeleites
Nó trả lời mô tả của vấn đề nếu bạn thêm một --depth X vào lệnh. Nếu bạn làm như vậy, nó sẽ sao chép chỉ chi nhánh được chỉ định và nội dung cuối cùng của nó. - ramsvidor
thx cho --single-branch; git 2.5 hiện tại vào thời điểm viết bài này. Không quan tâm đến các phiên bản cũ hơn. - Bernhard Döbler


Để sao chép một chi nhánh không có tìm kiếm các nhánh khác:

mkdir $BRANCH
cd $BRANCH
git init
git remote add -t $BRANCH -f origin $REMOTE_REPO
git checkout $BRANCH

222
2017-09-08 14:34



Giải pháp tốt. Trên git cũ hơn (tôi có 1.5.5.6), một nhánh git --track $ BRANCH origin / $ BRANCH có thể cần thiết trước khi thanh toán. - Johannes Thoma
Hoạt động và cũng chỉ tìm nạp các thẻ hiện diện trên nhánh, đó là những gì tôi muốn. (Tôi thực sự muốn tìm nạp nhiều các chi nhánh, nhưng chỉ những ngành được chọn; cho rằng, nó sufficed để liên tục remote add và checkout như ở đây, sau đó git remote rm origin để làm sạch.) - Jesse Glick
Sử dụng câu trả lời của Jorge Eduardo Cardona cho tôi những kho lưu trữ khổng lồ, sử dụng phương pháp này mang lại cho tôi những kho lưu trữ rất sạch sẽ. Cảm ơn. - joshcomley
Giải pháp hoàn hảo để kết hợp nông một thẻ cụ thể của một repo git trong một dự án khác. Đề xuất bỏ qua -f  từ lệnh git remote, sau đó sử dụng git fetch --depth=1 $BRANCH $TAG, sau đó git checkout FETCH_HEAD. Init là vô hại, và thay đổi thẻ sẽ tự động cập nhật mã kiểm tra ra. - taranaki


Đây là một cách thực sự đơn giản để làm điều đó :)

Nhân bản kho lưu trữ

git clone <repository_url>

Liệt kê tất cả các chi nhánh

git branch -a 

Thanh toán chi nhánh bạn muốn

git checkout <name_of_branch>

204
2017-07-14 09:42



Điều này đã chuyển thư mục làm việc đến đúng nhánh, nhưng tôi không thể đẩy bất kỳ thay đổi nào tôi thực hiện, bởi vì tôi không phải là "hiện tại trên một chi nhánh". - Seppo Enarvi
Đây là giải pháp cho tôi, vì tôi đã nhân bản 'chủ nhân'. Tôi không biết tôi có thể đơn giản là 'thanh toán' một nhánh từ xa. - yazzer
Đây có lẽ là cách chính xác để làm điều đó; thực hành tốt nhất-khôn ngoan - aaiezza
git checkout mybranchname sau đó git fetch done - Shohanur Rahaman
Cách này không sao chép chỉ nhánh được chọn. Câu trả lời này có vẻ tốt hơn: stackoverflow.com/a/7349740/3075243. Ví dụ, nếu một repo có nhiều chi nhánh đủ lớn mà chúng tôi không muốn sao chép từng cái. - Proustibat


git checkout -b <branch-name> <origin/branch_name>

ví dụ trong trường hợp của tôi:

 git branch -a
* master
  origin/HEAD
  origin/enum-account-number
  origin/master
  origin/rel_table_play
  origin/sugarfield_customer_number_show_c

Vì vậy, để tạo một chi nhánh mới dựa trên nhánh enum-account-number của tôi, tôi thực hiện:

git checkout -b enum-account-number origin/enum-account-number

Sau khi bạn nhấn trở lại, điều sau sẽ xảy ra:

Branch enum-account-number set up to track remote branch refs/remotes/origin/enum-account-number.
Switched to a new branch "enum-account-number

"


69
2017-11-15 19:34



Lưu ý rằng nó có thể hữu ích cho git pull origin đầu tiên để git branch -a có thể liệt kê tất cả các nhánh mới (hiện tại) từ xa. - André Caron
Điểm tốt. Có lẽ git fetch là tốt hơn để tự động hợp nhất không xảy ra. - dkinzer


Tạo một nhánh trên hệ thống cục bộ với tên đó. ví dụ. nói rằng bạn muốn lấy chi nhánh có tên "branch-05142011"

git branch branch-05142011 origin/branch-05142011 

Nó sẽ cung cấp cho bạn một thông báo như - "Chi nhánh chi nhánh-05142011 thiết lập để theo dõi chi nhánh từ xa-05142011 từ nguồn gốc."

Bây giờ chỉ cần thanh toán chi nhánh như dưới đây và bạn có mã -
git checkout branch-05142011


20
2018-05-15 19:20



Điều này cũng sẽ thực hiện: git fetch origin [remote-branch]: [new-local-branch] - PlanetUnknown
có nó đúng. Miyake (bên dưới) cho biết cách thực hiện khi điều khiển từ xa được thêm vào. - cdunn2001
Điều đó nên nói, "PlanetUnknown có nó đúng." - cdunn2001
@PlanetUnknown Cảm ơn bạn đã git fetch origin [remote-branch]:[new-local-branch], Tôi thích nó! - Jeaf Gilbert


git --branch <branchname> <url>

Nhưng hoàn thành bash không nhận được chìa khóa này: --branch

Thưởng thức.


11
2017-09-07 10:16