Làm thế nào để áp dụng các yêu cầu kéo ngược dòng không được trộn từ các dĩa khác vào ngã ba của tôi?


465

Một dự án trên GitHub mà tôi có một ngã ba có một yêu cầu kéo mới mà tôi muốn kéo vào ngã ba của mình mà tác giả chưa thực hiện.

Có cách nào đơn giản để áp dụng yêu cầu kéo từ các dĩa khác vào nĩa của tôi không? Có cái gì khác ở đây mà tôi đang thiếu?



Điều này có phản ánh trên biểu đồ mạng tại GitHub nếu bạn sử dụng lệnh git để thực hiện không?
ADTC

Cũng có thể thú vị để tìm tất cả các chi nhánh: stackoverflow.com/q/47798937/10245
Tim Abell

Câu trả lời:


276

Bạn có thể thực hiện thủ công khá dễ dàng:

  • thêm ngã ba khác làm điều khiển từ xa của repo của bạn:

    git remote add otherfork git://github.com/request-author/project.git
    
  • lấy cam kết của anh ấy

    git fetch otherfork
    
  • Sau đó, bạn có hai tùy chọn để áp dụng yêu cầu kéo (nếu bạn không muốn chọn chọn 1.)

    1. Nếu bạn không quan tâm đến việc áp dụng các cam kết cuối cùng đã được thêm vào giữa nguồn gốc và yêu cầu kéo, bạn chỉ có thể khởi động lại nhánh mà yêu cầu kéo được hình thành

      git rebase master otherfork/pullrequest-branch
      
    2. Nếu bạn chỉ muốn các xác nhận trong yêu cầu kéo, hãy xác định SHA1 của chúng và thực hiện

      git cherry-pick <first-SHA1> <second-SHA1> <etc.>
      

166
Trên thực tế, bạn không nên sử dụng cherry-pick, nó tạo ra các cam kết mới ... điều này sẽ gây nhầm lẫn nếu bạn gửi yêu cầu kéo ngược dòng. Thay vào đó, bạn nên hợp nhất giống như yêu cầu kéo yêu cầu thực hiện. Bạn cũng không cần thêm điều khiển. git pull URL branchname
Tekkub

3
@Tekkub: đồng ý, có thể tốt hơn để tránh nhầm lẫn với các cam kết mới được tạo. Hợp nhất là ít thanh lịch trong tâm trí của tôi vì bạn có thể mang lại những thay đổi khác từ chi nhánh mà bạn đang hợp nhất
CharlesB

8
Aye, nhưng trong trường hợp này anh ấy đặc biệt hỏi làm thế nào để kéo yêu cầu kéo vào ngã ba của mình. Kéo == hợp nhất.
Tekkub

1
@CharlesB, vì GitHub tự động thêm các cam kết mới trên cùng một chi nhánh vào yêu cầu kéo, nên sẽ không khó để có bất kỳ "thay đổi nào khác" (giả sử người yêu cầu tuân theo các thực tiễn tốt nhất và đặt các thay đổi trên một nhánh riêng biệt để tiếp tục phát triển rằng tất cả các cam kết đều có liên quan), trừ khi những gì bạn nhận được là khi bạn chỉ muốn một phần của yêu cầu kéo?
neverfox

4
Đối với những người chia sẻ trục trặc tinh thần của tôi, "otherfork" không đề cập đến repo ban đầu, nó đề cập đến cam kết từ ngã ba đã đưa ra yêu cầu kéo đến repo ban đầu. Bỏ qua repo ban đầu và đi thẳng đến ngã ba đã thực hiện yêu cầu kéo. Bạn muốn tự mình thực hiện thao tác kéo đã tham chiếu và hợp nhất nó với chính bạn.
Michael Khalili

282

Cập nhật: Qua trang web

Bạn cũng có thể làm điều này thông qua trang web github.

Tôi giả sử, bạn đã có một ngã ba ( MyFork) của repo chung ( BaseRepo) có yêu cầu kéo chờ xử lý từ một ngã ba (OtherFork ) mà bạn quan tâm.

  1. Điều hướng đến ngã ba ( OtherFork) đã bắt đầu yêu cầu kéo mà bạn muốn vào ngã ba ( MyFork)
  2. Chuyển đến trang yêu cầu kéo của OtherFork
  3. Nhấp vào yêu cầu kéo mới
  4. Yêu cầu kéo đang chờ xử lý nên được cung cấp. Nhớ chọn OtherForkchi nhánh thích hợp quá. Chọn ở phía bên trái làm ngã ba cơ sở của bạn ngã ba ( MyFork) ( QUAN TRỌNG ).
  5. Bây giờ tùy chọn View pull requestnên thay đổi thành Create pull request. Ấn vào đây.

