ฉันจะยกเลิกการเปลี่ยนแปลงที่ไม่ได้ทำใน Git ได้อย่างไร?


4817

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


9
git-cleanลบไฟล์ที่ไม่ได้ติดตามเท่านั้นออกจากแผนผัง
Yega

24
เพื่อชี้แจงความคิดเห็นของ Asenar ด้านบนgit-clean -dfอาจเป็นอันตรายได้ มันจะลบไฟล์ที่ไม่ได้ติดตามในเครื่อง (ตัวอย่างเช่น. gitignore) อ่านทั้งหมดด้านล่างอย่างระมัดระวังและพิจารณาการชำระเงิน git แทน
jacanterbury

15
'git clean -df' ถูกเตือน! ฉันลองและทำให้โฟลเดอร์คีย์หายไปที่ไม่สามารถกู้คืนได้ ... อุ๊ย!
Gabe Karkanis

46
การกดปุ่มgit statusให้คำแนะนำเกี่ยวกับวิธีการทำเช่นนั้น! git checkout -- .
เปาโล

4
@Paulo: เริ่มต้นในเดือนกรกฎาคม 2019 จะช่วยให้ข้อเสนอแนะ:git status เป็นคำสั่งใหม่สำหรับจุดประสงค์นี้อย่างแท้จริง ดูการปรับปรุง 2019 ของฉัน git restoregit restore
prosoitos

คำตอบ:


2684

อีกวิธีที่เร็วกว่าคือ:

git stash save --keep-index --include-untracked

คุณไม่จำเป็นต้องรวม--include-untrackedหากคุณไม่ต้องการที่จะละเอียด

หลังจากนั้นคุณสามารถวางที่ซ่อนไว้ด้วยgit stash dropคำสั่งหากคุณต้องการ


122
และอย่างละเอียดเกี่ยวกับมันคุณต้องการ--include-untrackedเช่นกัน
TJ Crowder

9
@KarimSamir: คำถามที่ถามโดยเฉพาะเกี่ยวกับการเปลี่ยนแปลงที่ไม่ได้อยู่ในดัชนี git resetคำสั่งจะยกเลิกการเปลี่ยนแปลงในดัชนีเกินไป
เกร็กฮิวกิลล์

146
git checkout - เร็วกว่ามาก
แฟรงค์

38
ทั้งgit stashหรือความหลากหลายใด ๆgit checkoutจะไม่ลบการลบที่ไม่มีการจัดฉาก ตามผลลัพธ์ของgit statusคำตอบที่ถูกต้องจริงนี่คือบางรสgit reset HEAD
Chris Warth

127
สิ่งนี้ทำให้เกิดสแต็คที่ซ่อน git checkout -- .ทำงานด้วยคำสั่งเดียวเท่านั้น
Felipe Tonello

5336

สำหรับไฟล์ที่ไม่จัดแบ่งในไดเรกทอรีการทำงานปัจจุบันให้ใช้:

git checkout -- .

สำหรับการใช้ไฟล์เฉพาะ:

git checkout -- path/to/file/to/revert

--ที่นี่เพื่อลบambiguation โต้แย้ง


117
นี่น่าจะเป็นวิธีที่ยอมรับได้ นั่นคือสิ่งที่คอมไพล์บอกให้คุณทำถ้าคุณพิมพ์git status
ABMagil

27
ไม่ทำงานหากมีไฟล์ที่ไม่ได้ติดตาม Git error: The following untracked working tree files would be overwritten by checkout: ...กล่าวว่า
Michael Iles

92
คำถามมือใหม่ "ชำระเงิน git -." หมายถึงความหมาย?
kaid

120
@Ninjack git checkout -- .หมายถึงสิ่งเดียวกันgit checkout .ยกเว้นคุณชัดเจนเกี่ยวกับความจริงที่ว่าคุณไม่ได้ระบุชื่อสาขา พวกเขาทั้งคู่บอกว่าจะเช็คเอาท์ HEAD เวอร์ชั่นที่สาขาที่ฉันกำลังใช้งานอยู่สำหรับ '.' หรือ './'. ถ้าคุณทำgit checkout branch-name directory-or-file-nameโดยทั่วไปคุณจะได้รับรุ่นหัวของสาขาdirectory-or-file-name branch-name
akgill

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

1898

ดูเหมือนว่าโซลูชั่นที่สมบูรณ์คือ:

git clean -df
git checkout -- .

