从存储区中删除文件的git命令

61

我有一个存储库,里面有许多文件。

但由于一个冲突文件,我无法应用我的存储库。我已经确定了存储库中的问题文件,并想要将其删除。

如何从存储库中删除单个文件而不破坏整个存储库?


1
这可以帮助您:https://dev59.com/WXNA5IYBdhLWcg3wEZeT - Tim
1
从那个回答中可以得到,$ git checkout stash@{0} -- <filename> 就是我想要的命令了吧? - user773737
5个回答

41

“Stash”是一个提交(实际上,通常是两个或甚至三个提交),你无法更改提交。那么,对于你的问题,字面上的答案是“你不能”。幸运的是,你并不需要

你说由于存在冲突文件,你不能应用你的存储区。但是,你可以应用它,只是会出现合并冲突。你需要做的就是解决合并冲突。

假设冲突出现在文件README.txt中,这里有些东西需要写。

如果你想通过保留当前分支版本来解决冲突,那么应用存储区,然后检出当前分支版本以解决冲突:

git stash apply
git checkout --ours -- README.txt  # or git checkout HEAD -- README.txt

如果你想保留现有版本,请提取它:

git checkout --theirs -- README.txt # or git checkout stash -- README.txt

或者,使用任何旧的合并解决工具(我只是使用文本编辑器),然后 "git add" 结果。

一旦你完成了存储,git stash drop 将“忘记”组成存储的提交。(在确定完成后再执行此操作,否则很难恢复。)


我的错误是因为Sourcetree不让我应用暂存,因为涉及权限和锁定文件的Windows特定错误。但这回答了我的问题。 - user773737
2
尝试执行 git stash apply 时,由于冲突而出现错误:error: Your local changes to the following files would be overwritten by merge: - BergQuester
1
@BergQuester:在这种情况下,您正在尝试在工作树中已经存在某些更改时应用git stash apply。通常即使如此也没问题,所以我不完全确定发生了什么(我需要在apply之前看到git status输出以及您给git stash apply的标志)。总的来说,处理这种情况的方法是提交或隐藏当前更改,然后使用git stash branch将先前的隐藏转换为新分支,然后使用完整的Git工具,现在您已经将隐藏的内容安全地存储为一个分支。 - torek
说“你不能改变一个提交”是误导性的。你可以修订一个提交,这会创建一个副本,除了文件和哈希之外,其他所有内容都相同。那么“修订存储”有什么等效方法呢? - Mark Jeronimus
1
@MarkJeronimus:这并不是欺骗性的,欺骗性的是选项--amend本身。你根本没有修改提交。你正在创建一个新的、不同的提交,具有新的、不同的哈希值;旧的提交仍然存在,并且仍然被所有其他分支和标签名称所使用,这些名称找到了这个提交(理想情况下,这些名称为零,但当没有时,就会暴露出这种欺骗)。也没有“修改存储”,这次也没有--amend标志:你只需要在原来的位置应用(可能是--index)原始的存储,放弃它,并构建一个新的存储。 - torek
也就是说,由于相比所有常规的 Git 工具,git stash 是一组较差的工具(虽然已经改进了),所以没有像 git commit--amend 那样具有欺骗性选项的花哨前端。最接近的一个是 git stash branch,它会检出存储的提交群集的父节点,创建一个新的分支名称,然后应用(带有 --index)存储并丢弃它。 - torek

32

对于这种情况,有一个解决方法:

  1. 将您的贮藏保存为补丁文件:

    $ git stash show -p > stash.patch
    
  2. 应用此补丁,跳过冲突(你将被要求解决冲突,只需跳过缺失的文件):

  3. $ patch -p1 < stash.patch
    

别忘了之后清除stash.patch文件!


1
直接的解决方案。 - bytefire
谢谢你! - xxstevenxo
1
不要忘记在Git仓库的根目录下运行补丁命令,否则Git会抱怨找不到文件! - nzn
非常干净的方法。 - Codename_DJ
1
对于 Windows 用户来说,在 Cmd/Powershell 中使用 patch 命令会失败。请使用 Git Bash。 - RamaKrishna Chunduri
我需要为patch命令添加_Reverse_选项(-R)_->_ patch -R -p1 < stash.patch - yunzen

4
  1. 储存你未提交的更改。
  2. 应用你最初的储存。
  3. 丢弃这个文件。
  4. 应用包含你未提交更改的储存。

1
今天我遇到了同样的问题。我正在一个分支上工作,存储了我的修改,并想在另一个分支上应用它们。但是我注意到我还存储了一个不需要的文件,导致了冲突。以下是我解决这个问题的方法:
  • git restore --staged path/to/file
  • git reset HEAD -- path/to/file 从暂存区中删除该文件
然后,我只添加了我想要的文件,并成功提交了我的更改。

-1

从您的本地代码库中删除所需的文件,然后将其推送到存储区。更改将得到反映,并且您的文件将从存储区中删除。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接