Nhiều cách khác nhau để loại bỏ thay đổi Git cục bộ


625

Tôi chỉ nhân bản một kho lưu trữ git và kiểm tra một chi nhánh. Tôi đã làm việc với nó, và sau đó quyết định loại bỏ tất cả các thay đổi cục bộ của tôi, vì tôi muốn bản sao gốc.

Nói tóm lại, tôi đã phải thực hiện hai lệnh sau để loại bỏ các thay đổi cục bộ của mình

git checkout .

git clean -f

Câu hỏi của tôi là,

(1) Đây có phải là cách tiếp cận chính xác trong việc loại bỏ các thay đổi cục bộ, hoặc nếu không xin vui lòng cho tôi biết cách tiếp cận chính xác.

(2) khi nào chúng ta sử dụng git reset --hardvì tôi có thể thiết lập lại ngay cả khi không có lệnh này

Cảm ơn

* Giải pháp: Chính (các) Chỉnh sửa: 26/03: * Thay thế nhiều thuật ngữ mơ hồ bằng thuật ngữ cụ thể của git [theo dõi / không theo dõi / dàn dựng / không dàn dựng]

Chỉ có thể có ba loại tệp khi chúng tôi thực hiện thay đổi cục bộ:

Loại 1. Tập tin theo dõi theo giai đoạn

Loại 2. Các tệp được theo dõi không theo dõi

Loại 3. Các tệp chưa được mã hóa

  • Giai đoạn - Những người được chuyển đến khu vực tổ chức / Đã thêm vào chỉ mục
  • Theo dõi - sửa đổi tập tin
  • UnTracked - tập tin mới. Luôn luôn không được tổ chức. Nếu được dàn dựng, điều đó có nghĩa là họ được theo dõi.

Mỗi lệnh làm gì:

  1. git checkout . - Loại bỏ các tệp được theo dõi không theo dõi CHỈ [Loại 2]

  2. git clean -f - Loại bỏ các tệp chưa được xử lý CHỈ [Loại 3]

  3. git reset --hard - Loại bỏ các tệp được theo dõi theo giai đoạn và không theo dõi CHỈ [Loại 1, Loại 2]

  4. git stash -u - Xóa tất cả các thay đổi [Loại 1, Loại 2, Loại 3]

Phần kết luận:

Rõ ràng là chúng ta có thể sử dụng một trong hai

(1) combination of `git clean -f` and `git reset --hard` 

HOẶC LÀ

(2) `git stash -u`

để đạt được kết quả mong muốn.

Lưu ý: Stashing, vì từ này có nghĩa là 'Lưu trữ (một cái gì đó) một cách an toàn và bí mật ở một nơi được chỉ định.' Điều này luôn có thể được lấy bằng cách sử dụng git stash pop. Vì vậy, lựa chọn giữa hai tùy chọn trên là cuộc gọi của nhà phát triển.

Cảm ơn bạn Christoph và Frederik Schøning.

Chỉnh sửa: 27/03

Tôi nghĩ rằng đáng để đặt ghi chú ' cẩn thận ' vàogit clean -f

git clean -f

Không có đường nào để trở lại đâu. Sử dụng -nhoặc --dry-runđể xem trước thiệt hại bạn sẽ làm.

Nếu bạn cũng muốn xóa thư mục, hãy chạy git clean -f -d

Nếu bạn chỉ muốn xóa các tập tin bị bỏ qua, hãy chạy git clean -f -X

Nếu bạn muốn xóa bỏ qua cũng như các tệp không bị bỏ qua, hãy chạy git clean -f -x

tham khảo: thêm về git clean: Làm thế nào để loại bỏ các tệp cục bộ (không bị theo dõi) khỏi cây làm việc Git hiện tại?

Chỉnh sửa: 20/05/15

Loại bỏ tất cả các cam kết cục bộ trên nhánh này [Xóa các cam kết cục bộ]

Để loại bỏ tất cả các cam kết cục bộ trên nhánh này, để làm cho nhánh cục bộ giống hệt với "thượng nguồn" của nhánh này, chỉ cần chạy git reset --hard @{u}

Tham khảo: http://sethrobertson.github.io/GitFixUm/fixup.html

hoặc làm git reset --hard origin/master[nếu chi nhánh địa phương là master]

