Git 常用指令 | 系统开发
[TOC]
开发过程中常用的 Git 指令总结。
全局设置用户名和邮箱
1 | git config --global user.name "your_name" |
协作开发
1 | # 拉取远程分支代码 |
撤销修改
- 恢复删除但是未 add 到缓存区的文件
1 | git reset HEAD filename |
本地修改尚未 add 到缓存区
1
2git checkout -- filename # 单个文件/文件夹
git checkout . # 所有文件/文件夹本地修改已经 add 到缓存区
1
2git reset HEAD filename # 单个文件/文件夹
git reset HEAD . # 所有文件/文件夹本地新增尚未 add 到缓存区
1
2
3rm 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
3git clone --recursive https://github.com/xxx.git
git submodule init
git submodule update
修改
- 更新 .gitmodules 中对应 submodule 的条目 URL
git submodule sync
更新
- 进入到字模块目录
git pull
- 在项目根目录
git push
删除
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
3git fetch
git merge origin/target_branch --strategy-option theirs # 以远程为准
git merge origin/target_branch --strategy-option ours # 以本地为准重命名分支
1
2
3git branch -m old_name new_name # 本地分支重命名
git push origin :branch_to_be_deleted # 删除远程分支
git push origin 本地分支名:远程分支名查看分支关系图
1
2
3
4
5git 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
2git push origin tag_name # 单个标签
git push --tags # 所有标签删除标签
1
2
3git 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 常用指令 | 系统开发