基本介绍
Git 是一个免费的、开源的分布式版本控制系统,可以快速高效地处理从小型到大型的各种项目。Git 易于学习,占地面积小,性能极快。它具有廉价的本地库,方便的暂存区域和多个工作流流分支等特性。其性能优于 Subversion、CVS、Perforce 和 ClearCase 等版本控制工具。
git工作机制分为三个区,如下:
- 工作区:注意工作区不是IDEA,IDEA只是我们开发代码的工具,我们本地代码的存放目录才是我们的工作区。
- 暂存区:在本地写了代码之后,得让git知道你的代码文件,因此你需要将工作区的代码添加到暂存区。暂存区是临时存储的,也就就是说暂存区的代码是可以删掉的。
- 本地库:暂存区的代码提交到本地库之后,才会产生历史版本,也就谁说此时的代码删不掉了,因为这个历史版本会一直存在。
基本使用
常用命令
| 命令名称 | 作用 |
|---|---|
| git config --global user.name 用户名 | 设置用户签名 |
| git config --global user.email 邮箱 | 设置用户邮箱 |
| git init | 初始化本地库 |
| git status | 查看本地库状态 |
| git add 文件名 | 添加到暂存区 |
| git commit -m "日志信息" 文件名 | 提交到本地库 |
| git reflog | 查看历史记录 |
| git reset --hard 版本号 | 版本穿梭 |
设置用户签名
##设置用户名
git config --global user.name 用户名
##设置邮箱
git config --global user.email 邮箱
设置好用户名和邮箱之后,可以在git全局配置文件中看到设置的信息
签名的作用是区分不同操作者身份。用户的签名信息在每一个版本的提交信息中能够看到,以此确认本次提交是谁做的。Git 首次安装必须设置一下用户签名,否则无法提交代码。
注意:这里设置用户签名和将来登录 GitHub(或其他代码托管中心)的账号没有任何关系
初始化本地库
你要想使用git管理目录(项目代码所在目录)的话,就需要将目录的权限交给git,即初始化本地库。
git init
初始化本地库之后,会在目录中生成.git目录
查看本地库状态
git status
接着我们在项目目录中新增一个文件,此时再查看本地库状态,发现新增的文件还是红色的,代表该文件还未被追踪。
添加暂存区
git add 文件名
添加到暂存区后,此文件就会被开始追踪了(文件是绿色的)。
注意:上面的命令也提示我们,如果想要从暂存区中删除文件(只是暂存区中删除,工作区不会被删除),使用如下命令
git rm --cached 文件名
提交本地库
git commit -m "日志信息" 文件名
接着继续修改文件
查看历史版本
# 查看简要的历史版本日志
git reflog
# 查看详细的历史版本日志
git log
版本穿梭
如果对于想要退回到以前的版本,即修改HEAD指向的版本,则可以通过版本穿梭进行回退
git reset --hard 想要回退到的版本号
首先查看当前HEAD指向的版本,最新的版本
也可以打开.git目录中查看
发现最新的版本号就是上面通过git log命令查看的d55be83fa4595bed566ba33a599cf2da22007433
此时的版本号图如下图所示
此时我们想要版本穿梭到0b7a3b1703bf1130acfb53740e8d50af08ffde7f,即first commit
此时hello.txt中文件内容会发生改变,变成first commit中的内容,当然F:\pro_demo\.git\refs\heads\master中的当前版本号也会变成0b7a3b1703bf1130acfb53740e8d50af08ffde7f
此时的版本号图如下图所示
git分支操作
什么是分支
在版本控制过程中,同时推进多个任务,为每个任务,我们就可以创建每个任务的单独分支。使用分支意味着程序员可以把自己的工作从开发主线上分离开来,开发自己分支的时候,不会影响主线分支的运行。对于初学者而言,分支可以简单理解为副本,一个分支就是一个单独的副本。(分支底层其实也是指针的引用)
分支的好处
同时并行推进多个功能开发,提高开发效率。各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响。失败的分支删除重新开始即可。
分支操作
| 命令名称 | 作用 |
|---|---|
| git branch 分支名 | 创建分支 |
| git branch -v | 查看分支 |
| git checkout 分支名 | 切换分支 |
| git merge 分支名 | 把指定的分支合并到当前分支上 |
查看分支
git branch -v
创建分支
#创建新的分支,并将当前所在分支的内容复制一份
git branch 分支名
切换分支
git checkout 分支名
查看.git目录中的内容
发现当前HEAD指向了hot-fix分支了
分支目录中也多了一个hot-fix分支
分支之间是相互独立,互不影响的,即我在hot-fix分支上修改内容,提交的话,不会影响到主分支master。
合并分支
#把指定的分支合并到当前分支上
git merge 分支名
正常的合并
在刚刚创建的hot-fix分支中,修改hello.txt文件
接着切换回master分支,查看此时的hello.txt文件,发现还是原来的内容
然后合并hot-fix分支,合并成功
冲突合并
冲突产生的原因:合并分支时,两个分支在同一个文件的同一个位置有两套完全不同的修改。Git 无法替。我们决定使用哪一个。必须人为决定新代码内容。
首先我们在master分支,修改hello.txt文件
接着切换到hot-fix分支,修改hello.txt文件
然后切换回master分支,合并hot-fix分支
冲突产生的表现:后面状态为 MERGING,此时查看hello.txt文件
特殊符号:<<<<<<< HEAD 当前分支的代码 ======= 合并过来的代码 >>>>>>> hot-fix
最后vim hello.txt修改文件,合并hot-fix修改的内容
接着,想要提交的话,注意:此时使用 git commit 命令时不能带文件名
发现后面 MERGING 消失,变为正常
切换分支图示如下:
master、hot-fix 其实都是指向具体版本记录的指针。当前所在的分支,其实是由 HEAD决定的。所以创建分支的本质就是多创建一个指针。
-
HEAD如果指向master,那么我们现在就在master分支上。 -
HEAD如果执行hotfix,那么我们现在就在hotfix分支上。
所以切换分支的本质就是移动 HEAD 指针。
git团队协作机制
团队内协作
注意:令狐冲
clone代码之后,修改代码之后,想要push到远程库的话,提前是得先把令狐冲加入到团队成员中,才有权限push
跨团队协作
GitHub操作
GitHub 网址:github.com/
Ps:全球最大同性交友网站,技术宅男的天堂,新世界的大门,你还在等什么?
创建远程库
远程库操作
| 命令 | 作用 |
|---|---|
| git remote -v | 查看当前所有远程地址别名 |
| git remote add 别名 远程地址 | 起别名 |
| git push 别名 分支 | 推送本地分支上的内容到远程仓库 |
| git clone 远程地址 | 将远程仓库的内容克隆到本地 |
| git pull 远程库地址别名 远程分支名 | 将远程仓库对于分支最新内容拉下来后与当前本地分支直接合并 |
创建远程仓库别名
git remote -v 查看当前所有远程地址别名
git remote add 别名 远程地址
推送本地分支到远程仓库
git push 别名 分支
上面我们创建了远程库,但是此时远程库还没有代码,所以我们想把本地库代码推送到远程库
出现连接超时的话,重试几次。
此时发现已将我们 master 分支上的内容推送到 GitHub 创建的远程仓库。
克隆远程仓库到本地
克隆代码是不需要登录github的
git clone 远程地址
小结:clone 会做如下操作。1、拉取代码。2、初始化本地仓库。3、创建别名
邀请加入团队
我们知道想要其他人也拥有push代码到远程库的权限,需要邀请他加入团队。选择想要邀请的作者。
我们来模拟一下这个过程,首先在github再创建一个令狐冲账号。
接着邀请令狐冲加入项目合作者
复制地址 并通过微信,钉钉等方式发给令狐冲 , 复制内容如下 : github.com/yellowhs/pr…
接着登录令狐冲账号到github,打开复制的邀请链接,点击同意
同意之后,就可以看到
pro_demo远程仓库了
然后令狐冲修改本地库代码。
现在这种弹出框github不支持密码登录,需要通过token登录,可以参考文章:blog.csdn.net/qq_41646249…
跨团队协作
首先将远程仓库的地址复制发给邀请跨团队协作的人,比如东方不败。项目可以通过搜索的方式
也可以在东方不败的 GitHub 账号里的地址栏复制收到的链接,然后点击 Fork 将项目叉到自己的远程仓库。
接着我们为了简单演示,直接修改刚刚fork的远程库代码,当然正常的开发步骤是先clone到自己的本地库,修改代码,然后commit到自己本地库,然后再push到刚刚fork的远程库
接下来点击上方的 Pull Request 请求,并创建一个新的请求。
接着换账号登录,审核pull request代码
如果代码有问题的话,可以在添加评论,这样东方不败也能看到的
代码没有的话,可以点击直接合并
SSH 免密登录
之前使用HTTPS地址操作的时候,每次都需要登录,比较繁琐,我们可以看到远程仓库中还有一个 SSH 的地址,因此我们也可以使用 SSH 进行访问
我们先把本地的.ssh目录删了
然后在这个目录中打开git bash,执行命令
ssh-keygen -t rsa -C 自己的邮箱
然后查看发现当前目录重新生成了.ssh目录了
接着打开settings
复制公钥文件id_rsa.pub的内容,打开
接着我们来测试一下,之前我们合并过东方不败的pull request代码,我们本地库拉取一下