ลบไฟล์ออกจาก Git commit


1612

ฉันใช้ Git และฉันได้กำหนดให้ใช้ไฟล์น้อย

git commit -a

ต่อมาฉันพบว่ามีการเพิ่มไฟล์ผิดไปยังการคอมมิท

ฉันจะลบไฟล์ออกจากการคอมมิทครั้งล่าสุดได้อย่างไร?


2
ลิงค์นี้เหมาะสำหรับคำถามของคุณ: stackoverflow.com/questions/307828/…
b3h3m0th

@CharlesB: ใช่นี่เป็นความมุ่งมั่นครั้งสุดท้ายของฉัน
Lolly

8
คุณผลักภาระผูกพันไปยังเซิร์ฟเวอร์แล้วหรือยัง
Paritosh Singh

4
ฉันทำมันโดยใช้:git reset filepath
felipekm

คำตอบ:


3088

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

git reset --soft HEAD^ 

หรือ

git reset --soft HEAD~1

จากนั้นรีเซ็ตไฟล์ที่ไม่ต้องการเพื่อไม่ให้คอมมิชชัน:

git reset HEAD path/to/unwanted_file

ตอนนี้คอมมิทอีกครั้งคุณสามารถใช้ข้อความคอมมิทซ้ำได้อีกครั้ง:

git commit -c ORIG_HEAD  

86
ขอบคุณสำหรับสิ่งนี้. มันคุ้มค่าที่เพิ่มว่าถ้าคุณมีการผลักดันของคุณอยู่แล้วก่อนหน้านี้ (ผิด) กระทำและตอนนี้พยายามที่จะ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 ต้นน้ำที่คนอื่นเรียกจาก)
andy magoon

57
git reset --soft HEAD^เป็นการดำเนินการเลิกทำที่พบบ่อยที่สุดของฉัน
funroll

2
@PabloFernandez ก่อนอื่นคำตอบที่ยอมรับอาจเป็นสิ่งที่ OP กำลังมองหา (เช่นกันมันโพสต์เมื่อหลายเดือนก่อน) ประการที่สองคำตอบที่ได้รับการยอมรับอยู่ด้านบนเสมอโดยไม่คำนึงถึงจำนวนโหวต
MITjanitor

4
@PabloFernandez ที่ด้านบนของทุกคำตอบที่มีสามแท็บที่ช่วยให้คุณสามารถควบคุมการสั่งซื้อของคำตอบ: การใช้งาน , ที่เก่าแก่ที่สุดและคะแนนโหวต ฉันเดาเป็นของคุณถูกตั้งไว้ที่เก่าแก่ที่สุด เปลี่ยนเป็นคะแนนโหวตแม้ว่าคำตอบที่ยอมรับจะยังคงอยู่ที่ด้านบน แต่คำตอบนี้จะเป็นอันดับสอง
ahsteele

15
ฉันรู้เรื่องนี้มากgit resetแต่ต้องการวิธีที่จะส่งผลกระทบต่อความมุ่งมั่นที่มีอยู่ "แทนที่" git commit -Cฉันเพียงแค่เรียนรู้เกี่ยวกับ ดังนั้นสำหรับฉันสิ่งที่ฉันต้องการคือสูตรที่แน่นอนของคุณกับอีกหนึ่งขั้นตอน "ใหม่กระทำอีกครั้ง" git commit -C [hash of original HEAD commit from first step]สะกดออกมาเป็น
metamatt

323

ความสนใจ ! หากคุณต้องการลบไฟล์ออกจากการคอมมิชชันก่อนหน้านี้และเก็บไว้ในดิสก์อ่านคำตอบของ juzzlinด้านบน

หากนี่เป็นการกระทำครั้งสุดท้ายของคุณและคุณต้องการลบไฟล์ออกจาก Local และ Repository ระยะไกลของคุณอย่างสมบูรณ์คุณสามารถ:

  1. ลบไฟล์ git rm <file>
  2. กระทำด้วยธงแก้ไข: git commit --amend

ธงแก้ไขบอกให้คอมไพล์กระทำอีกครั้ง แต่ "ผสาน" (ไม่ใช่ในแง่ของการรวมสองสาขา) กระทำนี้ด้วยการกระทำครั้งสุดท้าย

ตามที่ระบุในความคิดเห็นการใช้git rmที่นี่เหมือนกับการใช้rmคำสั่งเอง!


