Câu hỏi Làm cách nào để cập nhật kho lưu trữ GitHub?


Gần đây tôi đã chia rẽ một dự án và áp dụng một số bản sửa lỗi. Sau đó tôi đã tạo một yêu cầu kéo sau đó được chấp nhận.

Một vài ngày sau đó một thay đổi khác đã được thực hiện bởi một cộng tác viên khác. Vì vậy, ngã ba của tôi không có sự thay đổi đó.

Làm thế nào tôi có thể nhận được thay đổi đó vào ngã ba của tôi? Tôi có cần phải xóa và tạo lại ngã ba của mình khi tôi có thêm thay đổi để đóng góp không? Hoặc có nút cập nhật không?


2834
2017-08-30 13:53


gốc


Điều này cũng có thể được thực hiện từ giao diện người dùng github. Tôi muốn cung cấp tín dụng [cho áp phích khác này] [1]. [1]: stackoverflow.com/a/21131381/728141 - Mike Schroll
Một bài đăng trên blog tốt về điều này - Giữ một GitHub Fork Cập nhật - Arup Rakshit
Tìm thấy điều này trong các bài viết trợ giúp Github: help.github.com/articles/syncing-a-fork - Pranav
Đây có phải là bản sao của stackoverflow.com/questions/3903817/… ? - David Cary
Đây là bản trình diễn video sử dụng hai tài khoản github youtube.com/watch?v=kpE0gTX4ycE - lifebalance


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


Trong bản sao cục bộ của kho lưu trữ được chia đôi của bạn, bạn có thể thêm kho lưu trữ GitHub ban đầu dưới dạng "từ xa". ("Điều khiển từ xa" giống như biệt hiệu cho URL của kho - origin là một ví dụ.) Sau đó, bạn có thể lấy tất cả các nhánh từ kho lưu trữ ngược dòng đó, và rebase công việc của bạn để tiếp tục làm việc trên phiên bản ngược dòng. Xét về các lệnh có thể trông giống như:

# Add the remote, call it "upstream":

git remote add upstream https://github.com/whoever/whatever.git

# Fetch all the branches of that remote into remote-tracking branches,
# such as upstream/master:

git fetch upstream

# Make sure that you're on your master branch:

git checkout master

# Rewrite your master branch so that any commits of yours that
# aren't already in upstream/master are replayed on top of that
# other branch:

git rebase upstream/master

Nếu bạn không muốn viết lại lịch sử của nhánh master của bạn, (ví dụ vì những người khác có thể đã nhân bản nó) thì bạn nên thay thế lệnh cuối cùng bằng git merge upstream/master. Tuy nhiên, để thực hiện thêm các yêu cầu kéo càng sạch càng tốt, có lẽ tốt hơn là nên rebase.


Nếu bạn đã rebased branch của bạn lên upstream/master bạn có thể cần phải đẩy đẩy để đẩy nó vào kho lưu trữ riêng của bạn trên GitHub. Bạn sẽ làm điều đó với:

git push -f origin master

Bạn chỉ cần sử dụng -f lần đầu tiên sau khi bạn đã khởi động lại.


3103
2017-08-30 14:01



Vì ngã ba của bạn chỉ tồn tại trên github và github không có công cụ để thực hiện hợp nhất thông qua giao diện web, thì câu trả lời đúng là thực hiện hợp nhất ngược dòng cục bộ và đẩy các thay đổi trở lại ngã ba của bạn. - Tim Keating
Đây là một hướng dẫn tuyệt vời mà tôi tìm thấy khi làm việc với github: gun.io/blog/how-to-github-fork-branch-and-pull-request - Tim Keating
Một lưu ý nhanh hơn là phải rebase nhánh master của riêng bạn để đảm bảo bạn đang bắt đầu với trạng thái sạch, có lẽ bạn nên làm việc trên một nhánh riêng biệt và thực hiện một yêu cầu pull từ đó. Điều này giữ cho tổng thể của bạn sạch sẽ cho bất kỳ sự hợp nhất nào trong tương lai và điều đó khiến bạn không phải viết lại lịch sử -f làm cho mọi người có thể nhân bản phiên bản của bạn. - Mateusz Kowalczyk
Thay vì lệnh rebase, tôi đã sử dụng như sau: git merge --no-ff upstream/master Bằng cách này, các cam kết của bạn không còn ở trên nữa. - Steckdoserich
Một lỗi Git khác. Nếu công cụ này được cho là hỗ trợ sự cộng tác phân tán, thì tại sao việc thực hiện một quy trình cơ bản lại khó khăn đến vậy? 4 triệu người và 2200 upvotes có nghĩa là công cụ thất bại. "bạn có thể thêm kho lưu trữ GitHub gốc dưới dạng" từ xa " - Tại sao một người thậm chí phải làm điều này? Tại sao nó không được thực hiện trong ngã ba? Điều gì đã bị phá vỡ về công cụ này? - jww


