! [ปฏิเสธ] master -> master (ดึงข้อมูลก่อน)


106

มีวิธีที่ดีในการอธิบายวิธีแก้ไข " ! [rejected] master -> master (fetch first)'" ใน Git หรือไม่

เมื่อฉันใช้คำสั่งนี้ $ git push origin masterจะแสดงข้อความแสดงข้อผิดพลาด

! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'git@github.com:zapnaa/abcappp.git'

คำตอบ:


137

คำตอบอยู่ที่นั่น git กำลังบอกให้คุณดึงข้อมูลก่อน

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

หากคุณไม่ทำ (หรือแย่กว่านั้นถ้าคุณบังคับโดยใช้--forceตัวเลือกนี้) คุณอาจทำให้ประวัติการกระทำผิดพลาดได้

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

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

TL; ดร

  1. หากต้องการแก้ไขให้ดึงข้อมูลก่อน (แล้วรวม)
  2. หากคุณต้องการแฮ็คให้ใช้--forceตัวเลือก

คุณถามหาอดีตแม้ว่า ไป 1) เสมอแม้ว่าคุณจะใช้ git ด้วยตัวเองเสมอเพราะมันเป็นแนวทางปฏิบัติที่ดี


5
ไม่สามารถเรียกลบการเปลี่ยนแปลงที่สำคัญในไฟล์ในเครื่องได้หรือไม่?
Leonardo Castro

2
มันไม่เปลี่ยนแปลงหลังจากการดึงข้อมูล
dhein

@dhein ตามที่ฉันเขียนการดึงข้อมูลจะต้องตามด้วยการผสาน - ประเด็นคือคุณต้อง "จัดแนว" ต้นไม้ในพื้นที่กับทรีระยะไกล (ด้วยเหตุนี้การผสาน) - แต่ขอบคุณฉันเขียนไว้ใน TL; DR ด้วย
linuxbandit

93

ลอง:

git fetch origin master
git merge origin master

หลังจากเขียนรหัสนี้ฉันได้รับข้อผิดพลาดอื่น ๆ : (ไม่ใช่การกรอไปข้างหน้า)

ฉันเขียนรหัสนี้:

git fetch origin master:tmp
git rebase tmp
git push origin HEAD:master
git branch -D tmp

และแก้ไขปัญหาของฉัน


เหมือนกับฉัน. นั่นช่วยแก้ปัญหาของฉันได้ มีคำเตือนสองสามข้อ ฉันสับสนกับที่เก็บย่อย แต่แก้ไขด้วยสิ่งนี้: stackoverflow.com/questions/19584255/…
M. Beausoleil

1
@Aurelio git merge masterคำสั่งผสานของคุณไม่ถูกต้องก็ควรจะ
ไมค์

ทำไมเราต้องใช้ git branch -D tmp?
МилошВељковић

28

คุณควรใช้ git pullคำสั่งนั้นทำgit fetchและทำต่อไปgit merge.

หากคุณใช้git push origin master --forceคำสั่งคุณอาจมีปัญหาในอนาคต


1
ถูกต้องหรือไม่ที่คุณควรใช้ - บังคับถ้าคุณเป็นคนเดียวในโครงการและคุณรู้สึกท้อแท้ในการพยายามผลักดันครั้งแรก
chrips

21

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

git init
git add README.md
git add .
git commit -m "first commit"
git remote add origin https://github.com/userName/repoName.git
git push --force origin master

ได้ผลสำหรับฉันฉันเริ่มโครงการใหม่อีกครั้ง (repo เดียวกัน) และฉันต้องการแทนที่
ucotta

18

ลองใช้คำสั่ง git นี้

git push origin master --force

หรือขาดแรง -f

git push origin master -f


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

10

ตามที่ระบุไว้ในข้อความแสดงข้อผิดพลาดคุณต้อง "ดึงข้อมูลก่อน" สิ่งนี้ได้ผลสำหรับฉัน ใช้คำสั่ง:

  1. git fetch origin master

