ไม่สามารถผลักดันไปที่ GitHub - บอกว่าต้องการรวม


743

ฉันใหม่เพื่อGitHub วันนี้ฉันพบปัญหาบางอย่างเมื่อฉันพยายามที่จะผลักดันรหัสของฉันไปที่ GitHub

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

ฉันยังไม่ได้ผลักสิ่งใดในที่เก็บดังนั้นทำไมฉันต้องดึงบางอย่าง


6
โปรดทราบว่าสิ่งนี้สามารถเกิดขึ้นได้สำหรับสาขาที่เยี่ยมชมก่อนหน้านี้ในพื้นที่ซึ่งมีความมุ่งมั่นในพื้นที่เก็บข้อมูลต้นน้ำ มีวิธีง่าย ๆ เพียงแค่กรอไปข้างหน้าเช่นสาขาเก่าหรือเพียงแค่ปล่อยให้คอมไพล์ลืมมันในพื้นที่เก็บข้อมูลท้องถิ่น?
Thorbjørn Ravn Andersen

50
@ ThorbjørnRavnAndersen - ฉันจัดการเพื่อแก้ไขสถานการณ์นี้โดยใช้ 'ดัน -f คอมไพล์' ซึ่งดูเหมือนจะทำให้คอมไพล์ลืมเกี่ยวกับปัญหาในจินตนาการของ :)
ระดับ

6
เห็นบ่นเกี่ยวกับเรื่องนี้จากผู้มาใหม่คอมไพล์ เหตุผลก็คือเมื่อพวกเขาสร้างโครงการใหม่ใน GitHub พวกเขาจะออกจากช่องทำเครื่องหมาย "เริ่มต้นด้วย readme" หรือเลือกตัวเลือก. gitignore / GPL ดังนั้นโครงการใหม่จึงมีความมุ่งมั่นที่พวกเขาไม่ได้อยู่ในพื้นที่ดังนั้นความสับสนที่เกิดจากข้อผิดพลาด
Ruslan Kabalin

4
@Echelon ตัวเลือก -f เพื่อบังคับให้กดเป็นอันตราย ฉันเพิ่งใช้มันในโปรเจ็กต์ของทีมและ 6 คอมมิชชันคือ "striped" เพียงแค่ลบออกจากเซิร์ฟเวอร์และไม่มีทางเอามันกลับคืนมา!
Deleplace

42
มันทันสมัยเพื่อสรรเสริญคอมไพล์ แต่นักพัฒนาซอฟต์แวร์เกือบทุกคนที่ฉันคุยด้วยเห็นด้วยเป็นการส่วนตัวว่าพวกเขาเกลียดคอมไพล์ ตอนนี้พวกเขาใช้คอมไพล์พวกเขาใช้เวลามากขึ้นในการควบคุมแหล่งเมื่อเทียบกับสิ่งที่พวกเขาเคยใช้เมื่อพวกเขาใช้ perforce หรือ TFS
นักพัฒนา

คำตอบ:


762

สิ่งนี้สามารถทำให้ที่เก็บข้อมูลรีโมตสูญเสียการคอมมิท ใช้ด้วยความระมัดระวัง

หากคุณไม่ต้องการผสานสาขาระยะไกลเข้ากับสาขาในพื้นที่ของคุณ (ดูความแตกต่างกับgit diff ) และต้องการใช้การพุชแบบบังคับให้ใช้คำสั่ง push ด้วย -f

git push -f origin <branch>

ที่originชื่อrepo ระยะไกลของคุณอยู่ที่ไหน

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


1
สิ่งนี้ใช้ได้สำหรับฉันสำหรับ repo ที่ฉันมีใน Github แต่ฉันมี submodule จาก Heroku ภายในแอปของฉัน และฉันต้องนำไฟล์ออกจาก submodule แล้วจึงผลักแอพที่อัปเดตไปยัง Heroku
JGallardo

