Git(B站学习笔记)

版本控制系统简介

版本控制系统是一种记录文件或代码变化的软件工具,用于管理多个版本的文件和代码。它可以追踪文件或代码的修改历史,保存每个版本的快照,使得用户可以轻松地回滚到之前的版本,也可以比较和合并不同版本之间的差异,同时还可以协作开发,多人同时修改同一个文件,版本控制系统可以确保每个人的修改都被记录下来,避免冲突和丢失数据。

版本控制系统分为集中式版本控制系统分布式版本控制系统

  • 集中式版本控制系统

    集中式版本控制系统是把代码的管理和同步放在同一个服务器端来进行,如CVS、SVN(Subversion),其中SVN的设计目标是取代CVS,现在互联网上很多版本控制服务从CVS迁移到了SVN

    优点:

    • 权限系统完善
    • 提交修改操作简便

    缺点:

    • 打分支需要联网到服务端
    • 依赖服务器的稳定性

  • 分布式版本控制系统DVCS(Distributed Version Control System)

    分布式版本控制系统相当于把集中式版本控制系统的服务端和客户端都交给参与开发的客户端来保管,只要需要不同开发者合并代码时,才需要一个中转站来完成。如Git

    优点:

    • 打分支不需要联网,客户端本地保存着所有历史记录
    • 不依赖服务器的稳定性,风险分散

    缺点:

    • 同步多人的修改稍繁
    • 本地代码管理需要十分谨慎
    • 缺少权限管理系统

Git安装和初始化配置

Git官网 (git-scm.com)

进入官网进行安装,安装完成git会自动安装git bash,鼠标右键可以看到出现git bash here或者终端terminal打开都可以,安装完成后可以通过git -v来查看版本信息,git命令都是以git开头

Git使用方式

Git的使用方式有三中,分别是命令行、图形化界面GUI、IDE插件或扩展

  • 命令行

  • 图像化界面(GUI)

    在Git的官网上的下载中也可以找到许多图形化界面,如 GitHub Desktop、SourceTree等等

  • IDE插件/扩展

    在常见的IDE工具中通过插件或扩展来使用Git

工作区域和文件状态

常见命令

初始化

设置上传者姓名

git config --global user.name 名字

这里的名字如果是有空格的需要用引号引起来,没有则不用,如git config --global user.name "wuleizhenshang wl"git config --global user.name wuleizhenshang

这里的global参数可以设置为3个值

  • 省略(Local):本地配置,只对本地仓库有效
  • –global:全局配置,所有仓库生效
  • –system:系统配置,对所有用户生效

设置上传者邮箱

git config --global user.email 邮箱

邮箱无空格可以不加双引号

git config --global user.email wuleizhenshang@163.com

设置保存用户名和密码

git config --global credential.helper store

查看配置

git config --global --list

新建仓库

版本库Repository,简称Repo,又叫仓库,在计算机中可以理解为一个文件夹

可以通过mkdir创建文件夹

image-20231028221102548

创建本地仓库

git init 仓库名

仓库名为空就是在当前文件夹下直接创建仓库,该文件夹为仓库,在一个想要作为仓库的文件夹下输入命令即可,后面加仓库名的话就是在该路径下新建一个名为仓库名的文件夹作为仓库

  • windows系统

dir查看所有文件,无隐藏文件

dir /a查看所有文件,包括隐藏文件,.git为隐藏文件

  • Linux系统

ls查看所有文件,无隐藏文件

ls -a查看所有文件,包括隐藏文件

克隆远程仓库

git clone 远程仓库地址

git clone https://gitee.com/wuleizhenshang/csdnBlogShareImg.git

添加和提交文件

查看仓库状态

git status

image-20231028223435528

git status -s

这个命令是查看仓库状态的简略模式,使用这个命令对于一个文件其文件名前面会有两个问号,第一个问号表示暂存区状态,第二个问号表示工作区状态 ,m就表示被修改过

如果新建了一个文件夹,但是文件夹里面没有文件,也就是为空,那么使用git status命令不会显示该文件夹,也就是不会纳入版本控制,如果该文件夹下有文件,那么就会纳入版本控制中

添加到暂存区

git add 文件名

git add *.后缀名git add *.txt,这里就表示全部以txt结尾的文件

git add . 这个表示把当前文件夹所有文件添加到暂存区

image-20231028224310350

查看暂存区内容

git ls-files

提交

git commit -m " 信息 "

git commit -m "第一次提交"

这个命令后面需要跟一个-m参数,这个参数是用来指定提交的信息的,会被记录到仓库中,不使用此命令会进入到git的交互式界面

提交命令只会提交暂存区中的文件而不会提交工作区的文件

同时保存和提交可以写为git commit -a -m git commit -am

分支