จากนั้นทำตามขั้นตอนเหล่านี้เพื่อรวม:

  1. git pull origin master
  2. git add .
  3. git commit -m 'your commit message'
  4. git push origin master


3

คุณสามารถใช้คำสั่งต่อไปนี้: ขั้นแรกให้โคลนสำเนา repo ของคุณใหม่โดยใช้แฟล็ก --mirror:

$ git clone --mirror git://example.com/some-big-repo.git

จากนั้นทำตามรหัสตาม:

การเพิ่มโปรเจ็กต์ที่มีอยู่ใน GitHub โดยใช้บรรทัดคำสั่ง

แม้ว่าจะไม่ได้ผลคุณก็สามารถเขียนโค้ด:

$ git push origin master --force 

หรือ

$ git push origin master -f

3

ทำตามขั้นตอนที่ระบุด้านล่างเนื่องจากฉันมีปัญหาเดียวกัน:

$ git pull origin master --allow-unrelated-histories 

(เพื่อดูว่าสาขาในพื้นที่สามารถรวมเข้ากับรีโมตได้อย่างง่ายดายหรือไม่)

$ git push -u origin master 

(ตอนนี้พุชเนื้อหาทั้งหมดของที่เก็บ git ในเครื่องไปยังที่เก็บออนไลน์ของคุณ)


2

มีแนวโน้มว่าจะมีคนอื่น (เช่นเพื่อนร่วมงานของคุณ) กระทำorigin/masterสิ่งนั้นที่ไม่ได้อยู่ในmasterสาขาในพื้นที่ของคุณและคุณกำลังพยายามผลักภาระบางอย่างจากสาขาในพื้นที่ของคุณไปยังเซิร์ฟเวอร์ ใน 99% ของกรณีสมมติว่าคุณไม่ต้องการลบงานของพวกเขาoriginคุณมีสองทางเลือก:

2) รวมการเปลี่ยนแปลงเข้ากับสาขาในพื้นที่ของคุณจากนั้นผลักดันผลลัพธ์ที่ผสาน git checkout master git pull # resolve conflicts here git push

(โปรดทราบว่าgit pullโดยพื้นฐานแล้วเป็นเพียง a git fetchและ a git mergeในกรณีนี้)

1) ปรับฐานสาขาในพื้นที่ของคุณใหม่เพื่อให้ดูเหมือนว่าเพื่อนร่วมงานของคุณให้คำมั่นสัญญาก่อนจากนั้นคุณก็ทำตามสัญญา ซึ่งจะช่วยให้ประวัติการคอมมิตดีและเป็นเชิงเส้น - และหลีกเลี่ยง "การรวมคอมมิต" อย่างไรก็ตามหากคุณมีความขัดแย้งกับการเปลี่ยนแปลงของเพื่อนร่วมงานคุณอาจต้องแก้ไขความขัดแย้งเหล่านั้นสำหรับการกระทำแต่ละครั้งของคุณ (แทนที่จะทำเพียงครั้งเดียว) ในกรณีที่เลวร้ายที่สุด โดยพื้นฐานแล้วสิ่งนี้ดีกว่าสำหรับคนอื่น ๆ แต่มีความพยายามมากกว่าสำหรับคุณ git pull --rebase # resolve conflicts here git push

(สังเกตว่าgit pull --rebaseโดยพื้นฐานแล้วคือ a git fetchและ a git rebase origin/master.)



1

ข้อผิดพลาดของคุณอาจเป็นเพราะสาขาการผสาน
เพียงทำตามนี้:

ขั้นตอนที่ 1: git pull origin master(ในกรณีที่คุณได้รับข้อความใด ๆ ให้เพิกเฉย)
ขั้นตอนที่ 2: git add .
ขั้นตอนที่ 3: git commit -m 'your commit message'
ขั้นตอนที่ 4:git push origin master


1

ขั้นแรกคุณควรใช้git pullจากนั้นสั่งให้ทำgit fetchและทำการผสานคอมไพล์ต่อไป

หากคุณใช้git push origin master --forceคำสั่งคุณอาจมีปัญหาในอนาคต


1

