1.git 区域
使用git checkout
命令,目录就是工作区,使用add命令,将文件添加到暂存区,commit把文件提交到本地分支上(本地仓库)。
2.git文件状态变化
- Untracked:没有被git跟踪的文件
- Unmodified:没有被修改的文件
- Modified:修改后的文件
- Staged:暂存文件
我们在一个目录下使用git init
命令,会把当前目录初始化为一个git项目,其中的文件都将是untracked装状态。我们对未被跟踪的文件进行操作都只会是untracked状态。使用git add .
命令将当前目录下所有文件添加到暂存区,同时这些文件被git记录,为跟踪文件。
我们对跟踪文件进行修改后,文件就变成Modified状态。
我们使用git commit -m "xxx"
命令后所有暂存区的文件提交到本地分支上。随后文件都变为Unmodified状态。
可以使用git status
命令查看当前git分支下文件状态。
3.git 忽略文件
有时候我们不得不在一些存放着与项目无关的文件目录下生成git本地仓库,我们可以生成.gitignore文件忽略。(这部分可以去官网看)
ps:我之前就是vscode在错误的位置使用了git init
命令,结果10000+untracked提醒。
4.git 分支
当我们使用git commit
命令时,Git会计算每一个子目录的校验和,将这些检验和保存为树对象。如果只有根目录那么就只有一个树对象。
随后git会创建一个提交对象,其中包含了一个指向最上层树对象的指针。
所以我们可以分出三个对象:
- blob对象:文件快照
- tree对象:目录结构和blob对象索引
- commit对象:存放前述树对象
如果是多层目录,例如/根目录下有/test1/,/test2/,目录,那么树对象应该有三个,根目录树对象指向根目录下文件和字目录树对象。
如果我们再对这些文件进行修改并提交那么这次的提交对象就会包含一个上次提交对象的指针。
如图,最后一个commit就是我们最后commit的对象。
讲了这么多,我们可以明白,其实git的分支本质就是一个指针,一个可以指向不同提交对象的指针。
4.Head指针和分支创建和切换:
上图,我们发现了一个HEAD指针,他是一个特殊指针,指向当前分支所在哪个分支。例如我们当前项目有很多分支master,test等,我们通过HEAD指针确定我们处于哪个分支。
分支创建使用git branch testing
命令。
发现,不同的分支指向了同一个commit对象,通过head指针就能区分在哪个分支上。
所以分支切换的本质就是改变head指针的指向。
分支切换命令git checkout testing
。
另外我们的head指针会随着分支的提交自动往前移动。
checkout命令还会更改我们工作目录的文件,例如我们在testing分支上新增了文件,切回master分支时,文件会消失。
5.分支合并:
在我们了解分支的本质后,分支合并的理解很简单。
合并命令:git merge branch
branch为分支名。
例如上方master分支和testing分支,我们希望两个分支合并,我们使用git checkout testing
命令,切到testing分支,使用git merge master
命令,将master分支内容合并到testing分支下。
注意我们合并时的分支必须是本地分支,如果不是,我们需要先把远程分支拉到本地,然后合并。
6.远程分支:
先写着么多。。。