切换到另一个分支而不更改工作区文件

问题描述 投票:63回答:8

我从GitHub克隆了一个git存储库,进行了一些更改和一些提交;我做了很多,而且都很脏,所以它们不适合拉取请求。现在,我从cleanchanges创建了分支origin/master,所以它很干净,我希望将所做的更改作为一次提交并提交一个不错的提交注释。

当我在本地主机上时,我想切换到cleanchanges,但不更改文件。然后我可以提交。

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

我想说清楚:我已在本地master中提交了所有更改。没有未提交的更改。

git branch git-branch
8个回答
55
投票

编辑:我刚刚注意到您说您已经创建了一些提交。在这种情况下,请使用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的设计宗旨是在不先询问您的情况下就不会放弃工作。


41
投票

Git。切换到另一个分支

git checkout branch_name

9
投票
最好的选择是stash更改并切换分支。为了切换分支,您需要一个干净的状态。因此,将它们存储起来,签出一个新分支并将更改应用到新分支上并提交它

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分支返回到与存储库中相同的提交。

0
投票
最简单的方法如下:

git fetch && git checkout <branch_name>


0
投票
为什么不只是git reset --soft <branch_name>

演示:

mkdir myrepo; cd myrepo; git init touch poem; git add poem; git commit -m 'add poem' # first commit git branch original echo bananas > poem; git commit -am 'change poem' # second commit echo are tasty >> poem # unstaged change git reset --soft original

结果:

$ git diff --cached diff --git a/poem b/poem index e69de29..9baf85e 100644 --- a/poem +++ b/poem @@ -0,0 +1 @@ +bananas $ git diff diff --git a/poem b/poem index 9baf85e..ac01489 100644 --- a/poem +++ b/poem @@ -1 +1,2 @@ bananas +are tasty

不过要注意的是,当前分支更改为original。在此过程之后,您仍然留在上一个分支,但可以轻松git checkout original,因为它是相同的状态。如果您不想丢失之前的HEAD,则应注意提交参考,并在此之后进行git branch -f <previous_branch> <commit>

0
投票
[git fetch && git checkout branch_name(“ branch_name”这里是分支的名称)

然后您将看到消息,切换到新的分支“ branch_name”设置分支“ branch_name”以跟踪“ origin”中的远程分支“ branch_name”。

© www.soinside.com 2019 - 2024. All rights reserved.