Lưu ý: 06/12/2015 Đây không phải là một bản sao của câu hỏi SO khác được đánh dấu là trùng lặp. Câu hỏi này giải quyết làm thế nào để loại bỏ các thay đổi GIT cục bộ [xóa một tệp được thêm vào, xóa các thay đổi được thêm vào tệp hiện có, v.v. và các cách tiếp cận khác nhau; Trường hợp trong luồng SO khác chỉ giải quyết làm thế nào để loại bỏ cam kết cục bộ. Nếu bạn đã thêm một tệp và bạn muốn xóa tệp đó một mình, thì luồng SO khác sẽ không thảo luận về nó. Do đó đây không phải là bản sao của cái khác]

Chỉnh sửa: 23/11/15

Làm thế nào để hoàn nguyên một cam kết đã được đẩy đến một kho lưu trữ từ xa?

$ git revert ab12cd15

Chỉnh sửa: 09/01/2015

Xóa một cam kết trước đó từ chi nhánh địa phương và chi nhánh từ xa

Trường hợp: Bạn vừa cam kết một thay đổi cho chi nhánh địa phương của bạn và ngay lập tức bị đẩy đến chi nhánh từ xa, Đột nhiên nhận ra, Ồ không! Tôi không cần sự thay đổi này. Bây giờ làm gì?

git reset --hard HEAD~1 [để xóa cam kết đó từ chi nhánh địa phương]

git push origin HEAD --force[cả hai lệnh phải được thực thi. Để xóa từ chi nhánh từ xa]

Chi nhánh là gì? Chi nhánh hiện đang được kiểm tra.

Chỉnh sửa 09/08/2015 - Xóa hợp nhất git cục bộ :

Tôi đang ở masterchi nhánh và sáp nhập masterchi nhánh với một chi nhánh mới hoạt độngphase2

$ git status
# On branch master

$ git merge phase2

$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 8 commits.

Q: Làm thế nào để thoát khỏi sự hợp nhất này? Đã thử git reset --hardgit clean -d -f cả hai đều không hoạt động.

Điều duy nhất đã làm việc là bất kỳ trong số những người dưới đây:

$ git reset --hard origin/master

hoặc là

$ git reset --hard HEAD~8

hoặc là

$ git reset --hard 9a88396f51e2a068bb7 [mã xác nhận sha - đây là mã đã có mặt trước khi tất cả các cam kết hợp nhất của bạn xảy ra]


1
Tôi đoán chủ đề này có thể trả lời câu hỏi của bạn: stackoverflow.com/questions/1146973/ từ
Saucier

1
"Git stash" sẽ xóa mọi thay đổi bạn đã thực hiện.
John Ballinger

1
Tóm tắt tốt đẹp! Tôi sẽ thêm một loại tệp khác: "Loại 4. Các tệp bị bỏ qua." git stash -a[hoặc --all] cũng sẽ xóa các tệp bị bỏ qua và không bị theo dõi. git clean -xcũng sẽ làm sạch các tập tin bị bỏ qua. git clean -Xsẽ chỉ làm sạch các tập tin bị bỏ qua.
Jerry101

2
@JavaDev Câu hỏi của bạn giống như một câu trả lời .. đánh giá cao rằng bạn tiếp tục chỉnh sửa và biên soạn tất cả các câu trả lời.
Bhavuk Mathur

1
cảm ơn tôi đã chạy tất cả 4 lệnh của bạn để đảo ngược các thay đổi cục bộ
Vincent Tang

Câu trả lời:


505

Tất cả phụ thuộc vào chính xác những gì bạn đang cố gắng hoàn tác / hoàn nguyên. Bắt đầu bằng cách đọc bài viết trong liên kết của Ube . Nhưng để cố gắng trả lời:

Thiết lập lại cứng

git reset --hard [HEAD]

loại bỏ hoàn toàn tất cả các thay đổi theo giai đoạn và không theo giai đoạn đối với các tệp được theo dõi.

Tôi thấy mình thường xuyên sử dụng việc thiết lập lại khó khăn, khi tôi như "hoàn tác mọi thứ như thể tôi đã thực hiện sao chép lại hoàn toàn từ xa". Trong trường hợp của bạn, nơi bạn chỉ muốn repo nguyên sơ của mình, điều này sẽ làm việc.

