หลักที่ถูกปฏิเสธ -> ต้นแบบ (ไม่ใช่การกรอไปข้างหน้า)


218

ฉันพยายามผลักดันโครงการของฉัน (ไฟล์ทั้งหมดในที่เก็บใหม่) ฉันทำตามขั้นตอน แต่เมื่อฉันกดgit push -u origin masterฉันได้รับข้อผิดพลาดนี้:

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

ฉันได้รับข้อผิดพลาดนี้หลายครั้งและไม่สามารถหาได้ว่าจะทำอย่างไร


4
หากคุณแน่ใจว่าอาจารย์ในพื้นที่ของคุณมีการเปลี่ยนแปลงล่าสุดที่คุณต้องการจากระยะไกลให้กด git --force
IgorGanapolsky

34
git push --force <remote_repository>ทำงานให้ฉัน
ตัวเรียงลำดับ

@Sorter - ฉันประสบปัญหาเดียวกันทั้งวันสิ่งนี้ช่วยฉัน !! ขอบคุณ. แต่มันไม่ได้ให้คำอธิบายว่าทำไมปัญหาเกิดขึ้นตั้งแต่แรกและทำไมการแก้ไขจึงใช้งานได้
Padawan

1
@ pmr เพียงแค่ถามอย่างสุภาพว่า OP "อ่านข้อความแสดงข้อผิดพลาด" ไม่ช่วยอะไรเลย เห็นได้ชัดว่าข้อความแสดงข้อผิดพลาดไม่สมเหตุสมผลกับ OP เช่นเดียวกับที่มันไม่ได้ส่งข้อความใด ๆ มาให้ฉันหรืออีก 66 คนที่โพสต์โพสต์ของเขา Snarky, wittier กว่าแม้ว่าไม่ได้ช่วยคนเลย
Padawan

3
@Padawan นอกจากนี้คุณยังจะสังเกตเห็นว่า "คนที่ขี้ขลาดตาขาวฉลาดกว่าคนอื่น" ได้ให้คำตอบที่เป็นที่ยอมรับสำหรับคำถามนี้และ 72 คน (อาจรวมถึงคุณด้วย) พบว่ามันมีประโยชน์ ฉันขอโทษที่ความคิดเห็นของฉันมาถึงอย่างหยิ่ง แต่มันจะเป็นคำถามแรกของฉันหากคุณถามคำถามนั้นในบริบทของมืออาชีพเช่นกัน บางครั้งการหยุดและใช้เวลาสักครู่เพื่ออ่านข้อความแสดงข้อผิดพลาดอย่างรอบคอบ ฉันทำเพื่อฉันเมื่อฉันเห็นข้อผิดพลาดนั้นเป็นครั้งแรก
pmr

คำตอบ:


160

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

git pull --rebaseทั้งนี้ขึ้นอยู่กับกฎระเบียบของโครงการและขั้นตอนการทำงานของคุณคุณอาจต้องการที่จะใช้


1
มันแสดงให้ฉันเห็นว่า README.md การผสานอัตโนมัติล้มเหลว แก้ไขข้อขัดแย้งแล้วส่งผลลัพธ์
Asantoya17

1
@ Asantoya17 การเปลี่ยนแปลงที่ดำเนินการบนต้นแบบระยะไกลขัดแย้งกับการเปลี่ยนแปลงของคุณ ตรวจสอบไฟล์และตรวจสอบพวกเขา จากนั้นส่งมอบผลลัพธ์ของการแก้ไข กรุณารับการสอนหรือหนังสือหรืออย่างน้อยอ่านข้อความ
pmr

1
การดึงหมายถึงอะไร ช่วยให้คุณสามารถผลักไฟล์หรือดึงข้อมูลและดาวน์โหลดไฟล์จากเว็บไซต์ของที่เก็บ? (เช่น Bit Bucket)
David Dimalanta

