Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git 切换到另一个分支而不更改工作区文件_Git_Branch_Git Branch - Fatal编程技术网

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

Git 切换到另一个分支而不更改工作区文件,git,branch,git-branch,Git,Branch,Git Branch,我从GitHub克隆了一个git存储库,做了一些更改和提交;我做了很多,而且都很脏,所以它们不适合拉动请求。现在,我从origin/master创建了分支cleanchanges,因此它是干净的,我想在那里提交我的更改,作为一个提交,并带有一个漂亮的提交注释 当我在本地主机上时,我想切换到我的cleanchanges,但不更改文件。然后我就可以承诺了 如何在不更改文件的情况下切换分支 我想说清楚:我已经在本地主文件中提交了所有更改。没有未提交的更改。编辑:我刚刚注意到您说您已经创建了一些提交。在

我从GitHub克隆了一个git存储库,做了一些更改和提交;我做了很多,而且都很脏,所以它们不适合拉动请求。现在,我从
origin/master
创建了分支
cleanchanges
,因此它是干净的,我想在那里提交我的更改,作为一个提交,并带有一个漂亮的提交注释

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

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


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

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

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

编辑:如果您有未提交的更改,则以下答案适用。)

只需使用
git checkout cleanchanges
切换分支即可。如果分支引用相同的ref,那么在切换时,所有未提交的更改都将保留在工作目录中

只有当存储库中的某个文件在
origin/master
cleanchanges
之间存在差异时,才会发生冲突。如果您刚刚创建了分支,那么就没有问题了


和往常一样,如果你担心失去工作,首先做一份备份。Git的设计目的是,在没有事先询问您的情况下不会放弃工作。

最好的选择是更改和切换分支。要切换分支,您需要一个干净的状态。因此,将它们隐藏起来,签出一个新分支,并在新分支上应用更改并提交它

听起来像是您做了更改,一路上将它们提交给master,现在您希望将它们合并到一个提交中

如果是这样的话,您希望将您的提交压缩为一次提交


我不完全确定你到底想要什么,所以我不会用剧本来诱惑你。但是我建议您仔细阅读git rebase和“挤压”选项,并尝试一些方法。

另一种方法,如果您想创建新提交而不是执行合并:

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

git status
git add .
git commit
第一次(硬)重置会将您的工作树设置为与
master
中的最后一次提交相同

第二次重置将使您的头回到原来的位置,指向
cleanchanges
分支的尖端,但不会更改任何文件。现在您可以添加并提交它们


之后,如果要删除从
master
所做的脏提交(假设尚未推送),可以:

git checkout master
git reset --hard origin/master

这将放弃所有新提交,将本地
主分支返回到与存储库中相同的提交。

Git。切换到其他分支机构

git checkout branch_name

最简单的方法如下:

git fetch && git checkout <branch_name>
git获取和git签出

为什么不干脆
git重置--soft

演示:

mkdir myrepo;cd myrepo;初始化
触摸诗;git加诗;git commit-m'add poem'#first commit
git分支原件
回音香蕉>诗;git提交-am“更改诗歌”#第二次提交
回声是美味的>>诗#未老化的变化
git重置--软原稿
结果:

$git diff——缓存
差异——吉特a/诗b/诗
索引e69de29..9baf85e 100644
---a/诗歌
+++b/诗歌
@@ -0,0 +1 @@
+香蕉
$git diff
差异——吉特a/诗b/诗
索引9baf85e..ac01489 100644
---a/诗歌
+++b/诗歌
@@ -1 +1,2 @@
香蕉
+它们很好吃

但是需要注意的是,当前分支更改为
原始分支。流程结束后,您仍然停留在上一个分支中,但可以轻松地
git签出原始文件
,因为它的状态相同。如果您不想丢失前面的
,则应注意提交引用,然后执行
git branch-f

git fetch&git checkout branch\u name
(“branch\u name”这里是分支的名称)

然后你会看到消息, 切换到新分支“分支机构名称”
分支“Branch\u name”设置为从“origin”跟踪远程分支“Branch\u name”。

干净地切换到另一个分支
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

您不一定需要“干净状态”来切换分支。然后,您可以合并来自另一个分支的更改。我已提交所有更改。这将更改工作区文件,但未跟踪的文件除外。它将更改文件。Fetch不会更改,但签出会更改,但未跟踪的文件除外,如前所述