Git 是 Linux 服务器上除了编辑器之外最常用的开发工具:部署代码、回滚版本、协作分支,全都靠它。但很多新手只会 git add . + git commit -m "更新",遇到分支冲突、改到一半要切分支、误删文件这些场景就手足无措。这篇文章在真实的 Ubuntu 24.04 服务器(git 2.43.0)上完整演示了一遍 Git 的日常操作流:初始化、提交、分支合并、临时存档、远程协作,每步都有真实输出可对照。
安装与全局配置
Ubuntu/Debian 系安装一条命令:
sudo apt install git目前 Ubuntu 24.04 自带 git 2.43.0,功能上完全够用;截至 2026 年中,Git 官方最新版本已到 2.55.0,新增了 Rust 组件默认开启、git history fixup 等特性,想用新版可以通过源码编译或官方 PPA 安装。
装好后第一步是配置身份,否则 commit 会报错:
git config --global user.name "你的名字"
git config --global user.email "you@example.com"
git config --global init.defaultBranch main # git 2.28+ 支持,默认分支名用 main--global 表示对当前用户全局生效,配置保存在 ~/.gitconfig。推荐顺手把默认分支名从 master 改成 main(现代项目约定),这样后面 git init 不需要每次加 -b main。
创建仓库与第一次提交
理解 Git 之前,先记住它的核心模型:工作区 → 暂存区 → 本地仓库,文件修改要经过 git add 进入暂存区,再 git commit 才真正落库。
git init -b main # 初始化仓库
git status # 查看工作区状态
git add README.md app.py # 加入暂存区
git commit -m "feat: 初始化项目" # 提交
git log --oneline # 查看提交历史在演示服务器上的完整输出如下:

几个值得注意的细节:
git status里Untracked files列出的是还没被 Git 跟踪的新文件,git add之后它们会变成绿色(在彩色终端里)的Changes to be committed;- 提交成功后会输出
[main (root-commit) 9d04e95] feat: 初始化项目,9d04e95是这次提交的短哈希(完整哈希是 40 位),root-commit表示这是仓库的第一次提交; git log --oneline是日常用得最多的历史查看方式,每行一条提交:短哈希 + 提交信息。
如果发现提交信息写错了,可以 git commit --amend 修改;发现文件没加全,先 git add 再 git commit --amend --no-edit 就能并入上一条提交。
撤销操作:用 switch 和 restore 取代 checkout
Git 2.23 引入 git switch 和 git restore,把原来 git checkout 一肩挑的两件事拆开:切换分支用 switch,恢复文件用 restore。官方自己都承认 checkout 承担的职责太多,是新手困惑的主要来源。
| 旧命令(checkout) | 新命令(推荐) | 作用 |
|---|---|---|
git checkout <branch> | git switch <branch> | 切换分支 |
git checkout -b <new> | git switch -c <new> | 创建并切换新分支 |
git checkout -- <file> | git restore <file> | 丢弃工作区修改,恢复文件 |
git reset HEAD <file> | git restore --staged <file> | 撤销 git add(取消暂存,保留修改) |
git checkout HEAD -- <file> | git restore --staged --worktree <file> | 同时恢复暂存区和工作区 |
git checkout <commit> -- <file> | git restore --source=<commit> <file> | 从指定提交恢复文件 |
对应关系里的核心要点:
git restore <file>把文件恢复到 HEAD 版本,会丢弃未提交的修改,操作前确认没有需要保留的内容;git restore --staged <file>只取消暂存,工作区的修改原样保留,是最常用的"反悔 add"操作;- 区分不清场景时,
git status的提示语会直接告诉你该用哪个命令(比如修改未暂存时提示use "git restore <file>..." to discard changes)。
而 git reset 保留给高级场景(比如回退提交历史),日常撤销用 restore 更安全——它永远不会动你的提交历史。
分支管理:并行开发与合并
分支是 Git 并行开发的基石。基本操作:
git branch # 查看本地分支(* 标记当前所在分支)
git switch -c feature/login # 创建并切换到新分支
git switch main # 切回 main
git merge feature/login # 把 feature 分支合并进当前分支为了演示真实的合并过程,我在服务器上做了这样一组操作:从 main 拉出 feature/login 分支提交"新增登录模块",切回 main 再提交"补充使用说明",最后把 feature 合并回 main:

