Appearance
初始化与配置
使用 Git 的第一步是创建仓库:
bash
git init
这会生成一个 .git 目录,里面记录了所有的版本信息。
如果从远程拉取已有项目:
bash
git clone <仓库地址>
使用 Git 前最好先设置你的身份,这样提交记录才能正确显示作者:
bash
git config --global user.name "你的名字"
git config --global user.email "your@email.com"
新版的 Git 默认分支名是 master,但 GitHub 和 GitLab 已经改用 main,建议统一:
bash
git config --global init.defaultBranch main
也可以通过
bash
# 将当前分支名从 master 改为 main
git branch -m main
日常操作流程
Git 的工作区分为三层:工作区 → 暂存区 → 本地仓库。
bash
git status # 看看当前处于什么状态
git add <文件> # 把修改添加到暂存区(stage)
git add -p # 交互式选择,每段修改决定是否暂存(推荐)
git commit -m "描述这次改了什么"
如果你想一次完成"添加 + 提交":
bash
git commit -am "msg" # 跳过 git add,但只对已跟踪文件有效
查看具体改了哪些内容:
bash
git diff # 工作区 vs 暂存区
git diff --staged # 暂存区 vs 上次提交
删除或重命名文件,让 Git 知道:
bash
git rm <文件>
git mv <旧名> <新名>
撤销修改
撤销分三个层级,从轻到重:
工作区(还没 add)
bash
git restore <文件> # 丢弃修改,回到上一次 add 或 commit 的状态
暂存区(已经 add,还没 commit)
bash
git restore --staged <文件> # 取消暂存,修改保留在工作区
本地提交(已经 commit,还没 push)
bash
git commit --amend -m "新信息" # 修改最后一次提交的信息
git reset --soft HEAD~1 # 撤销提交,修改留在暂存区
git reset --mixed HEAD~1 # 撤销提交,修改回到工作区(默认)
git reset --hard HEAD~1 # 彻底回退,修改丢失(不可逆)
HEAD~1 表示"上一次提交",HEAD~3 就是前三次,也可以用提交的 hash 值。
远程提交(已经 push)
已经推送到远程的提交,不要用 reset,否则会破坏别人的历史。要用 revert:
bash
git revert <提交hash> # 生成一个反向提交,安全地"撤销"某次操作
临时保存
有时候正在改一半,需要切到其他分支干活。可以用 stash 把当前进度暂存起来:
bash
git stash # 暂存当前修改,工作区变干净
git stash pop # 恢复最近一次暂存,并从列表里删除
git stash apply # 恢复但不删除(适合同时恢复多个场景)
git stash list # 查看所有暂存记录
git stash drop # 删除最近一次暂存
清理未跟踪文件
git status 里那些红色的未跟踪文件,想批量删除:
bash
git clean -n # 先预览,看看会删掉什么(安全操作)
git clean -f # 删除未跟踪的文件
git clean -fd # 连未跟踪的目录一起删
想一次性丢弃所有改动(包括已跟踪和未跟踪):
bash
git reset --hard HEAD && git clean -fd
分支管理
分支是 Git 最核心的功能,让你可以同时开发多个功能互不影响。
bash
git branch # 查看本地分支列表
git branch <分支名> # 创建新分支
git branch -d <分支名> # 删除已合并的分支
git branch -D <分支名> # 强制删除(即使没合并)
git branch -m <旧名> <新名> # 重命名分支
切换分支:
bash
git switch <分支名> # 切到已有分支
git switch -c <分支名> # 创建并切换(最常用)
如果想临时看看某个历史版本的样子(只读模式):
bash
git switch --detach <提交hash>
# 查看完后切回分支
git switch <分支名>
这种"detached HEAD"状态下做的提交,切回分支后就找不到了,除非你记得 hash。
合并
bash
git merge <分支名> # 把指定分支合并到当前分支
git merge --squash <分支名> # 把整个分支压缩成一条提交再合并
squash merge 的优点是提交历史干净,PR 合入主分支时推荐使用。
变基
bash
git rebase <分支名> # 把当前分支"搬"到目标分支顶部
git rebase -i HEAD~3 # 交互式整理最近 3 次提交
rebase 让历史变成一条直线,适合在推送到远程前整理自己的提交。
摘樱桃
把其他分支的某一次提交"复制"到当前分支:
bash
git cherry-pick <提交hash>
远程操作
bash
git remote -v # 查看远程仓库列表
git remote add origin <地址> # 添加远程仓库
git remote set-url origin <新地址> # 修改远程地址
git remote rm origin # 删除远程关联
git fetch origin # 拉取远程更新(不自动合并)
git pull origin <分支> # 拉取并合并(fetch + merge)
git push origin <分支> # 推送本地分支到远程
git push -u origin <分支> # 首次推送,同时设置上下游关联
git push origin --delete <分支> # 删除远程分支
pull=fetch+merge。如果想用 rebase 代替 merge:git pull --rebase。
推送到多个远程
bash
git remote add origin <地址1>
git remote set-url --add --push origin <地址2>
git remote set-url --add --push origin <地址3>
这样每次 git push 会同时推送到多个地址。但是会覆盖之前的远程仓库,所以需要添加两次
查看历史
bash
git log --oneline --graph --all --decorate # 图形化查看所有分支
git log -p # 查看每次提交的具体改动
git log --author="名字" # 按作者过滤
git log --since="2024-01-01" # 按时间过滤
git show <提交hash> # 查看某次提交的详情
git blame <文件> # 看文件的每一行是谁改的
标签
给某个提交打上版本号:
bash
git tag v1.0.0 # 创建标签
git push origin v1.0.0 # 推送到远程
SSH 公钥
用 SSH 方式连接 GitHub/GitLab 可以免密推送:
bash
ssh-keygen -t ed25519 -C "your@email.com"
cat ~/.ssh/id_ed25519.pub
把输出的公钥内容添加到 GitHub/GitLab 的 SSH Keys 设置里。
.gitignore
有些文件不该被 Git 追踪,比如依赖目录、环境变量、构建产物。在项目根目录创建 .gitignore:
node_modules/
.env
dist/
*.log
.DS_Store
分支策略简介
Trunk-Based(主流推荐)
所有人往 main 提交短命分支(≤ 1 天),未完成的功能用 feature flag 隐藏。适合 CI/CD 成熟、迭代快的团队。
Git Flow(传统方案)
| 分支 | 用途 |
|---|---|
main | 生产环境代码 |
develop | 开发主线 |
feature/* | 新功能开发 |
release/* | 发布前冻结 |
hotfix/* | 线上紧急修复 |
适合固定发布周期的项目(如客户端软件)。
合并方式对比
| 方式 | 历史形态 | 推荐场景 |
|---|---|---|
merge | 保留分支拓扑 | 多人协作的功能分支 |
squash merge | 压缩成一条提交 | PR 合入 main(最推荐) |
rebase | 线性历史 | 同步上游变更 |