Git
Git是什么?
Git
是一个免费且开源的分布式版本控制系统。
SVN和Git区别
Git理论基础
将文件保存到Git
时,所有数据都要进行内容的校验和(checksum
)计算,并将此结果作为数据的唯一标识和索引。Git使用SHA-1
算法计算数据的校验和,通过对文件的内容或目录的结构计算出一个SHA-1
哈希值,作为指纹字符串。该字符串由40个十六进制字符组成,所有保存在Git
数据库中的内容都是用此哈希值来做索引的,而不是靠文件名。
在Git
中,文件有三种状态:
已提交(
committed
):表示该文件被保存到本地仓库,例如使用commit
后的状态。已修改(
modified
):表示本地仓库中的文件被修改了,但还没有提交保存,例如Git
管理的文件被修改,但未使用add
操作或commit
操作时的状态。已暂存(
staged
):表示把已修改的文件放到下次提交时要保存的清单中,例如使用add
操作将文件添加到暂存区,等待使用commit
操作提交保存到本地仓库中。
Git
中的三个工作区域:
工作目录:本地实际操作的目录空间。
暂存区:新修改或新添加的文件暂时存储的空间,这个区域的文件等待被提交或保存到本地仓库。
本地仓库:存储变更的记录及文件。
三个工作区域之间的转换关系:
Git分支
切换分支
Git
中分支,本质上仅仅是一个指向commit
对象的可变指针。如图:
Git
中有一个HEAD
指针,它总是指向当前所在的本地分支,Git
中分支的切换就是移动HEAD
指针,指向对应的分支,如图:
分支合并
下图中master
主干分支上有C0
、C1
、C2
和C4
四次提交,同时以C2
为基线创建了iss53
分支,并且在iss53
分支上做了C3
和C5
两次提交。
此时如果直接把iss53
分支合并到master
主干分支,就会生成一个合并提交C6
,并且此时master
指向这个commit
对象,这就是分支合并。
远程仓库和远程分支
Git
在本地仓库存储了所有的文件和操作记录,Git
在本地的这些版本镜像和操作记录,如果没有push
,最终也只是保存到了本地仓库中,push
必须要在远程Git
服务器上有一个对应的远程仓库,这个远程仓库的结构和你本地仓库是一样的,这样其他人就可以通过这个远程仓库下载你在本地操作的变更了,Git
默认的远程仓库名称是origin
。
本地分支如果想推送到远程Git
服务器,必须要在远程Git
服务器上有一个相应的远程分支接应,这样远程分支就包含了本地分支推送的内容。
Git常规使用
查看帮助信息
1 | git help |
配置用户名和用户邮箱
1 | git config --global user.name xiaoshan |
下载远程仓库目录至本地
1 | git clone git@xxx.xxx.xxx:user/demo.git |
查看文件变更的状态
1 | git status |
该命令会显示有没有变更,哪些文件变更了,处在什么状态,同时有相应的操作提示。
将文件的内容添加到暂存区
1 | git add file_name #将指定文件的变更添加 |
查看文件之间的变更差异
1 | git diff #查看未暂存和已提交快照之间的差异 |
将文件的变更提交至本地仓库
1 | git commit [file1] [file2] ... -m [message] |
将本地仓库的变更推送到远程仓库
1 | git push <远程仓库名> <本地分支名> <远程分支名> |
拉取远程仓库的变更到本地(不主动合并)
1 | git fetch #当前分支只有一个远程分支,主机名都可以省略 |
分支合并
1 | git merge <分支名> #将某个分支上的代码合并到当前分支 |
拉取远程仓库的变更到本地(主动合并)
1 | git pull [remote] [branch] #remote为远程仓库,branch为远程分支,这两个参数都可以省略,省略则默认拉取已经追踪的远程仓库的远程分支的文件 |
丢弃未加入到缓存区的修改
1 | git checkout -- filename #丢弃某个文件的变更 |
切换分支
1 | git ckeckout <分支名> |
删除Git中内容
1 | git rm xxx #从已跟踪文件清单中移除,会删除文件 |
撤销操作
未add撤销
1 | git checkout xxx |
add后,未commit撤销
1 | git reset HEAD xxx #撤销指定文件修改 |
commit后撤销
1 | git reset --soft HEAD^ #撤销commit回到前一个版本,不撤销git add,不清空改动 |
恢复到某一次提交
1 | git reset --hard commitid |
本地代码同步线上最新版本(会覆盖本地所有与远程仓库同名的文件)
1 | git fetch --all && git reset --hard origin/master && git pull |
查看提交历史
1 | git log |
变更隐藏和恢复
1 | git stash save "save message" #将变更暂时存储并隐藏,不包含未被追踪的文件 |
常规操作图示