Bây giờ bạn sẽ có một yêu cầu kéo đang chờ xử lý trong fork ( MyFork) mà bạn có thể chấp nhận.


6
Hoạt động rất đẹp. Đơn giản hơn nhiều so với dòng cmd, và dễ dàng để xem xét các thay đổi. Cảm ơn bạn.
Alveoli

3
Tôi gặp khó khăn khi tìm cách truy cập "OtherFork" trên giao diện người dùng. Để dễ dàng đến đó, chỉ cần sửa đổi url với tên người dùng github. tức là github.com/userName/repoName
Charles

2
Tôi không thể thấy các yêu cầu kéo đang chờ xử lý được đề cập trong bước 4. Thay vào đó, tôi đã chọn nhánh tương ứng với yêu cầu kéo được thực hiện bởi OtherFork, từ danh sách thả xuống 'so sánh' bên tay phải. Sau đó, tôi đã chọn phía bên trái làm ngã ba cơ sở như được mô tả ở trên để có thể tạo yêu cầu kéo.
ký hiệu

Hoạt động trừ khi không có ngã ba. Ví dụ: github.com/OculusVR/RakNet/pull/61/files
Milan Babuškov

1
Các từ chính xác từ trang web của github có thể đã lỗi thời, nhưng quá trình này được thực hiện. Siêu đơn giản - cảm ơn!
kevnk

73

Giống như Tekkub đã nói trước đây, bạn chỉ có thể kéo chi nhánh trực tiếp. Hầu hết thời gian với GitHub, chi nhánh chỉ đơn giản là "chính chủ" trên nhánh của người dùng yêu cầu của dự án.

Thí dụ: git pull https://github.com/USER/PROJECT/ BRANCH

Và như một ví dụ điển hình:

Giả sử bạn đã rẽ nhánh một dự án github có tên safaribooks và có yêu cầu kéo sau đây, trong dự án khởi tạo, mà bạn muốn đặt trong ngã ba của mình:

nhập mô tả hình ảnh ở đây

Sau đó, trong thư mục dự án nhân bản ngã ba của bạn, hãy chạy:

git pull https://github.com/fermionic/safaribooks.git fix-str-decode

20
Nhược điểm của điều này là chi nhánh có thể có những thứ khác trong đó ngoài yêu cầu kéo. Ngoài ra, bạn phải tìm kiếm URL thích hợp cho ngã ba của tác giả yêu cầu kéo. Nếu bạn muốn sử dụng một lớp lót, tốt hơn là sử dụng git pull https://github.com/{upstream/project} refs/pull/{id}/headthay thế.
jbyler

1
@jbyler Nếu chi nhánh có những thứ khác trong đó, tôi khá chắc chắn GitHub sẽ cập nhật yêu cầu kéo với họ.
Tim Malone

22

Yêu cầu kéo cho dự án có thể đến từ nhiều tác giả (dĩa) khác nhau và có lẽ bạn không muốn có một điều khiển từ xa riêng cho mỗi ngã ba. Ngoài ra, bạn không muốn đưa ra bất kỳ giả định nào về nhánh mà tác giả đã sử dụng khi gửi yêu cầu kéo hoặc những gì khác có thể nằm trong nhánh chính của tác giả. Vì vậy, tốt hơn là tham chiếu yêu cầu kéo khi nó xuất hiện trong kho lưu trữ ngược dòng, thay vì xuất hiện trong các nhánh khác.

Bước 1:

git remote add upstream <url>

Có lẽ bạn đã thực hiện bước này, nhưng nếu không, bạn sẽ muốn một điều khiển từ xa được xác định cho dự án ngược dòng. URL là URL bản sao của dự án bạn đã rẽ nhánh. Thông tin thêm tại Cấu hình điều khiển từ xa cho một ngã baĐồng bộ hóa một ngã ba . upstreamlà tên bạn đang đặt cho điều khiển từ xa, và trong khi nó có thể là bất cứ thứ gì, upstreamlà tên thông thường.

Bước 2:

git pull upstream refs/pull/{id}/head

... Đâu {id}là số yêu cầu kéo. upstreamlà tên của điều khiển từ xa, nghĩa là chỉ "ngược dòng" nếu bạn thực hiện chính xác bước 1. Nó cũng có thể là một URL, trong trường hợp đó bạn có thể bỏ qua bước 1.

Bước 3:

Nhập một thông điệp cam kết cho cam kết hợp nhất. Bạn có thể giữ mặc định, mặc dù tôi khuyên bạn nên đưa ra một bản tóm tắt một dòng đẹp với số yêu cầu kéo, vấn đề mà nó khắc phục và một mô tả ngắn:

Merge PR#42, fixing VIM-652, support for mapping arbitrary IDEA actions

