Git及其基本操作(个人用)

Git基本操作(超详细) Git基本操作:创建Git本地仓库、Git配置、认识工作区暂存区版本库、添加修改文件、版本回退、撤销修改、删除文件 阅读详情

0、快速上手

公司开发流程

最好在git merge前再pull一下

        你刚加入实习公司的 Gitee 仓库,本质上就是公司在 Gitee 平台上搭建的远程 Git 仓库,是团队存放项目代码、进行协作开发的核心载体,和我们之前聊的 “远程仓库” 是同一个概念,只是它归公司所有、用于实际的业务开发。

先搞懂:公司的 Gitee 仓库到底是什么?

可以把它理解为:

  • 团队的 “云端代码共享盘”:所有团队成员的代码最终都会同步到这个仓库,它是项目代码的 “权威版本”;
  • 带版本管理的 “代码数据库”:不仅存代码,还通过 Git 记录了每一次代码修改(谁改的、改了什么、什么时候改的),能追溯历史、回滚错误修改;
  • 协作的 “核心枢纽”:你作为实习生,需要从这里拉取最新代码、把自己写的代码推上去,还能通过仓库的功能(如 PR/MR、Issues)和同事沟通开发问题。

公司 Gitee 仓库的核心特点(和个人仓库的区别)

维度公司 Gitee 仓库个人 Gitee 仓库
归属 / 权限归公司 / 团队所有,有严格的权限控制(比如你可能只有 “读取 + 提交” 权限,管理员有 “删除 / 设置” 权限)归个人所有,你拥有全部权限
用途存放公司业务项目代码,用于团队协作开发、上线部署存放个人学习 / 练习代码,或个人项目
规范要求有严格的提交规范、分支规范(比如主分支保护,不能直接推代码)、代码审核流程无强制规范,自己怎么方便怎么来
数据安全重要业务代码,通常要求定期备份,禁止泄露个人代码,安全性要求低

这是你接下来最常用的操作,记好这几步:核心操作是 “克隆→拉取→开发提交→推送”

  1. 克隆仓库到本地(首次操作):先从 Gitee 仓库页面复制仓库地址(HTTPS 或 SSH 地址),然后在本地执行:

    git clone 仓库地址
    # 例:git clone https://gitee.com/公司组织名/项目名.git
    

    执行后,本地会生成和远程仓库一致的代码文件夹,这就是你的 “本地开发副本”。

  2. 拉取最新代码(每天开发前必做):因为其他同事可能已经提交了新代码,你需要先同步到本地,避免冲突:

    git pull
    

          注意:绝对不要在本地有未提交修改时直接执行 git pull,正确做法是先 “暂存” 或 “提交” 本地修改,再拉取远程代码,最后处理可能的冲突。

  3. 本地开发并提交:写代码后,把修改提交到本地仓库(这一步只改本地,别人看不到):

    git add .  # 把所有修改的文件加入暂存
    git commit -m "【修复】用户登录按钮样式问题"  # 按公司规范写提交说明
    
  4. 推送代码到远程仓库(完成开发后):把本地的提交推到公司 Gitee 仓库,让团队看到你的修改:

    git push

一、查看 Git 版本

git -v
# 或者更规范的写法(效果完全一致)
git --version

二、修改配置(比如改用户名 / 邮箱、改默认分支名)

# 修改全局用户名(--global 表示全局生效,不加则仅当前仓库生效)
git config --global user.name "新用户名"

# 修改全局邮箱
git config --global user.email "新邮箱@xxx.com"

# 修改默认分支名为 main(现在更推荐用 main 而非 master)
git config --global init.defaultbranch main

若想查看某一项具体配置,可执行:

git config user.name  # 仅查看用户名
git config user.email # 仅查看邮箱

要检查已有的配置信息,可以使用 git config --list 命令

三、创建新仓库:初始化

在你指定的文件夹里创建一个新的 Git 仓库,让 Git 开始追踪这个文件夹里的所有文件变化,是使用 Git 管理项目的第一步。

核心作用:将普通文件夹转换为 Git 仓库,生成 .git 目录来存储版本控制的所有数据;

git init 仓库名

你可以把这个过程想象成:

  • 你有一个空的文件夹(比如存放你的代码、文档),原本它只是一个普通文件夹,没有任何版本管理能力;
  • 执行 git init 后,Git 会在这个文件夹里悄悄创建一个名为 .git 的隐藏文件夹(这是 Git 的核心目录);
  • 这个 .git 文件夹就像一个 “账本”,专门记录你后续对文件夹里文件的所有修改(比如新增、删除、修改内容),从此这个文件夹就变成了 “Git 仓库”,可以用 Git 进行版本控制了。

git init 的使用方法:

