Git 在不接触工作树的情况下切换分支?

Git 在不接触工作树的情况下切换分支?,git,version-control,branch,Git,Version Control,Branch,我目前在调试分支上,希望切换到主分支,而不修改工作树(保持调试分支中的状态),以便将一些更改提交到主分支 有办法做到这一点吗?这是一个原始的工作流程 git stash git checkout otherbranch git stash apply git reset git add # interactively? just add the hunks/changes you want to commit git commit 回去 git reset --hard # wa

我目前在调试分支上,希望切换到主分支,而不修改工作树(保持调试分支中的状态),以便将一些更改提交到主分支

有办法做到这一点吗?

这是一个原始的工作流程

 git stash
 git checkout otherbranch
 git stash apply
 git reset
 git add # interactively? just add the hunks/changes you want to commit
 git commit
回去

 git reset --hard # watch it here! make sure you haven't added more changes that you wanted to keep
 git checkout debug
 git stash pop
或者,您可以在“此处”提交相关更改并将/cherry pick推到主分支上。

您可以隐藏(
git stash
)更改、切换分支、取消(
git stash pop
)更改、添加和提交更改


如果您想要调试的确切状态,只需将调试合并到主控中(或将主控重置为调试)。

据我所知,您不能。分支切换意味着在工作副本中签出位于该分支头部的代码版本

你想合并你的分支。做

git checkout master
git merge devel
现在将同步这些分支。如果要合并更改的子集,可以指定提交或提交范围。 也来看看 例如:

git checkout master
git cherry-pick devel
将把devel中的最后一次提交合并回master

如果需要合并位于不同主机上的两个分支,请查看git pull和git push

这个答案使用低级的“管道”命令。小心。如果您更喜欢“”命令,请使用产生相同结果的命令

您可以通过以下方法重置头部,使其指向主控形状,而无需更改索引或工作树:

git symbolic-ref HEAD refs/heads/master
您可能应该重置索引,以便有选择地应用工作树更改,否则您可能会提交master和debug分支之间的所有差异,这可能是一件坏事

git reset
完成要进行的提交后,可以使用以下命令返回调试分支:

git symbolic-ref HEAD refs/heads/debug-branch
git reset

您可以执行以下操作:

git checkout --detach
git reset --soft master
git checkout master

说明:

如果您在
debug
分支上,并且要执行
git reset--soft master
操作,那么您的工作树和索引将保持不变,并移动到提交
master
指向的位置。问题是,
debug
也将重置为此提交。因此,您在
debug
上的提交“丢失”(不是真的,但它们不再可以直接访问),并且您仍然在
debug
分支上

要防止
git reset
移动
debug
,但仍然将
HEAD
设置为
master
提交,首先执行
git签出-分离
直接指向当前提交的
HEAD
(请参阅“分离的HEAD”一节)。然后,无需触摸
debug
分支即可执行重置

现在
HEAD
直接指向commit
master
指向的,即它仍然是分离的。您只需
git checkout master
即可连接到
master
,现在就可以在
master
分支上提交了


请注意,
git checkout
(默认情况下,当没有传递路径时),仅更新在“源”和“目标”提交之间更改的文件,并保留对工作树中文件的本地修改。由于在本例中,两次提交都是相同的,因此不会触及工作目录中的任何文件。

谢谢!什么是重设--软需要?
git reset--软
不触及索引或工作树-我想你的意思是只
git reset
@Mark:Good call。AAMOF我做了
git reset
——刚刚估计
——soft
是默认值,并希望将其明确化。谢谢你的批改that@static_rtti:存储可能包含已暂存的更改
git reset[--mixed]
unstages它们,这样您就可以从头开始选择要在master上提交的更改工作树是一棵树,而不是一个补丁,因此如果您真的这样做了,您可以对冲突的更改进行粗暴处理。(或者,如果我理解正确的话,在master中未进行调试的任何更改。)可能的重复并不能直接回答这个问题,但我发现,使用工具也可以实现类似的结果。具体来说,使用IntelliJ,我可以使用“Show Diff from Working Tree”命令按文件夹和文件突出显示差异,然后使用“Get from Branch”将所需的文件和文件夹拉入当前工作树。当我要从中选择的分支有很多提交时,这可能比选择樱桃更容易。建议说,重置master并不总是可靠的,也不安全。如果其他分支与master有关系,这可能会使问题复杂化。将
debug
合并到
master
通常不会使
master
的树与
debug
的树相同,除非(例如)自从他们共同的祖先以来,
master
没有新的发展。@sehe:很难判断OP预期的结果,我提到了一些选项可供选择@马克:是的,没错,但差不多;)(加上/减去
debug
的更改)在我看来,这个解决方案(连同注释中的注释)比使用符号引用要干净得多,就像公认的答案那样。是的,这正是我想要的。解释得也很好。@Jacko我刚在电脑上又查了一遍。唯一的区别是被接受的答案是“混合”重置,我是“软”重置。如果你不使用
--soft
,它应该做与公认答案完全相同的事情(当然,是它的第一部分)。到底是什么对你不起作用?这对我来说非常有效,感觉更干净,然后是
symbolic ref
这件事,很糟糕,它必须是3个命令…@WillemD'haeseleer如果你经常需要,并且键入3个命令对你来说太冗长,你可以这样做。@fernacolo,谢谢你的输入,我在答案上加了一条注释。这个答案帮助我。。。这样的切换确实有助于将一个提交拆分到sm中