版本控制系统
git config --global user.name 'name'
git config --global user.email 'email'
# --global 参数:当前机器下所有git仓库均使用此配置
# 创建版本库
mkdir learngit # 创建文件夹
cd learngit # 切换路径
pwd # 显示当前路径
git init # 初使化,将目录变成Git可管理的仓库
# 当前目录下多了.git文件,不可修改,会破坏Git仓库
# 目录是隐藏的,使用命令使其可见
$ ls -ah
# 不一定使用空目录,使用已有目录直接创建也可以
# 删除库
-- 查看目录下的.git
$ ls -a
-- 删除.git
-- 删除后可看到主分支已消失,
$ rm -rf .git
-- rm的参数:-f 强制删除; -r 递归处理,目录下所有文件一并删除
git add readme.txt
git commit -m '有意义的备注:add readme.txt'
git status # 查看文件是否有修改
git diff # 查看文件有哪些差异
# 同上,git add;commit完成修改同步
-- 查看版本库与工作区文件的区别
$ git diff HEAD -- readme.txt
git log # 版本日志
git log --pretty=oneline
git reset --hard HEAD^ # 上一个版本
git reset --hard 版本号
# HEAD 当前版本
# HEAD^ 上一版本
# HEAD^^ 依次类推,上上一版本
# HEAD~100 往前100个版本
cat readme.txt # 读取文件
git relog # 记录每一次命令
# 工作区-暂存区(git add)-版本库
git checkout -- readme.txt # 撤消工作区的修改
git reset HEAD readme.txt # 撤消暂存区,放回工作区
# 1 删除1
rm test.txt # 删除or手动删除
-- 如需删除,仍需删除版本库并提交
git rm test.txt
git commit -m 'remove test.txt'
-- 如误删,则恢复
git checkout -- test.txt
# 2 删除2
git rm test.txt
-- 如需删除,仍需提交
git commit -m '标注' # 提交
-- 如误删,则恢复
git reset HEAD f2.txt
git checkout -- f2.txt
- 远程仓库
注册GitHub账号,设置
-- 目录下有无id_rsa & id_rsa.pub,有则跳过
-- 一路回车默认
-- id_rsa # 私钥
-- id_rsa.pub # 公钥
$ ssh-keygen -t rsa -C "youremail@example.com"
使用公钥连接GitHub账号
# 关联远程库
# 远程库名默认origin
$ git remote add origin git@github.com:githubName/库名.git
# 首次推送
$ git push -u origin master
– SSH连接在第一次验证GitHub服务器的Key时,需要你确认GitHub的Key的指纹信息是否真的来自GitHub的服务器,输入yes回车即可。
– 警告告诉你已经把GitHub的Key添加到本机的一个信任列表里了,只会出现一次;
– 由于远程库是空的,首次推送master分支时加上了 -u 参数,Git不但会把本地的master分支内容推送到新的远程master分支,还会把本地master分支与远程的master分支关联起来,简化以后的远程拉取和推送命令
-- 后续推送
$ git push origin master
# 检测连接情况
# ssh -T github@github.com
- 从远程库克隆到本地库
$ git clone git@github.com:githubName/库名.git
$ git clone https://gitgub.com/githubName/库名.git
$ ls
-- 查看文件夹中文件明细
-- git支持多种协议,包括ssh, https
-- 通过ssh支持的原生Git最快
- 分支
HEAD指向master,master指向提交;
创建新的分支,新建一个指针dev,然后调整HEAD指向dev即可;
合并分支,直接将master直接指向dev当前提交即可;
$ git checkout -b dev
-- -b 创建并切换,相当于下面两条命令
$ git branch dev
$ git checkout dev
-- 查看当前分支,*后
$ git branch
切换分支后可能会看到之前更新的内容不见;不同分支上的内容不一致;
-- 合并分支到当前分支
-- "Fast-forward" 快进模式
$ git merge dev
-- 删除分支
$ git branch -d dev
- 解决冲突:
当git无法自动合并的时候,必须首先手动编辑为我们希望的内容,再提交
-- 查看分支合并图
$ git log --graph
-- 参数--abbrev-commit 即用简短唯一的值
$ git log --graph --pretty=oneline --abbrev-commit
- 分支管理策略
# git会首选 Fast forward模式,但此模式下,删除分支后,会丢掉分支信息
# --no-ff参数 普通模式合并
$ git checkout -b dev
$ git add readme.txt
$ git commit -m "add merge"
$ git checkout master
$ git merge --no-ff -m "merge with no-ff" dev
$ git log --graph --pretty=oneline --abbrev-commit
- master分支应该是非常稳定的,仅用来发布新版本;
- 平时干活在dev分支上,dev分支不稳定,发布版本时再把dev合并到master上
- 每个人都有自己的分支,时不时往dev分支上合并即可
- Bug分支
需临时处理紧急任务时,可将手中任务临时存储起来,待处理完后再回来。
# 储存当前工作现场
$ git stash
# 查看储存的工作现场
$ git stash list
# 恢复工作现场
$ git stash pop
# 等价于下面两个:恢复 + 删除
$ git stash apply stash@{0}
$ git stash drop stash@{1}
- Ferture分支(同bug分支)
新功能开发,新建feature分支,开发完后,合并,删除分支
$ git checkout -b feature-vulcan
$ git add vulcan.py
$ git status
$ git commit -m "add feature vulcan"
$ git checkout dev
$ git merge --no-ff -m "merge feature vulcan"
$ git branch -d feature-vulcan
-- 强行删除
$ git branch -D feature-vulcan
- 多人协作
-- 查看远程库的信息
$ git remote
-- 远程默认为origin
$ git remote -v
-- 推送分支
$ git push origin master
$ git push origin dev
并非所有分支都需推送到远程:
- master分支是主分支,需时刻与远程同步;
- dev分支是开发分支,团队成员都需在上面工作,需时刻与远程同步;
- bug分支只用于本地修复,不需同步;
- feature分支是否推到远程,取决于是否与人协作开发。
- 抓取分支
$ git branch
-- 本地创建和远程分支对应的分支
-- 远程需已创建分支
$ git checkout -b dev origin/dev
-- 建立本地分支与远程分支的关联
$ git branch --set-upstream-to branch-name origin/branch-name
- 多人工作流程:
- 试图用git push origin branck-name推送修改;
- 如推送失败,因远程分支比本地更新,需先git pull
- 如合并冲突,先解决冲突,并在本地提交
- 无冲突or冲突解决后,推送即可
注:如git pull提示no tracking information,则本地分支与远程分支的链接关系未创建,先git branch --set-upstream-to branch-name origin/branch-name。
- rebase
-- 把本地未push的分叉历史整理成直线
-- 查看历史提交的变化时更容易,便于三方对比
$ git rebase
- 标签管理
发布版本时,通常在版本库中打标签(tag),标签是版本库的快照。
标签指向某个指针,是一个有意义的名字,与某个commit绑定,便于记住查找。
- 创建
-- 默认标签当前版本
$ git tag v1.0
-- 查看所有标签
$ git tag
-- 指定版本打标签
$ git tag v0.9 commit_id
-- 查看标签信息
$ git show <tagname>
-- 创建带说明的标签
-- -a指定标签名
-- -m指定说明文字
$ git tag -a v0.1 -m 'version 0.1 released' 1094adb
- 操作
-- 删除
$ git tag -d v0.1
-- 推送标签到远程
$ git push origin v1.0
-- 推送所有本地标签
$ git push origin --tags
-- 如标签已推送至远程,删除
-- 先删除本地标签,再删除远程标签
$ git tag -d v0.1
$ git push origin :refs/tags/v0.1
- Fork 别人的项目到自己的库,通过自己的库参与,如需进一步提交修改,在github上可发起pull request.后等对方接受。
- 码云
-- 关联码云远程库
-- 库名:gitee
$ git remote add origin git@gitee.com:码云用户名/库名.git
$ git remote add github git@github.com:用户名/库名.git
-- 删库
$ git remote -v
$ git remote rm origine
- 使用多个远程库
- 先删除已关联的远程库
- 后先关联 GitHub
- 再关联 码云
-- 推GitHub
git push github master
-- 推码云
git push gitee master
- 自定义Git
-- 颜色
$ git config --global color.ui true
- 忽略特殊文件
创建.gitignore文件,将需要忽略的文件备注进去
eg.配置文件*.conf
.gitignore文件放入版本库进行管理
-- 强制添加
$ git add -f 文件
-- 查看哪个规则需要修改
$ git check-ignore -v 文件
- 配置别名
--global 全局参数
$ git config --global alias.st status
$ git config --global alias.co checkout
$ git config --global alias.ci commit
$ git config --global alias.br branch
$ git config --global alias.unstage 'reset HEAD'
-- 最后一次提交信息
$ git config --global alias.last 'log -1'
仓库的配置文件放于.git/config
当前用户的配置文件放于主目录下的.gitconfig