Những gì tôi làm trong những trường hợp này là:
Trong máy chủ, di chuyển con trỏ trở lại cam kết tốt đã biết cuối cùng:
git push -f origin <last_known_good_commit>:<branch_name>
Tại địa phương, làm tương tự:
git reset --hard <last_known_good_commit>
# ^^^^^^
# optional
Xem ví dụ đầy đủ về một nhánh my_new_branch
mà tôi đã tạo cho mục đích này:
$ git branch
my_new_branch
Đây là lịch sử gần đây sau khi thêm một số nội dung vào myfile.py
:
$ git log
commit 80143bcaaca77963a47c211a9cbe664d5448d546
Author: me
Date: Wed Mar 23 12:48:03 2016 +0100
Adding new stuff in myfile.py
commit b4zad078237fa48746a4feb6517fa409f6bf238e
Author: me
Date: Tue Mar 18 12:46:59 2016 +0100
Initial commit
Tôi muốn thoát khỏi cam kết cuối cùng, đã được thúc đẩy, vì vậy tôi chạy:
$ git push -f origin b4zad078237fa48746a4feb6517fa409f6bf238e:my_new_branch
Total 0 (delta 0), reused 0 (delta 0)
To git@github.com:me/myrepo.git
+ 80143bc...b4zad07 b4zad078237fa48746a4feb6517fa409f6bf238e -> my_new_branch (forced update)
Đẹp! Bây giờ tôi thấy tệp đã được thay đổi trên cam kết đó ( myfile.py
) hiển thị trong "không được phân loại cho cam kết":
$ git status
On branch my_new_branch
Your branch is up-to-date with 'origin/my_new_branch'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: myfile.py
no changes added to commit (use "git add" and/or "git commit -a")
Vì tôi không muốn những thay đổi này, tôi cũng chỉ di chuyển con trỏ trở lại cục bộ:
$ git reset --hard b4zad078237fa48746a4feb6517fa409f6bf238e
HEAD is now at b4zad07 Initial commit
Vì vậy, bây giờ CHÍNH nằm trong cam kết trước đó, cả ở địa phương và từ xa:
$ git log
commit b4zad078237fa48746a4feb6517fa409f6bf238e
Author: me
Date: Tue Mar 18 12:46:59 2016 +0100
Initial commit