Câu hỏi Làm cách nào để hoàn nguyên tất cả các thay đổi cục bộ trong dự án được quản lý Git về trạng thái trước đó?


Tôi có một dự án mà tôi đã chạy git init. Sau một vài cam kết, tôi đã làm git status đã cho tôi biết mọi thứ đã được cập nhật và không có thay đổi cục bộ nào.

Sau đó, tôi đã thực hiện một số thay đổi liên tiếp và nhận ra rằng tôi muốn vứt bỏ mọi thứ và quay lại trạng thái ban đầu của mình. Lệnh này sẽ làm điều đó cho tôi chứ?

git reset --hard HEAD

1549
2017-07-18 07:52


gốc




Các câu trả lời:


Nếu bạn muốn hoàn nguyên các thay đổi được thực hiện cho bản sao làm việc của mình, hãy làm như sau:

git checkout .

Nếu bạn muốn hoàn nguyên các thay đổi được thực hiện cho chỉ mục (tức là, bạn đã thêm), hãy thực hiện việc này. Cảnh báo điều này sẽ thiết lập lại tất cả các cam kết chưa được chỉnh sửa của bạn để làm chủ!:

git reset

Nếu bạn muốn hoàn nguyên thay đổi mà bạn đã cam kết, hãy làm như sau:

git revert <commit 1> <commit 2>

Nếu bạn muốn xóa các tệp không được theo dõi (ví dụ: tệp mới, tệp được tạo):

git clean -f

Hoặc các thư mục không được theo dõi (ví dụ: các thư mục mới hoặc được tạo tự động):

git clean -fd

2821
2017-07-18 07:57



fwiw sau một thời gian dài, git checkout path/to/file sẽ chỉ hoàn nguyên các thay đổi cục bộ đối với path/to/file - Matijs
1 trên các câu trả lời dưới đây cũng đề cập đến git clean -f (để loại bỏ các thay đổi không được theo dõi) và -fd (để loại bỏ các thư mục không được theo dõi) - ptdev
và nếu bạn cũng muốn xóa các tập tin không được tải xuống, hãy đọc stackoverflow.com/questions/61212/… - Surasin Tancharoen
git checkout . và git reset [--hard HEAD] không làm việc, tôi phải làm git clean -fd để hoàn nguyên các thay đổi của tôi. - BrainSlugs83
git reset không đặt lại các thay đổi của bạn, git reset --hard làm điều đó. - Cerin


Lưu ý: Bạn cũng có thể muốn chạy

git clean -fd

như

git reset --hard

sẽ không phải loại bỏ các tập tin không được theo dõi, nơi mà git-clean sẽ xóa bất kỳ tệp nào khỏi thư mục gốc được theo dõi không theo dõi git. CẢNH BÁO - ĐƯỢC CẨN THẬN VỚI NÀY! Nó là hữu ích để chạy một khô chạy với git-sạch đầu tiên, để xem những gì nó sẽ xóa.

Điều này cũng đặc biệt hữu ích khi bạn nhận được thông báo lỗi

~"performing this command will cause an un-tracked file to be overwritten"

Điều này có thể xảy ra khi thực hiện một số việc, một bản cập nhật bản sao làm việc khi bạn và bạn của bạn vừa thêm một tệp mới có cùng tên, nhưng trước tiên anh ấy đã cam kết điều khiển nguồn và bạn không quan tâm đến việc xóa bản sao chưa được theo dõi của mình .

Trong tình huống này, việc chạy khô cũng sẽ giúp hiển thị cho bạn danh sách các tệp sẽ bị ghi đè.


334
2017-07-20 05:37



Lệnh sạch tập tin là "git clean -f". Các thư mục không được theo dõi được loại bỏ bằng "git clean -d" - Jonathan Mitchell
git clean -fd (lực được yêu cầu cho -d) - electblake
-n hoặc --dry-run là các cờ để chạy khô. - stephenbez
git clean -ffd nếu bạn có một kho git khác trong kho git của bạn. Nếu không có đôi f nó sẽ không được gỡ bỏ. - Trismegistos


Nếu bạn muốn hoàn nguyên tất cả các thay đổi VÀ được cập nhật với chủ từ xa hiện tại (ví dụ bạn thấy rằng HEAD chính đã di chuyển về phía trước kể từ khi bạn phân nhánh và đẩy của bạn đang bị 'từ chối'), bạn có thể sử dụng

