一、git 命令
- 初始化新仓库
init
# 当前所在目录为仓库
git init
# 当前目录下新建 repo 的仓库
git init repo
- 克隆仓库
clone
git clone <仓库地址>
- 查看仓库状态
status
git status
# 简略信息:s 是 short
git status -s
- 分支的最新提交节点
HEAD
最新:HEAD
上个:HEAD^, HEAD~
# 也可以加上数字,表示 HEAD 之前的第 i 个
HEAD~i
- 添加修改到暂存区(新文件跟踪状态)
add
# 添加指定
git add <file>
# 全部文件
git add .
# 也可以使用通配符
git add *.py
- 删除暂存区的文件(跟踪状态)
rm
git rm --cached <file>
# 删除文件(工作区+暂存区)
git rm <file>
- 提交本地仓库
commit
git commit -m "提交信息“
- 也可以同时执行(前提是已经是已跟踪的文件)
git commit -am "提交信息"
git commit -a -m "提交信息"
- 查看log
log
# 完整 log
git log
# 简洁 log
git log --oneline
- 回退版本
reset
# mixed 模式(默认模式,只删除暂存区的,保留工作区)
git reset <版本号>
git reset --mixed HEAD^
# soft 模式(相当于撤销commit操作,保留工作区的+保留暂存区
git reset --soft <版本号>
# hard 模式(工作区和暂存区的都不保留)
git reset --hard <版本号>
- 查看操作历史记录,返回误操作版本
reflog
# 查询操作历史
git reflog
# 返回就用回退版本
- 查看差异
diff
# 查看工作区、暂存区之间的差异
git diff
# 查看工作区和本地仓库之间的差异
git diff HEAD
# 查看暂存区和本地仓库之间的差异
git diff --cached
# 查看不同版本之间的差异
git diff <提交id1> <提交id2>
git diff <提交id1> HEAD
git diff <提交id1> <提交id2> <file> # 仅查看某个文件差异
# 查看不同分支之间的差异
git diff <分支名> <分支名>
- 应该忽略的文件
.gitignore
常用gitignore大全
- 系统或者软件自动生成的文件
- 编译产生的中间文件和结果文件
- 运行时生成的日志、缓存、临时文件
- 涉及身份、密码、口令、密钥等敏感信息文件
.gitignore 里面添加上要忽略的文件/夹
<file>
<dir>/ # 文件
"#" 开头是注释
Blob 模式匹配
"*" 匹配多个字符
"?" 匹配单个字符
"[]" 匹配列表中的但个字符([abc]表示匹配 a 或者 b 或者 c
"[0-9]\[a-z]" 表示连续的
“**” 匹配任意中间目录
例子:
# 忽略所有的 .log 文件
*.log
# 但跟踪所有的 show.log文件(即便是前面忽略了)
!show.log
# 只忽略当前目录下 TODO(不忽略 subdir/TODO)
/TODO
# 忽略任何目录下名为 build 的文件夹
build/
# 忽略 doc/所有txt (不忽略doc/sub/*.txt)
doc/*.txt
# 忽略 doc/ 目录及其所有子目录下的 .pdf
doc/**/*.pdf
二、远程仓库关联(github为例)
创建一个新的仓库( 然后可以直接git clone)
下面是本地已经有个本地仓库了,要关联远程仓库的
12. 添加远程仓库remote add
git remote add <shortname> <url> # shortname 远程仓库别名,一般取 origin
git remote add origin git@github.com:name/repo
- 如果在远程仓库建立的时候创建了README或者LICENCE的话
需要先pull
到本地
git pull origin main
# 如果有冲突的话要给出策略
git pull origin main --rebase # rebase
git pull origin main --no-rebase # merge
# 手动解决完
git rebase --continue
git merge --continue
或者使用fetch
拉取,然后进行合并
16. 推送本地分支到远程分支
git push -u origin main:main
- 分支
# 查看分支
git branch # 有 * 的是当前分支
# 新建分支
git branch <分支名>
# 切换分支
git switch <分支名>
#
- 合并和变基
git merge <被合并分支名> # 合并到当前分支, 保留提交记录
git rebase <目标分支名> # 当前的分支分叉开始地方会被剪过去,线性提交历史、改变提交历史
- 删除分支
# 删除已被完成合并的分支
git branch -d <分支名>
# 强制删除分支
git branch -D <分支名>
三、为开源项目贡献代码
- fork仓库(fork的时间久的话可以同步一下,也可以后面fetch)
- 克隆自己fork的仓库
git clone <自己的代码地址>
这个时候本地克隆的仓库和自己的远程仓库是关联了的
- 添加官方仓库地址
git remote add <shortname> <url> # shortname 远程仓库别名,这里一般取 upstream
git remote add upstream https://github.com/name/repo.git
已经把本地仓库和远程仓库、官方仓库关联起来了
- 拉取官方仓文件,进行同步,也同步到origin远程仓库
git fetch upstream
git merge upstream/main
或者
git pull upstream
然后同步到origin
git push -u origin main
至此三库都一样了
- 新建开发分支开发
git branch <开发分支名>
# 切换到开发分支
git checkout <开发分支名>
git switch <开发分支名> # (Git 2.23+)
或者
# 切换到开发分支名,不存在的话新建
git checkout -b <开发分支名>
- 推送到远程仓库
git push -u origin <开发分支名>
- 进行开发
# 查看状态
git status
# 查看修改内容
git diff
# 跟踪
git add .
# commit 提交本地
git commit -m "提交信息"
# push到远程仓
git push origin
-
向官方仓库提交pr
打开GitHub,就会出现可以合并到分支提示
各家的PR说明格式要求不同,可以前往官方仓查看他的贡献指南,一般会给出示例模板。
提交PR之后,可以前去官方仓查看审查情况