Dường như không thể hủy các thay đổi trong Git


125

Sau khi nhìn thấy những điều sau từ dòng lệnh:

# On branch RB_3.0.10
# 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:   index.htm

Tôi đang cố gắng hủy các thay đổi của mình bằng cách nhập lệnh:

git checkout -- index.htm

nhưng khi tôi chạy lại trạng thái git, nó trông giống hệt nhau. Thanh toán dường như không hoạt động. Tôi có làm điều gì sai? Tôi đang sử dụng GIT 1.6.1.2 trên windows / cygwin.

# On branch RB_3.0.10
# 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:   index.htm

4
Liệu git checkout HEAD -- index.htm(đăng xuất từ ​​trạng thái đã cam kết cuối cùng, thay vì đăng xuất từ ​​chỉ mục) có hoạt động không?
Jakub Narębski

3
git checkout HEAD -- index.htmđã làm cho tôi!
Ben Tideswell,

Câu trả lời:


52

Điều này đã làm phiền tôi trong một thời gian, hầu hết mọi repo tôi muốn kiểm tra đều có những thay đổi mà tôi không thể loại bỏ. Truyện dài ngắn, tôi đã thử tất cả những điều trên, không có gì hiệu quả. Đây là những gì tôi đã làm để mọi thứ trở lại bình thường (trên máy Mac):

Completely remove the autocrlf & safecrlf settings from ~/.gitconfig
Completely remove the autocrlf & safecrlf settings from your repo's local config ./.git/config
git rm --cached -r .
git reset --hard

7
Sau khi thử mọi thứ ở trên, đây là điều duy nhất hiệu quả với tôi (trên Windows)
Anders

Cảm ơn bạn! Giống như Anders đã nói, giải pháp này cũng hiệu quả với tôi. Tôi đã thay autocrlf bằng # autocrlf
David

37

Đây là kinh nghiệm của tôi, hãy đặt các biến sau trong .git/config:

[core]
    autocrlf = false
    safecrlf = false
    eol = crlf

sau đó chạy $ git checkout HEAD ., và nó hoạt động. nhưng $ git checkout -- .không, lạ!

* git phiên bản 1.9.3


35

Những thay đổi nào git diffhiển thị trên tệp? Trên windows, tôi đã thấy các vấn đề với phần cuối dòng gây ra các vấn đề như thế này. Trong trường hợp đó, hãy xem bạn có cài đặt nào git config core.autocrlfgit config core.safecrlf. Có một số tài liệu cho các cài đặt này ở đây .

Tôi sẽ nói, nếu bạn đang sử dụng git svnđể tích hợp với lật đổ, thì hãy đảm bảo rằng bạn autocrlfđã tắt. Từ những gì tôi có thể nói, nó chỉ bị hỏng trong cấu hình này và nó làm cho hầu hết các công cụ nghĩ rằng các tệp đã bị thay đổi, khi bạn đã checkouthoàn nguyên mọi thay đổi.

Nếu bạn gặp sự cố ở nơi bạn làm git checkout, sau đó git statushiển thị tệp vẫn được sửa đổi và git diffhiển thị tệp đã được sửa đổi trên mọi dòng trong tệp, thì đây là sự cố bạn đang gặp phải.

core.autocrlf

Nếu đúng, hãy làm cho git chuyển đổi CRLF ở cuối dòng trong tệp văn bản thành LF khi đọc từ hệ thống tệp và chuyển đổi ngược lại khi ghi vào hệ thống tệp. Biến có thể được đặt thành đầu vào, trong trường hợp đó, chuyển đổi chỉ xảy ra khi đọc từ hệ thống tệp nhưng tệp được ghi bằng LF ở cuối dòng. Hiện tại, những đường dẫn nào để xem xét "văn bản" (tức là phải tuân theo cơ chế autocrlf) được quyết định hoàn toàn dựa trên nội dung.

core.safecrlf

Nếu đúng, hãy kiểm tra git xem việc chuyển đổi CRLF do core.autocrlf điều khiển có thể hoàn nguyên được hay không. Git sẽ xác minh xem một lệnh sửa đổi một tệp trong cây công việc trực tiếp hoặc gián tiếp. Ví dụ: cam kết một tệp sau đó kiểm tra cùng một tệp sẽ mang lại tệp gốc trong cây công việc. Nếu đây không phải là trường hợp cài đặt hiện tại của core.autocrlf, git sẽ từ chối tệp. Biến có thể được đặt thành "cảnh báo", trong trường hợp này, git sẽ chỉ cảnh báo về một chuyển đổi không thể đảo ngược nhưng vẫn tiếp tục hoạt động. ...


core.autocrlf = true core.safecrlf chưa được đặt. Điều này có nên được đặt thành true cho windows không? Sự khác biệt giữa hai là gì?