git cleanลบไฟล์ที่ไม่ได้ติดตามทั้งหมด ( คำเตือน : แม้ว่ามันจะไม่ลบไฟล์ที่ถูกเพิกเฉยที่กล่าวถึงโดยตรงใน. gitignore แต่มันอาจลบไฟล์ที่ไม่สนใจที่อยู่ในโฟลเดอร์ ) และgit checkoutล้างการเปลี่ยนแปลงทั้งหมด


116
อีกสองคำตอบไม่ได้ผลจริงๆอันนี้ทำ
John Hunt

18
@dval สิ่งนี้จะเกิดขึ้นเนื่องจากคำสั่งแรกลบไฟล์ที่ไม่ได้ทำดัชนีออกและไฟล์ที่สองลบการเปลี่ยนแปลงที่ไม่จัดทำ (ของไฟล์ดัชนี) ดังนั้นหากคุณไม่มีการเปลี่ยนแปลงใด ๆ ในฉากการดำเนินการนี้จะเหมือนกับการย้อนกลับไปสู่การคอมมิทครั้งล่าสุดด้วยgit reset --hard
Amanuel Nega

3
ใช้-dffหากไดเรกทอรีที่ไม่ได้ติดตามคือโคลน git
accuya

87
ระวังการใช้คอมไพล์อย่างสะอาด -df หากคุณไม่เข้าใจว่ามันทำอะไรคุณอาจกำลังลบไฟล์ที่คุณต้องการเก็บไว้เช่น robots.txt, ไฟล์ที่อัปโหลด ฯลฯ
ctlockey

