วิธีต่างๆในการลบการเปลี่ยนแปลง Git ในเครื่อง


625

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

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

git checkout .

git clean -f

คำถามของฉันคือ

(1) นี่คือวิธีการที่ถูกต้องในการกำจัดการเปลี่ยนแปลงในท้องถิ่นหรืออื่น ๆ โปรดแจ้งให้เราทราบวิธีการที่ถูกต้อง

(2) เราจะใช้เมื่อใดgit reset --hardที่ฉันสามารถรีเซ็ตแม้ไม่มีคำสั่งนี้

ขอบคุณ

* การแก้ไข: การแก้ไขที่สำคัญ: 03/26: * แทนที่คำที่คลุมเครือจำนวนมากด้วยคำศัพท์เฉพาะของคอมไพล์ [ติดตาม / ไม่ได้ติดตาม / จัดฉาก / ไม่ต่อเนื่อง]

อาจมีไฟล์เพียงสามประเภทเมื่อเราทำการเปลี่ยนแปลงในเครื่อง:

ประเภทที่ 1. ไฟล์ที่ถูกติดตามแบบจัดฉาก

ประเภทที่ 2. ไฟล์ที่ไม่ได้ติดตามสถานะ

ประเภทที่ 3. ไฟล์ที่ไม่ได้ติดตาม Unstaged หรือไฟล์ที่ไม่ได้ติดตาม

  • ฉาก - ผู้ที่ถูกย้ายไปยังพื้นที่การแสดงละคร / เพิ่มไปยังดัชนี
  • ไฟล์ที่ถูกติดตาม - แก้ไข
  • เลิกติดตาม - ไฟล์ใหม่ ไม่สเตจเสมอ หากฉากนั่นหมายความว่าพวกเขามีการติดตาม

แต่ละคำสั่งทำอะไร:

  1. git checkout . - ลบไฟล์ที่ไม่ได้ติดตามเท่านั้น [ประเภท 2]

  2. git clean -f - ลบไฟล์ที่ไม่ได้ติดตาม Unstaged เท่านั้น [ประเภท 3]

  3. git reset --hard - ลบไฟล์ที่ติดตามแบบ Staged และ UnStaged เท่านั้น [Type 1, Type 2]

  4. git stash -u - ลบการเปลี่ยนแปลงทั้งหมด [ประเภท 1, ประเภท 2, ประเภท 3]

สรุป:

เป็นที่ชัดเจนว่าเราสามารถใช้อย่างใดอย่างหนึ่ง

(1) combination of `git clean -f` and `git reset --hard` 

หรือ

(2) `git stash -u`

เพื่อให้บรรลุผลตามที่ต้องการ

หมายเหตุ: การซ่อนเนื่องจากคำนี้หมายถึง 'ร้านค้า (บางอย่าง) อย่างปลอดภัยและเป็นความลับในสถานที่ที่ระบุ' git stash popนี้จะสามารถดึงข้อมูลโดยใช้ ดังนั้นการเลือกระหว่างสองตัวเลือกข้างต้นจึงเป็นการเรียกนักพัฒนาซอฟต์แวร์

ขอขอบคุณคุณ Christoph และ Frederik Schøning

แก้ไข: 03/27

ฉันคิดว่ามันคุ้มค่าที่จะนำข้อความ ' ระวัง ' ไปใช้git clean -f

git clean -f

ไม่มีการกลับไป ใช้-nหรือ--dry-runดูตัวอย่างความเสียหายที่คุณจะทำ

หากคุณต้องการลบไดเรกทอรีให้รัน git clean -f -d

หากคุณต้องการลบไฟล์ที่ไม่สนใจให้รัน git clean -f -X

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

การอ้างอิง: เพิ่มเติมเกี่ยวกับgit clean: วิธีลบไฟล์ในเครื่อง (ไม่ได้ติดตาม) ออกจากแผนผังการทำงาน Git ปัจจุบัน

แก้ไข: 05/20/15

การละทิ้งการทำคอมมิชชันทั้งหมดในสาขานี้ [การลบการคอมมิทภายในเครื่อง]

เพื่อที่จะทิ้งข้อผูกพันในท้องถิ่นทั้งหมดในสาขานี้เพื่อให้สาขาในท้องถิ่นเหมือนกับ "อัปสตรีม" ของสาขานี้เพียงแค่เรียกใช้ git reset --hard @{u}