Bắt đầu từ tháng 5 năm 2014, bạn có thể cập nhật một ngã ba trực tiếp từ GitHub. Điều này vẫn hoạt động vào tháng 9 năm 2017, NHƯNG nó sẽ dẫn đến một lịch sử cam kết bẩn thỉu.

  1. Mở ngã ba của bạn trên GitHub.
  2. Bấm vào Yêu cầu kéo.
  3. Bấm vào Yêu cầu kéo mới. Theo mặc định, GitHub sẽ so sánh bản gốc với ngã ba của bạn và không nên có gì để so sánh nếu bạn không thực hiện bất kỳ thay đổi nào.
  4. Nhấp chuột chuyển đổi cơ sở nếu bạn thấy liên kết đó. Nếu không, hãy đặt thủ công chân đế thả xuống ngã ba của bạn, và đầu ngã ba đến thượng lưu. 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ả những thay đổi mới nhất. enter image description here
  5. Tạo yêu cầu kéo và chỉ định tên có thể dự đoán cho yêu cầu kéo của bạn (ví dụ: Update from original).
  6. Cuộn xuống Yêu cầu kéo hợp nhất, nhưng không nhấp vào bất kỳ thứ gì.

Bây giờ bạn có ba tùy chọn, nhưng mỗi tùy chọn sẽ dẫn đến lịch sử cam kết ít hơn.

  1. Mặc định sẽ tạo một cam kết hợp nhất xấu xí.
  2. Nếu bạn nhấp vào trình đơn thả xuống và chọn "Squash and merge", tất cả các cam kết can thiệp sẽ bị đè bẹp thành một. Đây thường là thứ bạn không muốn.
  3. Nếu bạn bấm Rebase and merge, tất cả các cam kết sẽ được thực hiện "với" bạn, các PR ban đầu sẽ liên kết với PR của bạn và GitHub sẽ hiển thị This branch is X commits ahead, Y commits behind <original fork>.

Vì vậy, có, bạn có thể giữ repo của bạn được cập nhật với thượng nguồn của nó bằng cách sử dụng giao diện người dùng web GitHub, nhưng làm như vậy sẽ sully lịch sử cam kết của bạn. Dính vào dòng lệnh thay vào đó - thật dễ dàng.


642
2018-05-25 07:31



Điều này làm việc tuyệt vời một lần. Lần thứ hai quá trình này không hoạt động theo cùng một cách: liên kết "Chuyển đổi cơ sở" không hiển thị. Và khi tôi nhấn "Click để tạo yêu cầu kéo", nó tạo ra một PR trên repo SOURCE. KHÔNG những gì tôi muốn .. - javadba
Vẫn hoạt động (Marchi 2015), mặc dù liên kết "Chuyển đổi cơ sở" không còn ở đó nữa. Bạn phải thay đổi "cơ sở" thả xuống để cả hai điểm đến ngã ba của bạn và sau đó bạn sẽ nhận được một dấu nhắc để "So sánh qua repos", mà sẽ đưa bạn đến nơi bạn muốn. - mluisbrown
Tháng 4 năm 2015. Hoạt động. Cảm ơn. Tôi đã nhận được "Chuyển sang cơ sở". Tuy nhiên, bước 6 là "Tạo yêu cầu kéo" -> nhập nhận xét -> "Tạo yêu cầu kéo". Kết thúc với 1 cam kết trước bản gốc. - cartland
@cartland (hoặc những người khác) - vâng, nó nói "Chi nhánh này là 1 cam kết trước ..." Đây có phải là điều đáng lo ngại không? Có thể loại bỏ thông điệp đó không? - RenniePet
nó sẽ không được tốt hơn, với một nút cập nhật hoặc đồng bộ hóa đơn giản! - transformer


