简介
会把个人常用的命令贴出来,仅供参考,如有错误请评论或私信我更改
git下载
https://git-scm.com/download/win
撤销提交
# 撤销本地commit但保留修改内容(不保留修改内容用 --hard)
git reset --soft HEAD^
# 撤销上次提交(revert操作自动创建一个新的commit,该commit会撤销之前的commit所做的更改)
git revert HEAD
# 撤销某次commit提交
git revert [<commit>]
将某一分支(dev)的某一提交(xxxx)合并到另一分支(master)
# 首先切换到dev分支
git log
/*
commit c20bfac058786ab132a5f1ea954d5a8f11800fe4 (HEAD -> dev, origin/dev, origin/HEAD)
Author: test <xxxxxxxxx@qq.com>
Date: Thu Jul 11 15:40:45 2024 +0800
update .gitignore
*/
# 切换到master分支
git checkout master
# 将某一提交合并到当前分支
git cherry-pick c20bfac058786ab132a5f1ea954d5a8f11800fe4
# 上传仓库
git push
下面都是拷贝的,上面是记录自己用到的命令
git配置
# 查看所有的配置
git config --list
# 查看所有的配置以及它们所在的文件
git config --list --show-origin
# 查看 Git 的某一项配置
git config <key>
# 编辑 Git 配置文件
git config -e [--global]
# 编辑 Git 某一项配置
git config [--global] <key> <value>
# 删除某一项配置
git config [--global] --unset <key>
# 配置用户名和用户邮箱
git config --global user.name <用户名>
git config --global user.email <邮箱>
# 配置代理
$ git config --global http.proxy http://localhost:1080
$ git config --global https.proxy http://localhost:1080
git帮助
# 查看 Git 命令的综合手册
git help
# 查看与add有关的帮助
git add -h
创建/克隆 Git 仓库
# 在已存在目录中初始化仓库
git init
# 新建一个目录,将其初始化为 Git 仓库
git init <project-name>
# 克隆现有的仓库
git clone <url> [new-name]
暂存/跟踪
# 开始跟踪新文件/把已跟踪的文件放到暂存区/合并时把有冲突的文件标记为已解决状态
# (精确地将内容添加到下一次提交中)
git add <files>
# 添加当前目录的所有文件到暂存区
git add .
# 暂存文件特定部分(暂存补丁)(-p全称--patch)
git add -p
# 进入交互式暂存模式(-i全称--interactive)
git add -i
提交代码
# 提交(-m 指定提交信息,缺省则进入vim屏显模式)
git commit [-m <message>]
# 暂存并提交(-a 表示要进行 git add 操作)
git commit -a [-m <message>]
# 修补提交
# 用一个新的提交替换旧的提交;如果新提交代码没有变化,则修改提交信息;
# 每次修补提交都会修改哈希值
git commit --amend [-m <message>]
删除文件
# 删除
git rm <file>
# git rm <file>逆操作
git reset -- <file>
git checkout -- <file>
# 强制删除(用于删除之前修改过或已经放到暂存区的文件)
git rm -f <file>
# 从暂存区域移除,但仍保留在工作区域
git rm --cached <file>
重命名(移动文件)
# 移动文件
git mv <file> <new-file>
# 上面一条命令相当于以下三条命令
mv <file> <new-file>
git rm <file>
git add <new-file>
查看文件状态
# 检查当前文件状态
git status
# 以简短的方式,检查当前文件状态(-s全称--short)
git status -s
# 查看指定文件的状态
git status <pathspec>...
比较文件差异
# 比较工作区与暂存区文件的差异
git diff
# 比较暂存区与最后一次提交的文件差异(可使用cached或者staged)
git diff --cached
# 比较工作区与最后一次提交的文件差异
git diff HEAD
# 比较两次提交的差异
git diff <one-commit> <another-commit>
# 展示差异的简单统计(改动的文件数和行数)
git diff --stat
# 展示简短的统计(仅展示--stat最后一行)
git diff --shortstat
查看提交
# 查看当前分支提交历史
git log
# 以补丁的格式输出提交历史
git log -p
# 限制显示的数量
git log -3
# 显示简略的统计信息
git log --stat
# 显示--stat最后一行信息(更短的--stat)
git log --shortstat
# 以简写哈希值的一行一个提交的格式显示(用于浏览大量提交)
git log --oneline
# 以图表的格式显示所有提交历史情况(会形象显示分支分叉情况)
git log --oneline --decorate --graph --all
# 以指定的格式显示提交
git log --pretty=format:"%h - %an, %ar : %s"
# 常用的格式
# 选项 说明
# %H 提交对象(commit)的完整哈希字串
# %h 提交对象的简短哈希字串
# %T 树对象(tree)的完整哈希字串
# %t 树对象的简短哈希字串
# %P 父对象(parent)的完整哈希字串
# %p 父对象的简短哈希字串
# %an 作者(author)的名字
# %ae 作者的电子邮件地址
# %ad 作者修订日期(可以用 -date= 选项定制格式)
# %ar 作者修订日期,按多久以前的方式显示
# %cn 提交者(committer)的名字
# %ce 提交者的电子邮件地址
# %cd 提交日期
# %cr 提交日期,按多久以前的方式显示
# %s 提交说明
# 搜索添加/删除指定字符串的提交
git log -S <keyword>
# 搜索提交信息与指定模式匹配的提交
git log --grep <pattern>
# 显示指定路径文件修改的提交(建议加上--进行分开,避免与选项或修订范围混淆)
git log [--] <path>
# 显示整个提交历史,但跳过任何合并内容
git log --no-merges
# 查看某次提交(显示提交的元数据和内容变化)
git show <commit>
# 查看某个分支指向的提交
git show <branch>
# 查看当前HEAD指向的提交
git show HEAD
# 或者
git show
#查看HEAD在前五次所指向的提交
git show HEAD@{5}
# 查看某个提交的某个文件
git show <commit>:<file>
# 查看某个分支指向的 SHA-1
git rev-parse <branch>
# 查看一个分支有而另一个分支没有的提交
git log <not-branch>..<branch>
# 或者
git log ^<not-branch> <branch>
# 或者
git log <branch> --not <not-branch>
# 查看一些分支有而另一些分支没有的提交
git log <b1> <b2> <b3> --not <not-b4> <not-b5> <not-b6>
# 或者
git log <b1> <b2> <b4> ^<not-b4> ^<not-b5> ^<not-b6>
# 查看两分支彼此相对补集的并集的提交(查看两分支之一包含又不被两者同时包含的提交)
git log <one-branch>...<another-branch>
# git-log 常用的选项
# 选项 说明
# -(n) 仅显示最近的 n 条提交
# --since, --after 仅显示指定时间之后的提交。
# --until, --before 仅显示指定时间之前的提交。
# --author 仅显示指定作者相关的提交。
# --committer 仅显示指定提交者相关的提交。
撤销操作
# 复制暂存区的指定文件到工作区
git checkout -- <file>
# 以补丁的方式复制暂存区的指定文件到工作区(-p全称--patch)
git checkout <file> -p
# 把某个提交的指定文件复制到暂存区(省略<commit>则表示HEAD)(可以用来取消暂存)
git reset [<commit>] <file>
# 上面命令等同于
git restore --staged <file>
# 以补丁的方式把某个提交的指定文件复制到暂存区(-p全称--patch)(省略<commit>则表示HEAD)
git reset [<commit>] [<file>] -p
# 重置到HEAD第一个父提交(可以用来取消合并)
git reset HEAD~ --hard
# 重置到上一次HEAD指向的提交,可使用git reflog查看分支或其他引用在本地仓库的更新日志
git reset HEAD@{1} --hard
# 撤销推送
# 1. 重置到第一个父提交(取消合并)
git reset HEAD~ --hard
# 2. 强制推送(推送完,远程分支的最新提交记录被移除了)
git push -f
# 还原上一次提交
git revert HEAD
# 还原前两次提交
git revert HEAD HEAD~
# 还原合并(保留指定父提交,撤销另一个父提交)(-m全称--mainline)
# 保留第一父提交,撤销其他提交,创建一个新的提交对象
git revert -m 1 HEAD
远程仓库
# 显示所有远程仓库的简写
git remote
# 显示所有远程仓库的冗长一点的信息(简写和URL)(v全拼verbose,表示冗长的)
git remote -v
# 添加一个远程仓库
git remote add <short-name> <url>
# 获取远程引用的完整列表
git ls-remote <remote>
# 显示某个远程仓库信息(需要联网)
git remote show <remote>
# 修改某个远程仓库的简写名
git remote rename <old-name> <new-name>
# 修改某个远程仓库的地址
git remote set-url <remote> <new-url>
# 移除一个远程仓库(rm全称remove)
git remote rm <remote>
# 下载远程仓库的所有变动(remote默认为origin)
git fetch [<remote>]
# 下载远程仓库的所有变动,同时删掉所有远端都已经不存在的跟踪分支
git fetch --prune [<remote>]
# 下载所有远程仓库的所有变动
git fetch --all
# 拉取远程仓库的变化,并与本地分支合并(fetch和merge的集合操作)(省略则表示当前分支)
git pull [<remote> <branch>]
# 推送指定分支到远程仓库
# 或者
git push <remote> refs/heads/<local-branch>:refs/heads/<remote-branch>
git push <remote> heads/<local-branch>:refs/heads/<remote-branch>
git push <remote> <local-branch>:refs/heads/<remote-branch>
# 或者
git push <remote> refs/heads/<local-branch>:<remote-branch>
git push <remote> heads/<local-branch>:<remote-branch>
git push <remote> <local-branch>:<remote-branch>
# 或者
git push <remote> <branch>
# 或者(推送当前分支)
git push <remote>
# 或者(推送当前分支到上游分支,没设置上游分支则报错)
git push
# 推送并设置上游分支(-u全称--set-upstream)
git push -u <remote> <refspec>
# 将本地仓库镜像到远程仓库(包括但不限于refs/heads/, refs/remotes/和refs/tags/)
git push --mirror <remote>
# 推送所有分支到远程仓库(即refs/heads/下的refs)
git push --all <remote>
########## 删除远程分支
# 删除远程仓库的分支(-d全称--delete)
git push <remote> -d refs/heads/<remote-branch>
git push <remote> -d heads/<remote-branch>
git push <remote> -d <remote-branch>
# 或者
git push <remote> :refs/heads/<remote-branch>
git push <remote> :heads/<remote-branch>
git push <remote> :<remote-branch>
标签
# 列出所有标签
git tag
# 按通配符列出标签(-l全称--list)
git tag -l <通配符>
# 查看指定tag信息
git show <tag-name>
# 以较短形式查看指定tag信息
git show -s <tag-name>
# 创建附注标签(a指annotated)
git tag -a <tag-name> -m <message>
# 创建轻量标签
git tag <tag-name>
# 给指定的提交打标签
git tag -a <tag-name> <commit>
# 推送标签到远程仓库
git push [<remote>] <tag-name>
# 推送所有标签到远程仓库
git push [<remote>] --tags
# 删除本地标签
git tag -d <tag-name>
# 更新远程标签
git push <remote> :refs/tags/<tag-name>
# 删除远程标签
git push <remote> -d <tag-name>
# 基于指定标签创建并切换到该分支
git checkout -b <new-branch> <tag-name>
分支
# 查看本地所有分支列表
git branch
# 查看所有远程的所有分支列表
git branch -r
# 查看本地和远程所有分支的列表
git branch -a
# 查看每一个分支的最后一次提交
git branch [-a|-r] -v
# 查看每一个分支的最后一次提交及上游分支
git branch [-a|-r] -vv
# 查看HEAD所在的分支
git branch --contains HEAD
# 查看哪些分支已经合并到指定分支(不指定则当前)
git branch --merged [<branch>]
# 查看哪些分支还未合并到指定分支(不指定则当前)
git branch --no-merged [<branch>]
# 创建分支
git branch <new-branch>
# 基于指定的分支创建分支
git branch <new-branch> <branch>
# 基于指定的提交创建分支(可以作为 git reset --hard 的后悔药(使用git log或git reflog查找提交的id))
git branch <new-branch> <commit>
# 切换分支
git checkout <branch>
# 创建并切换分支
git checkout -b <new-branch>
# 重命名本地分支
git branch -m <old-branch-name> <new-branch-name>
# 检出远程分支
# 本地不存在此分支,远程存在
git checkout <remote-branch>
# 或者
git checkout --track <remote>/<remote-branch>
# 或者(可以取别名)
git checkout -b <branch> <remote>/<remote-branch>
# 或者(和上面一样,但只检出不切换)
git branch <branch> <remote>/<remote-branch>
# 设置/修改上游分支(-u全称--set-upstream-to)
#(注意:此命令不会联网,如果要设置为远程新建的分支,而又没有通过fetch获取远程数据,则会提示分支不存在)
git branch -u <remote>/<remote-branch>
分支合并
# 合并指定分支到当前分支
git merge <branch>
# 合并没有共同祖先的历史
git merge <branch> --allow-unrelated-histories
分支删除
# 删除本地分支
git branch -d <branch>
# 强制删除本地分支(如果要删除的分支包含还未合并的工作,-d会删除失败,此时可以使用-D来强制删除)
git branch -D <branch>
# 删除本地远程分支
git branch -dr <remote>/<remote-branch>
变基
# 将当前分支变基到指定分支
git rebase <newbase>
# 设置指定的上游分支进行变基
git rebase -onto <newbase> <upstream> <branch>
贮藏
# 贮藏文件(已修改和暂存的文件)
git stash [push]
# 查看所有贮藏
git stash list
# 查看指定贮藏(不指定则最近)
git stash show [stash@{<n>}]
# 应用指定贮藏(不指定则最近)
git stash apply [stash@{<n>}]
# 移除指定贮藏(不指定则最近)
git stash drop [stash@{<n>}]
# 应用并移除指定贮藏(不指定则最近)
git stash pop [stash@{<n>}]
# 贮藏文件并把他们保留在暂存区
git stash --keep-index
# 贮藏已跟踪、未跟踪的文件(-u全称--include-untracked)
git stash -u
# 贮藏已跟踪、未跟踪、忽略的文件(-a全称--all)
git stash -a
# 交互式贮藏(-p全称--patch)
git stash -p
# 从贮藏创建一个分支
git stash branch <new-branch>
清理
# 删除未跟踪的文件
git clean
# 删除未跟踪的文件和空的子目录
git clean -d
# 删除未跟踪的文件,当 clean.requireForce 设为 true 时(-f全称--force)
git clean -f
# 删除未跟踪和忽略的文件
git clean -x
# 演示将要清理的文件和目录(-n全称--dry-run)
git clean -d -n
祖先引用
# 查看第一父提交
git show <commit>^
# 查看第二父提交(合并提交可以有多个父提交)
git show <commit>^2
# 查看第一父提交(和【git show <commit>^】等价)
git show <commit>~
# 查看第一父提交的第一父提交
git show <commit>~2
# 或者
git show <commit>~~
# 查看第一父提交的第一父提交的第一父提交
#(~后面没数字表示一个,数字多大表示多少个,0则表示当前引用)
git show <commit>~3
# 或者
git show <commit>~~~
# 或者混用~和数字
git show <commit>~2~
底层命令
# 从文件创建仓库对象
git hash-object -w <file>
# 输出仓库对象的内容或详细信息
git cat-file [选项] <object>
# 常用的选项有:
# -p 打印出对象内容
# -t 显示对象类型
# -s 显示对象大小
# -e 检查对象是否存在(不输出内容表示存在)
# 打印master分支最新提交指向的树对象
git cat-file -p master^{tree}
# 把文件添加到暂存区
git update-index --add <file>
# 例如,暂存.vscode目录文件:git update-index --add .vscode/*
# 从暂存区中删除文件,如果文件在工作目录存在则不删除
git update-index --remove <file>
# 从暂存区中删除文件,即使文件在工作目录存在
git update-index --force-remove <file>
# 从当前索引创建一个树对象
git write-tree
# 将树对象读取到暂存区中
git read-tree <tree-object>
# 将树对象作为一个子树读取到暂存区
git read-tree --prefix=<目录名> <tree-object>
# 创建一个提交对象
git commit-tree <tree-object> -m <提交信息>
# 创建一个提交对象,同时指定它的父提交对象
git commit-tree <tree-object> -m <提交信息> -p <parent-commit-object>
# 更新 ref 的对象名(如果没有此 ref 则创建)
git update-ref <ref> <object>
# 例如,更新 master 对象名:git update-ref refs/heads/master cac0cab
# 例如,更新 HEAD 的对象名:git update-ref HEAD cac0cab
# 查看 HEAD 指向的ref
git symbolic-ref HEAD
# 修改 HEAD 指向的ref
git symbolic-ref HEAD refs/heads/test
# 创建一个轻量标签
git update-ref refs/tags/v1.0 <commit>
# 统计未打包的对象数量及其磁盘消耗
git count-objects -vH
# 清理不必要的文件并优化本地存储库
git gc
# 立刻清理不必要的文件并优化本地存储库
git gc --prune=now
# 显示索引和工作树中有关文件的信息
git ls-files
# 常用选项
# -z: \0输出行终止,不引用文件名
# -c[--cached]: 在输出中显示缓存的文件(默认)
# -d[--deleted]: 在输出中显示已删除的文件
# -m[--modified]: 在输出中显示已修改的文件
# -o[--others]: 在输出中显示其他(即未跟踪)文件
# -i[--ignored]: 仅显示输出中的忽略文件
# -s[--stage]: 在输出中显示暂存内容的模式位,对象名称和阶段编号
# 查看列出的文件的总大小
git ls-files -z | xargs -0 du -ch | grep total$
# 查看树对象的内容
git ls-tree -r <commit>
删除大文件
# 查看git仓库大小
git ls-files -z | xargs -0 du -ch | grep total$
# 查找整个提交树中超过指定大小的文件(将<size>改为你想要的大小,单位字节)
git rev-list --objects --all | git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' | awk '$3 >= <size> {print}'
# 删除文件(将<path>改为你想要的文件路径)
git filter-branch --force --index-filter 'git rm -rf --cached --ignore-unmatch <path>' --prune-empty --tag-name-filter cat -- --all
# 推送到远程仓库
git push origin --force --all
# 清除缓存
rm -rf .git/refs/original/
git reflog expire --expire=now --all
git gc --prune=now
git flow命令
# 使用git flow初始化仓库
git flow init -d
# 查看git flow版本
git flow version
# 功能分支列表
git flow feature list
# 建立新的功能分支
git flow feature start <new-branch-name> <start-at-branch-name>
# 完成功能分支
git flow feature finish <branch-name>
系统相关命令
# 输出字符串到文件(文件不存在会创建)
echo <string> > <file>
# 编辑/创建文件(没有就创建)
# i切换为编辑模式,esc切换为命令模式;命令模式下,输入冒号后接命令:
# q:退出(有修改文件会警告),q!:不保存退出,x:保存退出
vim <file>
# 连接文件并打印到标准输出设备上(查看文件内容)
cat <file>
# 在指定目录下查找文件和目录
find <路径> [选项]
.gitignore
规则
- 所有空行或者以 # 开头的行都会被 Git 忽略。
- 可以使用标准的 glob 模式匹配,它会递归地应用在整个工作区中。
- 匹配模式可以以(/)开头防止递归。
- 匹配模式可以以(/)结尾指定目录。
- 要忽略指定模式以外的文件或目录,可以在模式前加上叹号(!)取反。
glob
glob 模式是指 shell 所使用的简化了的正则表达式。glob通常用匹配目录或文件。
- 星号(*)匹配零个或多个任意字符;
- [abc] 匹配任何一个列在方括号中的字符;
- 问号(?)只匹配一个任意字符;
- 如果在方括号中使用短划线分隔两个字符, 表示所有在这两个字符范围内的都可以匹配(比如 [0-9] 表示匹配所有 0 到 9 的数字);
- 使用两个星号(**)表示匹配任意中间目录,比如 a/**/z 可以匹配 a/z 、 a/b/z 或 a/b/c/z 等。
常见问题
- 问题:配置好了SSH公钥,但是推送代码时还是需要账号密码;
- 原因:远程URL使用了HTTPS协议;
- 解决:将远程URL设置为SSH协议,例如:git remote set-url origin git@github.com:[username]/[repository].git