Làm cách nào để thêm tệp vào một cam kết trước đó?


84

Trong một giờ trước, tôi đã sửa đổi các tệp

A
ATest
B
BTest

Để đảm bảo các thông điệp cam kết của tôi phù hợp với thay đổi thực tế, cam kết Avới một mô tả. Rất tiếc, tôi đã không đưa ATestvào cam kết đó.

Trong khi đó, vẫn chưa cam kết là BBTest.

Cách tốt nhất để tiến hành vào thời điểm này là gì? Tôi muốn:

  1. Hoàn nguyên cam kết trước đó mà không ảnh hưởng đến các tệp hiện chưa được cam kết của tôi?
  2. Thêm một tệp khác theo cùng một mô tả vào cam kết trước đó?

Tôi nghĩ rằng 2 nên là cách bình thường để làm. Vấn đề về nó là gì?
Adrian Shum,

Câu trả lời:


140

Để thêm tệp mới vào cam kết trước đó:

$ git add new-file
$ git commit --amend

Bạn có thể sử dụng git commit --amend --no-editnếu bạn không muốn thay đổi thông báo cam kết.


3
Cảm ơn bạn. Do tò mò, nếu sha1 của commit đã được biết đến và commit không phải là 'cuối cùng' thì làm sao có thể sửa đổi commit đó ?
James Raitsev

6
@Jam Tôi muốn nói rằng hãy cố gắng thực sự để không làm điều đó ;-) Nhưng nếu bạn phải, một cách (không chắc liệu nó có phải là tốt nhất không) là cam kết tệp mới làm cam kết của chính nó và sau đó sử dụng git rebase -iđể sắp xếp lại các cam kết và hợp nhất cam kết tệp mới với cam kết khác. Đó có thể là tài liệu cho một câu hỏi riêng biệt.
David Z,

3
Khi làm git rebase -inhư @DavidZ đề xuất, tất cả những gì bạn phải làm là di chuyển cam kết mới xuống ngay dưới từ mà bạn muốn kết hợp với nó và thay đổi từ của cam kết mới thành squashthay vìpick
MM

Điều gì sẽ xảy ra nếu tôi sắp xếp nhiều tệp, nhưng tôi chỉ muốn thêm một tệp duy nhất vào cam kết sửa đổi?
dfrankow

Bỏ gắn dấu sao của tất cả các tệp theo giai đoạn (ví dụ git reset:), sau đó phân đoạn tệp bạn muốn thêm, sửa đổi cam kết, sau đó sắp xếp lại tất cả các tệp.
William Pursell

53

Đây là một sơ đồ thú vị 1 cũng rất tiện dụng đáng ngạc nhiên: nó đưa ra đề xuất chính xác cho cả câu hỏi ban đầu và cho câu hỏi sửa đổi "Nếu đó không phải là cam kết cuối cùng thì sao?" câu hỏi.

Lưu đồ Git-pretty

1 Được lấy từ http://justinhileman.info/article/git-pretty/


12

Thêm tệp vào cam kết trước đó

Nếu bạn đã thúc đẩy chi nhánh bạn đang làm việc, vui lòng xem trang người đàn ông trước. Đặc biệt, xin lưu ý:

Viết lại (hoặc bất kỳ hình thức viết lại nào khác) một nhánh mà những người khác đã làm việc dựa trên đó là một ý tưởng tồi: bất kỳ ai ở phía dưới của nó đều bị buộc phải sửa lịch sử của họ theo cách thủ công.

Tuy nhiên, nếu bạn chưa đẩy được nhánh của mình, hãy chuẩn bị bước vào vùng nguy hiểm .

Tìm băm cam kết

Trước tiên, bạn cần biết mã băm cam kết của cam kết mà bạn muốn thêm vào. Điều này được hiển thị bởi git log. Bạn thực sự muốn chỉ định cam kết trước khi bạn muốn thêm vào. (Bạn có thể coi nó như là chỉ mục bắt đầu của phần cam kết mà bạn muốn thay đổi.) Bạn có thể đảm bảo rằng mình có cam kết phù hợp bằng cách chạy git log -1 HEAD~n. Trong đó 'n' là một số nguyên mà bạn tăng lên cho đến khi bạn có đúng cam kết. Hoặc bạn có thể đếm, không thực sự.

Nhưng, nếu bạn đếm, ít nhất hãy xác nhận rằng bạn có cam kết phù hợp với git log -1 HEAD~5hoặc bất kỳ số lượng của bạn. Bạn KHÔNG nên thấy cam kết mà bạn muốn thêm vào.

NGUY HIỂM , heh

Bây giờ bạn đã sẵn sàng để chạy git rebase -i HEAD~5. Hoặc bất kỳ hàm băm cam kết của bạn là gì. Thao tác này sẽ hiển thị trình soạn thảo văn bản yêu thích của bạn và một tệp để chỉnh sửa. Tệp là danh sách việc cần làm cho lệnh rebase. Các nhận xét trong tệp cho bạn biết bạn có những lựa chọn nào. Chỉ cần tìm dòng có cam kết mà bạn muốn thêm vào và trên dòng đó thay đổi "pick" thành "edit". Bây giờ hãy lưu và đóng tệp.

Rebase sẽ dừng khi nó đạt đến cam kết mà bạn đã yêu cầu chỉnh sửa. Chạy a git statusđể xem thông tin bổ sung mà nó cung cấp. Giai đoạn các tệp của bạn để thêm vào cam kết với git add .hoặc bất kỳ tên tệp nào.

Sau đó, làm git commit --amend. Điều này sẽ sửa đổi cam kết bạn đã chọn để chỉnh sửa.

Cuối cùng, hãy chạy git rebase --continue.

Nếu nghi ngờ, trên Linux, bạn có thể tìm hiểu thêm bằng cách đọc qua đầu ra tài liệu bằng man git-rebasehoặc git --help rebase.


2
Về "tìm băm cam kết". Không cần bắt đầu đếm. Chỉ cần sử dụng git logđể tìm cam kết của bạn và sao chép băm của nó, sau đó sử dụng git rebase -i hash^để căn cứ lại cam kết trước đó cho của bạn.
Viktor
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.