120
คุณสามารถใช้git rm --cachedเพื่อเก็บไฟล์ไว้ในดิสก์ได้ด้วย
Arkadiy Kukarkin

14
คำเตือนสำหรับผู้ที่กำลังอ่านคำตอบนี้: ตรวจสอบให้แน่ใจว่าคุณต้องการลบไฟล์ (เช่นเดียวกับที่หายไปแล้ว!) ไม่ใช่แค่ลบออกจากรายการ Commit
Scott Biggs

8
ในการเพิ่มสิ่งที่คนอื่นพูด (และเพื่อให้ง่ายต่อการจดจำที่จะไม่ทำเช่นนี้ถ้าคุณต้องการจริงๆ): ในคำสั่งจะทำในสิ่งที่ตัวเองไม่! rmgitrm
yo

@CharlesB คุณช่วยกรุณาเพิ่มบันทึกจากข้อคิดเห็นของ Arkadiy Kukarkin ในคำตอบของคุณเพื่อให้มองเห็นได้มากขึ้นหรือไม่?
mopo922

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

165

คำตอบที่มีอยู่ทั้งหมดพูดคุยเกี่ยวกับการลบไฟล์ที่ไม่ต้องการจากที่ผ่านมากระทำ

หากคุณต้องการลบไฟล์ที่ไม่ต้องการออกจากการคอมมิชชันเก่า (แม้แต่การพุช) และไม่ต้องการสร้างการคอมมิทใหม่ซึ่งไม่จำเป็นเนื่องจากการกระทำ:

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

หากคุณโชคไม่ดีที่มีข้อขัดแย้งคุณต้องแก้ไขด้วยตนเอง


2
การทำสิ่งนี้กับนาโนนั้นยอดเยี่ยม! Ctrl + K, Ctrl + U, ใส่ 'f', Ctrl + X, ใส่ 'y' และ voila!
sequielo

6
หากคุณต้องการจริงลบไฟล์จาก repo (ไม่ใช่ระบบแฟ้ม) git rm --cached <file(s)>มากกว่าแค่ย้อนกลับไปยังรุ่นก่อนหน้านี้แล้วแทนการทำขั้นตอนที่
waldyrious

2
รอคุณสามารถย้ายคอมมิทรอบ ๆ ไฟล์การตอบกลับตามต้องการได้ไหม
Dan Rosenstark

2
คุณทำได้โดยสิ้นเชิง แต่คุณอาจจะ (หรืออาจจะ) ขัดแย้งกัน
ไบรอัน

6
กระบวนการนี้อาจจะทำให้ง่ายขึ้นเล็กน้อยโดยการเพิ่ม--fixup=35c23c2กับgit commitคำสั่ง การดำเนินการนี้จะตั้งค่าการคอมมิทอัตโนมัติเป็นการแก้ไขการคอมมิทที่ต้องการและคุณไม่จำเป็นต้องระบุมันในการรีบูต นอกจากนี้ถ้าคุณเพิ่ม--autosquashไปยังgit rebaseคำสั่งคอมไพล์โดยอัตโนมัติจะย้ายกระทำของคุณไปยังตำแหน่งที่ถูกต้องเพื่อให้คุณไม่จำเป็นต้องทำอะไรใน rebase โต้ตอบ - เพียงแค่บันทึกผล (ซึ่งหมายความว่าคุณไม่จำเป็นแม้แต่-iธง แม้ว่าฉันจะชอบที่จะใช้มันเพื่อให้แน่ใจว่าทุกอย่างดูตามที่ฉันคาดหวัง)
Guss

144

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

git reset HEAD^ -- path/to/file
git commit --amend --no-edit

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

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


5
นี่เป็นคำตอบที่ดีกว่ามากสำหรับการลบไฟล์เพียงไฟล์เดียวโดยไม่แก้ไขความมุ่งมั่นทั้งหมด
nimish

ตรงกับคำตอบนี้: D stackoverflow.com/a/27340569/1623984
ThatsAMorais

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

โดยทั้งหมดทิ้งมัน! :) เรามีความคิดที่ถูกต้องชัดเจนและวัตถุประสงค์ก็เพื่อช่วย ฉันคิดว่าการรวมเป็นทฤษฎีที่ดี
ThatsAMorais

