Git 刪除未提交的更改
Stewart Nguyen 2023年1月30日 Git Git Commit
本文將指導你如何撤消我們對本地倉庫所做的未提交更改。
使用功能時,我們可能首先建立新檔案,向現有檔案新增更改,然後刪除一些檔案。最終,我們意識到這一切都錯了,需要回到之前的提交。我們應該做什麼?
$ echo 'Add new implementation' > feature.txt $ echo 'Enhance exising feature' >> file.txt $ git add file.txt $ rm deprecated_feature.txt $ git status On branch main Changes to be committed: (use "git restore --staged <file>..." to unstage) modified: file.txt Changes not staged for commit: (use "git add/rm <file>..." to update what will be committed) (use "git restore <file>..." to discard changes in working directory) deleted: deprecated_feature.txt Untracked files: (use "git add <file>..." to include in what will be committed) feature.txt 我們有幾種方法來完成它。
使用 git checkout 刪除 Git 中未提交的更改
此命令將恢復跟蹤檔案的未提交更改。被跟蹤的檔案是 git 知道的檔案,通常是在被 git add 新增之後
$ git checkout . Updated 2 paths from the index $ git status On branch main Untracked files: (use "git add <file>..." to include in what will be committed) feature.txt nothing added to commit but untracked files present (use "git add" to track) 請注意,如果檔案已經通過 git add 新增到暫存區,git checkout 將不起作用。
$ echo 'Enhance exising feature' >> file.txt $ git add file.txt $ git checkout file.txt Updated 0 paths from the index $ git status On branch main Changes to be committed: (use "git restore --staged <file>..." to unstage) modified: file.txt Untracked files: (use "git add <file>..." to include in what will be committed) feature.txt 在上面的示例中,對 file.txt 的更改不會恢復,因為該檔案位於暫存區域中。
使用 git reset 刪除 Git 中未提交的更改
要刪除暫存區中未提交的更改,我們需要採取以下步驟。
- 使用
git reset從暫存區取消暫存檔案。 - 使用
git checkout撤消更改。
$ git reset file.txt Unstaged changes after reset: M file.txt $ git checkout file.txt Updated 1 path from the index $ git status On branch main Untracked files: (use "git add <file>..." to include in what will be committed) feature.txt nothing added to commit but untracked files present (use "git add" to track) 使用 git reset 刪除未提交更改的另一種方法是使用選項 --hard 和引數 HEAD。
$ git reset --hard HEAD HEAD is now at 1e087f5 Make some change to file.txt $ git status On branch main Untracked files: (use "git add <file>..." to include in what will be committed) feature.txt nothing added to commit but untracked files present (use "git add" to track) --hard選項指定 Git 丟擲當前狀態和最後一個引數中的提交之間的所有更改。出於這個原因,這個命令被認為是危險的,應該在你執行git status檢查工作檔案後使用。- 最新提交的
HEAD別名。
使用 git stash 和 git stash 刪除 Git 中未提交的更改
git checkout 和 git reset 的缺點是它們無法刪除未跟蹤的檔案。feature.txt 在執行這些命令後仍然存在。
考慮第一個例子。
$ echo 'Add new implementation' > feature.txt $ echo 'Enhance exising feature' >> file.txt $ git add file.txt $ rm deprecated_feature.txt $ git status On branch main Changes to be committed: (use "git restore --staged <file>..." to unstage) modified: file.txt Changes not staged for commit: (use "git add/rm <file>..." to update what will be committed) (use "git restore <file>..." to discard changes in working directory) deleted: deprecated_feature.txt Untracked files: (use "git add <file>..." to include in what will be committed) feature.txt 刪除所有未提交的更改,包括暫存檔案、已跟蹤但未暫存和未跟蹤檔案。我們將使用巧妙的方法 git stash。
git stash 允許我們儲存更改,但不需要 git commit;它充當未提交檔案的臨時儲存。
在向臨時儲存新增更改後,我們將告訴 Git 刪除這些儲存。因此,所有未提交的更改都將消失。
$ git add . $ git stash Saved working directory and index state WIP on main: 16b9767 deprecated_feature.txt $ git stash drop Dropped refs/stash@{0} (aebeb2cbdcec917331f5793ef1238f5a525d29ec) $ git status On branch main nothing to commit, working tree clean 總之,我們有幾種方法可以刪除未提交的更改:
git checkout僅在檔案不在暫存區時有用。git reset對暫存區中的更改很有用,但不能刪除未跟蹤檔案的更改,需要與git checkout結合使用。git reset --hard HEAD可能比上面的短,但有潛在的危險。git stash與git add .可以刪除所有內容,包括未跟蹤的檔案。
Enjoying our tutorials? Subscribe to DelftStack on YouTube to support us in creating more high-quality video guides. Subscribe