24
ให้แน่ใจว่าคุณอ่านบรรทัดสุดท้ายของความคิดเห็นในโพสต์นี้! "สิ่งนี้อาจทำให้ที่เก็บระยะไกลสูญเสียการผูกมัดใช้ด้วยความระมัดระวัง" การบังคับใช้แรงผลักดันในสภาพแวดล้อมของทีมเป็นสิ่งที่อันตรายและโดยทั่วไปควรหลีกเลี่ยง
Adam Kalnas

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

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

สิ่งนี้ใช้ได้สำหรับฉัน ฉันได้พยายามแต่มันให้ความผิดพลาด$ git pull origin master -v fatal: refusing to merge unrelated historiesจากนั้นฉันก็ลองมันและมันก็ใช้งานได้และไฟล์ในเครื่องของฉันก็ปรากฏบน repo รีโมต github
Vir

238

ตามที่ข้อความบอกคุณ

รวมการเปลี่ยนแปลงระยะไกล (เช่น 'git pull')

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

ฉันจะให้ตัวอย่างและรูปภาพเพื่ออธิบาย สมมติว่าการดึงครั้งสุดท้ายของคุณจากต้นกำเนิด / สาขาอยู่ที่ Commit B คุณได้ทำงานแล้วเสร็จ (Commit C) ในขณะเดียวกันคนอื่นทำงานของพวกเขาเสร็จแล้วและผลักมันไปที่ต้นทาง / สาขา (Commit D) จะต้องมีการผสานระหว่างสองสาขานี้

local branch:                         --- Commit C 
                                    /
                                   /
                                  /
origin/branch: Commit A ------ Commit B ---- Commit D

เนื่องจากคุณเป็นคนที่ต้องการผลักดัน Git จึงบังคับให้คุณทำการผสาน หากต้องการทำเช่นนั้นคุณต้องดึงการเปลี่ยนแปลงจากต้นทาง / สาขาก่อน

local branch:                         --- Commit C -- Commit E
                                    /               /           
                                   /               /             
                                  /               /               
origin/branch: Commit A ------ Commit B ---- Commit D 

หลังจากเสร็จสิ้นการผสานตอนนี้คุณจะได้รับอนุญาตให้ส่งต่อต้นกำเนิด / สาขาไปยัง Commit E อย่างรวดเร็วโดยการกดการเปลี่ยนแปลงของคุณ

Git ต้องการให้คุณจัดการการรวมตัวเองเนื่องจากการผสานอาจนำไปสู่ความขัดแย้ง


7
ถ้าคุณไม่ต้องการรวม และปล่อยให้ D เป็นสาขาข้าง (อย่างน้อยตอนนี้) ต่อมาฉันอาจทำมากกว่านี้หลังจาก C อาจมีคนอื่นมอบหมายอีกหลังจาก D. มีความเร่งรีบในการผสานคืออะไร? ฉันจะผลักดันไซด์สาขาโดยไม่รวมกันได้อย่างไร ~~~
Steve Pitchers

3
local / branch และ origin / branch มีไว้เพื่อเป็นตัวแทนสาขาเดียวกัน แต่ใช้กับเครื่องจักรที่แตกต่างกัน (local vs origin); ที่จะผลักดันท้องถิ่น / สาขาคือการปรับปรุงที่มา / สาขา หากคุณต้องการให้สถานะของสาขาของคุณปรากฏแก่ผู้อื่น (เช่นที่จุดเริ่มต้น) แต่คุณไม่ต้องการผสานกับที่มา / สาขาคุณควรสร้างสาขาใหม่จากสาขา / ท้องถิ่น (สาขา git [ชื่อ]) และ ดันสาขานั้นให้กำเนิด (git push -u origin [ชื่อ])
Jake Greene

1
คำอธิบายที่ดี วิดีโอนี้แสดงการสาธิตสั้น ๆ ของปัญหาและวิธีแก้ไขตามที่ @ JakeGreene อธิบายรวมถึงสองวิธีในการหลีกเลี่ยงในตอนแรกเมื่อตั้งค่าที่เก็บใหม่
Kevin Markham

