本文集成了我大量的使用经验和遇到的场景/问题 对应的解决方案,干货满满

全文共计14901字,整理不易,给我一个免费的赞吧 (*❦ω❦)👍

常用指令

git init

bash
git init

创建git仓库,使用git管理项目

git add

bash
# 将指定文件添加到暂存区 ↓
git add 文件名
# 将所有有改动的文件添加到暂存区 ↓
git add .

git commit

bash
git commit -m "提交信息"

将暂存区的代码提交,形成一个新的节点

建议提交信息按照 提交规范书写,不了解git提交规范的可以看这篇文章

git push

text
git push origin head

会推送当前所在分支(也就是 HEAD 指向的分支)的内容到远程仓库。在这种情况下,Git 会尝试在远程仓库创建或更新一个与当前本地分支同名的分支。(也可以用git push origin branch1:branch2将本地的branch1推到远端的branch2

只能推送到同名的分支 ↑

如果本地分支和远程分支历史一致,没有新的提交

会提示:Everything up-to-date

git branch

bash
# 创建分支
git branch 分支名

git checkout

bash
# 创建并切换到新分支
git checkout -b 分支名

git switch

bash
git switch 分支名

git checkout(checkout:check this out 去看看)

切换到指定分支

git merge

bash
# 先切换到合并分支
git switch branch1
git merge --no-ff branch2

推荐使用IDEA来合并分支,详见合并分支

如果分支的暂存区有未提交的修改,是不能合并分支的

Merge made by the ‘ort’ strategy.

git pull

text
git pull origin main
  1. 会先执行 git fetch origin main
  2. 立即执行 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

展示最近的几条提交记录

bash
git log

展示最近十条提交记 录(并用一行展示每条提交记录)

bash
git log --oneline -10

常见场景

初始化配置

bash
# 设置用户名
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

配置ssh (可选)

版本回退

把「当前工作区」整体回退到 历史某次提交

按「是否保留后续提交记录」选择:

1. 查 commit-id

bash
git log --oneline -10

复制前 7 位即可。


  • 彻底删除一些提交(不要回退点之后的任何历史)
bash
# 本地强制回退
git reset --hard <commit-id>

# 远程同步覆盖(如果远程也需要回退)
git push origin HEAD --force

效果:回退点之后的提交全部消失;会将当前工作目录和暂存区的内容都重置到指定的提交版本(<commit-id>),并且会丢弃当前工作目录和暂存区中未提交的更改


  • 保留历史,新增“反向提交”(推荐,不破坏协作)

把「指定提交到最新一次」之间的所有改动,一次性生成「反向补丁」放进工作区/暂存区,但不自动提交**,等检查完再手动 commit——既保留历史,又避免逐条 revert 的麻烦**

bash
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>

例:

bash
git revert --no-commit 6a2b443..HEAD

git commit -m "revert: 撤销样式改动,回到第二次commit的状态"

git push origin main

效果:历史仍在,只是多了一条“撤销”提交,团队安全。

可能遇到的问题

1.需要撤销的提交中包含merge提交

bash
hazenix@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 main

merge 节点有 两个父亲(parent):

text
7b2b636 (merge)
├─ 15d165c  ← 你在 main 上继续开发的分支(父分支 1)
└─ 3bbbe63  ← 被合并进来的分支(父分支 2

-m 1 就是告诉 git:
以父分支 1(15d165c)为基准,把父分支 2(3bbbe63)带来的改动全部反向撤销。”


说明

  • 父分支 1:你原来的主分支(main)。
  • 父分支 2:别人(或你自己)开发完要合进来的分支。

执行

text
git revert -m 1 7b2b636

相当于说:
不要这次合并里‘父分支 2’带来的任何代码,给我生成一条‘反补丁’提交。”

如果反过来用 -m 2

text
git revert -m 2 7b2b636

就表示:
“以父分支 2 为基准,把父分支 1 的改动反向撤销”,通常会把 main 分支自己的新代码给撤掉,用的更少点。


-m 1 = 保留 main 方向的历史,撤销被合并分支的改动
-m 2 = 保留被合并分支,撤销 main 方向的改动

  • **仅把代码拿回工作区(不生成提交,可重新调整)**
bash
git checkout <commit-id> -- . # 效果:文件内容回到旧版本,但暂存区/提交历史不动,适合“借鉴旧代码”。
git checkout HEAD -- . # 恢复成最新版


这里最后的“.”,指的是文件路径

如果回到旧版本之后,对文件做了修改,再执行git checkout HEAD -- .,工作区里面未暂存的修改会被直接覆盖掉

  • reset --hard → 历史重写
  • revert → 安全回滚
  • checkout → 只拿代码

撤回提交

比如:你发现上一次提交的时候,少加了个文件的修改到暂存区,那么怎么撤回这一次提交,但是不影响当前所有代码

撤销最后一次提交

撤销最后一次提交,但保留当前所有代码的修改,并将这些修改保留在暂存区中

bash
git reset HEAD~ --soft
或
git reset HEAD~1 --soft

回退到上上个提交

bash
git reset HEAD~2 --soft

以此类推,git reset HEAD~<n> --soft ——回退 n 个版本

可能遇到的问题

由于第一次提交是没有父提交的,撤销第一次提交不能用这个指令
使用:git update-ref -d HEAD

  • 提交历史被清空,但本地的文件依然存在,且处于“未暂存”状态

分支合并

bash
# 切换到要合并进去的分支
git switch branch1
git merge 

推荐使用idea合并分支,方便解决冲突

同步更新后 再修改代码

  • 使用git pull拉取远端的最新版本

  • 【如果当前主分支已经合并了 你的分支 上一次提交的修改(也就是说你的分支和主分支在历史上有共同的提交点,且你之后没有新的本地提交)】,你可以直接用主分支为基础更新你的分支

    bash
    git 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文件晚了,在这之前就提交过、并且之前的提交信息中包含敏感信息

删除已提交的敏感提交
因为你已经提交了包含密钥的代码,必须从历史中彻底清除。

  1. 使用 git rebase --interactive 删除特定提交

    text
    # 查看最近几次提交
    git log --oneline -10
    
    # 软重置到 指定版本
    git reset --soft 620ccae
    

    --soft 会保留你所有的代码改动(工作区和暂存区不变),只是把提交历史回退到 620ccae

  2. 提交(确保.gitignore文件的存在,确保敏感信息不再会被提交)

    text
    git add .
    git commit -m "msg"
    

IDEA中使用git

新建分支

查看提交记录

切换分支

拉取远端最新版本

(先右键项目名)

合并分支

如果另一个分支只是做了新增或删除,就会直接合并,如果另一个分支做了修改/你们这两个分支同时对一行代码有修改,就会产生冲突,IDEA就会提示你解决冲突

  1. 使用你的版本

  2. 使用他的版本

  3. 手动对每一处修改作接纳,得到最终的result,然后apply,完成冲突的解决

合并完需要commit,否则就会一直处在合并的状态↑

此时若 无冲突,IDEA 会直接把改动放进 本地索引 并打开「合并提交」窗口,此时可以:

  • 再点 Review 看这次合并到底改了哪些文件;
  • 或者把不想带过来的文件从 Included 移到 Excluded(即放弃该文件合并)

预览式合并

右键节点,将其和当前分支状态对比,并允许在对比的同时合并

如果两个文件有差异,文件名呈现“蓝色”,如果当前版本多出这个文件,文件名呈现“绿色”,如果当前版本少这个文件,呈现“灰色”

查看两个分支之间的差异

可以在合并分支之前使用这个功能检查

方式1

如果两个文件有差异,文件名呈现“蓝色”,如果本地多出这个文件,文件名呈现“绿色”

方式2

找到一个要与之对比的分支及节点,右键,点击比较

撤销提交

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

局部回滚某个文件

比如ai误删除了一个文件,可以用局部回滚功能恢复

右键文件,点击Rollback

常见流程

  • 克隆仓库

    text
    git clone https://github.com/Hazehacker/Monopoly2.0.git
    

    或者使用ssh方式克隆

  • 添加仓库

    text
    git remote add origin https://github.com/Hazehacker/Monopoly2.0.git
    git remote
    
  • (本地拉取github上的分支变化)

    text
    git pull origin
    或
    git fetch origin
    

​ 并在本地切换到branch1

text
git switch branch1
  • 修改代码、完成工作

  • 保存到暂存区并提交修改

    bash
    # git status 
    git add .
    git commit -m "commit message"
    

    查看过往提交:

    git log

  • 推送到远端分支

    text
    git push origin HEAD
    

    SSH方式push

    • 如果远端已经存在 branch2 分支,你可以直接将本地的 branch1 分支推送到远端的 branch2 分支:

      bash
      git push origin branch1:branch2
      
  • 分支合并

    • fast forward(ff) 快进式合并

      bash
      git checkout -b beta
      # 编辑beta分支
      git checkout main
      git merge beta
      

      main分支开出来一个beta分支;

      在beta分支之上编辑之后,切换到main分支;

      将beta和main分支合并;

      合并之后main和beta分支会变成同一个分支,但是没有分支的效果,整个过程就好像只在main分支上commit了一样;

    • git分支合并(非快进式)

      bash
      git checkout -b beta
      # 编辑beta分支
      git checkout main
      git merge --no-ff beta
      

网络问题解决办法

push不到github的分支

  1. 开代理

  2. 校园网切换成热点

  3. 使用ssh连接

  4. 使用url转换工具,将原本的url替换为另一个url

    https://xuc.xi-xu.me/

  5. 在.gitconfig文件中配置代理服务器

ssh

有时候通过SSH方式也能解决访问慢的问题

什么是 SSH?

SSH 是 Secure Shell 的缩写,它是一种网络协议,用于通过不安全的网络(比如互联网)安全地访问远程计算机。

想象一下,你有一台电脑放在另一个房间,你想要操作它,但又不想每次都亲自走过去。SSH 就像是一个安全的“远程控制器”,让你可以安全地从你的电脑控制另一台电脑。

SSH 为什么有用?

  1. 安全访问:SSH 提供了一种加密的方式来访问远程服务器,这意味着你发送的数据(比如密码、命令等)都是加密的,别人很难截获和破解。

  2. 远程命令执行:你可以使用 SSH 来在远程服务器上执行命令,就像你直接坐在那台服务器前一样。

  3. 文件传输:SSH 还可以用来安全地传输文件,比如 SCP(Secure Copy)和 SFTP(SSH File Transfer Protocol)。

  4. 自动化:SSH 可以用于自动化脚本,比如自动备份、更新服务器等。

在 Git 中使用 SSH

在 Git 中,SSH 主要用于安全地访问远程仓库(比如 GitHub 上的仓库)。当你使用 SSH 克隆仓库时,Git 会使用你的 SSH 密钥来验证你的身份,而不是每次输入用户名和密码。

初次使用的配置

如果是初次使用,需要生成密钥对、配置github,详见下面几步

非初次使用看这个:ssh方式操作

  • 生成密钥对

    打开git bash工具,然后输入命令

    bash
    ssh-keygen -t rsa -C "github邮箱"
    

    遇到输入提示直接回车

    直接回车使用默认文件存储这个key即可

    如果用户名是中文用户名,指定路径的时候要加"-f"

  • 添加私钥到密钥管理器

    ssh-agent 就是一个密钥管理器,运行 ssh-agent 以后,使用 ssh-add 将私钥交给 ssh-agent 保管,其他程 序需要身份验证的时候可以将验证申请交给 ssh-agent 来完成整个认证过程。

    确认一下秘钥管理器是否正常运行,执行 ssh-agent 命令,如下图所示

    执行下列命令,添加私钥到秘钥管理器

    bash
    ssh-add ~/.ssh/id_rsa
    

    可能出现的问题

    1.查询进程

    text
    ps aux | grep ssh
    

    2.杀死进程

    text
    kill -9 进程号
    

    3.进入用户名目录下的.ssh目录,执行如下命令

    bash
    cd ~/.ssh
    exec ssh-agent bash
    eval ssh-agent -s
    

    4.再次执行添加命令

    text
    ssh-add ~/.ssh/id_rsa
    

    添加成功

  • 配置GitHub

    查看公钥

    bash
    cat ~/.ssh/id_rsa.pub
    

    复制公钥备用
    打开GitHub:https://github.com/settings/ssh/new
    新建SSH key

  • 连接测试

    执行命令:

    bash
    ssh -T git@github.com
    

    正常返回,说明配置成功,可以使用ssh方式克隆和推送代码了

ssh方式操作

克隆仓库

text
git clone git@github.com:Hazehacker/blog.hazenix.top.git

push改动

bash
# 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.com DNS 问题,换网络试试

使用 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