Git 常用指令 | 系统开发
[TOC]
开发过程中常用的 Git 指令总结。
全局设置用户名和邮箱
| 1 | git config --global user.name "your_name" | 
协作开发
| 1 | # 拉取远程分支代码 | 
撤销修改
- 恢复删除但是未 add 到缓存区的文件
| 1 | git reset HEAD filename | 
- 本地修改尚未 add 到缓存区 - 1 
 2- git checkout -- filename # 单个文件/文件夹 
 git checkout . # 所有文件/文件夹
- 本地修改已经 add 到缓存区 - 1 
 2- git reset HEAD filename # 单个文件/文件夹 
 git reset HEAD . # 所有文件/文件夹
- 本地新增尚未 add 到缓存区 - 1 
 2
 3- rm filename# 单个文件 
 rm -r dir # 单个文件夹
 git clean -xdf # 所有文件/文件夹
- 本地新增已经 add 到缓存区 - 1 - git rm --cached filename/dir # 单个文件 
- 修改最后一次 commit - 1 - git commit -m "xxxxx" --amend 
- 回到某个 commit,保留未 add、commit 的内容,并将已经 commit 的内容变为已 add 未 commit 的状态 - 1 - git reset --soft xxxxx 
- 回到某个 commit,保留未 add、commit 的内容,并将已经 add、commit 的内容变为未 add 的状态 - 1 - git reset (--mixed) xxxxx 
- 回到回到某个 commit,放弃所有修改 - 1 - git reset --hard xxxxx 

- 撤销 pull
| 1 | git reflog # 查看变更历史记录 | 
恢复被删的文件
| 1 | git reset HEAD ${deleted_file_or_folder} | 
子模块
创建
如果想要将一个已存在的仓库添加为当前仓库的子模块,可以通过下面的命令来添加新的子模块。
| 1 | git submodule add https://github.com/xxx.git path/to/dir | 
注意:
- 路径不能以 / 结尾(会造成修改不生效)
- 不能是现有工程已有的目录
使用
- 方法一: - 1 - git clone --recursive https://github.com/xxx.git 
- 方法二: - 1 
 2
 3- git clone --recursive https://github.com/xxx.git 
 git submodule init
 git submodule update
修改
- 更新 .gitmodules 中对应 submodule 的条目 URL
- git submodule sync
更新
| 1 | git submodule set-url somedir https://github.com/somename/somerepo.git | 
删除
| 1 | git submodule deinit ${module_name} | 
重命名
删除后重新添加
仓库/分支管理
- 取消关联远程仓库 - 1 - git remote remove origin 
- 关联远程仓库 - 1 - git remote add origin https://github.com/xxx/yyy.git 
- 关联本地分支与远程分支 - 1 - git push origin local_branch:remote_branch # local_branch 必须为你本地存在的分支,remote_branch 为远程分支,如果 remote_branch 不存在则会自动创建,local_branch 留空的话则是删除远程 remote_branch 分支 
- 合并远程分支,以远程/本地为准 - 1 
 2
 3- git fetch 
 git merge origin/target_branch --strategy-option theirs # 以远程为准
 git merge origin/target_branch --strategy-option ours # 以本地为准
- 重命名分支 - 1 
 2
 3- git branch -m old_name new_name # 本地分支重命名 
 git push origin :branch_to_be_deleted # 删除远程分支
 git push origin 本地分支名:远程分支名
- 查看分支关系图 - 1 
 2
 3
 4
 5- git log --graph --decorate --oneline --simplify-by-decoration --all 
 # --decorate 标记会让 git log 显示每个 commit 的引用(如分支、tag 等)
 # --oneline 一行显示
 # --simplify-by-decoration 只显示被 branch 或 tag 引用的 commit
 # --all 表示显示所有的 branch,这里也可以选择,比如我指向显示分支 ABC 的关系,则将 --all 替换为 branchA branchB branchC
标签管理
- 添加标签 - 1 - git tag tag_name 
- 推送标签 - 1 
 2- git push origin tag_name # 单个标签 
 git push --tags # 所有标签
- 删除标签 - 1 
 2
 3- git tag -d tag_name # 本地标签 
 git push --delete origin tag_name # 远程标签
 git push origin :refs/tags/tag_name # 远程标签
大文件
| 1 | yum install git-lfs # 安装 | 
合并提交记录
| 1 | git rebase -i HEAD~n | 
n 是包括最新提交在内的需要合并的记录的条数,此时会自动打开一个文本文件,注意这个文本文件中从上到下显示的提交顺序是从旧到新。从第二行开始将记录前面的 pick 改成 squash,然后保存退出。如果合并成功会打开另外一个文件文件,在这里输入这次合并时的提交记录信息。
如果需要合并远端仓库的提交记录,则在 push 的时候需要加上 -f 选项。
强制更新为远端代码
| 1 | git fetch --all | 
允许合并无关的历史
| 1 | git pull origin master --allow-unrelated-histories | 
拉取单独某个分支
| 1 | git clone -b ${branch} --single-branch ${repo} | 
仓库瘦身
导出 stash 内容
| 1 | git stash show "stash@{0}" -p > stash_0.patch | 
cherry-pick
- pick 单个 commit - 1 - git cherry-pick ${commit_id} 
- pick 单个 merge commit - 1 - git cherry-pick -m 1 ${commit_id} 
- pick 多个 commit - 1 - git cherry-pick ${commit_id_0} ${commit_id_1} 
- pick 范围 commit - 1 - git cherry-pick ${commit_id_earlier}^..${commit_id_later} 
参考
Git 常用指令 | 系统开发