学习git笔记

一、Git

1、版本控制工具应该具备的功能

①协同修改:多人并行不悖的修改服务器端的同一个文件

②数据备份:不仅保存目录和文件的当前状态,还能保存每个提交过的历史状态

③版本管理:不保存重复内容,Git采取了文件系统快照的方式,SVN采用的是增量式管理

④权限控制

⑤历史记录

⑥分支管理:多条生产线同时进行提高效率

2、版本控制简介

①版本控制

②版本控制工具

思想:版本控制 实现:版本控制工具

3、Git的优势

①大部分操作在本地完成,不需要联网

②完整性保证

③尽可能添加数据而不是删除、修改数据

④分支操作非常快捷流畅

⑤与Linux命令全面兼容

4、GIt的结构

工作区--(git add)-->暂存区:临时存储--(git commit)-->本地库:历史版本

5、GIt和代码托管中心

任务:维护远程库

局域网环境下:GItLab服务器

外网环境下:GitHub、码云

6、本地库和远程库

团队内部协作:其他人加入团队可直接clone到本地库进行修改上传

跨团队协作:fork(复制)一份其他团队的远程库,clone到本地库中进行修改(push),再通过pull request推送请求到原远程库中进行审核,审核通过则merge合并

7、Git命令行操作

1)本地库初始化————git init(初始化一个空的git仓库xxx/.Git/)

①命令:git init

②效果:

ll .git/

-rw-r--r-- 1 DELL 197121  23 Nov 16 14:42 HEAD
-rw-r--r-- 1 DELL 197121 130 Nov 16 14:42 config
-rw-r--r-- 1 DELL 197121  73 Nov 16 14:42 description
drwxr-xr-x 1 DELL 197121   0 Nov 16 14:42 hooks/
drwxr-xr-x 1 DELL 197121   0 Nov 16 14:42 info/
drwxr-xr-x 1 DELL 197121   0 Nov 16 14:42 objects/
drwxr-xr-x 1 DELL 197121   0 Nov 16 14:42 refs/

③.git目录存放的是本地库相关的子目录和文件

2)设置签名

①作用:区分不同开发者的身份

②辨析:这里设置的签名和登录远程库(代码托管中心)的账号、密码没有任何关系

③命令:

查看级别:cat .git/config

项目级别/仓库级别:仅在本地库范围内有效

git config user.name xxx

git config user.email [email protected]

系统用户级别:登录当前操作系统的用户范围(信息保存位置:~/.gitconfig文件)

git config --global user.name xxx

git config --global user.email [email protected]

级别优先级:

就近原则:项目级别优先于系统用户级别,二者都有时采用项目级别的签名

若只有系统用户级别的签名,就以系统用户级别的签名为准

二者都没有不允许

3)添加提交以及查看状态操作

(1)git status——查看状态

①显示该信息表示本地库没有提交任何东西,也没有东西可提交

②没有提交任何东西,但有东西未提交

(2)git add files——添加提交,追踪文件

这里提示输入“git rm --cached file”来从暂存区移除该文件

(3)git commit——提交 / git commit -m "提交的内容" xxx.txt(f提交的file)

root-commit是根提交,只能有一个

再次输入git status:此时工作树(区)是干净的

4)查看历史记录

git log——记录提交

git log --pretty=oneline/ --oneline——让日志以一行显示

git reflog——显示指针值

5)前进后退历史版本操作——移动head指针

①基于索引值操作——git reset --hard 局部索引值(c0ef29c)

②使用^符号(只能往后退)——多少个^就后退几步:git reset --hard head^

③使用~符号(只能后退)——git reset --hard head~n后退n步

6)reset命令的三个参数对比

①--soft——仅在本地库移动head指针

②--mixed——在本地库移动head指针、重置暂存区

原理:head指针和暂存区往后退,而工作区则保持原来位置

③--hard——在本地库移动head指针、重置暂存区、重置工作区

7)永久删除文件(已提交的文件)后找回——删除后进行后退操作即可

前提:文件存在时的状态提交到了本地库

①删除文件后会停留在暂存区中

(可选)②此时添加被删除的文件

③提交形成历史记录并将head指针后退到删除前

8)比较文件——git diff [文件名]

将工作区中的文件和暂存区进行比较

git diff [本地库历史版本] [文件名]

将工作区中的文件和本地库历史记录比较,不带文件名比较文件

9)分支管理

①定义:在版本控制中,使用多条线同时推进多个任务

②好处:同时并行推进多个功能开发提高效率;各个分支在开发过程中,如果某个分支开发失败,不会对其他分支有任何影响,失败的分支删除重新开始即可

③分支操作

为当前head创建分支——git branch [分支名]

查看分支——git branch -v

切换分支——git checkout [分支名]

合并分支:

切换到接收修改的分支(被合并,增加新内容)上——git checkout [被合并的分支名];

执行merge命令——git merge [有新内容的分支名]

解决合并分支后产生的冲突:

对主线路和分支的文件进行修改,然后进行合并分支,出现错误

上图表明两条分支都对a.txt文件进行了修改

解决:

修改好文件,删除特殊符号,添加文件到暂存区(提示:所有冲突已解决,但仍处于合并状态,使用git commit来解除这种状态)

使用git commit命令提交

8、Git中Hash算法

1)哈希

原理:明文——【加密算法/Hash算法】——密文

