【版本管理】Git使用 超实用教程
本文集成了我大量的使用经验和遇到的场景/问题 对应的解决方案,干货满满
全文共计14901字,整理不易,给我一个免费的赞吧 (*❦ω❦)👍
常用指令
git init
git init
创建git仓库,使用git管理项目
git add
# 将指定文件添加到暂存区 ↓
git add 文件名
# 将所有有改动的文件添加到暂存区 ↓
git add .
git commit
git commit -m "提交信息"
将暂存区的代码提交,形成一个新的节点
建议提交信息按照 提交规范书写,不了解git提交规范的可以看这篇文章
git push
git push origin head
会推送当前所在分支(也就是 HEAD 指向的分支)的内容到远程仓库。在这种情况下,Git 会尝试在远程仓库创建或更新一个与当前本地分支同名的分支。(也可以用git push origin branch1:branch2将本地的branch1推到远端的branch2)
只能推送到同名的分支 ↑
如果本地分支和远程分支历史一致,没有新的提交
会提示:
Everything up-to-date
git branch
# 创建分支
git branch 分支名
git checkout
# 创建并切换到新分支
git checkout -b 分支名
git switch
git switch 分支名
git checkout(checkout:check this out 去看看)
切换到指定分支
git merge
# 先切换到合并分支
git switch branch1
git merge --no-ff branch2
推荐使用IDEA来合并分支,详见合并分支
如果分支的暂存区有未提交的修改,是不能合并分支的
Merge made by the ‘ort’ strategy.
git pull
git pull origin main
- 会先执行
git fetch origin main - 立即执行
git merge origin/main到你的当前分支- 如果有冲突 → 直接进入冲突解决状态
- 如果没有冲突 → 自动提交合并(可能产生 “Merge commit”)
git fetch:只下载远程最新数据到本地(安全,不改变工作区)。
git pull:先执行 git fetch,再自动执行 git merge(可能直接修改你的代码)。
💡
git pull = git fetch + git merge
可能出现的问题:
本地分支对应的远端分支不存在(对应错了)
bash# 查看当前本地分支所对应的分支 git branch -vv # 修改当前本地分支对应的分支 git branch --set-upstream-to=origin/main
git log
展示最近的几条提交记录
git log
展示最近十条提交记 录(并用一行展示每条提交记录)
git log --oneline -10
常见场景
初始化配置
# 设置用户名
git config --global user.name "xiaoyu"
# 设置邮箱
git config --global user.email "xiaoyu@gmail.com"
# 设置全局代理
git config --global http.proxy http://127.0.0.1:7890
# 查看所有配置,查看是否配置成功
git config --list
# 取消代理
git config --global --unset http.proxy
版本回退
把「当前工作区」整体回退到 历史某次提交
按「是否保留后续提交记录」选择:
1. 查 commit-id
git log --oneline -10
复制前 7 位即可。
- 彻底删除一些提交(不要回退点之后的任何历史)
# 本地强制回退
git reset --hard <commit-id>
# 远程同步覆盖(如果远程也需要回退)
git push origin HEAD --force
效果:回退点之后的提交全部消失;会将当前工作目录和暂存区的内容都重置到指定的提交版本(<commit-id>),并且会丢弃当前工作目录和暂存区中未提交的更改
- 保留历史,新增“反向提交”(推荐,不破坏协作)
把「指定提交到最新一次」之间的所有改动,一次性生成「反向补丁」放进工作区/暂存区,但不自动提交**,等检查完再手动 commit——既保留历史,又避免逐条 revert 的麻烦**
git revert --no-commit <commit-id>..HEAD # 生成反向补丁
# 如果中途反悔,不想 revert 了,执行quit(在还没生成任何一次 git commit 之前执行)
# git revert --guit
git commit -m "Revert to <commit-id>"
git push origin <branch>
例:
git revert --no-commit 6a2b443..HEAD
git commit -m "revert: 撤销样式改动,回到第二次commit的状态"
git push origin main
效果:历史仍在,只是多了一条“撤销”提交,团队安全。
可能遇到的问题
1.需要撤销的提交中包含
merge提交bashhazenix@LAPTOP-AJ2CCTIC MINGW64 /d/ProjectOfBZH/HazeMusic (main) $ git log commit 7b2b6360905533d2a8fef6af8e5b33b969227cce (HEAD -> main, origin/main) Merge: 15d165c 3bbbe63 Author: night_sky <nightSKYcty@outlook.com> Date: Thu Jan 1 01:13:21 2026 +0800 Merge branch 'main' of https://github.com/Hazehacker/Auris commit 15d165caf424e3efb67c29da58fc43d3d2e1d242 Author: night_sky <nightSKYcty@outlook.com> Date: Thu Jan 1 01:12:34 2026 +0800 新增歌词展示页面; 迁移了个人主页页面; 修复了音量调节样式bug; 增加深浅模式的 适配; commit 3bbbe631490020784bf0c134be2f31635a5cd44f Author: HazeHacker <3542495583@qq.com> Date: Wed Dec 31 22:40:44 2025 +0800 style: 微调样式 修改按钮背景颜色,调整字体大小 commit 481ef3c9264bbaadf2ed21372f7b8e3a1295a870 hazenix@LAPTOP-AJ2CCTIC MINGW64 /d/ProjectOfBZH/HazeMusic (main) $ git revert --no-commit 3bbbe631490020784bf0c134be2f31635a5cd44f..HEAD error: commit 7b2b6360905533d2a8fef6af8e5b33b969227cce is a merge but no -m option was given. fatal: revert failed
git revert遇到 合并提交(merge commit) 时必须告诉它“要回退到哪一条父分支”,否则不知道该怎么生成反向补丁bash# -m 1 表示“保留 merge 的第 1 个父分支(通常是 main 方向)” git revert -m 1 --no-commit 7b2b636 git commit -m "Revert merge 7b2b636" git push origin mainmerge 节点有 两个父亲(parent):
text7b2b636 (merge) ├─ 15d165c ← 你在 main 上继续开发的分支(父分支 1) └─ 3bbbe63 ← 被合并进来的分支(父分支 2)
-m 1就是告诉 git:
“以父分支 1(15d165c)为基准,把父分支 2(3bbbe63)带来的改动全部反向撤销。”
说明:
- 父分支 1:你原来的主分支(main)。
- 父分支 2:别人(或你自己)开发完要合进来的分支。
执行
textgit revert -m 1 7b2b636相当于说:
“不要这次合并里‘父分支 2’带来的任何代码,给我生成一条‘反补丁’提交。”如果反过来用
-m 2textgit revert -m 2 7b2b636就表示:
“以父分支 2 为基准,把父分支 1 的改动反向撤销”,通常会把 main 分支自己的新代码给撤掉,用的更少点。
-m 1= 保留 main 方向的历史,撤销被合并分支的改动;
-m 2= 保留被合并分支,撤销 main 方向的改动。
- **仅把代码拿回工作区(不生成提交,可重新调整)**
git checkout <commit-id> -- . # 效果:文件内容回到旧版本,但暂存区/提交历史不动,适合“借鉴旧代码”。
git checkout HEAD -- . # 恢复成最新版
这里最后的“.”,指的是文件路径
如果回到旧版本之后,对文件做了修改,再执行
git checkout HEAD -- .,工作区里面未暂存的修改会被直接覆盖掉
- reset --hard → 历史重写
- revert → 安全回滚
- checkout → 只拿代码
撤回提交
比如:你发现上一次提交的时候,少加了个文件的修改到暂存区,那么怎么撤回这一次提交,但是不影响当前所有代码
撤销最后一次提交:
撤销最后一次提交,但保留当前所有代码的修改,并将这些修改保留在暂存区中
git reset HEAD~ --soft
或
git reset HEAD~1 --soft
回退到上上个提交
git reset HEAD~2 --soft
以此类推,
git reset HEAD~<n> --soft——回退 n 个版本
可能遇到的问题
由于第一次提交是没有父提交的,撤销第一次提交不能用这个指令
使用:git update-ref -d HEAD
- 提交历史被清空,但本地的文件依然存在,且处于“未暂存”状态
分支合并
# 切换到要合并进去的分支
git switch branch1
git merge
推荐使用idea合并分支,方便解决冲突
同步更新后 再修改代码
-
使用git pull拉取远端的最新版本
-
【如果当前主分支已经合并了 你的分支 上一次提交的修改(也就是说你的分支和主分支在历史上有共同的提交点,且你之后没有新的本地提交)】,你可以直接用主分支为基础更新你的分支
bashgit checkout feature-x git fetch origin git reset --hard origin/main # 将当前分支强制指向主分支的最新提交如果你确定自己分支没有新内容(或不需要保留),可以直接重置
-
【更常见】你可能在自己的分支上还有新的未合并的提交,而主分支已经包含了你之前的提交。这时你希望以主分支为基础继续开发,同时保留你新写的代码。这种情况下推荐使用
rebase而不是merge,以保持提交历史干净线性。bash# 1. 确保你在自己的分支上 git checkout feature-x # 2. 获取远程最新信息(包括 main 的最新状态) git fetch origin # 3. 将你的提交“重新播放”到 origin/main 的最新提交之上 git rebase origin/main
写错分支
忘记切换分支再工作,导致在另一不属于自己的分支写了很多代码,这个时候不能提交、也不能回滚(代码会白写)
-
将一个分支上的修改转移到另一个分支上面
-
使用IDEA
将代码暂存起来


