Git是流行的分布式版本控制系统,可以方便的管理多人协作的项目并避免了集中式版本控制系统对服务器的依赖。
简介
版本库(repository)是一个由Git管理的目录,Git将跟踪工作目录下文件的修改并在需要时还原.
在工作目录下.git
子目录则维护着版本库 .
Git维护三个组件:
-
工作目录: 保存实际文件
-
暂存区 : 保存尚未提交的修改
-
版本库: 保存已提交的修改
-
HEAD: 指向最后一次提交后的结果(checkout 命令的主要功能就是操作HEAD)。
Git将每次提交的修改串成一条时间线,称为一个分支,Git中主分支被称为master.
分支系统允许多人同时修改项目. 在进行重大改动时, 分支将其与master分隔便于管理和保护.
Git是分布式版本控制系统,同一个Git仓库可以分布到不同的机器上. 远程仓库可以让用户读取或者更新其它机器上的版本库.
常用指令
-
$ git init
: 创建本地仓库 -
$git init --bare
: 创建没有工作区(和暂存区)的裸仓库, 一般用作远程仓库使用. -
$ git config
: 配置 -
$ git log
: 查看日志 -
$git log --graph
: 显示分支图 -
$ git add <file>
: 添加文件 -
$ git add .
: 添加所有文件 -
$ git rm <file>
: 删除文件 -
$ git rm --cached [file]
: 从暂存区删除文件,不从工作区删除 -
$ git mv [file-original] [file-renamed]
: 重命名 -
$ git commit -m <msg>
提交修改 -
$ git commit --amend
重新进行上一次提交 -
$ git diff
查看工作区所有文件的更改 -
$ git diff file
查看指定文件的更改
撤销
-
$ git checkout -- [file]
恢复暂存区的指定文件到工作区 -
$ git checkout [commit] [file]
恢复某个commit的指定文件到暂存区和工作区 -
$ git checkout .
恢复暂存区的所有文件到工作区 -
$ git reset [file]
重置暂存区的指定文件,与上一次commit保持一致,但工作区不变 -
$ git reset --hard
重置暂存区与工作区,与上一次commit保持一致 -
$ git reset [commit]
重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变 -
$ git reset --hard [commit]
重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致 -
$ git reset --keep [commit]
重置当前HEAD为指定commit,但保持暂存区和工作区不变 -
$ git revert [commit]
新建一个commit,用来撤销指定commit,后者的所有变化都将被前者抵消,并且应用到当前分支
分支命令
-
$ git branch
查看本地分支 -
$ git branch -r
: 查看远程分支 -
$ git branch [name]
: 创建本地分支,注意新分支创建后不会自动切换为当前分支 -
$ git checkout [name]
: 切换分支 -
$ git checkout -b [name]
: 创建新分支并立即切换到新分支 -
$ git branch -d [name]
: 删除分支 .-d
选项只能删除已经参与了合并的分支,对于未有合并的分支是无法删除的. 如果想强制删除一个分支,可以使用-D
选项 -
$ git merge [branch]
: 合并分支, 将名称为[branch]的分支与当前分支合并. 会产生一次 -
$git rebase [branch]
: 重写分支历史
操作之前的情况:
merge之后:
rebase之后:
更多资料可以参考: 代码合并:Merge、Rebase-的选择
远程仓库
-
$ git clone git://github.com/jquery/jquery.git
克隆远程仓库 -
$ git pull [remoteName] [localBranchName]
拉取远程分支 -
$ git checkout -b [localBranchName] [remoteName]
拉取本地不存在的远程分支 -
$ git push [remoteName] [localBranchName]
推送更改到远程分支, 若远程仓库不存在相应分支则自动创建. -
$ git push [remoteName] [localBranchName] --force
强制推送,将远程分支的所有提交设置为和本地分支同样的状态。可能彻底删除远程分支上的提交。 -
$ git remote -v
查看远程仓库 -
$ git remote add [name] [url]
添加远程仓库 -
$ git remote rm [name]
删除远程仓库 -
$ git remote set-url --push [name] [newUrl]
修改远程仓库
标签
-
$ git tag
列出所有tag -
$ git tag [tag]
在当前commit新建一个tag -
$ git tag [tag] [commit]
在指定commit新建一个tag -
$ git tag -d [tag]
删除本地tag -
$ git push origin :refs/tags/[tagName]
删除远程tag -
$ git show [tag]
查看tag信息 -
$ git push [remote] [tag]
提交指定tag -
$ git push [remote] --tags
提交所有tag -
$ git checkout -b [branch] [tag]
新建一个分支,指向某个tag
配置SSH
在与远程仓库通信时可以使用Https和ssh两种方案, Https通过账号密码认证用户使用不便,SSH由系统保管私钥更为方便.
首先在系统中安装ssh工具, 生成sshkey:
ssh-keygen -t rsa -C "git@git.oschina.net"
添加sshkey到ssh-agent:
ssh-add ~/.ssh/id_rsa
查看公钥:
cat ~/.ssh/id_rsa.pub
将公钥添加到远程仓库.
使用ssh连接登录:
ssh -T git@git.oschina.net
注意远程仓库必须使用ssh才可以正常的使用ssh-key进行操作, 使用https的仓库无法使用ssh-key认证。