Làm cách nào để xóa n cam kết cuối cùng trên Github và cục bộ?


127

Tôi đang cố gắng xóa 2 lần xác nhận cuối cùng khỏi một trong các kho GitHub của mình. Tôi đã thử như đề xuất ở đây : git push -f origin HEAD^^:master. Có vẻ như nó hoạt động, vì hai cam kết cuối cùng được gỡ bỏ.

Sau đó, tôi đã xóa chúng khỏi kho lưu trữ cục bộ của tôi với git rebase -i HEAD~2. Tôi xóa các dòng có liên quan đến các cam kết đó và kiểm tra xem git logchúng có bị xóa chính xác không.

Sau đó, tôi thực hiện một số thay đổi trong kho lưu trữ cục bộ của mình, tạo một cam kết mới và đẩy lên GitHub. Vấn đề là, trong tài khoản GitHub của tôi, tôi có hai cam kết trước đó mà tôi đã cố xóa.

Tôi nghĩ vấn đề nằm ở kho lưu trữ cục bộ của tôi, bởi vì nếu tôi sao chép kho lưu trữ Github của mình sang cục bộ của mình và thực hiện một số thay đổi ở đây, khi tôi đẩy một cam kết mới, các cam kết cũ đó sẽ không bị đẩy sang GitHub.

Bất kỳ ý tưởng?

Câu trả lời:


199

Để xóa hai lần xác nhận cuối cùng cục bộ, tôi khuyên bạn nên sử dụng:

git reset --hard HEAD^^

Rebase là một hoạt động hoàn toàn khác sẽ không giúp bạn ở đây.


23
Nếu bạn đã đẩy thay đổi này đến một kho lưu trữ từ xa. Bạn có thể loại bỏ nó bằng git đẩy -f
Ivan Fernandez

Bạn có thể khái quát điều này cho số lần cam kết cuối cùng không?
user_19

6
@ user_19 bạn có thể làm những việc như git reset --hard HEAD^4hoặc git reset --hard HEAD~4. Mặc dù, mọi thứ có thể hơi phức tạp nếu lịch sử của bạn chứa các sự hợp nhất. Bạn có thể tìm thêm thông tin về việc chỉ định sửa đổi trong phần tương ứng ở đây .
KL-7

2
Nếu tôi muốn xóa 7 lần xác nhận cuối cùng thì sao ?? Tôi có cần đặt 7 lần ^ sau TRƯỚC ... xin vui lòng xóa tôi
Gagan Gami

4
@GaganGami, tôi nghĩ bạn sẽ làm được git reset --hard HEAD~7, nhưng vui lòng sửa lại cho tôi nếu tôi sai.
Con Antonakos

105

Nếu bạn muốn xóa 2 (hai) lần xác nhận cuối cùng, có một lệnh dễ dàng để thực hiện điều đó:

git reset --hard HEAD~2

Bạn có thể thay đổi 2bất kỳ số lần xác nhận cuối cùng nào bạn muốn xóa.

Và để đẩy thay đổi này sang điều khiển từ xa, bạn cần thực hiện git pushvới tham số force ( -f):

git push -f

Tuy nhiên, tôi không khuyên bạn nên thực hiện bất kỳ gitlệnh nào có -fhoặc --hardtùy chọn liên quan nếu có các cam kết mới trên điều khiển từ xa (Github) sau khi cam kết này mà bạn muốn xóa. Trong trường hợp đó, luôn luôn sử dụng git revert.


Làm những thay đổi tôi đã ở lại?
Zuhayer Tahir

@SymfonyUser, không. Khi bạn thực hiện hardlệnh, bạn mất hai cam kết này. Nếu bạn muốn lưu các thay đổi, hãy tạo một difftệp của các cam kết này trước khi áp dụng thiết lập lại.
Dherik

3
@ZuhayerTahir nếu bạn muốn hoàn tác cam kết cho 5 lần xác nhận cuối cùng thì cứ làm git reset HEAD~5(không sử dụng hard). Bằng cách này, bạn sẽ nhận được các thay đổi của mình ở trạng thái theo giai đoạn (nghĩa là không cam kết). Đối với tôi xem câu trả lời này .
Mật ong

@Honey Cảm ơn bạn đã phản hồi. Tôi đi đến kết luận tương tự.
Zuhayer Tahir

29

Các công việc sau đây cho tôi

git reset HEAD~n

Nó loại bỏ các ncam kết cuối cùng khỏi repo cục bộ, vì HEAD^chỉ xóa một. Nếu bạn cần loại bỏ những thay đổi này từ xa, bạn có thể cần phải đẩy mạnh vì bạn sẽ đứng sau điều khiển từ xa.

git push -f origin <branch>
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.