Làm cách nào để hủy tất cả các thay đổi được thực hiện đối với một nhánh?


116

Tôi đang làm việc trong một chi nhánh (tức là design) và tôi đã thực hiện một số thay đổi, nhưng tôi cần phải loại bỏ tất cả và đặt lại nó để phù hợp với phiên bản kho lưu trữ. Tôi nghĩ git checkout designsẽ làm điều đó, nhưng nó chỉ cho tôi biết tôi đã ở trong chi nhánhdesign và tôi có 3 tệp đã sửa đổi.

Làm cách nào để loại bỏ những thay đổi đó và có được nhánh như hiện tại trên máy chủ từ xa?

Câu trả lời:


207

Lưu ý: Bạn KHÔNG THỂ HOÀN TÁC điều này.

Thử git checkout -fđiều này sẽ loại bỏ bất kỳ thay đổi cục bộ nào không được cam kết trong TẤT CẢ các chi nhánh và chính.


86

git reset --hard có thể giúp bạn nếu bạn muốn vứt bỏ mọi thứ kể từ lần cam kết cuối cùng của bạn


6
hoặcgit reset --hard HEAD^
deadfish

28
git reset --hard HEAD^thực sự nên là câu trả lời được chấp nhận. OP đã không hỏi về các chi nhánh khác ...
vphilipnyc

2
Tôi đã thử điều này và tôi nghĩ rằng nó đã xóa mọi thứ kể từ lần đẩy cuối cùng của tôi, không chỉ cam kết cuối cùng của tôi.
Chase Roberts

3
Tôi đã thử đặt lại git --hard HEAD ^ và nó vẫn để lại một loạt các tệp chưa được theo dõi. Bây giờ để google làm thế nào để loại bỏ chúng trong một lệnh đơn giản.
John Deighan

20
git diff master > branch.diff
git apply --reverse branch.diff

Các bước này có thể rất hữu ích, nếu mục tiêu của bạn là đặt trạng thái của một nhánh cụ thể bằng với nhánh chính. Để làm như vậy, hãy chạy điều này từ bên trong nhánh cụ thể, sau đó xóa tệp .diff [tên nhánh] khi sử dụng xonggit rm [branch name].diff
karolus

18

Nếu bạn không muốn bất kỳ thay đổi nàodesign và chắc chắn muốn nó chỉ khớp với nhánh của điều khiển từ xa, bạn cũng có thể xóa nhánh và tạo lại nó:

# Switch to some branch other than design
$ git br -D design
$ git co -b design origin/design            # Will set up design to track origin's design branch

7
cũng có: thiết kế thanh toán git; git reset --hard origin / design
Dan

Tôi cũng sẽ cam kết trước khi xóa chi nhánh
Asarluhi

Nếu bạn có các cam kết trong nhánh cục bộ không có trên điều khiển từ xa, thì đây là một công thức để đi vào các tình huống thực sự khó hiểu theo quan điểm của tôi. Tôi chắc chắn sẽ không sử dụng giải pháp này.
erewok

1
@erewok: Chà, câu hỏi nói cụ thể rằng người hỏi muốn loại bỏ tất cả các thay đổi.
mipadi

Và tôi không nghĩ câu trả lời này đạt được điều đó.
erewok

7

@Will, git đắm chìm là một hướng dẫn git thực sự hay và đơn giản. nó sẽ chỉ cho bạn cách hoàn tác các thay đổi cho các trường hợp sau: không theo giai đoạn, theo giai đoạn và đã cam kết. phòng thí nghiệm 14-18


2
Tôi chỉ muốn nói rằng bây giờ tôi đã hoàn thành việc đắm chìm trong git .. hơn một năm sau. ƠI! Tôi nên đã làm điều này rất nhiều sớm ...
Will

1
Cái này cần Rubyphải được cài đặt..mà dường như không phải lúc nào cũng là sự lựa chọn
Vishnu

5

Khi bạn muốn loại bỏ các thay đổi trong nhánh cục bộ của mình, bạn có thể lưu trữ các thay đổi này bằng lệnh git stash.

git stash lưu "some_name"

Các thay đổi của bạn sẽ được lưu và bạn có thể truy xuất chúng sau này, nếu muốn hoặc bạn có thể xóa nó. Sau khi thực hiện việc này, chi nhánh của bạn sẽ không có bất kỳ mã nào chưa được cam kết và bạn có thể lấy mã mới nhất từ ​​chi nhánh chính của mình bằng cách sử dụng git pull.


4

Trong thư mục gốc: git reset ./ HEAD <--un-stage any staged changes git checkout ./ <--discard any unstaged changes


0

Phương pháp REVERSIBLE để Hủy bỏ Tất cả Thay đổi:

Tôi tìm thấy câu hỏi này sau khi thực hiện hợp nhất và quên kiểm tra phát triển ngay sau đó. Bạn đoán nó: Tôi bắt đầu sửa đổi một vài tệp trực tiếp trên master . D'Oh! Vì tình huống của tôi hầu như không phải là duy nhất (tất cả chúng tôi đều đã làm được, phải không; ->), tôi sẽ đưa ra một cách có thể đảo ngược mà tôi đã sử dụng để loại bỏ tất cả các thay đổi để khiến chủ nhân trông giống như phát triển lại.

Sau khi thực hiện git diffđể xem tệp nào đã được sửa đổi và đánh giá phạm vi lỗi của mình, tôi đã thực hiện:

git stash
git stash clear

Sau khi lưu trữ tất cả các thay đổi lần đầu, chúng sẽ được xóa. Tất cả các thay đổi được thực hiện đối với các tệp bị lỗi đối với tệp chính đã biến mất và tính chẵn lẻ được khôi phục.

Giả sử bây giờ tôi muốn khôi phục những thay đổi đó. Tôi có thể làm điều này. Bước đầu tiên là tìm băm của kho mà tôi vừa xóa / bỏ:

git fsck --no-reflog | awk '/dangling commit/ {print $3}'

Sau khi tìm hiểu hàm băm, tôi đã khôi phục thành công các thay đổi chưa cam kết với:

git stash apply hash-of-cleared-stash

Tôi không thực sự muốn khôi phục những thay đổi đó, chỉ muốn xác thực rằng tôi có thể lấy lại chúng, vì vậy tôi đã xóa chúng một lần nữa.

Một lựa chọn khác là áp dụng kho lưu trữ cho một nhánh khác , thay vì xóa các thay đổi. Vì vậy, về việc xóa các thay đổi được thực hiện từ việc làm việc trên nhánh sai, stashmang lại cho bạn sự linh hoạt hơn rất nhiều để khôi phục sau trò la ó của mình.

Anyhoo, nếu bạn muốn một phương tiện có thể đảo ngược để xóa các thay đổi đối với một nhánh, thì cách nêu trên là cách ít nguy hiểm hơn trong trường hợp sử dụng này.


-1

git checkout -f

Điều này là đủ cho câu hỏi của bạn. Chỉ có điều là, một khi nó hoàn thành, nó sẽ hoàn thành. Không có hoàn tác.

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.