# 第一步:先进入你想作为仓库的文件夹(比如你的项目文件夹)
cd C:\Users\PC\Desktop\我的项目
# 第二步:执行初始化命令
git init

执行成功后,终端会提示:Initialized empty Git repository in C:/Users/PC/Desktop/我的项目/.git/,说明仓库创建成功。

初始化后的基本操作

1、初始化仓库后,还需要把文件 “交给” Git 管理,举个简单例子:

# 1. 在项目文件夹里新建一个文件(比如 readme.txt)后,先告诉 Git 要追踪这个文件
git add readme.txt

# 2. 把文件的当前状态“保存”到 Git 账本里(这就是一次提交)
git commit -m "第一次提交:添加readme文件"

2、本地仓库和远程 Gitee 仓库建立连接

# 语法:git remote add 远程别名 远程仓库地址
# 推荐用默认别名 origin(所有 Git 项目通用,避免拼写错误)
git remote add origin https://gitee.com/..../.git

验证远程仓库是否添加成功

git remote -v

        虽然你已经添加了远程仓库 origin,但本地 master 分支还没和远程 origin/master 分支建立 “上游关联”(Git 不知道该把本地 master 推送到远程 origin 的哪个分支)。

你只需要执行这行命令:(前提是已经add和commit了)

git push --set-upstream origin master

# 简写形式(效果完全一样,更常用):
git push -u origin master

三、克隆(clone):克隆远程仓库到本地(首次)

如果你想从远程服务器克隆下来一个仓库,那你需要使用到git clone命令,比如如果我想克隆Gitee上的一个开源框架Sa-Token的仓库 其url为 https://gitee.com/dromara/sa-token.git。那么我们可以这样使用

git clone https://gitee.com/dromara/sa-token.git

四、本地开发、提交

git add . → git commit -m "修改说明"

第一步:git add .

  • 命令含义:add 是 “添加” 的意思,. 代表当前目录下所有有修改的文件(包括新增、修改、删除的文件);
  • 核心作用:把工作区中所有修改的文件,提交到暂存区(标记为 “准备提交”);
  • 新手注意:
    1. 只写 git add 会报错,必须指定要添加的文件(. 是快捷方式);
    2. 如果只想提交单个文件(比如只改了 login.js),可以精准指定:
      git add src/login.js  # 只添加这个文件到暂存区,更规范
      
    3. 执行后没有任何输出,说明操作成功(Git 的 “静默成功” 原则)。

第二步:git commit -m "修改说明"

  • 命令含义:commit 是 “提交” 的意思,-m 是 message 的缩写(指定提交信息),引号里的内容是对这次修改的说明;
  • 核心作用:把暂存区里的所有修改,正式保存到本地仓库,生成一个唯一的版本记录(有专属的哈希值,比如 a8f579c);
  • 新手注意:
    1. 必须写 -m 和提交信息,否则会弹出编辑器(新手容易操作失误);
    2. 提交信息要清晰、规范(公司会有要求),比如:
      ✅ 正确:git commit -m "【修复】登录模块:解决验证码过期不提示的问题"
      ❌ 错误:git commit -m "改了点东西"(别人看不懂,后续自己也忘);
    3. 执行成功后,终端会输出类似内容(表示提交成功):
      [feature/login 8a7b6c9] 【修复】登录模块:解决验证码过期不提示的问题
       1 file changed, 3 insertions(+), 1 deletion(-)
      
      解释:8a7b6c9 是这次提交的版本号,1 file changed 表示改了 1 个文件,新增 3 行、删除 1 行。

五、git push:推送本地提交到远程的同步命令

它的本质是:将本地仓库中已提交的版本记录,上传到远程仓库对应的分支上,让团队成员能看到你的修改,也能让你的代码有云端备份。

举个新手友好的使用例子(假设你已经关联了远程仓库):

# 推送本地 master 分支到远程仓库的 origin 主机(origin 是远程仓库的默认别名)
git push origin master

# 如果你想推送当前分支,且本地分支和远程分支名称一致,可简化为
git push

拉取最新代码(每天开发前必做):

六、git pull:拉取最新代码(每天开发前必做)

因为其他同事可能已经提交了新代码,你需要先同步到本地,避免冲突

git pull <远程主机名> <远程分支名>:<本地分支名>

git pull 不是单一操作,而是两个命令的 “组合拳”:

        git pull = git fetch + git merge

  • git fetch:仅从远程仓库下载最新的代码版本信息(不会修改你本地的工作代码);
  • git merge:把下载的远程最新代码,合并到你当前的本地分支。

用通俗的话讲:git fetch 是 “看看远程有什么新代码”,git merge 是 “把新代码合并到我本地”,git pull 直接把这两步做完。

一、git pull 的基础用法(新手必掌握)

