暗色模式

Git 命令行实战:从仓库初始化到分支合并与临时存档

技术教程
2026-08-09
15
0

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 statusUntracked files 列出的是还没被 Git 跟踪的新文件,git add 之后它们会变成绿色(在彩色终端里)的 Changes to be committed;
  • 提交成功后会输出 [main (root-commit) 9d04e95] feat: 初始化项目,9d04e95 是这次提交的短哈希(完整哈希是 40 位),root-commit 表示这是仓库的第一次提交;
  • git log --oneline 是日常用得最多的历史查看方式,每行一条提交:短哈希 + 提交信息。

如果发现提交信息写错了,可以 git commit --amend 修改;发现文件没加全,先 git addgit commit --amend --no-edit 就能并入上一条提交。

撤销操作:用 switch 和 restore 取代 checkout

Git 2.23 引入 git switchgit 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 保存与恢复临时修改

要点:

  • 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>
撤销 addgit restore --staged <file>
临时存档git stash push -m "备注" / git stash pop
拉取/推送git pull / git push
安全强推git push --force-with-lease
改最近一次提交git commit --amend

记住一个原则:改历史、强推之前先想三秒。分支可以随便建随便删,提交历史才是 Git 里最"贵"的资产。

参考资料

发表评论

暂无评论,快来抢沙发吧!