文章目录
- git add
- git blame
- git branch
- git checkout
- git cherry-pick
- git clone
- git commit
- git config
- git diff
- git fetch
- git init
- git log
- git ls-files
- git merge
- git mv
- git push
- git pull
- git reflog
- git remote
- git reset
- git restore
- git revert
- git rm
- git shortlog
- git show
- git status
- git stash
- git switch
- git tag
- git whatchanged
git add
添加到暂存区
git add . # 添加当前目录下的所有文件到暂存区 git add dir/ # 添加指定目录下的所有文件到暂存区 git add file1 file2 # 只添加指定的文件到暂存区
相关
git reset HEAD -- . # 撤销暂存区的所有改动,但不会影响工作目录git diff --cached # 显示暂存区与上一次提交(本地仓库)之间的差异
git blame
可以追溯一个指定文件的历史修改记录
git blame <文件名> # 显示一个文件的逐行历史修改记录,包括作者和修改时间git blame -L 69,82 <文件名> # 显示文件第69--82行最近一次的修改记录git blame --line-porcelain <文件名> # 显示文件修改历史,不包含文件名和行号git blame --show-email <文件名> # 显示文件的修改历史,只显示行号和作者
git branch
用于列出、创建或删除分支
git branch # 列出本地所有分支git branch <分支名> # 创建一个新的分支git branch -d <分支名> # 删除指定的分支git branch -m <旧分支名> <新分支名> # 重命名一个分支git branch -r # 列出远程所有分支git branch -a # 列出本地和远程所有分支git branch -v # 列出本地所有分支并显示最后一次提交git branch -vv # 列出本地所有的分支并显示最后一次提交和对应的远程分支
git checkout
用于切换分支或恢复工作目录的文件,它是git最常用的命令之一,同时也是一个很危险的命令,因为这条命令会重写工作区。
git checkout <分支名> # 切换到指定的分支git checkout -b <新分支名> # 创建并切换到一个新的分支,相当于 git branch <分支名> 再 git checkout <分支名>git checkout <提交ID> # 恢复到指定的提交git checkout <文件名> # 恢复指定文件到暂存区或最后一次提交状态git checkout -- <文件名> # 丢弃工作目录中对指定文件的修改git checkout <分支名> -- <文件名> # 从指定分支恢复文件到当前分支git checkout -b <分支名> origin/<分支名> # 克隆完远程分支后,默认只有master分支,此命令切换到远程分支 git checkout <提交ID> -- <文件名> # 恢复某一文件。如果在暂存区有就从暂存区恢复,否则从版本库恢复。
git cherry-pick
用于将一个或多个提交的更改应用到当前分支
git cherry-pick <提交ID> # 将指定的提交应用到当前分支git cherry-pick <提交ID1> <提交ID2> # 将多个指定的提交依次应用到当前分支git cherry-pick <提交ID1>..<提交ID2> # 将一段范围内的提交应用到当前分支git cherry-pick --continue # 解决冲突后继续应用提交git cherry-pick --abort # 取消当前的cherry-pick操作git cherry-pick --quit # 退出当前的cherry-pick操作但保留已经应用的提交
git clone
用于从远程仓库克隆一个完整的仓库到本地
git clone <仓库地址> # 克隆远程仓库到本地git clone <仓库地址> <目录> # 克隆远程仓库到指定的本地目录git clone -b <分支名> <仓库地址> # 克隆指定分支的远程仓库git clone --depth <深度> <仓库地址> # 进行浅克隆,只获取指定深度的提交记录git clone --single-branch <仓库地址> # 只克隆指定分支,而不获取其他分支git clone --recurse-submodules <仓库地址> # 克隆远程仓库并初始化、更新所有子模块
git commit
用于提交暂存区的更改到本地仓库
git commit # 把暂存区中的文件提交到本地仓库,调用文本编辑器输入提交信息git commit -m "<提交信息>" # 提交暂存区的更改并添加提交信息git commit -a -m "<提交信息>" # 跳过暂存区,直接提交所有已修改的文件并添加提交信息git commit --amend -m "<新提交信息>" # 修改上一次提交的信息或包括新的更改git commit --amend --no-edit # 修改上一次提交,不改变提交信息git commit -v # 提交时显示所有差异git commit --squash <提交ID> # 将当前更改与指定提交合并为一个提交git commit --fixup <提交ID> # 创建一个修复指定提交的提交
从本地仓库撤销到暂存区:git reset --soft HEAD^
git config
用于配置Git的设置,例如用户信息、编辑器等
git config --global user.name "<用户名>" # 设置全局用户名git config --global user.email "<邮箱地址>" # 设置全局用户邮箱git config --global core.editor "<编辑器>" # 设置全局默认编辑器git config --list # 列出所有当前配置git config <key> # 获取指定配置项的值git config --global alias.<别名> "<命令>" # 创建全局别名git config --system --list # 列出系统范围内的配置
git diff
查看差异
git diff # 显示工作目录中所有文件的尚未暂存的改动git diff <文件名> # 显示指定文件的尚未暂存的改动git diff --cached # 显示已暂存到索引但尚未提交的改动git diff --stat # 以统计方式显示改动,列出哪些文件被修改以及修改的行数git diff HEAD # 显示工作目录和最新提交之间的所有改动git diff HEAD^ # 显示工作目录和上一个提交之间的改动git diff HEAD~5 # 显示工作目录和前五次提交之前的改动git diff <提交ID> # 显示工作目录和指定提交之间的改动git diff <分支名> # 显示当前分支与指定分支之间的差异git diff <分支名称> <分支名称> # 显示两个指定分支之间的差异git diff <分支名称>...<分支名称> # 显示两个分支的共同祖先以来的差异git diff origin/dev dev # 显示远程分支origin/dev和本地分支dev之间的差异
git fetch
用于从远程仓库获取最新的更新,但不会自动合并这些更新
git fetch # 从默认的远程仓库(通常是 origin)获取所有分支的更新git fetch <远程仓库名> # 从指定的远程仓库获取更新git fetch <远程仓库名> <分支名> # 从指定的远程仓库获取指定分支的更新git fetch --all # 从所有配置的远程仓库获取更新git fetch --prune # 获取更新时删除远程仓库中已删除的分支git fetch origin # 从远程仓库 origin 获取更新git fetch origin master # 从远程仓库 origin 获取 master 分支的更新git fetch origin +refs/heads/*:refs/remotes/origin/* # 强制更新所有远程分支到本地
git init
用于初始化一个新的 Git 仓库
git init # 在当前目录初始化一个新的 Git 仓库git init <目录名> # 在指定目录下初始化一个新的 Git 仓库git init --bare # 初始化一个裸仓库,不包含工作目录,通常用于远程仓库git init --template=<模板目录> # 使用指定的模板目录初始化一个新的 Git 仓库git init --separate-git-dir=<git目录> # 将 Git 仓库的元数据存储在指定目录中,而不是默认的 .git 目录
git log
用于查看仓库的提交历史记录
git log # 显示所有提交的历史记录git log -n 5 # 显示最近的 5 次提交git log --oneline # 简洁地显示提交历史,每个提交一行git log --graph # 以图形方式显示提交历史git log --stat # 显示每次提交的文件修改统计git log --author="作者名" # 只显示指定作者的提交git log --since="2023-01-01" # 显示自指定日期以来的提交git log --until="2023-06-14" # 显示截至指定日期的提交git log --grep="关键字" # 只显示提交信息中包含指定关键字的提交git log <分支名> # 显示指定分支的提交历史git log develop -n 3 # 显示 develop 分支最近的 3 次提交git log origin/develop -n 3 # 显示远程仓库 origin 的 develop 分支最近的 3 次提交git log <提交ID> # 从指定提交开始显示提交历史
git ls-files
用于显示当前工作区中被 Git 跟踪的文件列表
git ls-files # 显示当前工作区中所有被 Git 跟踪的文件git ls-files -o # 显示当前工作区中未被 Git 跟踪的文件git ls-files -i # 显示当前工作区中被忽略的文件git ls-files -m # 显示当前工作区中被修改但未提交的文件git ls-files -s # 显示文件的状态信息,包括文件模式、对象名和文件名git ls-files --stage # 显示文件的索引信息git ls-files -d # 显示已被删除但尚未提交的文件
git merge
用于合并不同分支的内容
git merge <分支名> # 将指定分支合并到当前分支git merge --no-ff <分支名> # 禁用快速合并,确保创建一个新的合并提交git merge --squash <分支名> # 将指定分支的所有提交压缩为一个提交git merge --abort # 取消当前的合并过程并恢复到合并前的状态git merge --no-commit <分支名> # 合并指定分支但不自动提交git merge --strategy=recursive -X theirs <分支名> # 使用指定策略合并,并在冲突时优先选择指定分支的内容git merge --strategy=recursive -X ours <分支名> # 使用指定策略合并,并在冲突时优先选择当前分支的内容
git mv
用于移动或重命名被 Git 跟踪的文件或目录
git mv <旧文件路径> <新文件路径> # 将文件从旧路径移动到新路径git mv <旧目录路径> <新目录路径> # 将目录从旧路径移动到新路径git mv -f <旧文件路径> <新文件路径> # 强制移动文件,即使目标路径已存在文件git mv <旧文件路径1> <旧文件路径2> <新目录路径> # 将多个文件移动到新目录
git push
用于将本地分支的提交推送到远程仓库
git push <远程仓库名> <分支名> # 将指定分支推送到远程仓库git push origin main # 将本地主分支推送到名为 origin 的远程仓库git push --all # 推送所有本地分支到远程仓库git push --tags # 推送所有本地标签到远程仓库git push -u origin main # 推送本地主分支到远程仓库并设置跟踪git push --force # 强制推送,即使会覆盖远程仓库的历史记录git push origin :<分支名> # 删除远程仓库中的指定分支git push <远程主机名> <本地分支名>:<远程分支名> # 将本地分支推送到远程分支,可以用于重命名远程分支git push origin HEAD:<分支名> # 将当前分支推送到远程的新分支git push --set-upstream origin <分支名> # 将本地分支推送到远程分支,并设置本地分支与远程分支的跟踪关系
git pull
用于从远程仓库获取最新的更改并合并到当前分支。 首先会执行 git fetch,然后执行 git merge,把获取的分支的 HEAD 合并到当前分支。
git pull <远程仓库名> <分支名> # 从指定的远程仓库和分支拉取更新并合并到当前分支git pull origin main # 从名为 origin 的远程仓库的主分支拉取更新并合并到当前分支git pull --rebase # 拉取更新并在本地提交之上重新应用(rebase)远程提交git pull --ff-only # 仅执行快速合并(fast-forward),如果不能快速合并则终止git pull --no-commit # 拉取更新但不自动提交合并结果git pull --squash # 拉取更新并将所有更改压缩为一个提交
git reflog
用于查看本地仓库的引用日志,记录了所有分支和 HEAD 的移动历史
git-reflog是用来恢复本地错误操作很重要的一个命令
git reflog # 显示所有引用的日志记录git reflog show <分支名> # 显示指定分支的引用日志git reflog show HEAD@{2} # 显示 HEAD 在两次前的状态git reflog expire --expire=now --all # 清除所有引用日志git reflog delete --rewrite <分支名>@{n} # 删除指定引用日志条目
git remote
用于管理远程仓库的链接
git remote # 列出所有远程仓库git remote -v # 显示所有远程仓库的详细信息,包括 fetch 和 push 的 URLgit remote add <远程仓库名> <仓库URL> # 添加一个新的远程仓库git remote remove <远程仓库名> # 删除一个远程仓库git remote rename <旧远程仓库名> <新远程仓库名> # 重命名一个远程仓库git remote set-url <远程仓库名> <新URL> # 修改远程仓库的 URL 地址
git reset
用于重置当前分支的 HEAD 到指定状态,可以更改暂存区和工作目录
语法:git reset [--soft | --mixed | --hard] [HEAD]
git reset --soft <提交ID> # 重置到指定提交,但保留暂存区和工作目录的更改git reset --soft HEAD^ # 本地仓库撤回到暂存区,相当于调用 "git reset <commit ID>" 命令后又做了一次 "git add"git reset --mixed <提交ID> # 重置到指定提交,保留工作目录的更改,但清空暂存区(默认方式)git reset --hard <提交ID> # 重置到指定提交,清空暂存区和工作目录的所有更改git reset HEAD~1 # 重置到上一个提交,保留工作目录的更改,但清空暂存区git reset <文件名> # 从暂存区中移除指定文件的更改,但保留工作目录的更改,相当于撤销git add,可以指定文件也可以不指定
git restore
用于恢复工作目录或暂存区的文件
git restore <文件名> # 恢复工作目录中的指定文件到最近一次提交的状态git restore --staged <文件名> # 从暂存区中移除指定文件的更改,但保留工作目录的更改git restore --source=<提交ID> <文件名> # 恢复指定提交中的文件到工作目录git restore --worktree <文件名> # 恢复工作目录中的指定文件(默认行为)git restore --staged --worktree <文件名> # 同时恢复暂存区和工作目录中的指定文件
git revert
生成一个新的提交来撤销某次提交,此次提交之前的所有提交都会被保留
git revert <提交ID> # 创建一个新的提交,撤销指定的提交git revert -n <提交ID> # 创建一个新的提交,撤销指定的提交,但不自动提交更改git revert --no-edit <提交ID> # 创建一个新的提交,撤销指定的提交,并跳过提交信息编辑git revert HEAD # 撤销最近的一次提交git revert HEAD~2..HEAD # 撤销最近的两次提交
git rm
用于从暂存区和工作目录中删除文件
git rm <文件名> # 从暂存区和工作目录中删除指定文件git rm --cached <文件名> # 仅从暂存区中删除指定文件,但保留工作目录中的文件git rm -r <目录名> # 递归删除指定目录及其内容git rm -f <文件名> # 强制删除已修改或已暂存的文件git rm -n <文件名> # 显示将要删除的文件,但不实际删除
git shortlog
用于生成提交历史的简短摘要,按作者分组
git shortlog # 显示所有提交的简短摘要,按作者分组git shortlog -s # 只显示每个作者的提交数量git shortlog -n # 按提交数量排序作者git shortlog -e # 显示每个作者的电子邮件地址git shortlog v1.0..HEAD # 显示从标签v1.0到当前HEAD的提交摘要
git show
用于显示各种类型的对象(如提交、标签等)的详细信息
git show <对象> # 显示指定对象的详细信息,通常是提交git show # 显示最近一次提交的详细信息git show <提交ID> # 显示指定提交的详细信息git show <提交ID>:<文件名> # 显示指定提交中某个文件的内容git show --name-only <提交ID> # 显示指定提交的文件修改列表,不包括具体内容git show --raw <提交ID> # 显示指定提交的详细信息,包括文件修改的原始差异信息git show --stat <提交ID> # 显示指定提交的统计信息(文件修改数量、插入和删除行数)git show --pretty=short <提交ID> # 以简短格式显示指定提交的日志信息
git status
用于显示工作目录和暂存区的状态。
git status # 显示工作目录和暂存区的状态信息git status -s # 以简短格式显示状态信息git status --short # 同上,简短格式显示状态信息git status -b # 显示当前分支信息以及与上游分支的差异git status --branch # 同上,显示当前分支信息git status --ignored # 显示被忽略的文件git status --untracked-files=all # 显示所有未跟踪的文件git status --untracked-files=no # 不显示未跟踪的文件git status --untracked-files=normal # 默认选项,显示未跟踪的文件
git stash
用于临时保存当前工作目录的修改,以便在以后恢复
git stash # 保存当前工作目录的修改到栈中git stash save "描述信息" # 保存当前工作目录的修改,并添加描述信息git stash list # 显示所有保存的修改列表git stash apply # 恢复最近一次保存的修改,但不删除该保存git stash apply stash@{2} # 恢复指定的保存(例如第二个保存),但不删除该保存git stash pop # 恢复最近一次保存的修改,并删除该保存git stash drop # 删除最近一次保存的修改git stash drop stash@{2} # 删除指定的保存(例如第二个保存)git stash clear # 清空所有保存的修改git stash show # 显示最近一次保存的修改内容git stash show stash@{2} # 显示指定保存的修改内容git stash branch <分支名> # 在新分支上应用最近一次保存的修改
git switch
用于切换分支或创建新分支
git switch <分支名> # 切换到指定的分支git switch -c <新分支名> # 创建并切换到新分支git switch -C <新分支名> # 强制创建并切换到新分支,如果分支已存在则覆盖git switch - # 切换到上一个分支git switch --detach <提交ID> # 切换到指定的提交,不关联任何分支
git tag
用于给提交打标签,通常用于标记版本
git tag # 列出所有标签git tag <标签名> # 给当前最新提交打一个标签git tag -a <标签名> -m "标签信息" # 创建带有信息的注释标签git tag -d <标签名> # 删除指定的标签git tag -l "v1.0.*" # 列出符合特定模式的标签,例如所有以v1.0.开头的标签git tag <标签名> <提交ID> # 给指定的提交打标签git show <标签名> # 显示指定标签的详细信息git push origin <标签名> # 推送指定标签到远程仓库git push origin --tags # 推送所有标签到远程仓库git push origin :refs/tags/<标签名> # 删除远程仓库中的指定标签git checkout <标签名称> # 切换到指定的标签git show <标签名称> # 查看标签的信息
git whatchanged
用于显示提交历史及其引入的文件变化
git whatchanged # 显示提交历史及其引入的文件变化git whatchanged -p # 以补丁格式显示提交历史及其引入的文件变化git whatchanged --since="2 weeks ago" # 显示两周以来的提交历史及其引入的文件变化git whatchanged --until="2023-01-01" # 显示指定日期之前的提交历史及其引入的文件变化git whatchanged -n 5 # 显示最近的5次提交历史及其引入的文件变化git whatchanged <路径> # 显示指定路径的提交历史及其引入的文件变化