Dọn dẹp

git clean [-f]

Loại bỏ các tập tin không được theo dõi.

Để xóa các tệp tạm thời, nhưng hãy giữ các thay đổi theo giai đoạn và không theo giai đoạn đối với các tệp đã được theo dõi. Đôi khi, tôi có thể sẽ thực hiện một quy tắc bỏ qua thay vì làm sạch nhiều lần - ví dụ: đối với các thư mục bin / obj trong dự án C #, mà bạn thường muốn loại trừ khỏi repo của mình để tiết kiệm dung lượng hoặc đại loại như thế.

Tùy chọn -f (lực lượng) cũng sẽ xóa các tệp không được theo dõi cũng bị git bỏ qua mặc dù quy tắc bỏ qua. Trong trường hợp trên, với quy tắc bỏ qua để không bao giờ theo dõi các thư mục bin / obj, mặc dù các thư mục này đang bị git bỏ qua, sử dụng tùy chọn bắt buộc sẽ xóa chúng khỏi hệ thống tệp của bạn. Tôi đã thỉnh thoảng thấy một cách sử dụng cho việc này, ví dụ như khi triển khai kịch bản và bạn muốn làm sạch mã của mình trước khi triển khai, nén hoặc bất cứ điều gì.

Git sạch sẽ không chạm vào các tập tin, đã được theo dõi.

Thanh toán "chấm"

git checkout .

Tôi thực sự chưa bao giờ thấy ký hiệu này trước khi đọc bài viết của bạn. Tôi đang gặp khó khăn trong việc tìm tài liệu cho việc này (có lẽ ai đó có thể giúp đỡ), nhưng từ việc chơi xung quanh một chút, có vẻ như nó có nghĩa là:

"Hoàn tác mọi thay đổi trong cây làm việc của tôi".

Tức là hoàn tác các thay đổi chưa được xử lý trong các tệp được theo dõi. Nó dường như không chạm vào các thay đổi theo giai đoạn và để lại các tệp không bị theo dõi.

Đâm

Một số câu trả lời đề cập đến đâm. Theo cách diễn đạt, có lẽ bạn sẽ sử dụng stashing khi bạn đang ở giữa một thứ gì đó (chưa sẵn sàng cho một cam kết) và bạn phải tạm thời chuyển các nhánh hoặc bằng cách nào đó làm việc trên một trạng thái khác của mã của bạn, sau đó để trở về "mớ hỗn độn của bạn bàn". Tôi không thấy điều này áp dụng cho câu hỏi của bạn, nhưng nó thực sự tiện dụng.

Tóm lại

Nói chung, nếu bạn tự tin rằng mình đã cam kết và có thể bị đẩy đến một thay đổi quan trọng từ xa, nếu bạn chỉ chơi xung quanh hoặc tương tự, sử dụng git reset --hard HEADtheo sau git clean -fsẽ xóa sạch mã của bạn về trạng thái, nó sẽ được sao chép, nếu nó chỉ được sao chép và kiểm tra từ một chi nhánh. Điều thực sự quan trọng cần nhấn mạnh là việc đặt lại cũng sẽ loại bỏ các giai đoạn, nhưng những thay đổi không được cam kết. Nó sẽ xóa tất cả mọi thứ chưa được cam kết (ngoại trừ các tệp không bị theo dõi, trong trường hợp đó, sử dụng sạch ).

Tất cả các lệnh khác đều có để tạo điều kiện cho các kịch bản phức tạp hơn, trong đó cần có mức độ chi tiết của "công cụ hoàn tác" :)

Tôi cảm thấy, câu hỏi số 1 của bạn được đề cập, nhưng cuối cùng, để kết luận về câu số 2: lý do bạn không bao giờ tìm thấy nhu cầu sử dụng git reset --hardlà bạn chưa bao giờ dàn dựng bất cứ điều gì. Nếu bạn dàn dựng một sự thay đổi, thì git checkout .cũng không git clean -fthể hoàn nguyên điều đó.

Hy vọng điều này bao gồm.


