Git入门讲解

Git入门讲解

一、初识Git

1.1 什么是Git

Git是一个分布式的版本控制软件。最初由Linus Torvalds(林纳斯·托瓦兹)创建,旨在管理Linux内核的开发。

它可以跟踪文件的修改历史记录并允许多个人协同开发同一个项目。

  • 版本控制,类似于毕业论文、写文案、视频剪辑等,需要反复修改和保留原历史数据

  • 分布式

    • 文件夹拷贝

    • 本地版本控制

    • 集中式版本控制

    • 分布式版本控制

版本控制专业概念

在软件开发和其他文件管理场景中,版本控制是一种管理文件修改历史的技术。

它允许开发者或团队对文件进行更改,并保留每个版本的历史记录。

分布式版本控制与集中式版本控制的区别

当我们使用传统的集中式版本控制系统(如SVN)时,代码仓库通常位于服务器上,开发者需要从服务器上下载代码并将修改提交到服务器上。这种架构存在一些问题,例如:

  • 单点故障:如果服务器出现故障,所有开发者都无法提交和获取代码。
  • 依赖网络:开发者需要始终连接到网络才能进行版本控制操作。
  • 难以协同:如果多个开发者同时修改了同一个文件,可能会出现冲突,需要手动解决。

为了解决这些问题,Git采用了分布式版本控制的架构。在Git中,每个开发者都有一个本地的代码仓库,可以在本地进行修改和提交,并可以将这些修改推送到远程的代码仓库中,与其他人的修改进行合并。这种分布式的架构带来了以下好处:

  • 去中心化:不再依赖于单个服务器,每个开发者都有自己的完整版本库,可以在本地完全独立地进行版本控制操作。
  • 离线工作:开发者可以在没有网络连接的情况下进行版本控制操作,并可以在连接到网络时将修改推送到远程代码仓库中。
  • 容错性强:即使某个开发者的本地版本库出现故障,其他开发者的版本库仍然可以正常工作。

1.2为什么要做版本控制

要保留之前所有的版本,以便回滚和修改。

1.3 安装git

官方下载地址:https://git-scm.com/downloads

安装教程:Git - 安装 Git (git-scm.com)

下载后一路next安装即可

二、git管理

2.1 如何让git对一个目录进行版本控制

想要让git对一个目录进行版本控制需要以下步骤:

1、进入要管理的文件夹

2、执行初始化命令

git init   //初始化   让git帮助我们管理当前文件夹

3、管理目录下的文件状态

git status  //检测当前目录下文件的状态

注:新增的文件和修改过后的文件都是红色

4、管理指定文件 (红变绿),将文件由工作区变动文件放入暂存区

git add 文件名 -->管理一个文件   
git add . -->将该目录下所有已变动文件放入暂存区

红色:新增的文件/修改了原老文件

绿色: git 已经管理起来

5、个人信息配置:邮箱、用户名【一次即可】

git config --global user.email "your@example.com"
git config --global user.name "Your Name"

6、生成版本

git commit -m '描述信息'

7、查看版本记录

git log    (回滚至之前的版本)
git reflog (回滚至之后的版本)

2.2 Git的三大区域

在这里插入图片描述

  1. 工作区(workspace)

    当前存放代码的目录

  2. 暂存区(staging area)

    存放在 .git 目录下的 index 文件,代码改动提交到本地仓库前暂时存放的区域

  3. 本地仓库(local repository)

    存放本地代码的地方,即本地计算机,计算机损坏可以导致代码消失

  4. 远程仓库(remote repository) --后面介绍

    代码最终的存放区域,本地计算机损坏不会影响远程仓库的代码

2.3 版本回滚

  • 回滚到之前的版本

    git log
    git reset --hard 版本号
    
  • 回滚到之后的版本

    git reflog
    git reset --hard 版本号
    
  • 回滚的三种常见模式及区别

    git reset --hard <版本号>   重置暂存区和工作区到指定版本,彻底放弃之后的提交历史、修改和提交记录。
    git reset --mixed <版本号>  重置暂存区到指定版本,保留工作区的修改。
    git reset --soft <版本号>   仅重置HEAD指针到指定版本,保留暂存区和工作区的修改。
    

2.4 总结

git init
git status
git add <文件名> / git add.
git commit  -m '描述信息'
git log 
git reflog
git reset --hard <版本号>
git checkout 回退修改后的文件到之前状态

三、分支

3.1 什么是分支

在 Git 中,分支(Branch)是指将开发进程分离出来的一个独立线条。

它可以让多个人在同一代码仓库中同时进行不同的工作,每个分支都有自己独立的提交历史和修改内容,不会互相影响。

常见的分支操作包括创建新分支、切换分支、查看分支列表、合并分支等。

3.2 利用分支处理bug和开发新功能

