git入门


Git

是什么:git是一种版本控制工具,相当于版本管理器。可以控制开发项目时的版本

为什么:很多时候开发的最新版本不一定适合当前使用,这就需要一个管理器去管理这些项目资产,以便随时替换

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

视频狂神聊git

资源廖雪峰git教程

历史

Linus觉得Bitkeeper的版本控制好用,但是Bitkeeper在2005年结束了与Linux的合作。于是Linus又花了两周时间来开发git来管理Linux版本

目前,Git是世界上最先进的分布式版本管理系统

版本控制

简介

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

  1. 实现跨区域多人协同开发

  2. 追踪和记载一个或者多个文件的历史记录

  3. 组织和保护你的源代码和文档

  4. 统计工作量

  5. 并行开发、提高开发效率

  6. 跟踪记录整个软件的开发过程

  7. 减轻开发人员的负担。节省时间,同时降低人为错误

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

主流的版本控制器
  1. Git
  2. SVN(Subversion)
  3. CVS(Concurrent Versions System)
  4. VSS(Microsoft Visual SourceSafe)
  5. TFS(Team Foundation Server)
  6. Visual Studio Online

分类

本地版本控制

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

代表产品:RCS

集中版本控制

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

代表产品:SVN,CVS,VSS

分布式版本控制

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

代表产品:Git

安装git

下载:去官网阿里镜像源下载即可

安装:无脑下一步。安装完毕即可看到如下程序

Git Bash:Unix与Linux风格命令行,使用最多

Git CMD:Windows风格命令行

Git GUI:图形界面的Git,不建议初学者使用,尽量先熟悉常用命令

配置git

注意:所有的配置文件都保存在本地,git配置的本质是文件

查看git配置:

git config -l #查看所有git配置
git config --global --list # 查看用户的全局配置

Git相关的配置文件:

Git\etc\gitconfig:Git安装目录下的gitconfig

C:\Users\admin\.gitconfig:用户全局配置

初识化用户(必须):

git config --global user.name "wqa247" #名称
git config --global user.email "1101447047@qq.com" #邮箱

配置git代理

git config --global http.proxy 'http://127.0.0.1:10809'
git config --global https.proxy 'http://127.0.0.1:10809'

git基本理论(核心)

Git本地有四个工作区

  1. 工作目录(Working Directory)
  2. 暂存区(Stage/Index)
  3. 本地仓库(Repository)或(Git Directory)
  4. 远程git仓库(Remote Directory)

文件在这四个区域转换关系如下

git工作流程

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

git操作

常用命令

新建git项目

创建一个空文件夹

git init #初始化git
git clone (url) #克隆库初始化

GIT文件操作

文件状态

Untracked:未跟踪,此文件在文件夹中,但并没有加入到git库,不参与版本控制

Unmodify:文件已经入库,未修改,即版本库中的文件快照内容与文件夹中的完全一致
这种文件可以有两种变化:文件被修改则变为Modified。使用git rm移出版本库则变为Untracked文件

Modified:文件已修改,并没有进行其他操作
这种文件可以有两种变化:通过git add可进入暂存staged状态,使用git checkout则丢弃修改,返回到unmodify状态。git checkout即从库中取出文件,覆盖当前修改

staged:暂存状态
这种文件可以有两种变化:执行git commit则将修改同步到库中,这时库中的文件和本地文件又变为一致,文件为Unmodify状态。执行git reset HEAD filename取消暂存,文件状态为Modified

常用命令
# 查看指定文件状态
git status [filename]

# 查看文件内容差异
git diff [filename]

# 查看所有文件状态
git status

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

# 提交暂存区中的内容到本地仓库 -m 提交信息
git commit -m "(版本信息)" 
版本回退

简介:git每次用commit提交的版本都会作为一张快照记录,就像VMware的快照一样,我们完全可以使用命令来操作版本

注意:git的版本回退十分快速,因为它用的是指针

操作

# 查看提交历史
git log
git log --pretty=oneline # 简单信息

# 回退到上一个版本
git reset --hard HEAD^
git reset --hard HEAD~100 # 回退到上一百个版本

# 回退到指定版本(可以向前回退,也可以向后回退)
git reset --hard b194e7cebd # 这里的版本号不用写全,git会自动检索,但是也不要只写一两位

注意:这里的HEAD^代表上一个版本,上上个版本就是HEAD^^

回到旧版本时,无法用git log查看比当前新的版本,这时只能用版本的ID来回到新版本。但是如何找到这些版本号?

# 查看每一次版本变更
git reflog

作用:这样列出以后,我们可以轻松知道我们是从哪个版本过来的

删除文件
# 删除本地文件
rm 1.txt

