情境: 我有2个现有的分支机构:
我在feature/A
分支上,对5个不同的文件进行了一些更改。
并非所有这5个文件都与功能A相关,但通常在更改/开发/修复某些内容时,您会发现其他错误或需要更改文件中的内容,这与您在该时刻编码的功能并不严格相关。 / p>
所以,假设:
当我执行本地提交时(我使用Tortoise但我认为它与其他软件类似)我可以选择提交哪个文件,所以假设我在当前分支上提交了与A相关的3个文件feature/A
,其余2个文件已被更改但未提交。
现在,另外两个文件应该在feature/B
分支上提交,但显然我不能在没有提交某些更改的情况下切换分支。
简单的解决方案可能是将文件复制为备份,还原它们,切换到feature/B
然后复制备份文件并提交。
对于像这样的问题,是否有更优雅的解决方案? 我知道这是非常糟糕的做法,但有时可能会发生。
答案 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”,然后执行选择和提交您想要的文件的相同过程。