GIT:在新的/dirty/dev分支中提交对旧的/safe分支的更改,而不签出或丢失未老化的数据

GIT:在新的/dirty/dev分支中提交对旧的/safe分支的更改,而不签出或丢失未老化的数据,git,branch,commit,git-checkout,Git,Branch,Commit,Git Checkout,在我开始开发一些实验性的东西之前,我创建了一个新的分支。我通常会忘记这一点(这不是问题),但现在我提前做了。 从那以后,我更新了3个文件 在第二个例子中,我只做了一些实验性的改变,我不想把它们提交给安全分支 在1中,只有我确实希望提交给safe分支的安全(次要)更改。我很同意将最后的这些更改也提交给新的分支(但不是这样) 我敢肯定,有可能(快速)将一些未老化、未提交的更改从我的(脏的)工作目录提交到一个旧的、安全的分支吗 我能想到的唯一一件事就是切换分支(不签出),在1个文件中提交更改并切换

在我开始开发一些实验性的东西之前,我创建了一个新的分支。我通常会忘记这一点(这不是问题),但现在我提前做了。
从那以后,我更新了3个文件

  • 在第二个例子中,我只做了一些实验性的改变,我不想把它们提交给安全分支
  • 在1中,只有我确实希望提交给safe分支的安全(次要)更改。我很同意将最后的这些更改也提交给新的分支(但不是这样)
我敢肯定,有可能(快速)将一些未老化、未提交的更改从我的(脏的)工作目录提交到一个旧的、安全的分支吗

我能想到的唯一一件事就是切换分支(不签出),在1个文件中提交更改并切换回,但我不知道切换回脏分支时会发生什么变化(它们仍然存在还是由于提交而“消失”?)

我相信GIT在这方面做得很好,但GIT有太多东西,我找不到完全相同的东西。
(我一直在使用,但我不确定里面是否有相同的东西。如果是(并且您愿意扫描该东西),请让我知道,这样我知道下次会更仔细地查看。)

谢谢!现在,我只需要在手边放一张纸,上面写着“以后提交给安全分支”的更改。

所以你的情况是这样的

x--x--x (safe)
       \
        <a,b,c> (3 private evolutions in exp branch)
你可以:

git add a
git commit -m        # in exp branch, gasp!
git stash save       # save the rest of the exp work in progress
git checkout master
git merge exp        # fast-forward merge

x--x--x--a (safe,exp)
          \
           [b,c] (stashed)

git branch -f exp HEAD~1  # reset branch exp to before 'a'
git checkout exp
git stash pop
git add -A
git commit -m "..."

x--x--x--a (a committed only in safe banch)
      \
        b,c (b and c commited in exp branch)

由于GIT上的分支操作非常便宜,因此我只使用以下工作流:

  • 从“实验”分支创建一个新分支
  • 提交所需的任何未老化文件
  • 回去见师父
  • cherrypick
    从“实验”提交的内容&在步骤1中刚刚创建的新分支
  • 回到“实验”分支

无法使用git commit将提交添加到备用分支。有几种方法可以使用低级“管道”命令来完成您所描述的操作,但这些命令形成的界面不是为交互使用而设计的1。当然有办法做你想做的事;根据您所做更改的细节和涉及的分支的内容,它可能非常简单

简单的例子:只需使用
git checkout
切换分支时,git checkout将保留未提交的修改或拒绝切换(除非您使用
--force
--merge
--conflict
)。因此,只要您的未提交更改只接触头(当前分支)和目标分支中相同的文件,git checkout就会在切换分支时将这些更改保留在索引和/或工作树中。如果未提交的更改满足此条件,则可以执行以下操作:

git checkout safe-branch
git add -- files-with-safe-changes
git commit
git checkout -
您还可以使用
git add--patch
来暂存和提交文件中的部分更改。

在此之后,您的“安全更改”将成为“安全分支”的一部分;切换回原来的分支将“把它们留在后面”(记住,git签出仅在切换分支时保留未提交的更改)

如果您的其他更改依赖于“安全更改”,则您可能需要将“安全分支”合并到您的工作分支中(或者,根据您的工作流程,将您的工作分支重新设置为“安全分支”的新提示)。要做到这一点,您必须隐藏未提交的更改(因为如果存在未提交的更改,merge和rebase都将拒绝运行)

如果您的其他更改不依赖于“安全更改”,那么您可能不应该这样做 为合并或重设基础而烦恼。最终,您将把这些分支合并在一起(例如,通过将它们合并到一个“qa”分支中进行发布前测试),但是没有理由过早地合并它们

仍然很容易,但有点冒险:
git checkout-m
如果第一次git签出抱怨“您对
某些文件
进行了本地更改;未切换分支”,则表示您对
某些文件
进行了未提交的更改,并且该文件在“安全分支”和当前分支的提示中有所不同;你需要一种不同的方法

如果您确信这些更改将干净地应用于“安全分支”中的
某些文件
的版本,那么您可以使用
-m
/
--merge
选项告诉git checkout尝试调整更改,以便将其应用于“安全分支”中的文件。如果合并不能干净地完成,那么最终会出现合并冲突,并且可能很难恢复原始更改(这就是为什么我称之为“风险”)

安全:
git stash
+
git checkout-m
因为您确实只想将更改的一部分移回“安全分支”,所以最好只关注这些更改。一种方法是使用git stash临时保存当前更改,这样您就不必将所有更改拖回“安全分支”(稍后再将部分/大部分更改拖回工作分支)

其他变化也是可能的。您可以使用
git checkout-p stash--files
仅挑选这些文件中的一些更改。如果索引中没有阶段性更改,那么您可以首先阶段性地进行“安全更改”,
git add--files
(也可以选择使用
-p
),使用
git stash save--keep index
,切换分支(使用merge),然后提交(即用预阶段性更改替换
git checkout stash--files
)“安全更改”和
git隐藏--保留索引
)。

在这种情况下,我认为代码> Git CuthOut-M/CODE >是安全的,因为我们使用Git StAG来保存当前更改的副本;如果三路合并尝试导致无望的混乱,那么您可以轻易放弃将“安全更改”放在“安全分支”上的想法并得到B。

git checkout safe-branch
git add -- files-with-safe-changes
git commit
git checkout -
git stash save
git merge safe-branch
git stash pop --index
git stash save
git checkout stash -- files-with-save-changes
git checkout -m safe-branch
git commit
git checkout -
git stash pop --index