Cảm ơn bạn cho lý do đằng sau sử dụng git reset --hard. Tôi đã thử nó và vâng .. những tệp được thêm vào chỉ mục (dàn) chỉ bị xóa sau đó git reset --hardvà tôi mặc định git reset --hardlà theo git reset --hard head. Liên kết này cũng là hữu ích gitready.com/beginner/2009/01/18/the-staging-area.html
người nhện

Tôi đã cải thiện câu trả lời của mình tại sao tôi nghĩ git stash -ucó ý nghĩa nhất ở đây.
Christoph

2
Cảm ơn cả hai bạn. Tôi đã tóm tắt câu trả lời và nhúng vào câu hỏi của tôi. Christoph cho tôi biết những gì git stash -ulàm và làm thế nào để bật nó, nhưng Frederik cho tôi biết thiết lập lại cứng và sử dụng kết hợp git reset --hardgit clean -f, và tại sao không stashđược ưa thích trong một số tình huống. Bây giờ Xin hãy giúp tôi trong việc chọn câu nào tôi nên đánh dấu là Trả lời :), cả hai đều là câu trả lời của tôi.
nhện

3
.là một pathspec đề cập đến thư mục làm việc hiện tại, có thể là gốc của repo. Từ git-scm.com: git checkout [<tree-ish>] [--] <pathspec>…cập nhật các đường dẫn được đặt tên trong cây làm việc từ tệp chỉ mục hoặc từ <cây-ish> có tên.
Jerry101

3
Nó không bao giờ đủ nhấn mạnh rằng cả git reset --hardgit clean -dfxvà tương tự là phá hoại . Dù sao, xin vui lòng sửa chữ thường headtrong câu trả lời, nó nên là chữ hoa HEADhoặc không có mặt ở tất cả.
Pavel imerda

25

Lý do để thêm một câu trả lời tại thời điểm này:

Cho đến nay tôi đã thêm kết luận và 'câu trả lời' cho chính câu hỏi ban đầu của mình, làm cho câu hỏi rất dài, do đó chuyển sang câu trả lời riêng.

Tôi cũng đã thêm các lệnh git được sử dụng thường xuyên hơn để giúp tôi trên git, để giúp người khác nữa.

Về cơ bản để làm sạch tất cả các cam kết địa phương $ git reset --hard$ git clean -d -f


Bước đầu tiên trước khi bạn thực hiện bất kỳ cam kết nào là định cấu hình tên người dùng và email xuất hiện cùng với cam kết của bạn.

# Đặt tên bạn muốn đính kèm với giao dịch cam kết của bạn

$ git config --global user.name "[name]"

# Đặt email bạn muốn chuyển đến các giao dịch cam kết của bạn

$ git config --global user.email "[email address]"

# Liệt kê cấu hình toàn cầu

$ git config --list

# Liệt kê URL từ xa

$ git remote show origin

#kiểm tra trạng thái

git status

# Liệt kê tất cả các chi nhánh địa phương và từ xa

git branch -a

# tạo một chi nhánh địa phương mới và bắt đầu làm việc với chi nhánh này

git checkout -b "branchname" 

hoặc, nó có thể được thực hiện như một quá trình hai bước

tạo chi nhánh: git branch branchname làm việc trên chi nhánh này:git checkout branchname

#commit thay đổi cục bộ [quy trình hai bước: - Thêm tệp vào chỉ mục, có nghĩa là thêm vào khu vực tổ chức. Sau đó cam kết các tệp có trong khu vực tổ chức này]

git add <path to file>

git commit -m "commit message"

#checkout một số chi nhánh địa phương khác

git checkout "local branch name"

#remove tất cả các thay đổi trong nhánh cục bộ [Giả sử bạn đã thực hiện một số thay đổi trong nhánh cục bộ như thêm tệp mới hoặc sửa đổi tệp hiện có hoặc thực hiện một cam kết cục bộ, nhưng không còn cần điều đó] git clean -d -fgit reset --hard [xóa tất cả các thay đổi cục bộ được thực hiện cho nhánh cục bộ trừ khi cam kết địa phương]

git stash -u cũng loại bỏ tất cả các thay đổi

Lưu ý: Rõ ràng là chúng ta có thể sử dụng kết hợp (1) git clean –d –fgit reset --hard OR (2) git stash -u để đạt được kết quả mong muốn.

