Git: Hợp nhất một chi nhánh từ xa cục bộ


204

Tôi đã kéo tất cả các chi nhánh từ xa thông qua git fetch --all. Tôi có thể thấy chi nhánh tôi muốn hợp nhất thông qua git branch -atừ xa / nguồn gốc / tên chi nhánh . Vấn đề là nó không thể truy cập. Tôi không thể hợp nhất hoặc thanh toán?

Câu trả lời:


320

Bạn có thể tham chiếu các nhánh theo dõi từ xa ~ (được liệt kê với git branch -r) với tên của điều khiển từ xa của chúng.

Bạn cần tìm nạp chi nhánh từ xa:

git fetch origin aRemoteBranch

Nếu bạn muốn hợp nhất một trong những nhánh từ xa đó trên nhánh cục bộ của bạn:

git checkout master
git merge origin/aRemoteBranch

Lưu ý 1: Đối với một repo lớn có lịch sử lâu dài, bạn sẽ muốn thêm --depth=1tùy chọn khi bạn sử dụng git fetch.

Lưu ý 2: Các lệnh này cũng hoạt động với các repos từ xa khác để bạn có thể thiết lập originupstreamnếu bạn đang làm việc trên một ngã ba.


Kịch bản đối diện: Nếu bạn muốn hợp nhất một trong các nhánh cục bộ của mình trên một nhánh từ xa (trái ngược với một nhánh từ xa với một nhánh cục bộ, như được hiển thị ở trên), trước tiên bạn cần tạo một nhánh cục bộ mới trên đầu nhánh từ xa đã nói:

git checkout -b myBranch origin/aBranch
git merge anotherLocalBranch

Ý tưởng ở đây là hợp nhất "một trong những chi nhánh địa phương của bạn" (ở đây anotherLocalBranch) với một chi nhánh từ xa ( origin/aBranch).
Vì thế, bạn tạo "" đầu tiên myBranchđể thể hiện nhánh từ xa đó: đó là git checkout -b myBranch origin/aBranchphần.
sau đó bạn có thể hợp nhất anotherLocalBranchvới nó (đến myBranch).


aLocalBranch? đó có phải là một lỗi đánh máy không? Tôi đoán bạn có nghĩa là để viết "myBranch" một lần nữa?
knocte

1
@knocte Không: "Nếu bạn muốn hợp nhất một trong các chi nhánh địa phương của bạn trên một trong những chi nhánh từ xa đó": Tôi đang hợp nhất " aLocalBranch" với " myBranch", với " myBranch" đại diện cho một chi nhánh từ xa origin/aBranch.
VonC

Xin lỗi đã làm phiền bạn @VonC, trong nhận xét trước đây của bạn, bạn nói aLocalBranchkhông phải là một lỗi đánh máy, nhưng bạn đã chấp thuận bản chỉnh sửa mới nhất (2 năm sau!) Sửa lỗi "lỗi đánh máy có thể xảy ra" này. Tôi muốn kiểm tra với bạn trước khi hoàn tác chỉnh sửa.
Rath

1
@rath Bạn đã đúng: có vẻ như tôi có thể đã xem xét rằng chỉnh sửa một chút vội vàng, giáp với sự bất cẩn. Tôi đã chỉnh sửa câu trả lời để làm rõ trường hợp hợp nhất thứ hai: bạn có thể cho tôi biết nếu điều này rõ ràng hơn bây giờ không?
VonC

91

Bất cứ khi nào tôi thực hiện hợp nhất, tôi vào chi nhánh mà tôi muốn hợp nhất vào (ví dụ " git checkout branch-i-am-working-in") và sau đó thực hiện như sau:

git merge origin/branch-i-want-to-merge-from


2
Tôi đoán bạn phải làm một git fetch origin/branch-i-want-to-merge-fromđầu tiên, phải không?
Hinrich

9
git fetch origin developtiếp theogit merge origin/develop
Olivier

2
@Olivier Bạn nói đúng, đây là cách làm đúng. git merge một mình sẽ không làm điều đó.
Sam

1
cảm ơn bạn vì quy ước đặt tên thông minh đã giúp tôi hiểu
tony2tones

1
@Akira Không phải git add .-> git commit -m <message>-> git push -u origin <branch>?
Đám mây Cho

24

Lấy nhánh từ xa từ gốc.

git fetch origin remote_branch_name

Hợp nhất chi nhánh từ xa với chi nhánh địa phương

git merge origin/remote_branch_name

1
Điều này làm việc cho tôi khi câu trả lời được chấp nhận báo cáo Không phải thứ gì đó chúng ta có thể hợp nhất. Trong trường hợp của tôi, tôi đã hợp nhất từ ​​một ngã ba khác của repo trên GitHub.
SJT

Lệnh đầu tiên có yêu cầu không? Có phải 'git merge origin / remote_branch_name' đọc từ nhánh từ xa chứ không phải cục bộ. Vì vậy, tôi không nên quan tâm, chi nhánh địa phương có được cập nhật hay không?
Michael Freidgeim

20

Có thể bạn muốn theo dõi chi nhánh từ xa với một chi nhánh địa phương:

  1. Tạo một chi nhánh địa phương mới: git branch new-local-branch
  2. Đặt nhánh mới được tạo này để theo dõi nhánh từ xa: git branch --set-upstream-to=origin/remote-branch new-local-branch
  3. Nhập vào chi nhánh này: git checkout new-local-branch
  4. Kéo tất cả nội dung của nhánh từ xa vào nhánh cục bộ: git pull

3

Nếu bạn đã lấy chi nhánh từ xa của mình và làm git branch -a,
bạn sẽ có được một cái gì đó như:

* 8.0
  xxx
  remotes/origin/xxx
  remotes/origin/8.0
  remotes/origin/HEAD -> origin/8.0
  remotes/rep_mirror/8.0

Sau đó, bạn có thể sử dụng rep_mirror/8.0để chỉ định cục bộ chi nhánh từ xa của bạn.

Bí quyết là remotes/rep_mirror/8.0không hoạt động nhưng rep_mirror/8.0không.

Vì vậy, một lệnh như git merge -m "my msg" rep_mirror/8.0làm hợp nhất.

(lưu ý: đây là một nhận xét cho câu trả lời @VonC. Tôi đặt nó làm câu trả lời khác vì các khối mã không phù hợp với định dạng nhận xét)

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.