对于分支的理解可以形象地理解成一棵大树的枝干,分支在协同开发中可以把不同成员开发的代码保存在不同的分支,之后将代码合并到主分支,也可以新开分支进行bug的处理然后合并到主分支,这样可以保持主分支一直可以使用,减少冲突和错误的影响。 项目经理在实际开发中会分配不同的功能给我们,我们就可以创建一个分支来进行开发

查看、创建、删除分支

git branch 可以查看仓库分支,分支名前带*就是表示当前所处在的分支

git branch 分支名 可以使用该命令创建一个分支,新建一个分支后不会直接切换到分支,需要输入命令进行切换

git branch -d 分支名 删除指定的分支,合并后的分支才能使用该命令删除分支,否则不可以

git branch -D 分支名 强制删除没有合并的分支

切换分支

git checkout 分支名git switch 分支名

切换分支,注意git checkout这个命令还有恢复状态的作用,比如删除了一个文件想要恢复也需要使用该命令,但是如果这个文件名和分支名相同的话使用该命令就会出现歧义,该命令默认切换分支而不是恢复文件,后面官方专门推出了git switch命令

合并分支

git merge 将要合并分支名

该命令表示将一个分支合并到当前分支,当前分支就是合并后的目标分支

git merge --abort 出现冲突时可以使用该命令中断合并

注:分支合并完分支并不会消失,合并冲突需手动解决,如main分支和其他分支对同一个文件进行的修改发生冲突

优点

不会破坏原分支的提交历史,方便回溯和查看

缺点

产生额外的提交节点,分支图比较复杂

git rebase 合并分支

在Git中每个分支都有一个指针指向当前分支的最新提交的节点,使用该命令会找当前所处分支和合并的分支交叉的共同祖先节点,然后从祖先节点开始,把当前分支祖先节点开始到最新节点移动到合并分支的最新节点上面

优点

不会新增额外的提交记录,形成线性历史,比较直观和干净

缺点

会改变提交历史,改变了当前分支branch out的节点。避免在共享分支时使用

image-20231030234823309

查看分支图

git log --graph

分支工作流模型

就是比较好的规范和流程,可以让工作更加高效,更加有条理

GitFlow模型

GitHub Flow

回退版本

查看提交记录

git log

git log --online 查看简洁的提交记录

回退

reset有三种模式,分别为hard、soft和mixed(默认)

  • hard

    回退某个版本并且丢弃工作区和暂存区的所有修改内容

  • soft

    回退某个版本并且保留工作区和暂存区的所有修改内容

  • mixed

    回退某个版本并且保留工作区的修改内容而丢弃暂存区的所有修改内容

git reset --hard

git reset --soft

git reset --mixed

命令回溯

git reflog

在执行此命令后可以找到误操作之前的版本号,然后resaet命令回退版本

git reset --hard b270efb

查看差异

git diff

后面不跟参数默认查看工作区和暂存区的差异内容

git diff HEAD

查看工作区和版本库之间的差异

注:HEAD表示当前分支中的最新提交节点

git diff --cached

查看暂存区和版本库之间的差异

git diff 第一个版本ID 第二个版本ID

比较两个版本的差异,如git diff 5af90b8 b270efb

git diff 另外一个版本ID HEAD

比较当前版本和另外一个版本的差异,如git diff b270efb HEAD

git diff HEAD~数字 HEAD

查看当前版本和HEAD相差多少个版本的差异,如git diff HEAD~ HEAD以及git diff HEAD~3 HEAD

注:查看差异命令后面还可以接文件名,表示查看的两个区域的指定文件的差异

git diff 第一个分支名 第二个分支名

删除文件

Linux可以使用rm 文件名命令删除文件,windows可以直接删除或者命令del /s/q 文件名 删除文件, rmdir /s /q 文件夹路径进行删除文件夹,s表示删除文件夹下所有子文件,q表示删除不进行提示

再删除掉文件后需要使用git add命令同步暂存区,虽然是进行删除操作,但是还是使用添加命令,如git add first.txt表示删除掉first.txt文件后同步暂存区,或者直接git add .

git rm 文件名

把文件从工作区、暂存区中删除,查看仓库状态可以发现是删除状态

git rm --cached 文件名

把文件从版本库中删除,不删除本地文件

删除文件后记得提交,不然版本库还是存在

gitignore忽略文件

忽略文件可以使我们的仓库体积更小、更加干净

应该忽略的文件

  • 系统或系统自动生成的文件

    编译生成的中间文件和结果文件

  • 如Java生成的.class文件或C语言生成的.o文件

  • 运行时生成的日志文件、缓存文件、临时文件

  • 涉及身份、密码、口令、密钥等敏感信息文件

在命令行中可以通过echo 内容 > 文件名将内容覆盖输入到一个指定的文件,如果要用通配符忽略log文件,就可以输入echo *.log > .gitignore

