分布式版本控制
- 集中式版本控制系统
版本库集中存放在中央服务器,中央服务器保存着最新最全的版本信息
问题在于必须联网才能正常工作
- 分布式版本控制系统
放弃“中央服务器”,每个分布式节点都是完整的版本库
设置
git config --global user.name "name"
git config --global user.email "email"
其中,config命令的--global参数,表示这台机器上的所有Git仓库都会使用这个配置。
也可以对某个仓库制定不同的用户名和Email地址。
创建版本库
git init //将目录变成Git仓库,然后git会在当前目录下生成.git目录,用于跟踪管理版本库
git add filename or filename list //添加文件到库中
git commit -m "comments" //提交,**-m**是本次提交的说明
版本管理
- git status
查看结果,显示仓库当前的状态,查看文件的修改情况
- git diff filename
查看difference,显示修改内容
- git log
查看从最近到最远的提交日志,可以加上--pretty=oneline减少输出信息
Git中,用HEAD表示当前版本,上一个版本为HEAD^,上上一个版本就是HEAD^^,多个^可以简写,如HEAD~2
- git reset
git reset --hard HEAD^ //退回上一个版本
git reset --hard serialno //serialno为commit id
- git reflog
记录每一次命令
- 工作区和暂存区
工作区中隐藏目录.git是Git的版本库,包括了称为stage(或者index)的暂存区,以及分支,以及指向master的指针HEAD。
向Git版本库添加文件,分两步执行
- 用
git add
把文件添加进去,将文件修改添加到暂存区 - 用
git commit
提交更改,将暂存区的所有内容提交到当前分支
每次修改,如果不
add
到暂存区,也就不会加入到commit
中
- git check -- filename
丢弃工作区的修改,--
很重要,否则就变成了切换到另一个分支
- file自修改后还没有被放到暂存区,撤销修改回到和版本库一模一样的状态
- file已经添加到暂存区,又作了修改,撤销修改就回到添加暂存区后的状态
也就是让文件回到最近一次
git commit
或者git add
时的状态
git reset
可以把暂存区的修改回退到工作区,HEAD
表示最新版本。
git reset HEAD file //撤销暂存区的修改
- git rm filename
将文件从版本库中删除,git checkout -- file
可以将误删除的文件找回
远程仓库GitHub
- 准备
本地Git仓库和GitHub仓库之间通过SSH加密传输,进行验证设置
- 创建SSH Key
ssh-keygen -t rsa -C "email"
在主目录找到.ssh
目录,里面有生成的id_rsa
(私钥)和id_rsa.pub
(公钥)两个文件
- 登录GitHub,将SSH Key添加
id_rsa,pub
文件的内容
- 添加远程仓库
git remote add origin git@github.com:XXX/XXX.git //origin设置为远程库的名字
git push -u origin master //将本地库的内容推送到远程,-u参数,Git会把本地master分支内容推送至远程新的master分支,并对master分支进行关联
后续推送执行执行git push origin master
即可
- clone远程库
git clone git@github.com:XXX/XXX.git
分支管理
Git无论创建、切换和删除分支,十分迅速
创建与合并分支
Git通过指针使得分支的创建和合并简洁迅速
git checkout -b dev //-b参数表示创建并切换分支
git checkout master //切回master
git merge dev //合并指定分支到当前分支
git branch -d dev //删除分支
- 查看分支
git branch
- 创建分支
git branch <name>
- 切换分支
git checkout <name>
- 创建+切换分支
git checkout -b <name>
- 合并某分支到当前分支
git merge <name>
- 删除分支
git branch -d <name>
管理策略
当Git无法自动合并分支时,需要首先解决冲突,然后再提交,合并完成
用git log --graph
可以看到分支合并图
合并分支时,Git会尽可能用Fast forward
模式,删除分支后,会丢掉分支信息,禁止该模式(加上--noff
参数)时,Git在merge时生成一个新的commit,从而,从分支历史上就可以看出分支信息。
git checkout -b dev
//修改file
git add filename
git commit -m "add merge"
git checkout master
git merge --no-ff -m "merge with no-ff" dev
分支原则:
- master分支应该是稳定的,仅用来发布新版本
- 开发在其他分支上
Bug分支
- git
stash
将当前工作现场“储藏起来”
用git stash list
查看保存的工作现场
恢复的方式有两种:
- git stash apply ‘stash’内容不删除,删除使用git stash drop
- git stash pop,恢复的同时把stash内容也删了
多次stash,恢复用git stash list
查看,然后恢复指定的stash
git stash apply stash@{0}
Feature分支
开发一个新的feature,最好新建一个分支
如果要丢弃一个没有被合并的分支,通过git branch -D <name>
强行删除
多人协作
从远程仓库clone时,Git自动把本地master分支和远程的master分支对应起来,远程仓库的默认名称是origin
git remote
查看远程库的信息
git remote -v
显示更详细的信息
- 推送分支
把该分支上的所有本地提交推送到远程库
git push origin master
- master主分支,时刻与远程同步
- dev开发分支,与远程同步
- 抓取分支
git push origin branch-name
- 如果推送失败,
git pull
合并 - 如果合并有冲突,解决冲突,在本地提交
- 再次'git push origin branch-name'
如果'git pull'提示“no tracking information”,说明本地分支和远程分支的链接关系没有创建,使用命令
git branch --set-upstream branch-name origin/branch-name
标签管理
发布一个版本时,通常现在版本库中打一个标签,标签是版本库的一个快照
Git中,标签是指向某个commit的指针,从而,创建和删除标签都是瞬间完成的
创建标签
git tag <name>
git tag
查看标签
git branch
git checkout master
git tag v1.0
默认标签打在最新的commit上
如果忘了打tag,可以通过历史提交的commit id,然后打上
git log --pretty=oneline --abbrev-commit
git tag v0.9 "id"
git show <tagname>
查看标签信息
可以通过-s
用私钥前面标签...
标签操作
删除标签 git tag -d v1.0
推送标签到远程 git push origin <tagname>
推送全部尚未推送的本地标签 git push origin --tags
删除远程标签
- 先从本地删除,git tag -d v0.9
- 从远程删除push, git push origin :refs/tags/v0.9
自定义Git
- 配置颜色
git config --global color.ui true
- 忽略特殊文件
在工作区的根目录下创建一个特殊的.gitignore
文件
忽略文件的原则
- 忽略操作系统自动生成的文件
- 忽略编译生成的中间文件、可执行文件、自动生成的文件等
- 忽略带有敏感信息的配置文件
配置别名
git config --global alias.logcolor "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev -commit"
每个仓库的Git配置文件放在.git/config
中
参考链接: 廖雪峰的官方网站