Niffler

X2.11 15352103-Git原理和实践

Posted By 15352103

基本概念

参考基本概念

  • 工作区:项目所在目录
  • 暂存区:工作区中有一个隐藏目录 .git,暂存区位于.git目录下的index文件中,英文名为index或stage
  • 版本库:隐藏目录.git

下图展示了工作区、版本库中的暂存区和版本库之间的关系:

基本概念

图中左侧为工作区,右侧为版本库,在版本库中标记为”index”的区域为暂存区,标记为”master”的区域为master分支所代表的的目录树。此时”HEAD”指向master分支,所以图示命令中HEAD可以用master替换。图中”objects”为对象库,实际位于.git目录下的objects文件中,里面包含了创建的各种对象和内容。

当对工作区修改或新增的文件执行git add命令时,暂存区的目录树被更新,同时工作区修改或新增的文件内容被写入到对象库一个新的对象中,该对象的ID被记录在暂存区的文件索引中。

当执行git commit命令时,暂存区的目录树写入版本库,master分支会做相应的更新,即master分支指向的目录树就是提交时暂存区的目录树。

当执行git reset HEAD命令时,master分支指向的目录树将替换暂存区的目录树,工作区不受影响。

当执行git checkout .git checkout <file>命令时,暂存区中全部或指定文件将替换工作区中的文件。这个操作很危险,它会清除工作区中未添加到暂存区的改动。

当执行git checkout HEAD .git checkout HEAD <file>命令时,HEAD指向的master分支中的全部或指定文件将替换暂存区和工作区中的文件。注意这个操作很危险,它不但会清除工作区中未提交的改动,而且会清除暂存区中未提交的改动。

提交代码基本命令

参考提交代码基本命令

  • git add命令

将我们需要提交的代码从工作区添加到暂存区

git add .:不加参数默认将修改和未跟踪新增加的文件添加到暂存区,注意不包括删除

git add -u .:-u表示将已跟踪文件中修改和删除的文件添加到暂存区,不包括新增加的文件。注意被删除的文件被添加到暂存区再被提交并推送到服务器的版本库之后就消失了

git add -A .:-A表示将所有已跟踪文件中修改和删除的文件以及未跟踪新增加的文件添加到暂存区

  • git commit命令

将暂存区的改动提交到本地版本库。每次使用此命令时,本地版本库会生成一个40位的哈希值,这个哈希值也被称为commit-id,commit-id在版本回退的时候是非常有用的,它相当于一个快照,可以在未来的任何时候通过与git reset命令组合进行回退。

git commit -m "注释":-m参数表示可以直接输入后面的注释内容,如果不加-m参数,会调用一个编辑器一般是vim来让你输入注释。

git commit -am "注释":-am相当于-a -m。-a参数将所有已跟踪文件中修改或删除的文件提交到本地版本库,即使它们没有经过git add命令添加到暂存区。注意不包括新增加的文件

  • git push命令

git push命令的一般形式为git push <远程主机名> <本地分支名>:<远程分支名>,用于将本地版本库的分支推送到远程服务器上对应的分支

git push origin master:如果省略远程分支名,表示将本地分支推送到与之存在追踪关系的远程分支(通常两者同名),如果该远程分支不存在,则会被创建

git push origin :master:如果省略本地分支名,表示删除指定的远程分支,等同于git push origin --delete master

git push origin:如果当前分支与远程分支存在追踪关系,那么可以省略本地分支名和远程分支名

git push:如果当前分支只有一个追踪分支,那么可以省略主机名

git push -u origin master:如果当前分支与多个主机存在追踪关系,可以使用-u指定一个默认主机,之后就可以不加任何参数直接使用git push

关联远程仓库

参考关联远程仓库

远程仓库为空

打开项目所在的本地仓库,右键Git Bash Here,执行以下命令:

git init
git remote add origin 远程仓库地址
git add .
git commit -m "注释"
git push -u origin master

远程仓库为空

远程仓库非空
git init
git remote add origin 远程仓库地址
// 获取远程仓库master分支上的内容
git pull origin master
// 将当前分支设置为远程仓库的master分支
git branch --set-upstream-to=origin/master master
git add .
git commit -m "注释"
git push

远程仓库非空

分支管理

参考分支管理

  • 查看分支

我们可以通过git branch命令来查看当前仓库有哪些分支,并且可以查看我们处于哪个分支中,如下:

查看分支

这里显示当前仓库只有一个master分支,master前面的*表示我们当前处于这个分支。

  • 创建和切换分支

我们可以利用git branch <分支名>命令来创建一个分支,然后利用git checkout <分支名>来切换分支,如下:

b1分支

可以通过git checkout -b <分支名>创建并切换分支,如下:

b2分支

可以通过git checkout -命令切换回上一分支,如下:

切换回上一分支

  • 合并分支

通过命令git merge <分支名>合并分支。

  • 衍合分支

衍合是合并的一种方式。现在假设从master分支创建branch分支,如下:

分支1

现在向branch分支和master分支分别执行一次提交,如下:

分支2

执行以下两条命令进行分支合并:

git checkout branch

git rebase master

rebase命令在执行的过程中首先将branch分支中的每个commit取消,将这些commit保存为临时patch,然后将branch分支更新为master分支,之后将临时patch应用到branch分支上,此时branch分支将指向新创建的commit,旧的commit将被丢弃,那些将被丢弃的commit在执行git gc命令时被删除。合并后的分支如下图所示:

分支3

在执行git rebase master命令时可能发生冲突。发生冲突有两种解决方案,一种为直接回退到之前的状态,一种为解决冲突后通过git rebase --continue继续提交。