在命令行中可以通过echo 内容 >> 文件名将内容追加输入到指定文件,如echo temp/ >> .gitignore忽略temp文件夹,添加文件夹的时候需要以/结尾

.ignore忽略的文件(如使用了通配符忽略.log文件)生效的情况就是要在添加内容到.ignore文件之前未添加到版本库中

在github上的gitignore中提供了常用语言的忽略文件的模板,在新建仓库时可以直接使用,有需要再进行修改

远程仓库托管代码

HTTPS协议和SSH协议

HTTPS协议使用443端口,传输速度相较快点,通过用户名/密码授权,可用性较高;SSH协议使用22端口,传输速度相较慢点,先生成SSH密钥对,再把公钥上传到服务器(推荐使用SSH)

配置SSH密钥

  1. 首先要进入用户根目录,windows一打开cmd窗口就是默认根目录

  2. 然后通过 cd .ssh 命令进入.ssh目录

  3. ssh-keygen -t rsa -b 4096 生成SSH密钥,其中-t指定协议,这里指定为rsa协议,-b指定生成大小,这里大小为4096

  4. 之后输入密钥文件名和输入密码并确定密码,之后生成一个私钥文件(就是以前面密钥文件名生成的文件,不要给别人)和公钥文件(·pub文件)

  5. 打开并复制公钥文件的内容,之后在远程仓库如github中个人设置中的SSH中新建SSH keys把公钥内容输入其中新建

  6. 如果前面是指定了一个密钥文件名,那么就还需要进行下面的配置,在.ssh下新建config文件(无后缀名),输入下面的内容,表示ssh github.com的时候访问github.com就使用.ssh下的first密钥,这里的Host表示主机别名,可以随便起,但是HostName就不能随便起了,可以指定需要访问主机的ip或者真实主机名

    1
    2
    3
    4
    5
    # github
    Host github.com
    HostName github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/first

​ 使用生成SSH密钥的命令后会要求输入密钥对文件名称,第一次使用生成SSH密钥的命令可以直接 回车,第一次会自动在.ssh目录下生成id_rsa密钥文件,第二次使用就不要直接回车,不然会 直接默认生成覆盖原本同名字的密钥文件,并且该操作不可逆

image-20231029231722381

关联本地仓库和远程仓库

本地已拥有一个本地仓库,现在需要将本地仓库放到远程仓库,这里的操作在GitHub上新建完仓库后会有提示,可以按照提示走,不同就修改一下

image-20231030215607528

  1. 首先创建一个远程仓库,如在GitHub上创建一个仓库
  2. 使用 git remote add <shortname> <url> 命令,shortname指的是别名,GitHub的默认别名是origin,也可以自己指定别名,在GitHub的仓库创建完成后会有提示命令,复制即可,里面包含URL,这个URL其实就是仓库最上面的SSH地址,如git remote add origin git@github.com:wuleizhenshang/gitTest.git
  3. 之后可以使用 git remote -v 查看当前仓库对应的远程仓库的别名和地址
  4. 之后可以输入 git branch -M main 将本地分支重命名为main,为了让本地分支和远程分支保持一致,本地仓库分支默认名称为main的话这里可以进行省略,但是Git默认初始为master,GitHub更改后默认为main
  5. 使用 git push -u origin main 把远程origin仓库的main分支和本地仓库的main分支关联起来,该命令非省略写法为 git push -u origin main:main,前一个表示本地仓库main,后一个表示远程仓库的main,其中-u是upstream缩写

拉取和推送

注:拉取推送需要先关联远程仓库

拉取

远程仓库有内容发生变化时,可以拉取到本地仓库

git pull <远程仓库名> <远程分支名> <本地分支名>

仓库名称和分支名称省略的话就是默认拉取别名为origin的仓库的main分支,命令作用就是把远程仓库的指定分支拉取到本地再进行合并,这里的远程分支名和本地分支名相同可省略

注:执行完成pull操作后Git会自动执行一次合并操作,远程仓库中修改的内容和本地仓库修改内容没有冲突的话,合并操作就会成功,否则就会失败,这时候需要手动解决冲突

git fetch

这个命令和pull命令区别就是此命令只会获取远程仓库的修改,并不会自动合并到本地仓库中,需要手动合并

推送

git push <remote> <branch> 推送

不同代码托管平台

GitHub

Gitee也叫码云,国内平台

GitLab也叫极狐,特色:私有化部署,可以搭建自己的GitLab服务器,然后项目可以在这个服务器上进行管理

【Android Studio】Git可视化基本操作_安卓studio 可视化编程_我又来搬代码了的博客-CSDN博客

Android Studio 控制Git 代码回退提交版本_android studio git回滚-CSDN博客

其他

git代码行统计_git统计代码行数-CSDN博客