การอ้างอิง: http://sethrobertson.github.io/GitFixUm/fixup.html

หรือทำgit reset --hard origin/master[ถ้าสาขาท้องถิ่นmaster]

หมายเหตุ: 06/12/2015 นี่ไม่ใช่คำถามซ้ำซ้อนของ SO อื่นที่ทำเครื่องหมายว่าซ้ำกัน คำถามนี้กล่าวถึงวิธีลบการเปลี่ยนแปลง GIT ในระบบ [ลบไฟล์ที่เพิ่มลบการเปลี่ยนแปลงที่เพิ่มไปยังไฟล์ที่มีอยู่ ฯลฯ และวิธีการต่าง ๆ ; โดยที่ในเธรด SO อื่นจะระบุวิธีการลบการกระทำในเครื่องเท่านั้น หากคุณเพิ่มไฟล์และต้องการลบเพียงอย่างเดียวเธรด SO อื่นจะไม่พูดถึง ดังนั้นสิ่งนี้จึงไม่ซ้ำกับอีก]

แก้ไข: 06/23/15

วิธีการคืนค่าการคอมมิตที่ผลักไปยังที่เก็บรีโมตแล้ว?

$ git revert ab12cd15

แก้ไข: 09/01/2015

ลบการคอมมิชชันก่อนหน้าจากสาขาโลคัลและรีโมตสาขา

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

git reset --hard HEAD~1 [สำหรับการลบที่กระทำจากสาขาท้องถิ่น]

git push origin HEAD --force[ทั้งสองคำสั่งจะต้องดำเนินการ สำหรับการลบจากสาขาระยะไกล]

สาขาคืออะไร มันเป็นสาขาที่เช็คเอาท์ในปัจจุบัน

แก้ไข 2015/09/08 - ลบคอมไพล์ท้องถิ่นผสาน :

ฉันอยู่ในmasterสาขาและรวมmasterสาขากับสาขาที่ทำงานใหม่phase2

$ git status
# On branch master

$ git merge phase2

$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 8 commits.

ถาม: จะกำจัดการผสานนี้ได้อย่างไร พยายามgit reset --hard และgit clean -d -f ทั้งสองไม่ทำงาน

สิ่งเดียวที่ทำงานอยู่ที่ใด ๆ ของคนดังต่อไปนี้:

$ git reset --hard origin/master

หรือ

$ git reset --hard HEAD~8

หรือ

$ git reset --hard 9a88396f51e2a068bb7 [รหัสการยอมรับ - นี่คือสิ่งที่เกิดขึ้นก่อนที่การรวมทั้งหมดของคุณจะเกิดขึ้น]


1
ฉันเดาว่ากระทู้นี้อาจตอบคำถามของคุณ: stackoverflow.com/questions/1146973/…
Saucier

1
"git stash" จะลบการเปลี่ยนแปลงที่คุณทำไว้
John Ballinger

1
สรุปดี! ฉันจะเพิ่มหมวดหมู่ไฟล์อื่น: "ประเภท 4 ไฟล์ที่ถูกข้าม" git stash -a[หรือ - ทั้งหมด] จะซ่อนไฟล์ที่ละเว้นและไม่ได้ติดตามเช่นกัน git clean -xจะล้างไฟล์ที่ถูกละเว้นด้วย git clean -Xจะล้างเฉพาะไฟล์ที่ถูกละเว้น
Jerry101

2
@JavaDev คำถามของคุณเป็นเหมือนคำตอบ .. ขอบคุณที่คุณคอยแก้ไขและรวบรวมคำตอบทั้งหมด
Bhavuk Mathur

1
ขอบคุณฉันวิ่งทั้ง 4 คำสั่งของคุณเพื่อย้อนกลับการเปลี่ยนแปลงในท้องถิ่น
Vincent Tang

คำตอบ:


505

ทุกอย่างขึ้นอยู่กับสิ่งที่คุณพยายามที่จะยกเลิก / เปลี่ยนกลับ เริ่มต้นโดยการอ่านโพสต์ในการเชื่อมโยงอุเบะของ แต่ลองตอบคำถาม:

ฮาร์ดรีเซ็ต

git reset --hard [HEAD]

ลบการเปลี่ยนแปลงทั้งแบบ staged และ unstaged ไปยังไฟล์ที่ถูกติดตามอย่างสมบูรณ์

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

