Git, วิธีการรีเซ็ต Origin / master เป็นคอมมิชชันได้อย่างไร?


245

ฉันรีเซ็ตเจ้านายในพื้นที่ของฉันให้กระทำโดยคำสั่งนี้:

git reset --hard e3f1e37

เมื่อฉันป้อน$ git statusคำสั่งเทอร์มินัลพูดว่า:

# On branch master
# Your branch is behind 'origin/master' by 7 commits, and can be fast-forwarded.

#   (use "git pull" to update your local branch)
#
nothing to commit, working directory clean

เนื่องจากฉันต้องการรีเซ็ต Origin / header เช่นกันฉันจึงเช็คเอาต์ Origin / master:

$ git checkout origin/master
Note: checking out 'origin/master'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b new_branch_name

HEAD is now at 2aef1de... master problem fixed for master. its okay now.

และรีเซ็ตส่วนหัวโดยคำสั่งนี้:

$ git reset --hard e3f1e37
HEAD is now at e3f1e37 development version code incremented for new build.

จากนั้นฉันพยายามเพิ่มคอมมิชชันไปยังแหล่งกำเนิด / ส่วนหัวที่ฉันไม่สำเร็จ

$ git commit -m "Reverting to the state of the project at e3f1e37"
# HEAD detached from origin/master
nothing to commit, working directory clean

ในที่สุดฉันก็เช็คเอาต์ไปยังเจ้านายในพื้นที่ของฉัน

$ git checkout master
Switched to branch 'master'
Your branch is behind 'origin/master' by 7 commits, and can be fast-forwarded.
  (use "git pull" to update your local branch)

ตั้งแต่ฉันตั้งค่าหัวหน้าแหล่งกำเนิด / ต้นแบบที่ฉันคาดหวังว่าท้องถิ่นและแหล่งกำเนิดควรเป็นไปในทิศทางเดียวกัน แต่อย่างที่คุณเห็น git กำลังบอกว่าท้องถิ่น / ต้นแบบของฉันอยู่เบื้องหลังแหล่งกำเนิด / ต้นแบบ 7 คอมมิชชัน

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

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


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

คำตอบ:


564

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

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

git checkout master
git reset --hard e3f1e37
git push --force origin master
# Then to prove it (it won't print any diff)
git diff master..origin/master

9
นั่นเป็นการดำเนินการที่ร้องขอ แต่โปรดจำไว้ว่ามันจะทำให้คนเหล่านั้นไม่พอใจที่ดึงข้อผูกพันจากเจ้านาย
mnagel

ฉันทำตามขั้นตอนนี้และย้อนกลับ แต่ต้นกำเนิด / HEAD ชี้ไปที่สาขาอื่นที่ไม่ใช่ต้นแบบ ฉันจะแก้ไขสิ่งนี้ได้อย่างไร
Daniil Shevelev

1
คุณไม่ควรสนใจเกี่ยวกับแหล่งกำเนิด / หัวเพียงแค่ผลักดันการอ้างอิงที่ดีไปยังแหล่งกำเนิด / อ้างอิง
Simon Boudrias

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

1
ใช้งานไม่ได้ remote: error: denying non-fast-forward refs/heads/master (you should pull first)
m0skit0

52

วิธีแก้ปัญหาที่พบในที่นี้ช่วยให้เราอัพเดทต้นแบบเป็นข้อผูกพันก่อนหน้าซึ่งได้ถูกผลักไปแล้ว:

git checkout master
git reset --hard e3f1e37
git push --force origin e3f1e37:master

ความแตกต่างที่สำคัญจากคำตอบที่ยอมรับคือการแฮชการกระทำ "e3f1e37:" ต่อหน้าต้นแบบในคำสั่ง push


1
ใช้งานไม่ได้:remote: error: denying non-fast-forward refs/heads/master (you should pull first)
m0skit0

@ m0skit0 ตามที่ข้อความบอกไว้you should pull first:)
สัญชาตญาณ

คำตอบสำหรับเรื่องนี้คือที่stackoverflow.com/a/10544328/1019307 - git config receive.denynonfastforwards falseแต่จริงๆแล้วฉันตั้งค่าด้วยตนเองในที่เก็บ git ท้องถิ่นของฉันฉันมี/opt/gitที่ฉันสร้างขึ้นเพื่อเล่นกับความคิดที่นี่ ฉันไม่แน่ใจว่าจะทำเช่นนี้กับ bitbucket, github และอื่น ๆ ได้อย่างไรและ @intelligentpixel ที่ไม่มีจุดหมายเพราะมันย้อนกลับสิ่งที่คุณพยายามจะทำด้วยการรีเซ็ตแบบยากลำบาก
HankCa

สวัสดี @jkovacs ฉันไม่ต้องการให้มีการลบการเปลี่ยนแปลงใหม่ในต้นแบบ ฉันแค่ต้องการที่จะส่งแฮช "e3f1e37" ไปยังจุดเริ่มต้น เป็นไปได้หรือไม่โดยข้ามคำสั่ง git reset - ฮาร์ด "e3f1e37"
KarenAnne

สวัสดี @jkovacs ฉันเพิ่งยืนยันว่าฉันสามารถข้ามขั้นตอนที่ 2 ได้ :)
KarenAnne

2

สมมติว่าสาขาของคุณถูกเรียกmasterทั้งที่นี่และจากระยะไกลและระยะไกลของคุณถูกเรียกว่าoriginคุณสามารถทำได้:

git reset --hard <commit-hash>
git push -f origin master

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


1

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

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

ดึกคืนหนึ่งด้วยความหวาดกลัวหวาดกลัวที่จะทำให้ความคืบหน้าของฉันหายไปจากความล้มเหลวของฮาร์ดแวร์หรือบางสิ่งบางอย่างจากอีเธอร์ฉันตัดสินใจที่จะผลักดันต้นแบบให้กำเนิด ต่อมาฉันแก้ไขสาขาหลักในท้องถิ่นของฉันต่อไปและเมื่อฉันตัดสินใจว่าถึงเวลาที่จะต้องผลักดันอีกครั้งฉันต้องเผชิญกับสาขาหลักที่แตกต่างกันและพบว่าฉันไม่สามารถแก้ไขต้นกำเนิด / ต้นน้ำ ( duh! ) เหมือนฉันได้

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

ฉันเพียงแค่บังคับให้ไปยังแหล่งกำเนิดโดยไม่ต้องระบุสิ่งที่ฉันต้องการที่จะบังคับให้เจ้านายเพราะในกรณีนี้มันเป็นสิ่งที่หัวอยู่ที่ ตรวจสอบgit diff master..origin/masterแล้วว่าไม่มีความแตกต่างเลยและนั่นก็คือ แก้ไขทั้งหมดแล้ว ขอบคุณ! (ฉันรู้ว่าฉันเป็นมือใหม่คอมไพล์โปรดยกโทษให้!)

ดังนั้นหากคุณตกลงกับสาขาหลักของคุณในพื้นที่เพียง:

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