4
git push --force origin master@AndrewS หากคุณพบปัญหาเหล่านี้มากกว่าหนึ่งครั้งในชีวิตของคุณเวิร์กโฟลว์โครงการของคุณจะพัง ควรมีการพัฒนาคุณสมบัติในสาขาและผสานโดยไม่ต้องส่งต่ออย่างรวดเร็วและหากคุณลักษณะ "ล้มเหลว" คุณควรยกเลิกการรวม (ควรทำการทดสอบในสาขาบูรณาการก่อนที่คุณจะรวมฟีเจอร์หลัก) ไม่มีความคิดเกี่ยวกับ Eclipse
pmr

1
จะทำอย่างไรถ้าข้อผิดพลาดนั้นรายงานโดยgit pull origin trunk:master?
Andry

175

ข้อสังเกต:นี่ไม่ใช่การใช้ git ที่แนะนำ สิ่งนี้จะเขียนทับการเปลี่ยนแปลงบนรีโมต ทำเช่นนี้ต่อเมื่อคุณรู้ว่า 100% ว่าการเปลี่ยนแปลงในท้องถิ่นของคุณควรถูกผลักไปที่ต้นแบบระยะไกล

ลองสิ่งนี้: git push -f origin master


47
ไม่ไม่ลอง จากgit help push: "สิ่งนี้สามารถทำให้ที่เก็บข้อมูลรีโมตสูญเสียการคอมมิทใช้งานด้วยความระมัดระวัง"
jcsahnwaldt Reinstate Monica

7
ไม่ทำเช่นนี้แน่นอน
Lluís

14
สิ่งนี้ใช้ได้สำหรับฉัน ฉันคิดว่ามันก็โอเคเพราะความมุ่งมั่นของฉันที่มีต่อ github คือสิ่งที่สร้างขึ้นด้วย repo ใหม่ อาจเป็นความคิดที่ดีที่จะไม่ใช้งานหลังจากเริ่มโครงการ
Matthew Moore

1
จะมีประโยชน์ถ้าคุณต้องการปรับปรุง repo ซึ่งถูกสร้างขึ้นเพื่อวัตถุประสงค์ในการจัดส่ง (เพื่อให้ไม่มีการเปลี่ยนแปลงใหม่ในด้านระยะไกลบริการ)
HIB

ฉันเพิ่งใช้สิ่งนี้เมื่อฉันเพิ่งสร้างคอมมิทช์ซิงค์กับ GitHub จากนั้นหวังว่าฉันจะเพิ่มไฟล์อื่นลงในคอมมิทนั้น ดังนั้นฉันจึงเลิกใช้งานแบบโลคัลเรียกใช้คำสั่งด้านบนเพื่อล้างข้อมูลจาก GitHub จากนั้นทำการคอมมิทอีกครั้งแบบโลคัลจากนั้นซิงค์ ตอนนี้ดีแล้ว! โปรดทราบว่าฉันรู้ดีว่าไม่มีความมุ่งมั่นอื่นใดเกิดขึ้นกับสาขานั้น
zeMinimalist

18

คำสั่งนี้ทำงานได้ดีสำหรับฉัน

git push -f origin master

3
ระมัดระวังก่อนใช้คำสั่งนี้ ด้วยการใช้คำสั่งนี้คุณจะสูญเสียการกระทำที่ผ่านมาทั้งหมด
twenk11k

-f หมายถึงแรงผลักดันหรือไม่
maheshmnj

@maheshmnj ใช่!
testuser

15

ฉันเพิ่งได้รับข้อผิดพลาดนี้

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

git pull https://github.com/*username*/*repository*.git master

URL ที่เก็บมาจากที่นี่ในหน้า GitHub โครงการ:

ป้อนคำอธิบายรูปภาพที่นี่

ฉันเริ่มต้นใหม่แล้ว (อาจไม่จำเป็น)

git init
git add .
git commit -m "update"

จากนั้นกด:

git push

3
คำตอบนี้สะท้อนให้เห็นถึงสถานการณ์กรณีที่เกิดขึ้นจริง
kta

