我想从功能分支中提取一些文件,然后将更改移至另一个分支

时间:2018-07-12 14:36:51

标签: git

我一直在研究功能分支,对UI文件和逻辑/数据文件进行了更改,并将它们添加到各种提交中-通常在每次提交中对许多文件进行了更改。

我已经决定要创建一个仅包含逻辑更改的分支,因此我可以将该分支合并到母版中,以便其他团队成员可以使用它,而我自己也可以处理UI。

我基本上想从master创建一个新分支,然后在我的功能分支中添加来自选择文件的更改(不是选择提交,而是选择文件)。这可以做吗?

为了更加清晰:

我的功能分支看起来像这样-

提交1:

  • fileA.js
  • fileB.js

提交2:

  • fileA.js
  • fileC.js

提交3

  • fileC.js
  • fileD.js

最后我要创建一个具有-

的新功能分支

提交1:

  • fileB.js
  • fileD.js

3 个答案:

答案 0 :(得分:2)

我会这样:

  1. 从当前功能分支位于git checkout -b feature_logic feature
  2. 处开始逻辑分支
  3. 倒回历史记录,保留文件的当前状态。我假设master分支在您开发功能git reset --soft origin/master时没有移动。或者,如果真的只是三个提交:git reset --soft HEAD^^^
  4. 取消登台并还原您不需要作为feature_logic分支的一部分的文件:git reset HEAD -- <files>git checkout -- <files>
  5. 运行git status以确保已暂存正确的文件。
  6. 提交逻辑分支:git commit -m"Logic branch"

对gui分支重复上述步骤。
创建两个新分支后,您应该能够将它们合并,并运行git diff HEAD..feature以使自己感觉很好,因为历史记录重写没有丢失任何内容。

答案 1 :(得分:1)

简单,您可以执行git reset HEAD~3,这将重置所有提交。

现在,您可以隔离与逻辑和UI相关的所有文件。

在不同的分支中分别对两者进行提交。

答案 2 :(得分:1)

准确给出您想要的内容(创建一个单个提交,其中包含对 some 个文件的所有更改)

  1. mastergit branch <feature/new> master
  2. 创建新分支
  3. 检出分支:git checkout <feature/new>
  4. 从旧功能分支中将所需文件检出到新功能分支: git checkout <feature/old> -- <files to checkout>

我觉得这是git checkout鲜为人知的用途之一。它仅将需要的文件拉到当前分支,而无需更改分支。
Git documentation on this usage of checkout

奖励要点::如果由于某种原因文件具有您既需要又不需要的更改,则可以使用更加晦涩的--patch选项({{1} }。此选项调用交互式选择器,该选择器允许您选择要包含的特定块。交互式模式可以使您有所使用,但是在需要分开时很有用。它也存在于添加和重置命令中。
Git's documentation on Interactive mode