จะละทิ้งการผูกมัดใน Git ได้อย่างไร?


263

ฉันกำลังทำงานกับบางสิ่งบางอย่างและตัดสินใจว่ามันจะเมาอย่างสมบูรณ์ ... หลังจากทำบางอย่างแล้ว ดังนั้นฉันจึงลองตามลำดับต่อไปนี้:

git reset --hard
git rebase origin
git fetch
git pull
git checkout

ณ จุดนี้ฉันได้รับข้อความ

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

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


6
ไม่จำเป็นต้องทำทั้งสองอย่างไม่เป็นgit fetchและgit pull- ดึงคือการรวมกันของการดึงข้อมูลและการผสาน
อีเธอร์

12
หมายเหตุสำหรับผู้ใช้: ปัญหาหลักของคำถามนี้ไม่มีอะไรเกี่ยวข้องกับข้อความ "สาขาของคุณอยู่ข้างหน้า 'ต้นกำเนิด / ต้นแบบ' โดย N กระทำ . โปรดหยุดคำถามอื่น ๆ ซ้ำซ้อนเนื่องจากคำถามนั้น

คำตอบ:


581
git reset --hard origin/master

จะลบการกระทำทั้งหมดที่ไม่อยู่ในorigin/masterตำแหน่งที่originเป็นชื่อ repo และmasterเป็นชื่อของสาขา


1
ฉันคิดว่าไวยากรณ์ "Origin / master" ที่มีเครื่องหมายทับถูกอ้างอิงถึง repo ในพื้นที่หรือไม่
Daniel C. Sobral

9
mipadi: ใส่อย่างถูกต้องมากขึ้นมันจะรีเซ็ตสาขาปัจจุบันให้ชี้ไปที่การคอมมิชชันเดิมกับต้นฉบับ / มาสเตอร์
Christoffer Hammarström

มันหมายถึงสาขา origin/masterเป็นสาขาที่ติดตามmasterสาขาของoriginrepo ระยะไกล
mipadi

@ DanielC.Sobral ไม่มีorigin/masterคือการอ้างอิงไปยังสาขาของที่เรียกว่าระยะไกลmaster origin
Matthew

1
@littletiger git ไม่ได้ติดตามโฟลเดอร์เฉพาะไฟล์และเส้นทางของพวกเขา ดังนั้นมันจะไม่สนใจโฟลเดอร์ที่ว่างเปล่าทั้งหมด (โฟลเดอร์ที่ไม่มีไฟล์หรือไฟล์ที่ถูกละเว้นเท่านั้น) พวกเขาไม่ปรากฏขึ้นที่ใดก็ได้เนื่องจากไม่มีสิ่งใดเข้ามา
Mumbleskates

33

นอกเหนือจากคำตอบโดย mipadi (ซึ่งควรทำงานตามวิธี) คุณควรรู้ว่าการทำ:

git branch -D master
git checkout master

ก็ทำสิ่งที่คุณต้องการโดยไม่ต้องhaving to redownload everything(อ้างคำพูดของคุณถอดความ) นั่นเป็นเพราะ repo ในพื้นที่ของคุณมีสำเนาของ repo ระยะไกล (และสำเนานั้นไม่เหมือนกับไดเรกทอรีภายในเครื่องของคุณมันไม่เหมือนกันกับสาขาที่คุณเช็คเอาต์)

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

หากคุณไม่มีสาขาอื่นที่ไม่ใช่มาสเตอร์คุณควร:

git checkout -b 'temp'
git branch -D master
git checkout master
git branch -D temp

4
แต่นั่นบอกความแตกต่างที่เกิดขึ้นจากการกระทำที่เกิดขึ้นในท้องถิ่นได้อย่างไร ในความเป็นจริงมันบอกฉันว่าCannot delete the branch 'master' which you are currently on.
Daniel C. Sobral

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

2
2. แน่นอนคุณไม่สามารถลบสาขาที่เช็คเอาท์ในปัจจุบัน หากต้องการลบต้นแบบให้ตรวจสอบสาขาอื่นก่อน จากหากไม่มีสาขาอื่นเพียงแค่สร้างสาขาชั่วคราว:git checkout -b temp;git branch -D master;git checkout master;git branch -D temp
slebetman

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

สิ่งนี้ใช้ได้สำหรับฉัน อาจจะgit branch -D masterไม่จำเป็นแม้ว่าเนื่องจากชี้ให้เห็นมันสร้างข้อผิดพลาด
Alexis Wilke

15

สิ่งที่ฉันทำคือฉันพยายามรีเซ็ตฮาร์ดให้เป็น HEAD วิธีนี้จะลบล้างการกระทำในท้องถิ่นทั้งหมด:

git reset --hard HEAD^

นี่คือคำตอบที่ดีที่สุดที่ได้ผลจริง ยกเลิกการคอมมิชชันท้องถิ่นและรีเซ็ตเป็น HEAD การใช้ ^ char คืออะไร
karim

@karim '^' อาจเป็นสิ่งที่ regex ซึ่งอาจเป็นสิ่งที่ค่อนข้างลึกที่ฉันไม่ทราบหรืออ่านนานมาแล้วในไฟล์คู่มือ .. คนเสียใจ :)
giang nguyen

1
ล่าช้า แต่การ^แทนแสดงถึงพาเรนต์ดังนั้นการรีเซ็ตเป็นการHEAD^ละทิ้งการเปลี่ยนแปลงที่ไม่มีข้อผูกมัดและย้ายสาขาไปยังการคอมมิชชันก่อนหน้าอย่างมีประสิทธิภาพ "การลบ" การคอมมิทล่าสุด (แม้ว่าการคอมมิชชันยังคงมีอยู่ คำตอบจะมีเพียงหนึ่งกระทำในท้องถิ่นและส่วนที่เหลือเป็นการเปลี่ยนแปลงที่ปราศจากข้อผูกมัด @karim @giang
QuantumQuaver

3

คุณต้องวิ่ง

git fetch

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


5
การดึงข้อมูลไม่เกี่ยวข้องกับปัญหาหลักของผู้ถามซึ่งเป็นการกำจัดความมุ่งมั่นในท้องถิ่น

1
เกิดอะไรขึ้นถ้าฉันมีไฟล์ที่ได้รับมอบหมายในท้องถิ่นแล้วพยายามที่จะยิงคำสั่งดังกล่าว มันจะแสดงข้อความผิดพลาดเดียวกัน ฉันลอง git fetch และ git fetch -p ด้วย แต่แสดงข้อผิดพลาดเดียวกัน
Morez

1

ฉันเคยเห็นอินสแตนซ์ที่ระยะไกลไม่ซิงค์กันและจำเป็นต้องได้รับการอัปเดต หาก a reset --hardหรือbranch -Dล้มเหลวในการทำงานลอง

git pull origin
git reset --hard 

สิ่งนี้ไม่ตอบคำถามreset --hardผลงานในสถานการณ์นี้
CharlesB

1
สวัสดี Charles คุณถูกต้องที่reset --hardควรทำงานที่นี่ อย่างไรก็ตามฉันเพียงแค่ชี้ให้เห็นว่าบางครั้งมันล้มเหลวในการรีเซ็ตสาขาอย่างถูกต้องและgit pull originจะซิงค์ระยะไกลอีกครั้งและอนุญาตให้reset --hardทำงานได้อย่างถูกต้อง
Jim Clouse

0

ฉันต้องทำ:

git checkout -b master

อย่างที่ git กล่าวว่ามันไม่มีอยู่จริงเพราะมันถูกเช็ด

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