สะอาด

git clean [-f]

ลบไฟล์ที่ไม่ได้ติดตาม

สำหรับการลบไฟล์ชั่วคราว แต่เก็บการเปลี่ยนแปลงแบบ staged และ unstaged ไปยังไฟล์ที่ถูกติดตามอยู่แล้ว บ่อยครั้งที่ฉันอาจจะทำสิ่งที่เพิกเฉยกฎแทนที่จะทำความสะอาดซ้ำ ๆ เช่นสำหรับโฟลเดอร์ bin / obj ในโปรเจ็กต์ C # ซึ่งโดยปกติคุณต้องการแยกออกจาก repo ของคุณเพื่อประหยัดพื้นที่หรืออะไรทำนองนั้น

ตัวเลือก -f (บังคับ) จะลบไฟล์ที่ไม่ได้ติดตามและยังถูกละเว้นโดย git แม้ว่าจะไม่ได้ใช้กฎ ในกรณีข้างต้นด้วยการเพิกเฉยกฎเพื่อไม่ติดตามโฟลเดอร์ bin / obj แม้ว่า git จะถูกเพิกเฉยกับโฟลเดอร์เหล่านี้ แต่การใช้ตัวเลือกบังคับจะลบไฟล์เหล่านั้นออกจากระบบไฟล์ของคุณ ฉันเคยเห็นการใช้งานเป็นระยะ ๆ เช่นเมื่อใช้งานสคริปต์และคุณต้องการล้างโค้ดของคุณก่อนที่จะนำไปใช้งานซิปหรืออะไรก็ตาม

Git clean จะไม่แตะไฟล์ที่ถูกติดตามอยู่แล้ว

ชำระเงิน "จุด"

git checkout .

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

"เลิกทำการเปลี่ยนแปลงทั้งหมดในแผนผังการทำงานของฉัน"

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

stashing

บางคำตอบพูดถึงการหยุดนิ่ง ตามที่ถ้อยคำบอกเป็นนัย ๆ คุณอาจใช้ stashing เมื่อคุณอยู่ตรงกลางของบางสิ่ง (ไม่พร้อมสำหรับการคอมมิชชัน) และคุณต้องสลับสาขาชั่วคราวหรือทำงานในสถานะอื่นของรหัสของคุณในภายหลังเพื่อกลับไปที่ "ยุ่งเหยิง" โต๊ะเขียนหนังสือ" ฉันไม่เห็นสิ่งนี้นำไปใช้กับคำถามของคุณได้

เพื่อสรุป

โดยทั่วไปหากคุณมั่นใจว่าคุณมีความมุ่งมั่นและอาจผลักดันให้เกิดการเปลี่ยนแปลงที่สำคัญจากระยะไกลหากคุณเพิ่งเล่นไปรอบ ๆ หรือสิ่งที่ชอบการใช้งานgit reset --hard HEADตามด้วยgit clean -fจะเป็นการล้างรหัสของคุณให้อยู่ในสถานะแน่นอน และเช็คเอาท์จากสาขา สิ่งสำคัญคือต้องเน้นว่าการรีเซ็ตจะลบการ staged แต่ไม่เปลี่ยนแปลง มันจะล้างทุกอย่างที่ไม่ได้กระทำ (ยกเว้นไฟล์ที่ไม่ได้ติดตามซึ่งในกรณีนี้ให้ใช้ล้าง )

คำสั่งอื่น ๆ ทั้งหมดอยู่ที่นั่นเพื่อช่วยอำนวยความสะดวกให้กับสถานการณ์ที่ซับซ้อนมากขึ้นซึ่งจำเป็นต้องมี "การยกเลิกสิ่งของ" ที่ละเอียดมาก :)

ฉันรู้สึกว่าคำถาม # 1 ของคุณครอบคลุม แต่ท้ายที่สุดเพื่อสรุปที่ # 2: เหตุผลที่คุณไม่เคยพบที่จำเป็นต้องใช้git reset --hardคือคุณไม่เคยจัดฉากอะไรเลย มีฉากที่คุณเปลี่ยนแปลงค่าgit checkout .มิได้git clean -fจะได้หวนกลับว่า

หวังว่านี้ครอบคลุม