# 从版本库恢复删除的文件
git checkout -- 1.txt

# 删除git的版本库和本地的1.txt
git rm 1.txt
git commit -m "remove rest.txt"
忽略文件

介绍:有时候我们不想把某些文件纳入版本控制中,比如数据库文件,临时文件,设计文件等

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

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

# 除了lib.txt外的文件
!lib.txt

# 忽略文件夹
/temp # 不上传任何文件夹,除了相对路径下的/temp
build/ # 不上传build下的所有文件

git分支

简介:分支就是科幻电影里面的平行宇宙,当你正在电脑前努力学习Git的时候,另一个你正在另一个平行宇宙里努力学习SVN。

如果两个平行宇宙互不干扰,那对现在的你也没啥影响。不过,在某个时间点,两个平行宇宙合并了,结果,你既学会了Git又学会了SVN!

作用:假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。

现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。

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

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

# 查看当前分支
git branch

# 切换分支
git checkout [branch-name]
#或
git switch [branch-name]

# 新建一个分支,切换到该分支
git checkout -b [branch]
#或
git switch -c dev

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

# 合并分支后即可删除分支
git branch -d [branch-name]

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

# 查看分支历史
git log --graph --pretty=oneline --abbrev-commit
创建与合并

一开始时master分支是一条线,随着你不断提交,master分支的线也越来越长

当我们创建分支dev时,git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上:

不过,从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变:

假如我们在dev上的工作完成了,就可以把dev合并到master上。Git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并:

解决ff合并冲突

简介:新建分支时,新分支与main分支分别增加不同内容后,会出现如下结构

这种情况下,git无法执行”快速合并(ff)”,只能试图把各自的修改合并,但同名文件可能会产生冲突。例如:

git merge [feature-1]
# 这里告诉我们readme.txt文件存在冲突,必须手动解决冲突后再提交
# Auto-merging readme.txt
# CONFLICT (content): Merge conflict in readme.txt
# Automatic merge failed; fix conflicts and then commit the result.

使用git status查看文件冲突:

git status

直接查看readme.txt内容:

Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> feature1

Git用<<<<<<<=======>>>>>>>标记出不同分支的内容,删掉标注符并修改内容后保存:

Creating a new branch is quick and simple.

再提交:

git add readme.txt
git commit -m "fixed"

现在,master分支和feature1分支变成了下图所示:

用带参数的git log也可以看到分支的合并情况:

git log --graph --pretty=oneline --abbrev-commit

最后,删除feature1分支:

git branch -d feature1
分支管理策略
  1. 无分叉merge,默认采用fast-forward(快进):

注意:改变的总是你当前所在的分支,被merge的分支是不变的。也就是说future是不变的,改变的是master,从1快进到了3。

这种模式下,删除分支后,会丢掉分支信息。也就是说你会丢失future的开发信息。所以我们一般采用no-ff合并分支

  1. 有分叉的情况下在master上 merge future:

这里在1的节点切换到future上开发了2和3,又切换回master开发了4和5,此时在master上使用 --no-ff merge future,产生了版本6

注意:有分叉时不能使用ff(fast-forward)合并。master采用no-ff合并时把2和3当作一个整体并到6上。merge之后多出一个节点6就是合并后的节点

  1. 在future上 rebase(变基) master:

注意:一般在future上(不是master的分支上)rebase,不会在master上用rebase,因为这样做会导致版本混乱

使用Github(或Gitee)

介绍:Github和Gitee本质上是一个远程仓库,可以使用git clonegit push将远程的仓库克隆和上传。就是说,它是一个公开的,可多人协同开发的远程仓库

注意:github在国外访问很慢,在国内一般使用gitee,公司中有时会搭建自己的gitlab服务器

注册gitee账号

没啥可以介绍

设置ssh公钥

用途:为了让github识别到你就是你而不是别人,ssh公钥就是你的身份证明。将ssh公钥分发出去可以让别人解开只属于你发送的数据

原理请看诚 | 破解银行卡? 人类信息安全的顶上战争【超硬核】

本机的ssh保存在C:\Users\admin\.shh

# 用git生成ssh
ssh-keygen -t rsa # rsa代表加密

注意:这里有提示,不用管,按三次回车就行

使用该命令后生成两个文件

把公钥文件粘贴到你的ssh栏

把生成的公钥添加进来即可

新建仓库

随意填写内容即可

使用创建完成后,复制链接:

新建文件夹输入下列代码:

git clone [url]

内容一致:

IDEA使用git

在IDEA的terminal里可以操作git:

git add .
git commit -m "hello.java"
git push

在version里可以看见是谁上传的


文章作者: wqa
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 wqa !
  目录