40
ตามที่ @ctlockey กล่าวว่าคำสั่งแรกจะลบไดเรกทอรีด้วยถ้าไฟล์เหล่านั้นประกอบด้วยไฟล์ที่ถูกเพิกเฉยเท่านั้น ... สูญเสียไฟล์การตั้งค่าทั้งหมดในโครงการของฉัน :( ระวังด้วย
Maxime Lorant

326

สิ่งนี้จะตรวจสอบดัชนีปัจจุบันสำหรับไดเรกทอรีปัจจุบันทิ้งการเปลี่ยนแปลงทั้งหมดในไฟล์จากไดเรกทอรีปัจจุบันลงไป

git checkout .

หรือสิ่งนี้ซึ่งตรวจสอบไฟล์ทั้งหมดจากดัชนีเขียนทับไฟล์แผนผังการทำงาน

git checkout-index -a -f

28
สวัสดีความแตกต่างระหว่างgit checkout .และgit checkout -- .คืออะไร
Evan Hu

5
@Evan: ไม่มีความแตกต่างในกรณีนี้
Robert Siemer

10
@ Robert Siemer และในกรณีทั่วไปหรือไม่
RJFalconer

2
@Evan: สถานที่ที่ไม่ดีที่จะถามคำถามนี้ - มันไม่เกี่ยวข้องกับคำถามของ OP และไม่เกี่ยวข้องกับคำตอบที่นี่
Robert Siemer

14
+1 นี่คือคำตอบที่ถูกต้องเพราะมันจัดการกับกรณีที่ไฟล์บางไฟล์มีการเปลี่ยนแปลงทั้งแบบ staged และ un-staged โปรดทราบว่าโซลูชันนี้ตัดการเปลี่ยนแปลงที่ไม่มีสถานะออก หากคุณต้องการที่จะรักษาพวกเขาแล้วคุณควรใช้ @ greg-Hewgill git stash save --keep-index'คำตอบของ
Rhubbarb

248
git clean -df

ทำความสะอาดแผนผังการทำงานโดยลบไฟล์ที่ไม่อยู่ภายใต้การควบคุมเวอร์ชันซ้ำ ๆ เริ่มจากไดเรกทอรีปัจจุบัน

-d: ลบไดเรกทอรีที่ไม่ได้ติดตามซึ่งนอกเหนือจากไฟล์ที่ไม่ได้ติดตาม

-f: บังคับ (อาจไม่จำเป็นขึ้นอยู่กับ clean.requireForceการตั้งค่า)

เรียกใช้git help cleanเพื่อดูคู่มือ


ทำไมคำตอบนี้ไม่มีคะแนนทั้งหมด? ตอบกลับในปี 2011 และยังคงถูกต้อง
Eugene Braginets

106

สิ่งที่ฉันชอบคือ

git checkout -p

ที่ช่วยให้คุณเลือกที่จะเปลี่ยนชิ้นส่วนกลับ

ดูสิ่งนี้ด้วย:

git add -p

9
ฉันชอบความสามารถในการเห็นการเปลี่ยนแปลงจริงก่อนที่จะถูกยกเลิก
Penghe Geng

นี่คือสิ่งที่ฉันใช้ git checkout -p จากนั้น "a" เพื่อยอมรับทั้งหมด
Mattis

2
ฉันไม่เคยคิดถึง ที่-pจะเพิ่มชั้นพิเศษที่ดีของความปลอดภัย ใช้ร่วมกับgit clean -dคำตอบ OP จริง ๆ
Stephan Henningsen

96

เนื่องจากไม่มีคำตอบแนะนำชุดตัวเลือกที่แน่นอนที่ฉันใช้นี่คือ:

git clean -dfx
git checkout .

นี่คือข้อความช่วยเหลือออนไลน์สำหรับgit cleanตัวเลือกที่ใช้:

-d

ลบไดเรกทอรีที่ไม่ได้ติดตามนอกจากไฟล์ที่ไม่ได้ติดตาม หากไดเรกทอรีที่ไม่ได้ติดตามได้รับการจัดการโดยที่เก็บ Git อื่นมันจะไม่ถูกลบโดยค่าเริ่มต้น ใช้-fตัวเลือกสองครั้งหากคุณต้องการลบไดเรกทอรีดังกล่าว

-f

หากตัวแปรกำหนดค่า Git clean.requireForceไม่ได้ตั้งค่าfalse, Git สะอาดจะปฏิเสธที่จะลบไฟล์หรือไดเรกทอรีเว้นแต่ได้รับ-f, หรือ-n -iGit จะปฏิเสธที่จะลบไดเรกทอรีภายใน.gitไดเรกทอรีย่อยหรือไฟล์เว้นแต่-fจะได้รับครั้งที่สอง

-x

อย่าใช้กฎการเพิกเฉยจาก.gitignore(ต่อไดเรกทอรี) และ$GIT_DIR/info/excludeแต่ยังคงใช้กฎการเพิกเฉยที่ได้รับจาก-eตัวเลือก วิธีนี้ช่วยให้ลบไฟล์ที่ไม่ได้ติดตามทั้งหมดรวมถึงผลิตภัณฑ์บิลด์ สิ่งนี้สามารถใช้ (อาจใช้ร่วมกับgit reset) เพื่อสร้างไดเรกทอรีการทำงานที่เก่าแก่เพื่อทดสอบการสร้างที่สะอาด

นอกจากนี้git checkout .ต้องทำในรากของ repo


+1 สำหรับโซลูชันนี้ เกี่ยวกับคำกล่าวของคุณว่า "เช็คเอาต์คอมไพล์จำเป็นต้องทำในรูทของ repo" คุณอาจพูดถึงว่าเราสามารถทำได้git reset --hardแทน (ซึ่งเทียบเท่ากับgit reset --hard HEADและควรทำงานอย่างใดอย่างหนึ่งเป็นไดเรกทอรีปัจจุบัน ... )
ErikMD

2
เกี่ยวกับคำสั่งแรกgit clean -dfxนี่คือเคล็ดลับที่ฉันใช้เพื่อให้ปลอดภัยก่อนที่จะเรียกใช้: เพียงแค่รันgit clean -d -x -nก่อนเพื่อแสดงรายการไฟล์ที่จะถูกลบแล้วยืนยันการดำเนินการโดยการเรียกใช้git clean -d -x -f(ฉันใส่อาร์กิวเมนต์-n. รับผิดชอบ-fในท้ายที่สุดจะสามารถที่จะเปลี่ยนแปลงอย่างรวดเร็วในสถานี)
ErikMD

5
บันทึกย่ออย่างรวดเร็วว่าสิ่งนี้ไม่สามารถย้อนกลับได้และหากคุณมีไฟล์อยู่.gitignoreคุณจะสูญเสียไฟล์เหล่านั้น ดังนั้นควรสำรองข้อมูลโครงการของคุณก่อนหน้านี้
Rob

69

หากคุณเพียงต้องการที่จะลบการเปลี่ยนแปลงไฟล์ที่มีอยู่ให้ใช้checkout( เอกสารที่นี่ )

git checkout -- .
  • ไม่มีการระบุสาขาดังนั้นจึงตรวจสอบสาขาปัจจุบัน
  • เครื่องหมายยัติภังค์สองครั้ง ( --) บอก Git ว่าสิ่งต่อไปนี้ควรนำมาเป็นอาร์กิวเมนต์ตัวที่สอง (พา ธ ) ซึ่งคุณข้ามข้อกำหนดของสาขา
  • จุด ( .) หมายถึงเส้นทางทั้งหมด

หากคุณต้องการลบไฟล์ที่เพิ่มตั้งแต่การส่งครั้งล่าสุดให้ใช้clean(ทำเอกสารไว้ที่นี่ ):

git clean -i 
  • -iบำเพ็ญตัวเลือกการโต้ตอบcleanเพื่อป้องกันการเข้าใจผิดลบ
  • มีตัวเลือกอื่น ๆ จำนวนหนึ่งสำหรับการดำเนินการที่รวดเร็วกว่า ดูเอกสารประกอบ

หากคุณต้องการย้ายการเปลี่ยนแปลงไปยังพื้นที่พักสำหรับการเข้าถึงในภายหลังให้ใช้stash(ทำเอกสารไว้ที่นี่ ):

git stash
  • การเปลี่ยนแปลงทั้งหมดจะถูกย้ายไปที่ Stash ของ Git เพื่อการเข้าถึงในภายหลัง
  • มีตัวเลือกจำนวนหนึ่งสำหรับการจัดเก็บที่เหมาะสมยิ่งขึ้น ดูเอกสารประกอบ

สิ่งนี้จะแปลงการเปลี่ยนแปลงของคุณและยกเลิกไฟล์ที่เพิ่งเพิ่มใหม่จากการคอมมิชชันก่อนหน้า
Yohan Chung

อัปเดตสิ่งนี้เพื่อการอธิบาย :)
Archie G. Quiñones

