【问题标题】:How to commit some files on a branch and some others files to another branch?如何将某个分支上的一些文件和其他一些文件提交到另一个分支?
【发布时间】:2018-08-01 02:02:45
【问题描述】:

场景: 我有 2 个现有的分支机构:

  • 功能/A
  • 功能/B

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

所以,假设:

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

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

现在,应该在feature/B 分支上提交另外两个文件,但显然我无法在某些更改未提交时切换分支。

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

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

【问题讨论】:

  • git stash, git checkout, git stash pop :)

标签: git git-branch git-flow


【解决方案1】:
 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,它允许您将提交拆分为每个补丁而不是每个文件

【讨论】:

  • 我会说存储不是完全必要的,因为未暂存的更改不属于分支,并且会在结帐后出现。也就是说,如果目标分支文件与已更改但未暂存的文件不同,则不会发生检出,这就是为什么 Chris 的解决方案是最安全且始终有效的原因。
  • 是的,确实,如果文件没有被跟踪,切换到 feature/B 不会造成任何问题,但是由于 OP 表示他不能只是切换,我假设他在谈论更改5 个跟踪文件...
【解决方案2】:

现在,其他两个文件应该在 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} 和任何 -patchwork 来修复剩余和 orts .

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2021-04-10
      • 1970-01-01
      • 2017-07-16
      • 2016-11-13
      • 1970-01-01
      • 2011-11-25
      • 2018-08-12
      • 2011-05-06
      • 2021-01-07
      相关资源
      最近更新 更多