将本地分支提取到另一个分支而不合并



我计划有两个分支。

dev - contains code with addional logging output
production - contains only code, without logging output

我刚刚在dev:中创建了一个新的提交

$x = getFoo();
$this->logger->info("Value of x: '$x'");
...

现在,我切换到生产分支,并尝试获取本地分支dev,而不合并它,这样我就可以删除日志调试输出,并使用与dev分支中相同的提交消息创建一个提交。

尝试:

所以我尝试获取本地dev分支,但我得到了:

$ git fetch dev
fatal: 'dev' does not appear to be a git repository
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.

我该如何解决?

git fetch是错误的命令:

  • 您在本地对一个分支名称进行了提交
  • 然后您切换到其他分支名称。这个其他名称选择了一个不同的提交:而不是您刚刚进行的提交,您在其中添加了一些代码,包括一些调试代码。您现在选择的提交既不包括新代码也不包括新调试代码
  • 现在,您需要获取您已经提交的内容,即您已经拥有的内容,并使用这些内容对您从该其他分支及其不同提交中提取的文件执行一些额外的工作,而无需进行新的提交

git fetch命令是关于从其他存储库中获取提交的。你不需要那样做!您现在已经在自己的存储库中拥有您想要的提交

最接近右侧的命令是git cherry-pick。不过,这个命令并不是一个真正的解决方案:它只是一个工具,就像git diffgit apply一样。它的默认设置是进行一种diff、应用和提交,所有这些都是一体的。你想要一种diff,并在没有提交的情况下应用。幸运的是,这很容易得到:只需将-n添加到cherry-pick命令:

git checkout production
git cherry-pick -n dev

不幸的是,这有做类似于的副作用

git add <files>

其中文件是由diff和apply修改的文件。这其实不是什么大问题,但这意味着您需要清理调试打印并重新运行git adds。

如果dev分支提前一次提交

如果分支只有一个提交,那么我更喜欢@torek的cherry-pick解决方案。这样做的优点是,它只包括自上次提交以来的更改,而不包括所有日志代码。

如果dev分支是多个提前提交:

git diff production dev > patch
git checkout production
git apply patch

最新更新