git reset --hardขอขอบคุณสำหรับเหตุผลที่อยู่เบื้องหลังการใช้ ฉันพยายามออกและใช่ .. ไฟล์เหล่านั้นเพิ่มลงในดัชนี (การแสดงละคร) ถูกถอดออกเฉพาะหลังจากที่git reset --hardและผมถือว่าเป็นค่าเริ่มต้นคือgit reset --hard git reset --hard headลิงค์นี้ยังมีประโยชน์gitready.com/beginner/2009/01/18/the-staging-area.html
spiderman

ฉันปรับปรุงคำตอบของฉันทำไมฉันคิดว่าgit stash -uเหมาะสมที่สุดที่นี่
Christoph

2
ขอบคุณทั้งคู่ ฉันสรุปคำตอบแล้วฝังลงในคำถามของฉัน Christoph บอกให้ฉันรู้ว่าอะไรgit stash -uจะทำอย่างไรและจะเปิดมันอย่างไร แต่ Frederik ให้ฉันรู้ว่ารีเซ็ตอย่างหนักและใช้การรวมกันของgit reset --hardและgit clean -fและทำไมไม่stashเป็นที่ต้องการในบางสถานการณ์ ตอนนี้โปรดช่วยฉันในการเลือกสิ่งที่ฉันควรทำเครื่องหมายเป็นคำตอบ :) ทั้งสองเป็นคำตอบของฉัน
เดอ

3
.คือ pathspec ที่อ้างถึงไดเรคทอรี่การทำงานปัจจุบันซึ่งอาจเป็นรูทของ repo จาก git-scm.com: git checkout [<tree-ish>] [--] <pathspec>…อัปเดตพา ธ ที่มีชื่อในแผนผังการทำงานจากไฟล์ดัชนีหรือจากชื่อ <tree-ish>
Jerry101

3
มันไม่เคยเน้นพอว่าทั้งสองgit reset --hardและgit clean -dfxและเช่นเดียวกับที่มีการทำลายล้าง อย่างไรก็ตามโปรดแก้ไขตัวพิมพ์เล็กheadในคำตอบซึ่งควรเป็นตัวพิมพ์ใหญ่HEADหรือไม่แสดงเลย
Pavel Šimerda

25

เหตุผลในการเพิ่มคำตอบในขณะนี้:

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

ฉันได้เพิ่มคำสั่ง git ที่ใช้บ่อยซึ่งช่วยฉันใน git เพื่อช่วยคนอื่นด้วย

โดยทั่วไปในการทำความสะอาดท้องถิ่นกระทำทั้งหมด $ git reset --hardและ $ git clean -d -f


ขั้นตอนแรกก่อนที่คุณจะดำเนินการใด ๆ คือการกำหนดค่าชื่อผู้ใช้และอีเมลที่ปรากฏขึ้นพร้อมกับการกระทำของคุณ

#Sets ชื่อที่คุณต้องการแนบกับการทำธุรกรรมของคุณ

$ git config --global user.name "[name]"

#Sets อีเมลที่คุณต้องการแนบกับการทำธุรกรรมของคุณ

$ git config --global user.email "[email address]"

#List การกำหนดค่าระดับโลก

$ git config --list

# ระบุ URL ระยะไกล

$ git remote show origin

#ตรวจสอบสถานะ

git status

#List สาขาโลคัลและรีโมตทั้งหมด

git branch -a

#create สาขาท้องถิ่นใหม่และเริ่มทำงานกับสาขานี้

git checkout -b "branchname" 

หรือสามารถทำได้เป็นกระบวนการสองขั้นตอน

สร้างสาขา: git branch branchname ทำงานกับสาขานี้:git checkout branchname

#commit การเปลี่ยนแปลงในท้องถิ่น [กระบวนการสองขั้นตอน: - เพิ่มไฟล์ไปยังดัชนีซึ่งหมายถึงการเพิ่มไปยังพื้นที่จัดเตรียม จากนั้นส่งไฟล์ที่มีอยู่ในพื้นที่จัดเตรียม]

git add <path to file>

git commit -m "commit message"

#checkout สาขาท้องถิ่นอื่น ๆ

git checkout "local branch name"

