Git分支切换的正确操作,你真的会吗?

本文探讨了在使用Git进行版本控制时,如何正确处理本地与远程分支间的切换与同步,特别是未提交更改的情况下的最佳实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

场景一:本地分支之间的切换

1、不commit代码就切换分支

我们来看看,在本地多个分支时,不commit就切换分支会发生什么:

首先,创建一个maven工程,添加一个Java类:GitDemo,并添加如下代码:

package com.tencent;

/**
 * GitDemo.java
 *
 * @Author: CZQ
 * @CreateTime: 17:47-2021/3/21
 * @Description:
 */
public class GitDemo {

    public static void main(String[] args) {
    }
}

在这里插入图片描述
然后,我们新建一个dev分支,并在dev的GitDemo类的main方法中,添加如下代码:

System.out.println("don not commit and checkout");

在这里插入图片描述

我们不commit,直接切换回master分支

在这里插入图片描述
发现代码也被带过来了,没有丢失。

我们在master分支中,把main方法里的代码删掉,再加一行

System.out.println("hello world");

然后切换回dev分支:
在这里插入图片描述
可以发现,dev分支的代码一直跟master保持一致。这似乎看不出什么问题,可是,我们的dev的原先的代码:

 System.out.println("don not commit and checkout");

已经被覆盖了,也就是说,dev的代码已经丢失了一部分,这并不是一个好的提交方式。

2、commit后再切换分支

我们在现有的基础上,在dev分支加上一行代码:

 System.out.println("commit and checkout");

在这里插入图片描述
先commit:
在这里插入图片描述
然后再切换回master分支:
在这里插入图片描述
我们发现,master分支默认打开的并不是GitDemo这个类,而且也找不到这个类,而是打开了pom文件,原因是一开始我们创建的GitDemo类之后,并没有进行commit,所以master分支并没有这个类。

我们在master分支创建一个GitTest类:

在这里插入图片描述
同样先commit:
在这里插入图片描述

再切换回dev分支:
dev分支
我们发现dev分支中并没有这个类,说明dev分支和master分支并不一致,dev没有被覆盖。

3、不commit时有冲突会怎样?

我们刚才在master分支中新建了一个GitTest类:
在这里插入图片描述

同样的,我们在dev中也去新建一个GitTest类:

在这里插入图片描述

这次,我们加一个main方法,在里面添加一行代码,然后,我们切换到master分支:
在这里插入图片描述
出现master分支上的GitTest类将会被重写的提示,我们选择smart checkout,提示是否重写,我们选择cancel:
在这里插入图片描述
这样,本地maser分支上的代码就不会被dev覆盖掉了:
在这里插入图片描述
然后,我们切换回dev分支:
在这里插入图片描述
GitTest类就不见了!!!可以发现,代码已经丢失。

那如果我们刚才选择override之后,再切换呢?

我们在master分支上的GitTest类中新加一行代码
在这里插入图片描述
然后commit之后checkout到dev上,在dev上加上同名不同代码的GitTest类:

在这里插入图片描述

我们不commit直接再次切换:
在这里插入图片描述

这次选择override:

在这里插入图片描述
可以看到,master原有的代码已经被覆盖:
在这里插入图片描述
我们不commit,再次切回dev:
在这里插入图片描述
仍然选择smart checkout,这次提示需要rollback:
在这里插入图片描述

我们选择rollback:
在这里插入图片描述
rollback后GitTest这个类还是消失了,checkout到master分支,原有的被覆盖的代码又回来了:
在这里插入图片描述
这并不是我们想要的结果。

那如果我们选择force checkout,又会是怎样的结果?

我们再次在dev上新建GitTest类,这次我们跟master代码保持一致,同样不commit,然后直接checkout
在这里插入图片描述
选择force checkout,结果master分支无变化:
在这里插入图片描述

再次切换回dev分支:
在这里插入图片描述
发现GitTest文件不见了。