1. 最基础用法(拉取当前分支的远程最新代码)
# 先进入你的项目目录(比如公司项目在桌面)
cd C:\Users\PC\Desktop\公司项目
# 拉取远程最新代码
git pull

执行成功后,终端会输出类似内容:

Already up to date.  # 表示本地已经是最新,无需合并
# 或
Updating 8a7b6c9..f3d2e14  # 表示拉取并合并了新代码,版本从8a7b6c9更新到f3d2e14
 Fast-forward
 src/login.js | 3 +++
 1 file changed, 3 insertions(+)
2. 精准指定远程和分支(进阶,避免拉错)

如果本地有多个远程仓库 / 分支,可明确指定:

# 拉取 origin 远程仓库的 main 分支到本地当前分支
git pull origin main
  • origin:Git 给远程仓库的默认别名(克隆仓库时自动创建);
  • main:远程仓库的主分支(也可能是 master,看公司仓库配置)。

二、新手必避的坑(核心注意事项)

1. ❌ 绝对不要在本地有未提交修改时直接 git pull

        这是最容易出问题的场景!如果本地有没提交的代码,直接拉取可能导致:

  • 代码冲突混乱;
  • 本地修改被覆盖(前面对话中重点提过)。

✅ 正确做法(保留本地修改):

# 1. 暂存本地修改
git stash
# 2. 拉取远程最新代码
git pull
# 3. 恢复本地修改(有冲突则手动解决)
git stash pop
2. ✅ 拉取前先确认当前分支

        避免拉错分支导致代码混乱,先执行:

git branch  # 查看当前分支(带*号的是当前分支)

示例输出(* 号表示当前在 feature/login 分支,无 * 号:只是本地存在的分支,当前未使用。):

  main
* feature/login
3. 🚨 遇到合并冲突怎么办?

        如果你的本地修改和远程代码冲突(比如都改了 login.js 的同一行),git pull后会提示:

Auto-merging src/login.js
CONFLICT (content): Merge conflict in src/login.js
Automatic merge failed; fix conflicts and then commit the result.

解决步骤:

  1. 打开冲突文件(如 src/login.js),会看到 Git 标记的冲突区域:
    <<<<<<< HEAD  // 你本地的代码
    const verifyCode = "本地验证码逻辑";
    =======  // 远程拉取的代码(同事改的)
    const verifyCode = "远程最新验证码逻辑";
    >>>>>>> f3d2e14  // 远程版本号
    
  2. 手动修改冲突内容(和同事确认保留哪版,或合并);
  3. 保存文件后,执行以下命令标记冲突已解决:
    git add src/login.js  # 标记冲突文件已处理
    git commit -m "【合并】拉取远程代码:解决登录验证码逻辑冲突"

六、git分支 ( branch )

先通俗理解:分支是什么?

可以把 Git 分支想象成 “代码的平行宇宙”:

  • 主分支(main)是 “主线宇宙”:存放经过测试、可以上线的稳定代码,是团队代码的 “最终版本”;
  • 功能分支(feature/login)是 “支线宇宙”:你在这个分支里开发登录功能,修改代码不会影响主线宇宙的稳定代码,开发完成后再把支线合并回主线。

  git branch 是git命令中的一个分支管理命令,用于列出、创建、重命名、删除等分支操作,它的主要用法,我进行了一个罗列:

命令作用实战场景
git branch查看本地所有分支(当前分支前标 *)确认自己在哪个分支、项目有哪些分支
git branch -r查看远程所有分支同步远程分支信息,确认团队新增的分支
git branch -a查看本地 + 远程所有分支全面了解分支全貌
git branch <分支名>创建本地分支(不会切换)基于主分支创建开发 / 修复分支
git checkout -b <分支名>创建并切换到新分支(常用)新建分支后直接开始开发
git branch -d <分支名>删除本地已合并的分支功能开发完成后清理无用分支
git branch -D <分支名>强制删除本地未合并的分支废弃某个未完成的功能分支
git branch -m <旧名> <新名>重命名本地分支分支名写错 / 规范调整时使用
git push origin <分支名>将本地分支推到远程让团队成员看到你的开发分支
git push origin --delete <分支名>删除远程分支功能上线后清理远程无用分支
常用:创建新分支(基于当前分支)

        “基于当前分支创建新分支” 是 Git 分支操作里的核心概念,简单来说:新创建的分支会完全复制你 “当前所在分支” 的所有代码、提交记录、文件状态 —— 相当于给当前分支的代码拍了一张 “快照”,新分支就是从这张快照开始的。