62

ฉันพบว่าบทความนี้มีประโยชน์สำหรับการอธิบายว่าเมื่อใดควรใช้คำสั่งอะไร: http://www.szakmeister.net/blog/2011/oct/12/reverting-changes-git/

มีสองกรณีที่แตกต่างกัน:

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

    git checkout -- foo.txt

  2. หากคุณจัดการไฟล์แล้วให้ใช้ git reset รีเซ็ตการเปลี่ยนแปลงดัชนีเพื่อให้สอดคล้องกับการกระทำ

    git reset -- foo.txt

ฉันสงสัยว่าการใช้git stashเป็นตัวเลือกยอดนิยมเนื่องจากมีอันตรายน้อยกว่าเล็กน้อย คุณสามารถย้อนกลับไปได้ตลอดเวลาหากคุณตั้งใจจะเป่ามากเกินไปเมื่อใช้การรีเซ็ต git การรีเซ็ตจะเรียกซ้ำโดยค่าเริ่มต้น

ลองดูที่บทความด้านบนสำหรับคำแนะนำเพิ่มเติม


60

วิธีที่ง่ายที่สุดในการทำเช่นนี้คือการใช้คำสั่งนี้:

คำสั่งนี้จะใช้ในการยกเลิกการเปลี่ยนแปลงในไดเรกทอรีการทำงาน -

git checkout -- .

https://git-scm.com/docs/git-checkout

ในคำสั่ง git สามารถทำการ stashing ไฟล์ที่ไม่ได้ติดตามได้โดยใช้:

git stash -u

http://git-scm.com/docs/git-stash


19
ฉันมาที่นี่สองครั้งอ่านคำตอบนี้แล้วลืม.ตอนท้าย สำหรับอนาคตของฉัน: ช่วงเวลาสำคัญมาก !
bejado

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

2
โปรดอธิบายสิ่งที่ทั้งสองคำสั่งทำ มันไม่มีประโยชน์จริง ๆ ที่ไม่มีคำอธิบาย
Chris Kennedy

2
ยอดเยี่ยม การชำระเงินทำได้ในคำสั่งเดียวสิ่งที่คนนิยมใช้กันมากที่สุดในสองคำสั่ง ยังสามารถติดตามgit clean -fdเพื่อล้างไฟล์ที่ไม่อยู่ในดัชนี
oligofren

49

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

git diff | git apply --reverse

44

git checkout -f


man git-checkout:

-f, --force

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

เมื่อตรวจสอบเส้นทางจากดัชนีอย่าล้มเหลวในรายการที่ยังไม่ได้แยก แต่จะไม่สนใจรายการที่ไม่ได้รวม


2
สิ่งนี้จะยกเลิกการเปลี่ยนแปลงในดัชนี !! (และ OP ต้องการให้พวกเขาเป็นเช่นนั้น)
Robert Siemer

44

ในขณะที่คุณพิมพ์สถานะ git (ใช้ "git checkout - ... " เพื่อยกเลิกการเปลี่ยนแปลงในไดเรกทอรีการทำงาน) จะปรากฏขึ้น

เช่น git checkout -- .


