ฉันจะตรวจสอบคำขอดึง GitHub ด้วย git ได้อย่างไร


251

ฉันต้องการตรวจสอบคำขอดึงที่สร้างขึ้นก่อนหน้านี้ (สร้างผ่านทางเว็บอินเตอร์เฟส GitHub) ฉันค้นหาและพบสถานที่ต่าง ๆ ที่ refs / pull หรือ refs / pull / pr

แต่เมื่อฉันเพิ่มfetch = +refs/pull/*/head:refs/remotes/origin/pr/*ไฟล์ git config และทำการดึง git

ฉันทำอะไรผิด GitHub ควรสร้างสิ่งดึง / xyz โดยอัตโนมัติหรือฉันต้องกำหนดค่าบางอย่าง


ส่วนระยะไกลที่สมบูรณ์ของไฟล์ปรับแต่งของคุณมีลักษณะอย่างไร


สำเนาซ้ำซ้อนของgithub clone จากคำขอ pull หรือไม่
BuZZ-dEE

ฉันลงเอยด้วยคำถามนี้ แต่จริง ๆ แล้วฉันต้องการstackoverflow.com/q/1783405/2413303
EpicPandaForce

1
วรรคสองไม่ใช่ประโยคที่สมบูรณ์ "แต่เมื่อฉันเพิ่ม ... และดึงข้อมูลคอมไพล์" - เมื่อคุณทำสิ่งเหล่านี้จะเกิดอะไรขึ้น
cp.engr

คำตอบ:


385

เพื่อดึง PR ระยะไกลไปยัง repo ในพื้นที่ของคุณ

git fetch origin pull/ID/head:BRANCHNAME

โดยที่IDid การร้องขอการดึงและBRANCHNAMEเป็นชื่อของสาขาใหม่ที่คุณต้องการสร้าง เมื่อคุณสร้างสาขาแล้วเพียงแค่

git checkout BRANCHNAME

ดูเอกสารทางการของ GitHubสำหรับข้อมูลเพิ่มเติม


11
ฉันใช้สิ่งนี้เพื่อดึงข้อมูล pr จาก repo upstream ใน repo forked ในพื้นที่ของฉันคุณสามารถแทนที่ Origin ด้วย upstream ได้เช่นกัน
Jngai1297

18
คำสั่งของฉันจบลงด้วยการมองgit fetch origin pull/1/head:githubusernameไม่ใช่สิ่งที่ฉันคาดหวัง
Anthony

1
วิธีการย้อนกลับ?
fico7489

8
@Antoine BRANCHNAMEเป็นสิ่งที่คุณต้องการตั้งชื่อสาขา ฉันเดาว่าคุณพยายามใช้ชื่อที่มีอยู่แล้ว (เช่นmaster) และนั่นใช้งานไม่ได้ดังนั้นคุณจึงลองใช้ชื่อผู้ใช้ของคุณซึ่งใช้งานได้เพราะชื่อนั้นไม่มีสาขาที่มีชื่อนั้น บางทีฉันอาจเข้าใจผิดในสิ่งที่คุณพูด
Nateowami

1
อาจเป็นกรณีที่คุณกำหนดค่า repo ในพื้นที่ของคุณในแบบที่originชี้ไปยังทางแยกของคุณและupstream- ไปยังที่เก็บต้นฉบับ (ทำตามhelp.github.com/articles/configuring-a-remote-for-a-forkเป็นต้น) ตรวจสอบให้แน่ใจว่าได้เปลี่ยนoriginเป็นupstreamในคำสั่งที่กล่าวถึงหากคุณต้องการดึงคำขอการดึงจาก repo ดั้งเดิม
mvlabat

127

สิ่งนี้จะดึงข้อมูลโดยที่คุณไม่ต้องตั้งชื่อสาขา:

git pull origin pull/939/head

ฉันจะรับคำขอดึงเฉพาะบนเครื่องของฉันได้อย่างไร


นี้เพียงพอแน่นอน tks
rll

อันนี้ใช้ได้กับฉันวิธีการดึงข้อมูลของ
timbo

30
โปรดทราบว่าถ้าคุณทำเช่นนี้ในขณะที่อยู่ในสาขาหลักของคุณตัวอย่างเช่นจะกระทำโดยตรงในสาขานี้ หากคุณต้องการที่จะนำคำขอดึงเข้าไปในสาขาแยกต่างหากสำหรับการจัดเตรียมลองคำตอบของ @ timbo
ฟีนิกซ์

3
เหมือนกันกับสิ่งที่ @phoenix พูด ฉันต้องการให้แผนกคำขอดึงข้อมูลซ้ำกันบนเครื่องของฉันภายใต้สาขาของตัวเองไม่ใช่ผู้เชี่ยวชาญ
Paul Chernoch

ยังสามารถใช้งานได้ในภายหลังหากคุณต้องการดึงการเปลี่ยนแปลงจากคำขอดึงเข้าสู่สาขาท้องถิ่นของคุณ
แนะนำ

52

ส่วนสำคัญที่ไม่อธิบายสิ่งที่เกิดขึ้นเมื่อคุณทำการเรียก git:

เห็นได้ชัดว่าเปลี่ยน URL GitHub เพื่อให้ตรงกับ URL ของโครงการของคุณ มันดูเหมือนว่า:

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

ตอนนี้ดึงคำขอดึงทั้งหมด:

$ 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
...

หากต้องการตรวจสอบคำขอดึงพิเศษ:

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

คุณมีสคริปต์ต่าง ๆ ที่ระบุไว้ในปัญหา 259เพื่อทำให้งานนั้นเป็นไปโดยอัตโนมัติ
โครงการgit-extrasเสนอคำสั่งgit-pr(ดำเนินการในPR 262 )

git-pr(1) - ตรวจสอบคำขอดึงภายใน

สรุป

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

รายละเอียด

สร้างสาขาในท้องถิ่นโดยยึดตามหมายเลขคำขอดึง GitHub และเปลี่ยนเป็นสาขานั้นในภายหลัง

ชื่อของรีโมตที่จะดึงข้อมูล เริ่มoriginต้นที่

ตัวอย่าง

นี่จะตรวจสอบคำขอดึง226จาก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

ฉันชอบที่จะดึงข้อมูลและชำระเงินโดยไม่ต้องสร้างสาขาในประเทศและจะอยู่ในหัวแฝดรัฐ มันช่วยให้ฉันตรวจสอบคำขอดึงได้อย่างรวดเร็วโดยไม่ทำให้เครื่องจักรในพื้นที่ของฉันสกปรกด้วยสาขาในท้องถิ่นที่ไม่จำเป็น

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

โดยที่IDID คำขอดึงและupstreamตำแหน่งของคำขอดึงต้นฉบับถูกสร้างขึ้นแล้ว ( originตัวอย่างเช่น)

ฉันหวังว่ามันจะช่วย


1
ฉันชอบวิธีนี้ ข้อดีอย่างหนึ่งก็คือว่าถ้ามีการอัพเดท PR ด้วยการผูกมัดเพิ่มคุณก็สามารถเรียกใช้อีกครั้งและมันจะดึงการกระทำใหม่
Alex Johnson

14

การอ้างอิงคำตอบของ Steven Penny ดีที่สุดในการสร้างสาขาทดสอบและทดสอบการประชาสัมพันธ์ ดังนั้นนี่คือสิ่งที่คุณจะทำ

  1. สร้างสาขาทดสอบเพื่อรวม PR เข้าไปในเครื่อง สมมติว่าคุณอยู่ในสาขาหลัก:

git checkout -b test

  1. รับการเปลี่ยนแปลง PR ในสาขาทดสอบ

git pull origin pull/939/head:test

ตอนนี้คุณสามารถทดสอบการเปลี่ยนแปลงในสาขาการทดสอบในท้องถิ่นได้อย่างปลอดภัย (ในกรณีนี้ชื่อทดสอบ ) และเมื่อคุณพอใจแล้วก็สามารถรวมมันได้ตามปกติจาก GitHub


1
ฉันจะไปได้ดีกว่านี้ - ฉันจะสร้าง worktree ตั้งไว้ที่testสาขาใหม่แล้วดึง PR - นั่นคือวิธีที่ฉันไม่ต้องการกู้คืนสาขาในพื้นที่เมื่อเสร็จแล้ว ฉันแค่กำจัด worktree ในความเป็นจริงฉันไม่เคยเพียงแค่checkout -bอีกต่อไป - ฉันสร้าง worktree แล้วแยกสาขา ดิสก์ราคาถูก แน่นอนฉันมีสคริปต์ที่ทำสิ่งนี้ ฉันไม่ได้พิมพ์คำสั่งทั้งหมดที่ต้องการทีละรายการ
mpersico

11

หากคุณใช้ Github.com ให้ไปที่ "ดึงคำขอ" คลิกที่คำขอดึงที่เกี่ยวข้องแล้วคลิกที่ลิงค์ "คำแนะนำบรรทัดคำสั่ง" คำสั่งบรรทัดคำสั่งที่ Github.com


บอกว่ามีจริงไหม - เมื่อคุณดูที่ github.com ฉันหมายถึง - เพื่อดาวน์โหลดไฟล์ใหม่ / ที่มีการเปลี่ยนแปลงของ PR ดังนั้นเมื่อคุณดู repo บน github คุณสามารถคลิกที่ปุ่ม "download as zip" หรือคุณสามารถคลิกผ่านและดูไฟล์แต่ละไฟล์ของโครงการ สำหรับพีอาร์ฉันไม่สามารถเห็นวิธีการเพียงคลิกผ่านเพื่อ "ดูไฟล์" - รู้ว่าฉันหมายถึงอะไร ฉันพลาดอะไรไปรึเปล่า? ไชโย!
Fattie

9

คุณสามารถใช้git configคำสั่งเพื่อเขียนกฎใหม่.git/configเพื่อดึงคำขอดึงจากที่เก็บ:

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

แล้วก็:

$ 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

8

ปัญหาของตัวเลือกบางตัวด้านบนคือถ้ามีคนกดคอมมิชชันให้มากขึ้นหลังจากเปิด PR พวกเขาจะไม่ให้เวอร์ชันที่อัปเดตมากที่สุดให้คุณ สำหรับฉันสิ่งที่ดีที่สุดคือ - ไปที่การประชาสัมพันธ์และกด 'มุ่งมั่น' เลื่อนไปที่ด้านล่างเพื่อดูแฮชคอมมิชชันล่าสุด ป้อนคำอธิบายรูปภาพที่นี่ จากนั้นใช้การชำระเงิน git คือ

git checkout <commit number>

ในตัวอย่างด้านบน

git checkout 0ba1a50


2
ผมตีว่าปัญหานี้ด้วยgit fetch origin pull/ID/head:BRANCHNAMEวิธีการที่กล่าวถึงในstackoverflow.com/a/30584951/659732 ขอบคุณสำหรับการแก้ปัญหา!
joewiz

6

ฉันใช้ฮับเครื่องมือจาก github: https://github.com/github/hub

ด้วยการที่ฮับตรวจสอบคำขอดึงภายในเครื่องนั้นค่อนข้างง่าย:

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

5

สำหรับ Bitbucket คุณจะต้องเปลี่ยนคำไปpullpull-requests

ก่อนอื่นคุณสามารถยืนยันรูปแบบ URL คำขอดึงตามgit ls-remote originคำสั่ง

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

อย่างที่คุณเห็นมันเป็นrefs/pull-requests/1503/fromแทนrefs/pull/1503/from

จากนั้นคุณสามารถใช้คำสั่งของคำตอบใด ๆ


4

ฉันตั้งใจเขียนเกือบจะเหมือนกับที่ได้รับจาก git-extras ดังนั้นหากคุณต้องการคำสั่งที่กำหนดเองเดียวแทนที่จะติดตั้งพวงของคำสั่งพิเศษอื่น ๆ เพียงวางไฟล์นี้git-prไว้ในที่ของคุณ$PATHจากนั้นคุณก็สามารถเขียน:

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

4

หากคุณกำลังติดตามเวิร์กโฟลว์ "github fork" ซึ่งคุณสร้าง fork และเพิ่ม repo ระยะไกลอัปสตรีม:

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)

เพื่อดึงเข้าไปในสาขาปัจจุบันของคุณคำสั่งของคุณจะมีลักษณะ:

git pull upstream pull/<pull_request_number>/head

เพื่อดึงเข้าไปในสาขาใหม่รหัสจะมีลักษณะ:

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

3

Github เพิ่งเปิดตัวยูทิลิตี้ CLI เรียกGitHub-CLI หลังจากติดตั้งแล้วคุณสามารถชำระเงินสาขาของคำขอดึงภายในโดยใช้รหัส

เช่น: gh pr checkout 2267

โปรดทราบว่าแพ็คเกจนี้ยังอยู่ในช่วงเบต้า


1

รับ PR สาขาระยะไกลลงในสาขาท้องถิ่น:

git fetch origin ‘remote_branch’:‘local_branch_name’

ตั้งค่าอัปสตรีมของสาขาท้องถิ่นเป็นสาขาระยะไกล

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

เมื่อคุณต้องการที่จะผลักดันการเปลี่ยนแปลงในท้องถิ่นไปยังสาขา PR อีกครั้ง

git push origin HEAD:remote_PR_Branch_name


0

สมมติว่าที่มาและข้อมูลต้นน้ำของคุณเป็นดังนี้

   $ 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)

และชื่อสาขาของคุณเป็นอย่างไร

   <repo_owner>:<BranchName>

แล้วก็

   git pull origin <BranchName>

จะทำงาน


เมื่อคุณแชร์รหัสโปรดลองอธิบายรหัสของคุณ
Yunus Temurlenk

-3

หากความมุ่งมั่นของพวกเขาอยู่ที่นั่นสาขาหลักของ repo ที่คดเคี้ยวของพวกเขาคุณก็สามารถทำสิ่งต่อไปนี้ได้

git fetch git@github.com:<repo_owner>/<repo_name>.git
git checkout FETCH_HEAD
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.