git快速入门

Git

一、版本控制

(一)什么是版本控制

版本控制(Revision Control)是一种在开发的过程中用于管理我们对文件、目录或工程等内容的修改历史,方便查看更改历史记录,备份以便恢复以前的版本的软件工程技术。

  • 实现跨区域多人协同开发
  • 追踪和记载一个或者多个文件的历史记录
  • 组织和保护你的源代码和文档
  • 统计工作量
  • 并行开发,提高开发效率
  • 追踪记录整个软件的开发过程
  • 减轻开发人员的负担,节省时间,同时降低人为错误

简单说就是用于管理多人协同开发项目的技术。

​ 没有进行版本控制或者版本控制本身缺乏正确的流程管理,在软件开发过程中将会引入很多问题,如软件代码的冗余,软件过程的事物性,软件开发过程的并发性,软件源代码的安全性以及软件整合等问题。

(二)常见的版本控制工具

主流的版本控制工具有如下这些:

  • Git
  • SVN(Subversion)
  • CVS(Concurrent Versions System)
  • VSS(Micorosoft Visual SourceSafe)
  • TFS(Team Foundation Server)
  • Visual Studio Online

版本控制的工具非常多,现在影响力最大并且使用最广泛的是Git

(三)版本控制的分类

1. 本地版本控制

记录文件每次的更新,可以对每个版本做一个快照,或是记录补丁文件,适合个人用,如RCS

2. 集中版本控制

所有的版本数据都保存在服务器上,协同开发者从服务器上同步更新或上传自己的修改。

所有的版本数据都存在服务器上,用户的本地只有自己以前所同步的版本,如果不连网,用户就看不到历史版本,也无法切换版本验证问题,或在不同分支工作。而且所有数据都保存在单一的服务器上,有很大的风险这个服务器会损坏,这样就会丢失所有的数据,当然可以定期备份。代表产品:SVN、CVS、VSS

3.分布式版本控制

​ 所有版本信息仓库全部同步到本地的每个用户,这样就可以在本地查看所有版本历史,可以离线在本地提交,只需在连网时候push到相应的服务器或其他用户哪里,由于每个用户哪里保存的都是所有的版本数据,只要有一个用户的设备没有问题就可以恢复所有的数据,但是这增加了本地存储空间的占用。

这样不会因为服务器损坏或者网络问题造成不能工作的情况。

(四)Git和SVN的主要区别

  • SVN是集中式的版本控制系统,版本库是集中放在中央服务器的,而工作的时候,用的都是自己的电脑,所以首先要从中央服务器得到最新的版本,然后工作,工作完以后,都需要把自己做完的活推送到中央服务器,集中式版本控制系统必须要联网才能工作,对网络带宽要求比较高。

  • Git是分布式版本控制系统,没有中央服务器,每个人的电脑就是一个完整的版本库,工作的时候不需要联网,因为版本都在自己的电脑上,协同的方法是这样的,比如在自己的电脑上修改了A文件,其他人在电脑上也修改了A文件,这时候,两者只需要把自己修改的推送给对方,就可以互相看到对方的修改了。(Git可以直接看到更新了哪些的代码和文件。)

  • Git是目前世界上最先进的分布式版本控制系统。

二、Git的环境配置(基于Linux)

(一)安装Git

在安装git的同时将其连接到github上

Git官网:https://git-scm.com/

  • 首先更新系统
sudo apt update
  • 命令行安装git
sudo apt install git
  • 查看安装是否成功
