Git命令详解

一、配置与初始化

1.1 git config------配置 Git 环境

分为三个层级:--local(当前仓库)、--global(当前用户)、--system(全系统)。优先级:local > global > system。

常用配置示例:

bash 复制代码
git config --global user.name "你的名字"
git config --global user.email "you@example.com"
git config --global core.editor "vim"
git config --global alias.st status      # 设置别名,之后可用 git st
git config --list                         # 查看所有配置
git config --global --unset user.name     # 删除某项配置

别名可以大幅减少重复输入,例如 alias.lg "log --oneline --graph --all" 可以简化为 git lg 查看图形化日志。

1.2 git init------初始化仓库

bash 复制代码
git init                  # 在当前目录创建 .git
git init <目录名>          # 在指定目录初始化

初始化后会生成隐藏的 .git 目录,所有版本信息都存储在这里。


二、仓库克隆与远程管理

2.1 git clone------克隆远程仓库

bash 复制代码
git clone <url>
git clone <url> <本地目录名>       # 指定本地目录名
git clone -b <分支名> <url>        # 克隆指定分支
git clone --depth 1 <url>          # 浅克隆,只取最近一次提交(节省时间与空间)

2.2 git remote------远程仓库管理

bash 复制代码
git remote -v                              # 查看远程仓库地址
git remote add origin <url>                # 添加远程仓库
git remote remove origin                   # 删除远程仓库
git remote set-url origin <新url>          # 修改远程地址
git remote rename origin upstream          # 重命名远程仓库

三、日常开发核心命令

3.1 git status------查看状态

bash 复制代码
git status              # 完整状态
git status -s           # 简洁模式

简洁模式下:?? 表示未跟踪,A 表示已暂存的新文件,M 表示已修改,D 表示已删除。

3.2 git add------暂存更改

bash 复制代码
git add <文件>              # 暂存指定文件
git add .                  # 暂存当前目录所有更改(包括新文件、修改、删除)
git add -u                 # 只暂存已跟踪文件的修改和删除,不含新文件
git add -p                 # 交互式分块暂存,适合拆分提交

git add -p 是非常实用的命令,可以逐块选择要暂存的内容,把不相关的修改分开提交。

3.3 git commit------提交

bash 复制代码
git commit -m "提交说明"
git commit -am "说明"        # 自动暂存已跟踪文件的修改并提交(不包含新文件)
git commit --amend          # 修改最近一次提交(提交信息或追加内容)

提交信息规范: 通常建议第一行不超过 50 个字符,空一行后写详细说明。常见格式如 feat: 添加登录功能、fix: 修复空指针异常。

3.4 git diff------查看差异

bash 复制代码
git diff                    # 工作区 vs 暂存区
git diff --staged           # 暂存区 vs 最新提交(即 git diff --cached)
git diff HEAD               # 工作区 vs 最新提交
git diff <分支1> <分支2>     # 两个分支之间的差异
git diff <commit1> <commit2> # 两个提交之间的差异

四、分支管理

4.1 git branch------分支操作

bash 复制代码
git branch                       # 列出本地分支
git branch -a                    # 列出所有分支(含远程)
git branch <新分支名>             # 创建分支(不切换)
git branch -d <分支名>            # 删除已合并分支
git branch -D <分支名>            # 强制删除未合并分支
git branch -m <旧名> <新名>       # 重命名分支
git branch -vv                   # 查看本地分支与远程的跟踪关系

4.2 git checkout / git switch------切换分支

bash 复制代码
git checkout <分支名>             # 切换分支
git checkout -b <新分支名>        # 创建并切换
git switch <分支名>               # 新版推荐命令,语义更清晰
git switch -c <新分支名>          # 创建并切换

Git 2.23 之后引入了 git switch 和 git restore,建议在新项目中使用这两个命令代替部分 checkout 的职责,语义更明确。

4.3 git merge------合并分支

bash 复制代码
git merge <分支名>                # 将指定分支合并到当前分支
git merge --no-ff <分支名>        # 禁用快进合并,保留分支历史
git merge --abort                # 合并冲突时放弃合并

--no-ff 会在合并时生成一个合并提交,保留被合并分支的完整历史轨迹,适合团队协作中的功能分支合并。

4.4 git rebase------变基

bash 复制代码
git rebase <目标分支>             # 将当前分支的提交"搬"到目标分支之上
git rebase -i HEAD~3             # 交互式变基,编辑最近 3 个提交
git rebase --abort               # 放弃变基
git rebase --continue            # 解决冲突后继续

重要原则: 不要对已经推送到共享远程仓库的提交执行 rebase,否则会给协作者带来麻烦。rebase 适合整理本地未推送的提交历史。


五、远程协作

5.1 git fetch------获取远程更新

bash 复制代码
git fetch origin                # 获取远程所有分支更新(不合并)
git fetch origin <分支名>        # 只获取指定分支
git fetch --prune               # 同时清理远程已删除的分支引用

fetch 是安全的,它只更新远程跟踪分支(如 origin/main),不会改动你的工作区。

5.2 git pull------拉取并合并

bash 复制代码
git pull                        # fetch + merge
git pull --rebase               # fetch + rebase(推荐,历史更线性)

git pull 本质上是 git fetch 加 git merge(或 git rebase)。如果不想产生额外的合并提交,可以使用 --rebase,或在配置中设置 git config --global pull.rebase true。

5.3 git push------推送

bash 复制代码
git push origin <分支名>
git push -u origin <分支名>      # 首次推送并建立跟踪关系
git push origin --delete <分支名> # 删除远程分支
git push --force-with-lease      # 安全强制推送(比 --force 更安全)
git push --tags                  # 推送标签