4
บางปีต่อมามันก็ดูเหมือนว่าคำตอบนี้เป็นอย่างมากคล้ายกับนี้อื่น ๆ
superjos

1
สำหรับผมยังพิมพ์git pull Already up-to-dateกลับกลายเป็นว่าฉันไม่ได้อยู่ในสาขาที่ฉันแม้ว่าฉันเป็น แต่สาขาหัวเดี่ยว (อาจจะมาจากการผสานล้มเหลว?) git branchนี้ก็เห็นได้ชัดหลังจากทำงาน หลังจากทำงานgit checkout mybranchทุกอย่างทำงานตามที่คาดไว้
คนที่

200

คุณได้ปรับปรุงรหัสของคุณก่อนที่จะผลักดัน?

ใช้git pull origin masterก่อนที่คุณจะผลักดันอะไร

ฉันสมมติว่าคุณใช้originเป็นชื่อสำหรับรีโมทของคุณ

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


1
ฉันจะรู้ชื่อที่เก็บได้อย่างไร เมื่อฉันพิมพ์git pull origin masterคอมไพล์บ่นว่า'origin' does not appear to be a git repository
ziyuang

3
'ต้นกำเนิด' เป็นรีโมท คุณสามารถใช้git remote --verboseเพื่อดูรีโมททั้งหมดที่กำหนดค่าไว้ในโฟลเดอร์ git ของคุณ ข้อมูลที่แสดงบนหน้าจอจะรวมถึงเส้นทาง "git@github.com" หรือเส้นทาง HTTPS ซึ่งคุณควรระบุตำแหน่งที่จะส่ง หวังว่านี่จะช่วยได้!
AYK

16
git pull origin masterแสดงทันสมัยแล้ว แต่แล้วเมื่อพยายามที่จะผลักดัน origin_branch นี้พูดคำเตือนเดียวกันที่กล่าวถึงในคำถาม ข้อเสนอแนะใด ๆ !!
CoDe

2
@Shubh คุณเคยแก้ปัญหาหรือไม่ ฉันได้รับสิ่งเดียวกัน!
OriginalAlchemist

3
@OriginalAlchemist ใช่.. เนื่องจากฉันเป็นนักพัฒนาซอฟต์แวร์ที่ทำงานที่สาขาในพื้นที่ห่างไกล ... ดังนั้นฉันจึงได้ผลักดันสาขาในพื้นที่ .. และแทนที่การเปลี่ยนแปลงทั้งหมดของสาขาที่เปิดอยู่บนเซิร์ฟเวอร์ด้วยการเปลี่ยนแปลงของฉันจากระบบภายใน git push -f <remote> <branch>เช่นgit push origin <your_local_branch>ตรวจสอบกระทู้นี้
CoDe

122

โดยปกติจะเกิดขึ้นเมื่อคุณgit commitและพยายามที่จะgit pushเปลี่ยนแปลงก่อนgit pullingในสาขาxที่มีคนอื่นได้ทำการเปลี่ยนแปลงแล้ว

การไหลปกติจะเป็นด้านล่าง

ขั้นตอนที่ 1 : git stashการเปลี่ยนแปลงที่ไม่มีข้อผูกมัดในท้องถิ่นของคุณในสาขานั้น

ขั้นตอนที่ 2 : git pull origin branch_name -vไปpull and mergeที่การเปลี่ยนแปลงที่ทำไว้บนโลคอลนั้น ( ให้รวมข้อความนี้และแก้ไขข้อขัดแย้งหากมี )

ขั้นตอนที่ 3 : git stash popการstashเปลี่ยนแปลง ed ( จากนั้นคุณสามารถคอมมิตไฟล์ popped หากคุณต้องการหรือผลักดันการเปลี่ยนแปลงที่กระทำแล้ว (STEP4) ก่อนและทำการคอมมิทใหม่กับไฟล์ในภายหลัง )