#remove การเปลี่ยนแปลงทั้งหมดในสาขาท้องถิ่น [สมมติว่าคุณทำการเปลี่ยนแปลงบางอย่างในสาขาท้องถิ่นเช่นการเพิ่มไฟล์ใหม่หรือแก้ไขไฟล์ที่มีอยู่หรือทำการกระทำในเครื่อง แต่ไม่จำเป็นต้องใช้อีกต่อไป] git clean -d -fและgit reset --hard [ล้างการเปลี่ยนแปลงในเครื่องทั้งหมดไปยังสาขาท้องถิ่นยกเว้น กระทำในท้องถิ่น]

git stash -u ยังลบการเปลี่ยนแปลงทั้งหมด

หมายเหตุ: เป็นที่ชัดเจนว่าเราสามารถใช้การรวมกัน (1) git clean –d –fและและgit reset --hard (2) git stash -u เพื่อให้ได้ผลลัพธ์ที่ต้องการ

หมายเหตุ 1: การซ่อนเนื่องจากคำนี้หมายถึง 'ร้านค้า (บางสิ่ง) อย่างปลอดภัยและเป็นความลับในสถานที่ที่ระบุ' สามารถเรียกคืนได้เสมอโดยใช้ git stash pop ดังนั้นการเลือกระหว่างสองตัวเลือกข้างต้นจึงเป็นการเรียกนักพัฒนาซอฟต์แวร์

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

# เปลี่ยนเป็นสาขาหลักและตรวจสอบให้แน่ใจว่าคุณทันสมัย

git checkout master

git fetch [อาจจำเป็น (ขึ้นอยู่กับการกำหนดค่า git ของคุณ) เพื่อรับการอัปเดตที่จุดเริ่มต้น / หลัก]

git pull

# ผสานสาขาคุณลักษณะเข้ากับสาขาหลัก

git merge feature_branch

# รีเซ็ตสาขาหลักเป็นสถานะของต้นกำเนิด

git reset origin/master

# บังเอิญลบไฟล์ออกจากในเครื่องจะเรียกคืนกลับมาได้อย่างไร ทำ a git statusเพื่อให้ได้รับไฟล์พา ธ ที่สมบูรณ์ของทรัพยากรที่ถูกลบ

git checkout branchname <file path name>

แค่นั้นแหละ!

# รวมสาขาหลักกับ someotherbranch

git checkout master
git merge someotherbranchname

#rename สาขาท้องถิ่น

git branch -m old-branch-name new-branch-name

#delete สาขาท้องถิ่น

git branch -D branch-name

#delete สาขาระยะไกล

git push origin --delete branchname

หรือ

git push origin :branch-name

#revert คอมมิตส่งไปยังที่เก็บรีโมตแล้ว

git revert hgytyz4567

# สาขาจากการคอมมิชชันก่อนหน้าโดยใช้ GIT

git branch branchname <sha1-of-commit>

#Change ส่งข้อความการส่งข้อความล่าสุดที่ส่งไปยังรีโมตแล้ว

git commit --amend -m "new commit message"
git push --force origin <branch-name>

# ยกเลิกการกระทำในท้องถิ่นทั้งหมดในสาขานี้ [การลบการกระทำในท้องถิ่น]

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

git reset --hard @{u}

การอ้างอิง: http://sethrobertson.github.io/GitFixUm/fixup.html หรือทำgit reset --hard origin/master[ถ้าสาขาในท้องถิ่นเป็นหลัก]

# ยกเลิกการส่งข้อมูลไปที่ที่เก็บรีโมตแล้วหรือไม่

$ git revert ab12cd15

# ลบการคอมมิชชันก่อนหน้าจากสาขาโลคัลและรีโมตสาขา

Use-Case:คุณเพิ่งส่งการเปลี่ยนแปลงไปยังสาขาในพื้นที่ของคุณและผลักไปที่สาขาระยะไกลทันทีทันใดตระหนักแล้วว่าไม่! ฉันไม่ต้องการการเปลี่ยนแปลงนี้ ตอนนี้ทำอะไร

git reset --hard HEAD~1[สำหรับการลบที่กระทำจากสาขาท้องถิ่น 1 หมายถึงสิ่งที่คุณมอบให้]

git push origin HEAD --force[ทั้งสองคำสั่งจะต้องดำเนินการ สำหรับการลบจากสาขาระยะไกล] สาขาที่เช็คเอาท์ในปัจจุบันจะถูกเรียกว่าสาขาที่คุณทำการดำเนินการนี้