ฉันเอาชนะสิ่งนี้ได้โดยการตรวจสอบสาขาใหม่เช่นนี้:

# git checkout -b newbranch <SHA of master>

# git branch
* newbranch
  master

# git push -u <repo_url_alias> newbranch

คุณจะเหลือ 2 สาขา: Master และ Newbranch ที่คุณสามารถจัดการเพื่อรวมในภายหลังได้


1

สาเหตุที่เกิดขึ้นในกรณีของฉันคือเมื่อสร้างลิงก์ตัวแทน GitHub ฉันเริ่มต้นด้วย ไฟล์ README

ในขณะที่สร้าง Git remote อย่าเริ่มต้นด้วยไฟล์ README มิฉะนั้นจะแสดงข้อผิดพลาด

อย่าทำอย่างนั้นและมันจะทำงานได้ดีอย่างแน่นอนแทนที่จะเริ่มต้นด้วยไฟล์ readme หากคุณต้องการหลังจากกดไปที่สาขาหลัก


0

คุณต้องระบุชื่อสาขาของคุณพร้อมกับชื่อระยะไกลของคุณ

git fetch origin
git merge origin/master

0

สิ่งนี้ใช้ได้ผลสำหรับฉันเนื่องจากไม่มีวิธีแก้ปัญหาอื่นใดที่ใช้ได้ผลกับฉัน ไม่ถึงกับบังคับ!

https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/resolving-a-merge-conflict-using-the-command-line

ต้องผ่าน Git Bash

cd REPOSITORY-NAME
git add .
git commit -m "Resolved merge conflict by incorporating both suggestions."

จากนั้นกลับไปที่ cmd ของฉันและฉันทำได้: git push heroku masterซึ่งในกรณีของฉันคือปัญหา



0

ใส่คำอธิบายภาพที่นี่

! [ปฏิเสธ] ข้อผิดพลาดหลัก -> หลัก (ดึงข้อมูลก่อน): ล้มเหลวในการส่งการอ้างอิงไปที่

ใส่คำอธิบายภาพที่นี่

แก้ไขปัญหาสำเร็จโดยใช้คำสั่ง --force ดังนั้นคุณต้องใช้
git push origin master --force





-1

แก้ไขปัญหา

ปัญหาที่ฉันมี

! [rejected]        master -> master (non-fast-forward) error: failed to push some refs to 'https://github.com/repo_name/repo-hint: Updates were rejected because the tip of your current branch is behind hint: its remote counterpart. Integrate the remote changes (e.g.hint: 'git pull ...') before pushing again. hint: See the 'Note about fast-forwards' in 'git push --help' for details.

ฉันก็มีปัญหาเดียวกัน ปัญหาคือcommitsในที่เก็บอื่นของคุณไม่สำเร็จpushedดังนั้นคุณต้องรันคำสั่งต่อไปนี้:

  1. git fetch origin master

    เอาต์พุต: From https://github.com/username/repo-name * branch master -> FETCH_HEAD

  2. git merge origin master

    เอาต์พุต: Merge made by the 'recursive' strategy. repo-name/ReadMe.md | 1 - 1 file changed, 1 deletion(-)

  3. git push

    เอาต์พุต: Enumerating objects: 8, done. Counting objects: 100% (8/8), done. Delta compression using up to 8 threads Compressing objects: 100% (6/6), done. Writing objects: 100% (6/6), 1.00 KiB | 1.00 MiB/s, done. Total 6 (delta 2), reused 0 (delta 0) remote: Resolving deltas: 100% (2/2), completed with 1 local object. To https://github.com/user_name/repo-name.git 0852d5vf..70v56d9 master -> master

ขอบคุณมาก


-1

ฉันคิดว่าเป็นเพราะการเชื่อมต่อ แต่ฉันใช้สิ่งนี้:

git push - บังคับต้นแบบต้นทาง


--forcemessup gitจะส่งประวัติมันจะไม่ดีที่จะใช้มัน
จันดาน

-2

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

git push -f ต้นแบบต้นทาง

และจะทำให้งานของคุณลุล่วง

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