外观
常用命令
约 3543 字大约 12 分钟
2025-06-20
目录
配置
配置用户名和邮箱
# 查看配置
git config user.name
git config user.email
# 临时修改当前仓库的提交者信息
git config user.name "username"
git config user.email "email"
# 全局修改用户名和邮箱(推荐)
git config --global user.name "username"
git config --global user.email "email"正常显示中文
# Git 默认开启了 core.quotepath,会把中文等非 ASCII 字符转义成 \346\265\213 这样的八进制编码,所以看起来是乱码。把这项配置设为 false,Git 就不再转义,直接显示原始文件名
git config --global core.quotepath false配置换行符
- Windows 用户:
git config --global core.autocrlf true,提交时把 CRLF 转成 LF,检出时转回 CRLF,本地用着舒服,仓库里也统一。 - macOS/Linux 用户:
git config --global core.autocrlf input,提交时把 CRLF 转成 LF,检出时不转换,保证仓库和本地都是 LF。 - 不想要任何转换:
git config --global core.autocrlf false,Git 完全不碰换行符,适合团队系统统一的情况。
项目级精准控制:.gitattributes 全局配置是一刀切,团队协作更推荐在仓库根目录建 .gitattributes 文件,它优先级高于 core.autocrlf,能按文件类型精细控制,并且随仓库走,大家拉下来就生效。
统一 LF:* text=auto eol=lf,强制所有文本文件用 LF。 特定文件用 CRLF:.bat text eol=crlf,Windows 批处理脚本必须 CRLF 才能正常跑。 标记二进制文件:.png binary,防止 Git 误改换行符导致文件损坏。
项目初始化与克隆
项目初始化
git init # 在当前目录创建空仓库
git init project-name # 新建目录并初始化为 Git 仓库项目克隆
git clone <url> # 克隆远程仓库
git clone <url> <local-dir> # 克隆到指定本地目录从零初始化示例
git init
touch README.md
git add README.md
git commit -m "initial commit"
git remote add origin https://git.url/path.git
git push -u origin main提示:GitHub 等现代平台默认分支名为
main,而非master。
分支管理
创建 / 切换分支
git branch <name> # 创建新分支
git checkout <name> # 切换分支
git switch <name> # 切换分支(Git 2.23+,推荐)
git checkout -b <name> # 创建并切换分支
git switch -c <name> # 创建并切换分支(Git 2.23+,推荐)分支操作
git branch # 列出本地分支
git branch -r # 列出远程分支
git branch -a # 列出本地和远程所有分支
git pull origin <branch-name> # 拉取远程分支
git merge <branch-name> # 合并分支到当前分支
git push origin <branch-name> # 推送分支到远程
git push --set-upstream origin <branch-name> # 首次推送并关联远程分支
git branch -m <new-name> # 重命名当前分支
git branch -m <old-name> <new-name> # 重命名指定分支
git branch -d <name> # 删除已合并的本地分支
git branch -D <name> # 强制删除本地分支(含未合并的)
git push origin --delete <name> # 删除远程分支
git fetch origin # 把远程所有的最新改动下载到本地的只读指针中
git merge origin/B # 将远程的 B 分支直接合并到当前分支
# 语法:git fetch <远程主机名> <远程分支名>:<本地分支名>
git fetch origin B:B # 强制更新本地 B 指针(前提:本地 B 分支没有未推送的提交,且可以被快进)远程仓库管理
git remote -v # 查看远程仓库地址
git remote add <name> <url> # 添加远程仓库
git remote remove <name> # 删除远程仓库
git remote set-url <name> <url> # 修改远程仓库地址清理远程分支缓存
git fetch --prune # 拉取远程最新状态并删除本地已不存在的远程分支引用修改远程 URL
方式一:直接修改
git remote set-url origin https://new.url/path.git
git branch --set-upstream-to=origin/<branch> <local-branch>方式二:先删后加
git remote rm origin
git remote add origin https://new.url/path.git
git push --set-upstream origin main方式三:直接编辑配置文件
# 编辑 .git/config 文件
# 找到 [remote "origin"] 段,修改 url 字段SVN 和 Git 共存处理
将一个 SVN 仓库转换为 Git 仓库:
svn checkout <svn-url> new-directory
git clone --no-checkout <git-repo-url> tmp
mv tmp/.git .
rm -rf tmp
git reset --hard HEAD提示:更规范的方式是使用
git svn clone命令直接克隆 SVN 仓库为 Git 仓库。
.gitignore
语法规则
.gitignore 文件中的每一行表示一个忽略规则,遵循以下约定:
- 空行和以
#开头的行为注释,会被忽略 - 规则支持通配符
*、?和** - 以
/结尾的规则表示目录 - 以
!开头的规则表示排除忽略(即重新跟踪)
忽略指定文件或目录
myfile.txt # 忽略某个文件
mydir/ # 忽略某个目录及其所有内容忽略某种类型的文件
*.txt # 忽略所有 .txt 文件
*.log # 忽略所有 .log 文件使用 ! 例外规则
logs/*.txt # 忽略 logs 目录下所有 .txt 文件
!logs/important.txt # 但保留 important.txt 不被忽略使用 / 指定目录
/node_modules/ # 仅忽略根目录下的 node_modules
node_modules/ # 忽略所有层级的 node_modules 目录使用 ** 进行递归匹配
**/temp/ # 忽略任意层级的 temp 目录
**/*.log # 忽略任意层级的 .log 文件生效规则
已被 Git 跟踪的文件不会被
.gitignore规则影响。 需要先将其从 Git 追踪中移除。
# 预览将要删除的跟踪文件(不实际删除)
git rm -r --cached "bin/"
# 正式移除跟踪
git rm -r --cached <file_or_dir>
# 提交变更
git commit -m "Remove tracked files from .gitignore"
git push origin <branch>检查文件是否被忽略
git check-ignore -v <file>暂存 Stash
基本概念
git stash 会将当前工作目录和暂存区的更改保存到一个临时堆栈中,并恢复工作区到最近一次提交的状态。
未跟踪文件:
git stash默认只保存已跟踪文件的修改,不保存新创建的未跟踪文件。如需同时保存未跟踪文件,使用git stash -u(或git stash --include-untracked)。
常用命令
git stash # 暂存当前修改(带自动备注)
git stash save "message" # 暂存并添加自定义备注
git stash list # 查看 stash 列表
git stash show # 显示最近一次 stash 的变更摘要
git stash show stash@{0} # 查看指定 stash 的摘要
git stash show -p stash@{0} # 查看指定 stash 的详细差异应用与恢复
git stash apply # 应用最近一次的 stash(不移除)
git stash apply stash@{0} # 应用指定 stash
git stash pop # 应用最近一次的 stash 并移除
git stash drop stash@{n} # 删除指定 stash
git stash clear # 清空所有 stash回滚版本 Reset
git reset 用于回退到某个历史版本,会改变分支的 HEAD 指向。
三种模式
| 模式 | 命令 | 效果 |
|---|---|---|
| soft | git reset --soft <commit> | 仅回退 HEAD,暂存区和工作区不变 |
| mixed | git reset <commit> | 回退 HEAD 和暂存区,工作区不变(默认) |
| hard | git reset --hard <commit> | 回退 HEAD、暂存区和工作区 |
丢弃已暂存的修改
git reset HEAD <file> # 丢弃某个文件的暂存
git reset HEAD # 丢弃所有文件的暂存丢弃工作区的修改
git checkout -- <file> # 丢弃某个文件的修改
git checkout -- . # 丢弃所有文件的修改提示:Git 2.23+ 推荐使用
git restore替代git checkout --:git restore <file> # 丢弃工作区修改 git restore --staged <file> # 取消暂存
同时丢弃暂存和工作区的修改
git reset --hard HEAD # 丢弃所有已暂存和未暂存的修改回退到指定提交
git reset --soft HEAD~1 # 撤销最近一次 commit(保留变更到暂存区)
git reset --mixed HEAD~1 # 撤销最近一次 commit(保留变更到工作区)
git reset --hard HEAD~1 # 撤销最近一次 commit(丢弃所有变更)
git reset --hard <commit-id> # 回退到指定提交撤销已推送到远程的 commit
git reset --hard HEAD~1 # 本地回退
git push --force origin <branch> # 强制推送到远程警告:
--force会改写远程历史,请确保没有其他人在基于当前分支工作。
撤销已提交但未推送的 commit(修改提交信息)
git commit --amend -m "new commit message"放弃本地修改,强制同步远程
git fetch --all # 拉取远程最新状态
git reset --hard origin/main # 强制同步到远程最新状态Revert
git revert 用于创建一个新的 commit 来撤销指定 commit 的修改,不会改写历史,适合已推送到远程的提交。
git revert <commit-id> # 撤销指定提交
git revert HEAD # 撤销最近一次提交
git revert HEAD~3 # 撤销倒数第四次提交
git revert -n <commit-id> # 撤销但不自动提交
git revert --abort # 撤销冲突解决过程中的 revertRebase
git rebase 用于将当前分支的提交「重新播放」到另一个分支之上,可重写提交历史,保持日志整洁。
基本用法
git checkout <branch-a> # 切换到目标分支
git rebase <branch> # 将 branch-a 的提交重放到 branch 之上等价于:
git fetch获取最新的 branch 分支- 把 branch-a 上的提交一个个摘下来
- 在 branch 分支上重新应用这些提交
示例
假设当前提交历史如下:
A---B---C (branch)
\
D---E (branch-a)执行 git checkout branch-a && git rebase branch 后变为:
A---B---C---D'---E' (branch-a)拉取远程代码时使用 rebase
git pull --rebase origin main # 拉取并变基,避免不必要的合并提交等价于:
git fetch origin
git rebase origin/main交互式变基
git rebase -i HEAD~3 # 交互式重写最近 3 次提交Git 会打开编辑器,显示类似以下内容:
pick 1234567 initial commit
pick 2345678 add feature
pick 3456789 fix bug| 命令 | 说明 |
|---|---|
pick | 保留该提交(默认) |
reword | 保留提交,但修改提交信息 |
edit | 暂停在该提交,可修改内容后继续 |
squash | 合并到前一个提交,保留两者的提交信息 |
fixup | 合并到前一个提交,丢弃当前提交信息 |
drop | 删除该提交 |
Rebase 解决冲突
# 手动解决冲突文件
git add <resolved-files> # 标记冲突已解决
git rebase --continue # 继续 rebase
git rebase --abort # 放弃 rebase,恢复到操作前状态
git rebase --skip # 跳过当前有冲突的提交合并 Merge
将另一个分支的更改合并到当前分支。
合并模式
| 模式 | 说明 |
|---|---|
| 快进合并(Fast-forward) | 直接将 HEAD 移动到目标分支的最新提交,无额外合并提交 |
| 三方合并(No-fast-forward) | 当前分支和目标分支都有各自提交时,创建新的合并提交 |
git merge <branch-name> # 合并分支到当前分支
git merge --no-ff <branch-name> # 强制创建合并提交
git merge --squash <branch-name> # 将分支所有提交压缩为一次合并(不创建合并提交)
git merge --abort # 合并冲突时终止合并,恢复到合并前状态Cherry-pick
git cherry-pick 用于将指定提交应用到当前分支。
基本用法
git cherry-pick <commit-hash> # 应用指定提交注意:参数不一定是 commit hash,也可以是分支名,表示引入该分支的最新提交。
批量与多个提交
git cherry-pick <start>^..<end> # 挑选从 start 到 end 的连续提交
git cherry-pick <hash1> <hash2> <hash3> # 挑选不连续的多个提交
git cherry-pick --continue # 解决冲突后继续
git cherry-pick --abort # 有冲突时中止操作常用选项
git cherry-pick -e <commit-hash> # 提交前允许修改提交信息
git cherry-pick -n <hash1> <hash2> # 应用提交但不自动 commit
git cherry-pick -x <commit-hash> # 在提交信息末尾添加原始提交引用删除文件 Rm
常用操作
git rm <file> # 删除文件并从暂存区移除
git rm --cached <file> # 从暂存区移除,保留本地文件(配合 .gitignore 使用)
git rm -r <dir> # 递归删除目录
git rm -f <file> # 强制删除已修改但未提交的文件恢复被删除的文件
git restore <file> # 如果文件仍在版本控制中
git checkout <commit-hash> -- <file> # 从指定提交恢复文件清理工作区 Clean
git clean 用于删除工作区中未被 Git 跟踪的文件。
警告:此操作不可撤销,执行前务必确认。建议使用
-n预览后再执行。
常用命令
git clean -n # 预览将要删除的文件(dry-run)
git clean -f # 删除未跟踪的文件
git clean -fd # 删除未跟踪的文件和目录
git clean -xfd # 删除未跟踪文件和被 .gitignore 忽略的文件
git clean -f xxx.log # 删除指定文件
git clean -fd logs/ # 删除指定目录参数说明
| 参数 | 说明 |
|---|---|
-f / --force | 强制删除,需要配置 clean.requireForce 为 false 或使用 -f |
-d / --directories | 同时删除未跟踪的目录 |
-x / --exclude | 同时删除被 .gitignore 忽略的文件 |
-n / --dry-run | 预览模式,不实际删除 |
查看历史 Log
常用命令
# 查看最近一周某作者的提交
git log --pretty=format:"%h %ad %an %s" --author=xxx --since=7.days
# 图形化展示提交历史(最近 20 条)
git log --pretty=format:"%h %ad %an %s" --oneline --graph --all -20
# 显示所有分支的提交图
git log --graph --all
# 查看指定日期范围内的提交
git log --since="2024-01-01" --until="2024-01-31"
# 查看指定文件的提交历史
git log -- <file>
# 查看指定分支的提交历史
git log <branch>
# 搜索提交信息中包含关键字的提交
git log --grep="keyword"
# 查看最近 10 次提交的详细差异
git log -p -n 10格式化占位符
| 占位符 | 说明 |
|---|---|
%h | 短哈希值 |
%H | 完整哈希值 |
%ad | 提交日期(按 --date 格式) |
%an | 作者姓名 |
%ae | 作者邮箱 |
%s | 提交信息(主题) |
%ar | 相对提交时间(如 "3 days ago") |
%cd | 提交日期(按 --date=short 格式) |