9

ฉันได้สร้าง repo ใหม่ใน github และฉันมีปัญหาเดียวกัน แต่ก็มีปัญหาในขณะที่ดึงดังนั้นสิ่งนี้ได้ผลสำหรับฉัน

แต่นี่ไม่แนะนำใน repos ที่มีรหัสมากมายอยู่แล้วเพราะมันอาจทำให้ทุกอย่างสับสน

git push origin master --force

คำตอบนี้ได้รับแล้ว: stackoverflow.com/a/16374574/1771479และไม่แนะนำให้ทำ
agold

9

คำเตือน:

ไปสำหรับ ' git pull' ไม่เคยแก้ปัญหาดังนั้นจึงต้องระวัง คุณอาจประสบปัญหานี้ (ปัญหาที่กล่าวถึงใน Q) หากคุณเปลี่ยนประวัติที่เก็บข้อมูลของคุณโดยเจตนา ในกรณีดังกล่าว git ทำให้การเปลี่ยนแปลงประวัติของคุณสับสนกับการเปลี่ยนแปลงใหม่ใน repo ระยะไกลของคุณ ดังนั้นคุณควรไปgit push --forceเพราะการโทรgit pullจะยกเลิกการเปลี่ยนแปลงทั้งหมดที่คุณทำกับประวัติโดยเจตนา


8

หากgit pullไม่ช่วยคุณอาจผลักดันการเปลี่ยนแปลง (A) และหลังจากนั้นก็เคยgit commit --amendเพิ่มการเปลี่ยนแปลงเพิ่มเติม (B) ดังนั้น git จึงคิดว่าคุณสามารถสูญเสียประวัติศาสตร์ - มันตีความ B เป็นการกระทำที่แตกต่างแม้ว่ามันจะมีการเปลี่ยนแปลงทั้งหมดจาก A

             B
            /
        ---X---A

ถ้าไม่มีใครเปลี่ยนแปลงหลังจากที่ซื้อคืนแล้วที่คุณสามารถทำได้Agit push --force

อย่างไรก็ตามหากมีการเปลี่ยนแปลงหลังจากAจากบุคคลอื่น:

             B
            /
        ---X---A---C

จากนั้นคุณจะต้อง rebase ที่บุคคลเปลี่ยนจากAเป็นB( C-> D)

             B---D
            /
        ---X---A---C

หรือแก้ไขปัญหาด้วยตนเอง ฉันไม่คิดว่าจะทำยังไง


7

ใช้คำสั่งนี้:

git pull --allow-unrelated-histories <nick name of repository> <branch name>

ชอบ:

git pull --allow-unrelated-histories origin master

ข้อผิดพลาดนี้เกิดขึ้นเมื่อโครงการไม่มีบรรพบุรุษร่วมกัน


7
git push -f origin master

ใช้กำลังดุร้าย ;-) ส่วนใหญ่แล้วคุณกำลังพยายามเพิ่มโฟลเดอร์ในเครื่องที่คุณสร้างขึ้นก่อนที่จะสร้าง repo บนคอมไพล์


2
คำตอบใด ๆ รวมถึงสิ่งนี้ควรมีคำเตือน
D. Ben Knoble

1
ฉันลองสิ่งนี้และมันทำให้ฉันต้องเสียค่าใช้จ่ายมากมายใน GitHub ซึ่งฉันต้องเรียกคืนจากโคลนในพื้นที่อื่นของ repo เป็นอันตราย
Paflow

6

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

git push -f origin master

จำไว้ว่าให้ยอมรับการเปลี่ยนแปลงของคุณก่อน:

git add .
git commit -m "Your commit message"


4

คุณต้องทำ

git branch

หากผลลัพธ์เป็นสิ่งที่ชอบ:

* (no branch)
master

จากนั้นทำ

git checkout master

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


4

! [ปฏิเสธ] หลัก -> หลัก (ไม่ใช่ไปข้างหน้าอย่างรวดเร็ว)

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

