沉梦手记 沉梦手记
首页
  • 基础篇
  • 集合篇
  • 并发篇
  • JVM
  • 新特性
  • 计算机网络
  • 操作系统
  • 数据结构与算法
  • 基础篇
  • MySql
  • Redis
  • 达梦数据库
  • Spring
  • SpringBoot
  • Mybatis
  • Shiro
  • 设计须知
  • UML画图
  • 权限校验
  • 设计模式
  • API网关
  • 网络通信
  • 消息队列
  • SpringCloud
  • 分布式事务
  • 云存储
  • 搜索引擎
  • 音视频处理
  • Linux 与容器化运维
  • 开发工具篇
  • 工具库篇
  • 开发技巧篇
  • 工具类系列
  • 随笔
  • 前端环境搭建
  • HTML与CSS
  • JS学习
  • Axios入门
  • Vue Router入门
  • Pinia入门
  • Vue3入门
  • Vue3进阶
  • 黑马Vue3
  • 脚手架搭建
  • 瑞吉外卖
  • 黑马点评
  • vue-blog
  • 沉梦接口开放平台
  • 用户中心
  • 聚合搜索平台
  • 仿12306项目
  • 壁纸小程序项目
  • RuoYi-Vue
  • 博客搭建
  • 网站收藏箱
  • 断墨寻径摘录
  • 费曼学习法
Github (opens new window)

沉梦听雨

时间是最好的浸渍剂,而沉淀是最好的提纯器🚀
首页
  • 基础篇
  • 集合篇
  • 并发篇
  • JVM
  • 新特性
  • 计算机网络
  • 操作系统
  • 数据结构与算法
  • 基础篇
  • MySql
  • Redis
  • 达梦数据库
  • Spring
  • SpringBoot
  • Mybatis
  • Shiro
  • 设计须知
  • UML画图
  • 权限校验
  • 设计模式
  • API网关
  • 网络通信
  • 消息队列
  • SpringCloud
  • 分布式事务
  • 云存储
  • 搜索引擎
  • 音视频处理
  • Linux 与容器化运维
  • 开发工具篇
  • 工具库篇
  • 开发技巧篇
  • 工具类系列
  • 随笔
  • 前端环境搭建
  • HTML与CSS
  • JS学习
  • Axios入门
  • Vue Router入门
  • Pinia入门
  • Vue3入门
  • Vue3进阶
  • 黑马Vue3
  • 脚手架搭建
  • 瑞吉外卖
  • 黑马点评
  • vue-blog
  • 沉梦接口开放平台
  • 用户中心
  • 聚合搜索平台
  • 仿12306项目
  • 壁纸小程序项目
  • RuoYi-Vue
  • 博客搭建
  • 网站收藏箱
  • 断墨寻径摘录
  • 费曼学习法
Github (opens new window)
  • 开发工具篇

    • idea相关

    • 玩转Git

      • 基础知识梳理
      • Git配置相关操作
      • git修改已提交的用户名和邮箱
      • git提交规范
      • git分支管理
      • git常用操作
        • 初始化仓库
        • 初始化一个 README 文件
        • 配置
        • 添加文件
        • 提交更改
        • 查看状态
        • 查看提交历史
        • 分支操作
        • 合并分支
        • 撤销操作
        • 远程仓库操作
          • 基本操作
          • 多远程仓库管理(Fork 工作流)
          • 强制推送
        • 解决冲突
        • 标签操作
        • 查看差异
        • 编辑已经提交的 commit
          • 情况一:修改最近一次的提交
          • 情况二:修改历史中的某次提交(交互式变基)
          • 操作失误,兜底操作
      • git-submodule子模块管理
      • fork工作流与上游同步
      • gitignore最佳实践
      • 常见问题
    • Maven相关

    • 前端工具

    • 测试工具

    • AI工具

  • 工具库篇

  • 开发技巧篇

  • 工具类系列

  • 随笔

  • 开发日常
  • 开发工具篇
  • 玩转Git
