Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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_Cherry Pick_Git Cherry Pick - Fatal编程技术网

Git 如何选择从一个文件到另一个文件的更改?

Git 如何选择从一个文件到另一个文件的更改?,git,cherry-pick,git-cherry-pick,Git,Cherry Pick,Git Cherry Pick,我有两个文件名为vvn.c和aq.c 我对vvn.c做了更改,我的git中有这个提交。 如何选择对aq.c 唯一的区别是API的 vvn.c包含API作为vvn\u函数名称() 而aq.c包含API作为unions\u function\u names() 我不知道怎么做。 我知道cherry也在同一个文件中。 有什么方法可以做到这一点吗?不完全是cherry pick,但您可能需要使用: git签出--filename 这将根据文件在另一个分支中的版本签出该文件;如果它满足您的需要(即,如果您

我有两个文件名为
vvn.c
aq.c
我对
vvn.c
做了更改,我的git中有这个提交。 如何选择对
aq.c
唯一的区别是API的

vvn.c
包含API作为
vvn\u函数名称()

aq.c
包含API作为
unions\u function\u names()

我不知道怎么做。 我知道cherry也在同一个文件中。
有什么方法可以做到这一点吗?

不完全是cherry pick,但您可能需要使用:

git签出--filename

这将根据文件在另一个分支中的版本签出该文件;如果它满足您的需要(即,如果您不需要实际合并来自两个单独分支的文件更改),那么它是最简单的解决方案


另一种可能是生成diff(您可以从一系列提交中生成diff,并将其限制为一个文件),然后应用diff。签出:

基本上,您需要对
vvvn.c
更改进行diff,并将其应用于
aq.c
。例如,参见此处:

然而,这是一件相当棘手的事情。为什么您有不同的文件名,但无论如何都是相似的,所以您应该进行相同的更改


也许最好能想出另一种方法。例如,对于C,您可以使用#包含公共部分并将其提取到单独的文件中。

另一个更容易保留原始提交的作者信息的选项:

  • git cherry pick
    正常
  • git mv
  • git提交--修改
    以修改提交
如果原始形式的提交将修改存储库中已经存在的文件,那么您可能需要几个额外的步骤(我没有测试这部分):

  • git签出--孤立临时工/樱桃拣选
    ()
  • git重置
  • 按照第一组步骤应用提交
  • 最后切换回原始分支并
    git cherry pick temp/cherry pick

我使用补丁文件。这样,我可以编辑修补程序文件中的路径以匹配新位置

您可以使用以下工具创建修补程序文件:

git格式修补程序{commit}~1…{commit}

这将在本地目录中生成带有更改的
.patch
文件

-或-

git show{commit}>{my changes.patch}

其中
{my changes.patch}
是您确定的文件名/路径

现在在编辑器中编辑
{my changes.patch}
文件,并用新路径替换旧路径。此时可以进行其他编辑或更改

现在,您可以通过以下方式应用修补程序:

git-am<{my-changes.patch}

如果您编辑了某些内容并破坏了修补程序,您将得到一个错误。请检查可能进行的步骤和编辑,然后重试。此方法的一个优点是,如果愿意,您可以在编辑中重置、撤消部分编辑或整个文件。但是,所应用的更改没有用户输入错误,因为git是根据原始更改进行合并的

重要的是,在提交更改之前,区分您所做的更改,并确保它们是您想要的然后阶段化并提交


注意:
gitam
有一系列的选项,比如
--忽略空白
--交互式
,它们可以帮助你。

你能举一个关于第一个的例子吗?在你的例子中,它可能是这样的:
git签出分支,其中aq发生了变化--aq.c
Hmm。我在同一个分支中有两个文件
vvn.c
aq.c
位于不同的目录中。那么现在如何签出呢?据我所知,您只想签出另一个分支的一个文件。。如果是这样的话,您就不必关心vvn.c了,您只需从提交中执行此操作,该文件位于正确的版本中。。?这真的是你想要的答案。如果还有其他人在这里,应该提到