2009-05-23 29 views
59

Gần đây tôi đã cam kết một tệp vào HEAD của chi nhánh của tôi có lỗi trong đó. Tôi cần phải làm những điều sau đây:Git: kiểm tra một tập tin từ một cam kết trước đó và sửa đổi nó thành HEAD

  • Get rằng tập tin từ một cam kết trước đó vào đầu

  • Commit tập tin đó trở lại vào TRỤ

cách tốt nhất để đi về điều đó là gì?

+1

Các dễ nhất sẽ được sao chép nội dung tệp từ cam kết cụ thể đó bằng cách sử dụng ứng dụng khách (hoặc từ github bitbucket, v.v.) và dán vào tệp hiện tại của bạn và cam kết :) Dễ hơn viết băm và đường dẫn – nawfal

Trả lời

91

Bạn đã thực tế nói nó tự hỏi:

tiên nhận được tập tin trở lại từ một cam kết trước đây:

$> git checkout HEAD~1 path/to/file.ext 

Sau đó cam kết nó:

$> git commit -a -m 'Retrieved file from older revision' 

Nếu chỉ những thay đổi đó tệp có trong cam kết cuối cùng, bạn thậm chí có thể sử dụng git-revert:

$> git revert HEAD 

Tôi nghĩ sẽ tốt hơn nếu thực hiện điều này một cam kết riêng biệt, bởi vì nó cho bạn biết chính xác những gì bạn đã hoàn nguyên và tại sao. Tuy nhiên, bạn có thể bỏ điều này vào cam kết trước đó bằng cách sử dụng công tắc --amend để git-commit.

+0

--amend sẽ là công tắc cho git commit chứ không phải git add – bdonlan

+0

Rất tiếc, bạn đã đúng. Đã sửa. – sykora

+0

git-revert * sẽ * thực hiện một cam kết riêng biệt (nó không hoàn toàn rõ ràng từ mô tả của bạn). Sử dụng "git commit --amend" sẽ sửa cam kết cuối cùng, thay vì tạo mới trên (nhưng bạn không thể làm điều này nếu bạn xuất bản phần lịch sử này) –

0

Hãy cẩn thận, trong trường hợp này:

Commit hash - File modified 
aaaaaaa  index.php 
bbbbbbb  test.php 
ccccccc  index.php 

Git thanh toán ĐẦU ~ 1 (hoặc HEAD ^) index.php cố gắng kiểm tra các tập tin index.php để băm TRỤ trước (bbbbbbb) nhưng điều này không phải là tệp băm cam kết thực sự trước đó, là ccccccc. Trong băm HEAD trước đó, index.php vẫn không thay đổi vì thay đổi cuối cùng được thực hiện trong bcccccc băm.

Để trở lại một số tập tin để trước cam kết băm ảnh hưởng đến các tập tin, sử dụng:

git log -n 2 --pretty=format:%h path/to/file.ext 

Bỏ qua băm đầu tiên và lấy băm thứ hai, sau đó:

git checkout <second_hash> path/to/file.ext 
git commit -m 'Revert this file to real previous commit' 
Các vấn đề liên quan