用通俗的例子理解:

    假设你现在在 main 分支(当前分支),这个分支里有:

  • 登录页面 login.html(已完成)
  • 首页 index.html(已完成)
  • 没有支付相关文件

    此时执行 git branch feature/pay 创建新分支:

  • 新分支 feature/pay 会100% 复制 main 分支的所有内容(login.html、index.html 都在,且内容和 main 完全一致);
  • 你切换到 feature/pay 后,新增 pay.html、修改代码,这些操作只会影响 feature/pay 分支,不会动 main 分支的代码;
  • 而如果有人修改了 main 分支的 login.html,你的 feature/pay 分支里的 login.html 还是原来的版本(除非你主动合并 main 的修改)。
  • git branch feature/pay作用:创建名为 feature/pay 的新分支,新分支会完全复制当前分支的所有代码;
    新手注意:
    • git branch 创建后不会自动切换到新分支,仍停留在原分支;
    • 推荐先切换到 main 分支、拉取最新代码,再创建功能分支(保证新分支基于最新稳定代码):
      git checkout main  # 切换到main
      git pull           # 拉取最新
      git branch feature/login  # 创建登录分支

七. 检出(checkout)

git checkout 命令,它是 Git 中切换分支、恢复文件的核心命令,简单来说,git checkout 主要有两大核心用途:

        一是切换到已存在的分支(比如从 main 切到 feature/login),二是恢复工作区的文件到指定版本(比如撤销本地未提交的修改)。

一、git checkout 的核心用法(新手必掌握)

用法 1:切换已存在的分支(最常用)

这是你作为实习生每天都会用到的场景,用来在不同分支间切换工作环境。

# 语法:git checkout 分支名
git checkout main  # 切换到 main 主分支
git checkout feature/login  # 切换到登录功能分支
  • 执行成功提示:Switched to branch 'main'(表示已切换到 main 分支);
  • 新手注意:
    1. 切换分支前,确保当前分支的修改已提交 / 暂存(否则 Git 会提示 “本地有未提交修改,无法切换”);
    2. 可以用 git branch 查看所有本地分支,确认要切换的分支名是否正确(避免输错)。
用法 2:创建并切换新分支(新手首选,合并操作)

这是之前提到的 git checkout -b,是 “创建分支 + 切换分支” 的快捷命令,也是最推荐的创建分支方式。

# 语法:git checkout -b 新分支名
git checkout -b feature/pay  # 等同于:git branch feature/pay + git checkout feature/pay
  • 执行成功提示:Switched to a new branch 'feature/pay'(表示已创建并切换到新分支);
  • 核心逻辑:基于当前分支创建新分支,并立即切换到新分支(比如当前在 main 分支,新分支就基于 main 最新代码)。
用法 3:恢复工作区文件(撤销本地未提交的修改)

当你本地改乱了文件,想放弃修改、恢复到最近一次提交的版本时用这个用法。

# 语法1:恢复单个文件
git checkout -- src/login.js  # 恢复 login.js 到最近一次提交的状态,放弃所有本地修改
# 语法2:恢复当前目录下所有文件(谨慎!)
git checkout .
  • ⚠️ 重要提醒:这个操作会永久删除文件的本地未提交修改,执行前一定要确认这些修改确实没用了;
  • 适用场景:比如不小心改乱了代码,想回到干净的状态,或本地修改和远程冲突想直接放弃。
用法 4:切换到远程分支(拉取同事的分支到本地)

如果同事创建了 feature/order 远程分支,你想在本地开发这个分支的功能,需要先切换到远程分支:

# 语法:git checkout -b 本地分支名 origin/远程分支名
git checkout -b feature/order origin/feature/order
  • 作用:把远程仓库的 feature/order 分支拉到本地,创建同名本地分支并切换过去;
  • 前提:先执行 git fetch 拉取远程分支信息(否则 Git 找不到远程分支)。

二、新手常见问题 & 解决方案

问题 1:切换分支提示 “本地有未提交修改”
error: Your local changes to the following files would be overwritten by checkout:
        src/login.js
Please commit your changes or stash them before you switch branches.
  • 原因:当前分支有未提交的修改,切换分支会覆盖这些修改,Git 做了保护;
  • 解决:
    git stash  # 暂存修改(想保留的话)
    # 或 git checkout .  # 放弃修改(确认没用的话)
    git checkout main  # 再切换分支
    
问题 2:恢复文件后发现改错了,想找回修改
  • 情况 1:修改仅在工作区(未执行 git add):恢复后无法直接找回(Git 未追踪),只能靠编辑器的历史记录(比如 VS Code 的 “撤销”);
  • 情况 2:修改已暂存(执行过 git add):可以用 git reset HEAD 文件名 把暂存的修改放回工作区,再恢复。
问题 3:切换分支后代码没变化?
  • 原因:两个分支的代码当前版本一致(比如刚创建的 feature/login 分支和 main 分支);
  • 验证:执行 git log 查看提交记录,确认两个分支的最新提交是同一个版本。

