Skip to content
On this page

初始化与配置

使用 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线性历史同步上游变更