Lưu ý 1: Stashing, vì từ này có nghĩa là 'Lưu trữ (một cái gì đó) một cách an toàn và bí mật ở một nơi được chỉ định.' Điều này luôn có thể được truy xuất bằng git stash pop. Vì vậy, lựa chọn giữa hai tùy chọn trên là cuộc gọi của nhà phát triển.

Lưu ý 2: git reset --hardsẽ xóa các thay đổi thư mục làm việc. Hãy chắc chắn để xóa bất kỳ thay đổi cục bộ nào bạn muốn giữ trước khi chạy lệnh này.

# Chuyển sang nhánh chính và đảm bảo bạn được cập nhật.

git checkout master

git fetch [điều này có thể cần thiết (tùy thuộc vào cấu hình git của bạn) để nhận các bản cập nhật về nguồn gốc / bản gốc]

git pull

# Hợp nhất nhánh tính năng vào nhánh chính.

git merge feature_branch

# Đặt lại nhánh chính về trạng thái ban đầu.

git reset origin/master

#Accident xóa một tệp từ cục bộ, làm thế nào để lấy lại nó? Làm một git statusđể có được filepath đầy đủ của tài nguyên bị xóa

git checkout branchname <file path name>

đó là nó!

#Merge chi nhánh chính với một số sản phẩm khác

git checkout master
git merge someotherbranchname

#rename chi nhánh địa phương

git branch -m old-branch-name new-branch-name

#delete chi nhánh địa phương

git branch -D branch-name

#delete chi nhánh từ xa

git push origin --delete branchname

hoặc là

git push origin :branch-name

#revert một cam kết đã được đẩy đến một kho lưu trữ từ xa

git revert hgytyz4567

#branch từ một cam kết trước đó bằng GIT

git branch branchname <sha1-of-commit>

# Thay đổi thông báo cam kết của cam kết gần đây nhất đã được đẩy lên từ xa

git commit --amend -m "new commit message"
git push --force origin <branch-name>

# Loại bỏ tất cả các cam kết cục bộ trên nhánh này [Xóa các cam kết cục bộ]

Để loại bỏ tất cả các cam kết cục bộ trên nhánh này, để làm cho nhánh cục bộ giống hệt với "thượng nguồn" của nhánh này, chỉ cần chạy

git reset --hard @{u}

Tham khảo: http://sethrobertson.github.io/GitFixUm/fixup.html hoặc làm git reset --hard origin/master[nếu chi nhánh địa phương là chủ]

# Hoàn nguyên một cam kết đã được đẩy đến một kho lưu trữ từ xa?

$ git revert ab12cd15

# Xóa một cam kết trước đó từ chi nhánh địa phương và chi nhánh từ xa

Ca sử dụng: Bạn vừa cam kết thay đổi chi nhánh địa phương của mình và ngay lập tức bị đẩy đến chi nhánh từ xa, Đột nhiên nhận ra, Ồ không! Tôi không cần sự thay đổi này. Bây giờ làm gì?

git reset --hard HEAD~1[để xóa cam kết đó từ chi nhánh địa phương. 1 biểu thị MỘT cam kết bạn đã thực hiện]

git push origin HEAD --force[cả hai lệnh phải được thực thi. Để xóa từ chi nhánh từ xa]. Chi nhánh đã được kiểm tra hiện tại sẽ được gọi là chi nhánh nơi bạn đang thực hiện thao tác này.

# Xóa một số cam kết gần đây từ repo cục bộ và từ xa và giữ nguyên cam kết mà bạn muốn. (một loại cam kết hoàn nguyên từ địa phương và từ xa)

Giả sử bạn có 3 cam kết mà bạn đã đẩy đến chi nhánh từ xa có tên ' develop'

commitid-1 done at 9am
commitid-2 done at 10am
commitid-3 done at 11am. // latest commit. HEAD is current here.

Để trở lại cam kết cũ (để thay đổi trạng thái của chi nhánh)

git log --oneline --decorate --graph // để xem tất cả các cam kết của bạn

git clean -d -f // xóa mọi thay đổi cục bộ

git reset --hard commitid-1 // cục bộ trở lại cam kết này

git push -u origin +develop// đẩy trạng thái này đến xa. + để làm lực đẩy