八、git merge

  git merge 的作用是把一个分支的代码修改合并到当前分支中 —— 比如你在 feature/login 分支开发完登录功能后,用 git merge feature/login 就能把登录功能合并到 main 主分支,让主分支包含你的新功能。

一、git merge 的核心逻辑(新手先懂这个)

合并的本质是:Git 对比两个分支的代码差异,把目标分支的修改 “整合” 到当前分支,过程分两种情况,用通俗的例子讲清楚:

假设你有两个分支:

  • main(主分支,当前分支):包含首页、商品列表代码;
  • feature/login(目标分支):基于 main 创建,新增了登录页面代码。
情况 1:快速合并(最理想)

如果 main 分支在你创建 feature/login 后没有任何修改,执行:

git checkout main  # 切换到主分支(当前分支)
git merge feature/login  # 合并登录分支到主分支

Git 会直接把 main 分支的 “指针” 移到 feature/login 的最新版本,没有任何冲突,这就是你之前 git pull 时看到的 Fast-forward,是最简单的合并方式。

情况 2:三方合并(需要处理冲突)

如果 main 分支在你开发 login 分支时,同事改了首页代码,此时合并会触发 “三方合并”:

  • Git 会找两个分支的 “共同祖先”(创建 login 分支时的版本);
  • 对比 main 和祖先的差异、login 和祖先的差异;
  • 自动合并无冲突的部分,有冲突的部分会标记出来,让你手动解决。

git merge 的基础用法

合并指定分支到当前分支(核心用法)
# 步骤1:切换到要接收合并的分支(比如 main 主分支)
git checkout main

# 步骤2:确保当前分支是最新的(先拉取远程代码)
git pull

# 步骤3:合并目标分支(比如 feature/login)到当前分支
git merge feature/login

二、新手必避的合并坑

1. ❌ 直接在 main 分支合并未测试的功能分支
  • 问题:可能把有 bug 的代码合并到主分支,导致主分支代码不稳定;
  • 解决:先在功能分支自测通过,再提 MR/PR(Gitee 上的合并请求),经审核后再合并。
2. ❌ 合并前不拉取最新代码
  • 问题:合并的是旧版本的主分支,导致后续拉取又出现冲突;
  • 解决:合并前务必执行 git checkout main → git pull,保证主分支是最新的。
3. ❌ 合并冲突后直接放弃(用 git merge --abort 需谨慎)
  • 如果合并中遇到冲突,想放弃合并,可执行:
    git merge --abort  # 撤销合并,回到合并前的状态
    
  • 注意:只有还没执行 git commit 时,--abort 才有效;如果已经 commit 了,需要用 git reset 回滚。

九、常见冲突

1、版本低

2

如果远程仓库的初始代码为a,现在有一个程序员1把a拉取到自己的本地仓库,有一个程序员2把a拉取到自己的本地仓库,1修改a为b,并提交到远程仓库,2修改a为c,再拉取远程仓库,会发生什么

先梳理整个时间线(便于理解)

阶段远程仓库程序员 1 本地程序员 2 本地
初始a(版本 1)a(版本 1)a(版本 1)
步骤 1-修改为 b → 提交 → 推送到远程-
步骤 2b(版本 2)-修改为 c(基于版本 1)
步骤 3--执行 git pull(关键操作)

程序员 2 执行 git pull 后会发生什么?

  git pull 本质是 git fetch(拉取远程最新代码) + git merge(合并到本地分支),所以核心是合并阶段出现「合并冲突」,具体现象分两种情况:

情况 1:1 和 2 修改了「同一个文件的同一部分」(核心冲突场景)

这是最常见的情况,Git 无法自动合并,会触发「手动解决冲突」流程,具体表现:

  1. 拉取过程中断:终端 / IDE 会提示 Automatic merge failed; fix conflicts and then commit the result(自动合并失败,需修复冲突后提交);
  2. 文件被标记为冲突状态:执行 git status 会看到文件显示为 both modified(双方都修改了);
  3. 冲突文件被标记特殊符号:打开冲突文件,会看到 Git 插入的冲突标记,格式如下:

    plaintext

    <<<<<<< HEAD  # 程序员2本地修改的内容(c)
    这是程序员2修改的代码(c)
    =======       # 分隔符:上是本地,下是远程
    这是程序员1修改的代码(b)
    >>>>>>> [远程提交ID]  # 远程仓库的最新代码(b)
    
  4. 本地分支处于「合并中」状态:git branch 会看到当前分支后标注 (MERGING),此时无法直接推送代码,必须先解决冲突。
情况 2:1 和 2 修改了「不同文件」或「同一文件的不同部分」(无冲突)

        Git 能自动完成「快进合并」,具体表现:

  1. 拉取过程自动完成:终端提示 Merge made by the 'recursive' strategy(合并成功);
  2. 本地代码自动整合:程序员 2 的本地代码会同时包含 1 的修改(b)和自己的修改(c),形成新的版本(比如 d);
  3. 自动生成合并提交:Git 会自动创建一个「合并提交」,记录这次拉取合并的操作,此时程序员 2 可直接执行 git push 推送整合后的代码到远程。

