2012-04-14 34 views
59

Tôi đang cố gắng xóa 2 lần commit cuối cùng trong một trong các kho lưu trữ GitHub của tôi. Tôi đã thử như đề xuất here: git push -f origin HEAD ^^: master. Dường như nó hoạt động, hai lần commit cuối cùng bị loại bỏ.Làm thế nào để xóa cam kết n cuối cùng trên Github và cục bộ?

Sau đó, tôi đã xóa chúng khỏi kho lưu trữ cục bộ của mình bằng lệnh git rebase -i HEAD ~ 2. Tôi loại bỏ các dòng hơn là có liên quan với những cam kết, và kiểm tra với git đăng nhập rằng chúng được gỡ bỏ một cách chính xác.

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

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

Bất kỳ ý tưởng nào?

Trả lời

112

Để tháo hai cam kết cuối cùng tại địa phương tôi muốn đề nghị sử dụng:

git reset --hard HEAD^^ 

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

+14

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

+0

Bạn có thể khái quát hóa điều này cho số lần commit cuối cùng không? –

+3

@ user_19 bạn có thể làm những việc như 'git reset --hard HEAD^4' hoặ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 kết hợp. Bạn có thể tìm thêm thông tin về việc chỉ định các sửa đổi trong phần tương ứng [tại đây] (https://www.kernel.org/pub/software/scm/git/docs/git-rev-parse.html). –

12

Các công trình sau đây đối với tôi

git reset HEAD~n 

Nó loại bỏ các n cam kết cuối cùng từ repo địa phương, như HEAD^ chỉ có một loại bỏ. Nếu bạn cần phải loại bỏ những thay đổi này từ xa, bạn có thể cần phải ép buộc vì bạn sẽ ở đằng sau điều khiển từ xa.

git push -f origin <branch> 
22

Nếu bạn muốn loại bỏ 2 (hai) cam kết cuối cùng, có một lệnh đơn giản để làm điều đó:

git reset --hard HEAD~2 

Bạn có thể thay đổi 2 cho bất kỳ số cuối cùng cam kết mà bạn muốn tẩy.

Và để thúc đẩy sự thay đổi này đến từ xa, bạn cần phải làm một git push với lực lượng (-f) tham số:

git push -f 

Tuy nhiên, tôi không khuyên bạn nên làm bất cứ lệnh git với -f hoặc --hard tùy chọn có liên quan nếu có cam kết mới trên điều khiển từ xa (Github) sau khi cam kết mà bạn muốn xóa. Trong trường hợp đó, hãy luôn sử dụng git revert.

+0

Thực hiện các thay đổi tôi đã thực hiện? –

+0

@SymfonyUser, no. Khi bạn thực hiện lệnh 'hard', bạn * mất * hai lần commit này. Nếu bạn muốn lưu các thay đổi, hãy tạo một tệp 'diff' của các cam kết này trước khi áp dụng đặt lại. – Dherik

+1

@ZuhayerTahir nếu bạn chỉ muốn hoàn tác * cam kết * cho 5 lần commit cuối cùng thì chỉ cần thực hiện 'git reset HEAD ~ 5' (không sử dụng' hard'). Bằng cách này, bạn sẽ nhận được những thay đổi của bạn trong một trạng thái dàn dựng (tức là không cam kết). Đối với tôi, hãy xem [câu trả lời này] (https://stackoverflow.com/a/927386/5175709). – Honey

Các vấn đề liên quan