ฉันจะย้อนกลับพื้นที่เก็บข้อมูล GitHub ไปยังการกระทำที่เฉพาะเจาะจงได้อย่างไร


431

GitHub ของฉันมี 100 คำสัญญาอยู่ในตอนนี้ ฉันต้องย้อนกลับพื้นที่เก็บข้อมูลเพื่อยอมรับ 80 และลบที่ตามมาทั้งหมด

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

ฉันต้องการรีบูตเช่นเดียวกับในตัวอย่างนี้: ฉันจะลบการกระทำบน GitHub ได้อย่างไร

อย่างไรก็ตาม git ต้องการให้ฉันจัดการกับความขัดแย้งมากมาย มีวิธีที่ง่ายกว่านี้ไหม?

คำตอบ:


882
git reset --hard <old-commit-id>
git push -f <remote-name> <branch-name>

หมายเหตุ: ดังที่เขียนไว้ในความคิดเห็นด้านล่างการใช้สิ่งนี้เป็นสิ่งที่อันตรายในสภาพแวดล้อมการทำงานร่วมกัน: คุณเขียนประวัติศาสตร์


43
git push -f origin branchคนทำ ฉันเพิ่งมีช่วงเวลาที่ไม่ดีเพราะฉันพลาดไป
Sumit M อโศก

21
ระวังสิ่งนี้! คุณจะสูญเสียความมุ่งมั่นทั้งหมดของคุณในท้องถิ่นและถ้าคุณผลักดันจะไม่มีทางกลับ
โทมัส

8
ไม่เป็นความจริงเลยคุณสามารถรับค่าคอมมิชชันเก่าได้โดยใช้การอ้างอิง git
Jan Schaefer

27
คุณอาจต้องทำgit push origin HEAD --forceแทนที่จะgit push -f origin branchเป็นerror: src refspec branch does not match any.ข้อผิดพลาดให้ฉัน
sprocket12

1
ใช่ขอบคุณพวกคุณ ฉันจัดการเพื่อทำสิ่งที่ฉันต้องการ ฉันสร้างสาขาแยกต่างหากจากสาขาแรกก่อนที่จะส่งฉันต้องการย้อนกลับ โคลนในเครื่อง จากนั้นนำคำแนะนำของคุณไปใช้กับสำเนานั้นด้วยวิธีนี้ฉันไม่ได้ประนีประนอมสาขาหลักของฉัน ...
Gauthier Boaglio

21

หากต้องการเลิกกระทำล่าสุดฉันทำสิ่งนี้:

ครั้งแรก:

git log

รับรหัส SHA ล่าสุดเพื่อเลิกทำ

git revert SHA

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

สิ่งนี้เป็นสิ่งที่ดีสำหรับการทำซ้ำสิ่งที่คุณเพิ่งทำซึ่งฉันพบว่าบ่อยครั้งสำหรับฉัน

ดังที่ไมค์ metioned คุณสามารถทำได้:

git revert HEAD

8
git revert HEADจะคืนค่าคอมมิชชันล่าสุดโดยไม่ต้องค้นหาแฮช
Mike Baranczak

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

19

อีกทางหนึ่ง:

ชำระเงินที่สาขาที่คุณต้องการเปลี่ยนกลับจากนั้นรีเซ็ตสำเนาการทำงานในเครื่องของคุณกลับไปเป็นการยืนยันว่าคุณต้องการเป็นสาขาล่าสุดบนเซิร์ฟเวอร์ระยะไกล ในการทำสิ่งนี้ใน SourceTree ฉันคลิกขวาที่และเลือก "รีเซ็ต BRANCHNAME เป็นการกระทำนี้"

จากนั้นไปที่ไดเร็กทอรีโลคัลของที่เก็บของคุณและรันคำสั่งนี้:

git -c diff.mnemonicprefix=false -c core.quotepath=false push -v -f -- tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME 

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


1
FYI "REPOSITORY_NAME" จะเป็นสิ่งที่ชอบ https: /me@github.com/me/repo_name.git
ทิม

3
มันจะมีประโยชน์มากขึ้นถ้าคุณจะทำลายคำสั่งนั้นและอธิบายมัน
cst1992

3

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

เพียงแค่สร้างสาขาใหม่จากความมุ่งมั่น # 80 และทำงานในสาขานั้นต่อไป อีก 20 คอมมิชชันจะยังคงอยู่ในสาขาของเด็กกำพร้าเก่า

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


ฉันเดาว่านี่เป็นปัญหาอย่างสับสนกับประวัติศาสตร์ท้องถิ่นทุกสาขาของสาขาที่สนใจ
ragerdl

2

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

หากความมุ่งมั่นครั้งสุดท้ายของคุณเป็นการผสานความรักก็ต้องการอีกเล็กน้อย:

git revert -m 1 HEAD


1

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

  1. ไม่ใช่สาขาเริ่มต้น
  2. ไม่มีการร้องขอเปิดโพล
  3. สาขาไม่ได้รับการคุ้มครอง

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

git checkout -b master 734c2b9b   # replace with your commit point

จากนั้นดันสาขาท้องถิ่นไปที่รีโมต

git push -u origin master

เพิ่มกลับการป้องกันสาขาและสาขาเริ่มต้น ฯลฯ

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