สาขาของคุณอยู่ก่อนหน้า 'ต้นทาง / หลัก' โดย 3 คอมมิท


354

ฉันได้รับสิ่งต่อไปนี้เมื่อทำงาน git status

Your branch is ahead of 'origin/master' by 3 commits.

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


19
ฉันไม่คิดว่ามันจะซ้ำกัน ... คำถามนี้ถามว่ามันหมายความว่าอย่างไรในขณะที่คำถามอื่น ๆ กำลังถามถึงวิธีการยกเลิกการเปลี่ยนแปลง
onionjake

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

4
ผมต้องบอกว่าคำถามที่เชื่อมโยงกับข้างต้นไม่ได้จริงๆที่ซ้ำกันของคำถามนี้ ...
เดฟ Kanter

15
@DerekGreer: สิ่งนี้ถูกทำเครื่องหมายว่าซ้ำกันอย่างไร เพราะคนส่วนใหญ่ที่ทำเครื่องหมายคำถามว่าซ้ำซ้อนไม่ได้รำคาญที่จะอ่านและเข้าใจคำถามจริงๆ หากมีความคล้ายคลึงกันเพียงผิวเผินพวกเขาจะกระโดดไปสู่ข้อสรุปว่าทั้งสองเหมือนกันและจะขึ้นอยู่กับ OP หรือคนอื่น ๆ ที่ยินดีที่จะใช้เวลาอย่างรอบคอบในการทำซ้ำสิ่งที่ควรจะชัดเจนในตอนแรกถ้า ผู้ล่อเหยื่อล่อให้ความสนใจ
iconoclast

6
^^^ การฝึกที่ฆ่า SO, IMO
หุ้น Geek

คำตอบ:


766

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

  • ในเวิร์กโฟลว์ที่ดีสำเนาต้นแบบระยะไกลของคุณควรเป็นสำเนาที่ดีในขณะที่สำเนาต้นแบบภายในเครื่องของคุณเป็นเพียงสำเนาของต้นแบบระยะไกล การใช้เวิร์กโฟลว์นี้คุณจะไม่ได้รับข้อความนี้อีก
  • หากคุณทำงานในอีกทางหนึ่งและควรผลักดันการเปลี่ยนแปลงในท้องถิ่นของคุณดังนั้นเพียงแค่git push originสมมติว่า Origin เป็นรีโมทของคุณ
  • หากการเปลี่ยนแปลงในเครื่องของคุณไม่ดีให้ลบหรือรีเซ็ตต้นแบบท้องถิ่นของคุณเป็นสถานะบนรีโมต git reset --hard origin/master

82
การรีเซ็ต git - แหล่งกำเนิด / ต้นแบบที่แท้จริงคือสิ่งที่ฉันกำลังมองหา ขอบคุณ
FluxEngine

4
@iberbeu คุณแก้ไขวันของฉัน ... git รีเซ็ต - ต้นกำเนิดยาก / โทเป็นสิ่งที่ฉันกำลังมองหา +1 แล้ว
Ravi

75
รวมทั้ง fwiw git diff master origin/master(เช่นgit diff local remote) เพื่อดูการเปลี่ยนแปลงที่คุณจะถูกลบ
Shanimal

1
ฉันมี local / master บน remote origin / branch ดังนั้นการใช้git push origin master:branchที่ส่งคืนEverything up-to-dateหลังจากนั้นข้อความของการเป็นผู้นำโดย x commits ก็หายไป
fyrye

2
อันสุดท้ายได้สิ่งที่ฉันต้องการที่นั่น!
RyanG

38

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

  • git push: ย้ายการเปลี่ยนแปลงของคุณไปยังรีโมต (สิ่งนี้อาจถูกปฏิเสธหากมีการเปลี่ยนแปลงอื่น ๆ ในรีโมตอยู่แล้ว)
  • ไม่ทำอะไรเลยและทำการเข้ารหัสซิงค์อีกวัน
  • git pull: รับการเปลี่ยนแปลง (ถ้ามี) จากระยะไกลและรวมการเปลี่ยนแปลงของคุณ
  • git pull --rebase: ดังกล่าวข้างต้น แต่พยายามทำซ้ำการกระทำของคุณด้านบนของการเปลี่ยนแปลงระยะไกล