Tôi sẽ nói, hãy để cả hai tắt NẾU bạn đang sử dụng git svn. Tôi đã thêm một số chi tiết hơn.
THÔNG TIN 1800

4
Tôi giả định ông có nghĩa là quay nó bằng cách ít nhất là 90 độ
vijrox

2
Khi tôi đặt cả core.autocrlf và core.safecrlf thành true, tôi có thể loại bỏ các thay đổi được phát hiện trong các tệp vi phạm bằng cách chạy 'git reset --hard HEAD'.
Aleksey

19

Tôi nghĩ bạn cần phải vượt qua -f

Từ trang người đàn ông ( man git-checkout, GIT-CHECKOUT (1)):

-f, --force
Tiến hành ngay cả khi chỉ mục hoặc cây làm việc khác với HEAD.
Điều này được sử dụng để loại bỏ các thay đổi cục bộ .

Ví dụ: loại bỏ các thay đổi trên nhánh hiện tại và chuyển sang một nhánh khác:

git checkout -f master

7
Pass -f để làm gì? Rất vui nếu bạn trả lời đầy đủ
PandaWood

@Matt ý định của tôi không phải là kiểm tra một chi nhánh khác. Câu trả lời là từ năm 2009 vì vậy tôi không nhớ rõ lắm nhưng căn cứ vào câu hỏi, tôi nghĩ tôi có nghĩa là để vượt qua -fđể kiểm tra - <filename> như tronggit checkout -f -- filename
hasen

@hasen Ba nhận xét mà bạn đã yêu cầu làm rõ, đó là lý do tại sao tôi thêm "ví dụ". Ví dụ không loại trừ sử dụng khác của-f
Matt H

Đã làm cho tôi. git checkout -f masterném "Đã có trên 'chủ'" nhưng các thay đổi đã biến mất.
Christian

12

Nó có thể là kết thúc dòng, như @ 1800-information gợi ý, nhưng một khả năng khác là sự khác biệt (ngăn cản bạn hoàn nguyên các tệp này bằng lệnh kiểm tra) là một trong chế độ tệp. Đây là những gì xảy ra với tôi. Trên phiên bản git của tôi, bạn có thể khám phá điều này bằng cách sử dụng

git diff index.htm

Và nó sẽ hiển thị cho bạn các thay đổi chế độ tệp. Tuy nhiên, nó vẫn sẽ không cho phép bạn hoàn nguyên chúng bằng cách sử dụng thanh toán, ngay cả với tùy chọn -f. Để sử dụng

git config core.filemode false

hoặc thay đổi git .config của bạn trong trình soạn thảo văn bản của bạn bằng cách thêm

[cốt lõi]

filemode = false

Sau khi làm điều này, bạn có thể sử dụng

git đặt lại HEAD index.htm

và tệp sẽ biến mất.

(Tôi có tất cả những điều này từ các câu trả lời cho Làm cách nào để thực hiện thay đổi chế độ bỏ qua git (chmod)?cập nhật-tệp-quyền-chỉ-trong-git )


Cảm ơn nhiều! Không có đề xuất nào khác phù hợp với tôi để loại bỏ các thay đổi về chế độ tệp.
Thorkil Værge

6

Bạn đang sử dụng OSX hay Windows? Nếu vậy, vấn đề có thể là có hai tệp cùng tên, với trường hợp khác nhau. ví dụ. index.htm và Index.htm

Windows và OSX mặc định sử dụng hệ thống tệp không phân biệt chữ hoa chữ thường, hệ thống này xung đột với git phân biệt chữ hoa chữ thường.


2

Tôi đã gặp sự cố này và sau khi thử tất cả các cách trên, không có gì hoạt động.

Điều hiệu quả với tôi là xóa thư mục chứa tệp, sau đó git statusthực hiện và đảm bảo rằng tất cả các tệp trong dir đó hiện được đánh dấu là đã xóa. Sau đó tôi chỉ đơn giản là làm git checkout -fvà mọi thứ đã trở lại bình thường.


1

Tôi đang thực hiện một libGDXdự án Android Studiovà tôi muốn loại bỏ tất cả những thay đổi mà tôi đã thực hiện và không có gì hiệu quả với tôi, giải pháp tôi đưa ra là chuyển tất cả các thay đổi vào một nhánh mới

git checkout -b TRASH
git add .
git commit -m "discarded changes"
git checkout master

và sau đó bạn có thể xóa TRASHchi nhánh nếu bạn muốn.


1

Tôi đã có cùng một vấn đề, không có gì từ các ý kiến ​​trên hoạt động. Hóa ra, hệ thống tệp của tôi không phân biệt chữ hoa chữ thường (mặc định của osx, nhưng các cửa sổ có thể hoạt động giống nhau) và một tệp có cả chữ hoa và chữ thường trong cùng một thư mục, với nội dung khác nhau. Vì trên máy tính của tôi, cả hai tên đều trỏ vào cùng một tệp, trạng thái git luôn hiển thị sửa đổi, bất kể tôi đã làm gì. Để giải quyết vấn đề:

  • Tôi đã phải xóa một trong các tệp khỏi máy tính khác và đẩy nó vào repo

  • xóa toàn bộ phiên bản cục bộ hoàn toàn

  • làm git sao chép từ đầu