$ git ดึงต้นแบบของ myrepo

จากนั้นลองใหม่อีกครั้งและทุกอย่างควรจะดี:

$ git push github master


4

เรื่องนี้เกิดขึ้นกับฉันเมื่อฉันอยู่ในสาขาการพัฒนาและสาขาหลักของฉันไม่ได้มีการปรับปรุงล่าสุด

ดังนั้นเมื่อฉันพยายามคอมไพล์ดันจากการพัฒนาสาขาฉันมีข้อผิดพลาดนั้น

ฉันแก้ไขมันโดยเปลี่ยนเป็นสาขาหลักดึง git จากนั้นกลับไปพัฒนาสาขาและผลักดัน git

$ git fetch && git checkout master
$ git pull
$ git fetch && git checkout develop
$ git push

3

ฉันมีปัญหานี้กับเครื่องพัฒนา devสาขาการผลักดันดี แต่ที่masterสาขาให้ฉัน (ในขณะที่git pushไอเอ็นจีเมื่อการที่devสาขา):

! [rejected]        master -> master (non-fast-forward)

ดังนั้นฉันจึงพยายาม:

git checkout master
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.

ฉันพบสาขาหลักหายไป.git/configและเพิ่ม:

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

หลังจากนั้นgit pushก็ทำงานได้ดีที่devสาขา


2

รีโมทของฉันไม่ได้ซิงค์กับคนในพื้นที่ดังนั้นสิ่งนี้จึงใช้ได้สำหรับฉัน

git pull --rebase

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

สมมติว่าคุณมีอยู่แล้ว git remote add origin remote repository URL

ทำ

`git push origin master`  

ภาพหน้าจอบอกว่ามันทั้งหมด ป้อนคำอธิบายรูปภาพที่นี่

หรือคุณสามารถทำได้

  1. git stash (จัดเก็บงานที่ไม่ได้ทำงานชั่วคราว)
  2. git pull (ทำให้ข้อมูลท้องถิ่นและระยะไกลของคุณตรงกัน)
  3. git stash pop (กลับมาให้คุณได้รับการเปลี่ยนแปลงที่ไม่ธรรมดา)
  4. git push


1

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

1- git pull สิ่งนี้จะรวมรหัสของคุณจากที่เก็บของคุณไปยังรหัสของไซต์หลักของคุณ ดังนั้นจึงแสดงความขัดแย้ง

2- จัดการกับข้อขัดแย้งที่เกิดขึ้นเหล่านี้

3-

git push origin master

และโอมเพี้ยงปัญหาของคุณได้รับการแก้ไขแล้ว


0

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


ฉันเก็บสำรอง repo คอมไพล์ของฉันบน Dropbox เสมอ ด้วยวิธีนี้ฉันไม่ต้องลบ repo ในพื้นที่ฉันเพียงแค่คัดลอกและวางไดเรกทอรีที่เกี่ยวข้องจาก Dropbox เมื่อสถานการณ์เกิดขึ้น
IgorGanapolsky

0

หากใครมีข้อผิดพลาดนี้ในขณะที่พยายามที่จะผลักดันให้ heroku เพียงแค่แทนที่ 'ต้นกำเนิด' ด้วย 'heroku' เช่นนี้: git push -f heroku master



0

สิ่งนี้อาจเกิดขึ้นเนื่องจากข้อผิดพลาดชื่อบางอย่างเกิดขึ้นในขณะที่ให้ชื่อแก่ Repo หากคำตอบข้อใดข้อหนึ่งข้างต้นไม่ได้ผลนี่ใช้ได้กับฉัน:

ลบ repo นั้นและสร้างใหม่แล้วลองคำสั่งต่อไปนี้อีกครั้ง:

cd 'Local Directory Path'
git remote add origin *your_git_name.git*
git push -u origin master

หากแหล่งกำเนิดเพิ่มแสดงว่ามีอยู่แล้วให้ใช้สิ่งนี้แทน:

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