จะรวมการเปลี่ยนแปลงระยะไกลที่ GitHub ได้อย่างไร


137

ฉันได้รับข้อผิดพลาดต่อไปนี้เมื่อพยายามกด Github ก่อน

[rejected] master -> master (non-fast forward)
error: failed to push some refs to 'git@github.com:me/me.git'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes before pushing again.  See the 'non-fast forward'
section of 'git push --help' for details.

ฉันจะแก้ไขปัญหานี้และรวมการเปลี่ยนแปลงระยะไกลได้อย่างไร

คำตอบ:


106

ดูส่วน 'การส่งต่อที่ไม่เร็ว' ของ ' git push --help ' สำหรับรายละเอียด

คุณสามารถดำเนินการ "git pull" แก้ไขข้อขัดแย้งที่อาจเกิดขึ้นและ "git push" ผลลัพธ์ "git pull" จะสร้างการคอมมิท C ระหว่างคอมมิท A และ B

หรือคุณสามารถรีบูตการเปลี่ยนแปลงระหว่าง X และ B ที่ด้านบนของ A ด้วย "git pull --rebase" และผลักผลลัพธ์กลับมา การรีบูตจะสร้างคอมมิท D ใหม่ที่สร้างการเปลี่ยนแปลงระหว่าง X และ B ที่ด้านบนของ A


16
ฉันยังคงทำงานอยู่ในนี้ยกเว้นว่าถ้าฉันทำ "ดึง git" ฉันบอกว่า "ทันสมัยแล้ว" และถ้าฉันทำ "git pull --rebase" ฉันบอกว่า "อาจารย์สาขาปัจจุบันเป็นปัจจุบัน" ความคิดใด ๆ ขอบคุณ!
jwl

3
@ larson4 ผมได้รับปัญหาเดียวกัน แต่หลังจากที่คุณทำgit pullทำอื่นกระทำแล้วมันควรจะดี
แพทริค

20
@Patrick @larson ฉันมีปัญหาคล้ายกันที่เกิดจากความจริงที่ว่าฉันไม่ได้อ่านข้อความแสดงข้อผิดพลาดอย่างระมัดระวัง การปฏิเสธอยู่ในสาขาที่ฉันไม่ได้เช็คเอาท์ สาขาที่ฉันเรียนอยู่นั้นประสบความสำเร็จ git checkout other-branch; git pull; git push; git checkout branch-i-was-working-onวิธีแก้คือ
Noah Spurrier

86

นอกจากนี้คุณยังสามารถบังคับให้กดได้โดยเพิ่มสัญลักษณ์ + หน้าชื่อสาขาของคุณ

git push origin +some_branch

1
ขอบคุณสิ่งนี้เหมาะกับฉัน โซลูชันอื่น ๆ จะลบผลกระทบของฉันโดยสิ้นเชิงgit reset --hard
Oli

1
ขอบคุณ! ฉันได้ผลักสาขา "A" ขึ้นไปยังแอพการแสดงละคร Heroku ของฉันเพื่อทดสอบการทำงานบางอย่างในสภาพแวดล้อมการผลิต จากนั้น (ในเครื่อง) ฉันรวม "A" และ "B" เข้ากับ "master" และต้องการดัน "master" ลงในแอปที่จัดเตรียมของฉัน มีปัญหาทุกประเภท สิ่งนี้ทำให้การผลักดัน "หลัก" ง่ายมาก ขอบคุณ!
ดอน Leatham

ทำงานให้ฉันด้วย ใช้เวลา 4 ชั่วโมงในการค้นหาปัญหา ขอบคุณมาก. ฉันใช้ Netbeans บนเครื่องท้องถิ่น (windows 7) และต้องการการกดแต่ละครั้งบนเครื่องตรวจสอบเครื่องระยะไกล (linux)
Maxim Shoustin

โปรดทราบว่าวิธีนี้อาจไม่ปลอดภัยและอาจทำให้บางคนที่ไม่สามารถติดต่อได้
samuil

