Làm thế nào để sửa đổi cam kết cuối cùng để bỏ thêm một tập tin?


108

Tôi đã sửa đổi hai tập tin a, btrong cam kết cuối cùng. Nhưng tập tin bkhông nên được cam kết, quy trình làm việc để sửa đổi điều này là gì?

Câu trả lời:


109

Cập nhật (vài năm sau)

Jan Hudec

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ỏ.


... Then stash/delete b, re-commit.., Ở đây không nên lời Thenđược after? - --amendsau stach / xóa b, ...
Xiè Jìléi

@ 谢 继: nói cách khác, lưu b trước, sau đó cam kết --amend, sau đó khôi phục? Thật. Tôi đã cập nhật câu trả lời.
VonC

Với sức mạnh của chỉ số git, việc bảo ai đó cất / lưu tệp chỉ là sự ngớ ngẩn đơn giản (-1). Thật là tầm thường khi loại bỏ nó khỏi chỉ mục.
Jan Hudec

1
@JanHudec Đúng, tôi đã chỉnh sửa câu trả lời cho phù hợp. Tôi đã không theo dõi câu trả lời cũ đó gần giống như tôi làm trên Stack Overflow. Dù sao thì 99% câu hỏi git về SU nên được di chuyển trên SO.
VonC

66
  1. 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.
  2. 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.
  3. git commit --amend- sửa đổi mà cuối cùng cam kết bao gồm các chỉ số thay đổi

9
Imho đó là một câu trả lời tốt hơn nhiều sau đó là câu trả lời được chấp nhận.
mik01aj

1
Lưu ý rằng bạn không nên sử dụng git 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.
17:30

1
Hoặc git rm --cached path/to/file/to/revertđể bỏ tập tin mà không xóa nó khỏi cây.
Jan Hudec

13

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.


1
@VonC: Chỉnh sửa và chia các bản vá là hoạt động khá phổ biến đối với người dùng git nặng, vì vậy gui được thiết kế để làm cho nó dễ dàng và là công cụ tốt nhất IMO cho nó.
Jan Hudec

Đó là một trong những hoạt động! Tôi đã không thành công với các tùy chọn khác cho nhiệm vụ cụ thể đó. Cảm ơn vì tiền hỗ trợ!
Serguzest

10

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 --cachedvà loại bỏ các điệu nhảy sao lưu / khôi phục (-1).
Jan Hudec

Cảm ơn đã chỉ ra rằng. Tôi muốn chia sẻ cách tôi đã làm điều này bởi vì đây là cách tiếp cận tôi cảm thấy thoải mái nhất ngay cả sau khi đọc toàn bộ chủ đề.
pingo

4

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.

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.