ขั้นตอนที่ 4 : git push origin branch_name -vการเปลี่ยนแปลงที่ถูกผสาน

แทนที่branch_nameด้วยmaster(สำหรับmasterสาขา)


3
อยู่commitที่ไหน คุณไม่ควรทำการเปลี่ยนแปลงหลังจากนั้นstash popหรือ
mehmet

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

51

โซลูชั่นแรกและเรียบง่าย (ไม่แนะนำ)

  • ลองคำสั่งgit push -f origin masterนี้
  • คำสั่งนี้จะเขียนทับพื้นที่เก็บข้อมูลระยะไกล (GitHub)

วิธีแก้ปัญหาที่แนะนำ

  • รันคำสั่งเหล่านี้:
git pull --allow-unrelated-histories  //this might give you error but nothing to worry, next cmd will fix it
git add *
git commit -m "commit message"
git push

หากวิธีนี้ใช้ไม่ได้ให้ทำตาม🔰

  • ลบ.gitไดเรกทอรีออกจากโฟลเดอร์
  • จากนั้นดำเนินการคำสั่งเหล่านี้:

    git init
    git add .
    git commit -m "First Commit"
    git remote add origin [url]
    git push -u origin master
    

หรือ

git push -f origin master 

ใช้git push -f origin masterหาก-uไม่ได้ผลสำหรับคุณเท่านั้น

วิธีนี้จะช่วยแก้ไขข้อผิดพลาดเกือบทุกประเภทที่เกิดขึ้นขณะทำการพุชไฟล์ของคุณ


4
การลบ repo git ของคุณและทำให้ประวัติการคอมมิชชันทั้งหมดของคุณหายไปเป็นโซลูชัน "แนะนำ" หรือไม่ ดูเหมือนว่ารีบร้อน
Nils Guillermin

@Nils Guillermin มันขึ้นอยู่กับสถานการณ์ของคุณ ถ้าฉันกำลังทำงานในโครงการขนาดใหญ่ที่ฉันต้องแก้ไขข้อขัดแย้งการผสานทั้งหมดฉันจะใช้ vscode เพื่อตรวจสอบและรวมการเปลี่ยนแปลงทั้งหมดได้อย่างง่ายดาย ขอบคุณสำหรับความคิดเห็นของคุณ
Smit Patel

47

บางครั้งเราลืมการดึงและทำงานหลายอย่างในสภาพแวดล้อมท้องถิ่น

หากมีคนต้องการที่จะผลักโดยไม่ต้องดึง

git push --force

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



2
สิ่งนี้ใช้ได้กับฉัน: โครงการส่วนบุคคลที่มีผู้ทำงานร่วมกันอีก 0 คน ฉันได้ลอง "วิธีแก้ปัญหา" ที่แนะนำอื่น ๆ ที่นี่ใน SO ซึ่งไม่มีการแก้ไขสิ่งที่เป็นปัญหาที่ง่ายมาก: ฉันได้ทำในท้องถิ่นreset --hardเพื่อการกระทำที่มีอายุมากกว่าแล้วทำอีกสองสามครั้ง จากนั้นฉันแค่อยากจะpushแต่ repo ระยะไกลไม่ได้เตรียมที่จะให้ฉัน WarrenP สามารถช่วยผู้เรียนคอมไพล์ได้โดยมีรูนน้อยลง บางทีเขาอาจไม่ต้องการ
mike rodent

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

35

คุณบางคนอาจได้รับข้อผิดพลาดนี้เพราะ Git ไม่ทราบว่าคุณกำลังพยายามสาขาใด

หากข้อความผิดพลาดของคุณยังรวมถึง

error: failed to push some refs to 'git@github.com:jkubicek/my_proj.git'
hint: Updates were rejected because a pushed branch tip is behind its remote
hint: counterpart. If you did not intend to push that branch, you may want to
hint: specify branches to push or set the 'push.default' configuration
hint: variable to 'current' or 'upstream' to push only the current branch.