1
ลงเนื่องจากไม่ช่วยให้การละทิ้งไฟล์ทั้งหมดได้อย่างรวดเร็ว จุดสามจุดแสดงว่าคุณจำเป็นต้องมีรายการไฟล์ทั้งหมด โดยเฉพาะอย่างยิ่งหากคุณต้องการทิ้งไฟล์เป็นจำนวนมากในคราวเดียวเช่น ในระหว่างการรวมกลุ่มขนาดใหญ่หลังจากที่คุณได้ทำการแก้ไขทั้งหมดที่คุณต้องการเก็บไว้
usr-local-ΕΨΗΕΛΩΝ

2
แน่นอนคำสั่งที่ถูกต้องคือ "git checkout -." จุดเดียว ในความคิดเห็นของทั้งสามจุดเป็นเรื่องไวยากรณ์เพื่อบ่งชี้มีตัวเลือกอื่น ๆ อีกมากมายที่จะได้รับใช้ ..
Josef.B

39

คุณสามารถใช้ git stash ได้ - หากมีอะไรผิดพลาด คล้ายกับคำตอบอื่น ๆ ที่นี่ แต่อันนี้ยังลบไฟล์ที่ไม่มีการจัดเก็บทั้งหมดและลบทั้งหมดที่ไม่จัดทำดังนี้:

git add .
git stash

หากคุณตรวจสอบว่าทุกอย่างโอเคทิ้งที่ซ่อน:

git stash drop

คำตอบจาก Bilal Maqsood ด้วยgit cleanทำงานได้ดีสำหรับฉัน แต่ด้วยที่ซ่อนฉันสามารถควบคุมได้มากขึ้น - ถ้าฉันทำโดยบังเอิญโดยบังเอิญฉันก็ยังสามารถรับการเปลี่ยนแปลงได้

UPDATE

ฉันคิดว่ามีการเปลี่ยนแปลงอีก 1 ครั้ง (ไม่ทราบสาเหตุที่ทำให้ฉันทำงานมาก่อน)

git add . -A แทน git add .

ไม่มี-Aไฟล์ที่ถูกลบจะไม่ถูกจัดฉาก


38

อัพเดต 2019:

ตั้งแต่กรกฎาคม 2019git restoreได้มีคำสั่งใหม่ซึ่งไม่ตรงนี้:

ในgit statusตอนนี้ Git แนะนำให้ใช้คำสั่งนี้แทนที่จะgit checkoutใช้

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

ดังนั้นในการกู้คืนไฟล์ที่ตรงกับ pathspec (กำจัดการเปลี่ยนแปลงที่ไม่มีการจัดเรียง) คุณจะต้อง:

git restore <pathspec>

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

git restore .

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

โปรดทราบว่าเช่นเดียวกับgit checkout -- .(ตามที่อธิบายโดย Mariusz Nowak) สิ่งนี้จะยกเลิกการเปลี่ยนแปลงเฉพาะไฟล์ที่ติดตามโดย Git และจะไม่ทิ้งไฟล์ใหม่ที่ไม่ได้ติดตาม หากคุณต้องการยกเลิกการเปลี่ยนแปลงใด ๆ ที่ไม่จัดทำรวมถึงไฟล์ที่ไม่ได้ติดตามใหม่คุณสามารถเรียกใช้งานเพิ่มเติมได้:

git clean -df

ระมัดระวังคำสั่งนี้ในภายหลังอย่างไรก็ตามเนื่องจากคุณอาจทิ้งไฟล์ที่คุณไม่ต้องการกำจัด


หมายเหตุเกี่ยวกับgit restore: เนื่องจากนี่เป็นคำสั่งใหม่หน้า man ของมันจึงมีคำเตือน:

คำสั่งนี้เป็นการทดลอง พฤติกรรมอาจเปลี่ยนไป

ดังนั้นจึงเป็นไปได้ว่าคำตอบนี้อาจล้าสมัยหากพฤติกรรมเปลี่ยนไปในอนาคต ดังนั้นจึงควรที่จะเรียกใช้ด่วนman git-restoreก่อนใช้งาน


2
ฉันต้องการที่จะยกเลิกการเปลี่ยนแปลง unstaged ของฉันเท่านั้นโดยไม่มีผลต่อไฟล์ที่เพิ่มใหม่เพื่อให้ git restore .ทำงานได้อย่างสมบูรณ์แบบ ขอบคุณ
Saurabh Misra

3
ฉันทำgit restore <filename>และทำงานได้อย่างสมบูรณ์
เมอร์ลิน