#Delete การคอมมิทล่าสุดบางส่วนจากโลคอล repo ในพื้นที่และระยะไกล (การคืนค่าประเภทกระทำจากท้องถิ่นและระยะไกล)

สมมติว่าคุณมี 3 ข้อตกลงที่คุณผลักไปยังสาขาระยะไกลที่ชื่อว่า ' develop'

commitid-1 done at 9am
commitid-2 done at 10am
commitid-3 done at 11am. // latest commit. HEAD is current here.

หากต้องการเปลี่ยนกลับเป็นการกระทำแบบเดิม (เพื่อเปลี่ยนสถานะของสาขา)

git log --oneline --decorate --graph // เพื่อดูค่าคอมมิชชันทั้งหมดของคุณ

git clean -d -f // ล้างการเปลี่ยนแปลงในท้องถิ่น

git reset --hard commitid-1 // การคืนค่าภายในการยอมรับนี้

git push -u origin +develop// ดันสถานะนี้ไปที่รีโมต + เพื่อทำการผลักดัน

# ลบการรวมคอมไพล์ในท้องถิ่น: กรณี: ฉันอยู่ในสาขาหลักและผสานสาขาหลักที่มีสาขาใหม่ที่ทำงานเฟส 2

$ git status

ในสาขาต้นแบบ

$ git merge phase2 $ git status

ในสาขาต้นแบบ

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

ถาม: จะกำจัด git ในพื้นที่นี้ได้อย่างไร พยายามgit reset --hardและgit clean -d -fทั้งสองไม่ทำงาน สิ่งเดียวที่ทำงานอยู่ที่ใด ๆ ของคนดังต่อไปนี้:

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

หรือ

$ git reset - ฮาร์ด HEAD ~ 8

หรือ

$ git reset --hard 9a88396f51e2a068bb7 [รหัสการยอมรับ - นี่คือสิ่งที่เกิดขึ้นก่อนที่การรวมทั้งหมดของคุณจะเกิดขึ้น]

#create ไฟล์ gitignore

touch .gitignore // สร้างไฟล์ในผู้ใช้ mac หรือ unix

ตัวอย่าง. gitignore เนื้อหา:

.project
*.py
.settings

ลิงก์อ้างอิงไปยังแผ่นโกง GIT: https://services.github.com/on-demand/downloads/github-git-cheat-sheet.pdf


1
คำสั่งของคุณสำหรับการลบระยะไกลสาขาอาจจะไม่ดีที่สุด คุณกำลังใช้git push origin :branch-nameแต่ฉันแนะนำให้ใช้git push origin --delete branchname
vibs2006

เห็นด้วยฉันอัพเดตด้วยคำแนะนำของคุณขอบคุณ @ vibs2006
เดอร์แมน

21

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

สิ่งที่มีประโยชน์git stash -uคือ

  1. มันอาจเป็นคำสั่งเดียวที่ง่ายที่สุด (เท่านั้น?) เพื่อให้บรรลุเป้าหมายของคุณ
  2. ถ้าคุณเปลี่ยนใจหลังจากนั้นคุณก็จะได้งานทั้งหมดกลับมาgit stash pop(เหมือนกับการลบอีเมลใน Gmail ซึ่งคุณสามารถยกเลิกได้ถ้าคุณเปลี่ยนใจในภายหลัง)

ในฐานะของคำถามอื่น ๆ ของคุณจะไม่ลบไฟล์ที่ไม่ได้ติดตามเพื่อให้คุณยังคงต้องgit reset --hard git clean -fแต่git stash -uอาจจะสะดวกที่สุด


git reset --hardจะไม่ลบไฟล์ที่ไม่ได้ติดตามแน่นอน แต่จะลบการเปลี่ยนแปลงที่ไม่ได้ติดตามเช่นการเปลี่ยนแปลงไฟล์ที่มีอยู่ในดัชนีแล้ว ฉันแน่ใจว่านั่นคือสิ่งที่คุณหมาย :)
เฟรดเดอหลง-Schøning

เมื่อฉันใช้git stash -uฉันเห็นการตอบสนองนี้จาก gash bash "ที่บันทึกไว้ทำงานไดเรกทอรีและรัฐดัชนี WIP ใน {} BRANCHNAME อาจจะเป็นหนึ่งที่บันทึกไว้นี้เป็นสิ่งที่เราสามารถเรียกใช้. git stash pop.
เดอร์แมน

