如何将某些文件中未提交的更改挑选到新分支中?

How to cherry pick uncommited changes in some files into a new branch?

假设我有 branch 和 branch 。我一直在对 file1、file2 进行几处更改。但是,同时,我最终对明显固定的东西进行了重构,比如在文件 A、文件 B 中。

现在我想创建一个不同的分支来隔离 <my_feature> 中的这些更改,以便说 <my_updates> 只提交文件 A、文件 B。

目前,我在 file1、file2、fileA 和 fileB 中有未提交的更改。

我一直在阅读有关 git cherry-pick and git apply 的内容,但它涉及已经提交的内容。

现在 none 这些更改已经提交,我不知道我是否应该提交这个和樱桃采摘,或者是否有更好的方法来处理。

为了确保图片清晰,让我们对其进行一些可视化处理:

我想做的:

master ------------------
    \--- my_feature ----/
          file1
          file2

但现在我有

master ------------------
         my_feature ----/
          file1
          file2
          fileA
          fileB

我想在继续 <my_feature>:

之前合并这个(文件 A、文件 B 中的更改)
master ------------------
    \--- my_updates ----/
          fileA
          fileB

这样 <my_feature> 将只包含文件 1、文件 2 中的更改。

您可以 git stash,移动到一个新的分支然后 git stash pop。然后你可以做进一步的工作或提交结果。

您还可以通过将 git diff 的输出定向到文件 (git diff > changes.patch) 或剪贴板(git diff | pbcopy for OS X 或 git diff | xclip -selection clipboard 在 Ubuntu 中)。然后,您可以将该补丁与 git apply 应用到任何其他分支。

作为记录,这是我用来让它工作的完整命令集:

在分支 <my_feature> 中,将差异存储在补丁中:

git diff fileA fileB > /tmp/changes.patch

保存更改以便稍后重用它们:

git stash -u

使用该补丁从 master 创建一个新分支:

git checkout master
git checkout -b my_updates
git patch /tmp/changes.patch
git add fileA fileB
git commit -m "Updated fileA, fileB because blabla"
git push

返回分支 <my_feature> 并恢复隐藏的更改:

git checkout my_feature
git stash pop

删除 fileA 和 fileB 中的更改,因为它们已经存在:

git checkout fileA fileB