Đây là tài liệu chính thức của GitHub Đồng bộ hóa ngã ba:

Đồng bộ hóa ngã ba

Thiết lập

Trước khi bạn có thể đồng bộ hóa, bạn cần phải thêm một điều khiển từ xa trỏ đến kho lưu trữ ngược dòng. Bạn có thể đã làm điều này khi bạn ban đầu chia tay.

Mẹo: Đồng bộ hóa ngã ba của bạn chỉ cập nhật bản sao lưu trữ cục bộ của bạn; nó không cập nhật kho lưu trữ của bạn trên GitHub.

$ git remote -v
# List the current remotes
origin  https://github.com/user/repo.git (fetch)
origin  https://github.com/user/repo.git (push)

$ git remote add upstream https://github.com/otheruser/repo.git
# Set a new remote

$ git remote -v
# Verify new remote
origin    https://github.com/user/repo.git (fetch)
origin    https://github.com/user/repo.git (push)
upstream  https://github.com/otheruser/repo.git (fetch)
upstream  https://github.com/otheruser/repo.git (push)

Đang đồng bộ hóa

Có hai bước cần thiết để đồng bộ kho lưu trữ của bạn với thượng nguồn: đầu tiên bạn phải tìm nạp từ xa, sau đó bạn phải hợp nhất nhánh mong muốn vào nhánh địa phương của mình.

Tìm nạp

Tìm nạp từ kho lưu trữ từ xa sẽ mang lại các nhánh của nó và các cam kết tương ứng của chúng. Chúng được lưu trữ trong kho lưu trữ cục bộ của bạn dưới các nhánh đặc biệt.

$ git fetch upstream
# Grab the upstream remote's branches
remote: Counting objects: 75, done.
remote: Compressing objects: 100% (53/53), done.
remote: Total 62 (delta 27), reused 44 (delta 9)
Unpacking objects: 100% (62/62), done.
From https://github.com/otheruser/repo
 * [new branch]      master     -> upstream/master

Bây giờ chúng ta có nhánh master của thượng nguồn được lưu trữ trong một nhánh địa phương, thượng lưu / master

$ git branch -va
# List all local and remote-tracking branches
* master                  a422352 My local commit
  remotes/origin/HEAD     -> origin/master
  remotes/origin/master   a422352 My local commit
  remotes/upstream/master 5fdff0f Some upstream commit

Hợp nhất

Bây giờ chúng ta đã tìm nạp kho lưu trữ ngược dòng, chúng ta muốn hợp nhất các thay đổi của nó vào nhánh nội bộ của chúng ta. Điều này sẽ làm cho nhánh đó đồng bộ với thượng nguồn, mà không làm mất các thay đổi cục bộ của chúng ta.

$ git checkout master
# Check out our local master branch
Switched to branch 'master'

$ git merge upstream/master
# Merge upstream's master into our own
Updating a422352..5fdff0f
Fast-forward
 README                    |    9 -------
 README.md                 |    7 ++++++
 2 files changed, 7 insertions(+), 9 deletions(-)
 delete mode 100644 README
 create mode 100644 README.md

Nếu chi nhánh địa phương của bạn không có bất kỳ cam kết duy nhất nào, git sẽ thực hiện "chuyển tiếp nhanh":

$ git merge upstream/master
Updating 34e91da..16c56ad
Fast-forward
 README.md                 |    5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

Mẹo: Nếu bạn muốn cập nhật kho lưu trữ của mình trên GitHub, hãy làm theo hướng dẫn đây


365
2017-10-21 23:04