git
usage: git [--version] [--help] [-C <path>] [-c <name>=<value>]
           [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
           [-p | --paginate | -P | --no-pager] [--no-replace-objects] [--bare]
           [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
           <command> [<args>]

这些是各种场合常见的 Git 命令:

开始一个工作区(参见:git help tutorial)
   clone      克隆一个仓库到一个新目录
   init       创建一个空的 Git 仓库或重新初始化一个已存在的仓库

在当前变更上工作(参见:git help everyday)
   add        添加文件内容至索引
   mv         移动或重命名一个文件、目录或符号链接
   reset      重置当前 HEAD 到指定状态
   rm         从工作区和索引中删除文件

检查历史和状态(参见:git help revisions)
   bisect     通过二分查找定位引入 bug 的提交
   grep       输出和模式匹配的行
   log        显示提交日志
   show       显示各种类型的对象
   status     显示工作区状态

扩展、标记和调校您的历史记录
   branch     列出、创建或删除分支
   checkout    切换分支或恢复工作区文件
   commit     记录变更到仓库
   diff       显示提交之间、提交和工作区之间等的差异
   merge      合并两个或更多开发历史
   rebase     在另一个分支上重新应用提交
   tag        创建、列出、删除或校验一个 GPG 签名的标签对象

协同(参见:git help workflows)
   fetch      从另外一个仓库下载对象和引用
   pull       获取并整合另外的仓库或一个本地分支
   push       更新远程引用和相关的对象

命令 'git help -a''git help -g' 显示可用的子命令和一些概念帮助。
查看 'git help <命令>''git help <概念>' 以获取给定子命令或概念的
帮助。

  • 查看git的版本
~$ git --version
git version 2.20.1

git安装完成。

  • 配置用户名和邮箱
~$ git config --global user.name 用户名
~$ git config --global user.email 邮箱

  • 设置文本编辑器
git config --global core.editor vim # 使用vim
git config --global core.editor gedit # 使用图形编辑界面
  • 生成公钥、私钥
ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/lambda/.ssh/id_rsa): 
Created directory '/home/lambda/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/lambda/.ssh/id_rsa.
Your public key has been saved in /home/lambda/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:g1TzHW8vFvUGtJ1Rc+4QzZ25IiAEaTXTDNqaT3BTMBk lambda@lambda-PC
The key's randomart image is:
+---[RSA 2048]----+
|     .=EX.  ..+=O|
|     oo+=* . o XX|
|    .o.+. o . *.*|
|     .=..  . o B |
|     o..S   . + o|
|      o  .   . . |
|       .         |
|                 |
|                 |
+----[SHA256]-----+
  • 进入目录查看公钥和密钥

  • 复制公钥到github

登录github-> Accounting settings图标-> SSH key-> Add SSH key-> 填写SSH key的名称(可以起一个自己容易区分的),然后将拷贝的~/.ssh/id_rsa.pub文件内容粘帖-> add key”按钮添加。

  • 测试是否连上github
 ssh -T git@github.com
 
 ssh -T git@github.com
The authenticity of host 'github.com (20.205.243.166)' can't be established.
ECDSA key fingerprint is SHA256:p2QAMXNIC1TJYWeIOttrVc98/R1BUFWu3/LiyKgUfQM.
Are you sure you want to continue connecting (yes/no)? y
Please type 'yes' or 'no': yes
Warning: Permanently added 'github.com,20.205.243.166' (ECDSA) to the list of known hosts.
Hi javalover-design! You've successfully authenticated, but GitHub does not provide shell access.
 ssh -T git@github.com
Hi javalover-design! You've successfully authenticated, but GitHub does not provide shell access.

此处表示虽然帐号和用户名都是正确的,但是Github不提供shell的访问途径。

(二)需要了解的常用linux命令(Bash shell下)

  • 改变目录
cd
  • 回退到上一级目录,直接cd进入默认目录
cd ..
  • 显示当前所在目录的路径
pwd
  • 列出当前目录中的所有文件,不过ll列出的内容更加详细
ls(ll)
  • 新建一个文件
touch
  • 删除一个文件
rm
  • 新建一个目录
mkdir
  • 删除一个文件夹
rm -r
  • 移动文件
mv
  • 重新初始化终端或清屏
reset
  • 清屏
clear
  • 查看命令历史
history
  • 帮助
help
  • 退出
exit
  • 注释
#

(三)Git的配置

  • 查看本身已经配置的信息(用户配置的)
git config -lgit config --global --list~$ git config -luser.name=xxxuser.email=xxxx@163.com
  • 查看系统配置
git config --system --list

三、Git的基本理论

(一)工作区域

Git本地有三个工作区域:工作目录(Working Directory)、暂存区(Stage/index)、资源库(Repository或Git Directory)。加上远程的git仓库(Remote Directory)就可以分为四个工作区域。文件在这四个区域之间的转换关系如下:

  • Workspace:工作区,就是平时存放项目代码的地方
  • index/Stage:暂存区,用于临时存放改动,事实上它只是一个文件,保存即提交到文件列表信息。
  • Repository:仓库区(或本地仓库),就是安全存放数据的位置,这里有提交到所有版本的数据,其中HEAD指向最新放入仓库的版本。
  • Remote:远程仓库,托管代码的服务器,可以简单认为是项目组中的一台电脑用于远程数据交换。

本地的三个区域确切的说是git仓库中HEAD指向的版本:

  • Directory:使用Git管理的一个目录,就是一个仓库,包含工作空间和Git的管理空间
  • WorkSpace:需要通过Git进行版本控制的目录和文件,这些目录和文件组成了工作空间
  • .git:存放Git管理信息的目录,初始化仓库的时候自动创建
  • Index/Stage:暂存区,或者叫待提交更新区,在提交进入repo之前,把所有的更新放在暂存区。
  • Local Repo:本地仓库,一个存放在本地的版本库,HEAD会只是当前的开发分支
  • Stash:隐藏,是一个工作状态保存栈,用于保存或恢复WorkSpace中的临时状态。

(二)工作流程

git的工作流程一般是这样的:

  1. 在工作目录中添加、修改文件
  2. 将需要进行版本管理的文件放入暂存区域
  3. 将暂存区域的文件提交到git仓库。

因此,git管理的文件有三种状态:已修改(modified)、已暂存(staged)、已提交(committed)

四、Git项目搭建

(一)创建工作目录与常用指令

工作目录一般是希望git帮助管理的文件夹,可以是项目目录,也可以是一个空目录,建议不要使用中文,日常使用,需要记住以下6个命令:

(二)本地仓库搭建

创建本地仓库的方法有两种,一种是创建全新的仓库,另一种是克隆远程仓库。

  1. 创建全新的仓库,需要使用Git管理的项目的根目录执行:
:/data/home/lambda/Git/gitcode$ git init已初始化空的 Git 仓库于 /data/home/lambda/Git/gitcode/.git/

git的初始化仓库

(三)克隆远程仓库

另一种方式是克隆远程目录,即将远程服务器上的仓库完全镜像一份至本地

# 克隆一个项目和它的整个代码历史(版本信息)git clone [url]

五、Git文件操作

(一)文件4种状态

版本控制就是对文件的版本控制,要对文件进行修改,提交等操作,首先要知道文件当前在什么状态。不然可能会提交了现在还不想提交的文件或者要提交的文件没提交上。

  • Untracked:未跟踪,此文件在文件夹中,但并没有加入到git库,不参与版本控制,通过git add,状态变为Staged
  • Unmodify:文件已经入库,未修改,即版本库中的文件快照内容与文件夹中的内容完全一致,这种类型的文件有两种去处,如果它被修改,变为Modified,如果使用git rm移出版本库,则成为Untracked文件
  • Modified:文件已修改,仅仅是修改,没有进行其他的操作,这个文件也有两个去处,通过git add可进入暂存Staged状态,使用git checkout,则丢弃修改过,返回到Unmodify状态,这个git checkout即从库中取出文件,覆盖当前修改。
  • Staged:暂存状态,执行git commit则将修改同步到库中,这时库中的文件和本地文件又变为一致,文件为Unmodify状态。执行git reset HEAD filename取消暂存,文件状态为Modified

(二)查看文件状态

可以通过如下命令查看文件的相关状态

  • 刚初始化git目录的时候,查看文件的状态

git status
# 得到如下内容

位于分支 master

尚无提交

无文件要提交(创建/拷贝文件并使用 "git add" 建立跟踪)

  • 在该目录下创建一个java.txt文件

git status# 显示一个没有被跟踪的文件位于分支 master尚无提交未跟踪的文件:  (使用 "git add <文件>..." 以包含要提交的内容)        java.txt提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)
  • 将txt文件添加到暂存区
git add .git status# 显示一个新的文件,表示暂存位于分支 master尚无提交要提交的变更:  (使用 "git rm --cached <文件>..." 以取消暂存)        新文件:   java.txt

git add .表示添加所有文件到暂存区

  • 将txt文件提交到本地仓库
git commit -m "xxxx"# commit表示将所有的文件提交到本地仓库,m表示描述的信息,可以自定义[master(根提交) 8b22d9c] 新提交的java.txt文件 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 java.txtgit status位于分支 master无文件要提交,干净的工作区

(三)忽略文件

有时候并不想把某些文件纳入到版本控制中,比如数据库文件,临时文件,设计文件等。

在主目录下建立.gitignore文件,此文件有如下规则:

  1. 忽略文件中的空行或以井号(#)开始的行都会被忽略
  2. 可以使用Linux通配符,例如星号表示任意多个字符,问号代表一个字符,方括号代表可选字符范围,大括号表示可选的字符串等。
  3. 如果名称的最前面有一个感叹号(!)表示例外规则,将不被忽略
  4. 如果名称的前面是一个路径分隔符(/)表示要忽略的文件在此目录下,而子目录中的文件不忽略。
  5. 如果名称的最后面是一个路径分隔符(/),表示要忽略的是此目录下该名称的子目录,而非文件(默认文件或目录都忽略)

下图是项目中的忽略文件的相关配置信息:

# 注释*.txt  #忽略所有.txt为结尾的文件,上传将不会被选中!lib.txt  #表示不忽略lib.txt文件/temp  #仅忽略项目根目录下的TODO文件,不包括其他目录temp(向上忽略)build/   #忽略build/目录下的所有文件doc/*.txtx #忽略doc目录下的子文件(.txt文件),即会忽略doc/notes.txt文件,但是不包括doc/server/arch.txt

六、Git远程仓库使用

(一)创建github的仓库

1.创建仓库

登录github:https://github.com/

选择new,新建一个仓库

2. 将仓库克隆到本地
  • 找到要克隆的仓库,复制仓库的地址

  • 在要存放代码的目录下打开终端
 git clone git@github.com:javalover-design/git-study.git
正克隆到 'git-study'...
remote: Enumerating objects: 6, done.
remote: Counting objects: 100% (6/6), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 6 (delta 0), reused 0 (delta 0), pack-reused 0
接收对象中: 100% (6/6), 完成.

  • 下载完成代码

(二)使用git连接idea

  1. 新建一个idea的springboot项目,该项目目录与拷贝远程仓库的目录处于同一级

  1. 绑定git

将远程的git文件目录拷贝到项目中即可,即将git-study中的全部文件拷贝到git-score中即可

添加完成之后,idea中的图标有所变化

  • 上图中上方的图标表示idea集成的相关git操作
  • 变色的文件名表示文件处于选中状态
  1. idea中git的相关操作
  • 当项目完成后,可以在命令行输入命令移交到暂存区

  • 当修改某个文件需要提交到暂存区的时候,可以选中该文件右击,选中git,选中Add,单击即可完成操作

  • 当需要移交到本地仓库

选中commit提交操作,设置相关信息,最后commit

完成后,相关的文件颜色变为白色

  • 在idea中查看已经提交的信息

  • 将本地仓库中的内容上传到远程仓库

这里git push出现了错误,是因为当前分支的最新提交落后于其对应的远程分支。需要更新

git fetch origingit merge origin/mastergit push

进行相应的提交即可

也可以通过按钮来操作

执行相应的操作即可提交到远程仓库

  • 查看远程仓库

远程仓库完成了相应的更新。

之后只需要将idea中写完的程序push到远程仓库,就会自动提交。

七、Git分支

(一)什么是分支

分支在Git中比较重要。

在github中查看相应的分支

(二)分支常用命令

git分支中常用的命令

# 列出所有本地分支版本
git branch

# 列出所有远程分支
git branch -r

# 新建一个分支,但依然停留在当前分支
git branch [branch -name]

# 新建一个分支,并切换到该分支
git checkout -b[branch]

# 合并指定分支到当前分支
git merge [branch]

# 删除分支
git branch -d [branch -name]

# 删除远程分支
git push origin --delete[branch-name]
git branch -dr[remote/branch]

如果同一个文件在合并分支时都被修改了则会引起冲突,需要修改冲突文件之后再提交。

main主分支应该非常稳定,用来发布新版本,一般情况下不允许在上面工作,工作一般在dev分支下进行,工作完成后可以将其合并到主分支上去。

如果多个分支并行执行,是不会导致我们的代码冲突,也就是同时存在多个版本,此时可能会出现文件冲突,此时需要合并分支

例:在我们的git-score项目中查看相应的分支以及创建新的分支dev

 git branch
* main

 git branch -r
  origin/HEAD -> origin/main
  origin/main
  
 git branch dev
 
 git branch
  dev
* main
 

(三)idea中切换分支

  • 可以直接通过右键来选择Git查看已有分支

  • 选中branch选择相应的分支切换

  • 如果不需要dev分支,则可以将其删除
git branch -D dev
已删除分支 dev(曾为 c3e4d3b).

git branch
* main

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值