Git kéo một nhánh nhất định từ GitHub


631

Tôi có một dự án với nhiều chi nhánh. Tôi đã đẩy họ đến GitHub và bây giờ có ai đó đang thực hiện dự án tôi cần rút chi nhánh của họ khỏi GitHub. Nó hoạt động tốt trong chủ. Nhưng nói rằng ai đó đã tạo ra một chi nhánh xyz. Làm cách nào tôi có thể kéo chi nhánh xyztừ GitHub và hợp nhất nó thành chi nhánh xyztrên mình localhost?

Tôi thực sự có câu trả lời của mình ở đây: Đẩy và kéo các nhánh trong Git

Nhưng tôi gặp lỗi "! [Bị từ chối]" và một cái gì đó về "không chuyển tiếp nhanh".

Bất kỳ đề xuất?


3
Lệnh thực tế bạn đang chạy là gì?
Alex N.

1
Đó là tìm nạp có thể thất bại với thông báo 'không chuyển tiếp nhanh'. Bạn đã sửa đổi nhánh theo dõi từ xa (origin / xyz), hay là nhánh được viết lại / viết lại trong kho lưu trữ từ xa? Youmight cần sử dụng " git fetch origin --force", nhưng vui lòng đọc tài liệu trước khi thực hiện.
Jakub Narębski

Câu trả lời:


758

Nhưng tôi gặp lỗi "! [Bị từ chối]" và một vài điều về "không nhanh chóng chuyển tiếp"

Đó là bởi vì Git không thể hợp nhất các thay đổi từ các nhánh thành chủ hiện tại của bạn. Giả sử bạn đã kiểm tra chi nhánh mastervà bạn muốn hợp nhất trong chi nhánh từ xa other-branch. Khi bạn làm điều này:

$ git pull origin other-branch

Git về cơ bản đang làm điều này:

$ git fetch origin other-branch && git merge other-branch

Đó là, a pullchỉ là một fetchtheo sau bởi a merge. Tuy nhiên, khi pull-ing, Git sẽ chỉ hợp nhất other-branch nếu nó có thể thực hiện hợp nhất chuyển tiếp nhanh . Một nhanh về phía trước hợp nhất là một kết hợp trong đó người đứng đầu chi nhánh bạn đang cố gắng để kết hợp vào là một hậu duệ trực tiếp của người đứng đầu chi nhánh bạn muốn kết hợp. Ví dụ: nếu bạn có cây lịch sử này, thì việc hợp nhất other-branchsẽ dẫn đến hợp nhất chuyển tiếp nhanh:

O-O-O-O-O-O
^         ^
master    other-branch

Tuy nhiên, đây không phải là một sự hợp nhất nhanh chóng:

    v master
O-O-O
\
 \-O-O-O-O
         ^ other-branch

Để giải quyết vấn đề của bạn, trước tiên hãy tìm nạp chi nhánh từ xa:

$ git fetch origin other-branch

Sau đó, hợp nhất nó vào chi nhánh hiện tại của bạn (tôi sẽ cho rằng đó master) và khắc phục mọi xung đột hợp nhất:

$ git merge origin/other-branch
# Fix merge conflicts, if they occur
# Add merge conflict fixes
$ git commit    # And commit the merge!

Không, vấn đề là với tìm nạp, không phải với bước hợp nhất.
Jakub Narębski

3
Thông thường, điều khiển từ xa được thiết lập sao cho việc tìm nạp bị ép buộc, ngay cả khi chúng không dẫn đến một cam kết chuyển tiếp nhanh, do đó, điều đó không xảy ra khi tìm nạp trừ khi OP thay đổi điều gì đó với cấu hình thông thường. Vấn đề chuyển tiếp nhanh có thể xảy ra trong quá trình tìm nạp hoặc hợp nhất. Điều gì làm cho bạn nói rằng vấn đề chắc chắn là trong việc tìm nạp, và không hợp nhất?
mipadi

Tôi làm theo các bước này (tìm nạp, hợp nhất). Git nói với tôi không có gì để làm. Khi tôi cố gắng cam kết, nó rơi xuống rên rỉ về phía trước nhanh.
Jean Jordaan

1
@mipadi Tôi gặp vấn đề tương tự như Jean và, trong khi tôi không thể nói điều khiển từ xa được thiết lập theo cách không mặc định mà bạn đã đề cập, tôi có thể nói sử dụng git fetch -fđã khắc phục vấn đề của mình! Cảm ơn!
cregox

1
Điều này hợp nhất chi nhánh từ xa xzyvào chi nhánh địa phương master, đó không phải là những gì được ngụ ý bởi câu hỏi ban đầu; "Làm cách nào tôi có thể kéo nhánh xyz từ GitHub và hợp nhất nó vào nhánh xyz trên localhost của tôi?"
dùng5359531

301

Chỉ cần theo dõi chi nhánh từ xa của bạn một cách rõ ràng và đơn giản git pullsẽ làm những gì bạn muốn:

git branch -f remote_branch_name origin/remote_branch_name
git checkout remote_branch_name

Thứ hai là một hoạt động địa phương.

Hoặc thậm chí phù hợp hơn với tài liệu GitHub về forking :

git branch -f new_local_branch_name upstream/remote_branch_name

