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 đó?


1914

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

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à trở lại trạng thái ban đầu. Lệnh này sẽ làm điều đó cho tôi?

git reset --hard HEAD

Câu trả lời:


3389

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 điều này:

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 (nghĩa là bạn đã thêm), hãy làm điều 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 đánh dấu của bạn để làm chủ! :

git reset

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

git revert <commit 1> <commit 2>

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

git clean -f

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

git clean -fd

133
fwiw sau một thời gian dài như vậy, git checkout path/to/filesẽ chỉ hoàn nguyên các thay đổi cục bộ thànhpath/to/file
Matijs

29
+1 trên các câu trả lời bên dưới cũng đề cập đến git clean -f (để xóa các thay đổi chưa được theo dõi) và -fd (để xóa các thư mục không bị theo dõi)
ptdev

3
và nếu bạn cũng muốn dọn dẹp các tệp không bị theo dõi của mình, hãy đọc stackoverflow.com/questions/61212/iêu
Surasin Tancharoen

9
git checkout .git reset [--hard HEAD]không hoạt động, tôi phải làm git clean -fdlại để thay đổi.
BrainSlugs83

7
git resetkhông thiết lập lại các thay đổi của bạn, git reset --hardlàm điều đó.
Cerin

388

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

git clean -fd

như

git reset --hard

sẽ không xóa các tệp không bị theo dõi, vì git-clean sẽ xóa mọi tệp khỏi thư mục gốc được theo dõi không theo dõi git. CẢNH BÁO - HÃY CẨN THẬN VỚI NÀY! Thật hữu ích khi chạy chạy khô với git-clean trước, để 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ố điều, một việc đang cập nhật một bản sao đang hoạt động khi cả bạn và bạn của bạn đều đã thêm một tệp mới cùng tên, nhưng trước tiên anh ấy đã cam kết nó vào kiểm soát nguồn và bạn không quan tâm đến việc xóa bản sao không bị theo dõi của mình .

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


13
Lệnh xóa tệp là "git clean -f". Các thư mục không bị theo dõi được xóa bằng "git clean -d"
Jonathan Mitchell

35
git clean -fd (bắt buộc phải có cho -d)
electblake

14
-n hoặc --dry-run là những lá cờ cho chạy khô.
stephenbez

2
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ó gấp đôi thì nó sẽ không bị xóa.
Trismegistos

148

Tái bản

GIT=$(git rev-parse --show-toplevel)
cd $GIT/..
rm -rf $GIT
git clone ...
  • Xóa các xác nhận cục bộ, không đẩy
  • 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ôi phục các tệp đã theo dõi bạn đã xóa
  • Xóa tệp / thư mục được liệt kê trong .gitignore(như tệp xây dựng)
  • Xóa các tệp / thư mục không được theo dõi và không trong .gitignore
  • Bạn sẽ không quên phương pháp này
  • Băng thông lãng phí

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

Làm sạch và thiết lập lại

git clean --force -d -x
git reset --hard
  • Xóa các xác nhận cục bộ, không đẩy
  • 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ôi phục các tệp đã theo dõi bạn đã xóa
  • Xóa tệp / thư mục được liệt kê trong .gitignore(như tệp xây dựng)
  • Xóa các tệp / thư mục không được theo dõi và không trong .gitignore

Dọn dẹp

git clean --force -d -x
  • Xóa các xác nhận cục bộ, không đẩy
  • 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ôi phục các tệp đã theo dõi bạn đã xóa
  • Xóa tệp / thư mục được liệt kê trong .gitignore(như tệp xây dựng)
  • Xóa các tệp / thư mục không được theo dõi và không trong .gitignore

Cài lại

git reset --hard
  • Xóa các xác nhận cục bộ, không đẩy
  • 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ôi phục các tệp đã theo dõi bạn đã xóa
  • Xóa tệp / thư mục được liệt kê trong .gitignore(như tệp xây dựng)
  • Xóa các tệp / thư mục không được theo dõi và không trong .gitignore

Ghi chú

Trường hợp kiểm tra để xác nhận tất cả các điều 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 về các cam kết trước (có thể yêu cầu chạy các lệnh trên trước)
  • git stashtương tự như git resettrên, nhưng bạn có thể hoàn tác nó

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

1
Tôi khá chắc chắn rằng tùy chọn đầu tiên ( Re-clone ) thực sự KHÔNG "xóa các cam kết cục bộ, không bị đẩy" :)
Marandil

1
@styfle là việc nó làm, là việc không làm
William Entriken