在图中C3版本上线之后,开始C4版本的开发,若此时遇到线上bug,则需要单独创建一个分支来修复bug,修复完成后将bug分支合并回主分支,在新功能开发完成之后,将dev分支合并至master分支即可,但此时dev分支中的代码,是未修复bug的,合并后可能会产生冲突,需要进行手动处理后,最后生成新的版本。
在这里插入图片描述

3.3 分支命令操作

  • 查看分支

    git branch
    
  • 创建分支

    git branch 分支名称
    
  • 切换分支

    git checkout 分支名称
    
  • 分支合并(可能产生冲突)

    git merge 要合并的分支
    //此命令是将要合并的分支合并至当前所在的分支,要先确定好合并的关系。先切换再合并
    //合并过程中可能产生冲突,需要根据冲突信息手动修改冲突部分
    
  • 删除分支

    git branch -d 分支名称
    

3.4 工作流

在这里插入图片描述

四、远程仓库GitHub

当我们在不同地方协同开发时,远程仓库的作用是提供一个集中存储代码的地方,并且可以实现代码的备份、版本管理和共享。团队成员可以通过从远程仓库中拉取代码来获取最新的更新,并将自己的修改推送到远程仓库,实现多人协同开发。

如何使用远程仓库呢?这里以GitHub为例。

首先,需要注册github账号,并创建远程仓库,然后再执行如下命令,将代码上传到github。

在这里插入图片描述

4.1 Git与远程仓库间的基本操作

  • 给远程仓库起别名(本文中的origin即为别名)

    git remote add origin 远程仓库地址
    
  • 向远程推送代码

    git push (-u) origin 分支
    

上述指令中的-u表示将该主机(远程仓库)设置为默认仓库,通过该参数制定后,后面就可以不加参数直接使用git push

  • 克隆远程仓库代码

    git clone 远程仓库地址
    (执行此操作,内部默认已经执行了git remote add origin 远程仓库地址,默认的别名即为origin)
    
  • 从远程仓库拉取代码

    git pull origin 分支
    

克隆和拉取分别针对本地没有该远程仓库中的项目和已经有了项目之后的获取代码的操作

在这里插入图片描述

4.2 利用github实现多地开发同一项目

以在家里和公司开发同一个项目的情景为例

  • 在家中上传代码
1.给远程仓库起别名
    git remote add origin 远程仓库地址
2.向远程推送代码
    git push -u origin 分支
  • 到公司新电脑上第一次获取代码
1.克隆远程仓库代码
    git clone 远程仓库地址 (内部默认已经执行了git remote add origin 远程仓库地址)
  • 在公司进行开发
1.切换到dev分支进行开发
      git checkout dev
2.把master分支合并到dev(仅一次)
      git merge master
3.修改代码
4.提交代码
      git add .
      git commit -m 'xx'
      git push origin dev
  • 回到家中继续写代码
1.切换到dev分支进行开发
    git checkout dev
2.拉代码
    git pull origin dev
3.继续开发
4.提交代码
    git add .
    git commit -m 'xx'
    git push origin dev
  • 开发完毕,需要上线
1.将dev分支合并到master,进行上线
    git checkout master
    git merge dev
    git push origin master
2.把dev分支也推送到远端
    git checkout dev 
    git merge master
    git push origin dev

4.3 合并冲突问题

  • 在公司约妹子忘记提交代码

    1.拉代码
    	git pull origin dev
    2.继续开发
    3.提交代码
    	git add .
    	git commit -m 'xx'
    	
    注︰忘记push了
    
  • 回家继续写代码

    1.拉代码,发现在公司写的代码忘记提交...
    	git pull origin dev
    2.继续开发其他功能
    3.把dev分支也推送到远程
        git add .
        git commit -m 'xx '
        git push origin dev
    
    
  • 到公司继续写代码

    1.拉代码,把晚上在家写的代码拉到本地(有合并、可能产生冲突)
    	git pull origin dev
    	
    2.如果有冲突,手动解决冲突
    
    3.继续开发其他功能
    
    4.把dev分支也推送到远程
    	git add .
    	git commit -m 'xx '
    	git push origin dev
    
    

4.4 其他

git pull origin dev
等价于
git fetch origin dev
git merge origin/dev

4.5 rebase的作用

rebase可以保持提交记录简洁,不分叉。

使用场景示例:

  1. 分支合并: 假设你有一个开发分支feature-A,它基于develop分支,而develop分支已经有了一些新的提交。为了保持你的分支最新,你可以使用以下命令将feature-A分支重新应用到develop分支上:

    Copy Codegit checkout feature-A
    git rebase develop
    
  2. 提交历史整洁: 当你在本地开发过程中频繁进行小的提交时,你可能不希望它们都显示在主分支的提交历史中。你可以使用rebase命令将这些小的提交合并成一个更大的提交,使提交历史更加清晰。例如:

    Copy Codegit checkout feature-B
    git rebase -i HEAD~3
    

    这将打开一个交互式界面,允许你选择要合并、编辑或删除的提交。

