Git是一个分布式代码管理工具
-
中央式:所有的代码保存在中央服务器,所以提交必须依赖网络,并且每次提交都会带入到中央仓库,如果是协同开发可能频繁触发代码合并,进而增加提交的成本和代价。最典型的就是svn
-
分布式:可以在本地提交,不需要依赖网络,并且会将每次提交自动备份到本地。每个开发者都可以把远程仓库clone一份到本地,并会把提交历史一并拿过来。代表就是Git
1.2 文件状态
在Git中文件大概分为三种状态:已修改(modified)、已暂存(staged)、已提交(committed)
-
修改:Git可以感知到工作目录中哪些文件被修改了,然后把修改的文件加入到modified区域
-
暂存:通过add命令将工作目录中修改的文件提交到暂存区,等候被commit
-
提交:将暂存区文件commit至Git目录中永久保存
1.3 commit节点
在Git中每次提交都会生成一个节点,而每个节点都会有一个哈希值作为唯一标示,多次提交会形成一个线性节点链
1.4 HEAD
HEAD是Git中非常重要的一个概念,你可以称它为指针或者引用,它可以指向任意一个节点,并且指向的节点始终为当前工作目录,换句话说就是当前工作目录(也就是你所看到的代码)就是HEAD指向的节点。
1.5 远程仓库
虽然Git会把代码以及历史保存在本地,但最终还是要提交到服务器上的远程仓库。通过clone命令可以把远程仓库的代码下载到本地,同时也会将提交历史、分支、HEAD等状态一并同步到本地,但这些状态并不会实时更新,需要手动从远程仓库去拉取
2分支
当一个分支指向一个节点时,当前节点的内容即是该分支的内容,它的概念和HEAD非常接近同样也可以视为指针或引用,不同的是分支可以存在多个,而HEAD只有一个。通常会根据功能或版本建立不同的分支。
3命令详解
通过命令 add 实现
添加某个文件到暂存区:=====>git add 文件路径
添加所有文件到暂存区:=====>git add .
撤销工作区改动:=======>git checkout -- 文件名
清空暂存区:======>git reset HEAD 文件名
提交 =====>git commit -m "该节点的描述信息"
创建分支=========> git branch 分支名
切换分支========>git checkout 分支名
创建一个分支后立即切换======>git checkout -b 分支名
删除分支======>git branch -d 分支名
合并相关:
常用的合并命令大概有三个merge、rebase、cherry-pick
某个分支或者某个节点的代码合并至当前分支=======>git merge 分支名/节点哈希值
rebase也是一种合并指令=============>git rebase 分支名/节点哈希值
cherry-pick的合并不同于merge和rebase,它可以选择某几个节点进行合并=======>git cherry-pick 节点哈希值
分离HEAD:
在默认情况下HEAD是指向分支的,但也可以将HEAD从分支上取下来直接指向某个节点,此过程就是分离HEAD========>git checkout 节点哈希值
//也可以直接脱离分支指向当前节点
git checkout --detach
由于哈希值是一串很长很长的乱码,在实际操作中使用哈希值分离HEAD很麻烦,所以Git也提供了HEAD基于某一特殊位置(分支/HEAD)直接指向前一个或前N个节点的命令
//HEAD分离并指向前一个节点
git checkout 分支名/HEAD^
//HEAD分离并指向前N个节点
git checkout 分支名~N
将HEAD分离出来指向节点有什么用呢?举个例子:如果开发过程发现之前的提交有问题,此时可以将HEAD指向对应的节点,修改完毕后再提交,此时你肯定不希望再生成一个新的节点,而你只需在提交时加上--amend即可
git commit --amend
回退:
//回退N个提交
git reset HEAD~N ========>reset和相对引用很像,区别是reset会使分支和HEAD一并回退。
clone:
Git中可以通过clone从远程仓库复制一份代码到本地=========>git clone 仓库地址
fetch:
fetch命令就是一次下载操作,它会将远程新增加的节点以及引用(分支/HEAD)的状态下载到本地=======>git fetch 远程仓库地址/分支名
pull:
pull命令可以从远程仓库的某个引用拉取代码======>git pull 远程分支名 =====>>> [其实pull的本质就是fetch+merge,首先更新远程仓库所有状态到本地,随后再进行合并。合并完成后本地分支会指向最新节点]
另外pull命令也可以通过rebase进行合并=======>git pull --rebase 远程分支名
push:
push命令可以将本地提交推送至远程 ========>git push 远程分支名