Kéo các bản cập nhật mới từ kho lưu trữ GitHub ban đầu vào kho lưu trữ GitHub rẽ nhánh


615

Tôi đã rẽ nhánh kho lưu trữ của ai đó trên GitHub và muốn cập nhật phiên bản của mình với các cam kết và cập nhật được thực hiện trong kho lưu trữ ban đầu. Chúng được làm sau khi tôi rẽ nhánh bản sao của mình.

Làm cách nào tôi có thể lấy các thay đổi được thực hiện trong nguồn gốc và kết hợp chúng vào kho lưu trữ của mình?


1
Có thể trùng lặp hoặc có thể chỉ liên quan: Hợp nhất giữa các nhánh trong GitHub .

Trong trường hợp có các thẻ bổ sung mà bạn có thể muốn đồng bộ hóa, hãy thực hiện git push --force origin --tagssau các giải pháp được đề xuất!
MediaVince

Câu trả lời:


716

Bạn phải thêm kho lưu trữ ban đầu (kho bạn đã rẽ nhánh) làm điều khiển từ xa.

Từ trang người dùng ngã ba GitHub :

cái nĩa

Sau khi nhân bản xong, repo của bạn sẽ có một điều khiển từ xa có tên là originCameron, chỉ vào ngã ba của bạn trên GitHub.
Đừng để cái tên làm bạn bối rối, điều này không chỉ ra repo ban đầu mà bạn rẽ nhánh. Để giúp bạn theo dõi repo đó, chúng tôi sẽ thêm một điều khiển từ xa khác có tên là Up ngược dòng:

$ cd github-services
$ git remote add upstream git://github.com/pjhyett/github-services.git
$ git fetch upstream

# then: (like "git pull" which is fetch + merge)
$ git merge upstream/master master

# or, better, replay your local work on top of the fetched branch
# like a "git pull --rebase"
$ git rebase upstream/master

Bạn cũng có một viên đá quý ruby ​​có thể tạo điều kiện cho các hoạt động GitHub đó .

ngã ba

Xem thêm " Git fork là git clone? ".


14
Xem thêm bassistance.de/2010/06/25/git-fu-updating-your-github-fork để có một bản tóm tắt hay.
VonC

2
@syedrakib Tôi thích a git rebase upstream/master, nhưng tôi đã thêm hai khả năng trong câu trả lời.
VonC

1
@PaBLoX nếu bạn đã rẽ nhánh một repo, bạn đang làm việc trên repo của mình , trong chi nhánh của bạn : rebase và buộc một cú đẩy: không có sự lộn xộn liên quan. Ngay cả một yêu cầu kéo trong tiến trình sẽ được cập nhật chính xác.
VonC

2
@PaBLoX bạn không tạo ra một mớ hỗn độn: bạn git push --force, thay thế lịch sử của chi nhánh của bạn trên GitHub bằng chi nhánh địa phương mà bạn vừa khởi động. Vì chỉ có bạn là sử dụng chi nhánh buồn, không có lộn xộn có liên quan.
VonC

2
Tôi hiểu. Tôi vẫn nghĩ nó khó, không cần thiết và không trực quan. Tuy nhiên, điều kỳ lạ là những thay đổi của tôi sẽ luôn được đặt lên hàng đầu (cuối cùng), trong khi thực tế chúng đã được thực hiện trước đó. Các giải pháp tôi đã đăng trước đây có vẻ tốt hơn (vẫn không cần thiết). Vấn đề là cam kết băm thay đổi (rõ ràng, vì có cha mẹ mới) và tạo ra nhiều tiếng ồn bên trong github khi các vấn đề được gọi. Tuy nhiên, điều làm tôi ngạc nhiên là không có cách nào để cập nhật ngược dòng và quản lý ngã ba của riêng bạn mà không tạo ra các cam kết hợp nhất vô nghĩa hoặc "nói dối" về lịch sử.
Pablo Olmos de Aguilera C.

99

Ngoài câu trả lời của VonC, bạn có thể điều chỉnh nó theo ý thích của mình hơn nữa.

Sau khi tìm nạp từ nhánh từ xa, bạn vẫn sẽ phải hợp nhất các xác nhận. Tôi sẽ thay thế

$ git fetch upstream

với

$ git pull upstream master

vì git pull về cơ bản là git fetch + git merge.


Điều gì sẽ xảy ra nếu tôi biết rằng nhánh ngược dòng không có bất kỳ thay đổi nào đối với các tệp hiện có, nhưng chỉ có một vài tệp tài nguyên được thêm vào - tôi vẫn cần hợp nhất?
azec-pdx

4
Chắc chắn nó sẽ chỉ làm một nhanh về phía trước trong trường hợp đó
Domness

Làm thế nào để một chủ nhân ngược dòng ghi đè lên tất cả các tệp cục bộ (vì vậy không có xung đột hợp nhất) chủ nhân ngược dòng đang dẫn mã trong trường hợp này vì vậy chúng tôi tin tưởng 100% ... đã quản lý để làm điều này
snh_nl

