Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git 如何仅为一个文件选择更改,而不是整个提交_Git - Fatal编程技术网

Git 如何仅为一个文件选择更改,而不是整个提交

Git 如何仅为一个文件选择更改,而不是整个提交,git,Git,我需要将一个分支中引入的更改应用到另一个分支。 我可以用cherry pick来做。然而,在我的例子中,我只想应用与一个文件相关的更改,我不需要选择整个提交。 如何做到这一点?另一个方便的方法是在本地获取补丁,然后使用: git checkout {<name_of_branch>, commit's SHA} <path to the file> git签出{,提交的SHA} 这不是一个樱桃采摘。这就是你想要的: git checkout target-branc

我需要将一个分支中引入的更改应用到另一个分支。 我可以用cherry pick来做。然而,在我的例子中,我只想应用与一个文件相关的更改,我不需要选择整个提交。
如何做到这一点?

另一个方便的方法是在本地获取补丁,然后使用:

git checkout {<name_of_branch>, commit's SHA} <path to the file> 
git签出{,提交的SHA}

这不是一个樱桃采摘。这就是你想要的:

git checkout target-branch sha1 path/to/file

sha1是可选的

创建一个补丁文件并应用它

git diff branchname -- filename > patchfile
git apply patchfile
编辑:

由于您需要从提交中获取更改,请按如下方式创建修补程序:

git show sha1 -- filename > patchfile

根据您想要实现的目标,您有不同的选择:

如果希望文件内容与目标分支上的内容相同,可以使用
git checkout--
。然而,这不会“挑选”在一次提交中发生的更改,而只是获取所述文件的结果状态。因此,如果您在提交中添加了一行,但以前的提交更改更多,并且您只想添加该行而不进行其他更改,那么签出就不是您想要的

否则,如果要将提交中引入的修补程序仅应用于单个文件,则有多个选项。您可以运行
git cherry pick-n
,也就是说,在不提交的情况下,编辑提交(例如,使用
git reset--.
重置所有文件,并且只使用
git add
添加您实际想要更改的文件)。或者,您可以为文件创建差异,然后应用差异:

git diff <branch>^..<branch> -- <filename> | git apply
git diff^git应用程序
Git已经准备好了一切:)

只用
git签出

将文件移动到预提交阶段

从内存中删除


现在,您的分支非常干净(恢复到以前的提交)

我倾向于使用
git-ls-tree

只要做:

git ls-tree -r <commit-id> |grep 'your filename'
# there will be output that shows a SHA1 of your file
git show ${SHA1 of your file} > 'your filename'
git ls tree-r | grep'your filename'
#将有输出显示文件的SHA1
git show${SHA1 of your file}>“your filename”
这将打印与您的grep匹配的所有文件名,并为提交中的文件提供SHA1密钥

Git show也可以用于分支以外的文件。 使用shell中的
将输出通过管道传输到文件中,可以得到所需的结果

git checkout the_branch_with_the_change the/path/to/the/file/you/want.extension

如果希望将另一个分支中的单个文件复制到当前工作分支,则此操作有效。您可以尝试执行以下操作:

git show COMMIT_ID -- path/to/specific-file | git apply
例如:

git show 3feaf20 -- app/views/home/index.html | git apply

git-diff-sha1
(或
git-diff-branch
-如果分支指向同一个散列,则相同)将只生成与该散列相关的当前工作目录的diff,而不会生成提交本身所引入的更改。正确。编辑了答案。谢谢。-1
git checkout
带文件名的钉子就是这个钉子的合适锤子。这两种选择都是不必要的复杂。对于这种特殊情况,是的。但一般来说,如果您想从提交到特定文件的更改中选取更改,则签出将不起作用,因为它可能涉及其他不需要的先前更改,并且可能不包含在当前分支中所做的更改。可能与否重复,“在提交中选取更改”不是“选取整个文件”警告:正如@poke在回答中所说,这不会复制更改;它复制文件的整个状态。因此,如果要将提交的更改添加到文件中,那么通过这样签出,最终会覆盖任何不好的更新更改。请小心,在文件中所做的、不在其他分支版本中的更改将丢失。同意。如果您只需要文件的副本,并且希望在当前branchOne上对其进行更改,则此选项非常有用。您可以使用globs(path/*)并指定多个路径/文件,这些路径/文件不是完全签出文件的路径/文件。目标是对提交进行特定更改。这些通常是同一件事,但有时不是。
git show COMMIT_ID -- path/to/specific-file | git apply
git show 3feaf20 -- app/views/home/index.html | git apply