如何将分支上的某些文件和其他文件提交到另一个分支?

时间:2018-02-21 13:08:50

标签: git git-branch git-flow

情境: 我有2个现有的分支机构:

  • 特征/ A
  • 特征/ B

我在feature/A分支上,对5个不同的文件进行了一些更改。 并非所有这5个文件都与功能A相关,但通常在更改/开发/修复某些内容时,您会发现其他错误或需要更改文件中的内容,这与您在该时刻编码的功能并不严格相关。 / p>

所以,假设:

  • 3个文件与功能A
  • 相关
  • 2个文件是额外更改并与B
  • 相关

当我执行本地提交时(我使用Tortoise但我认为它与其他软件类似)我可以选择提交哪个文件,所以假设我在当前分支上提交了与A相关的3个文件feature/A,其余2个文件已被更改但未提交。

现在,另外两个文件应该在feature/B分支上提交,但显然我不能在没有提交某些更改的情况下切换分支。

简单的解决方案可能是将文件复制为备份,还原它们,切换到feature/B然后复制备份文件并提交。

对于像这样的问题,是否有更优雅的解决方案? 我知道这是非常糟糕的做法,但有时可能会发生。

3 个答案:

答案 0 :(得分:2)

 git add file1A file2A file3A # add the changes for feature A
 git commit -m "feature A" # on branch A
 git stash # temporarily put your changes aside
 git checkout feature/B
 git stash pop # apply the changes that you put aside again.
 git commit -am "feature B"

更高级的分割为多次提交,我建议你看看git add -p,它允许你拆分每个补丁的提交而不是每个文件

答案 1 :(得分:0)

  

现在,应该在feature / B分支上提交另外两个文件,但显然我不能在没有提交某些更改的情况下切换分支。

但你可以。运气好的话,B分支上你的功能/ A工作所触及的文件不会有变化,你的顺序是

git checkout feature/B
git commit -- bfile1 bfile2
git checkout @{-1}       # @{-1} is "what I had checked out before",
                         # a.k.a. feature/A here. There's also @{-2}...

以这种方式将运输工作发送到应该记录的分支机构是Git的最佳功能之一。

如果两个分支都改变了一些文件,那么Git也有工具来帮助解决这个问题。最简单的方法通常是暂时提交这些文件并在返回途中重置它们,但是一旦熟悉了重型火炮,又称

git checkout -m feature/B

您可能不需要临时提交三步。 git checkout -m将内容合并为HEAD作为基础,并将feature / B合并为新提示。如果在大块级别没有任何冲突,那么您可以git commit -- bfile1 bfile2像以前一样将所需的更改丢弃,如果有必要解决它们,但不管你能做什么总是如此使用Git保存最好的三个秘密:

git add -p         # `-p` is aka `--patch`, get comfy with using this
git reset -p       # option and you'll be using the shortcut gladly
git checkout -p    # ...

有选择地将您的工作树(添加)应用于索引,(重置)HEAD又名@或指定提交索引,(签出)索引到您的工作树或命名提交索引和工作树。

然后,一旦你有了想要在这个分支上提交你想要的索引条目,git commit -- bfile1 bfile2像往常一样提交那些,git checkout -m @{-1}和任何-p atchwork to fixup leftovers and orts。

花一些时间来试验这些是如何工作的,也许这些琐碎的案例对于琐碎案例来说是多么容易让你感到厌烦,许多git不太广泛使用的选项将开始变得有意义。现在已经好几年了,而且我还在学习让我更喜欢Git的东西。

答案 2 :(得分:0)

您可以使用git的版本控制来执行相同操作。转到IDE中的版本控制,您可以在那里选择特定文件并提交并推送到您当前所在的分支(“A”)。在此之后,您可以签出您的其他分支“B”,然后执行选择和提交您想要的文件的相同过程。