沉梦听雨
2024-11-21
目录

git常用操作

# Git 常用操作

Git是一个分布式版本控制系统,它允许你跟踪文件和目录的历史更改。以下是一些常用的Git操作和它们的相关知识:

# 初始化仓库

  • git init:在当前目录创建一个新的 Git 仓库。

# 初始化一个 README 文件

这里讲述以 Git 命令来初始化 README 文件

touch README.md
echo "# Project Title" > README.md
git add README.md
git commit -m "Initialize README file"
1
2
3
4

# 配置

  • git config --global user.name "[name]":设置全局用户名。
  • git config --global user.email "[email address]":设置全局邮箱。

# 添加文件

  • git add <file>:将指定文件添加到暂存区。
  • git add .:将当前目录的所有更改添加到暂存区。

# 提交更改

  • git commit -m "message":将暂存区的文件提交到仓库,并附上提交信息。

# 查看状态

  • git status:查看当前文件的状态,哪些文件被修改了,哪些文件在暂存区。

# 查看提交历史

  • git log:查看提交历史记录。
  • git log --oneline:以简化的方式查看提交历史。

# 分支操作

  • git branch:列出所有分支。
  • git branch <name>:创建一个新分支。
  • git checkout <name>:切换到指定分支。
  • git checkout -b <name>:创建新分支并切换到该分支。

# 合并分支

  • git merge <branch>:将指定分支合并到当前分支。

# 撤销操作

  • git reset <file>:将文件从暂存区撤回到工作区(相当于 --mixed,默认行为)。
  • git reset --soft <commit>:回退到指定提交,但保留暂存区和工作区的修改。
  • git reset --mixed <commit>:回退到指定提交,保留工作区修改,但清空暂存区(默认行为)。
  • git reset --hard <commit>:回退到指定提交,彻底丢弃暂存区和工作区的所有修改(不可恢复,慎用)。
  • git revert <commit>:撤销某次提交,创建一个新的提交来抵消之前的提交(不改写历史,安全)。<commit> 是要撤销的提交的哈希值。

reset vs revert:

  • reset 是"回退",把 HEAD 指针移到之前的提交,会改写历史(已推送的提交慎用)
  • revert 是"反向操作",创建一个新提交来撤销旧提交,不改写历史(已推送的提交推荐用这个)

# 远程仓库操作

# 基本操作

  • git clone <repository>:克隆远程仓库到本地。<repository> 可以是远程仓库的 URL。

  • git clone <repository> <directory>:将远程仓库克隆到指定的本地目录。

  • git clone --recurse-submodules <repository>:克隆含子模块的仓库(同时拉取所有子模块)。

  • git remote add <name> <url>:添加远程仓库。

  • git remote remove <name>:删除远程仓库关联。

  • git remote rename <旧名称> <新名称>:重命名远程仓库。

  • git remote set-url <name> <新url>:修改远程仓库地址。

  • git remote -v:查看所有远程仓库地址(-v 表示显示 URL)。

  • git push <remote> <branch>:将本地分支的更改推送到远程仓库。

  • git pull <remote> <branch>:从远程仓库拉取分支的更改并合并到本地。

  • git fetch <remote>:从远程仓库拉取最新信息,但不合并(比 pull 更安全,可以先查看再决定是否合并)。

# 多远程仓库管理(Fork 工作流)

当你 Fork 一个开源项目进行二开时,通常需要配置两个远程仓库:

# origin 指向你的 fork(有推送权限)
git remote add origin https://gitee.com/你的用户名/项目.git

# upstream 指向原仓库(只有拉取权限,用于同步上游更新)
git remote add upstream https://gitee.com/原作者/项目.git

# 查看所有远程仓库
git remote -v
1
2
3
4
5
6
7
8

详细的 Fork 工作流和上游同步流程,参见 Fork 工作流与上游同步。

# 强制推送

