Git 使用大全
用户配置
配置个人的用户名称和电子邮箱地址:
# 系统设置
$ git config --system user.name "userName"
$ git config --system user.email "user@email.com"
# 全局设置(当前用户)
$ git config --global user.name "userName"
$ git config --global user.email "user@email.com"
# 仓库设置(当前仓库)
$ git config --local user.name "userName"
$ git config --local user.email "user@email.com"
文本编辑器
# 设置一个叫 emacs 的默认文本编辑器
$ git config --global core.editor emacs
差异分析工具
# 设置一个叫 vimdiff 的默认差异化分析工具
$ git config --global merge.tool vimdiff
查看配置信息
# 全部
$ git config --list
# 局部
$ git config --local --list
# 查看某个变量
$ git config user.name
基本概念
- 工作区:就是项目工程的目录
- 暂存区:英文叫stage, 或index。一般存放在 “.git目录下” 下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)
- 版本库:工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库
Git 创建仓库
# 初始化,该命令会在当前文件夹生成一个 .git 目录
$ git init
# 指定一个目录作为初始化
$ git init newTest
添加修改或增加的内容到本地版本库
$ git add *.c
$ git add README
$ git commit -m "第一次提交"
克隆
# 参数说明:repo:Git 仓库 directory:本地目录
$ git clone <repo>
$ git clone <repo> <directory>
git status
# git status 以查看在你上次提交之后是否有修改
$ git status
# -s 参数,以获得简短的结果输出
$ git status -s
git diff
# 尚未缓存的改动,多个文件比较
$ git diff
# 查看已缓存的改动
$ git diff --cached
# 查看已缓存的与未缓存的所有改动
$ git diff HEAD
# 显示摘要而非整个 diff
$ git diff --stat
# 将工作区中的文件和暂存区文件进行比较
$ git diff <文件名>
# 将工作区的文件和本地库历史版本进行比较
$ git diff <本地库版本><文件名>
git commit
$ git commit -m '第一次版本提交'
git reset HEAD
# git reset HEAD** 命令用于取消已缓存的内容
$ git reset HEAD hello.php
删除
# 正常移除
$ git rm <file>
# 如果删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项 -f
$ git rm -f <file>
# 文件从暂存区域移除
$ git rm --cached <file>
git mv
移动或重命名文件
Git 分支管理
# 创建分支
$ git branch <branch name>
# 切换分支
$ git checkout <branch name>
# 合并到当前分支
$ git merge <branch name>
# 删除分支
$ git branch -d <branch name>
# 查看分支
$ git branch -v or git branch
合并冲突
# 解决完冲突后,执行以下命令
$ git add .
$ git commit
Git 查看提交历史
# 最完整显示
$ git log
# 简洁显示历史
$ git log --oneline
# 开启了拓扑图
$ git log --graph
# 逆向显示日志
$ git log --reverse --oneline
# 查找指定用户日志, -5 是显示 5 条记录的意思
$ git log --author=<name> --oneline -5
# 指定日期查询, --no-merges 选项以隐藏合并提交,可以执行几个选项:--since 和 --before,但是你也可以用 --until 和 --after
$ git log --oneline --before={3.weeks.ago} --after={2010-04-18} --no-merges
# 以漂亮的格式显示历史提交信息
$ git log --pretty=oneline
# 多了指针显示
$ git reflog
Git 标签
# 带注解的标签
$ git tag -a v1.0.0
# 查看标签
$ git tag
# 指定标签信息命令
$ git tag -a <tagname> -m "标签"
# PGP签名标签命令
$ git tag -s <tagname> -m "标签"
Git 远程仓库
# 要添加一个新的远程仓库,可以指定一个简单的名字,以便将来引用
$ git remote add <shortname> <url>
# 查看当前的远程库
$ git remote
# 执行时加上 -v 参数,你还可以看到每个别名的实际链接地址
$ git remote -v
提取远程仓库
# 从远程仓库下载新分支与数据,命令执行完后需要执行git merge 远程分支到你所在的分支
$ git fetch
# 从远端仓库提取数据并尝试合并到当前分支
$ git merge
推送到远程仓库
$ git push <alias> <branch>
删除远程仓库
$ git remote rm [别名]
版本回退
$ git reset --hard <局部索引值>
# 只能往后退 ^ 向后退一个版本,^ 有几个就退几个版本
$ git reset --hard HEAD
$ git reset --hard HEAD^
$ git reset --hard HEAD^^
$ git reset --hard HEAD^^^
# 后退一个版本
$ git reset --hard HEAD~1
# 后退两个版本
$ git reset --hard HEAD~2
# reset 命令的三个参数对比
# --soft 仅仅在本地库移动 HEAD 指针
# --mixed 在本地库移动 HEAD 指针,重置暂存区
# --Hard 在本地库移动 HEAD 指针,重置暂存区,重置工作区
本地库与远程库交互
# 查询有哪些远程库
$ git remote -v
# 添加远程仓库和别名
$ git remote add origin <远程仓库地址>
# 推送本地库到远程库
$ git push origin master
# 克隆
$ git clone <远程仓库地址>
# 抓取远程仓库 origin 地址别名 master 远程仓库主要分支
$ git fetch origin master
# 切换远程仓库的 master
$ git checkout 'origin/master'
# 远程的 master 合并到本地的 master
$ git merge 'origin/master'
# git pull == git fetch + git merge
# 冲突解决
SSH
$ ssh-keygen -t ras -C <用户名>