git fetch  # will fetch the latest changes on the remote
git reset --hard origin/master # will set your local branch to match the representation of the remote just pulled down.

59
2018-04-22 20:48





Nhìn vào git-reflog. Nó sẽ liệt kê tất cả các trạng thái mà nó ghi nhớ (mặc định là 30 ngày), và bạn có thể chỉ cần kiểm tra trạng thái bạn muốn. Ví dụ:

$ git init > /dev/null
$ touch a
$ git add .
$ git commit -m"Add file a" > /dev/null
$ echo 'foo' >> a
$ git commit -a -m"Append foo to a" > /dev/null
$ for i in b c d e; do echo $i >>a; git commit -a -m"Append $i to a" ;done > /dev/null
$ git reset --hard HEAD^^ > /dev/null
$ cat a
foo
b
c
$ git reflog
145c322 HEAD@{0}: HEAD^^: updating HEAD
ae7c2b3 HEAD@{1}: commit: Append e to a
fdf2c5e HEAD@{2}: commit: Append d to a
145c322 HEAD@{3}: commit: Append c to a
363e22a HEAD@{4}: commit: Append b to a
fa26c43 HEAD@{5}: commit: Append foo to a
0a392a5 HEAD@{6}: commit (initial): Add file a
$ git reset --hard HEAD@{2}
HEAD is now at fdf2c5e Append d to a
$ cat a
foo
b
c
d

47
2017-07-19 12:16



cảm ơn một tấn William, vì git reflog. Tôi đã đặt lại cây của mình thành phiên bản cũ và không chắc chắn cách truy cập lại gần đây. git reflog của bạn đã cứu tôi. Một lần nữa xin cảm ơn. - palaniraja
đã cứu tôi! Trong trường hợp của tôi, cuộc phiêu lưu của tôi với git rebase -i đã đi sai (cuối cùng đã xóa sạch một số cam kết do lỗi chỉnh sửa). Nhờ mẹo này tôi đã trở lại trạng thái tốt! - paneer_tikka
Ý bạn là gì sau 30 ngày mặc định!? - Mohe TheDreamy
@ MoheTheDreamy Tôi có nghĩa là có một giới hạn thời gian. Cuối cùng, bộ thu gom rác sẽ xóa các tham chiếu không thể truy cập khi độ tuổi của chúng vượt quá giới hạn đó. Mặc định được sử dụng để (và có thể vẫn là) 30 ngày. Vì vậy, tài liệu tham khảo cũ hơn có thể không có sẵn. - William Pursell


Tái sao chép

GIT=$(git rev-parse --show-toplevel)
cd $GIT/..
rm -rf $GIT
git clone ...
  •  Xóa các cam kết cục bộ, không được đẩy
  •  Hoàn nguyên thay đổi bạn đã thực hiện đối với tệp được theo dõi
  •  Khôi phục các tệp được theo dõi bạn đã xóa
  •  Xóa các tệp / dir được liệt kê trong .gitignore (như xây dựng tệp)
  •  Xóa các tệp / thư mục không được theo dõi và không nằm trong .gitignore
  •  Bạn sẽ không quên phương pháp này
  •  Lãng phí băng thông

Sau đây là các lệnh khác mà tôi quên hàng ngày.

Làm sạch và đặt lại

git clean -f -d -x
git reset --hard
  •  KHÔNG xóa các cam kết cục bộ, không được đẩy
  •  Hoàn nguyên thay đổi bạn đã thực hiện đối với tệp được theo dõi
  •  Khôi phục các tệp được theo dõi bạn đã xóa
  •  Xóa các tệp / dir được liệt kê trong .gitignore (như xây dựng tệp)
  •  Xóa các tệp / thư mục không được theo dõi và không nằm trong .gitignore

Dọn dẹp

git clean -f -d -x
  •  KHÔNG xóa các cam kết cục bộ, không được đẩy
  •  KHÔNG hoàn nguyên các thay đổi bạn đã thực hiện đối với các tệp được theo dõi
  •  KHÔNG khôi phục các tệp đã theo dõi bạn đã xóa
  •  Xóa các tệp / dir được liệt kê trong .gitignore (như xây dựng tệp)
  •  Xóa các tệp / thư mục không được theo dõi và không nằm trong .gitignore

Cài lại

