Git简介
- Git是什么?
分布式版本控制系统. - 什么是版本控制系统?
什么是版本控制系统(VCS)?
什么是版本控制?
比较局限的理解: 代码管理工具. - 为什么要用版本控制系统?
为什么要使用版本控制系统?
比较局限的理解: 管理代码 - 集中式和分布式版本控制系统有什么区别呢?
集中式vs分布式
比较局限的理解:
集中式: 只有中央服务器能进行版本管理;
分布式: 每个节点都能进行版本管理.
基本使用
- 安装Git
安装完成后需要配置一下name和email.
git config --global user.name csdn
git config --global user.email csdn@cn.com
- 创建版本库
什么是版本库?
git init
- 把文件添加到版本库
git add和git commit的区别
工作区和暂存区
git add ream.txt
git commit -m "worte a readme file"
- 查看仓库状态
git status
- 查看具体修改
git diff readme.txt
- 显示提交历史
git log
git log --pretty=oneline
- 版本回退
git reset --hard HEAD^
- 查看命令历史
git reflog
管理修改
为什么Git比其他版本控制系统设计得优秀?
因为Git跟踪并管理的是修改, 而非文件.丢弃工作区的修改
git checkout其实是用版本库里的版本替换工作区的版本, 无论工作区是修改还是删除, 都可以“一键还原”.
git checkout -- readme.txt
- 丢弃暂存区的修改
git reset HEAD readme.txt
- 删除文件
rm test.txt
git rm test.txt
git commit -m "remove test.txt"
远程仓库
- 关联远程仓库
git remote add origin git@github.com:csdn/studygit.git
- 关联后推送master分支
// 由于远程库是空的, 我们第一次推送master分支时, 加上了-u参数.
// Git不但会把本地的master分支内容推送的远程新的master分支, 还会把本地的master分支和远程的master分支关联起来, 在以后的推送或者拉取时就可以简化命令.
git push -u origin master
- 推送最新修改
git push origin master
- 从远程库克隆
git clone git@github.com:csdn/study2.git
分支管理
- 创建与合并分支原理
- 创建分支与切换分支
// 创建并切换分支
git checkout -b dev
// 创建分支
git branch dev
// 切换分支
git checkout dev
- 查看当前分支
git branch
- 合并指定分支到当前分支
git merge dev
- 删除分支
git branch -d dev
- 查看分支合并图
git log --graph --pretty=oneline --abbrev-commit
git log --graph --pretty=oneline --abbrev-commit
- 禁用Fast forward
什么时候用到这个禁用Fast forward?
通常, 合并分支时, 如果可能, Git会用Fast forward模式, 但这种模式下, 删除分支后, 会丢掉分支信息.
git merge --no-ff -m "merge with no-ff" dev
- Bug分支
// 临时保存现场
git stash
// 查看保存的工作现场
git stash list
// 恢复现场
// 方法一
git stash apply stash@{0}
git stash drop stash@{0}
// 方法二
git stash pop
- Feature分支
开发一个新feature, 最好新建一个分支;
如果要丢弃一个没有被合并过的分支, 可以通过git branch -D <name>强行删除.
// 查看远程库的信息
git remote
// 显示更详细的信息
git remote -v
// 推送分支
git push origin master
// 抓取分支
git pull
多人协作的工作模式通常是这样:
首先, 可以试图用git push origin <branch-name>推送自己的修改;
如果推送失败, 则因为远程分支比你的本地更新, 需要先用git pull试图合并;
如果合并有冲突, 则解决冲突, 并在本地提交;
没有冲突或者解决掉冲突后, 再用git push origin <branch-name>推送就能成功!
如果git pull提示no tracking information, 则说明本地分支和远程分支的链接关系没有创建, 用命令git branch --set-upstream-to <branch-name> origin/<branch-name>.
- Rebase
rebase操作可以把本地未push的分叉提交历史整理成直线;
rebase的目的是使得我们在查看历史提交的变化时更容易, 因为分叉的提交需要三方对比.
git rebase
标签管理
- 几个思考
创建和删除标签都是瞬间完成的, 为什么?
因为标签就是指向某个commit的指针, 跟分支很像, 但是分支可以移动, 标签不能移动.
Git有commit, 为什么还要引入tag?
- 创建标签
// 查看标签
git tag
// 打一个新标签
git tag v1.0(默认为HEAD)
git tag v0.9 f52c633
git tag -a v0.1 -m "version 0.1 released" 1094adb
// 查看说明文字
git show v0.1
- 操作标签
// 删除标签
git tag -d v0.1
// 推送某个标签到远程
git push origin v1.0
// 一次性推送全部尚未推送到远程的本地标签
git push origin --tags
// 删除远程标签
// 1.先从本地删除
git tag -d v0.9
// 2.然后从远程删除
git push origin :refs/tags/v0.9
自定义Git
- 显示颜色
git config --global color.ui true
- 忽略特殊文件
在Git工作区的根目录下创建一个特殊的.gitignore文件, 然后把要忽略的文件名填进去, Git就会自动忽略这些文件.
忽略文件的原则:
忽略操作系统自动生成的文件, 比如缩略图等;
忽略编译生成的中间文件, 可执行文件等, 也就是如果一个文件是通过另一个文件自动生成的, 那自动生成的文件就没必要放进版本库, 比如Java编译产生的.class文件;
忽略你自己的带有敏感信息的配置文件, 比如存放口令的配置文件.
// .gitignore写得有问题, 需要找出来到底哪个规则写错了, 可以用git check-ignore命令检查
git check-ignore -v App.class
- 配置别名
git config --global alias.st status
配置Git的时候, 加上--global是针对当前用户起作用的, 如果不加, 那只针对当前的仓库起作用.
// 配置文件在哪?
每个仓库的Git配置文件都放在.git/config文件中
而当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig中
第一步,安装git
sudo apt-get install git
第二步,创建一个git用户,用来运行git服务
sudo adduser git
第三步,创建证书登录
收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub文件,把所有公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个.
第四步,初始化Git仓库
sudo git init --bare sample.git
sudo chown -R git:git sample.git
第五步,禁用shell登录
第六步,克隆远程仓库
最后一次修改时间: 2018-5-22 20:47:02