ขอบคุณทั้งคู่ ฉันสรุปคำตอบแล้วฝังลงในคำถามของฉัน Christoph บอกให้ฉันรู้ว่าอะไรgit stash -uจะทำอย่างไรและจะเปิดมันอย่างไร แต่ Frederik ให้ฉันรู้ว่ารีเซ็ตอย่างหนักและใช้การรวมกันของgit reset --hardและgit clean -fและทำไมไม่stashเป็นที่ต้องการในบางสถานการณ์ ตอนนี้โปรดช่วยฉันในการเลือกสิ่งที่ฉันควรทำเครื่องหมายเป็นคำตอบ :) ทั้งสองเป็นคำตอบของฉัน
เดอ

แต่จะเกิดอะไรขึ้นถ้ามีไฟล์ที่ฉันเพิ่มลงในที่เก็บของฉันที่ฉันไม่ต้องการติดตาม เฉพาะใน repo ของฉัน หากฉันเพิ่มลงในรายชื่อที่ไม่ใช้แล้วฉันมีไฟล์. signore ที่จะส่งมอบซึ่งจะส่งผลกระทบต่อคนอื่นเช่นกัน
user20358

7

1. เมื่อคุณไม่ต้องการให้การเปลี่ยนแปลงในระบบของคุณเกิดขึ้นเลย

git reset --hard

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

2. เมื่อคุณต้องการเก็บการเปลี่ยนแปลงในเครื่องของคุณ

หากคุณต้องการดึงการเปลี่ยนแปลงใหม่จากระยะไกลและต้องการเพิกเฉยต่อการเปลี่ยนแปลงในระหว่างนั้น

git stash

มันจะซ่อนการเปลี่ยนแปลงในเครื่องทั้งหมดตอนนี้คุณสามารถดึงการเปลี่ยนแปลงจากระยะไกลได้

git pull

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

git stash pop

1
git reset --hardไม่ลบการเปลี่ยนแปลงในเครื่องทั้งหมด มันลบการแก้ไขเท่านั้น หากคุณต้องการที่จะลบการเพิ่มคุณจะต้องgit clean -fd
John Henckel


4

ฉันคิดว่าคอมไพล์มีสิ่งหนึ่งที่ไม่ได้บันทึกไว้อย่างชัดเจน ฉันคิดว่ามันถูกทอดทิ้งจริง ๆ

git checkout .

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

มีการgit clean -fdทำงานที่ดีสำหรับไฟล์ที่ไม่ได้ติดตาม

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

แต่ฉันคิดว่าพวกเขาควรจะgit checkoutไม่มีตัวเลือกใด ๆ ลบการเปลี่ยนแปลงที่ไม่จัดเตรียมไว้ทั้งหมดและไม่แตะต้องฉากนั้น มันเป็นแบบแยกส่วนและใช้งานง่าย มากขึ้นเช่นสิ่งที่git resetไม่ git cleanควรทำเช่นเดียวกัน


2

วิธีที่ดีที่สุดคือตรวจสอบการเปลี่ยนแปลง

การเปลี่ยนไฟล์ pom.xml ในโปรเจ็กต์ชื่อ project-name คุณสามารถทำได้:

git status

# modified:   project-name/pom.xml

git checkout project-name/pom.xml
git checkout master

# Checking out files: 100% (491/491), done.
# Branch master set up to track remote branch master from origin.
# Switched to a new branch 'master'

2

สำหรับทิ้งทุกอย่างที่ฉันต้องการซ่อนและวางที่ซ่อนมันเป็นวิธีที่เร็วที่สุดที่จะทิ้งทั้งหมดโดยเฉพาะถ้าคุณทำงานระหว่าง repos หลาย ๆ อัน

นี่จะซ่อนการเปลี่ยนแปลงทั้งหมดใน{0}กุญแจและวางจากทันที{0}

git stash && git stash drop


1

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

สถานะ $ git

กว่าลอง

$ git รีเซ็ต - ยาก

มันจะรีเซ็ตสาขาของคุณเป็นค่าเริ่มต้น

แต่ถ้าคุณต้องการเลิกทำ:

$ แก้ไข (1) $ git เพิ่ม frotz.c filfre.c $ mailx (2) $ git reset
(3) $ git pull git: //info.example.com/ nitfol


อ่านเพิ่มเติม >> https://git-scm.com/docs/git-reset


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