คุณกำลังตกอยู่ในสถานการณ์แบบคลาสสิก (แม้ว่าโดยปกติแล้วคุณจะไม่ยอมผูกมัดกับอาจารย์ในเวิร์กโฟลว์ส่วนใหญ่) นี่คือสิ่งที่ฉันจะทำตามปกติ: ตรวจสอบการเปลี่ยนแปลงของฉัน อาจgit rebase --interactiveจะทำเครื่องสำอางบางอย่างกับพวกเขาวางเครื่องสำอางที่ดูดแล้วเรียงลำดับใหม่เพื่อทำให้พวกเขามีเหตุผลมากขึ้น git pushตอนนี้ย้ายไปยังห่างไกลกับ หากสิ่งนี้ถูกปฏิเสธเพราะสาขาในประเทศของฉันไม่ทันสมัย: git pull --rebaseเพื่อทำซ้ำงานของฉันบนการเปลี่ยนแปลงล่าสุดและgit pushอีกครั้ง


ฉันใช้ git pull --rebase แต่ตอนนี้บอกว่าฉันอยู่ข้างหน้าโดยหนึ่ง
คอมมิชชัน

ดังนั้นฉันจึงทำการเปลี่ยนแปลงผลักไปที่หลักแล้วนำทีมของเรารวมกับหลัก ดังนั้นการเปลี่ยนแปลงอยู่ที่นั่นฉันเพียงแค่ต้องได้รับการซิงค์กับต้นแบบปัจจุบัน
FluxEngine

@MartyMcFly มันยากที่จะดูว่าเกิดอะไรขึ้นที่นี่ คุณบอกว่าคุณผลักไปแล้ว? เหตุใดคุณจึงยังคงยืนยันว่าไม่ได้อยู่ในระดับต้น ๆ คุณหมายถึงyour team lead merged to masterอะไร คุณไม่ได้บอกว่าคุณผลักดันให้เป็นผู้เชี่ยวชาญหรือไม่ ความมุ่งมั่นเพิ่มเติมประกอบด้วยอะไร? ลองgit diff origin/masterดูว่าสาขาท้องถิ่นของคุณแตกต่างจากระยะไกลอย่างไร
pmr

1
ขอบคุณสำหรับความช่วยเหลือขออภัยถ้าฉันทำงานไม่ดีอธิบายสถานการณ์ แต่สิ่งที่ฉันกำลังมองหาคือการรีเซ็ตคอมไพล์ - แหล่งกำเนิด / ต้นแบบ แต่คำตอบของคุณมีประโยชน์ +1
FluxEngine

ฉันดูเหมือนจะติดอยู่ระหว่างหินและสถานที่ที่ยากลำบากฉันพยายามที่จะทำการเปลี่ยนแปลงแล้ว git พูดว่า: คุณอยู่ข้างหน้า 11 คอมมิชชัน ฉันไม่ได้รับอนุญาตให้อัปเดตที่เก็บระยะไกลดังนั้นจึงไม่สามารถทำการพุชได้ "git pull" พูดว่า: ทันสมัยแล้ว ดังนั้นฉันจึงลองข้อเสนอแนะที่สามของคุณ แต่แล้ว git พูดว่า: ไม่สามารถดึงด้วยการรีบูท: คุณมีการเปลี่ยนแปลงที่ไม่สมํ่าเสมอ โปรดส่งหรือซ่อนพวกเขา Duh นั่นคือสิ่งที่ฉันได้มาที่นี่ตั้งแต่แรก :-(
Sander de Jong

36

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

ขั้นตอนที่ 1 :git checkout <branch_name>

เห็นได้ชัดว่าเข้าไปในสาขานั้น

ขั้นตอนที่ 2 :git pull -s recursive -X theirs

ทำการเปลี่ยนแปลงสาขาระยะไกลและแทนที่ด้วยการเปลี่ยนแปลงหากมีข้อขัดแย้งเกิดขึ้น ที่นี่ถ้าคุณทำgit statusคุณจะได้รับสิ่งนี้สาขาของคุณอยู่ข้างหน้า 'ต้นกำเนิด / ต้นแบบ' โดย 3 คอมมิชชัน

ขั้นตอนที่ 3 :git reset --hard origin/<branch_name>

ขั้นตอนที่ 4 :git fetch

ฮาร์ดรีเซ็ตสาขาของคุณ

สนุก.


17

มาข้ามปัญหานี้หลังจากที่ฉันรวมคำขอดึงบน Bitbucket

ต้องทำ

git fetch

และนั่นคือมัน


2
ฉันทำงานกับ repo จากกลุ่มและสามารถกำจัดข้อความโดยใช้ "git fetch" กับกลุ่มปัจจุบัน TNX!
Martin Meeser

ในการชำระเงินแบบอ่านอย่างเดียวสถานะ git ของฉันแสดงว่าฉันมี 2 คอมมิชชันก่อนหน้านี้ล็อกดูตามที่ควรจะเป็น - คอมมิททั้งหมดเริ่มต้นขึ้น ฉันดึงคอมไพล์แล้วและ 5 ข้อตกลงข้างหน้า .. WWF ???? เพียงต้องการดึงข้อมูลเพื่อรีเฟรชดัชนีในท้องถิ่น ... ทุกอย่างดี :)
Chris Rutledge

