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 会报错

 

posted @ 2021-02-04 11:24  阿陌i  阅读(96)  评论(0)    收藏  举报