切换分支选择你刚刚创建的暂存


⬇️ 点击apply

包含敏感信息导致推送失败
可能是因为引入.gitignore文件晚了,在这之前就提交过、并且之前的提交信息中包含敏感信息
删除已提交的敏感提交
因为你已经提交了包含密钥的代码,必须从历史中彻底清除。
-
使用
git rebase --interactive删除特定提交text# 查看最近几次提交 git log --oneline -10 # 软重置到 指定版本 git reset --soft 620ccae--soft会保留你所有的代码改动(工作区和暂存区不变),只是把提交历史回退到620ccae。 -
提交(确保.gitignore文件的存在,确保敏感信息不再会被提交)
textgit add . git commit -m "msg"
IDEA中使用git
新建分支

查看提交记录

切换分支

拉取远端最新版本
(先右键项目名)

合并分支

如果另一个分支只是做了新增或删除,就会直接合并,如果另一个分支做了修改/你们这两个分支同时对一行代码有修改,就会产生冲突,IDEA就会提示你解决冲突
使用你的版本
使用他的版本
手动对每一处修改作接纳,得到最终的result,然后apply,完成冲突的解决
合并完需要commit,否则就会一直处在合并的状态↑
此时若 无冲突,IDEA 会直接把改动放进 本地索引 并打开「合并提交」窗口,此时可以:
- 再点 Review 看这次合并到底改了哪些文件;
- 或者把不想带过来的文件从 Included 移到 Excluded(即放弃该文件合并)
预览式合并
右键节点,将其和当前分支状态对比,并允许在对比的同时合并