程序员 2 的正确解决流程(针对情况 1 的冲突场景)

如果出现手动冲突,必须按以下步骤解决,缺一不可:

步骤 1:定位并修复冲突文件
  • 打开标记为 both modified 的文件,找到 <<<<<<</=======/>>>>>>> 标记;
  • 手动删除冲突标记,保留「正确的代码」(比如保留 1 的修改、保留 2 的修改、或整合双方修改);
  • 保存文件(核心:必须删除所有冲突标记,否则 Git 仍判定为冲突)。
步骤 2:标记冲突已解决并提交
# 1. 将修复后的文件添加到暂存区
git add 冲突的文件名  # 比如 git add src/main.java

# 2. 提交合并结果(Git会自动填充合并提交信息,直接确认即可)
git commit  # 或 git commit -m "解决合并冲突:整合1和2的修改"
步骤 3:推送最终代码到远程
git push

此时远程仓库会变成整合后的新版本(比如同时包含 b 和 c 的修改)。

解决方法:撤销git pull

回到执行该命令前的仓库状态(相当于 “撤回” 这次失败的合并)。

执行以下命令,直接终止当前未完成的合并流程,恢复到 pull 前的状态:

git reset --merge
  • 这个命令的作用:完全撤销本次未完成的合并,本地代码、提交记录都会回到执行 git pull --allow-unrelated-histories 之前的样子;
  • 适用场景:冲突太多不想处理、合并操作本身有误,想重新规划合并方式(比如先备份代码再合并)。

补充:什么叫同一个文件的同一部分

“同一个文件的同一部分” 是 Git 判定「合并冲突」的核心依据,简单来说就是:程序员 1 和程序员 2 修改了「同一个文件」里的「相同行 / 相邻行 / 有重叠的代码块」,Git 无法自动判断该保留哪一方的修改,因此触发手动冲突解决。

用具体例子理解(最直观)

假设初始代码文件 demo.js(版本 a)的内容是:

// 初始版本a
function calculatePrice() {
  let price = 100;
  let discount = 0.8;
  return price * discount; // 第5行
}
例子 1:修改了「同一行」(典型的 “同一部分”)
  • 程序员 1 修改:把第 5 行的 0.8 改成 0.7(版本 b):
    return price * 0.7; // 第5行
    
  • 程序员 2 修改:把第 5 行的 0.8 改成 0.9(版本 c):
    return price * 0.9; // 第5行
    

此时 Git 拉取合并时,会判定「同一文件的同一行被双方修改」,触发冲突,冲突标记会出现在第 5 行:

<<<<<<< HEAD
  return price * 0.9; // 程序员2的修改
=======
  return price * 0.7; // 程序员1的修改
>>>>>>> [远程提交ID]
例子 2:修改了「相邻行 / 重叠代码块」(也算 “同一部分”)
  • 程序员 1 修改:在第 3 行新增 let tax = 0.1;(版本 b):
    let price = 100;
    let tax = 0.1; // 新增第3行
    let discount = 0.8;
    return price * discount * (1 + tax); // 修改第5行
    
  • 程序员 2 修改:把第 3 行的 discount 改成 0.9,并删除第 5 行的计算逻辑(版本 c):
    let price = 100;
    let discount = 0.9; // 修改第3行
    return price; // 修改第5行
    

        此时 Git 会判定「第 3-5 行的代码块被双方修改且有重叠」,触发冲突 —— 因为双方的修改范围覆盖了同一个 “代码区域”,Git 无法自动整合。

反例:修改了「同一文件的不同部分」(无冲突)
  • 程序员 1 修改:在函数外新增注释(版本 b):
    // 价格计算函数(程序员1新增)
    function calculatePrice() {
      let price = 100;
      let discount = 0.8;
      return price * discount;
    }
    
  • 程序员 2 修改:在函数内新增日志(版本 c):
    function calculatePrice() {
      let price = 100;
      let discount = 0.8;
      console.log("计算价格:", price); // 程序员2新增
      return price * discount;
    }
    

        此时 Git 能自动合并 —— 双方修改的是文件中完全不重叠的部分(一个在函数外,一个在函数内),Git 会直接把两处修改整合到一起,不会触发冲突。

核心判定逻辑(Git 的视角)

        Git 合并时会对比「三个版本」:

  1. 共同祖先版本:初始的版本 a;
  2. 本地修改版本:程序员 2 的版本 c;
  3. 远程最新版本:程序员 1 的版本 b。

        如果 Git 发现:

  • 版本 b 和版本 c 对「同一行 / 连续多行代码」做了不同修改 → 判定为「同一部分」,触发冲突;
  • 版本 b 和版本 c 修改的是「不重叠的行 / 不同文件」 → 判定为「不同部分」,自动合并。