# Xóa hợp nhất git cục bộ: Trường hợp: Tôi đang ở nhánh chính và sáp nhập nhánh chính với một nhánh mới hoạt động2

$ git status

Trên nhánh chủ

$ git merge phase2 $ git status

Trên nhánh chủ

Chi nhánh của bạn đi trước 'origin / master' bằng 8 lần cam kết.

Q: Làm thế nào để thoát khỏi sự hợp nhất git cục bộ này? Đã thử git reset --hardgit clean -d -fcả hai đều không hoạt động. Điều duy nhất đã làm việc là bất kỳ trong số những người dưới đây:

$ git đặt lại - nguồn gốc / chủ

hoặc là

thiết lập lại $ git - đầu trang ~ 8

hoặc là

$ git reset --hard 9a88396f51e2a068bb7 [mã xác nhận sha - đây là mã đã có mặt trước khi tất cả các cam kết hợp nhất của bạn xảy ra]

#create tệp gitignore

touch .gitignore // tạo tập tin trong người dùng mac hoặc unix

nội dung mẫu .gitignore:

.project
*.py
.settings

Liên kết tham chiếu đến bảng cheat GIT: https://service.github.com/on-demand/doads/github-git-cheat-sheet.pdf


1
Lệnh của bạn để xóa Chi nhánh từ xa có thể không tốt nhất . Bạn đang sử dụng git push origin :branch-nametuy nhiên tôi khuyên bạn nên sử dụnggit push origin --delete branchname
vibs2006

Đồng ý, tôi cập nhật với đề nghị của bạn, cảm ơn bạn @ vibs2006
người nhện

21

Như với mọi thứ trong git, có nhiều cách để làm điều đó. Hai lệnh bạn đã sử dụng là một cách để làm điều đó. Một điều khác bạn có thể làm chỉ đơn giản là cất giấu chúng git stash -u. Các -uđảm bảo rằng mới được thêm vào các file (untracked) cũng được bao gồm.

Điều tiện dụng git stash -u

  1. nó có lẽ là lệnh đơn giản nhất (duy nhất?) để thực hiện mục tiêu của bạn
  2. nếu bạn đổi ý sau đó, bạn sẽ lấy lại tất cả công việc của mình git stash pop(giống như xóa một email trong gmail nơi bạn có thể hoàn tác nếu bạn đổi ý sau đó)

Vì câu hỏi khác của bạn git reset --hardsẽ không xóa các tệp không bị theo dõi nên bạn vẫn sẽ cần git clean -f. Nhưng git stash -ucó thể là thuận tiện nhất.


git reset --hardthực sự sẽ không loại bỏ các tệp chưa được theo dõi , nhưng nó sẽ loại bỏ các thay đổi chưa được theo dõi, tức là thay đổi các tệp đã có trong chỉ mục. Tôi chắc chắn đó là những gì bạn muốn nói :)
Frederik Struck-Schøning

Khi tôi sử dụng git stash -u, tôi thấy phản hồi này từ git bash. "Thư mục làm việc đã lưu và trạng thái chỉ mục WIP trên {Branchname}. Có thể đây là thư mục đã lưu này là những gì chúng ta có thể truy xuất bằng cách sử dụng git stash pop.
nhện

Cảm ơn cả hai bạn. Tôi đã tóm tắt câu trả lời và nhúng vào câu hỏi của tôi. Christoph cho tôi biết những gì git stash -ulàm và làm thế nào để bật nó, nhưng Frederik cho tôi biết thiết lập lại cứng và sử dụng kết hợp git reset --hardgit clean -f, và tại sao không stashđược ưa thích trong một số tình huống. Bây giờ Xin hãy giúp tôi trong việc chọn câu nào tôi nên đánh dấu là Trả lời :), cả hai đều là câu trả lời của tôi.
nhện

Nhưng nếu có một tệp tôi đã thêm vào kho lưu trữ của mình mà tôi không muốn theo dõi thì sao? chỉ trong repo của tôi. Nếu tôi thêm nó vào danh sách bỏ qua thì tôi có một tệp .ignore để cam kết cũng sẽ ảnh hưởng đến mọi người khác.
dùng2058

7

1. Khi bạn không muốn giữ những thay đổi cục bộ của mình.

git reset --hard

