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分支的安全(次要)更改。我很同意将最后的这些更改也提交给新的分支(但不是这样)
(我一直在使用,但我不确定里面是否有相同的东西。如果是(并且您愿意扫描该东西),请让我知道,这样我知道下次会更仔细地查看。) 谢谢!现在,我只需要在手边放一张纸,上面写着“以后提交给安全分支”的更改。所以你的情况是这样的
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上的分支操作非常便宜,因此我只使用以下工作流:
- 从“实验”分支创建一个新分支
- 提交所需的任何未老化文件
- 回去见师父
从“实验”提交的内容&在步骤1中刚刚创建的新分支cherrypick
- 回到“实验”分支
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