关于强制推送: --force 会无条件覆盖远程分支,风险高。--force-with-lease 会在远程有其他人新提交时拒绝推送,是更安全的选择。仅在明确需要改写远程历史时使用。


六、撤销与回退

6.1 git restore------恢复工作区/暂存区

bash 复制代码
git restore <文件>               # 丢弃工作区修改(危险,不可恢复)
git restore --staged <文件>      # 取消暂存(unstage),保留工作区修改
git restore --source=<commit> <文件>  # 将文件恢复到指定提交的版本

6.2 git reset------重置提交

bash 复制代码
git reset --soft HEAD~1          # 撤销最近一次提交,更改保留在暂存区
git reset --mixed HEAD~1         # 撤销提交和暂存,更改保留在工作区(默认)
git reset --hard HEAD~1          # 撤销提交并丢弃所有更改(危险)
git reset <commit>               # 回退到指定提交

三种模式的区别:--soft 只移动 HEAD,不动暂存区和工作区;--mixed 移动 HEAD 并重置暂存区;--hard 三者全部重置,未提交的更改会丢失。

6.3 git revert------安全撤销

bash 复制代码
git revert <commit>              # 生成一个反向提交,抵消指定提交的更改
git revert <commit1>..<commit2>  # 撤销一个范围的提交

revert 不会改写历史,适合撤销已经推送 的提交。reset 改写历史,只适合本地未推送的提交。

6.4 git stash------临时保存工作区

bash 复制代码
git stash                        # 保存当前修改(不含未跟踪文件)
git stash -u                     # 包含未跟踪文件
git stash list                   # 查看 stash 列表
git stash pop                    # 恢复最近一次 stash 并删除记录
git stash apply                  # 恢复但不删除记录
git stash drop                   # 删除某条 stash

在需要临时切换分支处理紧急问题、但当前修改还不适合提交时非常有用。


七、查看历史与日志

7.1 git log------提交历史

bash 复制代码
git log [<options>] [<revision-range>] [[--] <path>...]



git log
git log --oneline                # 单行简洁显示
git log --oneline --graph --all  # 图形化显示所有分支
git log -p <文件>                # 查看某文件的修改历史及具体内容
git log --author="名字"          # 按作者筛选
git log --since="2024-01-01"     # 按时间筛选
git log -S "关键字"              # 搜索代码内容变更(pickaxe)
git log --stat                   # 显示每次提交的文件变更统计

查看某文件的提交历史(含重命名跟踪)

bash 复制代码
git log --follow -- $file_name

-follow 能跟踪文件被重命名前的提交记录,适合查询改名过的文件。

查看每次提交对该文件的具体改动

bash 复制代码
git log -p -- $file_name

补充:按行查历史

如果想查某一行代码 是谁、哪次提交改的,用 git blame:

bash 复制代码
git blame $file_name
git blame -L 10,20 $file_name   # 只看第10-20行

八、标签管理

bash 复制代码
git tag                          # 列出标签
git tag v1.0.0                   # 创建轻量标签
git tag -a v1.0.0 -m "版本说明"   # 创建附注标签(推荐)
git show v1.0.0                  # 查看标签详情
git push origin v1.0.0           # 推送单个标签
git push --tags                  # 推送所有标签
git tag -d v1.0.0                # 删除本地标签
git push origin --delete v1.0.0  # 删除远程标签

附注标签包含标签创建者、日期和说明,是发布版本时的推荐做法;轻量标签只是一个提交的指针。


九、实用技巧与最佳实践

场景 推荐命令
快速查看简洁状态 git status -s
分块暂存 git add -p
图形化日志 git log --oneline --graph --all
安全撤销已推送提交 git revert <commit>
安全强制推送 git push --force-with-lease
找回"丢失"的提交 git reflog + git reset --hard HEAD@{n}
临时保存工作现场 git stash -u / git stash pop
拉取并保持线性历史 git pull --rebase

核心原则:

  • 已推送的提交不要用 reset 或 rebase 改写历史 ,用 revert 代替。

  • 合并功能分支时用 --no-ff,保留分支历史。

  • 强制推送前用 --force-with-lease,避免覆盖他人的工作。

  • 提交前用 git diff --staged 检查暂存内容,避免误提交。

相关推荐
不老刘21 小时前
Antigravity 的 New Worktree 模式:给 AI 代理一个安全的“平行工位”
人工智能·git·ai编程·antigravity
光谱SpectrAI21 小时前
Windows 也中招:Git Bash 和 Node 仍信任泄露的 eMudhra 证书
git
YIN_尹21 小时前
【git原理与使用】git初识与安装
大数据·git·elasticsearch
Leo_Mr1 天前
Vue3 项目配置 Git 提交规范(企业通用方案:husky + commitlint + cz-git + lint-staged)
git
jyOverQ1 天前
Git rebase 和 merge 有什么区别?什么时候该用哪个?
git
晗夜未央1 天前
跨仓库 Skill 换台电脑就失效?用 Git remote 校验项目
人工智能·git·python
Lsetea1 天前
Git访问HTTPS证书不受信任:用URL级sslCAInfo限定私有CA范围
git·https·开发工具·ssl证书·ca证书
এ慕ོ冬℘゜2 天前
Git 基础入门|和 SVN 对比 + 四大区域 + 常用命令详解
git·svn
DevLoom_2 天前
macOS 命令行 curl/git 报 SSL 证书错误?eMudhra 事件完整修复指南
git·macos·ssl