2011-12-27 37 views
43

我从GitHub克隆了一个git存储库,进行了一些更改和一些提交;我做了很多,都很肮脏,所以不适合拉请求。现在我从origin/master创建了分支cleanchanges,所以它很干净,我想在一个提交很好的提交评论时提交我的更改。切换到另一个分支而不更改工作区文件

当我在本地主人,我想切换到我的cleanchanges,但没有更改文件。然后我能够承诺。

如何在不更改文件的情况下切换分支?

我想说清楚:我有在当地master承诺的所有更改。没有未提交的更改。

回答

45

编辑:我刚刚注意到,你说你已经创建了一些提交。在这种情况下,使用git merge --squash使单个提交:

git checkout cleanchanges 
git merge --squash master 
git commit -m "nice commit comment for all my changes" 

编辑:如果你有未提交变化以下的答案必须适用)

只需切换分支与git checkout cleanchanges。如果分支引用相同的参考,那么当您切换时,所有未提交的更改将保留在您的工作目录中。

唯一会发生冲突的是如果存储库中的某个文件在origin/mastercleanchanges之间有所不同。如果你刚创建分支,那么没问题。

一如既往,如果您对所有失去工作感到担忧,请先备份一份备份。 Git的目的不是为了不先要求你而放弃工作。

+0

我已提交所有更改。 – amorfis 2011-12-27 23:39:56

+0

在这种情况下,请参阅我更新的答案。 – 2011-12-27 23:40:51

6

最好的选择是stash的变化和切换分支。要切换分支,您需要一个干净的状态。所以隐藏它们,签出一个新的分支,并在新分支上应用更改并提交它

+2

您不一定需要“干净状态”来切换分支。 – 2011-12-27 23:37:41

+0

问题是变更已经提交。 – amorfis 2011-12-27 23:39:44

+1

然后,您可以合并来自其他分支的更改。 – vivek85 2011-12-27 23:42:43

1

听起来您已经做出了更改,将它们提交给主程序,现在您希望将它们组合为单个提交。

如果是这样,你想rebase你的提交,挤压他们到一个单一的承诺。

我不完全确定你到底想要什么,所以我不会用脚本来诱惑你。但我建议你阅读git rebase和“压扁”的选项,并尝试一些事情。

1

另一种方式,如果你想创建一个新的提交,而不是在执行合并:

git checkout cleanchanges 
git reset --hard master 
git reset cleanchanges 

git status 
git add . 
git commit 

第(硬)重置将你的工作树设置为相同的最后一次提交的master

第二次重置会将您的HEAD放回原来的位置,指向cleanchanges分支的顶端,但不更改任何文件。所以现在你可以添加和提交它们。


之后,如果要删除脏的提交你master制成(并假设您尚未将他们推),你可以:

git checkout master 
git reset --hard origin/master 

这会舍弃你的所有新的提交,将您的本地master分支返回到与存储库中相同的提交。

21

Git。切换到另一个分支

git checkout branch_name 
+11

这将改变工作区文件,除了未跟踪的文件 – SMR 2016-02-05 11:43:01

+0

aregato gonsaymasu。谢谢。 – 2018-02-09 07:59:06

相关问题