总结

  1. 不同分支之间,不commit直接切换时,如果没有commit的分支上新增的内容是一个全新的文件,即和要切换过去的分支没有同名的文件时,该文件会被同步到要切换过去的分支,切换回来文件也不会丢失;
    例如:场景一的第1种情况。

  2. 不同分支之间,不commit直接切换时,如果没有commit的分支上新增的内容是一个已有文件的代码时,如果发生冲突时,选择force checkout,则两边都不会保存该新增的内容,代码丢失;如果发生冲突时,选择smart
    checkout,则该段代码会被同步到要切换的分支,如果从该分支重新切回原分支(例如dev),会提示选择smart
    checkout还是force checkout,选择force
    checkout,则两边都不会保存该新增的内容,代码同样会丢失,选择smart checkout,则该段代码会在原分支上继续保留
    例如:场景一的第2种情况

  3. 不同分支之间,不commit直接切换时,如果没有commit的分支上新增的内容是一个和其他分支同名的文件,会提示选择smart checkout还是force checkout,如果选择force,则两个分支上都不会保留该文件的代码;如果选择smart
    checkout,则切换后目标分支上会被override,如果在目标分支上不commit,直接切回原分支,会提示原有的类不存在,需要rollback,可是rollback后,原来新建的同名类仍会不见,切回目标分支,发现被override的代码重新rollback,造成dev代码丢失。
    例如:场景一的第3种情况。

  4. 先commit再切换,则不存在本地代码和文件被覆盖的问题,如果有冲突时,也不会提示。 例如:场景二的第2种情况。

场景二:本地分支和远程分支之间同时更新代码

我们将本地dev代码push到GitHub上,模拟一下真实的开发场景:

在这里插入图片描述

然后,我们在本地上对代码进行修改:
在这里插入图片描述

上图是原有的IGitDemo类,已删除main方法中的所有语句。

这时GitHub上的代码如下:
在这里插入图片描述

我们不commit的情况下,直接pull代码:

在这里插入图片描述
本地跟远程没有冲突,当然,也没有同步。

我们在本地上再添加一行代码:

System.out.println("I don not know why do not asyn");

再次pull代码:

还是没有冲突,而且本地代码跟远程还是没有保持同步:
在这里插入图片描述
那我们修改一下远程代码:

在这里插入图片描述
可以发现,在GitHub上是需要先commit再update代码,所以,我们先commit,然后我们再次在本地pull代码:

在这里插入图片描述
毫不意外地出现了冲突,我们合并代码即可。

总结:远程分支和本地分支不一致时,如果不是同一个文件的同一处进行修改,不commit的情况下,文件也不会冲突,也不会被覆盖。

场景三:本地和远程分支之间切换

在update到跟远程一样后:
在这里插入图片描述
我们本地的代码已经无需commit了,这时,我们在远程master分支上再添加一个Java文件:iteminfo.java
在这里插入图片描述
我们在本地dev也添加一个类:GitMini.class
在这里插入图片描述
然后,我们直接切换到远程的master分支:

在这里插入图片描述
跟本地一样,我们的dev中的文件已经同步到本地master了,那我们再次切回dev:
在这里插入图片描述

文件还在,所以这种场景跟场景一是相同的。

总结

1、当本地不同分支或者本地和远程不同分支之间进行切换时,一定要先commit,否则会有代码或者文件被覆盖的风险;

2、本地分支和远程相同分支之间,先commit还是先pull都不会有代码被覆盖的风险,但是如果有冲突的情况下,如果merge不当,代码也有可能被覆盖。如果仅仅为了规范,也可以先pull再commit;但安全起见,建议还是先commit之后再pull。

