Xóa một cam kết git chưa được đẩy


723

Tôi đã làm một git commitnhưng tôi chưa đẩy nó vào kho lưu trữ. Vì vậy, khi tôi làm git status, tôi nhận được '# Chi nhánh của bạn đi trước' chủ nhân 'bằng 1 cam kết.

Vì vậy, nếu tôi muốn lấy lại cam kết hàng đầu của mình, tôi chỉ có thể làm:

git reset --hard eb27bf26dd18c5a34e0e82b929e0d74cfcaab316

cho rằng khi tôi làm git logtôi nhận được:

cam kết eb27bf26dd18c5a34e0e82b929e0d74cfcaab316
Ngày: Thứ ba 29 tháng 9 11:21:41 2009 -0700


cam kết db0c078d5286b837532ff5e276dcf91885df2296
Ngày: Thứ ba ngày 22 tháng 9 10:31:37 2009 -0700

9
Câu hỏi này dường như là một bản sao của một câu hỏi khác của bạn: stackoverflow.com/questions/1338728/how-to-delete-a-git-commit
Brian Campbell



3
NGUY HIỂM: reset --hardcó thể dẫn đến mất việc, vì làm như vậy dẫn đến git ghi đè các tệp cục bộ của bạn (công việc mới của bạn) với các tệp từ web (đã xảy ra với tôi). Các câu hỏi và câu trả lời về git nên nêu rõ các lệnh của họ đang làm gì và những rủi ro nào cho độc giả theo dõi.
OrangeSherbet

Câu trả lời:


673

Trên thực tế, khi bạn sử dụng git reset, bạn nên tham khảo các cam kết mà bạn đang cài đặt lại để ; Vì vậy, bạn sẽ muốn db0c078cam kết, có lẽ.

Một phiên bản dễ dàng hơn sẽ là git reset --hard HEAD^, để thiết lập lại cam kết trước đó trước đầu hiện tại; theo cách đó bạn không cần phải sao chép xung quanh ID cam kết.

Cẩn thận khi bạn làm bất kỳ git reset --hard, vì bạn có thể mất bất kỳ thay đổi không cam kết nào bạn có. Bạn có thể muốn kiểm tra git statusđể đảm bảo bản sao làm việc của bạn sạch sẽ, hoặc bạn muốn thổi bay mọi thay đổi đang có.

Ngoài ra, thay vì CHÍNH, bạn có thể sử dụng origin/masterlàm tài liệu tham khảo, như được đề xuất bởi @bdonlan trong các nhận xét:git reset --hard origin/master


374
Hoặc git reset --hard origin/master, để đặt lại thành bất cứ nguồn gốc nào.
bdonlan

1
Một con trỏ hữu ích khác mà bạn có thể đặt lại là ORIG_HEAD hoặc khái quát hóa của nó bằng cách sử dụng reflog HEAD @ {1} (vị trí cuối cùng của HEAD).
Jakub Narębski

12
Đọc, trước khi bạn git resetmã của bạn. Làm cho bản thân tương lai của bạn một sự ưu ái: Sự khác biệt giữa reset, reset --softreset --hard(Điều gì xảy ra với git add"công việc của bạn" trước đó :) Ảnh: link
user18099

3
Lưu ý rằng điều này sẽ xóa bất cứ điều gì trong cam kết bạn muốn xóa (vì vậy git statussẽ không có thay đổi và cam kết sẽ bị xóa / thay đổi bị mất).
Bjørn Børresen

12
LƯU Ý: Cẩn thận khi sử dụng git reset --hard HEAD^vì bạn sẽ mất các thay đổi trong các tệp đã cam kết (các thay đổi của bạn sẽ bị xóa). Có hai nhánh cho câu hỏi này: Để hoàn nguyên một cam kết nhưng vẫn có những thay đổi trên đĩa, hãy thực hiệngit reset --soft HEAD~1
papigee

625

NẾU bạn KHÔNG đẩy những thay đổi của bạn lên điều khiển từ xa

git reset HEAD~1

Kiểm tra xem bản sao làm việc có sạch không git status.

ELSE bạn đã đẩy các thay đổi của bạn đến từ xa

git revert HEAD

Lệnh này sẽ hoàn nguyên / xóa lần cam kết / thay đổi cuối cùng và sau đó bạn có thể đẩy


34
Câu trả lời này cho "Xóa cam kết git mới nhất chưa được đẩy" (câu trả lời gần nhất IMHO)
Pierre de LESPINAY

25
Ngoài ra, nó giữ các thay đổi cục bộ được thực hiện trong lần xác nhận cuối cùng, trong khi git reset - không có
Stanimir Stoyanov

1
đối với tôi, nó sẽ hoàn tác lần cam kết cuối cùng và cam kết không bị đánh cắp
CodyChan

git hoàn nguyên ĐẦU cho tôi vừa xóa tất cả các tập tin mà tôi đã sẵn sàng đẩy. Hãy cẩn thận!
Jason Bruce

159
git reset --hard origin/master

để thiết lập lại thành bất cứ nguồn gốc nào.

Điều này đã được đăng bởi @bdonlan trong các bình luận . Tôi đã thêm câu trả lời này cho những người không đọc bình luận.


4
Câu hỏi này đã được hỏi gần 5 năm trước, và điều này đã có trong một trong những ý kiến.
Anubian Noob

1
Điều gì nếu chi nhánh địa phương hiện tại khác với master- tôi nên sử dụng origin/mybranchsau đó?
Pavel Vlasov

9
Tôi thường không đọc các bình luận khi tôi vội vàng trả lời ... Cảm ơn vì đã đưa ra câu trả lời (một cách đơn giản mà hiệu quả)
Leonardo Alves Machado