哈希是一个系列的加密算法,各个不同哈希算法虽然加密强度不同但有相同特点:

①不管输入数据多大,输入同个哈希算法得到的加密结果长度固定

②哈希算法确定,输入数据确定,输出数据能够保证不变

举例:下载一个压缩包,下载之前和下载之后只是部分有大小写变化,其余不变

③哈希算法确定,输入数据有变化,输出数据一定有变化,而且通常变化很大

举例:1个文件进行哈希算法,改变数据后输出数据有很大变化

④哈希算法不可逆

GIt底层采用SHA-1算法

2)Git保存版本的机制

①集中式版本控制工具的文件管理机制

以文件变更列表的方式存储信息,这类系统只会保存文件变化后的数据,不会保存重复内容

②Git的文件管理机制

Git把数据看作是小型文件系统的一组快照,对之前版本的所有文件进行快照(复制)到下个版本;为了高效,若文件没有修改,Git不再重新存储该文件,而是只保留一个链接指向之前存储的文件,Git的工作方式称之为快照流

③Git文件管理机制细节

Git的“提交对象”

各个版本的文件是用链表联系起来的,一个文件包含自己的哈希值和父对象的哈希值这样就形成了关系

3)分支管理机制

在文件管理的基础之上创建分支,类似链表,切换分支通过切换指针实现

二、GitHub

1、前置操作

1)本地库和远程库的创建

创建本地库——在一个文件夹中git init初始化本地库

创建远程库——在github上new responsitory来创建自己的远程库

2)在本地创建远程库别名

创建别名——git remote add origin 地址

查看别名——git remote -v

2、推送操作

创建与远程库的连接——git push origin master(分支)

连接成功后远程库出现本地库中的内容

3、克隆操作——git clone 远程库地址

克隆后将在本地仓库生成对应文件夹

4、邀请他人加入团队

问题:第二个账户clone第一个账号远程仓库到本地仓库后,登录自己的账号会出现错误

解决:此时需要将第二个账号拉入到第一个账号的团队中

第二个账号确认加入后即加入团队进行开发

5、远程库修改的拉取,[将远程库的内容拉取到本地库

两种方法:

①将结果拉取到origin/master中——git fetch origin master

此时看不到修改的内容,需要切换到orgin/master分支才能看到——git checkout origin/master

若想要将拉取结果放到本地库,切换到本地库执行命令——git merge orgin/master

②直接拉取到本地库——git pull origin master

6、协同开发时的冲突——多个用户(未拉取情况下)同时改变同个文件同个位置发生冲突

①若不是基于最新版本所作的修改不能push推送,必须先拉取

②拉取下来若进入冲突状态,则按照分支冲突解决操作即可

7、跨团队协作操作

①第三个账户fork到本地仓库

②本地修改推送到远程

fork过来后克隆到本地仓库,再添加新数据推送到远程库

③pull requests拉取请求,新建pull requests

第三个账号拉取请求给第一个账号,请求审核通过进行合并

接收者可以对发起者进行审核和测试——审核和测试通过即可以合并

④此时第一个账号可以将合并的内容拉取到本地,完成跨团队协作操作

8、SSH免密登录

1)进入当前用户的home目录——cd ~;

删除.ssh目录——rm -rvf .ssh

2)运行命令生成.ssh密钥目录——ssh-keygen -t rsa -C 用户的ssh地址

2)进入.ssh目录获取id_rsa.pub文件的所有内容复制到账户的SSH公钥中

3)添加SSH公钥地址的origin

4)推送SSH请求到远程仓库实现免密登录

9、idea继承git

  • 在idea中选择git--创建本地库

  • git下定义远程

1)环境配置

①忽略.idea文件等一些与项目实际功能无关的文件

创建xxx.ignore文件——最好存放在用户home目录下,便于让~/.gitconfig文件引用

xxx.ignore文件内容

#Compiled class file
*.class
​
#Log file
*.log
​
#BlueJ files
*.ctxt
​
#Mobile Tools for Java(J2ME)
.mtj.tmp/# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
​
hs_err_pid*
​
.classpath
.project
.settings
target
.idea
*.iml

②在.gitconfig文件中引用忽略配置文件(此文件在windows的home目录下)

[user]
    name = tom
    email = [email protected]
[core]
    excludesfile = C:/Users/git/git.ignore

③在idea中指定git的bin目录

④在idea项目目录中创建.git文件

此时文件变红表示创建成功,并且部分文件并未添加到暂存区中

⑤添加文件到暂存区并提交

注意:文件红色——未添加到暂存区;文件绿色——未提交;文件蓝色——文件收到改变

2)切换版本

直接在左下角进行切换

3)新建分支在左下角或右下角都可以创建/切换分支

4)分支合并

①在hot-fix分支上提交了新的信息

②此时master信息不会更新,需要合并

③在右下角进行合并

5)合并冲突问题

问题:在分支和master分支在未合并前在同个文件修改了,就会出现冲突

此时可以对他们的结果进行选择性的合并

6)创建github/gitee账号

在settings中点击gitee创建账号,若用账号密码登录登不进则用(user token)口令登录,在账户中生成口令

github生成口令:settings----developer settings----personal access token

7)保证本地库版本比远程库高——需要先pull下来再push上去

8)idea中clone远程库代码链接到本地

9)gitee有直接导入github项目的功能——创建仓库时最下面有

你可能感兴趣的:(java,git,学习,github)