Git
git是一个分布式版本控制软件,最初由林纳斯·托瓦兹创作,于2005年以GPL发布。最初目的是为更好地管理Linux内核开发而设计。
林纳斯·托瓦兹自嘲地取了这个名字“git”,该词源自英国俚语,意思大约是“混账”。
I'm an egotistical bastard, and I name all my projects after myself. First Linux, now git.
实现原理
git更像一个文件系统,直接在本机上获取数据,不必连线到主机端获取数据。 每个开发者都可有全部开发历史的本地副本,changes从这种本地repository复制给其他开发者。这些changes作为新增的开发分支被导入,可以与本地开发分支合并。
分支是非常轻量级的,一个分支仅是对一个commit的引用。
git是用C语言开发的,以追求最高的性能。git自动完成垃圾回收,也可以用命令
git gc --prune
直接调用。git存储每个新创建的object作为一个单独文件。为了压缩存储空间占用, packs操作把很多文件(启发式类似名字的文件往往具有类似内容)使用差分压缩入一个文件中(packfile),并创建一个对应的索引文件,指明object在packfile中的偏移值。新创建的对象仍然作为单独文件存在。repacks操作非常费时间,git会在空闲时间自动做此操作。也可用命令
git gc
来直接启动repack。packfile与索引文件都用SHA-1作为校验和并作为文件名。git fsck
命令做校验和的完整性验证。Git服务器典型的TCP 监听端口为9418。
库目录
- hooks:存储钩子的文件夹
- logs:存储日志的文件夹
- refs:存储指向各个分支的指针(SHA-1标识)文件
- objects:存放git对象
- config:存放各种设置文档
- HEAD:指向当前所在分支的指针文件路径,一般指向refs下的某文件
基本概念
我们先来理解下Git 工作区、暂存区和版本库概念
- 工作区 (working directory):就是你在电脑里能看到的目录。
- 暂存区 (staging index):英文叫stage, 或index。一般存放在 ".git目录下" 下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
- 版本库 (git diretory[Repository]):工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
Git 安装
git 支持windows、MAC OS X、Linux/Unix 全平台
windows/Mac 官网下载:https://www.git-scm.com/download/
Ubantu:sudo apt-get install git
CentOS:sudoyum install git
检查是否安装成功:git --version
查看git版本
Git基本命令
-
git init
初始化本地git仓库(执行命令所在的目录下出现 .git 文件) -
git add
-
git add filename
将文件添加到暂存区 -
git add .
将工作目录下的所有修改的文件添加到暂存区
-
-
git commit
-
git commit -m 'description'
将暂存区的文件提交到版本库 -
git commit -am 'description'
跳过git add 添加到暂存区命令,直接将工作区所有已跟踪的文件提交
-
-
git log
显示所有提交操作log-
git log --oneline
将所有提交信息在一行内显示 -
git log -1 -p
-p显示修改内容 -
gik
图形化显示日志信息 git log --oneline --grap
-
-
git status
查看项目文件状态 -
git config
-
git config --global user.name test
添加用户身份象征username -
git config --global user.email 123456@qq.com
添加用户邮箱 -
git config --lsit
查看配置信息 -
~/.gitconfig
配置文件位置
-
Git状态
- git 中文件的4种文件状态
-
Untracked
未被追踪 -
Modified
表示工作区修改了某个文集但是还没有添加到暂存区 -
Staged
表示把工作区修改的文件添加到了暂存区但是还没有提交到版本库 -
Committed
表示数据安全的存储在本地库中
-
Git撤销操作
-
git commit --amend
撤销上一次提交并将暂存区的文件重新提交 -
git checkout --filename
拉取暂存区的文件并将其替换工作区的文件 -
git reset HEAD filename
拉取最近一次提交的版本库中的这个文件到暂存区,该操作不影响工作区 -
git reset --option 版本号
-
--hard
回退暂存区和工作区到指定版本号 -
--mixed
回退版本库和暂存区到指定版本号 -
--soft
只回退版本库到指定版本
-
Git 文件删除
-
git rm filename
- 删除工作区及暂存区中的该文件相当于删除后执行
git add
-
git rm --cached filename
在不小心将不需要追踪的文件添加到暂存区,想删除暂存的文件但是不想删除工作区的文件 -
git rm -f filename
当工作区或者暂存区文件修改了(防止修改误删除了) -
giob模式
- 星号(*)匹配零个或多个任意字符
- [abc] 匹配任何一个列在方括号中的字符
- 问号(?)只匹配一个任意字符
- [0-9] 、[a-z] 匹配范围
-
git mv oldname newname
相当于- mv oldname newname
- git rm oldname
- git add newname
- 删除工作区及暂存区中的该文件相当于删除后执行
-
git 分支的创建、删除、切换、删除
-
git branch
查看分支 -
git branch branchname
创建分支 -
git branch -m oldname newname
修改分支名称 -
git checkout [-b] branchname
切换分支 -
git branch -D branchname
删除分支
-
分支的合并
- 分支的指针 HEAD指针指向当前工作的分支 在切换分支是指向新的分支
-
git diff
-
git diff
比较工作区与暂存区文件的差异 -
git diff --staged
比较暂存区与版本库的文件差异 -
git diff 版本号 版本号
比较分支内的两个版本的差异 -
git diff 分支 分支
比较两个分支的最新提交版本的差异
-
- git merge branchname 合并之前需要先切换到master分支,快速合并和冲突合并
存储变更
git stash
git stash list
-
git stash apply stash@num
git stash apply 后面不加名字,则应用最近一次存储信息 -
git stash drop stash@num
git stash apply 只是运用存储的信息,并不删除它,drop 命令可以删除它
Github上的仓库
- 创建github账号
- 创建仓库
- clone仓库到本地
- 本地push到仓库
- pull代码到本地
- ignoing files 想忽略不想被追踪的文件,只需要将文件名字添加到
.gitignore
文件内,Git就会自动忽略这些文件 - fork and pull request
远程服务器上的仓库
-
git init --bare
创建远端仓库(在服务器或者工程目录以外路径都可以创建的备份仓库) -
git remote
查看当前配置了哪些远程仓库 -
git remote add name path
要添加一个新的远程仓库,可以指定一个简单的名字 -
git remote rm name
删除远程仓库 -
git remote rename oldname newname
重命名远程仓库名 -
git fetch
从远程仓库下载新分支与数据 ,该命令执行完后需要执行git merge 远程分支到你所在的分支。
Git ssh免密登录
ssh-kegen
-
ssh-copy-id user@host
将本机的公钥复制到远程服务器的authorized_key
文件中 - 如果不是自己的服务器可以将本地公钥发给服务器管理员 添加在
authorized_keys
文件后面