base
git init¶
git init <directory><directory>默认当前目录--bare创建bare仓库-b,initial-branch=<branch-name>:默认master
git clone¶
git clone <repository> [<directory>]<directory>默认仓库名--bare创建bare仓库-o <reponame>替换默认的track upstream的name=origin-b | --branch <branchname | commit | tag>指定分支或者commit或者tag--single-branch仅克隆一条分支-n, --no-checkout参数是为了告诉 Git 不要立即检出工作目录,以免下载所有文件。--filter=blob:none表示过滤所有blob(文本文件)filter=blob:limit=<size>过滤大小为size的blob- 更多看
git rev-list - 可能会失效,据说2.19.1才行,还不如用
--sparse
- 更多看
--sparsegit sparse-checkout init- 详细看sparse checkout
--depth n表示只下载最近的n次提交
git status¶
- 显示
- 未跟踪(untracked):Untracked files
- 暂存未提交(staged &&unCommit):Changes to be committed
- 只在暂存区,不在版本库
- 修改未暂存(modified && unStaged):Changes not staged for commit
- 对staged/commited的文件modified
- 被忽视的(Ignored):Ignored files
- option
-s:显示文件状态标识- ??:untracked
- A:new File
- M:modified
- U: untracked
git add¶
git add <pathspec>...- 暂存文件,
.表示所有
git rm¶
git rm <file>...- 无法对未跟踪的文件操作
- 默认删除工作区、暂存文件(文件是最新状态,未被修改)
- 等于
rm xxx && git add xxx
--cached:只删除在暂存文件的,如果没有该选项,则会和工作区的一起删了-r:递归删除目录-f:override the up-to-date check,即modifed的文件也能删除(强制删除)
彻底删除的方法¶
- https://blog.csdn.net/zxxshaycormac/article/details/123336328
- 注意:首先先确保分支是干净的
git filter-branch --force --index-filter "git rm --cached --ignore-unmatch -r target/" --prune-empty --tag-name-filter cat -- --all- --force 允许覆盖旧的 refs/original/*
- --index-filter 用 git rm 操作来修改每一个提交的索引
- --cached 不删除工作区文件,只处理 Git 索引
- --ignore-unmatch 避免文件不存在时报错
- --prune-empty 删除那些因为文件被移除后变空的提交
- --tag-name-filter cat 保留原标签名
- -- --all 对所有引用(分支、标签)生效
- 还需要
rm -rf .git/refs/original/删除原始引用(重写时的原备份)git reflog expire --expire=now --all删除 reflog(Git 操作日志)git gc --prune=now --aggressive执行垃圾回收(强制清除 dangling object)git log --all -- target/查看是否还存在
- 最后再强制push
git push origin --force --allgit push origin --force --tags
- 或者
git filter-repo --path target/ --invert-paths- 需要安装filter-repo
git restore¶
-S, --staged:暂存区恢复HEAD-W, --worktree:工作区恢复HEAD(默认)
git mv¶
- 移动文件,或者,重命名文件
- 相当于
- mv a b
- git rm a
- git add b
- 最后,commit即可,工作区也会rename
git commit¶
git commit <path-spec>- 进行commit,
- -m:指定message
- --amend:用新commit覆盖当前commit
- 如果之前推送过远程,再推送远程时需要-f,因为远程的头commit和当前不一样了
git log¶
- --graph:类图形化显示commit合并情况
- --oneline:一行显示(简化提交信息)
- --all:所有commit
git checkout¶
-
git checkout切换分支或者恢复修改(这里只看恢复修改,类似于git reset) -
checkout 本意是检出的意思,也就是将某次commit的状态检出到工作区;所以它的过程是先将HEAD指向某个分支的最近一次commit,然后从commit恢复index,最后从index恢复工作区。
- 恢复修改
- 如果不指定切换到哪个分支,那就是切换到当前分支,虽然HEAD的指向没有变化,但是后面的两个恢复过程依然会执行,于是就可以理解为放弃index和工作区的变动。但是出于安全考虑 git 会保持 index 的变动不被覆盖。
git checkout .恢复工作区(只是把index恢复到工作区,比如会让修改未重新暂存变回原来内容)git checkout -- f1 f2指定文件恢复- 等于
git restore .git restore f1 f2
git checkout -f恢复工作区和index即和正常的切换分支一样恢复到该分支最新提交
git diff¶
- 比较的是工作目录中当前文件和暂存区域快照之间的差异(如果修改了就是修改之后还没有暂存起来的变化内容)
- 注意:commied后的文件在暂存区还存在
- 变化
- 绿色表示增加的,红色表示删除的
- @@@@里表示 减了多少行,加了多少行,目前这个改变的有多少行
- 如果指定文件,就把工作区的所有文件都拿出来比较
- option
- --staged,或者,--cached
- 比对已暂存文件与最后一次提交的文件差异
- git diff HEAD
- 和HEAD版本对比
- --staged,或者,--cached