จากนั้นคุณอาจต้องการทำตามคำแนะนำที่มีประโยชน์จาก Jim Kubicek, กำหนดค่า Git เป็น Only Push สาขาปัจจุบันเพื่อตั้งค่าสาขาเริ่มต้นเป็นปัจจุบัน

git config --global push.default current

32
git pull origin branch_name --rebase

สิ่งนี้ใช้ได้ผลสำหรับฉัน - คำสั่งgit pull origin branch_name --rebaseจะดึงการเปลี่ยนแปลงจาก remote branch_name ตอนแรกจากนั้นrebaseแยกสาขาปัจจุบันที่ด้านบนสุดของมัน


20

นอกจากคำตอบข้างต้นแล้วคำสั่งต่อไปนี้ใช้ได้กับฉัน: -

สถานการณ์ -

  1. ฉันผลักmy_branchให้ประสบความสำเร็จ
  2. ฉันทำการเปลี่ยนแปลงเพิ่มเติมเล็กน้อย
  3. เมื่อฉันพยายามที่จะผลักดันอีกครั้ง (หลังจากทำเพิ่มกระทำแน่นอน) ฉันได้รับข้อผิดพลาดดังกล่าวข้างต้น

สารละลาย -

 1. git checkout **my_branch**
 2. git add, commit your changes.
 3. git pull origin **my_branch** (not origin, master, or develop)
 4. git push origin **my_branch**

พิสูจน์


1
คุณช่วยฉัน ฉันมีเวลายากที่จะสังเกตเห็นว่าฉันจำเป็นต้องเช็คเอาท์ไปยังสาขาอื่นและดึงมันจากระยะไกลแม้ว่าฉันจะดึงสาขาอื่นโดยใช้--allธง
MZanetti

18

ฉันมีปัญหาเดียวกันสิ่งที่ฉันทำคือฉันผลักมันเป็นครั้งแรกโดยการใช้สิ่งนี้

git push --force

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


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

3
git push --set-upstream origin master --force
ตำนาน

1
วิธีที่ยอดเยี่ยมในการทำลายพื้นที่เก็บข้อมูล หากคุณบังคับให้คุณจะทำลายประวัติศาสตร์ นอกจากนี้ยังมีฐานการติดตั้งโค้ด git จำนวนมากที่ไม่อนุญาตให้คุณทำ
Oliver Dixon

นี่คือคำตอบที่ซ้ำกันและต้นฉบับไม่ได้เป็นคำแนะนำที่ดี
moopet

นี่คือสิ่งที่ฉันต้องการจะทำ แต่ฉันเพิ่งลองกับ Gitlab และ Gitlab ไม่อนุญาตสิ่งนี้ใน "กิ่งป้องกัน" โดยการออกแบบ
jeffery_the_wind

13

ที่ผมกล่าวถึงนี้ในการกวดวิชาของฉันวิธีการใช้ GitHub: กวดวิชาสำหรับผู้เริ่มต้น

เมื่อคุณสร้างที่เก็บใหม่บน GitHub GitHub อาจขอให้คุณสร้างไฟล์ readme หากคุณสร้างไฟล์ readme โดยตรงบน GitHub คุณจะต้องทำการร้องขอ 'pull' ก่อนที่คำขอ 'push' จะประสบความสำเร็จ คำสั่งเหล่านี้จะ 'ดึง' ที่เก็บระยะไกลรวมกับไฟล์ปัจจุบันของคุณแล้ว 'ดัน' ไฟล์ทั้งหมดกลับไปที่ GitHub:

git pull https://github.com/thomas07vt/MyFirstRepo.git master

git push https://github.com/thomas07vt/MyFirstRepo.git master

ฉันรู้ว่านี่เป็นอีกหนึ่งปีต่อมา แต่จากคำตอบทั้งหมดนี้คุณเป็นคนเดียวที่อธิบายได้ว่าทำไมฉันถึงมีปัญหาในวันที่ 1 ด้วย github ความแตกต่างระหว่างการดึงและดึงข้อมูลคืออะไร?
Xander Luciano

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