Cũng xem một câu trả lời liên quan với một biến thể tạo ra một nhánh cục bộ với yêu cầu kéo trong đó. Và một biến thể cuối cùng: bạn có thể sử dụng git pull upstream refs/pull/{id}/headđể đưa các cam kết vào repo cục bộ của mình, sau đó tham chiếu chúng như FETCH_HEAD(ví dụ git log ..FETCH_HEADđể xem những gì trong đó, sau đó git merge FETCH_HEAD)
jbyler

Làm thế nào tôi có thể bắt đầu nổi loạn, vì vậy yêu cầu kéo ở đầu & tôi có thể tránh được bong bóng hợp nhất?
Michael Johnston

1
Đây là giải pháp tôi cần, bởi vì tác giả yêu cầu kéo đã gỡ bỏ repo của anh ấy.
jswetzen

20

Một số thông tin chi tiết làm việc cho tôi.

Tệp .git / config của tôi cho repo rẽ nhánh trông như thế này:

[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
        ignorecase = true
        precomposeunicode = false
[remote "origin"]
        url = git@github.com:litzinger/angular-carousel.git
        fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
        remote = origin
        merge = refs/heads/master
        rebase = true
[remote "source"]
        url = git://github.com/revolunet/angular-carousel.git
        fetch = +refs/heads/*:refs/remotes/source/*
        fetch = +refs/pull/*/head:refs/remotes/origin/pr/*

Sau đó chạy "git fetch source", sau đó liệt kê tất cả các yêu cầu kéo từ repo rẽ nhánh.

 * [new ref]         refs/pull/54/head -> origin/pr/54
 * [new ref]         refs/pull/67/head -> origin/pr/67
 * [new ref]         refs/pull/69/head -> origin/pr/69
 * [new ref]         refs/pull/71/head -> origin/pr/71

Và sau đó để hợp nhất trong một yêu cầu kéo cụ thể chạy "git merge master origin / pr / 67"


1
Tôi đã chỉnh sửa .git / config của mình và thêm các dòng [nguồn "từ xa" nhưng đối với dự án tôi quan tâm và các hướng dẫn hoạt động hoàn hảo. Tôi thích câu trả lời này.
philo vivero

3
Lời khuyên liên quan tuyệt vời có thể được tìm thấy tại news.ycombinator.com/item?id=9051220help.github.com/articles/checking-out-pull-requests-locally gợi ý về điều này (tuyệt vời) refs/pull/không gian tên chỉ đọc từ xa dành riêng cho GitHub .
Philip Durbin

Nếu bạn sử dụng Smartgit, bạn có thể thấy các yêu cầu kéo này (và các yêu cầu đã đóng) trong biểu đồ nhật ký nếu bạn thêm smartgit.branch.otherRefs=notes;pullvào smartgit.properies theo tổng hợp.com / doc / display / SG / System+Propericat - bạn cũng có thể hợp nhất chúng từ đó .
CAD bloke

btw, bạn cũng có thể thử nó trên dòng lệnh với git fetch source + refs / Heads / *: refs / remotes / upstream / * + refs / pull / * / head: refs / remotes / origin / pr / *
lib

9

Những gì tôi sẽ làm là sau đây;

git checkout master
git remote add #NAME# #ADDRESS TO REPO#
git fetch #USERNAME#
git checkout -b test_fork
git rebase #NAME#/#BRANCH#

Bây giờ tôi đã hợp nhất các thay đổi thành một nhánh thử nghiệm, được đặt tên test_fork. Vì vậy, bất kỳ thay đổi sẽ không làm bẩn cây của tôi.

Tùy chọn bạn có thể sử dụng cherry-pick như mô tả ở trên để chọn một cam kết cụ thể nếu điều đó thích hợp hơn.

Chuyến đi hạnh phúc :)


0

Tôi sử dụng một kịch bản dandy tiện dụng cho việc này. Tôi chạy tập lệnh bằng cách gõ:

git prfetch upstream

và nó nhận được tất cả các yêu cầu kéo từ ngã ba ngược dòng.

Để tạo tập lệnh tạo một tập tin ~/bin/git-prfetch.

Các tập tin nên chứa như sau:

#!/bin/bash

if [ -z "$1" ]; then
    echo "Please supply the name of a remote to get pull requests from."
    exit 1
fi

git fetch $1 +refs/heads/\*:refs/remotes/$1/\* +refs/pull/\*/head:refs/remotes/$1/pr/\*

Đảm bảo rằng đường dẫn của bạn bao gồm tập lệnh bằng cách cài đặt:

export PATH="$HOME/bin:$PATH"

Bạn có thể thêm tệp này để ~/.bashrcthay đổi vĩnh viễn.

Bây giờ, hãy đảm bảo bạn thêm ngã ba bạn muốn nhận yêu cầu kéo từ:

git remote add upstream https://github.com/user/repo.git

Và sau đó

git prfetch upstream
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.