需要注意的是,使用rebase命令时应谨慎,并且遵循一些最佳实践。永远不要对已经推送到远程仓库的提交使用rebase,以免破坏协同开发。另外,在进行rebase操作前,最好先备份代码,以防万一出现问题。

4.6 快速解决冲突问题

  1. 安装beyond compare

  2. 在git中配置

    git config --local merge.tool bc3
    git config --local mergetoo1.path '/usr/1oca1/bin/bcomp'
    git config --local mergetoo1.keepBackup false
    
  3. 应用beyond compare 解决冲突

    git mergetool
    

4.7 总结

  • 添加远程连接(别名)

    git remote add origin 地址
    
  • 推送代码

    git push origin dev
    
  • 下载代码

    git clone 地址
    
  • 拉取代码

    git pull origin dev
    等价于
    git fetch origin dev
    git merge origin/dev
    
  • 保持代码提交整洁(变基)

    git rebase 分支
    git rebase -i HEAD~
    
  • 记录图形展示

    git log --gragh --pretty=format:"%h %s"
    

五、多人协同开发

5.1 创建项目&邀请成员

协同开发时,需要所有成员都可以对同一个项目进行操作,需要邀请成员并赋予权限,否则无法开发。

github支持两种创建项目的方式(供多人协同开发)。

1.合作者,将用户添加到仓库合作者中之后,该用户就可以向当前仓库提交代码。

在这里插入图片描述

2.组织,将成员邀请进入组织,组织下可以创建多个仓库,组织成员可以向组织下仓库提交代码。

在这里插入图片描述
在这里插入图片描述

扩展:Tag标签管理
为了能清晰的管理版本,在公司不会直接使用commit来做版本,会基于Tag来实现:v1.0 、v1.2 、v2.0版本。

git tag -a v1.0 -m'版本介绍'  在本地创建Tag信息
git tag -d v1.0  删除Tag
git push origin --tags  将本地tag信息推送到远程仓库
git pu11 origin --tags  更新本地tag版本信息

git checkout v1.0      切换tag
git clone -b v0.1地址   指定tag下载代码

5.2 给开源项目贡献代码

  1. fork源代码将别人源代码拷贝到我自己的远程仓库。
  2. 在自己仓库进行修改代码
  3. 给源代码的作者提交修复bug的申请(pull request)

在这里插入图片描述

六、其他

6.1 配置

  • 项目配置文件:项目/.git/config

    git config --local user.name '你的用户名'
    git config --local user.email '你的邮箱'
    
  • 全局配置文件: ~/.gitconfig

    git config --global user.name '你的用户名'
    git config --global user.email '你的邮箱'
    
  • 系统配置文件:/etc/.gitconfig

    git config --system user.name '你的用户名'
    git config --system user.email '你的邮箱'
    注意:需要有root权限
    

6.2 免密登录

  • URL中体现

    原来的地址:https://github.com/luohuaweishui/ChatGPT.git
    修改的地址:https://用户名:密码@github.com/luohuaweishui/ChatGPTPlus.git
    
    git remote add origin https://用户名:密码@github.com/luohuaweishui/ChatGPTPlus.git
    git push origin master
    
  • SSH实现

    生成公钥和私钥(默认放在~/.ssh目录下,id_rsa.pub公钥、id_rsa私钥
    拷贝公钥的内容,并设置到github中
    在git本地中配置ssh地址  git remote add origin git@github.com:luohuaweishui/ChatGPTPlus.git
    以后使用   git push origin master
    
  • git自动管理凭证

    git提供了一种自动管理凭证的功能,可以避免每次进行认证时都需要输入用户名和密码。以下是使用HTTPS协议的方式:

    1. 在命令行中运行以下命令启用凭证存储:

      Copy Codegit config --global credential.helper store
      

      这将在全局配置中启用凭证存储功能。

    2. 使用以下命令进行一次认证并将凭证保存:

      Copy Codegit pull origin master
      

      这将会提示你输入用户名和密码,完成认证后,凭证信息将被存储在本地。

    3. 以后每次使用git pushgit pull命令时,Git将自动使用之前保存的凭证,无需再输入用户名和密码。

6.3 git 忽略文件

让Git不再管理当前目录下的某些文件。

*.h   忽略所有以.h结尾的文件。
!a.h	除了a.h文件,其他都忽略
files/   忽略名为files的目录
*.py[c|a|d]   忽略以.pyc、.pya 或 .pyd结尾的文件。

更多参考:https://github.com/github/gitignore

参考相关git文章:https://shijivk.cn/2021/07/09/GitLearningNote/