6

ฉันได้รับข้อความแสดงข้อผิดพลาดดังกล่าวข้างต้นเมื่อฉันพยายามผลักสาขาปัจจุบันของฉันfoobar:

git checkout foobar
git push origin foo

ปรากฎว่าฉันมีสองสาขาในพื้นที่ติดตามสาขาระยะไกลเดียวกัน:

foo -> origin/foo (some old branch)
foobar -> origin/foo (my current working branch)

มันทำงานให้ฉันผลักดันสาขาปัจจุบันของฉันโดยใช้:

git push origin foobar:foo

... และทำความสะอาดด้วย git branch -d


6

git push -f กำเนิดbranchname

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


5
นี่เป็นคำตอบที่ซ้ำซ้อน
moopet

5

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

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

สำหรับคนที่จะบอกฉันว่าสิ่งนี้ไม่เหมาะสมหากไม่มีการอ้างถึงผลกระทบใด ๆ หรือคนที่บอกให้ฉันใช้คำสั่งที่ทำให้ฉันรำคาญใจในอนาคตฉันพูดว่า: "วิธีนี้ใช้เวลาน้อยกว่า 10 วินาที" หากฉันพบคำสั่ง git ที่ใช้เวลาน้อยกว่า 10 วินาทีในการดำเนินการและมีผลเหมือนกันแน่นอนฉันจะยอมรับสิ่งนั้น ก่อนหน้านี้ฉันใช้วิธีนี้

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


4

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


1
และฉันก็มีสิ่งที่คล้ายกันซึ่งฉันจำคำสั่งก่อนหน้าได้ซึ่งเป็นแหล่งเก็บข้อมูลที่แตกต่างอย่างสิ้นเชิง!
Clare Macrae

4

ฉันประสบปัญหาเดียวกันมากและกลับกลายเป็นว่าฉันอยู่ในสาขา (ท้องถิ่น) ที่แตกต่างจากที่ฉันคิดว่าเป็นและสาขาในท้องถิ่นที่ถูกต้องอยู่ด้านหลังจากระยะไกล

ทางออกของฉัน: ชำระเงินสาขาที่ถูกต้องเชอร์รี่เลือกกระทำจากสาขาท้องถิ่นอื่น ๆ ดึง git และ git push


4

ฉันมีปัญหาที่คล้ายกันและปรากฎว่าเวิร์กโฟลว์ของฉันที่ทำให้สาขาของฉันทันสมัยเป็นความผิด ฉันกำลังทำสิ่งต่อไปนี้:

ใน 'ต้นแบบ' ในพื้นที่ของฉัน

git fetch upstream
git merge upstream/master --ff-only

จากนั้นกลับมาที่สาขาท้องถิ่นของฉัน

git rebase master

สิ่งนี้ใช้ได้ดีสำหรับโฟลว์คอมไพล์ก่อนหน้า แต่ไม่สามารถใช้กับ GitHub ได้ git rebaseเป็นปัญหาที่นี่ก่อให้เกิดปัญหาเกี่ยวกับการซิงค์ (และฉันจะยอมรับว่าสิ่งที่ผมได้มีการยอมรับโดยไม่เข้าใจอย่างเต็มที่) และโชคร้ายที่ทำให้ฉันอยู่ในตำแหน่งที่git push -fกลายเป็นน่าจะเป็นตัวเลือกที่ง่ายที่สุด ไม่ดี.

โฟลว์ใหม่ของฉันคือการอัพเดทสาขาโดยตรงโดยใช้git mergeดังต่อไปนี้:

ในสาขาท้องถิ่นของฉัน

git fetch upstream
git merge upstream/master

ไม่มีการกรอไปข้างหน้าเพราะฉันจะทำการเปลี่ยนแปลงแน่นอนในสาขาท้องถิ่น

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


3