如果两个文件有差异,文件名呈现“蓝色”,如果当前版本多出这个文件,文件名呈现“绿色”,如果当前版本少这个文件,呈现“灰色”
查看两个分支之间的差异
可以在合并分支之前使用这个功能检查
方式1


如果两个文件有差异,文件名呈现“蓝色”,如果本地多出这个文件,文件名呈现“绿色”
方式2
找到一个要与之对比的分支及节点,右键,点击比较

撤销提交
撤销一个提交,更改保存在暂存区


局部回滚某个文件
比如ai误删除了一个文件,可以用局部回滚功能恢复
右键文件,点击Rollback


常见流程
-
克隆仓库
textgit clone https://github.com/Hazehacker/Monopoly2.0.git或者使用ssh方式克隆
-
添加仓库
textgit remote add origin https://github.com/Hazehacker/Monopoly2.0.git git remote -
(本地拉取github上的分支变化)
textgit pull origin 或 git fetch origin
并在本地切换到branch1
git switch branch1
-
修改代码、完成工作
-
保存到暂存区并提交修改
bash# git status git add . git commit -m "commit message"查看过往提交:
git log -
推送到远端分支
textgit push origin HEAD-
如果远端已经存在
branch2分支,你可以直接将本地的branch1分支推送到远端的branch2分支:bashgit push origin branch1:branch2
-
-
分支合并
-
fast forward(ff) 快进式合并
bashgit checkout -b beta # 编辑beta分支 git checkout main git merge betamain分支开出来一个beta分支;
在beta分支之上编辑之后,切换到main分支;
将beta和main分支合并;
合并之后main和beta分支会变成同一个分支,但是没有分支的效果,整个过程就好像只在main分支上commit了一样;
-
git分支合并(非快进式)
bashgit checkout -b beta # 编辑beta分支 git checkout main git merge --no-ff beta
-
网络问题解决办法
push不到github的分支
-
开代理
-
校园网切换成热点
-
使用ssh连接
-
使用url转换工具,将原本的url替换为另一个url
-
在.gitconfig文件中配置代理服务器
ssh
有时候通过SSH方式也能解决访问慢的问题
什么是 SSH?
SSH 是 Secure Shell 的缩写,它是一种网络协议,用于通过不安全的网络(比如互联网)安全地访问远程计算机。
想象一下,你有一台电脑放在另一个房间,你想要操作它,但又不想每次都亲自走过去。SSH 就像是一个安全的“远程控制器”,让你可以安全地从你的电脑控制另一台电脑。
SSH 为什么有用?
安全访问:SSH 提供了一种加密的方式来访问远程服务器,这意味着你发送的数据(比如密码、命令等)都是加密的,别人很难截获和破解。
远程命令执行:你可以使用 SSH 来在远程服务器上执行命令,就像你直接坐在那台服务器前一样。
文件传输:SSH 还可以用来安全地传输文件,比如 SCP(Secure Copy)和 SFTP(SSH File Transfer Protocol)。
自动化:SSH 可以用于自动化脚本,比如自动备份、更新服务器等。
在 Git 中使用 SSH
在 Git 中,SSH 主要用于安全地访问远程仓库(比如 GitHub 上的仓库)。当你使用 SSH 克隆仓库时,Git 会使用你的 SSH 密钥来验证你的身份,而不是每次输入用户名和密码。
初次使用的配置
如果是初次使用,需要生成密钥对、配置github,详见下面几步
非初次使用看这个:ssh方式操作
-
生成密钥对
打开git bash工具,然后输入命令
bashssh-keygen -t rsa -C "github邮箱"遇到输入提示直接回车