12

โดยปกติถ้าฉันต้องตรวจสอบว่ามีความมุ่งมั่นที่แตกต่างจากต้นแบบฉัน:

git rebase -i origin/master

ด้วยวิธีนี้ฉันสามารถเห็นการกระทำและตัดสินใจที่จะวางหรือเลือก ...


นี่เป็นการตอบที่ต่ำต้อยนี่คือสิ่งที่ฉันต้องทำ ฉันไม่สามารถหาวิธีการหาความแตกต่างและgit diff ...magicks ต่างๆของฉันทั้งหมดจะไม่ทำงาน เมื่อฉันทำสิ่งนี้มันให้ฉันnoopเป็นเพียงความมุ่งมั่นและเมื่อฉันยอมรับมันตอนนี้สาขาของฉันจะซิงค์กับที่มา / ต้นแบบ ดังนั้นดูเหมือนว่าการกระทำที่แตกต่างจากแหล่งกำเนิด / ต้นแบบไม่มีผลอะไร
philo vivero

11

ข้อความนี้gitหมายความว่าคุณได้ทำคอมมิชชันสามรายการใน repo ในพื้นที่ของคุณและยังไม่ได้เผยแพร่ไปยังที่masterเก็บ git push {local branch name} {remote branch name}คำสั่งที่จะเรียกว่าเป็น

คำสั่งgit pull(และgit pull --rebase) สำหรับสถานการณ์อื่น ๆ เมื่อมีการกระทำใน repo ระยะไกลที่คุณไม่ได้มีใน repo ท้องถิ่นของคุณ --rebaseตัวเลือกหมายความว่าgitจะย้ายไปในพื้นที่ของคุณกระทำกันประสานกับ repo ระยะไกลและจากนั้นพยายามที่จะใช้สามกระทำของคุณจากรัฐใหม่ อาจล้มเหลวหากมีข้อขัดแย้ง แต่คุณจะได้รับแจ้งให้แก้ไข คุณยังสามารถยกเลิกrebaseได้หากคุณไม่ทราบวิธีการแก้ปัญหาความขัดแย้งโดยใช้และคุณจะได้รับกลับไปยังรัฐก่อนที่จะใช้git rebase --abortgit pull --rebase


7

หากคอมไพล์ของคุณบอกว่าคุณมีความมุ่งมั่นแล้วเพียงแค่ก่อน

git push กำเนิด

เพื่อให้แน่ใจว่าคุณได้ผลักงานล่าสุดของคุณทั้งหมดใน repo

จากนั้น

รีเซ็ต git - แหล่งกำเนิด / มาสเตอร์

เพื่อรีเซ็ตและจับคู่กับ repo


4

เรื่องนี้เกิดขึ้นกับฉันหนึ่งครั้งหลังจากที่ฉันรวมคำขอดึงใน Bitbucket

ฉันแค่ต้องทำ:

git fetch

ปัญหาของฉันได้รับการแก้ไข ฉันหวังว่านี่จะช่วยได้!!!


0
$ git fetch

  - remote: Enumerating objects: 3, done.
  - remote: Counting objects: 100% (3/3), done.
  - remote: Compressing objects: 100% (3/3), done.
  - remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0


$ git pull 

   - Already up to date!
   - Merge made by the 'recursive' strategy.

ในที่สุด:

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