ในกรณีของฉันฉันมี "mybranch" เช็คเอาท์และทำไปgit pullแล้วดังนั้นฉันจึงไม่สามารถทราบได้ว่าทำไมการกดไม่ทำงาน ในที่สุดฉันก็รู้ว่าฉันกำลังผลักสาขาผิด ผมได้รับการพิมพ์แทนgit push origin mastergit push origin mybranch

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


3

ชื่อสาขาของคุณเหมือนกับชื่อสาขาระยะไกลหรือไม่

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

สมมติว่าสาขาระยะไกลที่คุณต้องการผลักดันคือ [ ทดสอบ ] และสาขาในพื้นที่ของคุณชื่อเป็น [ ทดสอบ ]

หากคุณไม่ได้อยู่ในสาขาการทดสอบให้เปลี่ยนไปใช้ก่อน

git checkout test

แล้วเปิดสาขาใหม่และชื่อการทดสอบ

git checkout -b testing

ตอนนี้ถึงเวลาผลักดัน:

git push [remote repo] testing

2
เพียงใช้$git branch -M <new_name>เพื่อเปลี่ยนชื่อสาขาท้องถิ่น
coms

3

ฉันได้แก้ไขปัญหานี้แล้วที่ที่เก็บ GIT ของฉัน ไม่จำเป็นต้องทำrebaseหรือforceกระทำในกรณีนี้ ใช้ขั้นตอนด้านล่างเพื่อแก้ไขปัญหานี้ -

local_barnch> git branch --set-upstream to=origin/<local_branch_name> 

local_barnch>git pull origin <local_branch_name>

local_barnch> git branch --set-upstream to=origin/master

local_barnch>git push origin <local_branch_name>

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


2

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


2

ผมได้รับข้อผิดพลาดที่คล้ายกันขณะที่ผลักดันการเปลี่ยนแปลงล่าสุดไปเป็นที่เก็บ Git เปลือยที่ฉันใช้สำหรับgitweb ในกรณีของฉันฉันไม่ได้ทำการเปลี่ยนแปลงใด ๆ ในที่เก็บเปลือยดังนั้นฉันเพียงแค่ลบที่เก็บเปล่าของฉันและโคลนอีกครั้ง:

git clone --bare <source repo path> <target bare repo path>

2

หากคุณแน่ใจว่าไม่มีใครเปลี่ยนแปลงที่เก็บ git ของคุณและคุณกำลังทำงานกับเวอร์ชั่นล่าสุดgit pullอย่าเข้าใจว่าเป็นทางออกในหัวใจของคุณ ...

ถ้าอย่างนั้นนี่อาจเป็นสิ่งที่เกิดขึ้นคุณใช้ git commit --amend

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

กวดวิชา ATLASSIAN: เขียนประวัติใหม่

อย่างไรก็ตามไม่แนะนำให้ดำเนินการgit commit --amend หากคุณได้ส่งการกระทำไปยัง GitHubแล้วเนื่องจาก "การแก้ไขไม่ได้เปลี่ยนแค่การคอมมิทล่าสุด - มันจะแทนที่มันอย่างสิ้นเชิงสำหรับ Git มันจะดูเหมือนการคอมมิทใหม่" ซึ่งหมายถึงนักพัฒนาซอฟต์แวร์คนอื่นบน GitHub ของคุณประวัติดูเหมือน A-> B-> C แต่สำหรับคุณมันดูเหมือน A-> B-> D ถ้า GitHub ให้คุณpushทุกคนอื่นจะต้องแก้ไขประวัติด้วยตนเอง