3
@FullDecent Thật khó hiểu khi đọ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 kép có nghĩa là nó xóa?
styfle

1
Giới thiệu về cờ -x git clean -f -d -x: nếu tùy chọn -x được chỉ định, các tệp bị bỏ qua cũng sẽ bị xóa. Ví dụ, điều này có thể hữu ích để xóa tất cả các sản phẩm xây dựng.- khỏi tài liệu GIT
Alex

82

Nếu bạn muốn hoàn nguyên tất cả các thay đổi VÀ cập nhật với chủ từ xa hiện tại (ví dụ: bạn thấy rằng CHÍNH chính đã di chuyển về phía trước kể từ khi bạn rẽ nhánh và việc đẩ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.

Điều quan trọng là chỉ định origintrong git reset --hard origin/master(hoạt động) - không có nó (tức là git reset --hard) dường như không có gì thay đổi.
Jake

Tôi đã có một số thay đổi cục bộ và không thể loại bỏ chúng bằng bất kỳ lệnh nào tôi đã thực hiện git reset - nguồn gốc / chủ nhân và nó cũng có thể kéo các thay đổi của chủ nhân
abhishek ringia

50

Nhìn vào git-reflog. Nó sẽ liệt kê tất cả các trạng thái mà nó nhớ (mặc định là 30 ngày) và bạn 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

cảm ơn một tấn William, cho git reflog. Tôi đặt lại cây của tôi về phiên bản cũ và không biết làm thế nào để truy cập lại gần đây. glog của bạn đã cứu tôi. Một lần nữa xin cảm ơn.
palaniraja

1
cứu tôi với Trong trường hợp của tôi, cuộc phiêu lưu của tôi git rebase -iđã bị trục trặc (cuối cùng đã xóa sạch một số cam kết do một lỗi chỉnh sửa). Nhờ mẹo này mà tôi trở lại trong trạng thái tốt!
paneer_tikka

Bạn có ý nghĩa gì trong 30 ngày mặc định!?
Mohe TheDreamy

@MoheTheDreamy Ý tôi là có giới hạn thời gian. Cuối cùng, người thu gom rác sẽ xóa các tham chiếu không thể truy cập khi tuổi của họ vượt quá giới hạn đó. Mặc định được sử dụng là (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

36

DANGER AHEAD: (vui lòng đọc các bình luậ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)

để loại bỏ hoàn toàn tất cả các tập tin bao gồm các thư mục tôi phải chạy

git clean -f -d

13
Để cứu 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 tin .gitignore-d!
địa chủ

xin lỗi nếu tôi gây ra cho bạn bất kỳ rắc rối. Trướ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ớ các trường hợp chính xác, nhưng "-d" là điều duy nhất làm việc cho tôi. Tôi hy vọng tôi đã không khiến bạn quá đau đớn :-)
Tobias Gassmann 27/11/13

1
không có hại gì Tôi đã có bản sao lưu, nhưng điều này có thể đảm bảo từ chối trách nhiệm;)
Landons 27/11/13

35

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

Đây là tập lệnh 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 sao chép làm việc.


10
Lệnh cuối cùng cho tôierror: pathspec 'HEAD' did not match any file(s) known to git.
0xC0000022L

1
Nó làm việc cho tôi khi tôi lấy "-" ra. git checkout HEAD
Jester

4
git reset --hardhoàn nguyên các tệp được theo dõi (theo giai đoạn hoặc không), git clean -f -dloại bỏ các tệp không bị theo dõi, git checkout -- HEADtại sao chúng ta cần điều này sau đó?
v.shashenko

Chúng tôi không cần gạch nối đôi. Phải là một lỗi đánh máy.
Farax

35

chỉ cần thực hiện -

git stash

nó sẽ loại bỏ tất cả các thay đổi cục bộ của bạn. và bạn cũng có thể sử dụng nó sau bằng cách thực hiện -

git stash apply 

3
sử dụng git stash popsẽ tự động loại bỏ thay đổi tối đa cho bạn
Mũi tên Cen

8
git stash dropđể loại bỏ trạng thái cất mới nhất mà không áp dụng cho bản sao làm việc.
Deerchao 22/03/2016

git stash áp dụng sẽ không thêm các tệp mới được tạo
Ravistm

27

Tôi đã gặp một vấn đề tương tự. Giải pháp là sử dụng git logđể tra cứu phiên bản nào của cam kết cục bộ khác với điều khiển từ xa. (Ví dụ: phiên bản là 3c74a11530697214cbcc4b7b98bf7a65952a34ec).

