2010-08-25 100 views
36

我有一個git倉庫中已更改文件的列表。有一個文件我不想爲當前時刻做出承諾。我能做些什麼:從提交中刪除文件

git commit -a 

提交所有文件,然後以某種方式從當前提交中刪除該文件?在刪除之後,它仍然應該在未被取消的文件列表中。

+0

是否要刪除該文件的提交你正在或只是不承諾,你必須該文件還沒有改變? – 2010-08-25 10:01:12

+0

@ charles-bailey 我想將其添加到提交中,然後從中刪除。 – Ockonal 2010-08-25 10:20:43

+0

這並沒有回答我的問題,至少我不確定你的意思。你說你「不想爲當前時刻做出承諾」。這是否意味着你只是不想在下一次提交中對文件進行任何更改,或者你主動想要下一次提交來刪除這些文件,然後在隨後的提交中重新添加它? – 2010-08-25 11:23:40

回答

56

你想這樣做:

git add -u 
git reset HEAD path/to/file 
git commit 

務必從回購的頂層做到這一點; add -u在當前目錄中添加更改(遞歸)。

關鍵行告訴git將索引中給定路徑的版本(提交的登臺區域)重置爲HEAD(當前簽出的提交)的版本。

並提前警告他人閱讀此內容:add -u階段的所有修改,但不添加未跟蹤的文件。這與commit -a所做的一樣。如果您還想添加未跟蹤文件,請使用add .以遞歸方式添加所有內容

+6

要設置任何緊張的頭腦,這組命令將**不會**改變你的磁盤上的實際代碼文件,它只會從指定的文件中取出當前的文件提交(這是最初的要求)。大ups :) – 2013-03-11 21:14:01

+1

你應該也編輯.gitignore並且添加路徑/ to/file,如果你知道你不希望它添加到提交中 – Xarses 2013-03-29 20:22:10

1

也許您也可以使用存儲將您的修改臨時存儲在補丁文件中,然後重新應用它(結帳後返回到舊版本)。這可能與此其他主題有關:How would I extract a single file (or changes to a file) from a git stash?

+2

'git stash'確實很方便,但它比'重置HEAD '在這種情況下使用它(不完全是它的設計目的)。無需打擾它,或補丁。 – Cascabel 2010-08-25 13:29:31

+0

@Jefromi是的,你可能是對的,但瞭解替代方法總是有用的(並且鏈接的主題已經很好地回答了,所以......)。我應該也許已經給了評論中的鏈接... – ThR37 2010-08-25 14:37:49

30

git rm --cached將從提交集中刪除它(「un-adding」it);這聽起來像你想要的。

+1

工作就像一個魅力。 git rm --cached 2015-10-09 16:03:11

+0

如果文件存在於repo中,則執行此命令,然後執行將執行文件刪除。 – 2017-02-21 16:39:26

5

使用隱藏;像這樣:

git add . 
git reset Files/I/Want/To/Keep 
git stash --keep-index 
git commit -a -m "Done!" 
git stash pop 

如果意外提交文件,並希望重寫你的git的歷史,用途:

git reset HEAD~1 path/to/file 
git commit -a -m "rollback" 
git rebase -i HEAD~2 

,壁球兩個主要的提交。如果您有一組您不想自動提交的已知文件,您可以編寫一個幫助程序腳本來執行其中的任何一個。

11

如果你已經推送你的提交然後。做

git checkout origin/<remote-branch> <filename> 
git commit --amend 

,如果您還沒有擠到服務器上的變化可以用

git reset --soft HEAD~1 
0

答:

git reset HEAD path/to/file 
+1

基於對問題的評論,這看起來與OP實際想要做的不同。這個問題不是很清楚。 – 2018-02-07 15:35:10

0

你必須重置文件到原始狀態,並承諾它再次使用--amend。這是使用git checkout HEAD^最容易完成的。

準備演示:

$ git init 
$ date >file-a 
$ date >file-b 
$ git add . 
$ git commit -m "Initial commit" 
$ date >file-a 
$ date >file-b 
$ git commit -a -m "the change which should only be file-a" 

州前:

$ git show --stat 
commit 4aa38f84e04d40a1cb40a5207ccd1a3cb3a4a317 (HEAD -> master) 
Date: Wed Feb 7 17:24:45 2018 +0100 

    the change which should only be file-a 

file-a | 2 +- 
file-b | 2 +- 
2 files changed, 2 insertions(+), 2 deletions(-) 

就到這裏吧:恢復以前的版本

$ git checkout HEAD^ file-b 

提交它:

$ git commit --amend file-b 
[master 9ef8b8b] the change which should only be file-a 
Date: Wed Feb 7 17:24:45 2018 +0100 
1 file changed, 1 insertion(+), 1 deletion(-) 

後狀態:

$ git show --stat 
commit 9ef8b8bab224c4d117f515fc9537255941b75885 (HEAD -> master) 
Date: Wed Feb 7 17:24:45 2018 +0100 

    the change which should only be file-a 

file-a | 2 +- 
1 file changed, 1 insertion(+), 1 deletion(-)