คุณจะทำสิ่งนี้ได้อย่างไรถ้าคุณผลักดันให้เป็นสาขาบน github? ฉันพยายามที่จะผลักดันหลังจากทำการแก้ไขนี้และได้รับข้อความ "อัปเดตถูกปฏิเสธเนื่องจากส่วนปลายของสาขาปัจจุบันของคุณอยู่เบื้องหลังคำใบ้: รีโมตคู่"
โอลลี่วิลเลียมส์มี. ค.

41

หากคุณไม่ได้ผลักดันการเปลี่ยนแปลงบนเซิร์ฟเวอร์คุณสามารถใช้

git reset --soft HEAD~1

มันจะรีเซ็ตการเปลี่ยนแปลงทั้งหมดและกลับไปใช้การยอมรับอีกครั้ง

หากคุณผลักดันการเปลี่ยนแปลงให้ทำตามขั้นตอนตามที่ @CharlesB ตอบ


2
การตั้งค่า -1 git ลบการเปลี่ยนแปลงที่เกิดขึ้นไฟล์จากพื้นที่จัดเตรียมการเปลี่ยนแปลงที่ได้กระทำ
CharlesB

OK แต่ฉันจะเก็บ downvote ของฉันเพราะมันไม่ใช่สิ่งที่ OP ต้องการ :) ขอโทษ
CharlesB

โอเคมันดีสำหรับฉัน แต่ทำไมคู่แข่งไม่ต้องการสิ่งนี้ อะไรคือปัญหา?
Paritosh Singh

ไม่ใช่เรื่องใหญ่ แต่เป็นเพราะ OP ต้องการลบไฟล์ที่ไม่ต้องการออกจากการคอมมิทครั้งล่าสุดและมันเพิ่งจะรีเซ็ตเป็นสถานะก่อนที่จะกระทำ ยังคุณต้องทำซ้ำการกระทำ
CharlesB

3
@Aris ใช้ <git diff --cached> เพื่อดูการเปลี่ยนแปลง
Paritosh Singh

37

การลบไฟล์โดยใช้ rm จะเป็นการลบทิ้ง!

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

วิธีคืนไฟล์ให้อยู่ในสถานะก่อนหน้า:

    git checkout <commit_id> <path_to_file>

หรือเพื่อกลับสู่สถานะที่ HEAD ระยะไกล:

    git checkout origin/master <path_to_file>

จากนั้นแก้ไขคอมมิชชันและคุณควรค้นหาไฟล์ได้หายไปจากรายการ (และไม่ถูกลบออกจากดิสก์ของคุณ!)


36
git checkout HEAD~ path/to/file
git commit --amend

1
นี่เป็นวิธีที่ดีที่สุดในการแก้ไขการคอมมิทครั้งล่าสุดอันที่ยังไม่ถูกผลัก การดำเนินการนี้จะรีเซ็ตการเปลี่ยนแปลงในไฟล์เดียวโดยลบไฟล์นั้นออกจากการคอมมิทครั้งล่าสุดอย่างมีประสิทธิภาพ
Alex Bravo

นอกจากนี้ยังเปลี่ยนไฟล์ จะรักษาการเปลี่ยนแปลงในระบบไว้ในไฟล์ได้อย่างไร?
theonlygusti

29

ต่อไปนี้จะ 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

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

27

ฉันจะอธิบายให้คุณตัวอย่าง
ให้ 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>    

หากไฟล์ใดไฟล์หนึ่งไม่ได้อยู่ในการส่งมอบครั้งล่าสุดหรือก่อนหน้านี่เป็นวิธีที่ดีที่สุด ฉันจะบอกว่ามันเป็นวิธีที่หรูหราที่สุดโดยทั่วไป ฉันชอบการลดการโต้ตอบ
bvgheluwe

สำหรับการกระทำเดียวที่เปลี่ยนแปลงnoopไปedit [A_commit_ID]หรือe [A_commit_ID]
TamusJRoyce

23

คุณสามารถลอง

git reset --soft HEAD~1

และสร้างความมุ่งมั่นใหม่

อย่างไรก็ตามมีซอฟต์แวร์ "gitkraken" ที่ยอดเยี่ยม ซึ่งทำให้ง่ายต่อการทำงานกับ git


1
และสิ่งที่ควรทราบ: หลังจากนี้คุณต้องทำการgit commit --amendอัปเดตการลบไฟล์ในการกระทำครั้งล่าสุด และหลังจากนั้นคุณสามารถตรวจสอบได้ว่าถูกลบไปแล้วด้วยgit log -1 --stat
sdbbs

