คุณจะได้รับ git ดึงจากสาขาเฉพาะได้อย่างไร


485

ฉันไม่ใช่อาจารย์ git แต่ฉันได้ทำงานกับมันมาระยะหนึ่งแล้วด้วยโครงการที่แตกต่างกันหลายโครงการ ในแต่ละโครงการฉันจะเสมอgit clone [repository]และจากจุดนั้นสามารถทำได้git pullตราบใดที่ฉันไม่มีการเปลี่ยนแปลงที่โดดเด่นแน่นอน

เมื่อเร็ว ๆ git checkout 4f82a29นี้ผมต้องย้อนกลับไปยังสาขาก่อนหน้านี้และทำเช่นนั้นด้วย เมื่อฉันพร้อมที่จะดึงอีกครั้งฉันก็พบว่าฉันต้องกลับไปที่กิ่ง ตอนนี้ฉันไม่สามารถดึงโดยใช้เส้นตรงได้git pullแต่ต้องระบุgit pull origin masterซึ่งน่ารำคาญและบอกกับฉันว่าฉันไม่เข้าใจสิ่งที่เกิดขึ้น

มีการเปลี่ยนแปลงอะไรที่ไม่อนุญาตให้ฉันทำแบบตรงgit pullโดยไม่ต้องระบุตัวตนต้นแบบและฉันจะเปลี่ยนกลับได้อย่างไร

UPDATE:

