git操作(更新于2026.11.04)
说明:switch 是新版推荐;后面附带 checkout 老写法,你任选。
工作流:main(稳定) ← dev(开发主干) ← feature/xxx(功能分支)
一、密钥 & 初始化 & 关联远程
# 1.设置提交用户名、邮箱
git config --global user.name "github昵称" git config --global user.email "github邮箱"
# 2.【单仓库单独配置,公私邮箱隔离,适合你!】进入项目目录执行,只对当前仓库生效
git config user.name "github昵称" git config user.email "github邮箱"
# 3.生成ssh秘钥:
老版:ssh-keygen -t rsa -C "aaaa@ccc.com" 新版(最推荐):ssh-keygen -t ed25519 -C "你的github邮箱"
# rsa和ed25519 的区别:
|
特性 |
Ed25519 |
RSA(传统) |
|
密钥长度 |
固定 256 bit |
常用 2048/4096 bit |
|
体积 |
公钥很短,复制方便 |
公钥很长一大串 |
|
速度 |
签名、校验非常快 |
慢很多 |
|
安全性 |
抗攻击能力强,现代推荐 |
2048 位 RSA 已经慢慢不推荐 |
|
兼容性 |
新版 Git、GitHub、Codeup 全都支持;很老的系统才不支持 |
兼容所有老旧设备 |
# 4.测试github ssh连通:
ssh -T git@github.com
# 5. 本地文件夹初始化为git仓库
git init
# 6. 关联远程仓库 origin(ssh地址)
git remote add origin git@github.com:用户名/仓库名.git
# 7. 查看远程地址
git remote -v
# 8. 克隆线上仓库(直接拉到本地)
git clone git@github.com:用户名/仓库名.git
# 克隆并默认切换到指定分支(比如dev)
git clone -b dev git@github.com:用户名/仓库名.git
二、查看状态、日志
# 查看当前文件改动状态(最常用) git status # 查看提交日志 git log # 简洁单行日志 git log --oneline # 查看本地分支 git branch # 查看远程分支 git branch -r # 查看本地+远程所有分支 git branch -a
三、暂存、提交代码
# 把所有修改加入暂存区 git add . # 指定单个文件 git add test.php # 提交暂存内容,写备注 git commit -m "备注内容,例如:新增文件上传功能"
重点:未 commit 的改动不属于任何分支,切换分支会跟着带走!
四、分支操作
# 切换分支: 老版:git checkout 分支名;(如果创建不存在的新分支git checkout -b 分支名) 新版:git switch 分支名;(如果创建不存在的新分支git switch-c 分支名) # 新建分支 + 切换进去(推荐) git switch -c feature/demo # 老写法 git checkout -b feature/demo # 只切换已有分支 git switch dev git switch main # 老写法 git checkout dev # 基于远程分支创建本地分支(本地没有main时用) git switch -c main origin/main # 删除本地分支(不能在这个分支内执行) git branch -d feature/demo # 删除线上远程分支 git push origin --delete feature/demo
五、拉取、推送、跟踪上游
# 拉取远程更新(只拉数据,不自动合并,安全) git fetch origin # 拉取+合并远程分支到当前分支(pull = fetch + merge) git pull origin main # 第一次推送分支,-u 设置上游跟踪(只需要一次!) git push -u origin feature/demo # 已经绑定上游后,直接推送当前分支 git push # 显式指定推哪个分支(任何时候都能用,不用依赖跟踪) git push origin main
六、分支合并
# 切到目标分支(比如main) git switch main # 把dev合并进main,自动合并无冲突直接成功 git merge dev # 自定义合并备注 git merge dev -m "合并dev:版本迭代完成,稳定上线" 有冲突:手动修改冲突文件 → git add . → git commit -m "解决合并冲突"
注意:
- git merge dev:合并,保留完整分叉历史,冲突一次处理完,安全。(保留两条分支历史,生成一条 merge commit)
- git rebase dev:变基,改写你分支的提交起点;每一条 commit 遇到冲突都要单独处理。(把你的提交 “摘下来,放到目标分支最新节点后面”,提交历史是一条直线,rebase 过程中也会产生冲突,而且冲突解决流程更麻烦)
七、临时储藏改动(stash,非常实用)
不想提交,但需要切分支,临时保存改动 # 储藏当前未提交修改,工作区变回干净 git stash # 把储藏的改动拿回来(拿完就删掉这条储藏记录) git stash pop # 查看储藏列表 git stash list
八、撤销、回滚(慎用!)
# 撤销工作区文件修改(还没add) git restore test.php # 老写法 git checkout -- test.php # 取消add(已经git add,但还没commit) git reset HEAD test.php
九、场景&避坑
标准开发流程命令串(直接套用)
# 1. 切到开发主干dev git switch dev # 2. 从dev拉出功能分支 git switch -c feature/xxx # 3. 修改代码后提交 git add . git commit -m "feature: xxx功能" # 4. 推送到github,生成线上分支 git push -u origin feature/xxx # 5. 去github网页提PR,合并到dev # 6. dev稳定后,合并dev到main上线 git switch main git merge dev git push origin main
代码回退到指定版本
场景1:修改了文件/path/to/file,没有提交,但是觉得改的不好,想还原。
(用当前分支最新提交里的版本覆盖工作区这个文件,丢弃本地未暂存的修改)
解决:
git restore /path/to/file
场景2:修改了文件/path/to/file,已经提交,但是觉得改的不好,想还原到上衣版本。
解决:
1. 首先查看文件的历史版本。git log /path/to/file
2. 找到你想要还原的版本。如
commit 052c0233bcaef35bbf6e6ebd43bfd6a648e3d93b
Author:11<111@gmail.com>
Date: Wed Nov 8 11:48:31 2017 +0800
commit modify/path/to/file
3. 将文件还原到你想要还原的版本。$ git checkout ${commit} /path/to/file。即$ git checkout 052c0233bcaef35bbf6e6ebd43bfd6a648e3d93b /path/to/file
4. 这时查看文件,会发现文件已经还原了。(如果没有还原,请刷新再看。)
5. commit、push。
git撤回到某条记录并推送远程分支:
git reset --hard loghash值(风险高;可改为:git revert commitHash)
git push origin 分支名 --force
注意:
git reset --hard hash:把当前分支指针直接掰回这个 hash,hash 之后所有提交全部在本地丢弃,工作区直接覆盖清空
--force 强制覆盖远程分支,重写远程提交历
如果多人合作开发,别人本地历史和远程冲突,会非常难处理
查询指定当前文件夹下指定时间范围内代码负责人为cxp的添加代码行数,删除代码行数,最终代码行数
git log --since='2020-12-01' --until='2020-12-03' --author="cxp" --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }' -
避坑要点
git clone -b dev 只是默认切 dev,所有分支数据都下载下来了,可以随时切 main
git push origin A 推送的是本地 A 分支,和你当前在哪个分支无关
没有 -u 绑定上游时,直接 git push 会报错


浙公网安备 33010602011771号