> For the complete documentation index, see [llms.txt](https://pshizhsysu.gitbook.io/git/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://pshizhsysu.gitbook.io/git/ben-di-cang-ku/fen-zhi-guan-li/chuang-jian-fen-zhi.md).

# 创建分支

## 问题

假设本地的某个git repository下有a.md文件，刚开始的时候只有master分支，则该文件只有一行内容；此时，我们在该repository下新建一个dev分支；然后在master分支在第一行的基础下我们添加一行并提交，在dev分支下也添加一行不同的内容并提交；那么两次提交后a.md的文件内容到底是什么样的？

## 实验

1、准备目录与文件

创建一个目录learngit，且在该目录下新建一个`a.md`文件，文件内容为

```
$ cat a.md
initial row
```

2、初始化git仓库

在该目录下依次执行以下命令来初始化仓库

```
$ git init
$ git add a.md
$ git commit -m "initialization"
```

此时该仓库就会有一个master分支，可用`git branch`命令查看分支信息；其中 \* 表示当前所在的分支

```
$ git branch
* master
```

3、创建分支dev

在learngit目录下执行命令\`git branch dev\`创建dev分支，再次查看分支信息

```
$ git branch
  dev
* master
```

此时在master与dev分支下查看到的文件内容都是一样的

4、master分支更改

在master分支下，在文件a.md的尾部添加一行\`row added by master\`，然后执行以下命令提交

```
git add a.md
git commit -m "master appends a row"
```

此时查看a.md的内容

```
$ cat a.md
initial row
row added by master
```

执行命令\`git checkout dev\`切换到dev，查看文件内容；发现文件内容并没有发现master添加的那一行

```
$ cat a.md
initial row
```

5、dev分支更改

在dev分支下，在文件a.md的尾部添加一行\`row added by dev\`，然后执行以下命令提交

```
git add a.md
git commit -m "dev appends a row"
```

此时查看a.md的内容

```
$ cat a.md
initial row
row added by dev
```

执行命令\`git checkout master\`切换到master，查看文件内容；发现文件如下

```
$ cat a.md
initial row
row added by master
```

6、其他发现

执行完上面的5个步骤后， 我们不再修改文件内容，而只是执行\`git checkout master\`或\`git checkout dev\`来切换分支，结果发现每次执行切换分支命令，a.md的修改时间都会发生变化，而且就是执行切换分支命令的时间

## 结论

1、我们在哪个分支下，就只会看到那个分支的内容

2、当在一个分支下修改了内容，却没有commit就切换到另一个分支时，就会报错，拒绝切换（已验证）

## 分析

当每一次执行`git checkout [branch]`时，git会把该分支的内容复写到该目录下，这样我们每次切换分支后，看到的都是该分支的内容，而且文件的修改时间也是执行切换分支命令的时间