นี่ควรเป็นทางออกที่ยอมรับได้ โซลูชันอื่นไม่ทำงานสำหรับฉัน
banarun

20

คุณอาจมีการเปลี่ยนแปลงใน GitHub ที่คุณไม่เคยผสาน พยายามgit pullดึงและรวมการเปลี่ยนแปลงจากนั้นคุณควรจะสามารถผลักดัน ขออภัยถ้าฉันเข้าใจผิดคำถามของคุณ


18
ในกรณีที่คุณต้องการปฏิเสธการเปลี่ยนแปลงในต้นแบบจากระยะไกลและผลักดันการเปลี่ยนแปลงของคุณเองพยายามที่จะกดด้วย -f คีย์
Hotsyk

13

หากคุณ "git pull" และแจ้งว่า "เป็นข้อมูลล่าสุดแล้ว" และยังได้รับข้อผิดพลาดนี้อาจเป็นเพราะสาขาอื่นของคุณไม่มีข้อมูลล่าสุด ลองเปลี่ยนเป็นสาขาอื่นและตรวจสอบให้แน่ใจว่าเป็นสาขาที่ทันสมัยแล้วก่อนที่จะลอง "git push" อีกครั้ง:

เปลี่ยนเป็นสาขา "foo" และอัปเดต:

$ git checkout foo
$ git pull

คุณสามารถดูสาขาที่คุณได้รับโดยการออกคำสั่ง:

$ git branch

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

@QuinxyvonBesiex ฉันไม่แน่ใจว่าตัวเองเข้าใจ มันอาจมีบางอย่างเกี่ยวข้องกับโครงสร้างพื้นฐานของ Git เองและวิธีการจัดระเบียบกิ่งไม้ (ซึ่งโดยพื้นฐานแล้วจะเหมือนกับแท็กเท่าที่ฉันเข้าใจ)
David Calhoun

7

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

คำสั่งคือ:

git push -f 

3

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

คุณสามารถแก้ไขได้ด้วยการลบแท็กท้องถิ่นของฉัน:

$ git tag --delete foo_tag

2

เมื่อฉันได้รับข้อผิดพลาดนี้ฉันได้สำรองโฟลเดอร์โครงการทั้งหมดของฉัน จากนั้นฉันก็ทำสิ่งที่ชอบ

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

... ขึ้นอยู่กับชื่อสาขาของคุณ (ถ้าไม่ใช่ชื่อหลัก)

git pull --rebaseแล้วฉันจะทำ หลังจากนั้นฉันแทนที่ไฟล์ที่ดึงด้วยไฟล์ของโปรเจ็กต์สำรอง ตอนนี้ฉันพร้อมที่จะส่งมอบการเปลี่ยนแปลงอีกครั้งและผลักดัน


0

1) บังคับให้ดึงเพื่อเขียนทับการเปลี่ยนแปลงในท้องถิ่น

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

ดำเนินการคำสั่งต่อไปนี้ใน IDE ของคุณ:

git reset - ยาก

git pull

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

2) การเปลี่ยนแปลงทั้งสองอย่าง (ภายในและจาก repo)

หากคุณต้องการเก็บการเปลี่ยนแปลงทั้งสองอย่างไว้ (การเปลี่ยนแปลงที่ทำในเครื่องและการเปลี่ยนแปลงที่มีอยู่ในที่เก็บ) คุณสามารถเพิ่มและกำหนดการเปลี่ยนแปลงของคุณได้ เมื่อคุณดึงจะเห็นได้ชัดว่ามีความขัดแย้งผสาน ที่นี่คุณสามารถใช้เครื่องมือใน IDE ของคุณ (เช่น Difftool และ mergetool) เพื่อเปรียบเทียบโค้ดสองชิ้นและพิจารณาว่าการเปลี่ยนแปลงใดที่จะต้องเก็บไว้และที่จะลบ นี่คือทางสายกลาง จะไม่มีการเปลี่ยนแปลงใด ๆ จนกว่าคุณจะลบออกด้วยตนเอง

git เพิ่ม $ the_file_under_error

คอมไพล์

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