2、git进阶操作
 
2.1.1 分支的创建
 
| 命令 | 参数 | 含义 | 
|---|
| git branch (git checkout -b) | <new_branch> <old_branch> | 表示创建分支 | 
| -d <-D> | 删除分支 –d如果分支没有合并,git会提醒,-D强制删除 | 
| -a -v | 查看分支 | 
| -m | 重新命名分支 | 
| commit id | 从指定的commit id签出代码 git branch branch_name commit id | 
$ git push origin branch_name将本地分支推到远程  $ git push origin branch_name --delete 将远程分支删除  | 
 ### 2.1.2 分支的合并 
| 命令 | 参数 | 含义 | 
|---|
| git merge | <branch_name> | 需要合并的分支 | 
| --abort | 终止合并,并回复文件 | 
| --continue | 继续合并 | 
 ### 2.1.3 git rebase 
| 命令 | 参数 | 含义 | 
|---|
| git rebase | <branch_1> <branch_2> | 将branch_1上面的移动到branch_2 | 
| --abort | 终止rebase | 
| --continue | 继续rebase | 
| -i | 进入交互模式 | 
 
2.2 git reset/revert/checkout撤销操作
 
| 命令 | 参数 | 含义 | 
|---|
| git reset | --soft commit_id | 撤销到某个commit,不修改工作区和索引区内容 | 
| --mixed commit_id  | 撤销到某个commit,不修改工作区,修改索引区内容 | 
| --hard commit_id | 撤销到某个commit,并重置工作区和索引区内容 | 
| HEAD file_name | 撤销索引区指定的file_name | 
| git revert | commit_id | 只撤销某个commit | 
| git checkout | -- .  | 撤销工作区所有文件 | 
 
2.3 git remote远程服务器操作
 
| 创建仓库 | 
| git clone --bare DataStruct-Algorithm /F/datastruct-algorithm.git | 
| git init --bare DataStruct_algorithm.git | 
 
| 命令 | 参数 | 含义 | 
| git remote | -v | 查看详细的信息 | 
| show server_name | 查看主机的详细信息 | 
| add server_name web_site | 添加主机 | 
| rm server_name | 删除主机 | 
| rename old_server_name new_ server_name | 修改主机名 | 
 
2.4 git log高级用法
 
| 命令 | 参数 | 含义 | 
| git log | -n | 表示查看最近提交的n条记录 | 
| --graph | 显示当前分支提交记录以图形方式展示,后面—all 表示所有的分支 | 
| --date=short | 查看提交的时间 | 
| -p | 表示提交文件的修改了那些内容 | 
| file_name | 表示查看file_name文件的提交记录 | 
| commit_id..commit_id | 查看两个commit id之间的提交记录 | 
| --since=<date> | 自date以来的记录  | 
| --before=<date> | 表达date之前的记录 | 
| --after=<date> | 表示date之后的记录 | 
| --until=<date> | 表达直到date之后的记录 | 
| $ git log --since="2019-07-11" --until="2019-07-16" --date=short\n 表示2019-07-11~2019-07-16(不包括16号)之间提交的记录  | 
| --grep=<contents> | 根据提交的message内容进行匹配 | 
| --author=”author_name” | 根据作者名来搜索 | 
| --skip=n | 跳过前面的n条记录 | 
| --stat | 显示提交的文件 | 
| --left-right branch1…branch2 | 比较两个分支的commit差异 | 
 
| 命令 | 参数 | 含义 | 
| git reflog  | show | 查看当前分支的记录 | 
| --all | 查看所有分支的记录 | 
| 在找到commit id之后可以使用cherry-pick branch等命令 reflog有个特点就是它只存在本地记录里面,并不会上传到服务器上 | 
 
2.5 git diff/show查看提交详情
 
2.5.1 diff
 
| 命令 | 参数 | 含义 | 
| git diff | 不加参数 | 尚未缓存的修改(还未执行add命令) | 
| --cached | 已经缓存的修改 | 
| <branch_name1> <branch_name2> [file_name] | 比较两个分支file_name的差异 | 
| commit_id commit_id | 比较两个commit id 区别 | 
 
3.5.2 show
 
| 命令 | 参数 | 含义 | 
| git show | <commit_id> | 显示commit id提交修改的内容 | 
| <commit_id> <file_name> | 查看commit id 中对应的file_name修改内容 | 
| <tag_name> | 查看tag信息 | 
 ### 2.6 git tag操作 
| 命令 | 参数 | 含义 | 
| git tag | -m | 注释信息 | 
| -f | 强制覆盖 | 
| -d | 删除 | 
| -l | 列出所有的tag | 
| -n | 列出详细信息 | 
| $ git tag v2.0.0.0 –m “new version v2.0.0.0” $ git ls-remote --tags <server_name>查看远程tag $ git fetch <server_name> <tag_name> 拉取远程tag $ git push --delete <server_name> <tag_name> 删除远程的tag  | 
 
注意在checkout tag的时候,如果我们在当前的tag上做了提交,就会造成一个游离的HEAD现象,这是个非常危险的操作,有可能会造成你的commit丢失问题。
 
2.7 git stash操作
 
stash的查看,增加,删除,对比,应用
 
| 命令 | 参数 | 含义 | 
| git stash | save [message] | 保存stash,并且有注释信息 | 
| show [stash] -p | 查看某个stash的详细信息 | 
| drop [stash] | 删除某个stash | 
| pop | 将当前的第一个stash应用到当前的分支上 | 
| apply [stash] | 应用指定的stash,并且保存stash不变化 | 
| clear | 清空stash | 
| list | 查看所有的stash | 
 
2.8 git blame操作
 
| 命令 | 参数 | 含义 | 
| git blame  | file_name | 查看这个文件都有谁提交的 | 
| file_name -L num1:num2 | 查看这个文件从num1行到num2行都有谁提交的 | 
| file_name –L:function_name | 查看这个文件里面函数最后一次谁修改过 | 
| --colors-lines | 显示颜色标记 | 
| 这个命令有时候可以结合grep使用,主要是为了精确查找信息 | 
 ### 2.9 git patch 操作 
| 1.先生成patch文件 | 
| $ git format-patch start_commit_id..end_commit_id | 
| $ git format-patch –n3 | 
| 2.可以事先检测在合并的时候是否存在冲突 | 
| $ git apply --check patch_file | 
| 3.合并patch文件 | 
| $ git am patch_file | 
| 4.撤销patch | 
| $ git apply –R patch_file | 
 
2.10 git submodule管理大型项目的利剑
 
| $ git init –bare test_submodule.git | 
| $ git submodule add git@github.com:MingYueRuYa/cpp_inside_object.git | 
| $ git submodule add git@github.com:MingYueRuYa/cpp_study.git | 
| $ git commit –m “add submodule” | 
| $ git push  | 
 
| 拉取远程分支 | 
| $ git clone git@github.com:MingYueRuYa/test_submodule.git | 
| $ git submodule init | 
| $ git submodule update (git submodule update –init 将上面的两步合起来) | 
| $ git submodule foreach git pull | 
| $ git submodule foreach git submodule update | 
| $ git rm -rf submodule_name (删除submodule) | 
 
