📚 Termux 无 Root 学习开发系列
当前进度:阶段二 · 9/28
阶段一:环境搭建与终端基础 ✅ 已完成
阶段二:编程开发环境
06 Python 开发环境搭建
07 C/C++ 开发环境
08 Node.js 开发环境
09 Git 版本控制(当前篇)
阶段三至九共 19 篇,后续持续更新
09 Git 版本控制:从 init 到远程仓库
在手机上用 Git 管理代码,连接 GitHub,让每次修改都有迹可循
读完本篇你将能:在 Termux 中安装配置 Git,掌握 init/add/commit 基本工作流,用分支管理功能开发,生成 SSH 密钥连接 GitHub,用 push/pull 同步远程仓库,以及用 stash/reflog 挽救误操作。
📑 本文目录
01安装 Git 与首次配置
02基本工作流:init → add → commit
03查看历史:status、log、diff
04.gitignore 忽略文件
05分支管理:branch、switch、merge
06远程仓库:clone、push、pull
07SSH 密钥连接 GitHub
08撤销与补救:stash、reset、reflog
09常见场景与最佳实践
10实操项目:管理笔记 API 代码
§1 安装 Git 与首次配置
前面三篇文章你已经在 Termux 上写了不少代码——Python 脚本、C 程序、Node.js 服务。代码越写越多,"改完发现改错了想退回去"的问题就来了。Git 就是解决这个问题的工具:它记录每次修改,让你随时能回到任意历史版本。
安装:
验证版本:
git --version
git version 2.55.0
Git 2.55 于 2026 年 8 月发布,Rust 编写的组件默认启用,大型仓库的 git status 速度显著提升。Termux 仓库通常会跟进最新版本。
首次使用必须配置用户名和邮箱(每次 commit 都会记录):
git config --global user.name "你的名字"
git config --global user.email "你的邮箱@example.com"
# 设置默认编辑器为 neovim(承接第04篇)
git config --global core.editor "nvim"
# 设置默认分支名为 main
git config --global init.defaultBranch main
配置保存在 ~/.gitconfig 文件中,所有项目共享。用 git config --list 查看全部配置。
§2 基本工作流:init → add → commit
Git 的核心概念是"快照"——每次 commit 就像给项目拍一张照片,记录所有文件在这一刻的状态。需要回退时,直接取出某张照片即可。
三步走:初始化 → 暂存 → 提交
# 1. 创建新项目并初始化 Git
mkdir my-project && cd my-project
git init
# 2. 创建一个文件
echo "# My Project" > README.md
# 3. 暂存文件(告诉 Git "我要记录这个文件")
git add README.md
# 4. 提交快照(拍照)
git commit -m "初始提交:添加 README"
真实输出:
[main (root-commit) a1b2c3d] 初始提交:添加 README
1 file changed, 1 insertion(+)
create mode 100644 README.md
💡 add 和 commit 为什么分两步
add 把文件放入"暂存区"(staging area),commit 把暂存区的所有文件一次性拍照。这样你可以只提交修改过的部分文件,而不是全部改动。用 git add . 暂存所有修改,git add 文件名 暂存指定文件。
§3 查看历史:status、log、diff
三个最常用的查看命令,贯穿日常开发的每一分钟。
git status — 当前状态:
git status
On branch main
Changes not staged for commit:
modified: server.js
Untracked files:
test/
红色 modified 表示文件被修改但未暂存,Untracked 表示新文件还没被 Git 跟踪。
git log — 提交历史:
git log --oneline --graph
* a1b2c3d (HEAD -> main) 添加删除路由
* d4e5f6g 修复 store.js 空文件 bug
* 7h8i9j0 初始提交:添加 README
git diff — 查看具体改动:
git diff server.js
-const PORT = 3000;
+const PORT = process.env.PORT || 3000;
减号行是删除的,加号行是新增的。git diff --staged 查看已暂存但未提交的改动。
§4 .gitignore 忽略文件
有些文件不应该进版本控制——密码文件、编译产物、依赖目录。用 .gitignore 文件告诉 Git 忽略它们。
通用 .gitignore 模板(Python + Node.js 项目):
# Python
__pycache__/
*.pyc
venv/
.env
# Node.js
node_modules/
npm-debug.log
# C/C++
*.o
*.out
a.out
# Termux
storage/
*.log
创建后用 git add .gitignore 提交,Git 就不会再跟踪这些文件。
§5 分支管理:branch、switch、merge
分支是 Git 最强大的功能。想象你在 main 分支写完了核心功能,突然想试验一个新想法——不直接在 main 上改,而是创建一个新分支,试验成功就合并回来,失败直接删掉,main 完全不受影响。
分支操作:
# 创建并切换到新分支
git switch -c feature/auth
# 在新分支上正常开发、提交
echo "auth code" > auth.js
git add auth.js
git commit -m "添加认证模块"
# 切回 main 分支
git switch main
# 合并 feature 分支
git merge feature/auth
# 删除已合并的分支
git branch -d feature/auth
注意:Git 2.30+ 推荐用 git switch 替代旧的 git checkout 切换分支,语义更清晰。
💡 分支命名规范
feature/xxx 新功能、fix/xxx 修 bug、hotfix/xxx 紧急修复、docs/xxx 文档更新。统一前缀让团队一眼看出分支用途。
§6 远程仓库:clone、push、pull
本地 Git 只能在自己手机上用。加上远程仓库(如 GitHub),代码就多了备份,还能跨设备同步——在手机上写代码,push 到 GitHub,回家用电脑 pull 下来继续。
克隆远程仓库:
# HTTPS 方式(需输入密码/token)
git clone https://github.com/用户名/仓库名.git
# SSH 方式(配置密钥后免密,推荐)
git clone git@github.com:用户名/仓库名.git
推送本地代码到远程:
# 首次推送:关联远程仓库并推送
git remote add origin git@github.com:用户名/仓库名.git
git push -u origin main
# 后续推送(只需一句)
git push
拉取远程更新:
# 拉取并合并远程改动到本地
git pull
# 只下载不合并(更安全,可以先看再决定)
git fetch
git log origin/main --oneline # 看远程有什么新提交
git merge origin/main # 确认后再合并
§7 SSH 密钥连接 GitHub
每次 push 输入密码太麻烦。SSH 密钥是一对文件——私钥留在手机上,公钥贴到 GitHub。之后 push/pull 自动认证,再也不用输密码。
生成 SSH 密钥(ed25519 算法,比 RSA 更短更安全):
ssh-keygen -t ed25519 -C "你的邮箱@example.com"
# 一路回车即可,密码可留空
查看公钥并添加到 GitHub:
# 查看公钥内容
cat ~/.ssh/id_ed25519.pub
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI... 你的邮箱@example.com
复制输出的公钥,打开 GitHub → Settings → SSH and GPG keys → New SSH key → 粘贴 → 保存。
验证连接:
ssh -T git@github.com
Hi 用户名! You've successfully authenticated, but GitHub does not provide shell access.
看到 "successfully authenticated" 就说明 SSH 配置成功了。
§8 撤销与补救:stash、reset、reflog
代码写了一半要切分支处理紧急 bug,但当前改动还不想提交?提交后发现写错了想撤回?Git 都有办法。
git stash — 临时存放当前改动:
# 把当前未提交的改动临时存起来,工作区变干净
git stash
# 切到 main 修 bug、提交、切回来
git switch main
... 修 bug ...
git switch feature/auth
# 把存起来的改动恢复
git stash pop
git reset — 撤销提交:
# 撤销最近1次提交,保留代码改动(最安全)
git reset --soft HEAD~1
# 撤销最近1次提交,代码改动从暂存区移除但保留
git reset --mixed HEAD~1
# 撤销最近1次提交,代码改动也丢弃(危险!不可恢复)
git reset --hard HEAD~1
git reflog — 终极后悔药:
即使 reset --hard 误删了提交,reflog 记录了所有操作历史,还能找回来:
git reflog
a1b2c3d HEAD@{0}: reset: moving to HEAD~1
d4e5f6g HEAD@{1}: commit: 修复登录 bug
# 找到丢失的提交,恢复回去
git reset --hard d4e5f6g
⚠️ 常见错误
git reset --hard origin/main(这会把本地代码强制覆盖为远程版本,未推送的提交全部丢失)
正确做法:先 git stash 保存改动,确认后再操作。
§9 常见场景与最佳实践
真实开发中你会遇到这些场景,这里给出推荐做法。
场景1:提交信息写错了
# 修改最近一次提交的信息
git commit --amend -m "正确的提交信息"
场景2:漏提交了文件
git add 漏掉的文件.js
git commit --amend --no-edit # 追加到上次提交,不改信息
场景3:合并分支时有冲突
git merge feature/auth
CONFLICT (content): Merge conflict in server.js
# 打开冲突文件,手动选择保留哪部分
# 冲突标记格式:
<<<<<<< HEAD
当前分支的代码
=======
被合并分支的代码
>>>>>>>> feature/auth
# 删掉冲突标记,保留正确代码后:
git add server.js
git commit -m "合并 feature/auth 分支"
场景4:查看某次提交改了什么
git show a1b2c3d # 查看指定提交的详细改动
§10 实操项目:管理笔记 API 代码
把第08篇做的 notes-api 项目用 Git 管起来,走一遍完整的开发流程:初始化 → 提交 → 分支开发 → 合并 → 推送 GitHub。
Step 1:初始化仓库
cd notes-api
git init
echo "node_modules/" > .gitignore
echo "data/" >> .gitignore
git add .
git commit -m "初始提交:notes-api CRUD 功能"
Step 2:用分支添加 PUT 更新路由
git switch -c feature/update
# 在 server.js 中添加 PUT 路由
# app.put('/api/notes/:id', ...)
git add server.js
git commit -m "添加 PUT /api/notes/:id 更新路由"
git switch main
git merge feature/update
git branch -d feature/update
Step 3:推送到 GitHub
# 在 GitHub 上创建空仓库后:
git remote add origin git@github.com:用户名/notes-api.git
git push -u origin main
Step 4:在另一台设备上继续开发
# 在电脑或另一台手机上
git clone git@github.com:用户名/notes-api.git
cd notes-api
npm install # 恢复依赖
... 写代码、提交 ...
git push
# 回到手机,拉取最新代码
git pull
💡 阶段二回顾
到这里阶段二(编程开发环境)就完成了。你的 Termux 现在具备了 Python、C/C++、Node.js 三种语言的开发能力,加上 Git 版本控制,已经是一个完整的移动开发工作站。阶段三将进入网络操作——SSH 远程连接、端口转发、代理配置,让你的手机连向更广阔的网络世界。
📝 分级练习
🟢 基础验证
请完成:创建一个新目录 my-git-test,git init 初始化,创建 hello.txt 写入内容,add + commit 提交。然后用 git log 查看提交记录。预期输出应包含 commit hash、作者、日期和提交信息。
参考解法:
mkdir my-git-test && cd my-git-test
git init
echo "Hello Git" > hello.txt
git add hello.txt
git commit -m "第一次提交"
git log --oneline
🟡 组合应用
请完成:在上述项目中创建 feature/print 分支,添加 print.py 文件并提交。切回 main,再合并 feature/print 分支。合并后用 git log --graph --oneline 查看分支图,确认合并记录。最后删除 feature/print 分支。
参考方向:git switch -c feature/print → 创建文件 → add + commit → git switch main → git merge feature/print → git log --graph --oneline → git branch -d feature/print。graph 输出应显示分叉和合并点。
🔴 开放挑战
请完成:在 GitHub 上创建仓库,把 notes-api 项目推送上去。然后在另一台设备(或同一设备新目录)clone 下来,修改代码后 push。回到原目录 pull 拉取更新。完整体验跨设备协作流程。
提示方向:需要先配置 SSH 密钥(§7)。GitHub 创建空仓库时不勾选 README,否则首次 push 会有冲突。如果 pull 时遇到冲突,参考 §9 场景3 手动解决。这是真实开发中每天都会做的事。
🏷 知识回顾
git init
add + commit
status / log / diff
.gitignore
switch -c 分支
merge 合并
SSH ed25519 密钥
push / pull
stash 临时存放
reflog 后悔药
下一篇 10 SSH 远程连接与端口转发 将学习用 Termux 连接远程服务器——SSH 客户端基本用法、密钥认证、端口转发(本地/远程/动态)、SCP 文件传输,以及用 rsync 高效同步。阶段三网络操作正式开启,你的手机将变成一个移动运维终端。
阶段二完结!点赞、在看、分享让更多 Termux 学习者看到。关注系列持续更新,阶段三网络操作更精彩。