当你在本地修改了已推送的提交历史(如 git commit --amend、git rebase、git reset --hard),需要强制推送到远程:

# --force:强制推送,无论远程是否有他人的新提交都会覆盖(危险)
git push --force origin <分支名>

# --force-with-lease:安全的强制推送(推荐)
# 如果远程分支有你本地未同步的新提交,会拒绝推送,避免覆盖他人工作
git push --force-with-lease origin <分支名>
1
2
3
4
5
6

始终优先使用 --force-with-lease 而非 --force。前者会检查远程分支是否有你未拉取的新提交,避免意外覆盖他人的工作。

# 解决冲突

  • 当合并时出现冲突,需要手动解决冲突后,使用 git add <resolved-file> 添加解决后的文件,然后 git commit 提交。

# 标签操作

  • git tag <tagname>:创建一个标签。
  • git push <remote> <tagname>:推送标签到远程仓库。

# 查看差异

  • git diff:查看工作区和暂存区的差异。
  • git diff <branch>:查看当前分支和指定分支的差异。

# 编辑已经提交的 commit

# 情况一:修改最近一次的提交

如果你只是想修改刚刚提交的 commit 信息,或者想追加/修改刚刚提交的文件,使用 git commit --amend 即可。

1. 仅修改提交信息(Commit Message)

  • 方法A(推荐):直接在终端输入 git commit --amend,会进入默认编辑器(如 Vim 或 VSCode),修改完保存退出即可。

  • 方法B(快捷):如果你只想快速改个文案,可以直接使用一行命令:

    git commit --amend -m "这里填写你新的提交信息"
    
    1

2. 修改提交的文件或代码内容 如果你发现上次提交漏了文件,或者代码有笔误:

  • 第一步:正常修改你的代码,然后使用 git add . 将修改后的文件重新加入暂存区。
  • 第二步:执行 git commit --amend(可以加 --no-edit 保持原提交信息不变)。Git 会将暂存区的新内容合并到上一次的提交中,替换掉旧的提交。

3. 同步到远程 如果该提交之前已经推送过,修改完成后需要强制推送:

git push -f origin <你的分支名>
1

# 情况二:修改历史中的某次提交(交互式变基)

如果你需要修改的不是最后一次,而是更早之前的某次提交,需要使用交互式变基(Interactive Rebase)。

假设你的提交历史是 A -> B -> C -> D,你现在想修改中间的 C 提交:

1. 启动交互式变基 你需要回到目标提交的上一个节点。可以使用 git log 查看提交哈希,找到 C 的上一个提交 B 的哈希值。然后执行:

git rebase -i <B提交的哈希值>
# 或者如果你想修改最近3次提交中的某一次,可以直接写:
git rebase -i HEAD~3
1
2
3

2. 将 pick 改为 edit 执行后会打开一个编辑器,列出从 B 之后的提交列表。找到你想修改的 C 提交那一行,将行首的 pick 改为 edit(或简写 e),然后保存并退出。

3. 修改该次提交 此时 Git 会暂停变基过程,并停留在 C 提交的状态。

  • 修改代码或文件。
  • 执行 git add . 暂存修改。
  • 执行 git commit --amend 修改该次提交的说明或内容。

4. 完成变基并推送 修改完成后,执行以下命令让 Git 继续完成剩下的变基操作:

git rebase --continue
1

最后,同样需要使用 git push -f 强制推送到远程仓库。

# 操作失误,兜底操作

如果在修改过程中改乱了,或者不想改了,可以执行以下命令,一键将本地分支回退到和远程仓库一模一样的状态(注意:这会丢失你本地未推送的所有修改):

git reset --hard origin/dev<你的分支名>

# 示例
git reset --hard origin/dev
1
2
3
4
上次更新: 2026/7/20 20:56:13
git分支管理
git-submodule子模块管理

← git分支管理 git-submodule子模块管理→

Theme by Vdoing | Copyright © 2023-2026 沉梦听雨 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式