0

Tôi đã gặp sự cố tương tự, nơi nó không cho phép tôi hủy các tệp không tồn tại hoặc đã bị thay đổi. Tôi sử dụng Visual Studio tại nơi làm việc và tôi thấy rằng điều này xảy ra khi chuyển đổi các nhánh trong khi ứng dụng đang chạy.

git checkoutvà cố gắng loại bỏ không giúp được gì. Nó sẽ không hoạt động hoặc nó sẽ chỉ cho tôi biết rằng tôi không được phép.

Giải pháp đã hoạt động:

  1. Đi vào Chế độ An toàn
  2. Hủy tệp

Khởi động lại là một điều khó khăn, nhưng điều này hoạt động nhanh hơn so với thử 100 thứ.


0

Có một giải pháp dễ dàng. Nếu điều này xảy ra (thường là do các cửa sổ tắt đột ngột hoặc kết xuất bộ nhớ) và bạn không thể hủy các thay đổi của mình và thậm chí chuyển đổi giữa các nhánh (Git nói rằng bạn không có đủ quyền); trong Windowsmôi trường show all hidden files and folderstừ các tùy chọn thư mục. Chuyển đến thư mục GIT của bạn (phải bắt đầu bằng .git) và xóa "index.lock"tệp. Sau đó, Git sẽ cho phép bạn làm bất cứ điều gì bạn muốn làm.


0

Cuối cùng tôi đã làm git stashtheo sau bởi một git stash cleanđể loại bỏ một số. Không thấy bất kỳ cấu hình cr / lf tự động nào trong nội dung .git / hoặc ~ / .git.


0

Trong trường hợp của tôi, tôi không thể hủy các thay đổi liên quan đến một thư mục. Ví dụ: khi tôi chạy một git khác, tôi sẽ thấy điều này: -Subproject commit fdcccccccccccccccccccccccccccccccccccccc +Subproject commit f1bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb

Vì vậy, tôi đã gọi thư mục đó và chạy trạng thái git trong đó. Nó ở trạng thái tách rời HEAD. Và sau đó tôi chỉ chạy git checkout mastervào đó. Điều đó thiết lập mọi thứ phù hợp với tôi. Nhưng điều này không hữu ích cho kịch bản chính xác được hỏi ở đây.


0

Đây là một câu hỏi cũ, nhưng vẫn còn phù hợp với tôi. Tôi đã không tìm thấy câu trả lời của mình cho đến khi hỏi xung quanh văn phòng và phát hiện ra rằng vấn đề là với các mô-đun con. Khi chúng được cập nhật và kho lưu trữ của riêng bạn không phản ánh những thay đổi đó, nó sẽ hiển thị là có sự khác biệt, việc gửi lại người đứng đầu không giúp ích gì. Nếu đúng như vậy, hãy chạy:

git status update

Điều đó sẽ giúp sửa chữa mọi thứ (trong trường hợp cụ thể này)


0

Tôi gặp sự cố về quyền trong Windows và phải thực hiện icacls containingFolder /reset /t /l /c, sau đó nhấp đúp vào thư mục để lấy lại quyền của mình.


0

Tôi đã có .gitattributes với nội dung sau:

* text=auto eol=lf

Để khắc phục sự cố, hãy chỉnh sửa .gitattributesđể xóa dòng này làm giãn phần cuối dòng. Sau đó, git reset --hard HEADhoàn nguyên các tệp và .gitattributestệp.


0

Đối với tôi, vấn đề này do kết hợp tải xuống hình ảnh Git-LFS được tải lên qua Netlify CMS và được trình xử lý Netlify Large Media phân phát khác nhau.

Giải pháp của tôi là nhận xét / xóa các hàng này khỏi hàng của tôi ~/.gitconfigđể chúng trông giống như bên dưới, sau đó kiểm tra git statuslại.

# [filter "lfs"]
#   clean = git-lfs clean %f
#   smudge = git-lfs smudge %f
#   required = true

HOẶC bạn có thể thêm một bộ lọc cục bộ hơn thông qua một .gitconfigtrong repo root và bằng cách nào đó ghi đè các quy tắc bộ lọc cho lfs ở đó.

Hy vọng điều này sẽ giúp một đồng nghiệp ra ngoài.


-1

Tôi cũng gặp phải vấn đề tương tự và các bước sau đã giúp tôi giải quyết:

git commit -am 'temp commit'
git pull origin master
git reset head~1
git reset head --hard

Hy vọng nó cũng giúp ích cho những người khá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.