Cảnh báo: lưu ý rằng điều này sẽ xóa tất cả các thay đổi mã hiện tại của bạn, ngoài git reset HEAD~việc chỉ đặt lại cam kết thành mã
Mayer Spitzer

70

Có hai nhánh cho câu hỏi này (Quay lại cam kết không có nghĩa là tôi muốn mất tất cả các thay đổi cục bộ của mình):

1. Để hoàn nguyên các cam kết mới nhất và loại bỏ các thay đổi trong tệp đã cam kết, hãy làm:

git reset --hard HEAD~1

2. Để hoàn nguyên cam kết mới nhất nhưng giữ lại các thay đổi cục bộ (trên đĩa), hãy làm:

git reset --soft HEAD~1

Lệnh này (lệnh sau) sẽ đưa bạn đến trạng thái bạn sẽ có nếu bạn đã làm git add.

Nếu bạn muốn hủy bỏ các tập tin sau đó, hãy làm

git reset

Bây giờ bạn có thể thực hiện nhiều thay đổi trước khi thêm và sau đó cam kết lại.


47

Chỉ cần gõ vào bảng điều khiển:

$ git reset HEAD~

Lệnh này loại bỏ tất cả các xác nhận cục bộ trước từ xa


7
Bạn có thể giải thích những gì câu trả lời của bạn thêm vào các câu trả lời hiện có?
nvoigt

Điều này xóa cam kết hiện tại trước khi đẩy - mà không hoàn nguyên các thay đổi bạn đã thực hiện tại địa phương - giống như các câu trả lời khác - có thể là khoảnh khắc nhổ tóc nghiêm trọng
Grant

42

Tôi tin rằng một trong những thứ đó sẽ phù hợp với nhu cầu của bạn

1 - Hoàn tác cam kết và giữ tất cả các tệp được dàn dựng: git reset --soft HEAD~;

2 - Hoàn tác cam kết và hủy bỏ tất cả các tệp: git reset HEAD~;

3 - Hoàn tác cam kết và xóa hoàn toàn tất cả các thay đổi: git reset --hard HEAD~;

đây là tôi đã tìm thấy câu trả lời


Câu trả lời này phải được chấp nhận: D
Aaron John Sabu

30

Xóa cam kết cuối cùng trước khi đẩy

git reset --soft HEAD~1

1nghĩa là lần xác nhận cuối cùng, nếu bạn muốn xóa hai lần sử dụng cuối cùng 2, v.v.


3
Xin chào Karina, đề cập đến --softlà bổ sung tuyệt vời cho các câu trả lời có thể, nhưng bạn cũng có thể đề cập tại sao? Giải thích giải pháp của bạn luôn hữu ích. Cũng cố gắng gắn bó với tiếng Anh. Cảm ơn
Vlastimil Ovčáčík

1
--soft- đảm bảo rằng bạn không bị mất các thay đổi trong tệp có cam kết mà bạn đang cố gắng hoàn tác
papigee

19

Tôi đã trải qua tình huống tương tự tôi đã làm dưới đây vì điều này dễ dàng hơn nhiều. Bằng cách vượt qua, commit-Idbạn có thể đạt được cam kết cụ thể mà bạn muốn đi:

git reset --hard {commit-id}

Vì bạn muốn xóa cam kết cuối cùng của mình, do đó bạn cần phải vượt qua commit-Idnơi bạn cần di chuyển con trỏ:

git reset --hard db0c078d5286b837532ff5e276dcf91885df2296

Chỉ là một cảnh báo cho những người mới như tôi - sao lưu mọi tệp mà bạn muốn GIỮ các thay đổi, vì chúng sẽ được hoàn nguyên về phiên bản trước. Kịch bản của tôi là tôi đã vô tình đặt kết xuất cơ sở dữ liệu vào thư mục repo của mình và sau đó cam kết - Tôi rõ ràng không muốn cam kết các tệp đó với repo nhưng DID muốn giữ các thay đổi tôi đã thực hiện cho các tệp khác. Vì vậy, tôi đã phải sao chép và dán các thay đổi cần thiết từ bản sao lưu mà tôi đã thực hiện TRƯỚC KHI thực hiện thiết lập lại git.
dùng1063287

10

Đây là những gì tôi làm:

Đầu tiên kiểm tra chi nhánh của bạn (đối với masterchi nhánh trường hợp của tôi ):

git checkout master

Sau đó đặt lại về CHÍNH từ xa ^ ( nó sẽ xóa tất cả các thay đổi cục bộ của bạn ), buộc xóa và kéo:

git reset HEAD^ --hard && git clean -df && git pull

1
Đó là lựa chọn rất hạt nhân. Tôi sẽ đề nghị thiết lập lại mềm để cam kết hạn chế.
c0der512 ngày

3

Một cách sẽ là xóa chi nhánh địa phương và kiểm tra chi nhánh đó khỏi máy chủ nếu chi nhánh địa phương của bạn đi trước từ xa bằng nhiều cam kết và bạn cần phải hủy tất cả chúng.


câu trả lời tuyệt vời - nó cho phép dễ dàng nhấp vào nó trong sourcetree :)
Kamil Kiełczewski

1

Tôi chỉ gặp vấn đề tương tự và cuối cùng đã làm:

git rebase -i HEAD~N

(N là số lần xác nhận git sẽ hiển thị cho bạn)

Điều đó nhắc trình soạn thảo văn bản của bạn và sau đó bạn có thể xóa cam kết bạn muốn bằng cách xóa dòng liên kết với nó.

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.