Git技术
是一个免费的、开源的分布式版本控制工具
什么是版本控制?
版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统
为什么要使用版本控制?
他可以将某个文件回溯到之前的状态,甚至将整个项目都回退到过去某个时间点的状态
集中化的版本控制系统(svn、csv等)
有一个单一的集中管理服务器,保存所有文件的修订版本,协同工作的人都可以通过客户端连接到这台服务器,取出最新的文件或者提交更新。
缺点:若服务器单点故障。如果服务器宕机一小时,那么这一小时内谁都无法提交更新,也就无法协同工作
分布式的版本控制系统(Git、BitKeeper等)
1.客户端并不只提取最新版本的文件快照,而是把代码仓库完整的镜像下来(意思就是客户端内不仅会存放最新版本,还会存放历史版本)
2.分布式版本控制系统在管理项目时存放的不是项目版本与版本之间的差异,它存的是每个历史版本的索引(采用了极致压缩算法,解压算法,使得所需磁盘空间很少)
Git结构
工作区、暂存区、本地版本库/本地库
代码托管中心
有了本地库为什么还需要代码托管中心?
它的任务是帮助我们维护远程库
设置Git
##设置用户名和邮箱
git config --global user.name "用户名"
git config --global user.name "密码"
## 清空命令窗口
clear
创建版本库–本地仓库的初始化操作
## 在某个文件夹下执行如下命令
git init
##执行该命令后,该文件夹下会自动创建一个.git的隐藏文件
将文件添加到暂存区 并 将暂存区的所有文件添加/修改 放入 本地仓库/本地版本库
## 将 工作区 文件放入 暂存区 的命令
git add <file> || git add . # 提交当前目录下的所有文件
## 将 暂存区 文件放入 本地库 的命令
git commit <file>
## 对提交到 本地库 的文件做注释 <message>备注这次commit修改的主要内容
git commit -m "<message>" <file>
## 查看 工作区 和 暂存区 的状态
git status
## 回退更改过的内容
git restore <file>
查看历史记录内的信息
1.每一条历史记录内有16进制的号码,该号码对应的是该条历史记录对应的索引。(可以将该索引理解为一个键值对的键,其值就是历史记录对应的具体内容。该索引是通过hash算法加密算出来的唯一的值)
2.当前历史版本的签名(即 提交该版本的作者名)
3.当前版本提交时间
4.当前版本提交是所带的注释
操作:(若历史记录过多,一个页面展示不完)
下一页:空格
上一页:b
到页尾了,显示END
退出:q
日志的展示方式:
git log (查看历史记录)
git log --pretty=onelint
git log --onelint (只显示索引值的后7位)
git reflog (多了信息:HEAD@(数字) , 该数字的含义:指针回到当前这个历史版本需要走多少步) ## 常用
通过日志 前进或后退历史版本
git reset --hard [索引] ##前进或后退历史版本都使用该命令,索引值可以只选其后七位
## 参数
--hard 本地库指针移动的同时,重置暂存区及工作区
--mixed 本地库指针移动的同时重置暂存区,但工作区不变
--soft 本地库指针移动,但暂存区和工作区不变
git删除文件/文件夹
## 删除文件
git rm 文件名 ##该操作仅是将工作区的文件删除,若想将仓库内的文件也删除需要进行提交操作
git add [被删除的文件名]
git commit -m '提交描述' [被删除的文件名]
## 删除文件夹
git rm -r 文件夹名称
git add [被删除的文件夹名]
git commit -m '提交描述' [被删除的文件夹名]
## 找回 本地库 删除的文件
git reset --hard [索引]
## 找回 暂存区 中删除的文件(使用文件还未被删除时的索引即可)
git reset --hard [索引]/HEAD ## 直接使用HEAD,查看当前指针指到哪个位置
## 当我们需要删除暂存区或分支上的文件,但本地又需要使用,只是不希望该文件被版本控制,可以使用该命令
git rm -r --cached 文件夹名称
查看文件修改前和修改后的差异
## 将 工作区 中的文件和 暂存区 中的文件做比较 (git是以行为单位管理数据,若是在某行的数据后追加数据,那么git会把原先那一行的数据删除,再将新的一行加上)
git diff <file>
## 比较 工作区 和 暂存区 中的所有文件
git diff
## 比较暂存区和工作区中的文件中内容
git diff [历史版本索引] [file]
若有不希望被上传到git里的文件,则可以在项目的文件夹中创建一个.gitignore文件,在其中存放你不希望被Git跟踪的文件和文件夹,之后再使用git add命令时,Git就不会添加这些文件和文件夹进暂存区
分支
什么是分支?
在版本控制过程中,使用多条线同时推进多个任务。这里的多条线就是分支
分支的好处是:同时多个分支可以并行开发,互相不耽误,互相不影响,提高开发效率
如果有一个分支功能开发失败,直接删除这个分支就可以,不会对其它分支产生影响
## 查看所有分支,及其最近的一次操作. (显示的结果中,其中有一条信息的头部有*号,代表当前在该分支上)
git branch -v
## 创建分支
git branch [分支名]
#切换到某分支下操作
git checkout [分支名]
注意:刚创建的分支会与当前主分支上的对应的版本号(索引)一致,创建的分支可以在当前版本的基础上开发后续版本
分支-冲突问题
## 将分支合并到主分支。第一步需要切换到主分支;第二步将分支和主分支的内容进行合并
git merge [合并的分支名]
##当合并过程中出现冲突时会显示如下语句:CONFLICT (content): Merge conflict(冲突) in a.txt
什么时候会出现冲突问题?
不同的分支在同一个文件的同一个位置(即同一行)修改 会出现冲突问题。
解决办法:
1.只能人为的选择留下哪个分支修改过的内容
2.然后手动删除另一个分支修改过的内容
3,执行以下命令
vim <file> ## 在主分支中删除 冲突的那一行的数据
git add <file> ##将删除后的数据提交到暂存区
git commit -m "描述" ## 提交完成合并。注意:不可以带文件名,否则出错
GitHub远程库
在GitHub创建库后,可以看到有一个库的http地址,通过该地址可以更新远程仓库里的内容
GitHub提供给git一种可以给远程库地址起别名的方式
## 给远程库地址起别名
git remote add [别名] [地址url] #wyh
## 查看远程库别名
git remote -v ## 将会查看到有两个别名,fetch和push分别代表从地址取数据和推数据进入该地址
推送操作 – 将本地库的文件推送到远程库中
## 在gitHub上获取token用作接下来git登录
1.Settings - Developer settings - Personal access token (设置token的有效期访问权限等。)
注:要使用token从命令行访问仓库,请选择repo
要使用token从命令行删除仓库,请选择delete_repo
2.之后用自己生成的token登录,把上面生成的token粘贴到输入密码的位置,然后成功push代码!
3.也可以 把token直接添加远程仓库链接中,这样就可以避免同一个仓库每次提交代码都要输入token了:
git remote set-url origin https://<your_token>@github.com/<USERNAME>/<REPO>.git
<your_token>:换成你自己得到的token
<USERNAME>:是你自己github的用户名
<REPO>:是你的仓库名称
## 将本地库的数据push到GitHub上的(master主分支/其它分支)仓库 (需要进行登录操作)
git push [别名] [master/分支名] ## 回车该命令后会进入GitHub的登录操作
# 如果输入push等操作没有出现输入密码选项,输入以下命令,即可看到输入密码选项
git config --system --unset credential.helper
git remote set-url wyh https://github.com/yhw940/gitlrn.git
https://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@github.com/yhw940/gitlrn.git
克隆操作 – 将远程库中的文件克隆到本地库
## 使用克隆命令前,需要去gitHub将要被克隆的项目中获取克隆的地址"Clone or download"
git clone [克隆地址]
克隆操作可以帮我们完成:
1.初始化本地库
2.将远程库内容完整克隆到本地
3.替我们创建远程库的别名
团队合作时的操作
邀请加入团队
## 邀请者需要做以下操作,在邀请者的GitHub页面按下面提示找到对应的邀请页面
Settings - Manage access - Invite a collaborator
搜索要邀请的成员的用户名,使之进入我的列表内
在下方列表内勾选该成员,该成员信息的右方有复制链接的按钮,将该链接给那位成员,他即可操作该团队下的文件
那位成员登录了gitHub后,在地址栏出将链接粘贴上去,按下回车,即可看到加入团队邀请
此时被邀请者就可以推送或者复制该团队下的文件
被邀请者远程库修改的拉取
被邀请者的pull操作相当于是fetch和merge操作的合并,先抓取再合并
git fetch [别名] [分支名] ## 该操作是将gitHub的文件下载到本地,但是并没有更新到工作区内
git checkout [远程库别名]/[远程库分支名] ##下载后,可以去远程库看看内容是否正确
## 切换到远程库后一定要切换回来才能对本地库进行操作 git checkout [本地库分支名]
## 发现内容都正确就可以进行合并操作
git merge [远程库别名]/[远程库分支名]
以上操作可以直接使用pull操作完成
git pull [远程库的别名] [远程库的分支名]
注意:第一种fetch+merge操作是为了保险起见,使用的
协同开发合作时冲突文件的解决
先将别人修改过的文件pull下来
查看冲突,认为解决该冲突(该删的删,该留的留)
解决完冲突后提交到本地库,使用提交命令时,后面不能带上文件名
提交完后向服务器推送push
SSh免密登录
# 1.进入用户的主目录中
cd ~
# 2.执行命令,生成一个.ssh的目录
ssh-keygen -t rsa -C [GitHub上对应的邮箱] ## key generation的缩写,然后会进行三次确认,全部回车就好
# 3.打开.ssh目录下的id_rad.pub文件,将里面的内容key进行复制操作。
# 4.打开GitHub,点击头像下列表的Settings - SSH and GPG keys - New SSH key进入页面后,title部分起名字,key部分将刚复制的key粘贴上去,点击add SSH key
# 5.生成密钥以后就可以正常进行push操作,对ssh远程地址起别名
git remote add [别名] [ssh地址]
使用ssh方式的好处:不用每次都进行身份验证
缺陷:只能针对一个账号
IDEA集成Git
1.首先进入idea的设置界面 preference - Version Control - Git 页面设置git所在的路径
2.创建git仓库 在idea界面上的 VCS - Import into Version Control - Create Git Repository 选择要初始化的位置(相当于执行了git init命令) - 本地库初始化完成,生产了.git目录
3.对需要提交的工程目录右键 - Git - commit/add (控制台中可以查看提交后的返回数据,如16进制的索引)
团队合作时 使用idea拉取和推送资源
## 在命令行中操作
1.拉取 远程库 的资源到 本地库
git pull [远程库的别名] [远程库的分支名] --allow-unrelated-histories #后面的参数表告诉git允许不相关历史合并
2.将 本地库 的资源 推送到 远程库中
git push -u [远程库的别名] [远程库的分支名] -f
## 在idea中操作
1.对需要提交到远程库的目录右键 - Git - Repository - Push/pull
第一次进行push/pull时如果未对远程库起别名那么,会提示你define remote给远程库起别名
注意:一般在开发中先pull操作拉取远程库的资源(通过该操作观察是否存在冲突问题),再进行push操作
使用idea克隆远程仓库到本地
1.在idea界面顶部导航栏的File - Project from Version Control - Git
2.在弹出的框内输入远程库的URL
克隆到本地后所创建的目录即是一个本地仓库也是一个工作空间
idea使用Gitee时需要另外安装的插件
preference - Plugins页面搜索gitee,然后将其安装
preference - Version Control - Gitee 页面添加登录信息