重点看两处输出:
- 合并策略:
Merge made by the 'ort' strategy.——现代 Git 用 ort(原名 recursive)策略做三方合并。这里两条分支改的是不同文件,所以自动合并无冲突;如果两边改了同一文件同一区域,会报CONFLICT并要求手动解决; - 提交历史图:
git log --graph --oneline --all把分支结构画了出来:
* 1eb989e Merge branch 'feature/login'
|\
| * 085eb93 feat: 新增登录模块
* | 0ce7717 docs: 补充使用说明
|/
* 9d04e95 feat: 初始化项目* 1eb989e Merge branch ... 就是合并产生的 merge commit,它有两个父提交(左边 \ 和右边 | 各指一个)。养成看 --graph 的习惯,项目历史一目了然。
合并前先用 git diff main feature/login 预览差异、合并后如果发现合错了用 git merge --abort 回退,这两个命令在多人协作时能救场。
临时存档:git stash
最常见的场景:代码改到一半,突然要去别的分支修个紧急 bug。直接切分支会报错(工作区有未提交修改),全部提交又污染历史——这时候用 git stash 把现场"存档"起来:
git status --short # 看到 app.py 有未提交修改
git stash push -m "临时调试代码" # 保存现场,工作区恢复干净
git stash list # 查看存档列表
git stash pop # 恢复最近一次存档演示输出:

要点:
git stash push -m "说明"给存档加备注,存多了找起来不晕;存档会显示为stash@{0}(最新)、stash@{1}……依次类推;git stash list里的On main: 临时调试代码说明存档来自哪个分支、备注是什么;git stash pop恢复存档并删除该条目,恢复后 Git 会输出一段工作区状态摘要(On branch main / Changes not staged for commit: ... modified: app.py),同时提示Dropped refs/stash@{0}表示存档已移除;- 如果只想恢复但保留存档,用
git stash apply; - 用
-u参数可以连未跟踪的新文件一起存:git stash push -u。
与远程仓库协作
本地玩明白之后,部署和协作都靠远程仓库(GitHub、GitLab、Gitee 或自建的 Gitea):
git remote add origin git@github.com:user/repo.git # 关联远程仓库
git push -u origin main # 首次推送,-u 记住关联
git pull # 拉取远程更新(等价 fetch + merge)
git remote -v # 查看远程地址几个高频但容易翻车的点:
- 推送被拒绝通常是远程有别人(或你自己在别的机器)推的新提交,先
git pull --rebase把本地提交垫到远程提交之上,再推; - 绝对不要用
git push --force。它会把远程历史整个覆盖,极容易把别人的提交冲掉。实在需要强推(比如改了已推送的提交信息),用git push --force-with-lease:推送前会校验远程是不是你上次拉取的状态,不是就拒绝,相当于"有保险丝的强推"; .gitignore文件里把node_modules/、*.log、密钥文件等排除掉,别把不该进仓库的东西推上去。
常用命令速查表
| 场景 | 命令 |
|---|---|
| 初始化仓库 | git init -b main |
| 查看状态/差异 | git status / git diff |
| 提交 | git add <file> → git commit -m "说明" |
| 查看历史 | git log --oneline --graph --all |
| 切换/新建分支 | git switch <branch> / git switch -c <branch> |
| 合并分支 | git merge <branch> |
| 丢弃工作区修改 | git restore <file> |
| 撤销 add | git restore --staged <file> |
| 临时存档 | git stash push -m "备注" / git stash pop |
| 拉取/推送 | git pull / git push |
| 安全强推 | git push --force-with-lease |
| 改最近一次提交 | git commit --amend |
记住一个原则:改历史、强推之前先想三秒。分支可以随便建随便删,提交历史才是 Git 里最"贵"的资产。
评论 (0)
暂无评论,快来抢沙发吧!