13
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 add -A หรือ git add และพวกเขากลับมา
Alexander Mills

11

การใช้ git GUI สามารถทำให้การลบไฟล์ง่ายขึ้นจากการคอมมิทก่อนหน้า

สมมติว่านี่ไม่ใช่สาขาที่ใช้ร่วมกันและคุณไม่สนใจเขียนประวัติใหม่จากนั้นเรียกใช้:

git gui citool --amend

คุณสามารถยกเลิกการตรวจสอบไฟล์ที่กระทำผิดพลาดแล้วคลิก "ยอมรับ"

ป้อนคำอธิบายรูปภาพที่นี่

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


2
บน Ubuntu คุณสามารถติดตั้ง git gui ด้วยsudo apt-get install git-gui
JDiMatteo

ขอบคุณ! ฉันติดอยู่กับปัญหา (ข้อผิดพลาด?) ซึ่งมีการเพิ่มโฟลเดอร์ที่มี repo .it git และคำสั่งลบปกติทั้งหมดไม่ทำงาน อย่างไรก็ตามสิ่งนี้ช่วยได้ มันไม่กี่คอมกลับฉันใช้ครั้งแรกgit rebase -i HEAD~4แล้วรันคำสั่งของคุณเพื่อเปิดตัวแก้ไข หมายเหตุอื่น: "Unstaging" สามารถพบได้ในเมนู "Commit"
Johny Skovdal

ทางออกที่ง่ายที่สุดของทั้งหมด ง่ายที่สุดที่จะจำ และข้อผิดพลาดได้ง่ายน้อยกว่าการใช้git reset --soft HEAD^(จดจำ - soft arg) แล้วตามด้วยgit commit -c ORIG_HEAD(แทน - แก้ไขซึ่งไขทุกอย่างขึ้น)
Brent Faust

9

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

git checkout origin/<remote-branch> <filename>
git commit --amend

6

ทำลำดับของคำสั่งต่อไปนี้:

//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 .... ' เพื่อป้องกันไม่ให้คุณสูญเสียประวัติ 'git pull') ก่อนกดอีกครั้ง ดูส่วน 'หมายเหตุเกี่ยวกับการส่งต่อที่รวดเร็ว' ของ 'git push --help' สำหรับรายละเอียด (หลังจากดึง Git ฉันมีการเปลี่ยนแปลงที่เดียวกัน)
Dezigo

หมายความว่าสถานะของ repo ระยะไกลของคุณมีการเปลี่ยนแปลงในขณะที่คุณทำงานในท้องถิ่นของคุณ และหลังจากที่ 'git pull' การเปลี่ยนแปลงในท้องถิ่นของคุณควรถูกรวมเข้ากับรีโมต แน่นอนการเปลี่ยนแปลงของคุณจะต้องยังคงอยู่
Sergey Onishchenko

กล่าวอีกนัยหนึ่งหากคุณได้รับข้อผิดพลาดนั้น @Dezigo ให้เพิ่มแฟล็ก -f เพื่อบังคับให้มีการอัปเดต
jungledev

5

แค่ต้องการเติมเต็มคำตอบที่ดีที่สุดเพราะฉันต้องใช้คำสั่งพิเศษ:

git reset --soft HEAD^
git checkout origin/master <filepath>

ไชโย!


ยินดีต้อนรับ คำตอบนี้จะดีกว่าถ้าคุณอธิบายว่าคำสั่งจริงทำอะไร
Mark Chorley

3

สิ่งที่เหมาะกับฉัน แต่ก็ยังคิดว่าควรมีทางออกที่ดีกว่า:

$ git revert <commit_id>
$ git reset HEAD~1 --hard

เพียงออกจากการเปลี่ยนแปลงที่คุณต้องการยกเลิกในการกระทำอื่น ๆ ตรวจสอบคนอื่น ๆ

$ git commit --amend // or stash and rebase to <commit_id> to amend changes

3

git reset --soft HEAD^ปัดความมุ่งมั่นของคุณและเมื่อคุณพิมพ์git statusมันจะบอกคุณว่าจะทำอย่างไร:

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

2

จริงๆแล้วฉันคิดว่าวิธีที่เร็วและง่ายกว่าคือใช้โหมดโต้ตอบ git rebase

