update 如何丟棄Git中的未分級更改?




git是什麼 (24)

如何放棄工作副本中不在索引中的更改?


由於沒有答案表明我使用的確切選項組合,這裡是:

git clean -dfx
git checkout .

這是用過的git clean選項的在線幫助文本:

-d

除了未跟踪的文件之外,刪除未跟踪的目錄。 如果未跟踪的目錄由不同的Git存儲庫管理,則默認情況下不會刪除它。 如果您確實要刪除此類目錄,請使用-f選項兩次。

-f

如果Git配置變量clean.requireForce未設置為false ,則除非給定-f-n-i ,否則Git clean將拒絕刪除文件或目錄。 除非給出第二個-f ,否則Git將拒絕刪除.git子目錄或文件中的.git

-x

不要使用.gitignore (每個目錄)和$GIT_DIR/info/exclude的ignore規則,但仍然使用-e選項給出的ignore規則。 這允許刪除所有未跟踪的文件,包括構建產品。 這可以使用(可能與git reset一起使用)來創建一個pristine工作目錄來測試一個乾淨的構建。

另外, git checkout . 需要在回購的根目錄中完成。


這甚至可以在以下目錄中工作; 在正常的git權限之外。

sudo chmod -R 664 ./* && git checkout -- . && git clean -dfx

最近發生在我身上


我有一個奇怪的情況,一個文件總是未分階段,這有助於我解決。

git rm .gitattributes
git add -A
git reset --hard


當您想將存儲轉移給其他人時:

# add files
git add .  
# diff all the changes to a file
git diff --staged > ~/mijn-fix.diff
# remove local changes 
git reset && git checkout .
# (later you can re-apply the diff:)
git apply ~/mijn-fix.diff

[編輯]評論說,它可以命名為stashes。 好吧,如果你想分享你的藏品,請使用它;)


如果你是在子模塊的情況下,沒有其他解決方案的工作嘗試:

  • 要檢查問題是什麼(可能是“臟”的情況),請使用:

    git diff

  • 要刪除藏匿處

    git submodule update


我沒有丟棄更改,而是將遙控器重置為原點。 注意 - 此方法是將文件夾完全還原到repo的文件夾。

所以我這樣做是為了確保當我git重置時它們不會坐在那裡(稍後 - 在Origin / branchname上排除gitignores)

注意:如果您想保留尚未跟踪的文件,但不希望保留在GITIGNORE中,您可能希望跳過此步驟,因為它將擦除遠程存儲庫中找不到的未跟踪文件(感謝@XtrmJosh)。

git add --all

然後我

git fetch --all

然後我重置為原點

git reset --hard origin/branchname

這將使它回到原點。 就像重新克隆分支一樣,WHILE將所有gitignored文件保存在本地並就位。

下面的每個用戶評論更新:更改以重置用戶所在的當前分支。

git reset --hard @{u}

只需使用:

git stash -u

完成。 簡單。

如果你真的關心你的藏匿堆棧,那麼你可以使用git stash drop 。 但在那時你最好使用(來自Mariusz Nowak):

git checkout -- .
git clean -df

儘管如此,我喜歡git stash -u最好,因為它“丟棄”了一個命令中所有跟踪和未跟踪的更改。 然後git checkout -- . 只丟棄跟踪的更改,並且git clean -df只丟棄未跟踪的更改...並且輸入兩個命令太多了:)


嘗試了上面的所有解決方案,但仍然無法擺脫新的,未停止的文件。

使用git clean -f刪除這些新文件 - 但要小心! 注意強制選項。


這將檢出當前目錄的當前索引,從當前目錄向下丟棄文件中的所有更改。

git checkout .

或者這會從索引中檢出所有文件,覆蓋工作樹文件。

git checkout-index -a -f

如果您只想刪除對現有文件的更改 ,請使用checkouthttps://git-scm.com/docs/git-checkout )。

git checkout -- .
  • 沒有指定分支,因此它檢出當前分支。
  • 雙連字符( -- )告訴Git後面的內容應該作為它的第二個參數(路徑),你跳過了分支的規範。
  • 句點( . )表示所有路徑。

如果要刪除自上次提交後添加的文件 ,請使用cleangit-scm.com/docs/git-clean ):

git clean -i 
  • -i選項啟動交互式clean ,以防止錯誤刪除。
  • 還有一些其他選項可以更快地執行; 看文檔。

如果您希望將更改移動到保留空間以供以後訪問 ,請使用stash此處記錄 ):

git stash
  • 所有更改都將移至Git的Stash,以便以後訪問。
  • 有一些選項可用於更細微的存儲; 看文檔。

簡單地說

git stash

它將刪除所有本地更改。 你也可以稍後說

git stash apply 

或者git stash pop


我最喜歡的是

git checkout -p

這使您可以選擇性地還原塊。

也可以看看:

git add -p

如果您剛剛更改了文件的權限 (這是在DOS / Windoze上),這些解決方案都不起作用

Mon 23/11/2015-15:16:34.80 C:\...\work\checkout\slf4j+> git status
On branch SLF4J_1.5.3
Changes not staged for commit:
  (use "git add ..." to update what will be committed)
  (use "git checkout -- ..." to discard changes in working directory)

        modified:   .gitignore
        modified:   LICENSE.txt
        modified:   TODO.txt
        modified:   codeStyle.xml
        modified:   pom.xml
        modified:   version.pl

no changes added to commit (use "git add" and/or "git commit -a")

Mon 23/11/2015-15:16:37.87 C:\...\work\checkout\slf4j+> git diff
diff --git a/.gitignore b/.gitignore
old mode 100644
new mode 100755
diff --git a/LICENSE.txt b/LICENSE.txt
old mode 100644
new mode 100755
diff --git a/TODO.txt b/TODO.txt
old mode 100644
new mode 100755
diff --git a/codeStyle.xml b/codeStyle.xml
old mode 100644
new mode 100755
diff --git a/pom.xml b/pom.xml
old mode 100644
new mode 100755
diff --git a/version.pl b/version.pl
old mode 100644
new mode 100755

Mon 23/11/2015-15:16:45.22 C:\...\work\checkout\slf4j+> git reset --hard HEAD
HEAD is now at 8fa8488 12133-CHIXMISSINGMESSAGES MALCOLMBOEKHOFF 20141223124940 Added .gitignore

Mon 23/11/2015-15:16:47.42 C:\...\work\checkout\slf4j+> git clean -f

Mon 23/11/2015-15:16:53.49 C:\...\work\checkout\slf4j+> git stash save -u
Saved working directory and index state WIP on SLF4J_1.5.3: 8fa8488 12133-CHIXMISSINGMESSAGES MALCOLMBOEKHOFF 20141223124940 Added .gitignore
HEAD is now at 8fa8488 12133-CHIXMISSINGMESSAGES MALCOLMBOEKHOFF 20141223124940 Added .gitignore

Mon 23/11/2015-15:17:00.40 C:\...\work\checkout\slf4j+> git stash drop
Dropped refs/[email protected]{0} (cb4966e9b1e9c9d8daa79ab94edc0c1442a294dd)

Mon 23/11/2015-15:17:06.75 C:\...\work\checkout\slf4j+> git stash drop
Dropped refs/[email protected]{0} (e6c49c470f433ce344e305c5b778e810625d0529)

Mon 23/11/2015-15:17:08.90 C:\...\work\checkout\slf4j+> git stash drop
No stash found.

Mon 23/11/2015-15:17:15.21 C:\...\work\checkout\slf4j+> git checkout -- .

Mon 23/11/2015-15:22:00.68 C:\...\work\checkout\slf4j+> git checkout -f -- .

Mon 23/11/2015-15:22:04.53 C:\...\work\checkout\slf4j+> git status
On branch SLF4J_1.5.3
Changes not staged for commit:
  (use "git add ..." to update what will be committed)
  (use "git checkout -- ..." to discard changes in working directory)

        modified:   .gitignore
        modified:   LICENSE.txt
        modified:   TODO.txt
        modified:   codeStyle.xml
        modified:   pom.xml
        modified:   version.pl

no changes added to commit (use "git add" and/or "git commit -a")

Mon 23/11/2015-15:22:13.06 C:\...\work\checkout\slf4j+> git diff
diff --git a/.gitignore b/.gitignore
old mode 100644
new mode 100755
diff --git a/LICENSE.txt b/LICENSE.txt
old mode 100644
new mode 100755
diff --git a/TODO.txt b/TODO.txt
old mode 100644
new mode 100755
diff --git a/codeStyle.xml b/codeStyle.xml
old mode 100644
new mode 100755
diff --git a/pom.xml b/pom.xml
old mode 100644
new mode 100755
diff --git a/version.pl b/version.pl
old mode 100644
new mode 100755

解決此問題的唯一方法是手動重置已更改文件的權限:

Mon 23/11/2015-15:25:43.79 C:\...\work\checkout\slf4j+> git status -s | egrep "^ M" | cut -c4- | for /f "usebackq tokens=* delims=" %A in (`more`) do chmod 644 %~A

Mon 23/11/2015-15:25:55.37 C:\...\work\checkout\slf4j+> git status
On branch SLF4J_1.5.3
nothing to commit, working directory clean

Mon 23/11/2015-15:25:59.28 C:\...\work\checkout\slf4j+>

Mon 23/11/2015-15:26:31.12 C:\...\work\checkout\slf4j+> git diff


cd path_to_project_folder  # take you to your project folder/working directory 
git checkout .             # removes all unstaged changes in working directory

以下內容實際上只是一個解決方案,如果您正在使用存儲庫的分支,您可以定期與另一個存儲庫同步(例如,拉取請求)。 簡短回答:刪除fork和refork,但是讀取github上的警告

我有一個類似的問題,也許不一樣,我很遺憾地說我的解決方案並不理想,但它最終是有效的。

我經常會有這樣的git狀態消息(涉及至少2/4個文件):

$ git status
# Not currently on any branch.
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   doc/PROJECT/MEDIUM/ATS-constraint/constraint_s2var.dats
#       modified:   doc/PROJECT/MEDIUM/ATS-constraint/parsing/parsing_s2var.dats
#
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   doc/PROJECT/MEDIUM/ATS-constraint/constraint_s2Var.dats
#       modified:   doc/PROJECT/MEDIUM/ATS-constraint/parsing/parsing_s2Var.dats

敏銳的眼睛會注意到這些文件中的doppleganger是單個字母,以防萬一。 不知何故,我不知道是什麼導致我開始這條路(因為我自己從上游回購中沒有使用這些文件),我已經切換了這些文件。 嘗試此頁面上列出的許多解決方案(和其他頁面)似乎沒有幫助。

我能夠通過刪除我的分叉存儲庫和所有本地存儲庫來重新解決問題。 僅這一點還不夠; 上游必須將有問題的文件重命名為新文件名。 只要您沒有任何未完成的工作,沒有wiki,並且沒有與上游存儲庫不同的問題,您應該沒問題。 至少可以說,上游可能對您不滿意。 至於我的問題,它無疑是一個用戶錯誤,因為我不是那麼精通git,但事實上它很容易修復指向git的問題。


git checkout -f

man git-checkout

-f, --force

切換分支時,即使索引或工作樹與HEAD不同,也要繼續。 這用於丟棄本地更改。

檢查索引中的路徑時,不要在未合併的條目上失敗; 相反,未合併的條目將被忽略。


另一種更快捷的方法是:

git stash save --keep-index --include-untracked

如果你不想徹底了解它,你不需要包含--include-untracked

之後,如果您願意,可以使用git stash drop命令刪除該存儲。


無論您的倉庫處於什麼狀態,您都可以隨時重置為之前的任何提交:

git reset --hard <commit hash>

這將丟棄在提交後進行的所有更改。


你可以使用git stash - 如果出現問題,你仍然可以從藏匿處恢復。 與此處的其他答案類似,但此處還會刪除所有未暫存的文件以及所有未暫存的刪除:

git add .
git stash

如果你檢查一切正常,扔掉藏匿處:

git stash drop

Bilal Maqsood使用git clean的答案對我來說也很有用,但是我有更多的控制權 - 如果我不小心做了,我仍然可以得到我的更改

UPDATE

我認為還有一個更改(不知道為什麼這對我有用):

git add . -A git add . -A而不是git add .

如果沒有-A ,刪除的文件將不會被暫存


您可以創建自己的別名,描述如何以描述性方式執行此操作。

我使用下一個別名來放棄更改。

放棄工作樹中(文件列表)中的更改

discard = checkout --

然後您可以將其用作下一個以丟棄所有更改:

discard .

或者只是一個文件:

discard filename

否則,如果您要丟棄所有更改以及未跟踪的文件,我會使用checkout和clean的混合:

在工作樹中清理並放棄更改和未跟踪的文件

cleanout = !git clean -df && git checkout -- .

所以下次使用很簡單:

cleanout

現在可以在下一個包含大量別名的Github倉庫中使用:


如果您不想保留未分級的更改(特別是如果暫存的更改是新文件),我發現這很方便:

git diff | git apply --reverse


似乎完整的解決方案是:

git clean -df
git checkout -- .

git-scm.com/docs/git-clean刪除所有未跟踪的文件( 警告 :雖然它不會刪除.gitignore中直接提到的忽略文件, 但它可能會刪除駐留在文件夾中的忽略文件 ), git checkout清除所有未分級的更改。


如果所有暫存的文件都已實際提交,那麼可以通過大約三次鼠標點擊從GUI重置分支: 分支重置

因此,我在實踐中經常做的是還原不需要的本地更改是提交所有好東西,然後重置分支。

如果好的東西是在一次提交中提交的,那麼你可以使用“修改最後一次提交”將它恢復為暫存或未分階段,如果你最終想要以不同的方式提交它。

這可能不是您正在尋找的問題的技術解決方案,但我發現它是一個非常實用的解決方案。 它允許您有選擇地丟棄未分級的更改,重置您不喜歡的更改並保留您所做的更改。

總而言之,我只是提交分支重置 ,並修改最後一次提交





git