Git 无法提交更改不存在的文件

Git 无法提交更改不存在的文件,git,cherry-pick,git-merge-conflict,Git,Cherry Pick,Git Merge Conflict,我想知道为什么git不允许cherry选择对不存在的文件进行更改的提交。 我的理解是,提交表示工作目录的完整快照。因此,选择一个包含当前不存在的文件的提交应该只是创建该文件——但我可以看到事实并非如此 下面是几个命令来重现我所说的情况 $ git init Initialized empty Git repository in /home/mzakrze/workspace/tmp/.git/ $ echo "Hello world!" > first_file; gi

我想知道为什么git不允许cherry选择对不存在的文件进行更改的提交。 我的理解是,提交表示工作目录的完整快照。因此,选择一个包含当前不存在的文件的提交应该只是创建该文件——但我可以看到事实并非如此

下面是几个命令来重现我所说的情况

$ git init
Initialized empty Git repository in /home/mzakrze/workspace/tmp/.git/
$ echo "Hello world!" > first_file; git add first_file; git commit -m "Init commit"
[master (root-commit) 7f9478a] Init commit
 1 file changed, 1 insertion(+)
 create mode 100644 first_file
$ echo "Fox jumps over the layz dog" > test; git add test; git commit -m "Commit with a typo"
[master 776387b] Commit with a typo
 1 file changed, 1 insertion(+)
 create mode 100644 test
$ echo "Fox jumps over the lazy dog" > test; git add test; git commit -m "Fix typo"
[master 9ea19df] Fix typo
 1 file changed, 1 insertion(+), 1 deletion(-)
$ git log 
commit 9ea19dfe2597b28eb576e2682e745de3da74733f
Author: mzakrze <xxxxxx@gmail.com>
Date:   Sun Apr 11 17:01:13 2021 +0200

    Fix typo

commit 776387b563edba9df2a12c5d1a2fd5bffb10c643
Author: mzakrze <xxxxxx@gmail.com>
Date:   Sun Apr 11 17:00:53 2021 +0200

    Commit with a typo

commit 7f9478a83e3938bf57552c1b90ddc7322b1bf315
Author: mzakrze <xxxxxx@gmail.com>
Date:   Sun Apr 11 16:59:04 2021 +0200

    Init commit
$ git reset --hard 7f9478a83e3938bf57552c1b90ddc7322b1bf315
HEAD is now at 7f9478a Init commit
$ git cherry-pick 9ea19 # cherry-pick "Fix typo"
error: could not apply 9ea19df... Fix typo
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'
$git init
已在/home/mzakrze/workspace/tmp/.Git中初始化空Git存储库/
$echo“Hello world!”>第一个文件;git添加第一个文件;git commit-m“Init commit”
[master(root提交)7f9478a]初始化提交
1个文件已更改,1个插入(+)
创建模式100644第一个\u文件
$echo“狐狸跳过layz狗”>测试;git-add测试;git commit-m“用输入错误提交”
[master 776387b]输入错误后提交
1个文件已更改,1个插入(+)
创建模式100644测试
$echo“狐狸跳过懒狗”>测试;git-add测试;git提交-m“修复打字错误”
[master 9ea19df]修复打字错误
1个文件已更改,1个插入(+),1个删除(-)
$git日志
提交9ea19dfe2597b28eb576e2682e745de3da74733f
作者:mzakrze
日期:2021年4月11日星期日17:01:13+0200
排版
提交776387B563EDBA9DF2A12C5D1A2FD5BFB10C643
作者:mzakrze
日期:2021年4月11日星期日17:00:53+0200
打字错误
提交7f9478a83e3938bf57552c1b90ddc7322b1bf315
作者:mzakrze
日期:2014年4月11日星期日16:59:04 2021+0200
初始化提交
$git重置—硬7f9478a83e3938bf57552c1b90ddc7322b1bf315
HEAD现在位于7f9478a初始提交
$git cherry pick 9ea19#cherry pick“修复打字错误”
错误:无法应用9ea19df。。。排版
提示:解决冲突后,标记更正的路径
提示:使用“git add”或“git rm”
提示:并使用“git commit”提交结果

INB4:我不是在寻找“解决方案”,我只是想了解为什么git认为这是一个冲突。

如果您查看
cherry-pick
命令的文档(参见例如
git-cherry-pick--help
),说明是“应用一些现有提交引入的更改”。换句话说,这将查看选定的提交及其父级,计算两者之间的差异,并尝试将该更改应用于当前分支

您正在尝试的提交所引入的更改会影响不存在的文件,因此无法应用该文件

如果您只是希望文件保持在源提交中的状态,则可以:

git checkout 9ea19 test

如果您查看
cherry-pick
命令的文档(参见例如
git-cherry-pick--help
),说明是“应用一些现有提交引入的更改”。换句话说,这将查看选定的提交及其父级,计算两者之间的差异,并尝试将该更改应用于当前分支

您正在尝试的提交所引入的更改会影响不存在的文件,因此无法应用该文件

如果您只是希望文件保持在源提交中的状态,则可以:

git checkout 9ea19 test

切记cherry pick从技术上讲是一个三方合并。对于某些提交
C
,您可以运行
git cherry pick C
——通常由散列ID指定,git会找到提交
C
的父级
P

  • 提交
    P
    现在是合并基础
  • ours
    提交是当前(
    HEAD
    )提交;及
  • 他们的提交是提交
    C
p
HEAD
之间的区别在于所讨论的文件已被完全删除。
P
C
之间的区别在于文件内容已被修改

对于标准合并算法(
git merge recursive
),这是一个高级或树级冲突:修改/删除冲突。这是一个无法用
-X我们的
-X他们的
解决的合并冲突。因此,合并会在中间停止,从而导致必须解决的合并冲突。


解决合并冲突并运行
git cherry pick--continue
完成cherry pick。解决此合并冲突的方式取决于您;中的
git checkout
命令很好,或者您可以使用
git checkout--theres test
git add test
。请注意,当使用
git checkout--ours
(在本例中不适用)和
git checkout--theres
时,git不会标记冲突已解决,但当使用
git checkout CHERRY\u PICK\u HEAD
(或原始哈希ID)时,git会标记冲突已解决。这是由于git checkout实现中的一个怪癖造成的,切记cherry pick在技术上是一个三方合并。对于某些提交
C
,您可以运行
git cherry pick C
——通常由散列ID指定,git会找到提交
C
的父级
P

  • 提交
    P
    现在是合并基础
  • ours
    提交是当前(
    HEAD
    )提交;及
  • 他们的提交是提交
    C
p
HEAD
之间的区别在于所讨论的文件已被完全删除。
P
C
之间的区别在于文件内容已被修改

对于标准合并算法(
git merge recursive
),这是一个高级或树级冲突:修改/删除冲突。这是一个无法用
-X我们的
-X他们的
解决的合并冲突。因此,合并会在中间停止,从而导致必须解决的合并冲突。

解决合并冲突并运行
git cherry pick--continue
完成cherry pick。解决此合并冲突的方式取决于您;
git-checko