git reset --hard
  •  KHÔNG xóa các cam kết cục bộ, không được đẩy
  •  Hoàn nguyên thay đổi bạn đã thực hiện đối với tệp được theo dõi
  •  Khôi phục các tệp được theo dõi bạn đã xóa
  •  Xóa các tệp / dir được liệt kê trong .gitignore (như xây dựng tệp)
  •  KHÔNG xóa các tập tin / thư mục không được theo dõi và không .gitignore

Ghi chú

Kiểm tra trường hợp để xác nhận tất cả các bên trên (sử dụng bash hoặc sh):

mkdir project
cd project
git init
echo '*.built' > .gitignore
echo 'CODE' > a.sourceCode
mkdir b
echo 'CODE' > b/b.sourceCode
cp -r b c
git add .
git commit -m 'Initial checkin'
echo 'NEW FEATURE' >> a.sourceCode
cp a.sourceCode a.built
rm -rf c
echo 'CODE' > 'd.sourceCode'

Xem thêm

  • git revert để thực hiện các cam kết mới hoàn tác các cam kết trước đó
  • git checkout để quay ngược thời gian trước các cam kết trước (có thể yêu cầu chạy các lệnh trên trước)
  • git stash giống như git reset ở trên, nhưng bạn có thể hoàn tác nó

41
2018-03-20 12:37



Xin lỗi vì đã ăn cắp từ các câu trả lời ở trên. Tôi sử dụng tài liệu tham khảo này liên tục, đăng chủ yếu cho tôi. - William Entriken
Tôi chắc chắn rằng, tùy chọn đầu tiên (Tái sao chép) thực sự KHÔNG "xóa các cam kết cục bộ, không được đẩy" :) - Marandil
Dấu kiểm màu đỏ và màu xanh lục có nghĩa là gì? Liệu X màu đỏ phủ nhận câu bên cạnh nó? - styfle
@styfle là một cái gì đó nó làm, là một cái gì đó nó không làm - William Entriken
@ FullDecent Đó là loại khó hiểu để đọc. "KHÔNG xóa các cam kết cục bộ, không được đẩy". Điều đó có nghĩa là nó không xóa. Các tiêu cực gấp đôi có nghĩa là nó xóa? - styfle


NGUY HIỂM AHEAD: (xin vui lòng đọc các ý kiến. Thực hiện lệnh được đề xuất trong câu trả lời của tôi có thể xóa nhiều hơn bạn muốn)

để xóa hoàn toàn tất cả các tệp bao gồm các thư mục mà tôi phải chạy

git clean -f -d

34
2017-09-11 07:10



Để tiết kiệm cho bất kỳ ai nỗi đau tôi vừa trải qua: điều này cũng sẽ xóa các tệp .gitignore-d! - landons
xin lỗi nếu tôi gây ra rắc rối cho bạn. Lúc đó tôi chỉ cố gắng hoàn nguyên và xóa mọi thứ trong thư mục đó. Tôi không nhớ chính xác hoàn cảnh, nhưng "-d" là thứ duy nhất làm việc cho tôi. Tôi hy vọng tôi không làm bạn đau quá nhiều :-) - Tobias Gassmann
không có hại gì. Tôi đã sao lưu, nhưng điều này có thể đảm bảo một tuyên bố từ chối trách nhiệm;) - landons


Sau khi đọc một loạt các câu trả lời và thử chúng, tôi đã tìm thấy các trường hợp cạnh khác nhau có nghĩa là đôi khi chúng không hoàn toàn làm sạch bản sao làm việc.

Đây là kịch bản bash hiện tại của tôi để thực hiện nó, hoạt động mọi lúc.

#!/bin/sh
git reset --hard
git clean -f -d
git checkout -- HEAD

Chạy từ thư mục gốc của bản sao làm việc.


34
2018-06-04 07:25



Lệnh cuối cùng cho tôi error: pathspec 'HEAD' did not match any file(s) known to git. - 0xC0000022L
Nó làm việc cho tôi khi tôi lấy "-" ra. git checkout HEAD - Jester
git reset --hardreverts các tập tin theo dõi (dàn dựng hay không), git clean -f -d xóa các tệp không được theo dõi, git checkout -- HEAD tại sao chúng ta cần điều này? - v.shashenko
Chúng tôi không cần dấu nối kép. Phải là một lỗi đánh máy. - Farax