2011-07-09 32 views
182

Tôi cam kết lưu trữ git lần đầu tiên; Sau đó tôi hối tiếc về cam kết và muốn hoàn nguyên nó. Tôi cố gắngLàm cách nào để hoàn nguyên commit git ban đầu?

# git reset --hard HEAD~1 

tôi nhận được tin nhắn này:

fatal: ambiguous argument 'HEAD~1': unknown revision or path not in the working tree. 

này cam kết là người đầu tiên cam kết của kho. Bất kỳ ý tưởng làm thế nào để hoàn tác cam kết ban đầu của git?

Trả lời

307

Bạn chỉ cần xóa nhánh bạn đang sử dụng. Bạn không thể sử dụng git branch -D vì điều này có kiểm tra an toàn để thực hiện việc này. Bạn có thể sử dụng update-ref để thực hiện việc này.

git update-ref -d HEAD 

Do không sử dụng rm -rf .git hoặc bất cứ điều gì như thế này vì điều này sẽ hoàn toàn xóa sạch toàn bộ kho của bạn bao gồm tất cả các chi nhánh khác cũng như các chi nhánh mà bạn đang cố gắng để thiết lập lại.

+1

Cố gắng này trong khi trong một rebase - muốn chia cam kết đầu tiên - sau đó đã làm 'git status', và ngạc nhiên của tôi, git nói' gây tử vong: Không phải là một kho git (hoặc bất kỳ phụ huynh lên đến điểm gắn kết ...) '! –

+0

cùng - giải pháp? –

+1

điều này không hiệu quả đối với tôi. Tạo các tệp bao gồm một số tệp cần bỏ qua nhưng không có '.gitignore'. 'git add .',' git commit -m "ban đầu commit" ',' git update-ref -D HEAD', tạo một '.gitignore', lưu ý rằng git vẫn nhìn thấy các tập tin được thêm vào trước đó nên bỏ qua. Nói cách khác 'git update-ref -d HEAD' không đưa tôi trở lại trạng thái trước commit ban đầu. – gman

5

Cách đơn giản nhất sẽ là:

rm -fr .git 

từ thư mục mà bạn đã làm git init.

Bạn không có gì bạn muốn giữ, vì vậy bạn không mất bất cứ thứ gì. Tuy nhiên, làm điều này là an toàn chỉ khi bạn không có gì khác trong kho của bạn cả. Trong các trường hợp được mô tả trong câu hỏi 'cam kết lưu trữ lần đầu tiên — sau đó hối tiếc', nó là an toàn. Rất thường xuyên, tuy nhiên, nó không an toàn.

+7

Đây là lời khuyên xấu. Điều gì xảy ra nếu có những thứ khác trong repo mà bạn không muốn mất? –

+4

Sau đó, nó sẽ không phải là cam kết ban đầu, nó sẽ. Chỉ có một cam kết ban đầu. –

+8

"Sau đó, nó sẽ không phải là cam kết ban đầu" - thực sự, có nó sẽ. Bạn đang bỏ qua trường hợp rất phổ biến của nhiều nhánh. Xem câu trả lời của Charles. –

3

Bạn không thể. Vì vậy:

rm -rf .git/ 
git init 
git add -A 
git commit -m 'Your new commit message' 
+0

Anh ta cố gắng nói 'git reset --hard', vậy tại sao anh ta lại git add -A'? –

0

git reset --hard thực hiện thay đổi, sau đó làm

git add -A 
git commit --amend --no-edit 

hoặc

git add -A 
git commit --amend -m "commit_message" 

và sau đó

git push origin master --force 

--force sẽ viết lại có hành bạn đã đã được chuyển sang bước đầu tiên.

Đừng làm điều này, bởi vì bạn sắp sửa chống lại toàn bộ ý tưởng của hệ thống VCS và git nói riêng. Phương pháp tốt duy nhất là tạo mới và xóa nhánh không cần thiết. Xem git help branch để biết thông tin.

28

Bạn có thể xóa các HEAD và khôi phục kho của bạn đến một trạng thái mới, nơi bạn có thể tạo ra một khởi đầu mới cam kết:

git update-ref -d HEAD 

Sau khi bạn tạo mới cam kết, nếu bạn đã đẩy lên từ xa, bạn sẽ cần phải buộc nó để điều khiển từ xa để ghi đè lên ban đầu trước cam kết:

git push --force origin 
+0

Đáng chú ý ... đây là lệnh đúng nhưng nó không xóa HEAD ... nó xóa ref (nằm dưới .git \ refs \ heads) mà tệp .git \ HEAD đã kiểm tra. Sau khi chạy lệnh này, bạn vẫn có thể tìm thấy tệp HEAD trỏ đến tệp refs/heads/ mà bạn đã xóa nhưng nếu bạn đi theo đường dẫn đó, bạn sẽ thấy rằng đầu ref không còn tồn tại nữa. – DanK

7

câu hỏi này đã được liên kết từ this blog post và một giải pháp thay thế đã được đề xuất cho các phiên bản mới hơn của Git:

git branch -m master old_master 
git checkout --orphan master 
git branch -D old_master 

giải pháp này giả định rằng:

  1. Bạn chỉ có một cam kết về chi nhánh master bạn
  2. Không có chi nhánh gọi old_master vì vậy tôi tự do sử dụng tên

Nó sẽ đổi tên chi nhánh hiện tại thành old_master và tạo chi nhánh mới, mồ côi, chi nhánh master(giống như được tạo cho các kho lưu trữ mới) sau đó bạn có thể tự do xóa old_master ... hay không. Tùy thuộc vào bạn.

0

Tất cả những gì bạn phải làm là hoàn nguyên cam kết.

git revert {commit_id}' 

Sau đó đẩy nó

git push origin -f 
Các vấn đề liên quan