Sau đó sử dụng git reset --hard 3c74a11530697214cbcc4b7b98bf7a65952a34ecđể hoàn nguyên sự thay đổi.


16

Tôi đã tìm kiếm một vấn đề tương tự,

Muốn vứt bỏ các cam kết địa phương:

  1. nhân bản kho lưu trữ (git clone)
  2. chuyển sang chi nhánh dev (git checkout dev)
  3. đã thực hiện một vài lần xác nhận (git commit -m "commit 1")
  4. nhưng đã quyết định vứt bỏ những cam kết cục bộ này để quay trở lại từ xa (nguồn gốc / dev)

Những điều dưới đây cũng vậy:

git reset --hard origin/dev

Kiểm tra:

git status  

        On branch dev  
        Your branch is up-to-date with 'origin/dev'.  
        nothing to commit, working tree clean  

bây giờ các xác nhận cục bộ bị mất, trở lại trạng thái nhân bản ban đầu, điểm 1 ở trên.


1
cảm ơn, đó là điều duy nhất hiệu quả với tôi - "git reset - nguồn gốc"
Nisim Naim

hạnh phúc khi biết nó đã giúp.
Manohar Reddy Poreddy

7

Bạn có thể không nhất thiết muốn / cần phải bỏ công việc / tệp trong thư mục làm việc của mình mà thay vào đó chỉ cần loại bỏ chúng hoàn toàn. Lệnh git cleansẽ làm điều này cho bạn.

Một số trường hợp sử dụng phổ biến để thực hiện việc này sẽ là loại bỏ hành trình đã được tạo bằng cách hợp nhất hoặc các công cụ bên ngoài hoặc xóa các tệp khác để bạn có thể chạy bản dựng sạch.

Hãy nhớ rằng bạn sẽ rất thận trọng với lệnh này, vì nó được thiết kế để xóa các tệp khỏi thư mục làm việc cục bộ của bạn KHÔNG ĐƯỢC THEO D .I. nếu bạn hoàn toàn thay đổi quyết định sau khi thực hiện lệnh này, sẽ không quay lại để xem nội dung của các tệp đã bị xóa. Một cách khác an toàn hơn là thực thi

git stash --all

sẽ loại bỏ tất cả mọi thứ nhưng lưu tất cả trong một ngăn. Stash này sau đó có thể được sử dụng.

Tuy nhiên, nếu bạn thực sự muốn xóa tất cả các tệp và xóa thư mục làm việc của mình, bạn nên thực thi

git clean -f -d

Thao tác này sẽ xóa bất kỳ tệp nào và bất kỳ thư mục con nào không có bất kỳ mục nào do lệnh. Một điều thông minh cần làm trước khi thực hiện git clean -f -dlệnh là chạy

git clean -f -d -n

sẽ hiển thị cho bạn bản xem trước về những gì SILL bị xóa sau khi thực hiện git clean -f -d

Vì vậy, đây là một bản tóm tắt các lựa chọn của bạn từ tích cực nhất đến ít tích cực nhất


Tùy chọn 1 : Xóa tất cả các tệp cục bộ (Tích cực nhất)

git clean -f -d

Tùy chọn 2 : Xem trước tác động trên (Xem trước tích cực nhất)

git clean -f -d -n

Tùy chọn 3 : Stash tất cả các tệp (Ít tích cực nhất)

`git stash --all` 

6

Hãy thử điều này để hoàn nguyên tất cả các thay đổi không được khuyến khích trong chi nhánh địa phương

$ git reset --hard HEAD

Nhưng nếu bạn thấy một lỗi như thế này:

fatal: Unable to create '/directory/for/your/project/.git/index.lock': File exists.

Bạn có thể điều hướng đến thư mục '.git' sau đó xóa tệp index.lock:

$ cd /directory/for/your/project/.git/
$ rm index.lock

Cuối cùng, chạy lại lệnh:

$ git reset --hard HEAD

0

Câu hỏi này liên quan nhiều hơn đến việc đặt lại / hoàn nguyên kho lưu trữ rộng hơn, nhưng trong trường hợp nếu bạn muốn hoàn nguyên thay đổi cá nhân - tôi đã thêm câu trả lời tương tự vào đây:

https://stackoverflow.com/a/60890371/2338477

Trả lời câu hỏi:

  • Làm thế nào để hoàn nguyên thay đổi cá nhân có hoặc không thay đổi bảo tồn trong lịch sử git

  • Cách quay lại phiên bản cũ để khởi động lại từ cùng trạng thái

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.