Điều này cập nhật ngã ba địa phương của tôi, nhưng ngã ba của tôi trên Github.com vẫn nói "43 cam kết phía sau". Tôi đã phải sử dụng kỹ thuật của lobzik để tạo ra một yêu cầu kéo cho bản thân mình để kết hợp các thay đổi chủ vào ngã ba Github.com của tôi. - Michael McGinnis
@MichaelMcGinnis Sau khi sáp nhập tại địa phương, bạn sẽ phải đẩy các thay đổi của bạn vào github. git push origin master - jumpnett
Có thể thông minh để thúc đẩy --follow-tags: stackoverflow.com/a/26438076/667847 - kenny
Tôi phải làm điều đó cho tất cả các chi nhánh một cách riêng biệt git merge upstream/master, sau đó kiểm tra để phát triển chi nhánh và thực hiện git merge upstream/develop - Shobi P P
stackoverflow.com/a/14074925/470749 đã giúp ích cho tôi vì tôi đã nhận được Permission denied (publickey). fatal: Could not read from remote repository. khi cố gắng tìm nạp tài khoản Github của Facebook ở phía trên. - Ryan


Rất nhiều câu trả lời kết thúc việc di chuyển ngã ba của bạn một cam kết phía trước của kho lưu trữ gốc. Câu trả lời này tóm tắt các bước tìm thấy đây mà sẽ di chuyển ngã ba của bạn đến cùng một cam kết như cha mẹ.

  1. Thay đổi thư mục vào kho lưu trữ cục bộ của bạn.

    • Chuyển sang nhánh chính nếu bạn không git checkout master
  2. Thêm cha mẹ làm kho lưu trữ từ xa, git remote add upstream <repo-location>

  3. Vấn đề git fetch upstream
  4. Vấn đề git rebase upstream/master

    • Ở giai đoạn này, bạn kiểm tra xem cam kết những gì sẽ được hợp nhất bằng cách nhập git status
  5. Vấn đề git push origin master

Để biết thêm thông tin về các lệnh này, hãy tham khảo bước 3.


81
2017-08-05 14:59



@MT: Bạn nhập các lệnh này ở đâu? Ý chính của câu hỏi, như tôi đã hiểu, là cách để đồng bộ hóa lại cá nhân của bạn GitHub ngã ba với dự án chính, và làm điều này tất cả từ GitHub. Nói cách khác, làm thế nào bạn có thể cập nhật ngã ba từ xa của bạn không có một kho lưu trữ cục bộ? - John Y
@JohnY Sử dụng GitHub sẽ luôn tạo thêm một cam kết. Bạn cần phải làm tất cả điều này trong một trình bao trên repo cục bộ để tránh cam kết thêm đó. - Jonathan Cross


Kể từ tháng 11 năm 2013 đã có một yêu cầu tính năng không chính thức mở với GitHub để yêu cầu họ thêm một phương pháp rất đơn giản và trực quan để giữ một ngã ba địa phương đồng bộ với thượng nguồn:

https://github.com/isaacs/github/issues/121

Lưu ý: Vì yêu cầu tính năng không chính thức nên bạn cũng nên liên hệ với chúng tôi support@github.com để thêm hỗ trợ của bạn cho một tính năng như thế này sẽ được triển khai. Yêu cầu tính năng không chính thức ở trên có thể được sử dụng làm bằng chứng về số tiền lãi được thực hiện.


39
2018-02-21 10:42





Lời tựa: Ngã ba của bạn là "nguồn gốc" và kho lưu trữ bạn phân chia từ là "thượng nguồn".

Giả sử rằng bạn đã nhân bản nhánh của bạn với máy tính của bạn bằng một lệnh như sau:

git clone git@github.com:your_name/project_name.git
cd project_name

