📚 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 就是解决这个问题的工具:它记录每次修改,让你随时能回到任意历史版本。

安装:

pkg install 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 学习者看到。关注系列持续更新,阶段三网络操作更精彩。