目录

1.了解Git基本概念

2.Git的配置和下载

3.概述Git工作流程

4.Git常用命令

5.ideal的Git操作

    一. Git基本概念

    1.集中式版本控制工具(CVCS)

    将文件的版本都存放在中央服务器里,每个人都要连接到服务器获取和提交文件的版本.这类工具的典型代表有 SVN 和 CVS。

    SVN和CVS的区别
    (1)、版本编号方面

    在SVN中,是对目录进行版本控制。而在CVS中则相反,是对文件进行版本控制.

    例:目录下有a.txt、b.txt、c.txt文件

    SVN:  修改a.txt和c.txt.提交后目录版本会从r1变成r2

    CVS : 修改a.txt和c.txt.文件版本a.txt(1.0)->a.txt(1.1), b.txt(1.0)->b.txt(1.0), c.txt(1.0)->c.txt(1.1)

    (2)、目录的版本控制

    由于CVS只能对文件进行版本控制,不能对目录进行版本控制,

    当执行move(移动文件),rename(重命名文件),copy(拷贝文件)操作时会失去记录历史版本的信息.

    例:reaname  doc/a.txt   doc/b.txt. 

    CVS会认为:

    1.删除a.txt(删除相关的历史版本)   

    2.创建全新的b.txt(版本重1.0开始)

    结果: b.txt与a.txt无关,b.txt无法回退为a.txt文件和历史版本.

    (3)、原子性提交

    CVS 的非原子性提交(中断不会回滚)

    SVN的原则性提交(若全部成功 → 整个提交生效,生成新的全局版本号。若任一失败(如网络中断)→ 自动回滚:)

    (4)、变更集概念的支持
    场景 CVS(无变更集) SVN(有变更集)
    标识方式 多个独立文件版本号(如 1.5、1.3、1.2) 单个全局版本号(如 r108)
    逻辑关联性 无关联,零散文件修改 强关联,绑定为 “修复优惠券 BUG” 的整体
    团队沟通成本 高(需额外说明修改目的) 低(版本号直接关联逻辑意图)
    操作效率 低(回滚 / 追溯需逐个处理文件) 高(一次操作覆盖所有关联文件)
    (5)、差异化的二进制文件处理
    类型 CVS SVN
    文本文件 差异存储和差异传输 差异存储和差异传输
    二进制文件

    冗余存储和低效传输

    差异存储和差异传输

    假设有一个 5MB 的图片文件 logo.png,第一次提交到版本库:

    CVS 和 SVN 都会存储完整的 5MB 文件(因为是初始版本,没有上一版本可比较)。

    第二次你修改了图片的颜色(差异仅 0.5MB)并提交:

    CVS:会再存储一个完整的 5MB 新文件,版本库中该文件总占用空间变为 5MB + 5MB = 10MB。

    SVN:只存储 0.5MB 的差异部分,版本库中该文件总占用空间约为 5MB + 0.5MB = 5.5MB。

    当他人需要更新这个图片时:

    CVS:会传输整个 5MB 的新文件。

    SVN:只传输 0.5MB 的差异,他人的客户端会自动用旧版本 + 差异还原出完整的新版本。

    集中式版本控制工具问题

    1.需要与服务器联网通讯,无法离线操作.2.一旦中央服务器数据丢失,之前提交的数据就彻底丢失.

    2. 分布式版本控制工具(DVCS)

    分布式版本控制工具的工作模式与集中式不同,每个开发者的本地环境都是一个完整的版本库,包含了项目的所有历史记录和分支。Git 是分布式版本控制工具的典型代表。

    GIT与SVN的区别:
    (1). 存储模型:分布式 vs 集中式
    Git(分布式) SVN(集中式)
    每个开发者本地拥有完整的版本库副本,包括所有历史记录和分支。操作(如提交、查看历史)通常在本地完成,无需联网。 版本库集中存储在服务器,客户端只能通过网络访问。所有操作(如提交、更新)必须与服务器交互。
    优势:离线工作、分支管理高效、灾难恢复能力强(任意副本可还原整个项目)。 劣势:依赖网络,断网时无法提交或查看历史;服务器故障可能导致数据丢失。

    (2). 分支与合并:轻量级 vs 重量级

    Git

    分支创建成本极低:创建分支相当于创建一个指针,几乎瞬间完成。

    分支操作高效:本地分支切换、合并无需网络,适合频繁创建和销毁临时分支。

    SVN

    分支创建成本高:分支本质是目录复制,涉及大量文件操作,耗时较长。

    分支操作繁琐:每次分支切换需从服务器拉取数据,合并时易产生冲突且难以解决。

    (3). 提交与版本号

    Git

    提交是本地操作:提交仅记录在本地仓库,不影响远程服务器。

    版本号是全局哈希值:如 a1b2c3d4,基于提交内容计算,全球唯一 

    SVN

    提交是原子性的服务器操作:所有修改必须一次性提交到服务器,失败则回滚。

    版本号是全局递增数字:如 r100,由服务器分配。

    (4). 冲突处理
    环节 Git 的处理方式 SVN 的处理方式
    冲突发现时机 推送前拉取时发现(本地合并阶段) 更新服务器内容时发现(同步阶段)
    辅助工具 内置 git mergetool 等可视化工具 无内置工具,依赖第三方或手动编辑
    冲突标记 简洁的 <<<<<<< HEAD 等标记 类似标记,但额外生成 3 个辅助文件
    解决流程 编辑后直接提交,无需额外标记 “已解决” 必须执行 svn resolved 标记后才能提交
    灵活性 支持 ours/theirs 等合并策略 无策略可选,必须手动处理每个冲突点

    二. Git下载和配置

    Git下载:Git

    Git配置

    解决GitBash乱码问题
    # 打开GitBash执行以下命令
    git config --global core.quotepath false
    vim ${git_home}/etc/bash.bashrc
    # 在文件末尾写入
    export LANG="zh_CN.UTF-8"
    export LC_ALL="zh_CN.UTF-8"
     获取本地仓库
    # 创建新文件夹
    mkdir git-test
    # 获取本地仓库
    cd git-test
    git init
    为命令取别名
    # 打开~/.bash_profile文件在末尾加入以下内容
    alias git-log='git log --pretty=oneline --all --graph --abbrev-commit'
    # 查看隐藏文件
    alias ll='ls -al'
    参数 作用
    --pretty=oneline 将每个提交压缩到一行显示,格式为:<简短哈希值> <提交信息>
    --all 显示所有分支的提交记录(包括本地分支、远程分支),不局限于当前分支。
    --graph 用 ASCII 字符绘制分支合并的图形,直观展示分支演化历史。
    --abbrev-commit 将提交哈希值缩写为简短形式(如 a1b2c3d 而非完整的 40 位哈希)。

    三. Git工作流程

    描述:(1)文件创建和修改时其属性属于工作区;(2)修改后需要add添加到暂存区和commit提交到本地仓库.(3)本地仓库使用push将数据提交到远程仓库;(4)可以使用clone(获得整个仓库数据),fetch(抓取分支但不合并)和pull(拉取分支并合并)获取远程仓库数据形成闭环

    四.Git常用命令

    1、基础操作命令

    命令 作用
    git config --global user.name "用户名" 设置用户身份信息(用户名)
    git config --global user.email "邮箱" 设置用户身份信息(邮箱)
    git init 初始化本地仓库
    git clone <远程地址> 克隆远程仓库到本地
    git status 查看工作区和暂存区的状态
    git add <文件> 将文件修改添加到暂存区
    git add . 将所有修改添加到暂存区
    git commit -m "描述" 将暂存区内容提交到本地仓库
    git commit --amend 修改上一次提交(追加内容或修改提交信息)
    创建初始化本地仓库
    # 创建git-test目录(之后初始化为git本地仓库)
    mkdir git-test
    # 切换到 git-test目录下
    cd git-test/
    # 初始化本地仓库
    git init
    # 查看目录下内容
    ls -al
    

    设置用户信息
    # 设置用户身份信息-用户名
    git config --global user.name '用户名'
    # 设置用户身份信息-用户邮箱
    git config --global user.email '邮箱'
    # 查看全局信息的用户名
    git config --global user.name
    # 查看全局信息的用户邮箱
    git config --global user.email
    # 查看全局信息
    git config --global --list
    # 查看当前仓库配置信息
    git config --local --list
    # 查看(系统 + 全局 + 本地)配置信息
    git config --list
    
    

    创建文件并提交到本地仓库
    (1).创建文件并查看状态
    # 创建文件
    touch file1.txt
    # 查看状态
    git status

    新创建文件file1.txt为未跟踪状态

    (2).跟踪文件(git add .)
    # 跟踪文件
    git add file1.txt
    git add .
    # 查看状态
    git status

    文件file1.txt已经在暂存区,但未提交到本地仓库

    (3).仅删除暂存区文件
    # 删除暂存区单个文件
    git rm --cached file.txt
    # 递归删除文件夹暂存区
    git rm --cached -r .
    # 查看状态
    git status

    (4).提交文件(git commit -m 'update file1.txt')
    # 提交文件
    git commit -m file1.txt
    git commit file1.txt

    (5).修改前一次提交的注解
    # 修改前一次提交的注解
    git commit --amend

    2、分支管理命令

    命令 作用
    git branch 列出本地所有分支
    git branch -r 列出远程分支
    git branch -a 列出所有分支(本地 + 远程)
    git branch <分支名> 创建新分支
    git branch -m old_name new_name 分支重命名
    git checkout <分支名> 切换到指定分支
    git checkout -b <分支名> 创建并切换到新分支
    git merge <分支名> 将指定分支合并到当前分支
    git branch -d <分支名> 删除已合并的分支
    git branch -D <分支名> 强制删除未合并的分支
    git switch <分支名> 切换分支(Git 2.23+ 推荐)
    git switch -c <分支名> 创建并切换分支(Git 2.23+ 推荐)
    创建分支,切换分支,删除分支,查看分支
    # 查看分支
    git branch
    # 创建分支
    git branch dev01
    # 创建并切换到dev01
    git checkout -b dev01
    # 切换分支
    git checkout dev01
    # 删除分支
    git branch -d dev01
    # 强制删除未合并分支
    git branch -D dev01

    合并分支
    (1). 无冲突合并

    main 分支下有:    file1.txt文件,内容:hello world  共一个文件

    dev01 分支下有:  file1.txt文件,内容:hello world    file2.txt文件,内容:123   共两个文件

    将dev01分支下内容合并到main分支下

    git-log命令别名

    alias git-log='git log --pretty=oneline --all --graph --abbrev-commit'

    # 无冲突合并分支
    git merge dev01

    结果:main分支也有两个文件:file1.txt,  file2.txt

    (2). 有冲突合并

    main分支下file1.txt  内容是hello world(c++)

    dev01分支下file1.txt  内容是hello world(python)

    git merge dev01 # 将dev01合并到main分支

    # 修改main分支下的file1.txt
    git checkout main
    vim file1.txt # hello world(c++)
    # 修改dev01分支下的file1.txt
    git checkout dev01
    vim file1.txt # hello world(python)
    # 在main分支下合并
    git checkout main
    git merge dev01
    # 修改合并冲突文件
    vim file1.txt

    把<<<<HEAD    =======    >>>>>dev01冲突标志删去

    保留hello world(c++)或者hello world(python)或者都保留,但要把冲突标志删去

    # 编辑文件,删除冲突标志
    vim file1.txt
    # 跟踪文件
    git add .
    # 提交文件(合并完成)
    git commit -m "main merge dev01"

    未提交的修改文件跟着分支切换
    # 修改文件
    vim file1.txt
    vim file2.txt
    # 直接切换分支
    git checkout main
    git checkout dev01

    线性合并分支

    将当前分支的提交 “复制” 到指定分支(如 main)的末尾,形成一条直线的提交历史。

    git checkout feature
    git rebase main  # 将 feature 的提交移到 main 末尾

    原提交历史:

    main: A → B → C
    feature: A → D → E
    

    执行结果 

    main: A → B → C
    feature: A → B → C → D → E  # 线性排列

    3、历史记录与版本回退

    命令 作用
    git log 查看提交历史
    git log --oneline 单行模式查看提交历史
    git log --graph 图形化查看分支合并历史
    git log -p <文件> 查看文件的修改历史
    git blame <文件> 查看文件每行的最后修改者
    git reset --hard <版本号> 回退到指定版本(工作区内容丢失)
    git reset <版本号> 回退到指定版本(保留工作区修改)
    git revert <提交号> 创建一个新提交,撤销指定提交的修改(用于远程协作时的安全回滚)
    git checkout <版本号> <文件> 恢复文件到指定版本的状态

    git reset <提交>(默认行为,不带选项)
    作用:将当前分支的 HEAD 移动到指定提交,但保留工作区和暂存区的修改

    git reset --hard <提交>
    作用:将当前分支的 HEAD、暂存区和工作区全部强制重置为指定提交的状态,彻底丢弃所有未提交的修改。

    创建file3.txt文件并回退创建前 
    # 创建file3.txt文件并提交到仓库
    touch file3.txt
    git add .
    git commit -m "file3.txt"
    # 查看提交记录
    git log
    git-log
    # 查看文件每行修改者
    git blame <文件名>
    # 回退到创建file3.txt前
    git reset --hard <版本号>
    

    4、Gitee创建远程仓库

    仓库创建

    完成创建

    客户机与仓库密钥连接
    客户机创建密钥
    # ssh密钥生成(一直回车)
    ssh-keygen -t rsa
    # 查看生成的密钥
    cat ~/.ssh/id_rsa.pub

    将密钥填写到Gittee

    在Gitee设置中找到ssh公钥功能,并完成密钥复制

    验证是否能访问gitee
    # 验证是否能访问gitee
    ssh -T git@gitee.com

    5、远程协作命令

    命令 作用
    git remote -v 查看远程仓库信息
    git remote add <名称> <地址> 添加远程仓库
    git fetch <远程名> 从远程获取最新更新(不合并)
    git pull <远程名> <分支名> 从远程获取并合并到当前分支(等价于 fetch + merge
    git push <远程名> <分支名> 将本地分支推送到远程
    git push -u <远程名> <分支名> 推送并关联本地与远程分支(首次推送需使用)
    git push origin --delete <分支名> 删除远程分支
    git pull --rebase 以变基方式拉取(避免不必要的合并提交)

    git remote -v

    显示远程仓库的名称(如 origin)和对应的 URL,分为 fetch 和 push 两个方向。

    git remote -vv

    在 -v 的基础上,额外显示本地分支与远程分支的跟踪关系,以及远程分支的最新提交信息。

    git branch -v

    显示本地分支列表,并附带 最后一次提交的 SHA 和提交信息

    git branch -vv

    在 -v 的基础上,额外显示本地分支与远程分支的跟踪关系,以及状态提示(如 [behind 1] 表示落后远程 1 个提交)。

    连接远程仓库(实现仓库托管)
    复制远程仓库的ssh地址

     绑定远程仓库
    # 添加远程仓库
    git remote add <名称> <地址>
    # 查看远程仓库信息
    git remote -v
    # 查看有什么远程仓库
    git remote
    # 详细查看远程仓库信息
    git remote show origin

    推送本地分支到远程仓库
    # 将本地分支main推送到远程仓库分支main
    git push remote origin main:main
    # 冲突是强制推送到远程仓库
    git push -f origin main:main
    # 推送到远程仓库时与远程仓库分支关联,后续可直接git push推送关联分支
    git push --set-upstream origin main:main 
    # 或者
    git push -u origin main:main(当远程分支名相同时,可直接写为main)
    # 本地仓库分支以关联远程分支,直接推送
    git push
    # 查看本地仓库分支与远程仓库关联
    git branch -vv
    
    推送本地仓库当前分支(假设当前分支为:main)
    git push -u origin main:main
    git push --set-upstream origin main:main
    git push
    
    
    推送其他分支且不切换分支
    # 语法:git push <远程仓库> <本地分支>:<远程分支>
    git push origin dev01 # 将本地 dev01 分支推送到 origin/dev01
    git push --all origin # 推送所有本地分支到远程仓库
    
    # 如果你想推送一个尚未关联远程分支的本地分支,可以使用 -u 选项同时建立关联:
    git push -u origin new-feature # 推送 new-feature 分支并关联到 origin/new-feature
    本地仓库克隆远程仓库
    克隆远程仓库
    # 克隆仓库会自动新建文件夹git clone [ssh地址] [别名]
    git clone git@gitee.com:lan-zebin/today.git

    创建远程仓库其他分支 
    1. 创建远程分支的引用:Git 会在本地仓库中创建指向远程分支的引用,这些引用以 origin/ 为前缀(例如 origin/main 和 origin/dev01),它们代表远程仓库中分支的状态。

    2. 检出默认分支:Git 会自动检出远程仓库的默认分支(通常是 main 或 master),并在本地创建一个同名的跟踪分支(例如 main)。这个本地分支会自动与远程的 origin/main 建立关联。

    3. 不自动创建其他分支:对于远程仓库中的其他分支(如 dev01),Git 不会自动在本地创建对应的分支。这些分支的状态会被记录在 origin/dev01 中,但你需要手动创建本地分支来跟踪它们。

    # 创建其他分支并跟踪的方法
    # 方法一:使用 checkout -b 和 --track
    git checkout -b dev01 --track origin/dev01
    
    # 方法二:简化写法(Git 会自动检测远程分支)
    git checkout -b dev01 origin/dev01
    
    # 方法三:先切换到远程分支,再创建本地分支
    git checkout origin/dev01  # 进入“分离 HEAD”状态
    git switch -c dev01        # 创建并切换到新的本地分支
    抓取远程仓库
    # 获取所有远程分支的更新
    git fetch  
    
    # 只获取特定分支的更新
    git fetch origin main  # 只获取远程的 main 分支
    git fetch origin dev01  # 只获取远程的 dev01 分支
    
    # 查看所有远程分支的最新状态
    git branch -r 
    
    # 查看本地 main 分支与远程 main 的差异
    git log main..origin/main 
    
    # 将更新合并到本地分支
    git merge origin/main 或 git rebase origin/main 

    (1)抓取 (2)查看提交历史 (3)查看本地与远程main分支差异 (4)合并 

    拉取远程仓库

    只拉取远程仓库中与本地已跟踪分支相关的更新,并仅合并当前分支的对应远程分支,并非 “拉取所有更新的分支”。

    # 拉取远程仓库所以分支
    git pull
    # 拉取指定分支
    git pull origin main:main

     当dev01执行git pull时,抓取了,main和dev01分支,但只合并了dev01当前分支

    远程合并冲突

    无冲突:本地未修改 + 远程有新修改 → 快进合并,直接应用远程修改。

    有冲突:本地和远程对同一文件的同一部分有不同修改 → 需要手动解决冲突。

    本地仓库和远程仓库不一致的拉取时冲突

    本地仓库1

     本地仓库2

    本地仓库1修改远程仓库file1.txt文件第三行是hello world(java)

    本地仓库2的file1.txt文件的第三行是hello world(js)

    当本地仓库2从远程仓库拉取时,就会产生冲突,和之前一样需要手动去除file1.txt冲突标准.

    # git push或者git pull发生冲突时
    git pull
    vim file1.txt
    git add .
    git commit -m ""

    五. ideal的Git操作

    1.配置在idea中配置Git路径

    打开idea->点击文件->设置(settings)->版本控制->Git

    将配置Git可执行文件路径

    2.初始化本地仓库

    在idea打开项目,为配置.gitignore文件

    在版本控制中选择创建Git仓库

    选择创建Git仓库的文件目录

    3.项目提交到远程仓库

    创建远程仓库获取ssh地址:git@gitee.com:lan-zebin/ascent-sys.git

    点击main->选择提交

    勾选提交文件->填写备注->点击提交并推送

    填写仓库ssh地址

    4.提交和推送功能入口

    5.指定历史版本分支创建

    6.Pull拉取更新代码

    点击main->选择更新项目

    7.冲突修改

    关闭窗口

    8.手动删除冲突标志

    选择接受您的更改

    然后进行提交操作

    9.切换(签出)分支

    10.合并删除分支

    11.还原提交(版本回退)

    Logo

    魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

    更多推荐