Câu trả lời:
Cập nhật (vài năm sau)
Việc loại bỏ nó khỏi chỉ mục là chuyện nhỏ.
Đúng: bạn có thể dễ dàng đặt lại một tệp vào nội dung chỉ mục của nó, vì câu trả lời gần đây hơn (được viết bởi Matt Connolly ) gợi ý:
git reset HEAD^ path/to/file/to/revert
HEAD^
cho phép tệp truy cập nội dung của nó trong lần xác nhận trước đó trước lần cuối.
Sau đó, bạn có thể git commit --amend
, như tôi ban đầu đã viết dưới đây.
Với Git 2.23 (tháng 8 năm 2019), bạn có thể sử dụng lệnh mớigit restore
git restore --source=HEAD^ --staged -- path/to/file/to/revert
ngắn hơn:
git restore -s@^ -S -- path/to/file/to/revert
Một lần nữa, sau đó bạn có thể git commit --amend
, như tôi ban đầu đã viết dưới đây.
Câu trả lời gốc (tháng 1 năm 2011)
Nếu đây là lần cam kết cuối cùng của bạn (và bạn chưa đẩy nó đi bất cứ đâu), bạn có thể sửa đổi nó:
(stash đầu tiên hoặc lưu b
)
git commit --amend
Sau đó xóa b, tái cam kết. Khôi phục b và bạn đã hoàn tất.
--amend
Được sử dụng để sửa đổi đầu của chi nhánh hiện tại.
Chuẩn bị đối tượng cây mà bạn muốn thay thế cam kết mới nhất như bình thường (bao gồm các đường dẫn -i / -o và tường minh thông thường) và trình soạn thảo nhật ký cam kết được gieo bằng thông điệp cam kết từ đầu nhánh hiện tại.
Cam kết bạn tạo thay thế cho mẹo hiện tại - nếu đó là hợp nhất, nó sẽ có cha mẹ của mẹo hiện tại là cha mẹ - vì vậy cam kết hàng đầu hiện tại bị loại bỏ.
git diff --name-only HEAD^
- (tùy chọn) sử dụng để liệt kê các tệp đã thay đổi trong lần xác nhận cuối cùng.git reset HEAD^ path/to/file/to/revert
- để đặt lại chỉ mục về phiên bản cuối cùng đó, không để lại bản sao làm việc.git commit --amend
- sửa đổi mà cuối cùng cam kết bao gồm các chỉ số thay đổigit commit -a --amend
(tức là không thêm tệp) cho bước 3 hoặc bạn sẽ cam kết thay đổi bản sao làm việc của mình, đó là những chỉnh sửa bạn đang cố xóa. Bước 2.5 tùy chọn có thể là git checkout path/to/file/to/revert
để làm sạch bản sao làm việc của bạn.
git rm --cached path/to/file/to/revert
để bỏ tập tin mà không xóa nó khỏi cây.
Ngoài ra, nếu bạn đang sử dụng git gui
, bạn chỉ cần chọn tùy chọn "Sửa đổi lần cam kết cuối cùng", tập tin đã thêm xuất hiện trong danh sách "Giai đoạn", nhấp vào biểu tượng của nó để di chuyển nó vào danh sách "Unstaged" và cam kết.
Nếu bạn muốn xóa b khỏi cam kết cuối cùng của bạn
git rm --cached b (will preserve the file in the working tree but remove it from the index)
git commit --amend
Nếu bạn muốn xóa tất cả các thay đổi thành b trong lần xác nhận cuối cùng của bạn
(backup b)
(modify b to state before incorrect commit)
git commit --amend
(restore b)
git rm --cached
và loại bỏ các điệu nhảy sao lưu / khôi phục (-1).
Một giải pháp thay thế không yêu cầu hack chỉ mục, nhưng dù sao vẫn giữ thông điệp cam kết cũ:
$ git reset HEAD^
$ git add <all the files you want, excluding the one you don't want>
$ git commit -C HEAD@{1}
Tôi thích điều này bởi vì (a) nó sử dụng các lệnh tôi thường xuyên sử dụng và (b) tôi có thể làm git add -p
để tìm ra chính xác những gì tôi muốn cam kết.
... Then stash/delete b, re-commit..
, Ở đây không nên lờiThen
đượcafter
? ---amend
sau stach / xóa b, ...