Nếu điều đó được đưa ra thì bạn cần tiếp tục theo thứ tự sau:

  1. Thêm "upstream" vào kho lưu trữ nhân bản của bạn ("origin"):

    git remote add upstream git@github.com:original_author/project_name.git
    
  2. Tìm nạp các commit (và các nhánh) từ "upstream":

    git fetch upstream
    
  3. Chuyển sang nhánh "chính" của ngã ba ("origin"):

    git checkout master
    
  4. Stash các thay đổi của chi nhánh "master" của bạn:

    git stash
    
  5. Hợp nhất các thay đổi từ nhánh "master" của "upstream" vào nhánh "master" của "origin" của bạn:

    git merge upstream/master
    
  6. Giải quyết xung đột hợp nhất nếu có và cam kết hợp nhất của bạn

    git commit -am "Merged from upstream"
    
  7. Đẩy các thay đổi vào ngã ba của bạn

    git push
    
  8. Lấy lại các thay đổi đã lưu trữ của bạn (nếu có)

    git stash pop
    
  9. Bạn đã hoàn tất! Xin chúc mừng!

GitHub cũng cung cấp hướng dẫn cho chủ đề này: Đồng bộ hóa ngã ba


29
2018-03-16 12:24



Giúp một phần: git remote add upstream git@github.com:original_author/project_name.git chỉ là bí danh cho git remote add upstream https://github.com/original_author/project_name.git ? - Wolf
chó sói, đoán bạn biết điều này bây giờ, nhưng đối với hậu thế ... Đó là định dạng cho ssh. help.github.com/articles/configuring-a-remote-for-a-fork - Brad Ellis


Nếu, như tôi, bạn không bao giờ cam kết bất cứ điều gì trực tiếp để làm chủ, mà bạn nên thực sự, bạn có thể làm như sau.

Từ bản sao cục bộ của ngã ba, tạo điều khiển từ xa ngược dòng. Bạn chỉ cần làm điều đó một lần:

git remote add upstream https://github.com/whoever/whatever.git

Sau đó, bất cứ khi nào bạn muốn bắt kịp với nhánh chủ lưu trữ ngược dòng, bạn cần phải:

git checkout master
git pull upstream master

Giả sử bạn không bao giờ cam kết bất cứ điều gì về chủ mình, bạn nên được thực hiện rồi. Bây giờ bạn có thể đẩy tổng thể địa phương của bạn đến ngã ba GitHub từ xa nguồn gốc của bạn. Bạn cũng có thể khởi động lại chi nhánh phát triển của mình trên tổng thể địa phương hiện tại của bạn.

Vì vậy, quá khứ thiết lập upstream ban đầu và thanh toán tổng thể, tất cả những gì bạn cần làm là chạy lệnh sau để đồng bộ hóa master của bạn với upstream: git kéo bậc thầy thượng nguồn.


22
2018-01-03 16:59





Tính đến ngày trả lời này, GitHub đã không (hoặc tôi sẽ nói không còn nữa?) tính năng này trong giao diện web. Tuy nhiên, bạn có thể hỏi support@github.com để thêm phiếu bầu của bạn cho điều đó.

Trong khi đó, người dùng GitHub bardiharborow đã tạo ra một công cụ để thực hiện điều này: https://upriver.github.io/

Nguồn là ở đây: https://github.com/upriver/upriver.github.io


21
2017-09-14 14:22



Mặc dù tôi thấy công cụ này là một ý tưởng hay nhưng thực tế là BROKEN. Nó chỉ tải 20 repos từ tài khoản của tôi và thậm chí cả footer chuyển hướng đến một trang web không tồn tại. Nếu đó là cố định tôi sẽ là một người ủng hộ lớn. - sorin
Tính đến hôm nay, tôi đã sử dụng thành công upriver để đồng bộ một ngã ba với repo ngược dòng, vì vậy nó làm việc cho mục đích của tôi và tôi sẽ tiếp tục sử dụng nó. - NauticalMile
@sorin 20 repo / giới hạn chi nhánh (thay vào đó, nó là 30 bây giờ) đến từ các thiết lập phân trang mặc định GitHub. Cần phải có một số điều chỉnh cho mã để xử lý điều này. - Andreas


Nếu bạn đang sử dụng GitHub cho Windows thì giờ đây họ có tính năng một cú nhấp chuột để cập nhật dĩa:

  1. Chọn kho lưu trữ trong giao diện người dùng.
  2. Nhấp vào nút "Cập nhật từ người dùng / chi nhánh" ở trên cùng.

12
2018-03-31 21:45



Điều này cũng làm việc trong Github cho Mac. - Steve Moser