39
Nếu bạn nhận được 'Không phải tên đối tượng hợp lệ:' origin / remote_branch_name ', trước tiên hãy' git fetch origin '.
Martin Konicek

130

Bạn có thể kéo một nhánh đến một nhánh bằng các lệnh sau.

git pull {repo} {remotebranchname}:{localbranchname}

git pull origin xyz:xyz

Khi bạn ở trên nhánh chính, trước tiên bạn cũng có thể kiểm tra một nhánh như:

git checkout -b xyz

Điều này tạo ra một nhánh mới, "xyz", từ chủ và trực tiếp kiểm tra nó.

Sau đó, bạn làm:

git pull origin xyz

Điều này kéo chi nhánh mới đến xyzchi nhánh địa phương của bạn .


1
Hoàn hảo! Tôi chỉ không biết cú pháp đó: git pull {repo} {remotebranchname}: {localbranchname}. Câu hỏi, nếu cái kéo đó không hoạt động (có thể ai đó đã cập nhật chi nhánh và sẽ có xung đột hợp nhất) thì lựa chọn của tôi là gì?
Costa

7
Tôi đang hạ thấp điều này bởi vì nó cố gắng hợp nhất chi nhánh từ xa vào chi nhánh hiện tại của bạn (ví dụ: chủ). Đây không phải là điều mà hầu hết mọi người muốn làm, và đó không phải là điều OP yêu cầu. Câu trả lời của @mohit là lựa chọn chính xác.
Phrogz

1
Phrogz - có vẻ như hành vi này đã thay đổi trong các phiên bản gần đây của Git. Tôi đã sử dụng điều này trước đây và nó hoạt động hoàn toàn tốt.
Pawan

88

Cách tốt nhất là:

git checkout -b <new_branch> <remote repo name>/<new_branch>

1
Sau khi tạo một nhánh "dev" mới trên github và thử ở trên, tôi nhận được thông báo lỗi sau: "fatal: origin / dev không phải là một cam kết và một nhánh 'dev' không thể được tạo từ nó" Giải pháp là "git tìm nạp "theo giải pháp của Bradley Flood bên dưới, và sau đó chạy lại câu trả lời của mohit.
TomEberhard

46

git fetch sẽ lấy danh sách mới nhất của các chi nhánh.

Bây giờ bạn có thể git checkout MyNewBranch

Làm xong :)


Để biết thêm thông tin, xem tài liệu: git fetch


37

Tôi không chắc chắn tôi hoàn toàn hiểu vấn đề, nhưng việc kéo một nhánh hiện có được thực hiện như thế này (ít nhất là nó hoạt động với tôi :)

git pull origin BRANCH

Điều này giả định rằng chi nhánh địa phương của bạn được tạo ra từ nguồn gốc / CHI NHÁNH.


15

Điều này giúp tôi có được chi nhánh từ xa trước khi hợp nhất nó vào chi nhánh khác:

git fetch repo xyz:xyz
git checkout xyz

8

Nói một cách đơn giản, Nếu bạn muốn lấy từ GitHub chi nhánh the_branch_I_want:

git fetch origin
git branch -f the_branch_I_want origin/the_branch_I_want
git checkout the_branch_I_want

3
git pull <gitreponame> <branchname>

Thông thường nếu bạn chỉ repo được gán cho mã của mình thì gitreponame sẽ là nguồn gốc.

Nếu bạn đang làm việc trên hai repo như một là cục bộ và một cái khác cho điều khiển từ xa như bạn có thể kiểm tra danh sách của repo từ git remote -v . điều này cho thấy có bao nhiêu repo được gán cho mã hiện tại của bạn.

BranchName nên tồn tại vào gitreponame tương ứng.

bạn có thể sử dụng hai lệnh sau để thêm hoặc xóa repo

git remote add <gitreponame> <repourl>
git remote remove <gitreponame>

2

bạn cũng có thể làm

git pull -r origin master

khắc phục xung đột hợp nhất nếu có

git rebase --continue

-r là dành cho rebase. Điều này sẽ làm cho bạn cấu trúc chi nhánh từ

        v  master       
o-o-o-o-o
     \o-o-o
          ^ other branch

đến

        v  master       
o-o-o-o-o-o-o-o
              ^ other branch

Điều này sẽ dẫn đến một lịch sử sạch hơn. Lưu ý: Trong trường hợp bạn đã đẩy chi nhánh khác của mình về nguồn gốc (hoặc bất kỳ điều khiển từ xa nào khác), bạn có thể phải buộc đẩy chi nhánh của mình sau khi rebase.

git push -f origin other-branch

1

tôi đã làm

git branch -f new_local_branch_name origin/remote_branch_name

Thay vì

git branch -f new_local_branch_name upstream/remote_branch_name

Theo đề xuất của @innaM. Khi tôi sử dụng phiên bản ngược dòng, nó báo 'fatal: Không phải là tên đối tượng hợp lệ:' ngược dòng / remote_branch_name ''. Tôi đã không làm git fetch originnhư một bình luận được đề xuất, mà thay vào đó chỉ đơn giản là thay thế upstreambằng origin. Tôi đoán họ là tương đương.


0

để lấy chi nhánh từ GitHub, bạn có thể sử dụng

git checkout --track origin/the-branch-name

Hãy chắc chắn rằng tên chi nhánh giống hệt nhau.

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.