revert用法 - 如何在提交前撤消'git add'?




git提交 (20)

我使用命令錯誤地將文件添加到git:

git add myfile.txt

我還沒有運行git commit 。 有沒有辦法撤消這個,所以這些文件不會包含在提交中?

到目前為止有48個答案(有些已刪除)。 除非您有一些新信息,否則請不要添加新的。

https://code.i-harness.com


Git擁有可以想像的每一個動作的命令,但需要廣泛的知識來使事情正確,因此它最好是反直覺的......

你之前做過的事:

  • 更改了文件並使用了git add . ,或者git add <file>

你想要什麼:

  • 從索引中刪除該文件,但保留其版本並留下工作副本中未提交的更改:

    git reset head <file>
    
  • 將文件重置為HEAD的最後一個狀態,撤消更改並將其從索引中刪除:

    # Think `svn revert <file>` IIRC.
    git reset HEAD <file>
    git checkout <file>
    
    # If you have a `<branch>` named like `<file>`, use:
    git checkout -- <file>
    

    這是必需的,因為git reset --hard HEAD不能用於單個文件。

  • 從索引和版本控制中刪除<file> ,使未版本化的文件保留工作副本中的更改:

    git rm --cached <file>
    
  • 完全從工作副本和版本控制中刪除<file>

    git rm <file>
    

git add myfile.txt #這將把你的文件添加到提交列表中

與此命令完全相反的是,

git reset HEAD myfile.txt  # this will undo it. 

所以,你將處於以前的狀態。指定將再次處於未跟踪列表(先前狀態)。

它將使用指定的文件重置您的頭部。所以,如果你的頭沒有它的意思,它只會重置它


也許自從你發布問題以來Git已經發展了。

$> git --version
git version 1.6.2.1

現在,您可以嘗試:

git reset HEAD .

這應該是你正在尋找的。


你要:

git rm --cached <added_file_to_undo>

推理:

當我剛接觸這個時,我首先嘗試過

git reset .

(撤消我的整個初始添加),只是為了得到這個(不那麼)有用的消息:

fatal: Failed to resolve 'HEAD' as a valid ref.

事實證明,這是因為HEAD ref(branch?)直到第一次提交後才存在。 也就是說,如果你的工作流程像我一樣,你會遇到和我一樣的初學者問題:

  1. cd到我偉大的新項目目錄,嘗試Git,新的熱點
  2. git init
  3. git add .
  4. git status

    ......很多廢話捲軸......

    =>該死,我不想加上所有這些。

  5. 谷歌“撤消git添加”

    =>查找 - yay

  6. git reset .

    =>致命:無法將'HEAD'解析為有效的參考號。

事實證明,在郵件列表中存在一個針對此無益的錯誤

並且正確的解決方案就在Git狀態輸出中(是的,我把它作為'廢話'掩蓋了)

...
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
...

而解決方案確實是使用git rm --cached FILE

請注意此處其他地方的警告 - git rm刪除文件的本地工作副本,但如果使用--cached則 不會刪除。 這是git help rm的結果:

--cached使用此選項僅從索引中取消暫存和刪除路徑。 將保留工作樹文件,無論是否已修改。

我繼續使用

git rm --cached .

刪除所有內容並重新開始。 雖然沒有工作,因為雖然add . 是遞歸的,結果是rm需要-r來遞歸。 嘆。

git rm -r --cached .

好的,現在我回到了我開始的地方。 下次我要使用-n進行幹運行,看看會添加什麼:

git add -n .

我把所有東西都拉到一個安全的地方,然後相信git help rm關於--cached沒有破壞任何東西(如果我拼錯它會怎麼樣)。


使用--cached標誌可以使用git removegit rm 。 嘗試:

git help rm

使用git add -i從即將到來的提交中刪除剛剛添加的文件。 例:

添加您不想要的文件:

$ git add foo
$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       new file:   foo
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
# [...]#

