Làm cách nào tôi có thể kiểm tra yêu cầu kéo GitHub bằng git?


251

Tôi muốn kiểm tra một yêu cầu kéo được tạo trước đó (được tạo thông qua giao diện web GitHub). Tôi đã tìm kiếm và tìm thấy những nơi khác nhau trong đó một refs / pull hoặc refs / pull / pr

Nhưng khi tôi thêm fetch = +refs/pull/*/head:refs/remotes/origin/pr/*vào tập tin cấu hình git và thực hiện tìm nạp git

Tôi đang làm gì sai? GitHub có nên tự động tạo công cụ pull / xyz hay tôi phải cấu hình thứ gì đó?


Phần từ xa hoàn chỉnh của tập tin cấu hình của bạn trông như thế nào?



Tôi đã kết thúc câu hỏi này, nhưng tôi thực sự cần stackoverflow.com/q/1783405/2413303
EpicPandaForce

1
Đoạn thứ hai không phải là một câu hoàn chỉnh. "Nhưng khi tôi thêm ... và thực hiện một git fetch" - khi bạn làm những điều này thì điều xảy ra?
cp.engr

Câu trả lời:


385

Để lấy PR từ xa vào repo cục bộ của bạn,

git fetch origin pull/ID/head:BRANCHNAME

IDid yêu cầu kéo ở đâu và BRANCHNAMElà tên của nhánh mới mà bạn muốn tạo. Một khi bạn đã tạo chi nhánh, sau đó chỉ cần

git checkout BRANCHNAME

Xem tài liệu chính thức của GitHub để biết thêm.


11
Tôi đã sử dụng điều này để lấy một pr từ một repo ngược dòng vào repo rẽ nhánh cục bộ của tôi, bạn cũng có thể thay thế nguồn gốc bằng ngược dòng.
Jngai1297

18
Lệnh của tôi cuối cùng trông giống như git fetch origin pull/1/head:githubusername, không như tôi mong đợi
Anthony

1
Làm thế nào để hoàn nguyên?
fico7361

8
@Antoine BRANCHNAMElà bất cứ điều gì bạn muốn đặt tên chi nhánh. Tôi đoán bạn đã cố sử dụng một tên đã tồn tại (ví dụ master) và nó không hoạt động, vì vậy bạn đã thử tên người dùng của mình, vì nó không hoạt động, vì họ không có chi nhánh với tên đó. Có lẽ tôi hiểu nhầm những gì bạn đang nói.
Nateowami

1
Đó có thể là trường hợp bạn định cấu hình repo cục bộ của mình theo cách origintrỏ đến ngã ba của bạn và upstream- vào kho lưu trữ ban đầu ( ví dụ: help.github.com/articles/configuring-a-remote-for-a-fork ). Đảm bảo thay đổi originthành upstreamtrong lệnh đã đề cập, nếu bạn muốn tìm nạp yêu cầu kéo từ repo ban đầu.
mvlabat

126

Điều này sẽ tìm nạp mà không cần bạn phải đặt tên cho một chi nhánh:

git pull origin pull/939/head

Làm cách nào để có được yêu cầu kéo cụ thể trên máy của tôi?


Điều này thực sự là đủ, tks
rll

Cái này hiệu quả với tôi, phương pháp tìm nạp của timbo đã làm một cái gì đó nhưng không phải là điều đúng đắn
malhal

29
Lưu ý rằng nếu bạn làm điều này trong khi trên nhánh chính của bạn, ví dụ, nó sẽ cam kết trực tiếp vào nhánh này. Nếu bạn muốn đưa yêu cầu kéo vào một nhánh riêng để dàn dựng, hãy thử câu trả lời của @ timbo.
phượng hoàng

3
Ditto những gì @phoenix nói. Tôi muốn nhánh yêu cầu kéo được nhân đôi trên máy của mình dưới nhánh của chính nó chứ không phải chủ.
Paul Chernoch

Điều này cũng hoạt động nếu sau này bạn muốn kéo các thay đổi từ yêu cầu kéo vào chi nhánh địa phương của bạn.
luator

52

Ý chính đó mô tả những gì xảy ra khi bạn thực hiện một git:

Rõ ràng, thay đổi url github để khớp với URL của dự án của bạn. Nó kết thúc như thế này:

[remote "origin"]
    fetch = +refs/heads/*:refs/remotes/origin/*
    url = git@github.com:joyent/node.git
    fetch = +refs/pull/*/head:refs/remotes/origin/pr/*

Bây giờ hãy tải tất cả các yêu cầu kéo:

$ git fetch origin
From github.com:joyent/node
 * [new ref]         refs/pull/1000/head -> origin/pr/1000
 * [new ref]         refs/pull/1002/head -> origin/pr/1002
 * [new ref]         refs/pull/1004/head -> origin/pr/1004
 * [new ref]         refs/pull/1009/head -> origin/pr/1009
...

Để kiểm tra một yêu cầu kéo cụ thể:

$ git checkout pr/999
Branch pr/999 set up to track remote branch pr/999 from origin.
Switched to a new branch 'pr/999'

Bạn có các tập lệnh khác nhau được liệt kê trong các vấn đề 259 để tự động hóa tác vụ đó.
Các git-extras dự án đề xuất lệnh git-pr(thực hiện trong PR 262 )

git-pr(1) - Kiểm tra yêu cầu kéo cục bộ

TÓM TẮC

git-pr <number> [<remote>]
git-pr clean

SỰ MIÊU TẢ

Tạo một nhánh cục bộ dựa trên số yêu cầu kéo GitHub và sau đó chuyển sang nhánh đó.

Tên của điều khiển từ xa để lấy từ. Mặc địnhorigin .

VÍ DỤ

Điều này kiểm tra yêu cầu kéo 226từ origin:

$ git pr 226

remote: Counting objects: 12, done.
remote: Compressing objects: 100% (9/9), done.
remote: Total 12 (delta 3), reused 9 (delta 3)
Unpacking objects: 100% (12/12), done.
From https://github.com/visionmedia/git-extras
  * [new ref] refs/pull/226/head -> pr/226
Switched to branch 'pr/226'

38

Tôi thích tìm nạp và kiểm tra mà không tạo ra một chi nhánh địa phương và ở trạng thái tách rời CHÍNH . Nó cho phép tôi nhanh chóng kiểm tra yêu cầu kéo mà không làm ô nhiễm máy cục bộ của tôi với các nhánh cục bộ không cần thiết.

git fetch upstream pull/ID/head && git checkout FETCH_HEAD

nơi IDlà một yêu cầu kéo ID và upstreamnơi được yêu cầu ban đầu kéo đã được tạo ra (nó có thể làorigin , ví dụ).

Tôi hy vọng nó sẽ giúp.


1
Tôi thích giải pháp này. Một trong những lợi ích là nếu PR được cập nhật với nhiều cam kết hơn, thì bạn có thể chạy lại nó và nó sẽ kéo theo (các) cam kết mới.
Alex Johnson

14

Tham khảo câu trả lời của Steven Penny, tốt nhất là tạo một nhánh thử nghiệm và kiểm tra PR. Vì vậy, đây là những gì bạn sẽ làm.

  1. Tạo một nhánh thử nghiệm để hợp nhất PR vào cục bộ. Giả sử bạn đang ở trong nhánh chính:

git checkout -b test

  1. Nhận các thay đổi PR vào nhánh thử nghiệm

git pull origin pull/939/head:test

Bây giờ, bạn có thể kiểm tra các thay đổi trên nhánh thử nghiệm cục bộ này một cách an toàn (trong trường hợp này là thử nghiệm có tên ) và một khi bạn hài lòng, có thể hợp nhất nó như bình thường từ GitHub.


1
Tôi sẽ làm tốt hơn nữa - tôi sẽ tạo ra một bàn làm việc, đặt nó thành một testnhánh mới và THÌ kéo theo PR - theo cách đó tôi không cần phải khôi phục các nhánh tại địa phương khi hoàn thành; Tôi chỉ vứt bỏ worktree. Trong thực tế, tôi KHÔNG BAO GIỜ checkout -bnữa - tôi luôn tạo ra một bàn làm việc và sau đó là chi nhánh. Đĩa có giá rẻ. Tất nhiên, tôi có một kịch bản làm điều này; Tôi không gõ tất cả các lệnh cần thiết riêng lẻ.
mpersico

11

Nếu bạn đang sử dụng Github.com, hãy chuyển đến "Yêu cầu kéo", nhấp vào yêu cầu kéo có liên quan và sau đó nhấp vào liên kết "hướng dẫn dòng lệnh": hướng dẫn dòng lệnh tại Github.com


Nói, thực sự có một cách - khi bạn đang xem github.com, ý tôi là - để tải xuống các tệp mới / đã thay đổi, của PR? Vì vậy, khi bạn đang xem một repo trên github, bạn có thể nhấp vào nút "tải xuống dưới dạng zip" tiện dụng, hoặc thực sự, bạn có thể, khá đơn giản, nhấp qua và chỉ cần xem từng (toàn bộ) tệp của dự án. Đối với PR, tôi không thể thấy cách, đơn giản, nhấp qua để "xem tệp" - biết ý tôi là gì không? Tui bỏ lỡ điều gì vậy? Chúc mừng!
Fattie

9

Bạn có thể sử dụng git configlệnh để viết quy tắc mới .git/configđể tìm nạp các yêu cầu kéo từ kho lưu trữ:

$ git config --local --add remote.origin.fetch '+refs/pull/*/head:refs/remotes/origin/pr/*'

Và sau đó chỉ:

$ git fetch origin
Fetching origin
remote: Counting objects: 4, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 4 (delta 2), reused 4 (delta 2), pack-reused 0
Unpacking objects: 100% (4/4), done.
From https://github.com/container-images/memcached
 * [new ref]         refs/pull/2/head -> origin/pr/2
 * [new ref]         refs/pull/3/head -> origin/pr/3

7

Vấn đề với một số tùy chọn ở trên, là nếu ai đó đẩy nhiều cam kết hơn vào PR sau khi mở PR, họ sẽ không cung cấp cho bạn phiên bản cập nhật nhất. Đối với tôi, điều làm việc tốt nhất là - đi đến PR và nhấn 'Cam kết', cuộn xuống phía dưới để xem hàm băm cam kết gần đây nhất nhập mô tả hình ảnh ở đây và sau đó chỉ cần sử dụng kiểm tra git, tức là

git checkout <commit number>

trong ví dụ trên

git checkout 0ba1a50


2
Tôi đã giải quyết chính xác vấn đề này bằng git fetch origin pull/ID/head:BRANCHNAMEcách tiếp cận được đề cập trong stackoverflow.com/a/30584951/659732 . Cảm ơn giải pháp!
joewiz

6

Tôi đang sử dụng hub, một công cụ từ github: https://github.com/github/hub

Với trung tâm kiểm tra một yêu cầu kéo cục bộ là khá dễ dàng:

hub checkout https://github.com/owner/repo/pull/1234
or
hub pr checkout 1234

5

Đối với Bitbucket, bạn cần thay thế từ pullđến pull-requests.

Đầu tiên, bạn có thể xác nhận kiểu URL yêu cầu kéo bằng git ls-remote originlệnh.

$ git ls-remote origin |grep pull
f3f40f2ca9509368c959b0b13729dc0ae2fbf2ae    refs/pull-requests/1503/from
da4666bd91eabcc6f2c214e0bbd99d543d94767e    refs/pull-requests/1503/merge
...

Như bạn có thể thấy, nó refs/pull-requests/1503/fromthay vìrefs/pull/1503/from

Sau đó, bạn có thể sử dụng các lệnh của bất kỳ câu trả lời.


4

Tôi đã vô tình kết thúc việc viết gần giống như được cung cấp bởi git-bổ sung. Vì vậy, nếu bạn thích một lệnh tùy chỉnh duy nhất thay vì cài đặt một loạt các lệnh bổ sung khác, chỉ cần đặt tệp nàygit-pr ở đâu đó trong $PATHđó và sau đó bạn có thể viết:

git pr 42
// or
git pr upstream 42
// or
git pr https://github.com/peerigon/phridge/pull/1

4

Nếu bạn đang theo quy trình công việc "github fork", nơi bạn tạo một ngã ba và thêm repo ngược dòng từ xa:

14:47 $ git remote -v
origin  git@github.com:<yourname>/<repo_name>.git (fetch)
origin  git@github.com:<yourname>/<repo_name>.git (push)
upstream        git@github.com:<repo_owrer>/<repo_name>.git (fetch)
upstream        git@github.com:<repo_owner>/<repo_name>.git (push)

để kéo vào nhánh hiện tại của bạn, lệnh của bạn sẽ như sau:

git pull upstream pull/<pull_request_number>/head

để kéo vào một nhánh mới, mã sẽ trông như sau:

git fetch upstream pull/<pull_request_number>/head:newbranch

3

Github gần đây đã phát hành một tiện ích cli gọi là github-cli . Sau khi cài đặt nó, bạn có thể kiểm tra nhánh của yêu cầu kéo cục bộ bằng cách sử dụng id của nó

ví dụ: gh pr checkout 2267

Lưu ý rằng gói này vẫn đang trong giai đoạn thử nghiệm


1

Lấy chi nhánh PR từ xa vào chi nhánh địa phương:

git fetch origin ‘remote_branch’:‘local_branch_name’

Đặt ngược dòng của nhánh cục bộ thành nhánh từ xa.

git branch --set-upstream-to=origin/PR_Branch_Name local_branch

Khi bạn muốn đẩy các thay đổi cục bộ sang nhánh PR một lần nữa

git push origin HEAD:remote_PR_Branch_name


0

Giả sử nguồn gốc và thông tin ngược dòng của bạn giống như dưới đây

   $ git remote -v
   origin  git@github.com:<yourname>/<repo_name>.git (fetch)
   origin  git@github.com:<yourname>/<repo_name>.git (push)
   upstream   git@github.com:<repo_owner>/<repo_name>.git (fetch)
   upstream   git@github.com:<repo_owner>/<repo_name>.git (push)

và tên chi nhánh của bạn giống như

   <repo_owner>:<BranchName>

sau đó

   git pull origin <BranchName>

sẽ làm công việc


Khi bạn chia sẻ mã, vui lòng cố gắng giải thích mã của bạn
Yunus Temurlenk

-2

Nếu các cam kết của họ nằm trên nhánh chính của repo rẽ nhánh, thì bạn có thể thực hiện như sau.

git fetch git@github.com:<repo_owner>/<repo_name>.git
git checkout FETCH_HEAD
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.