总结

  1. “同一个文件的同一部分” = 双方修改了同一行、相邻行或重叠的代码块,Git 无法自动判断保留哪一方;
  2. 冲突的本质不是 “改了同一个文件”,而是 “改了文件中重叠的代码区域”;
  3. 只要修改的代码区域完全不重叠,即使是同一个文件,Git 也能自动合并,不会触发冲突。

        简单记:改了同一个文件的 “同一行 / 挨着的行”= 同一部分(冲突);改了同一个文件的 “不挨着的行”= 不同部分(无冲突)。

Git的基本操作 添加用户名 和 email git config --global user.name "Your Name" git config --global user.email "email@example.com"如果没有添加邮箱和用户名, 后面的操作都是不能够顺利进行的。 阅读详情

相关推荐

git (入门)

是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。到。

m0_64863860的博客 672

git的了解和开发安装 以及分支合集

git的了解和开发安装 以及分支合集

qq_38806666的博客 1343

【Git】Git基本操作

什么是 Git、Git的优点以及Git的一些基本操作

不能再留遗憾了的博客 1万+

Git基本使用(很详细)

详细的git教程,一直到连接远程仓库

qq_45796592的博客 15万+

Git 基本操作

Git 的工作就是创建和保存你项目的快照及与之后的快照进行对比。本章将对有关创建与提交你的项目快照的命令作介绍。,后面我们会详细介绍。一个简单的操作步骤:$ git init。

phl805的博客 1071

Git基本操作

前言:Git是一个开源的分布式版本控制系统,简单的介绍下它的基本使用 一、注册安装 首先你要去github上注册一个账号https://github.com/ 然后还要在本地电脑安装下git这个工具,本文用的是windows环境,下载地址https://git-scm.com/ 二、基本操作 这里有两个概念,本地仓库和远程仓库,需要理解下。仓库的意思就是保存项目的地方,本地仓...

老王の博客 2668

Git 的介绍、安装及其基本操作

Git是目前世界上最先进的分布式版本控制系统(没有之一),是程序员在公司工作必须具备的技能。Git是一个免费的、开源的分布式版本控制系统,可以快速高效地处理从小型到大型的各种项目。Git易于学习,占地面积小,性能极快。它具有廉价的本地库,方便的暂存区域和多个工作流分支等特性。其性能优于Subversion、CVS、Perforce和 ClearCase等版本控制工具。版本控制是一种记录文件内容变化,以便将来查阅特定版本修订情况的系统。版本控制最重要的功能是可以记录文件修改历史记录,从而让用户能够查看历史版本

在平淡的日子里寻找存在的价值 4455

git的基本操作 + 分支管理

关于Git的本地版本库已经全部完结了,主要是对分支的各种操作。

adcxhw的博客 1911

Git基本操作命令

关于git分支功能是Git强大的功能之一,可以让多个开发人员协作并行工作,开发新功能、修改bug,并最终汇集到主分支上。git revert命令创建一个新的提交,用来撤销指定的提交,它不会改变提交历史,适用于已经推送到远程仓库的提交。附注标签存储了创建的名字、Email等信息,附注更为正式,适用于需要额外元数据的场景。Git提供了多种方法来恢复和回退到之前的版本,不同的命令适用于不同的场景和需求。git checkout 命令用于切换分支或恢复工作目录中的文件到指定的提交。恢复工作目录中的文件到某个提交。

2401_86968032的博客 1025

STM32 AFIO时钟开启时机与复用功能解析

在嵌入式系统开发中,GPIO复用是微控制器外设配置的核心技术之一。通过复用功能,单个物理引脚可以动态切换不同功能模式,如USART通信或普通IO。其实现原理依赖于芯片内部的时钟树架构和寄存器配置机制。AFIO(Alternate Function I/O)模块作为STM32的特色设计,专门处理引脚重映射、外部中断配置等高级功能。正确理解复用功能与AFIO时钟的关系,能显著提升嵌入式开发效率,避免资源浪费。本文以STM32为例,结合引脚重映射和USART配置等典型场景,详解AFIO时钟的实际应用规范与优化实践

weixin_42389113的博客 579

Vivado工程芯片型号更换全流程:从IP更新到生成新bit文件(避坑指南)

本文详细介绍了Vivado工程中更换芯片型号的全流程,包括IP更新、约束文件适配和生成新bit文件的关键步骤。特别针对FPGA开发中常见的兼容性问题提供避坑指南,帮助开发者高效完成芯片迁移,确保设计稳定性和性能优化。

