Cách hợp nhất chủ từ xa với chi nhánh địa phương


237

Tôi có một chi nhánh địa phương của một dự án ("configUpdate") mà tôi đã rẽ nhánh từ dự án của người khác và tôi đã thực hiện một loạt các thay đổi trên đó và muốn hợp nhất các thay đổi mà họ đã thực hiện với chi nhánh địa phương của mình.

Tôi đã thử

git pull --rebase origin configUpdate

nhưng nó đã không nắm bắt được những thay đổi mới nhất - làm thế nào tôi có thể hợp nhất cả hai? (cũng cho điểm thưởng tôi đã làm gì với pull --rebaselệnh?)


Câu trả lời:


354

Từ nhánh tính năng của bạn (ví dụ configUpdate) chạy:

git fetch
git rebase origin/master

Hoặc dạng ngắn hơn:

git pull --rebase

Tại sao điều này hoạt động:

  • git merge branchnamenhận các cam kết mới từ chi nhánh branchnamevà thêm chúng vào chi nhánh hiện tại. Nếu cần thiết, nó sẽ tự động thêm một cam kết "Hợp nhất" trên đầu trang.

  • git rebase branchnamenhận các cam kết mới từ chi nhánh branchnamevà chèn chúng "dưới" các thay đổi của bạn. Chính xác hơn, nó sửa đổi lịch sử của chi nhánh hiện tại sao cho dựa trên mẹo branchname, với bất kỳ thay đổi nào bạn đã thực hiện trên đó.

  • git pullvề cơ bản là giống như git fetch; git merge origin/master.

  • git pull --rebasevề cơ bản là giống như git fetch; git rebase origin/master.

Vậy tại sao bạn muốn sử dụng git pull --rebasehơn là git pull? Đây là một ví dụ đơn giản:

  • Bạn bắt đầu làm việc trên một tính năng mới.

  • Vào thời điểm bạn sẵn sàng đẩy các thay đổi của mình, một số cam kết đã được các nhà phát triển khác thúc đẩy.

  • Nếu bạn git pull(sử dụng hợp nhất), các thay đổi của bạn sẽ bị chôn vùi bởi các xác nhận mới, bên cạnh một cam kết hợp nhất được tạo tự động.

  • Nếu bạn git pull --rebasethay vào đó, git sẽ nhanh chóng chuyển chủ của bạn lên thượng nguồn, sau đó áp dụng các thay đổi của bạn lên trên.


Tôi đã làm điều này trên nhánh chính xác nhưng tôi vẫn có thể thấy sự khác biệt giữa các tệp cục bộ của tôi và nhánh chính từ xa của dự án ban đầu (mặc dù nó nói rằng mọi thứ đã được cập nhật!) Có lẽ tôi đã thiết lập dự án không chính xác? Cách nào để kiểm tra?
Martyn

1
@Martyn: Sự khác biệt nên là những thay đổi cục bộ của bạn. Tạo một nhánh khác của nhánh từ xa và kiểm tra xem cái đó có đúng nội dung tệp không.
ZeissS

4
Tôi biết đây là một câu trả lời cũ, nhưng lưu ý rằng bạn có thể thích thực hiện MERGE thay vì rebase. Bạn không muốn thực hiện một cuộc nổi loạn nếu sau này bạn phải hợp nhất với một repo từ xa đã có một số thay đổi của bạn.
Domino

1
Còn về (giả sử bạn hiện đang ở nhánh configUpdate) ... git pull về cơ bản giống như git fetch; nguồn gốc hợp nhất git / chủ. <- KHÔNG ĐÚNG
Chris

@Chris: Theo nghĩa nào thì nó không đúng? Giả định nguồn gốc / chủ là thượng nguồn? Hoặc git đã được thay đổi?
Joey Adams

80

Tôi phát hiện ra nó là:

$ git fetch upstream
$ git merge upstream/master

6
Vì vậy, nếu bạn chưa tìm ra nó, bạn pull --rebaseđã không làm việc vì originchỉ vào ngã ba của bạn. Nó sẽ làm việc nếu bạn đã làm git pull --rebase upstream/master.
Karl Bielefeldt

3
Thử: git merge nguồn gốc / chủ
Chris

Tôi đã thiếu một tìm nạp, câu trả lời này đã giải quyết nó cho tôi.
Nurettin

38

Chuyển sang chi nhánh địa phương của bạn

> git checkout configUpdate

Hợp nhất chủ từ xa vào chi nhánh của bạn

> git rebase master configUpdate

Trong trường hợp bạn có bất kỳ xung đột nào, hãy sửa chúng và đối với mỗi tệp bị xung đột, hãy thực hiện lệnh

> git add [path_to_file / Xung đột_file] (ví dụ: git thêm ứng dụng / tài sản / javascripts / test.js)

Tiếp tục rebase

> git rebase - tiếp tục


đừng ngại sử dụng rebase thay vì hợp nhất hãy dành thời gian điều tra sự khác biệt nếu bạn cảm thấy khoảng trống trong câu hỏi này
Serge Seletskyy

13

git rebase dường như không làm việc cho tôi. Sau khi git rebase, khi tôi cố gắng thay đổi các chi nhánh địa phương của mình, tôi liên tục gặp lỗi ("gợi ý: Cập nhật bị từ chối vì phần đầu của chi nhánh hiện tại của bạn nằm phía sau đối tác từ xa. Tích hợp các thay đổi từ xa (ví dụ: git pull. .. ') trước khi đẩy lại. ") ngay cả sau khi kéo git. Điều cuối cùng làm việc cho tôi là git merge.

git checkout <local_branch>
git merge <master> 

Nếu bạn là người mới bắt đầu như tôi, đây là một bài viết hay về git merge vs git rebase. https://www.atlassian.com/git/tutorials/merging-vs-rebasing

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.