ฉันใช้ Git และฉันได้กำหนดให้ใช้ไฟล์น้อย
git commit -a
ต่อมาฉันพบว่ามีการเพิ่มไฟล์ผิดไปยังการคอมมิท
ฉันจะลบไฟล์ออกจากการคอมมิทครั้งล่าสุดได้อย่างไร?
git reset filepath
ฉันใช้ Git และฉันได้กำหนดให้ใช้ไฟล์น้อย
git commit -a
ต่อมาฉันพบว่ามีการเพิ่มไฟล์ผิดไปยังการคอมมิท
ฉันจะลบไฟล์ออกจากการคอมมิทครั้งล่าสุดได้อย่างไร?
git reset filepath
คำตอบ:
ฉันคิดว่าคำตอบอื่น ๆ ที่นี่ผิดเพราะเป็นคำถามของการย้ายไฟล์ที่กระทำผิดพลาดกลับไปยังพื้นที่จัดเตรียมจากการส่งก่อนหน้าโดยไม่ยกเลิกการเปลี่ยนแปลงที่ทำกับพวกเขา สามารถทำได้เช่นเดียวกับ Paritosh Singh ที่แนะนำ:
git reset --soft HEAD^
หรือ
git reset --soft HEAD~1
จากนั้นรีเซ็ตไฟล์ที่ไม่ต้องการเพื่อไม่ให้คอมมิชชัน:
git reset HEAD path/to/unwanted_file
ตอนนี้คอมมิทอีกครั้งคุณสามารถใช้ข้อความคอมมิทซ้ำได้อีกครั้ง:
git commit -c ORIG_HEAD
git push
แก้ไขปัญหาของคุณได้ถึง repo Updates were rejected because the tip of your current branch is behind its remote counterpart.
ของคุณก็จะบ่น ถ้าคุณแน่ใจว่าคุณต้องการที่จะผลักดันพวกเขา (เช่นมันเป็นทางแยกของคุณ) แล้วคุณสามารถใช้ตัวเลือกที่จะบังคับให้ผลักดันเช่น-f
git push origin master -f
(อย่าทำเช่นนี้กับ repo ต้นน้ำที่คนอื่นเรียกจาก)
git reset --soft HEAD^
เป็นการดำเนินการเลิกทำที่พบบ่อยที่สุดของฉัน
git reset
แต่ต้องการวิธีที่จะส่งผลกระทบต่อความมุ่งมั่นที่มีอยู่ "แทนที่" git commit -C
ฉันเพียงแค่เรียนรู้เกี่ยวกับ ดังนั้นสำหรับฉันสิ่งที่ฉันต้องการคือสูตรที่แน่นอนของคุณกับอีกหนึ่งขั้นตอน "ใหม่กระทำอีกครั้ง" git commit -C [hash of original HEAD commit from first step]
สะกดออกมาเป็น
ความสนใจ ! หากคุณต้องการลบไฟล์ออกจากการคอมมิชชันก่อนหน้านี้และเก็บไว้ในดิสก์อ่านคำตอบของ juzzlinด้านบน
หากนี่เป็นการกระทำครั้งสุดท้ายของคุณและคุณต้องการลบไฟล์ออกจาก Local และ Repository ระยะไกลของคุณอย่างสมบูรณ์คุณสามารถ:
git rm <file>
git commit --amend
ธงแก้ไขบอกให้คอมไพล์กระทำอีกครั้ง แต่ "ผสาน" (ไม่ใช่ในแง่ของการรวมสองสาขา) กระทำนี้ด้วยการกระทำครั้งสุดท้าย
ตามที่ระบุในความคิดเห็นการใช้git rm
ที่นี่เหมือนกับการใช้rm
คำสั่งเอง!
git rm --cached
เพื่อเก็บไฟล์ไว้ในดิสก์ได้ด้วย
rm
git
rm
git commit --amend
git reflog
ดังนั้นจึงไม่เลวร้ายอย่างที่ความเห็นอื่น ๆ แนะนำ
คำตอบที่มีอยู่ทั้งหมดพูดคุยเกี่ยวกับการลบไฟล์ที่ไม่ต้องการจากที่ผ่านมากระทำ
หากคุณต้องการลบไฟล์ที่ไม่ต้องการออกจากการคอมมิชชันเก่า (แม้แต่การพุช) และไม่ต้องการสร้างการคอมมิทใหม่ซึ่งไม่จำเป็นเนื่องจากการกระทำ:
1
ค้นหาการกระทำที่คุณต้องการให้ไฟล์เป็นไปตาม
git checkout <commit_id> <path_to_file>
คุณสามารถทำได้หลายครั้งหากคุณต้องการลบไฟล์จำนวนมาก
2
git commit -am "remove unwanted files"
3
ค้นหา commit_id ของการมอบหมายที่เพิ่มไฟล์ผิดพลาดสมมติว่า "35c23c2" ที่นี่
git rebase 35c23c2~1 -i // notice: "~1" is necessary
คำสั่งนี้เปิดตัวแก้ไขตามการตั้งค่าของคุณ ค่าเริ่มต้นคือกลุ่ม
ย้ายการคอมมิทล่าสุดซึ่งควร "ลบไฟล์ที่ไม่ต้องการ" ไปยังบรรทัดถัดไปของคอมมิทที่ไม่ถูกต้อง ("35c23c2" ในกรณีของเรา) และตั้งคำสั่งเป็นfixup
:
pick 35c23c2 the first commit
fixup 0d78b28 remove unwanted files
คุณควรจะดีหลังจากบันทึกไฟล์
เพื่อเสร็จสิ้น:
git push -f
หากคุณโชคไม่ดีที่มีข้อขัดแย้งคุณต้องแก้ไขด้วยตนเอง
git rm --cached <file(s)>
มากกว่าแค่ย้อนกลับไปยังรุ่นก่อนหน้านี้แล้วแทนการทำขั้นตอนที่
--fixup=35c23c2
กับgit commit
คำสั่ง การดำเนินการนี้จะตั้งค่าการคอมมิทอัตโนมัติเป็นการแก้ไขการคอมมิทที่ต้องการและคุณไม่จำเป็นต้องระบุมันในการรีบูต นอกจากนี้ถ้าคุณเพิ่ม--autosquash
ไปยังgit rebase
คำสั่งคอมไพล์โดยอัตโนมัติจะย้ายกระทำของคุณไปยังตำแหน่งที่ถูกต้องเพื่อให้คุณไม่จำเป็นต้องทำอะไรใน rebase โต้ตอบ - เพียงแค่บันทึกผล (ซึ่งหมายความว่าคุณไม่จำเป็นแม้แต่-i
ธง แม้ว่าฉันจะชอบที่จะใช้มันเพื่อให้แน่ใจว่าทุกอย่างดูตามที่ฉันคาดหวัง)
ตามคำตอบที่ได้รับการยอมรับคุณสามารถทำได้โดยการรีเซ็ตการกระทำทั้งหมด แต่นี่เป็นวิธีที่ค่อนข้างหนัก
วิธีที่ดีกว่าในการทำเช่นนี้คือการเก็บข้อมูลและเพียงแค่ลบไฟล์ที่ถูกเปลี่ยนแปลงออกไป
git reset HEAD^ -- path/to/file
git commit --amend --no-edit
git reset
จะนำไฟล์ที่มันเป็นในก่อนหน้านี้กระทำการและขั้นตอนในดัชนี ไฟล์ในไดเรกทอรีทำงานไม่ถูกแตะต้อง
ความgit commit
มุ่งมั่นนั้นจะกระทำและสควอชดัชนีเป็นกระทำปัจจุบัน
การดำเนินการนี้จะใช้เวอร์ชันของไฟล์ที่อยู่ในการคอมมิชชันก่อนหน้าและเพิ่มไปยังคอมมิชชันปัจจุบัน ซึ่งส่งผลให้ไม่มีการเปลี่ยนแปลงสุทธิและดังนั้นไฟล์จะถูกลบออกอย่างมีประสิทธิภาพจากการกระทำ
หากคุณไม่ได้ผลักดันการเปลี่ยนแปลงบนเซิร์ฟเวอร์คุณสามารถใช้
git reset --soft HEAD~1
มันจะรีเซ็ตการเปลี่ยนแปลงทั้งหมดและกลับไปใช้การยอมรับอีกครั้ง
หากคุณผลักดันการเปลี่ยนแปลงให้ทำตามขั้นตอนตามที่ @CharlesB ตอบ
การลบไฟล์โดยใช้ rm จะเป็นการลบทิ้ง!
คุณเพิ่มการคอมมิทในคอมมิทแทนที่จะลบดังนั้นในอินสแตนซ์นี้ให้ส่งไฟล์กลับไปยังสถานะที่เคยทำก่อนหน้าคอมมิท (นี่อาจเป็นการกระทำที่ลบ 'rm' หากไฟล์นั้นใหม่) กระทำซ้ำอีกครั้งและไฟล์จะไป
วิธีคืนไฟล์ให้อยู่ในสถานะก่อนหน้า:
git checkout <commit_id> <path_to_file>
หรือเพื่อกลับสู่สถานะที่ HEAD ระยะไกล:
git checkout origin/master <path_to_file>
จากนั้นแก้ไขคอมมิชชันและคุณควรค้นหาไฟล์ได้หายไปจากรายการ (และไม่ถูกลบออกจากดิสก์ของคุณ!)
git checkout HEAD~ path/to/file
git commit --amend
ต่อไปนี้จะ unstage เฉพาะไฟล์ที่คุณตั้งใจซึ่งเป็นสิ่งที่ OP ถาม
git reset HEAD^ /path/to/file
คุณจะเห็นสิ่งต่อไปนี้ ...
การเปลี่ยนแปลงที่จะเกิดขึ้น: (ใช้ "git reset HEAD ... " เป็น unstage)
modified: / path / to / file
การเปลี่ยนแปลงที่ไม่ได้จัดเตรียมไว้สำหรับส่ง: (ใช้ "git เพิ่ม ... " เพื่ออัปเดตสิ่งที่จะส่ง) (ใช้ "เช็คเอาต์ git - ... " เพื่อยกเลิกการเปลี่ยนแปลงในไดเรกทอรีทำงาน)
modified: / path / to / file
ณ จุดนี้คุณสามารถทำสิ่งที่คุณต้องการไฟล์เช่นการรีเซ็ตเป็นรุ่นอื่น
เมื่อคุณพร้อมที่จะส่งมอบ:
git commit --amend -a
หรือ (หากคุณมีการเปลี่ยนแปลงอื่น ๆ เกิดขึ้นซึ่งคุณไม่ต้องการกระทำ)
git commit add /path/to/file
git commit --amend
ฉันจะอธิบายให้คุณตัวอย่าง
ให้ A, B, C เป็น 3 อย่างต่อเนื่อง Commit B มีไฟล์ที่ไม่ควรคอมมิท
git log # take A commit_id
git rebase -i "A_commit_ID" # do an interactive rebase
change commit to 'e' in rebase vim # means commit will be edited
git rm unwanted_file
git rebase --continue
git push --force-with-lease <branchName>
noop
ไปedit [A_commit_ID]
หรือe [A_commit_ID]
คุณสามารถลอง
git reset --soft HEAD~1
และสร้างความมุ่งมั่นใหม่
อย่างไรก็ตามมีซอฟต์แวร์ "gitkraken" ที่ยอดเยี่ยม ซึ่งทำให้ง่ายต่อการทำงานกับ git
git commit --amend
อัปเดตการลบไฟล์ในการกระทำครั้งล่าสุด และหลังจากนั้นคุณสามารถตรวจสอบได้ว่าถูกลบไปแล้วด้วยgit log -1 --stat
git rm --cached <file_to_remove_from_commit_<commit_id>_which_added_file>
git commit -m "removed unwanted file from git"
จะทำให้คุณยังไฟล์ท้องถิ่น หากคุณไม่ต้องการไฟล์ภายในเครื่องคุณสามารถข้ามตัวเลือก --cached
หากงานทั้งหมดอยู่ในสาขาท้องถิ่นของคุณคุณต้องเก็บไฟล์ไว้ในภายหลังและเหมือนมีประวัติที่สะอาดฉันคิดว่าวิธีที่ง่ายกว่าคือ:
git rm --cached <file_to_remove_from_commit_<commit_id>_which_added_file>
git commit --squash <commit_id>
git add <file_to_remove_from_commit_<commit_id>_which_added_file>
git commit -m "brand new file!"
git rebase --interactive <commit_id>^
และคุณสามารถเสร็จสิ้นการรีบูตได้อย่างง่ายดายโดยไม่ต้องจำคำสั่งที่ซับซ้อนมากขึ้นหรือส่งข้อความหรือพิมพ์มาก
การใช้ git GUI สามารถทำให้การลบไฟล์ง่ายขึ้นจากการคอมมิทก่อนหน้า
สมมติว่านี่ไม่ใช่สาขาที่ใช้ร่วมกันและคุณไม่สนใจเขียนประวัติใหม่จากนั้นเรียกใช้:
git gui citool --amend
คุณสามารถยกเลิกการตรวจสอบไฟล์ที่กระทำผิดพลาดแล้วคลิก "ยอมรับ"
ไฟล์จะถูกลบออกจากการกระทำ แต่จะถูกเก็บไว้บนดิสก์ ดังนั้นหากคุณยกเลิกการตรวจสอบไฟล์หลังจากเพิ่มไฟล์ผิดพลาดมันจะแสดงในรายการไฟล์ที่ไม่ได้ติดตามของคุณ (และหากคุณยกเลิกการตรวจสอบไฟล์หลังจากแก้ไขไฟล์โดยไม่ตั้งใจมันจะแสดงในการเปลี่ยนแปลงของคุณ
sudo apt-get install git-gui
git rebase -i HEAD~4
แล้วรันคำสั่งของคุณเพื่อเปิดตัวแก้ไข หมายเหตุอื่น: "Unstaging" สามารถพบได้ในเมนู "Commit"
git reset --soft HEAD^
(จดจำ - soft arg) แล้วตามด้วยgit commit -c ORIG_HEAD
(แทน - แก้ไขซึ่งไขทุกอย่างขึ้น)
หากคุณต้องการรักษาคอมมิชชันของคุณ (บางทีคุณอาจใช้เวลาในการเขียนข้อความการคอมมิทโดยละเอียดและไม่ต้องการให้มันหายไป) และคุณต้องการลบไฟล์ออกจากคอมมิชชัน แต่ไม่ใช่จากที่เก็บทั้งหมด:
git checkout origin/<remote-branch> <filename>
git commit --amend
ทำลำดับของคำสั่งต่อไปนี้:
//to remove the last commit, but preserve changes
git reset --soft HEAD~1
//to remove unneded file from the staging area
git reset HEAD `<your file>`
//finally make a new commit
git commit -m 'Your message'
แค่ต้องการเติมเต็มคำตอบที่ดีที่สุดเพราะฉันต้องใช้คำสั่งพิเศษ:
git reset --soft HEAD^
git checkout origin/master <filepath>
ไชโย!
สิ่งที่เหมาะกับฉัน แต่ก็ยังคิดว่าควรมีทางออกที่ดีกว่า:
$ git revert <commit_id>
$ git reset HEAD~1 --hard
เพียงออกจากการเปลี่ยนแปลงที่คุณต้องการยกเลิกในการกระทำอื่น ๆ ตรวจสอบคนอื่น ๆ
$ git commit --amend // or stash and rebase to <commit_id> to amend changes
git reset --soft HEAD^
ปัดความมุ่งมั่นของคุณและเมื่อคุณพิมพ์git status
มันจะบอกคุณว่าจะทำอย่างไร:
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
จริงๆแล้วฉันคิดว่าวิธีที่เร็วและง่ายกว่าคือใช้โหมดโต้ตอบ git rebase
git rebase -i head~1
(หรือหัว ~ 4 คุณต้องการไปไกลแค่ไหน)
จากนั้นแทนที่ 'เลือก' ให้ใช้ 'แก้ไข' ฉันไม่ได้ตระหนักว่า 'แก้ไข' มีประสิทธิภาพเพียงใด
https://www.youtube.com/watch?v=2dQosJaLN18
หวังว่าคุณจะพบว่ามีประโยชน์
มีปัญหาเดียวกันกับที่ฉันมีการเปลี่ยนแปลงในสาขาท้องถิ่นที่ฉันต้องการเปลี่ยนไฟล์เพียงไฟล์เดียว สิ่งที่ทำงานให้ฉันคือ -
( คุณสมบัติ / target_branchด้านล่างเป็นที่ที่ฉันมีการเปลี่ยนแปลงทั้งหมดรวมถึงสิ่งที่ฉันต้องการยกเลิกสำหรับไฟล์เฉพาะ)
( จุดกำเนิด / คุณสมบัติ / target_branchเป็นสาขาระยะไกลที่ฉันต้องการผลักดันการเปลี่ยนแปลงของฉัน)
( คุณสมบัติ / การแสดงละครเป็นสาขาชั่วคราวของฉันที่ฉันจะผลักดันจากการเปลี่ยนแปลงทั้งหมดที่ฉันต้องการยกเว้นการเปลี่ยนแปลงไปยังไฟล์เดียว)
สร้างสาขาท้องถิ่นจากที่มา / คุณสมบัติ / target_branch ของฉัน - เรียกมันว่าคุณสมบัติ / การจัดเตรียม
ผสานคุณสมบัติสาขาท้องถิ่นของฉันที่ทำงาน/ target_branch กับสาขา/สาขาการจัดเตรียม
ตรวจสอบคุณสมบัติ / การแสดงละครแล้วตั้งค่า git - soft ORIG_HEAD (ตอนนี้การเปลี่ยนแปลงทั้งหมดจากฟีเจอร์ / การจัดเตรียม 'จะจัดฉาก แต่ไม่มีข้อผูกมัด)
ยกเลิกการทำไฟล์ที่ฉันเคยเช็คอินก่อนหน้านี้พร้อมกับการเปลี่ยนแปลงที่ไม่จำเป็น
เปลี่ยนสาขาต้นน้ำสำหรับคุณลักษณะ / การแสดงละครการ กำเนิด / คุณสมบัติ / target_branch
กำหนดส่วนที่เหลือของการเปลี่ยนแปลงตามขั้นตอนและผลักดันอัปสตรีมไปยังแหล่งกำเนิด / คุณสมบัติ / target_branchระยะไกลของฉัน
หากคุณไม่ต้องการไฟล์นั้นอีกต่อไปคุณสามารถทำได้
git rm file
git commit --amend
git push origin branch
หากคุณใช้ GitHub และยังไม่ได้ส่งการกระทำ GitHub Desktop แก้ปัญหานี้ได้อย่างง่ายดาย:
หากคุณต้องการลบไฟล์ออกจากคอมมิชชันก่อนหน้าให้ใช้ตัวกรอง
git filter-branch --prune-empty --index-filter 'git rm --ignore-unmatch --cached "file_to_be_removed.dmg"'
หากคุณเห็นข้อผิดพลาดนี้:
ไม่สามารถสร้างข้อมูลสำรองใหม่ การสำรองข้อมูลก่อนหน้านี้มีอยู่ในการอ้างอิง / ต้นฉบับ / บังคับเขียนทับการสำรองข้อมูลด้วย -f
เพียงแค่ลบการสำรองข้อมูลอ้างอิงใน repo ท้องถิ่นของคุณ
$ rm -rf .git/refs/original/refs
หากคุณยังไม่ได้ผลักดันการเปลี่ยนแปลงไปยังคอมไพล์
git reset --soft HEAD~1
มันจะรีเซ็ตการเปลี่ยนแปลงทั้งหมดและกลับไปใช้การยอมรับอีกครั้ง
หากนี่เป็นการกระทำครั้งสุดท้ายที่คุณทำและคุณต้องการลบไฟล์ออกจากที่เก็บในเครื่องและรีโมตลอง:
git rm <file>
git commit --amend
หรือดีกว่า:
รีเซ็ตก่อน
git reset --soft HEAD~1
รีเซ็ตไฟล์ที่ไม่ต้องการ
git reset HEAD path/to/unwanted_file
กระทำอีกครั้ง
git commit -c ORIG_HEAD
มันใช้งานได้สำหรับฉันที่จะลบไฟล์ออกจาก repo bit bucket ซึ่งฉันผลักไฟล์ไปที่สาขาในตอนแรก
git checkout origin/develop <path-to-file>
git add <path-to-file>
git commit -m "Message"
git push
ฉันคัดลอกไฟล์ปัจจุบันไปยังโฟลเดอร์อื่นแล้วกำจัดการเปลี่ยนแปลงทั้งหมดที่ไม่ได้ล้างโดย:
git reset --hard @{u}
จากนั้นคัดลอกสิ่งต่าง ๆ กลับมา มุ่งมั่นผลักดัน
คุณสามารถใช้คำสั่งนี้:
git restore --staged <file>
Here is the step to remove files from Git Commit.
>git reset --soft HEAD^1(either commitid ) -- now files moved to the staging area.
>git rm --cached filename(it will removed the file from staging area)
>git commit -m 'meaningfull message'(Now commit the required files)
ไม่มีคำตอบในเวลานี้ที่สมเหตุสมผล ดูเหมือนว่ามีความต้องการเพียงพอที่จะเสนอวิธีแก้ปัญหาจริง: https://github.com/git/git/blob/master/Documentation/SubmittingPatches
git - คำสั่ง <ชื่อไฟล์>
จะดี. ฉันได้รับว่าเราไม่ต้องการแก้ไขประวัติ แต่ถ้าฉันเป็นคนท้องถิ่นและเพิ่มไฟล์ "แฮ็ค" โดยไม่ตั้งใจและต้องการลบออกจากคอมมิชชันนี่จะเป็นประโยชน์อย่างยิ่ง