-bash-3.1$ cat config
[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[branch "master"]
[remote "origin"]
    url = git@github.com:user/project.git
    fetch = refs/heads/*:refs/remotes/origin/*

อัปเดต 2: เพื่อความชัดเจนฉันเข้าใจว่าวิธีดั้งเดิมของฉันอาจไม่ถูกต้อง แต่ฉันต้องแก้ไข repo นี้เพื่อที่ฉันจะสามารถใช้งานได้git pullอีกครั้ง ปัจจุบัน git pull ให้ผลลัพธ์เป็น:

-bash-3.1$ git pull
You asked me to pull without telling me which branch you
want to merge with, and 'branch.master.merge' in
your configuration file does not tell me either.  Please
name which branch you want to merge on the command line and
try again (e.g. 'git pull  ').
See git-pull(1) for details on the refspec.

If you often merge with the same branch, you may want to
configure the following variables in your configuration
file:

    branch.master.remote = 
    branch.master.merge = 
    remote..url = 
    remote..fetch = 

See git-config(1) for details.

ผมสามารถบอกได้git pullที่สาขาที่ผสานและการทำงานอย่างถูกต้อง แต่git pullไม่ทำงานเท่าที่จะทำได้ git checkoutแต่เดิมก่อนที่จะฉัน


. git / config ของคุณมีลักษณะอย่างไร คุณทำอะไรหลังจากตรวจสอบการกระทำนั้น
Ryan Graham

คุณมุ่งมั่นที่อยู่ด้านบนของ 4f82a29 หรือไม่?
Pat Notz

แพทฉันไม่ได้ทำอะไรเลย สิ่งนี้อยู่บนเซิร์ฟเวอร์และเราจำเป็นต้องย้อนกลับไปใช้เวอร์ชันที่เสถียรเพื่อซ่อนข้อบกพร่องที่เราสร้างขึ้น ระบบนี้ไม่ได้มีไว้เพื่อการพัฒนาดังนั้นฉันแค่ต้องการย้อนกลับรอในขณะที่เราแก้ไขข้อผิดพลาดแล้วดึงกลับไปที่เวอร์ชันหัว
David Smith

2
ไรอันฉันได้ทำการอัพเดตเพื่อรวม. git / config หลังจากเช็คเอาต์ฉันไม่ได้ทำอะไรเลย คอมพิวเตอร์เครื่องนี้เป็นเซิร์ฟเวอร์ไม่ใช่เพื่อการพัฒนา
David Smith

คำตอบ:


730

ภายใต้[branch "master"]ให้ลองเพิ่มสิ่งต่อไปนี้ในไฟล์ Git config ของ repo ( .git/config):

[branch "master"]
    remote = origin
    merge = refs/heads/master

สิ่งนี้จะบอกสิ่งที่ Git 2:

  1. เมื่อคุณอยู่ในสาขาหลักรีโมตเริ่มต้นจะกำเนิด
  2. เมื่อใช้git pullกับสาขาหลักโดยไม่มีการระบุระยะไกลและสาขาให้ใช้ค่าเริ่มต้นระยะไกล (ต้นทาง) และผสานในการเปลี่ยนแปลงจากสาขาต้นแบบระยะไกล

ฉันไม่แน่ใจว่าทำไมการตั้งค่านี้จะถูกลบออกจากการกำหนดค่าของคุณ คุณอาจต้องทำตามคำแนะนำที่คนอื่นโพสต์เช่นกัน แต่วิธีนี้อาจใช้งานได้ (หรือช่วยอย่างน้อย)

หากคุณไม่ต้องการแก้ไขไฟล์กำหนดค่าด้วยตนเองคุณสามารถใช้เครื่องมือบรรทัดคำสั่งแทน:

$ git config branch.master.remote origin
$ git config branch.master.merge refs/heads/master

2
สิ่งนี้ใช้ได้สำหรับฉันเช่นกันฉันได้ลองดูโปรเจ็กต์จาก Github ฉันใช้ OS X 10.4
Sam Barnum

ขอบคุณมาก - สิ่งนี้เกิดขึ้นกับฉันในโครงการนักพัฒนาเดียวที่มีที่เก็บ "เซิร์ฟเวอร์" หนึ่งเครื่องและคอมพิวเตอร์สองเครื่อง (ซึ่งฉันใช้ในการผลัก / ดึงบ่อยครั้งโดยไม่มีปัญหาใด ๆ มาก่อนความผิดพลาด) ไม่ทราบว่าทำไม แต่การแก้ไขทำงาน ละเอียด!
chesterbr

1
คุณหมายถึงอะไรภายใต้ [branch "master"]
ianj

3
@ianj: ในไฟล์ Git config (จาก repo root .git/config)
mipadi

1
@ianj: จากบรรทัดคำสั่งที่คุณสามารถทำ$ git config branch.master.remote origin ; git config branch.master.merge refs/heads/masterแทน
mipadi

139

หากคุณต้องการคุณสามารถตั้งค่าตัวเลือกเหล่านี้ผ่านบรรทัด commmand (แทนการแก้ไขไฟล์ config) ดังนี้

  $ git config branch.master.remote origin
  $ git config branch.master.merge refs/heads/master

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

  $ git config --global branch.master.remote origin
  $ git config --global branch.master.merge refs/heads/master

12
+1 เมื่อรู้คำวิเศษ "refs / heads / master" ผมมีปัญหาในการหาวิธีการตั้งค่าตัวแปรไม่มี แต่มีอย่างมีเงื่อนงำอะไรที่จะตั้งไม่มีการและหน้าคนที่ไม่ได้ช่วยมาก ในที่สุดฉันก็พบที่ถูกต้องในเอกสารหลังจากที่ฉันพบคำตอบนี้ สำหรับความอยากรู้อยากเห็น: คำวิเศษหมายถึงเส้นทางของไฟล์.gitที่ git ดูเหมือนจะเก็บรหัสแฮชของการmasterกระทำในปัจจุบัน
mokus

84
git branch --set-upstream master origin/master

จะเพิ่มข้อมูลต่อไปนี้ในconfigไฟล์ของคุณ:

[branch "master"]
    remote = origin
    merge = refs/heads/master

หากคุณมีbranch.autosetuprebase = alwaysก็จะเพิ่ม:

    rebase = true

1
ฉันพบว่าวิธีที่ง่ายที่สุดในการทำให้คอมไพล์ทำงานอย่างที่ถามโดยเฉพาะถ้ามีสาขามากกว่านั้นไม่ใช่แค่รีโมต (แม้ว่าคุณจะต้องทำสิ่งนี้กับทุกสาขามันเป็นครั้งเดียวต่อสาขา)
s3v3n

2
ฉันเพิ่งลองสิ่งนี้และฉันได้รับข้อผิดพลาดfatal: Not a valid object name: 'origin/master'.แม้ว่าoriginจะเป็นรีโมตที่ถูกต้องและmasterมีอยู่ตามปกติใน repos ทั้งสอง
Ken Williams

2
เคนคุณต้องทำ "git fetch origin" ก่อนเพื่อรับชื่อสาขาระยะไกล
Eric Lee

14
git branch --set-upstream-to=origin/master masterคอมไพล์ใหม่กว่านี้อยากให้คุณใช้
orbeckst

52

ฉันพบว่ามันยากที่จะจำคำสั่งgit configหรือgit branchข้อโต้แย้งที่เหมือนกันกับคำตอบของ mipadi และ Casey ดังนั้นฉันจึงใช้ 2 คำสั่งเหล่านี้เพื่อเพิ่มการอ้างอิงต้นน้ำ:

git pull origin master
git push -u origin master

นี่จะเพิ่มข้อมูลเดียวกันใน. git / config ของคุณ แต่ฉันพบว่าจำได้ง่ายขึ้น


1
ฉันเห็นด้วย. นี่ควรเป็นคำตอบที่ง่ายที่สุด
linbianxiaocao

2
คำตอบของคุณควรรวมถึงสาเหตุที่มันทำงานได้และอ้างถึงส่วนในเอกสารที่อธิบายว่าทำไม
vfclists

24

Git ดึงรวมสองการกระทำ - เรียกใหม่กระทำจากพื้นที่เก็บข้อมูลระยะไกลในสาขาการติดตามและจากนั้นก็รวมพวกเขาเข้าไปในสาขาปัจจุบันของคุณ

เมื่อคุณตรวจสอบการกระทำที่เฉพาะเจาะจงคุณไม่มีสาขาปัจจุบันคุณมีเพียง HEAD เท่านั้นที่ชี้ไปที่การยืนยันล่าสุดที่คุณทำ ดังนั้นgit pullไม่ได้ระบุพารามิเตอร์ทั้งหมดไว้ นั่นเป็นเหตุผลที่มันไม่ทำงาน

จากข้อมูลที่อัปเดตของคุณสิ่งที่คุณพยายามทำคือเปลี่ยนคืน repo ระยะไกลของคุณ หากคุณรู้ว่าการกระทำที่นำข้อผิดพลาดวิธีที่ง่ายที่สุดในการจัดการนี้คือการที่มีการgit revertบันทึกการกระทำใหม่ที่ยกเลิกการกระทำรถที่ระบุ:

$ git checkout master
$ git reflog            #to find the SHA1 of buggy commit, say  b12345
$ git revert b12345
$ git pull
$ git push

เนื่องจากเป็นเซิร์ฟเวอร์ของคุณที่คุณต้องการเปลี่ยนฉันจะสมมติว่าคุณไม่จำเป็นต้องเขียนประวัติใหม่เพื่อซ่อนการกระทำที่บั๊กกี้

หากข้อผิดพลาดถูกนำมาใช้ในการรวมผสานแล้วขั้นตอนนี้จะไม่ทำงาน ดู วิธีการย้อน-a-ผิดพลาดผสาน


คุณให้การศึกษาที่ยอดเยี่ยมแก่ฉันที่นี่ซึ่งฉันซาบซึ้ง แต่ฉันอาจจะไม่อธิบายสถานการณ์ของฉันได้ดีดังนั้นนี่จึงไม่ใช่สิ่งที่ตรงกับกระบวนการทำงานของฉัน ฉันอาจจะโพสต์คำถามอื่นเพื่อที่อยู่ที่ ขอบคุณพอล! +1 ให้กับคุณครับ
David Smith

ฉันแค่อ่านสถานการณ์ของคุณผิด ฉันดีใจที่คุณได้รับคำตอบที่คุณต้องการ
Paul

12

นอกจากนี้ยังมีวิธีการกำหนดค่า Git ดังนั้นมันจะดึงและดันสาขาระยะไกลเทียบเท่ากับสาขาที่ตรวจสอบในปัจจุบันไปยังสำเนาการทำงาน มันเรียกว่าเป็นสาขาการติดตามซึ่งคอมไพล์พร้อมแนะนำการตั้งค่าตามค่าเริ่มต้น

สำหรับพื้นที่เก็บข้อมูลถัดไปเหนือไดเรกทอรีทำงานปัจจุบัน:

git config branch.autosetupmerge true

สำหรับที่เก็บ Git ทั้งหมดที่ไม่ได้กำหนดค่าไว้:

git config --global branch.autosetupmerge true

ชนิดของมายากล, IMHO แต่ช่วยอาจนี้ในกรณีที่สาขาที่เฉพาะเจาะจงเป็นเสมอสาขาในปัจจุบัน

เมื่อคุณbranch.autosetupmergeตั้งค่าtrueและชำระเงินสาขาเป็นครั้งแรก Git จะบอกคุณเกี่ยวกับการติดตามสาขาระยะไกลที่เกี่ยวข้อง:

(master)$ git checkout gh-pages
Branch gh-pages set up to track remote branch gh-pages from origin.
Switched to a new branch 'gh-pages'

Git จะกดไปที่สาขาที่เกี่ยวข้องโดยอัตโนมัติ:

(gh-pages)$ git push
Counting objects: 8, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (6/6), 1003 bytes, done.
Total 6 (delta 2), reused 0 (delta 0)
To git@github.com:bigben87/webbit.git
   1bf578c..268fb60  gh-pages -> gh-pages

10

ไม่ต้องการแก้ไขไฟล์ git config ของฉันฉันได้ติดตามข้อมูลในโพสต์ของ @ mipadi และนำไปใช้:

$ git pull origin master

13
ประเด็นคือการทำสิ่งนี้โดยอัตโนมัติแทนที่จะระบุ
Eric

4

คำถามเร่งด่วนของคุณเกี่ยวกับวิธีทำให้มันเป็นปรมาจารย์ ระบุ refspec ที่จะดึงจากในการกำหนดค่าสาขาของคุณ

[branch "master"]
    merge = refs/heads/master

ควรจะเป็น "refs / heads / master" หรือไม่? ตาม git-pull (1) นี่คือชื่อของสาขาที่ไซต์ระยะไกลที่ถูกผสานโดยค่าเริ่มต้น
Adam Monsen

ใช่คุณถูกต้อง รายการซื้อคืนที่ฉันนำมาเป็นตัวอย่างในกรณีพิเศษ การแก้ไข
Ryan Graham

0

แค่ต้องการเพิ่มข้อมูลที่เราสามารถตรวจสอบข้อมูลนี้ได้ว่าgit pullจะอ้างอิงไปยังสาขาใดโดยอัตโนมัติหรือไม่

หากคุณเรียกใช้คำสั่ง, git remote show origin(สมมติว่า Origin เป็นชื่อย่อของ Remote) git จะแสดงข้อมูลนี้ไม่ว่าจะมีการอ้างอิงเริ่มต้นอยู่git pullหรือไม่ก็ตาม

ด้านล่างคือตัวอย่างผลลัพธ์ (นำมาจากเอกสาร git)

$ git remote show origin
* remote origin
  Fetch URL: https://github.com/schacon/ticgit
  Push  URL: https://github.com/schacon/ticgit
  HEAD branch: master
  Remote branches:
    master                               tracked
    dev-branch                           tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

โปรดสังเกตส่วนที่มันแสดงสาขาท้องถิ่นกำหนดค่าสำหรับดึง git

ในกรณีนี้git pullจะอ้างถึงgit pull origin master

เริ่มแรกถ้าคุณโคลนที่เก็บโดยใช้ git clone สิ่งเหล่านี้จะได้รับการดูแลโดยอัตโนมัติ แต่ถ้าคุณเพิ่มรีโมตด้วยตนเองโดยใช้ git remote add สิ่งเหล่านี้จะหายไปจาก git config หากเป็นกรณีที่นั้นเป็นส่วนหนึ่งที่จะแสดง "สาขาท้องถิ่นกำหนดค่าสำหรับ 'คอมไพล์ดึง':" git remote show originจะหายไปจากการส่งออกของ

ขั้นตอนต่อไปที่ต้องทำหากไม่มีการกำหนดค่าสำหรับgit pullคำตอบอื่น ๆ ได้ถูกอธิบายไว้แล้ว

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.