参考:
结构图示
- Workspace: 工作区
- Index/Stage: 暂存区
- Repository:仓库区(本地仓库)
- Remote: 远程仓库(Gitea或Github之类)
常规操作
新建代码库
- 创建仓库
git init
- 下载一个项目的全部内容
git clone url
配置
.gitignore
举例说明:
#注释 .gitignore的注释
config.js 忽略当前路径的config.js文件
*.txt 忽略所有.txt后缀的文件
!src.a 忽略除src.a外的其他文件
/todo 仅忽略项目根目录下的todo文件,不包括src/todo
build/ 忽略build/目录下的所有文件,过滤整个build文件夹;
doc/*.txt 忽略doc目录下所有.txt后缀的文件,但不包括其子目录的.txt的文件
/*.c: 忽略/cat.c,不忽略 build/cat.c
debug/*.obj 忽略debug/io.obj,不忽略debug/common/io.obj
**/foo 忽略/foo, a/foo, a/b/foo等
a/**/b 忽略a/b, a/x/b, a/x/y/b等
!/bin/run.sh 不忽略bin目录下的run.sh文件
.gitconfig
- 显示当前的Git配置
git config --list
- 编辑Git配置文件
git config -e [--global]
- 设置提交代码时的用户信息
git config [--global] user.name name git config [--global] user.email emailAddress
修改相关
- 增加文件/目录到暂存区
git add file/dir
- 增加当前目录的全部文件/目录到暂存区【不包括已经删除的】
git add .
- 增加项目中的全部被修改文件到暂存区
git add -A
- 删除暂存区中的文件
git rm --cached file
- 删除暂存区中的目录
git rm --cached -r dir
提交相关
- 提交暂存
git commit -m message
- 重写上一次的提交信息
git commit --amend
对比相关
- 工作区与暂存区对比
git diff file
- 暂存区与仓库区对比
git diff --cached file
- 工作区与仓库区对比
git diff HEAD file
记录相关
- 检查文件状态
git status
- 查看当前分支的版本历史
git log # 完整 git reflog # 简洁 git log --graph # 图形
- 显示某个文件的版本历史
git log --follow file git log -p file # 显示更改内容
- 显示某次提交的元数据和内容变化
git show commit
- 显示某次提交时,某个文件的内容
git show commit:file
回退相关
- 恢复暂存区的文件到工作区
git checkout file # 指定文件 git checkout . # 所有文件
- 重置暂存区的指定文件,与上一次commit保持一致,但工作区不变
git reset file
- 重置HEAD【
commit
可以用HEAD^^
、HEAD~10
或者版本号格式】git reset commit # 同时重置暂存区,但工作区不变 git reset --hard commit # 暂存区和工作区都变 git reset --keep commit # 暂存区和工作区都不变
- 新建一个commit,用来撤销指定commit,后者的所有变化都将被前者抵消(工作区也变)
git revert commit
- 暂时将未提交的变化移除,稍后再移入
git stash git stash pop
分支相关
- 创建分支
git branch branchName # 新建一个分支,但依然停留在当前分支 git branch branchName commit # 新建一个分支,指向指定commit
- 查看分支
git branch # 列出所有本地分支 git branch -r # 列出所有远程分支 git branch -a # 列出所有本地分支和远程分支
- 切换分支
git checkout branchName # 切换到指定分支,并更新工作区
- 合并分支
git merge branchName # 合并指定分支到当前分支
cherry-pick
: 将一个或多个提交从一个分支应用到另一个分支- 这在需要将特定的更改应用到不同的分支时非常有用,但有时也会引入一些复杂性,特别是在处理冲突时。
- 如果选择为每个任务创建分支,可以减少合并和冲突的概率,也更容易追踪和管理。
- 删除分支
git branch -d branchName git branch -dr remote/branchName
- 清理分支(变基)
git rebase
同步相关
- 关联远程仓库
git remote add remoteName url
- 拉取远程仓库,并与本地分支合并
git pull remoteName branchName [--allow-unrelated-histories]
--allow-unrelated-histories
用于合并不相关的历史,一般用于初次pull - 推送远程仓库
git push [-u] [-f] remoteName branchName/--all
-u
参数用于建立本地分支与远程分支之间的关联,以便在以后的操作中更加方便地管理分支,单远程仓库时可以使用-u
选项-f
参数用于强制推送- 使用
--all
会推送所有分支
- 克隆远程仓库(整个版本库)
git clone <url> <dirname>
- 下载远程仓库的所有变动
git fetch remoteName
标签相关
- 列出所有tag
git tag
- 新建一个tag在当前commit
git tag tagName
- 新建一个tag在指定commit
git tag tagName commit
- 删除本地tag
git tag -d tagName
- 查看tag信息
git show tagName
- 删除远程tag
git push origin :refs/tags/tagName
- 提交指定tag
git push remoteName tagName
- 提交所有tag
git push remoteName --tags
发布相关
- 生成一个可供发布的压缩包
git archive --format=tar main | gzip >release/main_$(date "+%Y-%m-%d").tar.gz
Git子模块简易操作
- 子模块的git地址为: https://github.com/HenryJi529/OpenMorningstar.wiki.git
-
大项目的git地址为: https://github.com/HenryJi529/OpenMorningstar.git
-
添加子模块
$ git submodule add https://github.com/HenryJi529/OpenMorningstar.wiki.git wiki/
- 查看子模块
$ git submodule
- 删除子模块
还需要清理子模块信息:# 删除子模块内容 $ git rm --cached wiki/ # 删除缓存区中的子模块 $ rm -rf wiki/ # 删除工作区中的子模块
.gitmodules
.git/config
.git/modules/wiki/
- 克隆含子模块的项目
- 递归克隆
$ git clone https://github.com/HenryJi529/OpenMorningstar.git --recursive
- 分步克隆
# 克隆大项目 $ git clone https://github.com/HenryJi529/OpenMorningstar.git # 初始化子模块 $ git submodule init # 更新子模块 $ git submodule update
- 递归克隆