1
@snh_nl git rebase upstream masterLưu ý rằng điều này không xung đột nếu bạn đã chuyển hướng đủ upstream/master. Xem git-scm.com/docs/git-rebase (tl; dr: điều này khó đặt lại chủ địa phương của bạn về thượng nguồn, và sau đó cố gắng khắc phục tất cả các cam kết địa phương từ điểm phân kỳ về phía trước)
cowbert

68

Video này cho thấy cách cập nhật một ngã ba trực tiếp từ GitHub

Các bước:

  1. Mở ngã ba của bạn trên GitHub.
  2. Bấm vào Pull Requests.
  3. Bấm vào New Pull Request. Theo mặc định, GitHub sẽ so sánh bản gốc với bản ngã ba của bạn và không nên có bất cứ điều gì để so sánh nếu bạn không thực hiện bất kỳ thay đổi nào.
  4. Bấm vào switching the base. Bây giờ GitHub sẽ so sánh ngã ba của bạn với bản gốc và bạn sẽ thấy tất cả các thay đổi mới nhất.
  5. Nhấp vào Create a pull requestđể so sánh này và gán tên dự đoán cho yêu cầu kéo của bạn (ví dụ: Cập nhật từ bản gốc).
  6. Bấm vào Create pull request.
  7. Cuộn xuống và nhấp Merge pull requestvà cuối cùng Confirmhợp nhất. Nếu ngã ba của bạn không có bất kỳ thay đổi nào, bạn sẽ có thể tự động hợp nhất nó.

3
Thật không may, phương pháp đồ họa đẹp này tạo ra tiếng ồn trong ngã ba của bạn như đã đề cập ở trên trong các nhận xét cho câu trả lời được chấp nhận. Do đó, phương pháp dòng lệnh được khuyến nghị: help.github.com/articles/syncing-a-fork
Jonathan Cross

Tôi không thể tìm thấy switching the basetùy chọn
vào

64

Sử dụng:

git remote add upstream ORIGINAL_REPOSITORY_URL

Điều này sẽ thiết lập ngược dòng của bạn đến kho lưu trữ mà bạn rẽ nhánh. Sau đó, làm điều này:

git fetch upstream      

Điều này sẽ lấy tất cả các nhánh bao gồm chủ từ kho lưu trữ ban đầu.

Hợp nhất dữ liệu này trong nhánh chính địa phương của bạn:

git merge upstream/master

Đẩy các thay đổi vào kho lưu trữ rẽ nhánh của bạn tức là xuất xứ:

git push origin master

Voila! Bạn đã hoàn thành việc đồng bộ hóa kho lưu trữ ban đầu.


Làm thế nào để một chủ nhân ngược dòng ghi đè lên tất cả các tệp cục bộ (để không có xung đột hợp nhất) chủ nhân ngược dòng đang dẫn đầu về mã trong trường hợp này vì vậy chúng tôi tin tưởng 100% ... đã quản lý để làm điều này
snh_nl

Một cách đơn giản là xóa bản sao cục bộ và tạo một bản sao mới :)
ARK

1

Nếu bạn đang sử dụng ứng dụng máy tính để bàn GitHub, có một nút đồng bộ hóa ở góc trên cùng bên phải. Click vào nó sau đó Update from <original repo>gần trên cùng bên trái.

Nếu không có thay đổi nào được đồng bộ hóa, điều này sẽ không hoạt động.

Dưới đây là một số ảnh chụp màn hình để thực hiện điều này dễ dàng.


1

Nếu không có gì để mất, bạn cũng có thể xóa ngã ba của mình, chỉ cần vào cài đặt ... đi đến phần khu vực nguy hiểm bên dưới và nhấp vào xóa kho lưu trữ. Nó sẽ yêu cầu bạn nhập tên kho lưu trữ và mật khẩu của bạn sau. Sau đó, bạn chỉ cần rẽ nhánh ban đầu một lần nữa.


1

Nếu bạn muốn làm điều đó mà không cần cli, bạn có thể làm điều đó hoàn toàn trên trang web Github.

  1. Đi đến kho lưu trữ ngã ba của bạn.
  2. Bấm vào New pull request.
  3. Đảm bảo đặt nĩa của bạn làm kho lưu trữ cơ sở và kho lưu trữ gốc (ngược dòng) làm kho lưu trữ đầu. Thông thường bạn chỉ muốn đồng bộ nhánh chính.
  4. Create new pull request.
  5. Chọn mũi tên ở bên phải của nút hợp nhất và đảm bảo chọn rebase thay vì hợp nhất. Sau đó nhấp vào nút. Bằng cách này, nó sẽ không tạo ra cam kết hợp nhất không cần thiết.
  6. Làm xong.

0

Để tự động đồng bộ hóa kho lưu trữ rẽ nhánh của bạn với kho lưu trữ mẹ, bạn có thể sử dụng Ứng dụng kéo trên GitHub.

Tham khảo Readme để biết thêm chi tiết.

Để thiết lập nâng cao nơi bạn muốn duy trì các thay đổi của mình được thực hiện cho kho lưu trữ rẽ nhánh, hãy tham khảo câu trả lời của tôi cho một câu hỏi tương tự ở đây .

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.