1
ทำงานได้ดีสำหรับฉัน
โพร

1
ตามหน้า man git restore .จะกู้คืนไฟล์ทั้งหมดในไดเรกทอรีปัจจุบันไม่ใช่ในพื้นที่เก็บข้อมูลทั้งหมด
jarno

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

35

แทนที่จะทิ้งการเปลี่ยนแปลงฉันรีเซ็ตรีโมตของฉันเป็นจุดกำเนิด หมายเหตุ - วิธีนี้คือการกู้คืนโฟลเดอร์ของคุณไปยัง repo อย่างสมบูรณ์

ดังนั้นฉันจึงทำเช่นนี้เพื่อให้แน่ใจว่าพวกเขาไม่ได้นั่งที่นั่นเมื่อฉันคอมไพล์รีเซ็ต (ในภายหลัง - ยกเว้น gitignores บน Origin / branchname)

หมายเหตุ: หากคุณต้องการเก็บไฟล์ที่ยังไม่ได้ติดตาม แต่ไม่ได้อยู่ใน GITIGNORE คุณอาจต้องการข้ามขั้นตอนนี้เนื่องจากจะลบไฟล์ที่ไม่ได้ติดตามซึ่งไม่พบในที่เก็บระยะไกลของคุณ (ขอบคุณ @XtrmJosh)

git add --all

แล้วฉัน

git fetch --all

จากนั้นฉันจะรีเซ็ตเป็นจุดเริ่มต้น

git reset --hard origin/branchname

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

อัปเดตตามความคิดเห็นของผู้ใช้ด้านล่าง: รูปแบบเพื่อรีเซ็ตสาขาใดก็ตามที่ผู้ใช้เปิดอยู่

git reset --hard @{u}

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

ฉันไม่ได้ใช้ mac หรือ linux, github windows powershell บางครั้งก็ปล่อยไฟล์ไว้ที่นั่นหลังจากทำการรีเซ็ต ฉันคิดว่ามันเพราะการรีเซ็ต git ตั้งค่าไฟล์ทั้งหมดใน repo ให้เป็นสถานะดั้งเดิม หากพวกเขาไม่ได้เพิ่มพวกเขาจะไม่ได้สัมผัส ไคลเอนต์เดสก์ท็อปจะรับ "เฮ้ไฟล์นี้อยู่ที่นี่และจะต้องมุ่งมั่น"
Nick

ความรู้สึกที่ทำ ฉันไม่ได้ใช้ Windows ดังนั้นจึงไม่เห็นปัญหานั้น (ยังไม่เคยใช้ Windows ในช่วงสองสามเดือนที่ผ่านมาอย่างน้อยอย่าจดจำมากไปก่อนหน้านั้น - มันเป็นเรื่องที่น่าเสียใจอย่างมากที่เบลอ) อาจจะมีมูลค่า noting เหตุผลในคำตอบหลักของคุณ :)
XtrmJosh

ฉันเจอปัญหานี้ใน Mac ด้วยตอนนี้ หากไฟล์ไม่ได้รับการติดตามใน Repo บางครั้งการตั้งค่าคอมไพล์ไม่ได้สัมผัส ฉันลาดเทแยก "WHY" จริงๆ แต่เมื่อเกิดเหตุการณ์นี้ขึ้นถ้าฉันรีเซ็ตและฉันยังมีไฟล์หนึ่งหรือสองไฟล์ที่ไม่มีข้อผูกมัดฉันเพิ่ม - ทั้งหมดและรีเซ็ต
Nick

2
สิ่งที่ฉันชอบคือความแตกต่างเล็กน้อยที่จะgit reset --hard @{u}รีเซ็ตสาขาไปที่ใดก็ตามที่สาขาการติดตามระยะไกลในปัจจุบันคือ
user2221343

31

พยายามแก้ไขปัญหาทั้งหมดข้างต้น แต่ก็ยังไม่สามารถกำจัดไฟล์ที่ไม่มีการจัดทำใหม่ได้

ใช้git clean -fเพื่อลบไฟล์ใหม่เหล่านั้น - ด้วยความระมัดระวัง! หมายเหตุตัวเลือกแรง


21

พูดง่าย ๆ

git stash

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

git stash apply 

หรือ git stash pop


21

เพียงใช้:

git stash -u

เสร็จสิ้น ง่าย.

หากคุณสนใจกองซ้อนที่ซ่อนของคุณจริงๆคุณสามารถติดตามgit stash dropได้ แต่ ณ จุดนี้คุณควรใช้ (จาก Mariusz Nowak) ดีกว่า:

