目录
本文整理个人项目开发与 CI 发布中常用的 Git 命令。以下命令默认在当前仓库根目录执行;远程名称为 origin,主分支为 main。
1. 仓库与远程
1.1 克隆与初始化
git clone git@github.com:user/repo.git
cd repo
# 新建本地仓库
git init
git remote add origin git@github.com:user/repo.git
1.2 查看远程
git remote -v
git remote show origin
1.3 远程地址
SSH 格式:git@github.com:user/repo.git
HTTPS 格式:https://github.com/user/repo.git
切换方式:
git remote set-url origin git@github.com:user/repo.git
git remote set-url origin https://github.com/user/repo.git
SSH 连接超时时,可在 ~/.ssh/config 中为 github.com 配置代理;或改用 HTTPS 地址。
2. 日常提交
2.1 基本流程
git status # 查看工作区与暂存区状态
git diff # 未暂存的改动
git diff --staged # 已暂存、未提交的改动
git add <file> # 暂存指定文件
git add . # 暂存当前目录全部改动
git commit -m "message" # 提交
git log --oneline -10 # 最近 10 条提交
2.2 提交信息约定(可选)
许多项目采用前缀区分改动类型,例如:
| 前缀 | 含义 |
|---|---|
feat: | 新功能 |
fix: | 缺陷修复 |
chore: | 构建、配置、依赖等杂项 |
docs: | 文档 |
Git 不强制此格式;团队有规范时按规范填写。
2.3 拉取与推送
git fetch origin # 获取远程更新,不合并
git pull origin main # fetch + merge 到当前分支
git push origin main # 推送当前分支到远程
git push -u origin main # 首次推送并设置上游分支
3. 分支
3.1 创建与切换
git branch # 列出本地分支
git branch -a # 列出本地与远程分支
git switch -c feat/dev # 创建并切换到新分支
git switch main # 切换到已有分支
等效写法(旧版 Git 通用):
git checkout -b feat/dev
git checkout main
3.2 合并与删除
git switch main
git merge feat/dev # 将 feat/dev 合并进当前分支
git branch -d feat/dev # 删除已合并的本地分支
git push origin --delete feat/dev # 删除远程分支
git branch -d 在分支未合并时会拒绝删除;强制删除使用 git branch -D。
4. 标签与发布
部分 CI 配置以推送 tag 作为构建或发布的触发条件。tag 名通常与 package.json、tauri.conf.json 等文件中的版本号一致。
4.1 创建并推送
git tag v0.1.0 # 在当前提交打轻量标签
git tag -a v0.1.0 -m "release 0.1.0" # 附注标签
git push origin v0.1.0
查看标签:
git tag
git show v0.1.0
4.2 删除并重新打 tag
同一版本号需要重新触发 CI 时,须先删除本地与远程标签,再重新创建:
git tag -d v0.1.0
git push --delete origin v0.1.0
git tag v0.1.0
git push origin v0.1.0
若 GitHub Release 已关联该 tag,需先在网页端删除对应 Release,再执行上述命令。
5. 修改与撤销
5.1 修改上一次提交
将新改动并入最近一次提交(提交哈希会改变):
git add .
git commit --amend --no-edit # 保留原 message
git commit --amend -m "new message" # 同时修改 message
已推送到远程的提交执行 --amend 后需要 git push --force-with-lease;多人协作分支上应谨慎使用。
5.2 reset 三种模式
git reset --soft HEAD~1 # 回退提交,改动保留在暂存区
git reset --mixed HEAD~1 # 回退提交,改动保留在工作区(默认)
git reset --hard HEAD~1 # 回退提交,丢弃工作区与暂存区改动
| 模式 | 提交记录 | 暂存区 | 工作区 |
|---|---|---|---|
--soft | 回退 | 保留 | 保留 |
--mixed | 回退 | 清空 | 保留 |
--hard | 回退 | 清空 | 清空 |
5.3 丢弃未提交的改动
git restore <file> # 恢复单个文件到 HEAD 状态
git restore . # 恢复全部已跟踪文件
git clean -fd # 删除未跟踪的文件与目录
等效写法:
git checkout -- <file>
git reset --hard
reset --hard 与 clean -fd 不可恢复未提交的改动。
6. 暂存(stash)
将当前工作区改动临时保存,以便切换分支或拉取代码:
git stash # 保存改动,工作区恢复干净
git stash list # 查看 stash 列表
git stash pop # 应用最近一次 stash 并删除记录
git stash apply # 应用但不删除记录
git stash drop # 删除指定 stash
stash 仅保存已跟踪文件的改动;未跟踪的新文件默认不纳入,需加 -u:
git stash -u
7. .gitignore
7.1 规则不生效
文件在写入 .gitignore 之前已被 git add 过时,Git 会继续跟踪。处理方式:
git rm -r --cached .
git add .
git commit -m "chore: apply gitignore"
git rm -r --cached 只从索引中移除,不删除磁盘文件。
7.2 常见忽略项
node_modules/
dist/
.env
*.jks
.DS_Store
8. 合并冲突
git merge 或 git pull 出现冲突时,Git 在文件中插入标记:
<<<<<<< HEAD
当前分支的内容
=======
合并进来的内容
>>>>>>> branch-name
处理步骤:
- 打开冲突文件,定位
<<<<<<<。 - 保留需要的代码,删除标记行与不需要的段落。
git add <file>标记为已解决。git commit完成合并。
放弃本次合并:
git merge --abort
9. 敏感文件与历史
.env、密钥文件(如 .jks)、私钥等不应提交到仓库。git rm 加提交只能从当前版本树中移除,历史提交中仍可能存在。
已从远程推送的敏感文件,需使用 git filter-repo 或 BFG Repo-Cleaner 等工具重写历史,并轮换已泄露的凭据。
仅本地、尚未推送的误提交,可用 git reset 回退后重新提交。
10. 常见问题
git push 被拒绝(non-fast-forward)
远程分支含有本地没有的提交。先 git pull(或 git pull --rebase)合并远程改动,再 push。
detached HEAD
当前不在任何分支上,而是直接指向某个提交。切回分支:
git switch main
查看某次提交改了什么
git show <commit-hash>
git diff <commit-hash>^ <commit-hash>
查看某文件的历史
git log --oneline -- path/to/file