Mở rộng những gì tôi đã viết trong một bình luận
Nguyên tắc chung là bạn không nên viết lại (thay đổi) lịch sử mà bạn đã xuất bản, bởi vì ai đó có thể đã dựa trên công việc của họ trên đó. Nếu bạn viết lại (thay đổi) lịch sử, bạn sẽ gặp vấn đề với việc hợp nhất các thay đổi của chúng và với việc cập nhật cho chúng.
Vì vậy, giải pháp là tạo ra một mới cam kết đó trở lại trạng thay đổi mà bạn muốn để có được thoát khỏi. Bạn có thể làm điều này bằng cách sử dụng lệnh git Revert .
Bạn có tình huống sau:
A <- B <- C <- D <- master <- ĐẦU
(mũi tên ở đây đề cập đến hướng của con trỏ: tham chiếu "cha mẹ" trong trường hợp xác nhận, cam kết hàng đầu trong trường hợp đầu chi nhánh (chi nhánh ref) và tên của chi nhánh trong trường hợp tham chiếu CHÍNH).
Những gì bạn cần tạo là như sau:
A <- B <- C <- D <- [(BCD) ^ - 1] <- master <- CHÍNH
trong đó "[(BCD) ^ - 1]" có nghĩa là cam kết hoàn nguyên các thay đổi trong các cam kết B, C, D. Toán học cho chúng ta biết rằng (BCD) ^ - 1 = D ^ -1 C ^ -1 B ^ -1, vì vậy bạn có thể nhận được tình huống cần thiết bằng các lệnh sau:
$ git revert --no-commit D
$ git revert --no-commit C
$ git revert --no-commit B
$ git commit -m "the commit message"
Giải pháp thay thế sẽ là kiểm tra nội dung của cam kết A và cam kết trạng thái này:
$ git checkout -f A -- .
$ git commit -a
Sau đó, bạn sẽ có tình huống sau đây:
A <- B <- C <- D <- A '<- master <- CHÍNH
Cam kết A 'có cùng nội dung với cam kết A, nhưng là một cam kết khác (thông điệp cam kết, cha mẹ, ngày cam kết).
Các giải pháp của Jeff Ferland, sửa đổi bởi Charles Bailey xây dựng dựa trên ý tưởng tương tự, nhưng sử dụng thiết lập lại git :
$ git reset --hard A
$ git reset --soft @{1} # (or ORIG_HEAD), which is D
$ git commit
git push -f HEAD~4:master
(giả sử nhánh từ xa là chủ). Vâng, bạn có thể đẩy bất kỳ cam kết như thế.