直接回车使用默认文件存储这个key即可
如果用户名是中文用户名,指定路径的时候要加"-f"
-
添加私钥到密钥管理器
ssh-agent 就是一个密钥管理器,运行 ssh-agent 以后,使用 ssh-add 将私钥交给 ssh-agent 保管,其他程 序需要身份验证的时候可以将验证申请交给 ssh-agent 来完成整个认证过程。
确认一下秘钥管理器是否正常运行,执行 ssh-agent 命令,如下图所示

执行下列命令,添加私钥到秘钥管理器
bashssh-add ~/.ssh/id_rsa可能出现的问题

1.查询进程
textps aux | grep ssh2.杀死进程
textkill -9 进程号
3.进入用户名目录下的.ssh目录,执行如下命令
bashcd ~/.ssh exec ssh-agent bash eval ssh-agent -s4.再次执行添加命令
textssh-add ~/.ssh/id_rsa添加成功

-
配置GitHub
查看公钥
bashcat ~/.ssh/id_rsa.pub
复制公钥备用
打开GitHub:https://github.com/settings/ssh/new
新建SSH key

-
连接测试
执行命令:
bashssh -T git@github.com正常返回,说明配置成功,可以使用ssh方式克隆和推送代码了

ssh方式操作
克隆仓库
git clone git@github.com:Hazehacker/blog.hazenix.top.git
push改动
# 1. 查看当前远程地址
git remote -v
# 2. 改为 SSH 地址
git remote add origin git@github.com:Hazehacker/blog.hazenix.top.git # 如果不存在origin就用这个
git remote set-url origin git@github.com:Hazehacker/blog.hazenix.top.git # 如果已经有origin就用这个
# 3. 测试 SSH 是否成功
ssh -T git@github.com
# 4. 推送代码
git push origin head
可能的问题
问题 解决方法 Permission denied (publickey)公钥没加到 GitHub 或路径不对 ssh: connect to host github.com port 22: Connection timed out网络问题,可能被墙,改用 HTTPS 或代理 Could not resolve hostname github.comDNS 问题,换网络试试
使用 HTTPS 但走 SSH 认证(高级技巧)
如果你的网络不支持 SSH(比如公司防火墙禁用了 22 端口),可以用 HTTPS + SSH 代理:
bash# 设置 Git 使用 SSH 通道访问 HTTPS git config --global url."ssh://git@github.com/".insteadOf "https://github.com/"这样 Git 会自动把 HTTPS 转成 SSH
















评论 (0)
暂无评论,快来抢沙发吧!