git rebase -i head~1  

(หรือหัว ~ 4 คุณต้องการไปไกลแค่ไหน)

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

https://www.youtube.com/watch?v=2dQosJaLN18

หวังว่าคุณจะพบว่ามีประโยชน์


วิดีโอนั้นใช้เวลา 10 นาทีและไม่มีประโยชน์อะไรเลย
MolbOrg

2

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

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

( จุดกำเนิด / คุณสมบัติ / target_branchเป็นสาขาระยะไกลที่ฉันต้องการผลักดันการเปลี่ยนแปลงของฉัน)

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

  1. สร้างสาขาท้องถิ่นจากที่มา / คุณสมบัติ / target_branch ของฉัน - เรียกมันว่าคุณสมบัติ / การจัดเตรียม

  2. ผสานคุณสมบัติสาขาท้องถิ่นของฉันที่ทำงาน/ target_branch กับสาขา/สาขาการจัดเตรียม

  3. ตรวจสอบคุณสมบัติ / การแสดงละครแล้วตั้งค่า git - soft ORIG_HEAD (ตอนนี้การเปลี่ยนแปลงทั้งหมดจากฟีเจอร์ / การจัดเตรียม 'จะจัดฉาก แต่ไม่มีข้อผูกมัด)

  4. ยกเลิกการทำไฟล์ที่ฉันเคยเช็คอินก่อนหน้านี้พร้อมกับการเปลี่ยนแปลงที่ไม่จำเป็น

  5. เปลี่ยนสาขาต้นน้ำสำหรับคุณลักษณะ / การแสดงละครการ กำเนิด / คุณสมบัติ / target_branch

  6. กำหนดส่วนที่เหลือของการเปลี่ยนแปลงตามขั้นตอนและผลักดันอัปสตรีมไปยังแหล่งกำเนิด / คุณสมบัติ / target_branchระยะไกลของฉัน


1

หากคุณไม่ต้องการไฟล์นั้นอีกต่อไปคุณสามารถทำได้

git rm file
git commit --amend
git push origin branch

1

หากคุณใช้ GitHub และยังไม่ได้ส่งการกระทำ GitHub Desktop แก้ปัญหานี้ได้อย่างง่ายดาย:

  1. เลือกที่เก็บ -> เลิกทำข้อผูกพันล่าสุด
  2. ยกเลิกการเลือกไฟล์ที่คุณเพิ่มโดยไม่ตั้งใจ ข้อความคอมมิชชันก่อนหน้าของคุณจะอยู่ในกล่องโต้ตอบแล้ว
  3. กดปุ่ม Commit!

1

หากคุณต้องการลบไฟล์ออกจากคอมมิชชันก่อนหน้าให้ใช้ตัวกรอง

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

1

หากคุณยังไม่ได้ผลักดันการเปลี่ยนแปลงไปยังคอมไพล์

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  

เหมือนข้างบน แต่ก็ช่วย crosscheck ได้จริงๆ
Reshma

0

มันใช้งานได้สำหรับฉันที่จะลบไฟล์ออกจาก repo bit bucket ซึ่งฉันผลักไฟล์ไปที่สาขาในตอนแรก

git checkout origin/develop <path-to-file>
git add <path-to-file>
git commit -m "Message"
git push

0

ฉันคัดลอกไฟล์ปัจจุบันไปยังโฟลเดอร์อื่นแล้วกำจัดการเปลี่ยนแปลงทั้งหมดที่ไม่ได้ล้างโดย:

git reset --hard @{u}

จากนั้นคัดลอกสิ่งต่าง ๆ กลับมา มุ่งมั่นผลักดัน



0
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)

-1

ไม่มีคำตอบในเวลานี้ที่สมเหตุสมผล ดูเหมือนว่ามีความต้องการเพียงพอที่จะเสนอวิธีแก้ปัญหาจริง: https://github.com/git/git/blob/master/Documentation/SubmittingPatches

git - คำสั่ง <ชื่อไฟล์>

จะดี. ฉันได้รับว่าเราไม่ต้องการแก้ไขประวัติ แต่ถ้าฉันเป็นคนท้องถิ่นและเพิ่มไฟล์ "แฮ็ค" โดยไม่ตั้งใจและต้องการลบออกจากคอมมิชชันนี่จะเป็นประโยชน์อย่างยิ่ง

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