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

时间:2011-12-27 23:28:25

标签: git branch git-branch

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

当我在本地主人身上时,我想切换到我的cleanchanges,但不更改文件。然后我就可以投入了。

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

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

9 个答案:

答案 0 :(得分:54)

编辑:我刚注意到你说你已经创建了一些提交。在这种情况下,使用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的目的是在不先问你的情况下不丢弃工作。

答案 1 :(得分:38)

<强> GIT中。切换到另一个分支

git checkout branch_name

答案 2 :(得分:9)

最好的办法是stash更改和切换分支。要切换分支,您需要一个干净的状态。因此,存储它们,签出新分支并在新分支上应用更改并提交

答案 3 :(得分:1)

听起来你做了改变,让他们一路上掌握,现在你想把它们组合成一个提交。

如果是这样,你想要rebase你的提交,将它们压缩成一个提交。

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

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

答案 5 :(得分:0)

最简单的方法如下:

git fetch && git checkout <branch_name>

答案 6 :(得分: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>

答案 7 :(得分:0)

干净地切换到另一个分支 cleanchanges 并保留当前工作区文件 - 没有副作用或中间提交:

# starting from master
git switch --detach               # to not move the current branch
git reset cleanchanges
git switch cleanchanges

这也与未提交的更改无关,甚至不会更改时间戳。

要保留索引(暂存区)并分别查看脏更改和先前清理的文件与 cleanchanges 头的差异,请执行以下操作:

# starting from master
git switch --detach               # to not move the current branch
git reset --soft cleanchanges
git switch cleanchanges

答案 8 :(得分:-1)

git fetch && git checkout branch_name(“ branch_name”是分支的名称)

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