<think>好的,用户想了解如何切换Git分支。首先,我需要回忆一下相关的Git命令。记得切换分支主要用的是`git checkout`或者较新版本的`git switch`。可能用户对这两种方法都感兴趣,或者需要区分它们的使用场景。 然后,根据提供的引用,看看有没有相关的信息。引用[2]提到创建新分支用的是`git branch hello-world`,但用户问的是切换,不是创建。不过,通常创建和切换可以结合使用,比如`git checkout -b`或者`git switch -c`,这可能也需要提到。 接下来,我需要确保回答符合用户的要求,也就是切换分支的具体步骤。可能需要分点说明不同的方法,比如使用`git checkout`、`git switch`,以及如何创建并切换到新分支。同时,要给出示例命令,这样用户可以直接复制使用。 还要注意用户提到的引用,比如引用[2]中的创建分支的命令,但用户的问题是关于切换,所以可能需要关联到切换的部分。例如,在创建分支后如何切换到它,或者直接切换已存在的分支。 另外,用户可能需要知道如何查看所有分支,以确认有哪些分支可以切换,所以`git branch -a`或`git branch --list`这样的命令也需要包括进去。还有,切换分支前需要确保工作区是干净的,否则可能会遇到错误,这一点也要提醒用户。 最后,生成相关问题的时候,要考虑用户可能接下来会问的内容,比如创建分支、合并分支、删除分支等,这些都是分支管理中的常见操作,所以相关问题需要覆盖这些方面,帮助用户进一步学习。 需要确保回答中的命令正确无误,并且符合中文习惯。同时,引用标识要自然地放在相关段落末尾,比如在提到`git checkout`时引用对应的资料,但根据提供的引用内容,可能引用[2]和[4]更相关,因为涉及到分支操作。不过现有的引用中没有直接提到切换分支的具体命令,所以可能需要根据已知的知识来回答,并适当引用已有的内容。 总结步骤: 1. 介绍切换分支的主要命令:`git checkout`和`git switch`。 2. 说明如何查看现有分支。 3. 示例切换命令,包括切换到已有分支和创建并切换分支。 4. 注意事项,比如工作区必须干净。 5. 生成相关问题,覆盖分支管理的其他方面。 需要确保使用正确的格式,行内代码用$...$,但这里命令应该用反引号包裹,可能用户示例中的代码块是Python,但Git命令应该用行内代码,或者用代码块?不过根据用户的问题中的示例,Python代码用了代码块,但用户现在的问题是关于Git命令,可能需要使用类似的格式,但用户给出的系统指令中提到行内数学表达式用$...$,而普通代码可能用反引号或代码块。需要确认,但根据示例中的快速排序代码用了代码块,所以可能Git命令也应该用代码块。 不过用户的问题中的系统级指令第1点提到行内数学表达式用$...$,而其他代码可能按常规处理。所以Git命令应该用代码块,像示例中的Python代码一样。 所以,在回答中,Git命令应该用代码块包裹,并正确显示语法。例如: ```bash git checkout existing-branch ``` 同时,需要检查是否有引用可以标注。例如,引用[2]提到创建分支,引用[4]提到release branch从develop分支分出,可能需要关联到分支切换的场景,比如发布分支切换。但可能直接相关的引用没有,但根据现有引用,可以适当添加引用到相关的部分,比如创建分支切换,可能引用[2]中的创建命令,但切换部分可能没有直接引用,所以可能不需要添加引用,或者仅在相关的地方标注已有的引用。 最后,生成的问题需要围绕分支管理的其他方面,比如创建、合并、删除、解决冲突等,帮助用户深入了解更多操作。</think>以下是切换Git分支的方法: ### 如何切换Git分支? 1. **查看所有分支** 首先需要查看本地和远程存在的分支列表: ```bash git branch -a # 查看所有分支(本地+远程) git branch --list # 仅查看本地分支 ``` 2. **切换到已有分支** - 使用传统命令 `git checkout`: ```bash git checkout existing-branch # 切换到名为 existing-branch 的分支 ``` - 使用更直观的新命令 `git switch`(Git 2.23+版本支持): ```bash git switch existing-branch ``` 3. **创建并切换到新分支** 若需基于当前分支创建新分支并直接切换: ```bash git checkout -b new-branch # 传统方式 git switch -c new-branch # 新命令方式 ``` 这等价于先执行 `git branch new-branch` 再切换[^2]。 4. **切换到远程分支** 若需切换到远程存在的分支(如 `origin/feature`): ```bash git checkout --track origin/feature # 自动关联本地分支与远程分支 ``` **注意事项** - 切换分支前需提交或暂存当前修改,否则会因工作区不干净导致切换失败。 - 若分支存在未合并的冲突,需先解决冲突后才能切换[^4]。 ```bash # 示例:从 master 切换到 feature 分支 git checkout feature ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值