Git
Git 是目前最流行的分布式版本控制系统,用于跟踪文件变化、管理代码版本、协调多人协作开发。
工作原理
Git 的核心是快照而非差异。每次提交时,Git 会对当前状态的所有文件生成快照,记录指向快照的引用。
| 概念 | 说明 |
|---|---|
| 工作区 | 本地实际操作的目录 |
| 暂存区 | 临时存放待提交的修改 |
| 本地仓库 | 提交后的版本历史 |
| 远程仓库 | 代码托管服务器(如 GitHub、GitLab) |
三个区域的关系
工作区 → git add → 暂存区 → git commit → 本地仓库 → git push → 远程仓库常用命令
| 命令 | 说明 |
|---|---|
git init | 初始化仓库 |
git clone url | 克隆远程仓库 |
git remote add origin url | 添加远程仓库 |
git push -u origin master | 推送到远程仓库 |
git log | 查看提交历史 |
git status | 查看当前状态 |
git diff | 查看修改内容 |
git add . | 添加所有修改到暂存区 |
git commit -m "message" | 提交 |
git commit --amend --no-edit | 将改动添加到上一次 commit |
git push | 推送到远程 |
git pull | 拉取远程更新 |
标签管理
| 命令 | 说明 |
|---|---|
git tag v1.0 | 在当前 commit 打上 v1.0 的标签 |
git tag v1.0 commitID | 对特定 commit 打标签 |
git tag -a <tagname> -m "message" | 打标签时加上 message |
git tag | 查看所有标签 |
git show [tagname] | 查看标签详细信息 |
git push origin <tagname> | 推送一个本地标签到远程仓库 |
git push origin --tags | 推送全部未推送过的本地标签 |
git tag -d <tagname> | 删除一个本地标签 |
git push origin :refs/tags/<tagname> | 删除一个远程标签 |
撤销与回滚
撤销操作:
| 场景 | 命令 |
|---|---|
| 还没 git add | git checkout -f -- filename |
| 已经 git add 但没 commit | git reset HEAD filename,然后 git checkout -f -- filename |
| 已经 git commit | git revert commitID 或 git reset --hard commitID |
选择建议
- 如果已经 push 到远程,使用
git revert更安全,因为它会创建新的提交来撤销更改 - 如果只在本地,使用
git reset更直接
reset 和 revert 的区别:
reset回滚,将 HEAD 指针指向回滚版本,之后的提交会消失revert撤销,创建新提交来抵消指定提交,不影响后续提交
分支管理
| 命令 | 说明 |
|---|---|
git branch test | 创建分支 |
git checkout test | 切换分支 |
git checkout -b test | 创建并切换分支 |
git merge test | 合并分支 |
git branch -d test | 删除分支 |
git stash
暂存当前分支的未提交修改,之后可以恢复继续工作。
| 命令 | 说明 |
|---|---|
git stash list | 查看储藏列表 |
git stash apply <stash number> | 恢复储藏的工作(保留列表) |
git stash pop | 恢复并删除最新的储藏 |
git cherry-pick
将指定提交(commitID)的修改应用到当前分支。
git cherry-pick commitID常用于:将某个分支的单个提交合并到另一个分支。
适用场景
| 场景 | 推荐命令 | 原因 |
|---|---|---|
| 日常开发提交 | git add + git commit | 标准工作流 |
| 临时切换任务 | git stash | 保存未完成工作,切换分支后恢复 |
| 发布版本 | git tag | 为特定 commit 打标记,便于回溯 |
| 修复线上问题 | git cherry-pick | 精确复制修复提交到发布分支 |
| 撤销已推送的提交 | git revert | 安全撤销,不影响后续提交 |
FAQ
Q: reset 和 revert 有什么区别? A: reset 回滚 HEAD 指针,之后的提交会消失(适合本地未推送的提交);revert 创建新提交来抵消指定提交,不影响后续提交(适合已推送到远程的提交)。已推送到远程的提交用 revert,避免强制推送影响他人。
Q: merge 和 rebase 有什么区别? A: merge 保留分支历史,生成合并提交,历史呈网状;rebase 将当前分支的提交"移动"到目标分支之上,历史呈线性。团队协作中,公共分支用 merge(保留真实历史),个人分支用 rebase(保持历史整洁)。
Q: 什么时候用 git stash? A: 当你在 feature 分支开发到一半,需要临时切换到其他分支修复 bug 时,用 git stash 保存当前未提交的修改。修复完成后切回来,用 git stash pop 恢复。stash 是临时存储,不适合长期保存,长期保存应该创建 WIP 提交。