文前说明
作为码农中的一员, 需要不断的学习, 我工作之余将一些分析总结和学习笔记写成博客与大家一起交流, 也希望采用这种方式记录自己的学习之旅.
本文仅供学习交流使用, 侵权必删.
Git 可以分为工作区, 本地库, 远程库
工作区 中包含目录树和对应的文件.
本地库 与 远程库 结构完全相同, 本地库包含了 索引区, 进度保存区, HEAD,master,branch,objects.
HEAE 指向当前所在分支, 分支中只包含 objects 中 commit 的引用.
索引区 中只包含目录树和 objects 中对应文件的引用.
Git
准备工作:
安装 Git.
yum install -y git
通过网页登录 Git 地址, 通过 Profile Settings 查看 name 与 email.
设置 Git 名称和邮件地址.
- git config --global user.name "name"
- git config --global user.email "email"
生成 SSH 密钥, 用户根目录下的 .ssh 文件件中, 会生成 id_rsa 和 id_rsa.pub 两个文件.
$ ssh-keygen -t rsa -C "email"
拷贝 id_rsa.pub 文件内容, 复制到网页 Git 的 Profile Settings SSH keys ADD SSH key 窗口中后确定.
给 Git 配置颜色.
- git config --global color.status auto
- git config --global color.diff auto
- git config --global color.branch auto
- git config --global color.interactive auto
设置 Git 命令自动补全.
拷贝 .git-completion.bash 到用户根目录: cp git-completion.bash ~/.git-completion.bash.
修改 .bashrc 文件: 增加 source ~/.git-completion.bash.
使生效: source .bashrc.
自己搭建的 Git 服务器, 需要配置 HOST.
修改 /etc/hosts 文件, 增加 Git 服务器 IP 地址与域名的映射关系.
HEAD 说明:
所在目录为 .git/HEAD.
HEAD 内容为: refs/heads/<分支名称>, 图中所示:
refs/heads/master
文件 .git/refs/heads/<分支名称>的内容为 commid 的 id. 图中所示:
aaaa
可以使用 HEAD^ 代表父提交; HEAD^^ 代表父父提交; HEAD~n 达标前 n 次提交.
常用命令说明:
创建初始化 本地库(没有任何内容( Git 版本仓库)).
git init
创建初始化 本地库, 并且自动创建指定目录.
git init [文件目录]
查看 <远程库> 中的仓库名称列表
- git remote
- git remote show
查看远程指定仓库的详细信息(分支的 pull 与 push 情况等).
git remote show [仓库名称]
增加 远程库 中的仓库.
git remote add [仓库名称] [远程版本仓库网址]
列出 远程库 中的仓库名称列表, 包含其 远程版本仓库网址.
git remote -v
删除 远程库 中指定仓库.
git remote rm [仓库名称]
操作会取回 远程库 中的更新, 放入 本地库 中, 更新 objects, 如果当前分支有新的提交, 则将引用指向最新的提交, 如果增加有新的分支, 则创建新的 branch.
取回所有仓库在 远程库 中的版本更新.
git fetch
取回指定仓库在 远程库 中的版本更新.
git fetch [仓库名称]
取回指定仓库的指定分支在 远程库 中的版本更新.
git fetch [仓库名称] [分支名称]
从 远程库 克隆到 本地库, 等同于执行 git init + git remote add [仓库名称] [远程版本仓库网址] + git fetch.
git clone [远程版本仓库网址]
在本地生成指定名称目录, 再执行后续操作.
git clone [远程版本仓库网址] [本地目录名]
操作将会更改 HEAD 引用, 指向新的分支, 更新 索引区 和 工作区 的 目录, 与 HEAD 保持一致, 检出新分支代码到 工作区.
切换到指定分支, 并且进行代码检出, 分支名称必须存在, 否则提示错误.
git checkout [分支名称]
进行代码检出, 并且以检出代码为基础创建新分支, 切换到该分支, 更改 HEAD 引用.(强行创建新分支, 如果分支名称已经存在, 则强行覆盖), 等同于 git branch [新分支名称] + git checkout [分支名称].
git checkout -b [分支名称]
强行检出 索引区 中在 objects 中引用的文件覆盖 工作区 中同名文件.
git checkout [文件名称]
强行检出当前分支在 objects 中引用的文件覆盖 索引区 和 工作区 中同名文件.
git checkout HEAD [文件名称]
查看 本地库 中分支名称列表.
git branch
查看 远程库 中分支名称列表.
git branch -r
查看所有分支名称列表(包含本地, 远程).
git branch -a
查看 本地库 中分支与 远程库 中分支的对应关系, 分支的最新提交信息等.
git branch -vv
在 本地库 中, 以 HEAD 指向分支为基础, 创建指定名称的分支, 创建新的 branch, 并且同样指向了 objects.
git branch [分支名称]
在 本地库 中删除指定分支.
git branch -D [分支名称]
执行命令可以看到输出中, 状态标识有两列, git add 前, 状态位于第二列, 指代 工作区 与 索引区 文件内容存在区别. git add 后, 状态位于第一列, 指代 索引区 与 HEAD 文件内容存在区别.
查看 工作区 中文件状态.
git status
查看 工作区 中文件状态(精简模式).
git status -s
查看 HEAD 中的提交信息. 查看 本地库 的历史提交记录.
git log
查看最近的 n 次提交信息.
git log -n
查看当前分支的提交信息(显示修改总行数).
git log --shortstat
查看当前分支的提交信息(仅显示增加或修改的文件列表).
git log --name-only
查看当前分支的提交信息(仅显示增加或修改的文件列表和状态).
git log --name-status
查看当前分支指定作者的提交信息.
git log --author=[作者]
查看当前分支的提交信息(显示增加, 修改文件列表, 并显示修改行数).
git log --numstat
大于起始日期, 小于结束日期的提交, 不包含等于.
git log --after=yyyy-MM-dd --before=yyyy-MM-dd
显示最近一次提交的修改内容等.
git show
显示指定提交的修改内容等.
git show [commit id]
清除 工作区 中 未跟踪状态 的文件.
git clean
清除 工作区 中 未跟踪状态 的文件夹.
git clean -d
清除 工作区 中 未跟踪状态 的文件.
git clean -f
将 工作区 和 索引区 中修改进度, 保存到 进度保存区 中.
git stash
查看 进度保存区 中进度列表.
git stash list
提取最近的一次进度, 从 进度保存区 到 工作区 和 索引区, 删除 进度保存区 中进度.
git stash pop
提取最近的一次进度, 从 进度保存区 到 工作区 和 索引区(不删除进度).
git stash apply
将文件从 工作区 提交到 索引区.
git add [文件名称]
增加 工作区 中所有文件(修改或者增加).
git add .
快速标记文件差异, 修改和删除的文件, 提交到 索引区.
git add -u
快速标记文件差异, 增加, 修改和删除的文件, 提交到 索引区.
git add -A
reset 默认是依照 HEAD 的操作, 如果是 reset 已经 push 后的
提交, 需要强行推送 -f.
重置 索引区 与 HEAD 保持一致, 等同于撤销 git add 操作.
git reset [文件名称]
重置 索引区 与 HEAD 保持一致. 用 HEAD 指向的目录树覆盖 索引区 的目录树.
git reset .
更改 HEAD 指向, 分支 指向, 重置 索引区 和 工作区.
git reset --hard [commit id]
只撤销 commit 操作, 只影响 HEAD, 更改 HEAD 指向, 分支 指向.
git reset --soft [commit id]
撤销 commit 操作, 影响 HEAD 和 索引区, 更改 HEAD 指向, 分支 指向, 重置 索引区.
- git reset --mixed [commit id]
- git reset [commit id]
diff 默认是依照 索引区 的操作.
对比 工作区 与 索引区 的差异.
git diff
查看指定文件 工作区 与 索引区的差异内容.
git diff [文件名称]
查看 索引区 与 HEAD 中文件差异.
git diff --cached
查看 工作区 与 HEAD 的文件差异.
git diff HEAD
文件由 索引区 添加到 HEAD.
git commit -m [提交信息]
文件直接由 工作区 添加到 HEAD(尽量少用), 等同于 git add + git commit.
git commit -m [提交信息] -a
修改 HEAD 中最近的一次提交信息.
git commit --amend
取回并合并版本更新, 等同于 git fetch + git merge.
git pull
取回并合并指定仓库在 远程库 中的版本更新.
git pull [仓库名称]
取回并合并指定仓库的指定分支在 远程库 中的版本更新.
git pull [仓库名称] [分支名称]
推送 HEAD 修改内容到 远程库.
git push
推送 HEAD 指定仓库的修改内容到 远程库.
git push [仓库名称]
推送 HEAD 指定仓库的指定分支的修改内容到 远程库.
git push [仓库名称] [分支名称]
强行推送, 覆盖 远程库.
git push [仓库名称] [分支名称] -f
合并 本地库 中分支内容
git merge [分支名称]
合并 本地库 中提交.
git cherry-pick [commit id]
搜索 工作区 中文件内容.
git grep [搜索内容]
删除文件, 作用于 工作区 和 索引区. 直接通过 rm 命令删除的文件, 可以通过 git checkout -- [文件名称] 从 本地库 中恢复. git rm 后执行 commit 操作, 从 本地库 中删除文件.
git rm [文件名称]
把 工作区 下的文件内容注册到 索引区
应用场景: 正在修改一个巨大的文件, 先对其 git update-index --assume-unchanged, 这样 Git 暂时不会理睬对文件做的修改; 当工作告一段落决定可以提交的时候, 重置改标识: git update-index --no-assume-unchanged, 于是 Git 只需要做一次更新;
git update-index --assume-unchanged [文件名称]
来源: http://www.jianshu.com/p/a6a09bba6354