git checkout -- .
git clean -df

อย่างไรก็ตามฉันชอบgit stash -uที่สุดเพราะมัน "ยกเลิก" การเปลี่ยนแปลงที่ติดตามและไม่ได้ติดตามทั้งหมดในคำสั่งเดียว แต่git checkout -- .เพียงการติดตามทิ้งการเปลี่ยนแปลงและgit clean -dfการเปลี่ยนแปลงเท่านั้นที่ไม่ได้ติดตามเหลือใช้ ... และการพิมพ์คำสั่งทั้งสองให้ห่างไกลทำงานมากเกินไป :)


หมายเหตุ: git stash -uจะเร็ว ๆ นี้ (Git 2.14.x / 2.15, ไตรมาสที่ 3 ปี 2560) จะพัฒนาขึ้นเล็กน้อย: stackoverflow.com/a/46027357/6309
VonC

หากฉันได้รับคำถามของ OP แก้ไขไฟล์ที่จัดทำดัชนีควรถูกเก็บไว้ ควรลบเฉพาะการเปลี่ยนแปลงที่ไม่มีเวที ดังนั้นควรอยู่git stash -kในความคิดของฉัน
snap

21

ในการทำทิ้งถาวร: git reset --hard

หากต้องการบันทึกการเปลี่ยนแปลงในภายหลัง: git stash


16

สิ่งนี้ใช้ได้แม้ในไดเรกทอรีที่มี นอกการอนุญาตคอมไพล์ปกติ

