Làm thế nào để hủy bỏ một cam kết git cục bộ


744

Vấn đề của tôi là tôi đã thay đổi một tệp, ví dụ: README, đã thêm một dòng mới ' này cho dòng thử nghiệm của tôi ' và lưu tệp, sau đó tôi đã ban hành các lệnh sau

 git status

 # On branch master
 # Changed but not updated:
 #   (use "git add <file>..." to update what will be committed)
 #   (use "git checkout -- <file>..." to discard changes in working directory)
 #
 #  modified:   README
 #
 no changes added to commit (use "git add" and/or "git commit -a")


 git add README

 git commit -a -m 'To add new line to readme'

Tôi đã không đẩy mã lên github, Bây giờ tôi muốn hủy cam kết này.

Đối với điều này tôi đã sử dụng

   git reset --hard HEAD~1

Nhưng tôi đã mất dòng mới được thêm ' này cho dòng thử nghiệm của tôi ' từ tệp README. Điều này không nên xảy ra. Tôi cần nội dung ở đó. Có cách nào để giữ lại nội dung và hủy bỏ cam kết cục bộ của tôi không?


3
Có vẻ như bạn chắc chắn không yêu cầu git revert, điều này tạo ra một cam kết mới với sự khác biệt ngược lại của cam kết được hoàn nguyên. Đặt lại chỉ đơn giản là trỏ chi nhánh hiện tại của bạn vào một cam kết khác, trong trường hợp này, trước khi cam kết bạn muốn "quên".
Cascabel

1
Lưu ý: Có thể đáng nói đến việc git-commitcó thể hủy bỏ nếu bạn để trống tin nhắn, vì vậy nếu bạn chưa thực sự hoàn thành cam kết có thể hữu ích.
GKFX

Câu trả lời:


1423

Chỉ cần sử dụng git resetmà không có --hardcờ:

git reset HEAD~1

PS: Trên các hệ thống dựa trên Unix, bạn có thể sử dụng HEAD^tương đương HEAD~1. Trên Windows HEAD^sẽ không hoạt động vì ^báo hiệu tiếp tục dòng. Vì vậy, dấu nhắc lệnh của bạn sẽ chỉ hỏi bạn More?.


13
Nhân tiện, điều này được gọi --mixed trong hướng dẫn .
Josh Lee

10
Các phiên bản mới hơn của Git thậm chí còn cho phép @^làm tốc ký HEAD^.
Koraktor

Tôi không biết điều này đã làm gì, nhưng rất nhiều tệp xuất hiện trong danh sách thay đổi của tôi, các tệp tôi không chạm
FRR

@feresr Nếu bạn thực sự không chạm vào các tệp đó trong lần xác nhận cuối cùng hoặc trong cây làm việc thì điều này là do sự không nhất quán khác trong cây làm việc của bạn, ví dụ: bạn đang ở trên Windows và kết thúc tệp không khớp.
Koraktor 6/2/2015

1
Có thể thiết lập lại tất cả các cam kết trên một tay?
Webdess

185

Sử dụng --softthay cho --hardcờ:

git reset --soft HEAD^

18
Bạn có thể giải thích sự khác biệt giữa 2 lá cờ?
John Giotta

1
Nếu bạn mở Gói quản lý gói và chạy "git reset --soft HEAD ^" này, nó sẽ làm những gì bạn muốn (và những gì tôi cần).
David Cornelson

54
@JohnGiotta - git reset --soft HEAD^sẽ xóa cam kết cục bộ (chưa được xử lý) cuối cùng nhưng sẽ giữ các thay đổi bạn đã thực hiện
fider

@fider Cứu tinh! Không chắc câu trả lời được chấp nhận có còn hoạt động không, nhưng đây sẽ là câu trả lời chính xác mà OP cần.
Babu

git reset --soft HEAD~trên cửa sổ
Jack0fshad0ws

34

Nếu bạn đang ở giữa một cam kết (tức là trong trình chỉnh sửa của bạn), bạn có thể hủy nó bằng cách xóa tất cả các dòng trên đầu tiên #. Điều đó sẽ hủy bỏ cam kết.

Vì vậy, bạn có thể xóa tất cả các dòng để thông báo cam kết trống, sau đó lưu tệp:

Nó sẽ giống như thế này.

Sau đó, bạn sẽ nhận được một tin nhắn nói Aborting commit due to empty commit message..

CHỈNH SỬA :

Bạn cũng có thể xóa tất cả các dòng và kết quả sẽ giống hệt nhau.

Để xóa tất cả các dòng trong vim (nếu đó là trình chỉnh sửa mặc định của bạn), một khi bạn đang ở trong trình chỉnh sửa, hãy nhập ggđến dòng đầu tiên, sau đó dGxóa tất cả các dòng. Cuối cùng, viết và thoát tệp với wqvà cam kết của bạn sẽ bị hủy bỏ.


3
Đây chính xác là những gì tôi đang tìm kiếm! Câu trả lời này cần nhiều sự
ủng hộ

FYI, điều này cũng hoạt động nếu bạn đang cố gắng hủy bỏ mộtrebase -i mybranchname
inostia

18

Điều đầu tiên bạn nên làm là xác định xem bạn có muốn giữ các thay đổi cục bộ hay không trước khi xóa thông báo cam kết.

Sử dụng git logđể hiển thị các thông báo cam kết hiện tại, sau đó tìm commit_id trước các cam kết mà bạn muốn xóa, không phải các cam kết bạn muốn xóa.

Nếu bạn muốn giữ các tệp đã thay đổi cục bộ và chỉ cần xóa thông báo cam kết:

git reset --soft commit_id

Nếu bạn muốn xóa tất cả các tệp thay đổi cục bộ và thông báo cam kết:

git reset --hard commit_id

Đó là sự khác biệt của mềmcứng


1
Tôi nghĩ nó ngược lại.
Ruff9

9

Bạn có thể cho Git biết phải làm gì với chỉ mục của mình (bộ tệp sẽ trở thành cam kết tiếp theo) và thư mục làm việc khi thực hiện đặt lại git bằng cách sử dụng một trong các tham số:

--soft: Chỉ các xác nhận sẽ được đặt lại, trong khi Index và thư mục làm việc không bị thay đổi.

--mixed: Điều này sẽ đặt lại chỉ mục để khớp với CHÍNH, trong khi thư mục làm việc sẽ không được chạm vào. Tất cả các thay đổi sẽ ở trong thư mục làm việc và xuất hiện dưới dạng sửa đổi.

--hard: Nó đặt lại mọi thứ (cam kết, chỉ mục, thư mục làm việc) để khớp với CHÍNH.

Trong trường hợp của bạn, tôi sẽ sử dụng git reset --softđể giữ các thay đổi đã sửa đổi của bạn trong Chỉ mục và thư mục hoạt động. Hãy chắc chắn kiểm tra điều này để được giải thích chi tiết hơn.


1

Sử dụng lệnh dưới đây:

$ git reset HEAD~1

Sau này, bạn cũng có thể xem các tập tin hoàn nguyên như phản hồi bên dưới.

Unstaged changes after reset:
M   application/config/config.php
M   application/config/database.php
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.