Lệnh này sẽ loại bỏ hoàn toàn tất cả các thay đổi cục bộ khỏi kho lưu trữ cục bộ của bạn. Đây là cách tốt nhất để tránh xung đột trong lệnh pull, chỉ khi bạn không muốn giữ những thay đổi cục bộ của mình.

2. Khi bạn muốn giữ những thay đổi cục bộ của bạn

Nếu bạn muốn kéo các thay đổi mới từ xa và muốn bỏ qua các thay đổi cục bộ trong lần kéo này thì,

git stash

Nó sẽ xóa tất cả các thay đổi cục bộ, bây giờ bạn có thể kéo các thay đổi từ xa,

git pull

Bây giờ, bạn có thể mang lại các thay đổi cục bộ của mình bằng cách,

git stash pop

1
git reset --hardkhông loại bỏ tất cả các thay đổi cục bộ. Nó chỉ loại bỏ các sửa đổi. Nếu bạn muốn xóa thêm, thì bạn cũng phảigit clean -fd
John Henckel

4

Sử dụng:

git checkout -- <file>

Để loại bỏ những thay đổi trong thư mục làm việc.


4

Tôi nghĩ rằng git có một điều không được ghi chép rõ ràng. Tôi nghĩ rằng nó đã thực sự bị bỏ rơi.

git checkout .

Man, bạn đã cứu ngày của tôi. Tôi luôn có những thứ tôi muốn thử sử dụng mã sửa đổi. Nhưng đôi khi mọi thứ cuối cùng lại làm rối mã sửa đổi, thêm các tệp mới không bị khóa, v.v. Vì vậy, điều tôi muốn làm là, giai đoạn những gì tôi muốn, làm những thứ lộn xộn, sau đó dọn dẹp nhanh chóng và cam kết nếu tôi hài lòng.

git clean -fdhoạt động tốt cho các tập tin không bị theo dõi.

Sau đó, git resetchỉ cần loại bỏ dàn dựng, nhưng git checkoutlà quá cồng kềnh. Chỉ định từng tệp một hoặc sử dụng các thư mục không phải lúc nào cũng lý tưởng. Đôi khi các tập tin thay đổi tôi muốn loại bỏ nằm trong các thư mục tôi muốn giữ. Tôi muốn cho một lệnh này sẽ loại bỏ các thay đổi chưa được thực hiện và đây là bạn. Cảm ơn.

Nhưng tôi nghĩ họ chỉ nên có git checkoutmà không có bất kỳ lựa chọn nào, loại bỏ tất cả những thay đổi không được dàn dựng và không chạm vào dàn dựng. Đó là mô-đun và trực quan. Giống như những gì git resetkhông. git cleancũng nên làm như vậy.


2

Cách tốt nhất là kiểm tra các thay đổi.

Thay đổi tệp pom.xml trong dự án có tên dự án, bạn có thể thực hiện:

git status

# modified:   project-name/pom.xml

git checkout project-name/pom.xml
git checkout master

# Checking out files: 100% (491/491), done.
# Branch master set up to track remote branch master from origin.
# Switched to a new branch 'master'

2

Để loại bỏ tất cả những gì tôi muốn bỏ và bỏ rác đó, đó là cách nhanh nhất để loại bỏ tất cả, đặc biệt nếu bạn làm việc giữa nhiều repos.

Điều này sẽ xóa tất cả các thay đổi trong {0}khóa và ngay lập tức thả nó từ{0}

git stash && git stash drop


1

Trước hết kiểm tra là thay đổi quan trọng của bạn được lưu hay không bằng cách:

$ git trạng thái

hơn cố gắng

thiết lập lại $ git -

nó sẽ đặt lại chi nhánh của bạn về mặc định

nhưng nếu bạn cần hoàn tác:

$ chỉnh sửa (1) $ git thêm frotz.c filfre.c $ mailx (2) $ git reset
(3) $ git pull git: //info.example.com/


Đọc thêm >> https://git-scm.com/docs/git-reset


Lưu ý bên lề: reset --hard là lệnh nguy hiểm, điều này sẽ loại bỏ tất cả các thay đổi và không thể hoàn tác. Người dùng nên lưu ý khi sử dụng reset cứng.
danglingpulum
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.