版本控制系统
- 集中式 : 版本库存放在中央服务器,先从中央服务器取得最新的版本,然后开始工作
- 分布式 : 每个人电脑都是一个完整的版本库,安全性高,一台坏掉了也不要紧
初始化
1 | git config --global user.name "×××" |
会在~ 目录生成一个.gitconfig
如果你想不是global,则不带–global即可,会在本项目目录下创建.git/config
git init
初始化一个git project
git diff --cached
查看缓存区里有哪些文件被修改了。git diff
会显示所有已做但是没有加到缓存区的修改
add 和commit操作不赘述,commit操作后-a
将所有没有加到缓存区的修改也一起提交,不过不会提交新文件
git remote add origin https://github.com/myname/myproject.git
git push origin master
分支与合并
分支在多人协作开发用的多,比如你负责的一个功能需要一个月完成,就可以创建一个分支,只把功能代码提交到这个分支上,最后合并到master分支上
git branch experimental
创建分支
git branch
查看分支
结果:
1 | * experimental |
git checkout experimental
切换到其他分支
1 | # 将experimental分支合并到master |
如果有冲突,比如两个分支都修改了同一个文件,就会merge失败,这是在master分支修改对应文件再commit即可。
当我们完成分支,可以用git branch -d experimental
来删除(只能删除已经合并了的分支,强行删除用-D
)
如果你觉得合并错了,可以回到合并前的状态
git reset --hard HEAD^
Git 日志
git log
git log --stat
会显示哪些文件被修改
git log --pretty=oneline
会一行显示一条信息
git log --pretty=short
显示简短信息
git log --graph -pretty=oneline
画一个漂亮的历史
git diff
git diff不仅仅能查看两个文件的差别,也可以看两个branch的区别。
git diff anotherbranch
+ 表示本分支比anotherbranch分支多的,- 表示本分支少的
分布式工作流程
如果要经常操作远程分支,可以定义缩写
git remote add myrepo /tmp/myrepo
git pull 相当于两个操作:使用git fetch抓取最新的修改信息,然后git merge
为什么不需要指定远程仓库?
因为Git把远程地址存到了配置文件的remote.origin.url
git 也可以是服务器的地址:
git clone ssh://服务器/账号/仓库名称
git push ssh://服务器仓库地址 master:master
Git Tag
轻量级标签
git tag tagname 8c2940
git tag
标签对象
git tag -a stable-2 8c315325 -m "stable 2"
签名标签
签名标签可以让提交和标签更加完整可信
git ignore
.gitignore 来忽略不需要提交的文件
1 | *.html |
重置
git reset --hard HEAD^
回到上次提交的状态
git checkout -- hello.rb
恢复一个文件
git revert HEAD
撤销最近的一次提交
建设私有仓库
ssh
可以导出一个裸仓库,然后用scp命令拷贝到服务器上
1 | git clone --bare /home/user/myrepo/.git /tmp/myrepo.git |
对于其他人来说,直接
git clone myserver:com:/opt/git/myrepo.git