นี่คือเหตุผลว่าทำไมคุณได้รับข้อความแสดงข้อผิดพลาด! [rejected] master -> master (non-fast-forward)ถ้าคุณรู้ว่าไม่มีใครได้ดึงการเปลี่ยนแปลงล่าสุดของคุณคุณสามารถทำgit push --forceเช่นนี้จะเปลี่ยนประวัติศาสตร์คอมไพล์ใน repo มิฉะนั้น ... คุณสามารถแสดงgit pullได้ แต่ฉันเชื่อว่าสิ่งนี้จะมีผลเช่นเดียวกันกับที่คุณไม่ได้ทำgit commit --amendมันจะสร้างคอมมิทใหม่ (เช่น: ประวัติ git หลังจากดึง git: A-> B-> C-> D )

สำหรับรายละเอียดเพิ่มเติม: วิธีเปลี่ยนการส่งมอบครั้งล่าสุดของคุณ


2

ตัวเลือกอื่น: เปลี่ยนชื่อสาขาของคุณเป็นสิ่งใหม่

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

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

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

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


1

ปัญหาเกี่ยวกับคำสั่ง push คือว่าที่เก็บข้อมูลโลคัลและรีโมตของคุณไม่ตรงกัน หากคุณเริ่มต้น readme โดยค่าเริ่มต้นเมื่อสร้างพื้นที่เก็บข้อมูลใหม่จากฮับ git แล้วสาขาหลักจะถูกสร้างขึ้นโดยอัตโนมัติ อย่างไรก็ตามเมื่อคุณพยายามที่จะผลักดันที่ไม่มีสาขาใด ๆ คุณไม่สามารถผลักดัน ... ดังนั้นวิธีปฏิบัติที่ดีที่สุดคือสร้าง repo โดยไม่ต้องกำหนดค่าเริ่มต้น readme


1

ปัญหานี้มักจะเกิดจากการสร้างไฟล์ readme.md ซึ่งนับว่าเป็นคอมมิชชันไม่ซิงโครไนซ์แบบโลคัลบนระบบและไม่มีอยู่ด้านหลังส่วนหัวดังนั้นจึงแสดงคำร้องขอ git pull คุณสามารถลองหลีกเลี่ยงไฟล์ readme แล้วลองคอมมิท มันทำงานในกรณีของฉัน


0

สาเหตุของปัญหานี้อีกประการหนึ่ง (ดูเหมือนจะไม่ธรรมดา) ...

เซิร์ฟเวอร์ของฉันล้าหลัง ~ 12 ชั่วโมงเมื่อฉันกด

ฉันกำหนดค่า NTP บนเซิร์ฟเวอร์ SYNC นาฬิกาของฉัน

ฉันทำการกด git ใหม่ซึ่งทำให้เกิดข้อผิดพลาดที่กล่าวถึงในโพสต์นี้


0

หากมีโอกาสgit pullพิมพ์ออกAlready up-to-dateมาคุณอาจต้องการตรวจสอบ git push.defaultparam ทั่วโลก(ใน~/.gitconfig) ตั้งเป็นsimpleถ้ามันเป็นmatchingมา คำตอบด้านล่างอธิบายว่าทำไม:

Git - ความแตกต่างระหว่าง push.default "การจับคู่" และ "ง่าย" คืออะไร

นอกจากนี้ควรตรวจสอบว่าสาขาในประเทศของคุณล้าสมัยgit remote show originและใช้งานได้หากจำเป็น


0

ใช้git pull https://github.com/username/repository เป็นเพราะ Github และที่เก็บข้อมูลระยะไกลไม่ได้ซิงค์กัน หากคุณpullrepo แล้วPushทุกอย่างจะซิงค์และข้อผิดพลาดจะหายไป

`


0

git pull พิมพ์แล้ว up-to-date

สารละลาย:

คุณอาจจะสร้างที่เก็บ / โครงการในระยะไกล (เซิร์ฟเวอร์) และเพิ่มไฟล์บางส่วนที่นั่นจากนั้นสร้างโฟลเดอร์ใหม่ในคอมไพล์ของคุณและเริ่มต้นgit init- นี่คือความผิดพลาดคุณไม่ควรสร้างgit initในท้องถิ่นแทนการโคลนโครงการในท้องถิ่นของคุณ การใช้git clone

จากนั้นดึง

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