Git: Xóa tệp đã cam kết sau khi đẩy


112

Có khả năng hoàn nguyên tệp đã cam kết trong Git không? Tôi đã đẩy một cam kết lên GitHub và sau đó tôi nhận ra rằng có một tệp mà tôi không muốn được đẩy (tôi chưa hoàn thành các thay đổi).


1
Bạn có muốn xóa hoàn toàn tệp khỏi GitHub sau một lần đẩy không? Nếu không, bạn chỉ cần: git rm <file>, git push.
rdrmntn


Câu trả lời:


153

cập nhật: thêm phương pháp an toàn hơn

phương pháp ưa thích:

  1. kiểm tra trạng thái trước đó (không thay đổi) của tệp của bạn; chú ý dấu gạch ngang đôi

    git checkout HEAD^ -- /path/to/file
    
  2. cam kết nó:

    git commit -am "revert changes on this file, not finished with it yet"
    
  3. đẩy nó, không cần lực:

    git push
    
  4. quay trở lại công việc chưa hoàn thành của bạn, làm lại (mũi tên lên 3 lần):

    git checkout HEAD^ -- /path/to/file
    

hiệu quả 'bỏ cam kết':

Để sửa đổi cam kết cuối cùng của HEAD kho lưu trữ, làm xáo trộn công việc vô tình bị đẩy của bạn, trong khi có khả năng xảy ra xung đột với đồng nghiệp của bạn, người có thể đã kéo nó rồi và người sẽ tóc bạc và mất nhiều thời gian cố gắng hòa giải người đứng đầu chi nhánh địa phương của mình với trung tâm:

Để xóa thay đổi tệp khỏi lần cam kết cuối cùng:

  1. để hoàn nguyên tệp về trạng thái trước lần cam kết cuối cùng, hãy thực hiện:

    git checkout HEAD^ /path/to/file
    
  2. để cập nhật cam kết cuối cùng với tệp đã hoàn nguyên, hãy thực hiện:

    git commit --amend
    
  3. để đẩy cam kết cập nhật vào repo, hãy thực hiện:

    git push -f
    

Thực sự, hãy xem xét sử dụng phương pháp ưa thích đã đề cập trước đây.


1
Trừ khi bạn là nhà phát triển duy nhất trong một dự án, bạn thực sự không nên sử dụng git push -f. Nó tạo ra nhiều vấn đề hơn giá trị của nó. Chỉ cần xóa tệp sau đó thực hiện một cam kết mới.
richardm

1
@ user553086 không thể đồng ý hơn. Tốt hơn rồi?
xor

Điều này có khả thi với những cam kết trở lại lịch sử không? Ví dụ: Tôi có thể làm điều này với git checkout HEAD~2 /path/to/file? Chỉnh sửa: Có vẻ như những gì tôi muốn trong trường hợp của mình chỉ đơn giản làgit rm /path/to/file
starscream_disco_party.

1
Bạn vừa tiết kiệm cho tôi 4 tiếng đồng hồ!
Tosin Onikute

57

Nếu bạn muốn xóa tệp khỏi repo từ xa, trước tiên hãy xóa tệp khỏi dự án của bạn bằng tùy chọn --cache và sau đó đẩy tệp:

git rm --cache /path/to/file
git commit -am "Remove file"
git push

(Điều này hoạt động ngay cả khi tệp đã được thêm vào repo từ xa một số cam kết trước đó) Hãy nhớ thêm vào .gitignore các phần mở rộng tệp mà bạn không muốn đẩy.


2
Thao tác này sẽ xóa các tệp khỏi chuyển tiếp cam kết này, nhưng các tệp vẫn hiển thị trong các cam kết cũ hơn.
Ken

30

Bạn chỉ có thể hoàn nguyên một tệp về một bản sửa đổi được chỉ định.

Đầu tiên, bạn có thể kiểm tra những cam kết nào mà tệp đã được thay đổi.

git log path/to/file.txt

Sau đó, bạn có thể kiểm tra tệp với số sửa đổi.

git checkout 3cdc61015724f9965575ba954c8cd4232c8b42e4 /path/to/file.txt

Sau đó, bạn có thể cam kết và đẩy lại.


7

Đặt lại tệp ở trạng thái chính xác, cam kết và đẩy lại.

Nếu bạn chắc chắn rằng không ai khác đã tìm nạp các thay đổi của bạn, bạn có thể sử dụng --amendkhi cam kết, để sửa đổi cam kết trước đó của bạn (tức là viết lại lịch sử) và sau đó đẩy. Tuy nhiên, tôi nghĩ bạn sẽ phải sử dụng -ftùy chọn khi đẩy, để ép.


4
  1. Nhận mã băm của lần cam kết cuối cùng.

    • git log
  2. Hoàn nguyên cam kết
    • git revert <hash_code_from_git_log>
  3. Đẩy mạnh các thay đổi
    • git push

kiểm tra trong GHR. bạn có thể nhận được những gì bạn cần, hy vọng bạn điều này hữu ích

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.