weixin_42549451的博客 298

版本控制 git的原理及其基本操作

文章目录一、版本控制1.版本控制的概念2.使用版本控制的原因3.常见的版本控制工具4.集中式和分布式管理工具的概念和区别5.总结二、git的原理1.git的发源2.Git的原理三、git基本操作1.下载安装2.创建目录 在此目录内执行 init 初始化仓库3.配置个人信息4.git提交一个版本的操作5.git的一些基本操作6.分支操作四、常用git命令图示: 一、版本控制 1.版本控制的概念 ...

langdei的博客 878

Scratch离线版部署指南:解决资源缺失与页面显示异常问题

本文提供了一份详尽的Scratch离线版部署指南,旨在解决网络依赖导致的资源缺失与页面显示异常问题。通过从基础文件获取、自动化资源抓取到生产环境部署的完整流程,帮助教育工作者和开发者在无网络环境下搭建功能完整的本地Scratch编辑器,确保编程教学的顺利进行。

wine的专栏 1263

【Git】git的基本操作

本文主要介绍了常用工具git的基本使用,包括安装,命令行使用,以及如何在idea项目中关联git,并进行拉取,推送,克隆等操作

ASL2915的博客 1175

Lm317电压源芯片制作电流源

还在找电流源芯片么?如何使用电压源芯片快速搭建电流源。

Ekko的博客 1万+

小梅哥Xilinx FPGA学习笔记11——亚稳态

亚稳态就是D触发器输入信号在其数据窗口期内发生变化,导致D触发器的输出进入一段时间的不稳定状态,有可能发生振荡,并最终随机稳定在高电平或者低电平。

m0_51430584的博客 631

使用Git 的几种情况的回退方式及其基本操作

基本流程 1. 修改了文件但未add到暂存区 git restore code.txt # 或者是 git checkout -- code.txt 2. 文件add 到了暂存区 git resotre --staged code.txt 可以撤回到第一步 3. 在暂存区内修改了文件 git restore code.txt # 或者是 git checkout -- code.txt 可以撤回到第二步 4. commit 到了版本库中 # 回退到上一个版本 git reset --hard HEA

hua_you_qiang的博客 1610

ESP32-S3模组上跑通esp32-camera(32)

ESP32-S3模组上跑通esp32-camera(32)

phmatthaus的专栏 772

Git必须掌握的基本操作

包含Git完整基本操作,并提供进阶学习的资料。 1-基本操作 1-创建仓库 2-提交修改 3-diff比较不同 4-别名设置简化log 2-Git操作区域 3-Git回退 1-回退版本 2-操作历史 4-文件操作 5-文件暂存 6-远程仓库 7-分支管理 8-Tag 9-进阶学习

feather(猎羽) 1万+

大唐杯历届省赛押题训练(6)

考试-TD-LTE无线网络设备介绍-TD-LTE网络架构一、单选题1TD-LTE的接入网E-UTRAN由下列哪些网元组成( )。0分/1分A、RNCB、BTSC、eNode BD、Node B提交答案:B正确答案:C考点TD-LTE网络架构解析暂无试题解析二、多选题1关于LTE网络整体结构,哪些说法是正确的( )0分/2分A、E-UTRAN用E-NodeB替代原有的RNC-NodeB结构B、E-NodeB间的接口为S1接口C、各网络节点之间的接口使用IP传输。

nimo观察者 638

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【Git】:Git的基本操作

修改文件,版本回退,撤销修改,删除文件

m0_73790767的博客 935

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Git 创建仓库、监控工作区、提交缓存及其基本操作

注意:以下操作均在Git-Bash中完成! 创建仓库 1、创建仓库(仓库名称不能是中文),命令: git init 仓库名称 注意:仓库名称不能是中文 2、监控工作区的状态树,使用它会把工作时的所有变化提交到暂存区,包括文件内容修改(modified)以及新文件(new),但不包括被删除的文件。 git add . 会监控工作区的状态树,使用它会把工作时的所有变化提交到暂存...

Hern(宋兆恒) 1026

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Git本地版本控制的基本操作命令及其用法

Git仓库分为工作区和版本库两个大块,版本库中又分为stage(缓存区)和 master(分支区)。

2301_80633790的博客 677

Git的安装以及基本操作

1、Git是什么?Git是目前世界上最先进的分布式版本控制系统(没有之一)。可以有效、高速地处理从很小到非常大的项目版本管理。Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开源码的版本控制软件。Torvalds 开始着手开发 Git 是为了作为一种过渡方案来替代 BitK2、Git与SVN的主要区别。

2301_80224556的博客 1358
上一篇: 从 0 到 1 吃透 YOLO:推理、训练、验证全解析
下一篇: Day1-环境搭建
Swilderrr
博客等级 码龄4年 40粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值