应用补丁在Git中不会创建新建的文件

7
我在分支x中创建了一个名为ABC.txt的新文件,但我没有提交更改。然后我想将这些更改移动到一个名为y的新分支中。所以我按照以下步骤操作:
  1. $ git diff > mypatch.diff

  2. $ git clean -fd

  3. $ git checkout y

  4. $ git apply myPatch.diff error: ABC.txt: No such file or directory

为什么git不能在我当前所在的分支中简单地创建我的新ABC.txt文件呢?

为了以后的参考,你试图做的事情可以使用 git stash 来完成。或者,在大多数情况下,您可以在保留更改的工作树和/或索引的情况下进行检出(如果这将成为问题,git会警告您)。 - Mark Adelsberger
3个回答

7

这是因为git diff仅列出存储库中包含的文件的更改,而您新创建的文件不在其中。

最简单的解决方案是将该文件添加到索引中:

$ git add ABC.txt

在创建补丁时,请使用--cached选项:

$ git diff --cached > mypatch.diff

然而,如果在应用差异时出现错误,可能是由于目标分支中不存在该文件,因此git不知道在哪里应用这些更改。通过查看块头,您可以查看差异文件是否包含对曾经存在的文件或新创建的文件所做的更改。如果您看到:
--- a/ABC.txt
+++ b/ABC.txt

接下来会有对现有文件的更改。应用此补丁不会从空白创建新文件。

但如果你看到:

--- /dev/null
+++ b/ABC.txt

如果这是一个新创建的文件,应用此补丁将创建一个具有这些内容的新文件。


当我查看mypatch.diff文件时,我可以看到新创建的文件内容也在其中。 - Jude Niroshan
@JudeNiroshan:啊,那很可能不是一个新文件。我的意思是,差异只包括文件中的一些更改,因为该文件已经存在,但在分支 y 中不存在,因此没有地方应用这些更改。 - rodrigo
如果是这种情况,你需要执行 git diff <oldercommit> 命令,其中 <oldercommit> 是文件创建之前的一个提交,或者手动复制 ABC.txt 文件。 - rodrigo

2
当我按照以下步骤操作时:
git add ABC.txt
git diff --cached > mypatch.diff

mypatch.diff 包含了我的新文件,但是没有包含我编辑过的文件。

以下方法适用于我:

git add -N ABC.txt
git diff > mypatch.diff

0

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