進入交互式添加以撤消你的添加(在這裡輸入git的命令是“r”(恢復),“1”(列表恢復中的第一個條目顯示),“返回”退出恢復模式,以及“q” (放棄):

$ git add -i
           staged     unstaged path
  1:        +1/-0      nothing foo

*** Commands ***
  1: [s]tatus     2: [u]pdate     3: [r]evert     4: [a]dd untracked
  5: [p]atch      6: [d]iff       7: [q]uit       8: [h]elp
What now> r
           staged     unstaged path
  1:        +1/-0      nothing [f]oo
Revert>> 1
           staged     unstaged path
* 1:        +1/-0      nothing [f]oo
Revert>> 
note: foo is untracked now.
reverted one path

*** Commands ***
  1: [s]tatus     2: [u]pdate     3: [r]evert     4: [a]dd untracked
  5: [p]atch      6: [d]iff       7: [q]uit       8: [h]elp
What now> q
Bye.
$

而已! 這是你的證明,顯示“foo”回到未跟踪列表:

$ git status
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
# [...]
#       foo
nothing added to commit but untracked files present (use "git add" to track)
$

假設我創建了一個新文件newFile.txt

假設我意外添加了文件, git add newFile.txt

現在我要在提交之前撤消此添加, git reset newFile.txt


只需鍵入git reset它就會恢復,就像你從未輸入git add . 自上次提交以來。 確保你之前已經承諾。


如果您正在進行初始提交並且無法使用git reset,只需聲明“Git破產”並刪除.git文件夾並重新開始


如果您輸入:

git status

git會告訴你什麼是上演的,包括如何取消演出的說明:

use "git reset HEAD <file>..." to unstage

我發現git在推動我在這樣的情況下做正確的事情方面做得非常好。

注意:最近的git版本(1.8.4.x)已更改此消息:

(use "git rm --cached <file>..." to unstage)

您可以在提交之前撤消git add

git reset <file>

這將從當前索引(“即將提交”列表)中刪除它而不更改任何其他內容。

您可以使用

git reset

沒有任何文件名來取消所有應有的更改。 當在合理的時間內逐個列出太多文件時,這可以派上用場。

在舊版本的Git中,上面的命令分別等同於git reset HEAD <file>git reset HEAD ,如果未定義HEAD (因為你還沒有在你的repo中進行任何提交)或者模糊(因為你),它將會失敗創建了一個名為HEAD的分支,這是一個你不應該做的愚蠢的事情。 但是在Git 1.8.2中已經改變了 ,所以在現代版本的Git中,你甚至可以在第一次提交之前使用上面的命令:

當您在歷史記錄中沒有任何提交時,“git reset”(沒有選項或參數)用於出錯,但它現在為您提供一個空索引(以匹配不存在的提交,您甚至沒有)。


我很驚訝沒有人提到交互模式:

git add -i

選擇選項3以取消添加文件。在我的情況下,我經常想要添加多個文件,使用交互模式,您可以使用這樣的數字來添加文件。這將採取除4:1,2,3,5之外的所有

要選擇一個序列,只需輸入1-5即可從1到5。

Git臨時文件


此命令將取消暫停您的更改:

git reset HEAD filename.txt

你也可以使用

git add -p 

添加部分文件。


為了澄清: git add將更改從當前工作目錄移動到暫存區域 (索引)。

此過程稱為分段 。 因此,最自然的命令來進行更改(更改文件)是顯而易見的:

git stage

git add更容易為git stage輸入別名

可惜沒有git unadd也沒有git unadd命令。 相關的一個更難猜測或記住,但很明顯:

git reset HEAD --

我們可以輕鬆地為此創建一個別名:

git config --global alias.unadd 'reset HEAD --'
git config --global alias.unstage 'reset HEAD --'

最後,我們有了新的命令:

git add file1
git stage file2
git unadd file2
git unstage file1

我個人使用更短的別名:

git a #for staging
git u #for unstaging

要撤消git add use

git reset filename


要重置特定文件夾(及其子文件夾)中的每個文件,可以使用以下命令:

git reset *

git gui

並手動刪除所有文件或選擇所有文件並單擊“ 提交”按鈕。


這是一種在開始新項目時避免這個棘手問題的方法:

  • 為新項目創建主目錄。
  • 運行git init
  • 現在創建一個.gitignore文件(即使它是空的)。
  • 提交你的.gitignore文件。

如果你沒有任何提交,Git會讓git reset變得非常困難。 如果你創建一個微小的初始提交只是為了有一個,之後你可以git add -Agit reset多次你想要的一切正確。

這種方法的另一個優點是,如果您以後遇到行結束問題並需要刷新所有文件,這很容易:

  • 查看初始提交。 這將刪除所有文件。
  • 然後再次檢查您最近的提交。 這將使用您當前的行結束設置檢索文件的新副本。

git reset filename.txt

將從當前索引“即將被提交”區域中刪除名為filename.txt的文件,而不更改任何其他內容。


git reset filename.txt  

將從當前索引“即將被提交”區域中刪除名為filename.txt的文件,而不更改任何其他內容。







git-stage