sudo chmod -R 664 ./* && git checkout -- . && git clean -dfx

เกิดขึ้นกับฉันเมื่อเร็ว ๆ นี้


แต่ระวังว่าเนื้อหาที่คอมไพล์ละเว้นจะไม่ได้รับการอนุญาตดั้งเดิม! ดังนั้นอาจทำให้เกิดความเสี่ยงด้านความปลอดภัย
doublejr

@twicejr คุณผิดโปรดอ่านgit help clean"-d ลบไดเรกทอรีที่ไม่ได้ติดตามนอกเหนือจากไฟล์ที่ไม่ได้ติดตาม"
GlassGhost

เหตุใดคุณจึงตั้งค่าไฟล์ทั้งหมดของคุณให้เป็นโลกแห่งการอ่าน / เขียน? ไม่ใช่วิธีปฏิบัติที่ดี
Ghoti

@Ghoti ฉันไม่ดี 664 ถูกต้อง? คุณยังยินดีที่จะแก้ไขคำตอบ
GlassGhost

การตั้งค่าการอนุญาตทั้งหมดเป็น 664 ทำให้มีข้อสันนิษฐานมากมายเกี่ยวกับการอนุญาตประเภทใดที่โครงการต้องการ ฉันคิดว่าการใช้ส่วนคำสั่งนั้นจะทำให้เกิดปัญหาสำหรับบางคน
ianrandmckenzie



12

ในความเห็นของฉัน,

git clean -df

ควรทำเคล็ดลับ ตามเอกสารประกอบของ Git ในการทำความสะอาด Git

git-clean - ลบไฟล์ที่ไม่ได้ติดตามจากแผนผังการทำงาน

ลักษณะ

ทำความสะอาดแผนผังการทำงานโดยลบไฟล์ที่ไม่อยู่ภายใต้การควบคุมเวอร์ชันซ้ำ ๆ เริ่มจากไดเรกทอรีปัจจุบัน

โดยปกติไฟล์ที่ไม่รู้จักกับ Git เท่านั้นที่จะถูกลบ แต่หากระบุตัวเลือก -x ไฟล์ที่ถูกละเว้นจะถูกลบด้วยเช่นกัน เช่นนี้สามารถเป็นประโยชน์ในการลบผลิตภัณฑ์สร้างทั้งหมด

หากมีการกำหนดอาร์กิวเมนต์ตัวเลือก ... จะมีผลกับพา ธ เหล่านั้นเท่านั้น

ตัวเลือก

-d ลบไดเรกทอรี untracked นอกเหนือจากไฟล์ untracked หากไดเรกทอรีที่ไม่ได้ติดตามได้รับการจัดการโดยที่เก็บ Git อื่นมันจะไม่ถูกลบโดยค่าเริ่มต้น ใช้ตัวเลือก -f สองครั้งหากคุณต้องการลบไดเรกทอรีดังกล่าว

-f - บังคับถ้าตัวแปรการกำหนดค่า Git clean.requireForce ไม่ได้ตั้งค่าเป็นเท็จ git clean จะปฏิเสธที่จะทำงานเว้นแต่จะได้รับ -f, -n หรือ -i


11

ไม่ว่าสถานะของ repo ของคุณจะอยู่ในสถานะใดคุณสามารถรีเซ็ตการกระทำก่อนหน้านี้:

git reset --hard <commit hash>

การดำเนินการนี้จะยกเลิกการเปลี่ยนแปลงทั้งหมดที่เกิดขึ้นหลังจากส่งมอบข้อมูล


2
สิ่งนี้จะทิ้งทุกอย่างในดัชนี (ไม่ใช่เฉพาะสิ่งที่ไม่ได้อยู่ในดัชนี) ซึ่งอยู่นอกเหนือสิ่งที่ OP ร้องขอ
Linus Arver

10

อีกวิธีในการกำจัดไฟล์ใหม่ที่เฉพาะเจาะจงมากกว่า git clean -df (มันจะช่วยให้คุณสามารถกำจัดไฟล์บางไฟล์ที่ไม่จำเป็นทั้งหมด) คือการเพิ่มไฟล์ใหม่ไปยังดัชนีก่อนจากนั้นจึงซ่อน ซ่อน

เทคนิคนี้มีประโยชน์เมื่อด้วยเหตุผลบางอย่างคุณไม่สามารถลบไฟล์ที่ไม่ได้ติดตามทั้งหมดได้อย่างง่ายดายด้วยกลไกปกติ (เช่น rm)


9

สิ่งต่อไปนี้เป็นวิธีแก้ปัญหาเฉพาะเมื่อคุณทำงานกับที่เก็บแยกที่คุณซิงโครไนซ์เป็นประจำ (เช่นคำขอดึง) กับ repo อื่น คำตอบสั้น: ส้อมลบและ refork แต่อ่านคำเตือนบน GitHub

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

ฉันมักจะมีข้อความสถานะ git เช่นนี้ (เกี่ยวข้องกับไฟล์อย่างน้อย 2/4):

$ git status
# Not currently on any branch.
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   doc/PROJECT/MEDIUM/ATS-constraint/constraint_s2var.dats
#       modified:   doc/PROJECT/MEDIUM/ATS-constraint/parsing/parsing_s2var.dats
#
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   doc/PROJECT/MEDIUM/ATS-constraint/constraint_s2Var.dats
#       modified:   doc/PROJECT/MEDIUM/ATS-constraint/parsing/parsing_s2Var.dats

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

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


7

เมื่อคุณต้องการถ่ายโอนที่ซ่อนไปยังคนอื่น:

# add files
git add .  
# diff all the changes to a file
git diff --staged > ~/mijn-fix.diff
# remove local changes 
git reset && git checkout .
# (later you can re-apply the diff:)
git apply ~/mijn-fix.diff

[แก้ไข] ตามความคิดเห็นเป็นไปได้ที่จะตั้งชื่อการซ่อน ใช้สิ่งนี้ถ้าคุณต้องการแชร์ที่เก็บของคุณ;)


5
จริงๆแล้ว Git Stash สามารถมีชื่อได้ git stash save "Feature X work in progress"เช่น
โคลินดีเบนเน็ตต์

7

คุณสามารถสร้างนามแฝงของคุณเองซึ่งอธิบายถึงวิธีการทำในลักษณะอธิบาย

ฉันใช้นามแฝงถัดไปเพื่อยกเลิกการเปลี่ยนแปลง


ยกเลิกการเปลี่ยนแปลงในไฟล์ (รายการ) ในแผนผังการทำงาน

discard = checkout --

จากนั้นคุณสามารถใช้มันเพื่อยกเลิกการเปลี่ยนแปลงทั้งหมด:

discard .

หรือเพียงแค่ไฟล์:

discard filename

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

ทำความสะอาดและทิ้งการเปลี่ยนแปลงและไฟล์ที่ไม่ได้ติดตามในแผนผังการทำงาน

cleanout = !git clean -df && git checkout -- .

ดังนั้นการใช้งานจึงเป็นเรื่องง่ายเหมือนกัน:

cleanout

ตอนนี้มีให้บริการใน repo Github ถัดไปซึ่งมีนามแฝงจำนวนมาก:


7

ฉันมีสถานการณ์แปลก ๆ ที่ไฟล์ไม่มีการจัดฉากเสมอสิ่งนี้ช่วยฉันในการแก้ไข

git rm .gitattributes
git เพิ่ม -A
git reset - ฮาร์ด

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