在公司还是觉得自己git的姿势水平太低下了,照着公司的git 101再强行补一波。
先贴地址https://git-scm.com/book/zh/v2/。
很好的一张图。
git config:
改git的配置,比如名字、邮箱、编辑器、合并工具等等。config 配置有 system 级别、global(用户级别)和 local(当前仓库)三个,一般用 --global 即可。
# 查看 git 配置
$ git config --list
# 配置用户名
$ git config --global user.name "user_name"
# 配置用户邮箱
$ git config --global user.email user_email
# 配置 git merge 时的工具,推荐meld
$ git config --global merge.tool meld
git init:
将目录转变成一个 git 仓库或者初始化已有的 git 仓库,用处不大。
# 初始化 git 仓库
$ git init
git clone:
clone 远程仓库。
# 克隆远程仓库
$ git clone git_url
# 克隆远程仓库至指定目录
$ git clone git_url directory
# 克隆时创建新分支替代 origin HEAD
$ git clone -b branch_name git_ur
git status:
查看当前文件更改。
# 查看 git 目录文件更改
$ git status
# 查看更为紧凑的更改状态
$ git status -s
$ git status --short
# 查看 untracked 的文件
$ git status -u
# 不显示 untracked 的文件,常用
$ git status -uno
git add:
将内容从工作目录添加到暂存区,以备下次提交。
# 将文件的修改或添加信息加入暂存区
$ git add file_name
# 将文件的修改或删除信息加入暂存区
$ git add -u file_name
# 将文件的修改或添加或删除信息加入暂存区
$ git add -A file_name
# 添加当前目录所有文件到暂存区
$ git add .
git diff:
查看两个分支的差别。
# 比较工作目录和暂存区域快照之间的差异
$ git diff
# 查看已经暂存起来的文件和上次提交时的快照之间的差异,也就是所有已添加到暂存区但还未commit的更改
$ git diff --cached [file_name]
$ git diff --staged [file_name]
# 查看现在工作目录和 HEAD 即上一个版本之间的差别,也就是已存入暂存区和未存入暂存区的更改
$ git diff HEAD [file_name]
# 查看格式较为简单的 diff
$ git diff --stat
# 比较两个分支最近的 commit 的差异
$ git diff branch1_name branch2_name
# 比较两个 commit 的差异
$ git diff commit_hash1 commit_hash2
# 查看某文件在暂存区和工作目录的差异
$ git diff file_name
# 查看某文件和另一分支的区别
$ git diff branch_name file_name
# 查看某文件和某一 commit 中的区别
$ git diff commit_hash file_name
git commit:
提交暂存区的更改。每次commit之后会得到一个 commit 号,40位哈希值。
# 提交暂存区的更改 $ git commit -m "commit message" # 提交所有已跟踪文件中的执行修改或删除操作的文件,即使没有被git add # 注意:对于新建的文件无效,同样 git status -uno 也看不到新建的文件,须手动 git add $ git commit -a -m "commit message" # 在产生新的一次 commit 的情况下 追加到上次 commit 中 $ git commit --amend
git reset:
用于版本回退,危险,只说常用特定用法。
# 回退文件,将文件从暂存区回退到工作区,即取消 git add $ git reset file_name # 回退到某个 commit,默认位 mixed 模式 $ git reset commit_hash
# 将版本库回退1个版本,将本地版本库的头指针全部重置到指定版本,且将这次提交之后的所有变更都移动到暂存区
$ git reset --soft
# 将版本库回退1个版本,将本地版本库的头指针全部重置到指定版本,且会重置暂存区,即这次提交之后的所有变更都移动到未暂存阶段
$ git reset
$ git reset --mixed
# 十分危险,慎用
# 将版本库回退1个版本,但是不仅仅是将本地版本库的头指针全部重置到指定版本,也会重置暂存区,并且会将工作区代码也回退到这个版本
# 也就是回退完你写的代码都没了
# 也有妙用,比如 git merge 错了想抛弃这次重新merge
$ git reset --hard
git branch:
列出,创建或删除分支。
# 查看本地分支 $ git branch $ git branch --list # 查看远端分支 $ git branch -r $ git branch --remote # 查看本地和远端分支 $ git branch -a $ git branch --all # 新建分支(不常用,更多用 git checkout -b) $ git branch branch_name
# 在某个 commit_hash 基础上新建一个分支
$ git branch branch_name commit_hash
# 删除本地分支,如果在分支中有一些未merge的提交,那么会删除分支失败 $ git branch -d branch_name # 强制本地删除分支(常用) $ git branch -D branch_name # 查看分支目前 commit 号和 commit 信息 $ git branch -v # 查看分支目前 commit 号和 commit 信息,以及远端对应分支 $ git branch -vv
git checkout:
最复杂。。。新建、切换分支,撤销更改。
# 切换分支 $ git checkout branch_name # 在当前分支上新建并切换到新分支(常用,从某一基础分支开出一个自己的开发分支) $ git checkout -b branch_name # 将修改后的文件恢复为暂存区的该文件 # 注:若文件路径和分支名重名,可用 -- 区分表明是文件名 # 注:常用,临时改动了一些文件如脚本、模拟数据等,在 git status -uno 后发现被追踪,可以使用 git checkout file_name 恢复 $ git checkout file $ git checkout -- file # 将某文件恢复为某一分支最新版本或某一 commit_hash 或 tag 的版本 $ git checkout commit_hash -- file_name $ git checkout branch_name --file_name # 在某个 commit_hash 的基础上新建一个分支 $ git checkout -b branch_name commit_hash
git merge:
合并分支。为了保证 merge 的正确性,尽量保证合并两个 commit 已提交代码已 push 的没有暂存区修改的分支,这样 git merge 的参数也不需要了解。
# 合并某分支
$ git merge branch_name
# 可能出现冲突,需要处理 conflict
# 建议使用meld
$ git mergetool
git log:
展示一个项目的可达历史记录,从最近的提交快照起。
默认情况下,它只显示你当前所在分支的历史记录,但是可以显示不同的甚至多个头记录或分支以供遍历。
此命令通常也用来在提交记录级别显示两个或多个分支之间的差异。
# 查看提交历史 $ git log # 注:以下参数可复用 # 查看提交历史,展开每次提交的内容差异 $ git log -p # 查看提交历史,展示两条,数字可以换 $ git log -2 # 查看提交历史,展示更改摘要 $ git log --stat # 查看提交历史,使用非默认格式 # 选项 说明 # %H 提交对象(commit)的完整哈希字串 # %h 提交对象的简短哈希字串 # %T 树对象(tree)的完整哈希字串 # %t 树对象的简短哈希字串 # %P 父对象(parent)的完整哈希字串 # %p 父对象的简短哈希字串 # %an 作者(author)的名字 # %ae 作者的电子邮件地址 # %ad 作者修订日期(可以用 -date= 选项定制格式) # %ar 作者修订日期,按多久以前的方式显示 # %cn 提交者(committer)的名字 # %ce 提交者的电子邮件地址 # %cd 提交日期 # %cr 提交日期,按多久以前的方式显示 # %s 提交说明 $ git log --pretty=oneline $ git log --pretty=format:"%h - %an, %ar : %s" # 限制输出长度,筛选 $ git log --since=2.weeks $ git log --until="2018-01-21" $ git log --committer="name"
git stash:
用来临时地保存一些还没有提交的工作,以便在分支上不需要提交未完成工作就可以清理工作目录。
# 暂存修改 其实我用的不多
$ git stash
git fetch:
与一个远程的仓库交互,并且将远程仓库中有但是在当前仓库的没有的所有信息拉取下来然后存储在你本地数据库中(如新分支、新tag,已有分支修改等)。
安全操作,随意fetch
# 拉取远端信息
$ git fetch
git pull:
基本上就是 git fetch 和 git merge 命令的组合体,Git 从你指定的远程仓库中抓取内容,然后马上尝试将其合并进你所在的分支中。
# 将所有远端分支拉到本地,尽量避免最直接 git pull,merge 非常耗时危险
$ git pull
# 拉某指定分支
$ git pull origin branch_name
# 若出现错误无法拉,可以强制拉,尽量避免,很危险
$ git pull -f origin branch_name
git push:
与另一个仓库通信,计算你本地数据库与远程仓库的差异,然后将差异推送到另一个仓库中。 它需要有另一个仓库的写权限,因此这通常是需要验证的。
# 将所有本地分支推到远端,尽量避免最直接 git push,非常危险 $ git push # 推某指定分支 $ git push origin branch_name # 若出现错误无法推,可以强制推,尽量避免,很危险 $ git push -f origin branch_name
git blame:
标注任何文件的行,指出文件的每一行的最后的变更的提交及谁是那一个提交的作者。 当你要找那个人去询问关于这块特殊代码的信息时这会很有用。
其实查错也很有用,blame 很形象。
# 查看文件每一行最后修改情况
$ git blame file_name
git cherry-pick:
获得在单个提交中引入的变更,然后尝试将作为一个新的提交引入到你当前分支上。从一个分支单独一个或者两个提交而不是合并整个分支的所有变更是非常有用的。
通俗点说就是可以选择某一个分支中的一个或几个 commit(s) 来进行操作。例如,假设我们有个稳定版本的分支,叫v2.0,另外还有个开发版本的分支v3.0,我们不能直接把两个分支合并,这样会导致稳定版本混乱,但是又想增加一个v3.0中的功能到v2.0中,这里就可以使用cherry-pick了。所以就是就是对已经存在的 commit 进行再次提交。
# 修改某次 commit,对其进行再次提交 $ git cherry-pick old_commit_hash # 可能存在 conflict,查看冲突 $ git status # 手动解决冲突,结局完提交 $ git commit -c new_commit_hash
git rebase:
基本是一个自动化的 cherry-pick 命令。用于把一个分支的修改合并到当前分支。功能似乎和 git merge 类似,其实不同。git rebase 没有合并操作,而是像打补丁一样。
# 将目标分支的修改添加到本地来
$ git rebase branch_name
# 可能出现冲突,解决完后 git add 修改的文件。继续rebase
$ git rebase --continue
git revert:
一个逆向的 git cherry-pick 操作。 它将你提交中的变更的以完全相反的方式的应用到一个新创建的提交中,本质上就是撤销或者倒转。
通俗说来就是生成一个新的提交来撤销某次提交,此次提交之前的commit都会被保留。很安全。git reset 比较危险。
# 撤销一次 commit $ git revert HEAD # 撤销两次 commit $ git revert HEAD^ # 撤销某次 commit $ git revert commit_hash