Git分布式版本控制工具(B站黑马)学习笔记
Git Bash:Git提供的命令行工具 (相当于内置了一个小的Linux)
因为使用Git Bash是Git提供的命令行工具 (相当于内置了一个小的Linux),会用到一些基本的Linux命令,例如:
Git和GitHub是什么,有什么用
Git是目前最主流的分布式版本控制系统。版本控制系统(VCS)可以帮你保存文件的所有修改记录,并使用版本号进行区分。你可以随时浏览历史版本将改错的文件还原到指定的版本还可以对比不同版本的文件差异起到恢复和保护的作用。例如:备份、代码还原、协同开发、追溯问题代码的编写人和编写时间
GitHub是主流的代码托管平台,可以理解为存放和管理代码的网盘,大家可以把自己的代码传上去进行共享和维护,当然也可以从平台下载代码。
注意不要把两者搞混,Git是工具是抓手,而GitHub是平台,两者没有必然的联系。
那为什么要用Git和GitHub呢,要知道Git最开始就是Linux之父为了更好管理Linux的内核开发而创立的。假设有100个人要共同开发一个大型项目,怎么保证大家的代码不重复又能共享呢?难道把代码都放到u盘里拷来拷去,或者口口相传说什么,哎 今天我李某要改这个文件你们其他同学别跟我抢,都别改。这肯定不行是吧。所以分布式版本控制系统和代码托管平台出现了,大家可以把项目代码放到代码托管平台上每个人都从上面下载代码,然后在自己的电脑改代码,维护自己的版本。最后在发布前在把大家不同版本的代码合到一起上传到平台就可以了,非常的方便和高效。公司为了安全一般都会有自己的代码托管平台。而GitHub是开源的,大家都能共享这上面的代码,免费学习和参与知名项目。这就是我们为什么要用Git和GitHub了。
以上出自 程序员鱼皮:团队开发神器 Git 自学指南,几分钟掌握学习重点 #程序员 #编程
Git
git官网:https://git-scm.com/download
安装完成后在电脑桌面右键,出现如下两个菜单则安装成功
备注:
Git GUI:Git提供的图形界面工具
Git Bash:Git提供的命令行工具 (相当于内置了一个小的Linux)
注意:记得设置用户名称和email,这很重要,因为每次Git提交都会使用该用户信息
配置用户名及email:
git config --global user.name pgw
git config --global user.email [email protected]
查看配置信息
git config --global user.name
git config --global user.email
有些常用的指令参数非常多,每次都要输入好多参数,我们可以使用别名。
部分windows系统不允许用户创建点号开头的文件,可以打开gitBash,执行 touch ~/.bashrc
#用于输出git提交日志
alias git-log='git log --pretty=oneline --all --graph --abbrev-commit'
#用于输出当前目录所有文件及基本信息
alias ll='ls -al'
要使用Git对我们的代码进行版本控制,首先需要获得本地仓库
1)在电脑的任意位置创建一个空目录(例如test)作为我们的本地Git仓库
2)进入这个目录中,点击右键打开Git bash窗口
3)执行命令git init
4)如果创建成功后可在文件夹下看到隐藏的.git目录。
Git工作目录下(获取本地仓库后除了.git文件,其它都是工作目录)对文件的修改(增加、删除、更新)会存在几个状态,这些修改的状态会随着Git的指令而发生变化。
控制状态之间转换的指令:
查看提交记录
命令: git log [option]
通过别名方式查看(设置别名查看上方 为常用指令配置别名)
版本切换
命令: git reset --hard commitID 提交id
查看已经删除的记录(如果版本回退后又clear清除了页面,就看不到回退前的id了,所以要查看已经删除的记录)
一般我们总会有些文件无需纳入Git 的管理,也不希望它们总出现在未跟踪文件列表。 通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等。 在这种情况下,我们可以在工作目录中创建一个名为 .gitignore 的文件(文件名称固定),列出要忽略的文件模式。下面是一个示例:
# no .a files
*.a
# but do track lib.a, even though you're ignoring .a files above
!lib.a
# only ignore the TODO file in the current directory, not subdir/TODO
/TODO
# ignore all files in the build/ directory
build/
# ignore doc/notes.txt, but not doc/server/arch.txt
doc/*.txt
# ignore all .pdf files in the doc/ directory
doc/**/*.pdf
什么是分支
在多人协作开发项目时,不同成员负责的功能不同,为了不受其他开发人员的影响,我们可以在主分支上建立自己专用的分支。完成工作后,将自己分支的修改合并到主分支。因为每一次提交的历史记录都会被保存,所以当发生问题时,定位和修改造成问题的提交就容易多了,而且这样每个人负责自己的分支从而不受其它分支的影响。
HEAD指向的是现在使用中的分支的最后一次更新。通常默认指向master分支的最后一次更新。通过移动HEAD,就可以变更使用的分支。
因为新建了一条分支,所以会有两个提交(相当于你要在这个基础上写别的,新建的分支要有前面的内容)
我们还可以直接切换到一个不存在的分支(创建并切换)
在分支上操作不会影响其它分支,例如下方 master 分支新建了 .gitignore 文件,提交后切换到 dev01 分支后,在此分支时看不到 .gitignore 文件的
查看提交日志 master 提交了 .gitignore 文件(HEAD指向当前使用分支)
一般都将分支合并到master分支,例如在dev01分支新建 file02.txt 后提交
切换为master分支合并dev01分支,输入git merge dev01会弹出vi编辑器,按Esc健后输入“ :wq ” 退出
分支合并成功
不能删除当前分支,只能删除其他分支
冲突
当两个分支上对文件的修改可能会存在冲突,例如同时修改了同一个文件的同一行,这时就需要手动解决冲突。
解决冲突步骤:
当两个分支修改同一个文件,发现修改了同一个地方不同的内容。比如dev01修改为count=2,master修改为count=3,将dev合并到master后就会产生冲突。
解决办法:
合并分支
将dev01合并到master后会出现如下图所示,将文件修改成想要的样子再通过master提交。
合并后file01.txt文件,会出现两个文件相冲突的地方,自动用"===="区分
处理文件中冲突的地方(将文件修改成想要的样子)然后提交
提交可以加-m指定一个注释,也可以不加,它会自动生成
回车后会弹出vi编辑器,按Esc健后输入“ :wq ” 退出
几乎所有的版本控制系统都以某种形式支持分支。 使用分支意味着你可以把你的工作从开发主线上分离开来进行重大的Bug修改、开发新的功能,以免影响开发主线。
在开发中,一般有如下分支使用原则与流程:
线上分支,主分支,中小规模项目作为线上运行的应用对应的分支;
develop(开发)分支
是从master创建的分支,一般作为开发部门的主要开发分支,如果没有其他并行开发不同期上线要求,
都可以在此版本进行开发,阶段开发完成后,需要是合并到master分支,准备上线。
从develop创建的分支,一般是同期并行开发,但不同期上线时创建的分支,分支上的研发任务完成后
合并到develop分支。
从master派生的分支,一般作为线上bug修复使用,修复完成后需要合并到master、test、develop分支
master分支是主分支,是线上发布的分支。上线代码必须是从master分支上线,其它分支是不可能上线的。
develop(开发分支),这是开发过程中的主要分支,它可以根据项目功能开发的分出不同的feature分支。feature分支功能开发完成后合并到develop分支,合并后记得删除对应feature分支(因为功能完成不需要了)
常用的托管服务【远程仓库】
前面我们已经知道了Git中存在两种类型的仓库,即本地仓库和远程仓库。那么我们如何搭建Git远程仓库呢?我们可以借助互联网上提供的一些代码托管服务来实现,其中比较常用的有GitHub、码云、GitLab等。
gitHub( 地址:https://github.com/ )是一个面向开源及私有软件项目的托管平台,因为只支持Git 作为唯一的版本库格式进行托管,故名gitHub
码云(地址: https://gitee.com/ )是国内的一个代码托管平台,由于服务器在国内,所以相比于GitHub,码云速度会更快
GitLab (地址: https://about.gitlab.com/ )是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务,一般用于在企业、学校等内部网络搭建git私服。gitHub跟码云都是把代码放到别人的服务器上进行托管,这样无法保障安全。GitLab就是自己搭建的一个代码管理的托管服务,所以一般用于在企业、学校等内部网络搭建git私服。
要想使用码云的相关服务,需要注册账号(地址: https://gitee.com/signup )
仓库创建完成后可以看到仓库地址,如下图所示:
在git中clone项目有两种方式:HTTPS和SSH,它们的区别如下:
HTTPS:不管是谁,拿到url随便clone,但是在push的时候需要验证用户名和密码。
SSH:clone的项目你必须是拥有者或者管理员,而且需要在clone前添加SSH Key。SSH 在push的时候,是不需要输入用户名的,如果配置SSH key的时候设置了密码,则需要输入密码的,否则直接是不需要输入密码的。
仓库推送,推送仓库不是随意人员就可以的,码云会确认推送着是否为本人,有几种方案:1.输入码云的登录用户名密码——https 2.公私钥对——ssh 一般情况使用第二种公私钥对,所以需要配置公私钥对
生成SSH公钥
ssh-keygen -t rsa (Git Bash输入生成身份验证密钥)
全部回车,采用默认值
验证是否配置成功
输入后会出现提示,第一次访问gitee.com,?后输入yes即可
这里之所以设置Gitee密钥原因是,通过非对称加密的公钥与私钥来完成加密,公钥放置在Gitee上,私钥放置在自己的电脑里。Gitee要求每次推送代码都是合法用户,所以每次推送都需要输入账号密码验证推送用户是否是合法用户,为了省去每次输入密码的步骤,采用了ssh,当你推送的时候,git就会匹配你的私钥跟Gitee上面的公钥是否是配对的,若是匹配就认为你是合法用户,则允许推送。这样可以保证每次的推送都是正确合法的。
此操作是先初始化本地库,然后与已创建的远程库进行对接
命令: git remote add <远端名称> <仓库路径>
命令:git push [-f] [–set-upstream] [远端名称 [本地分支名][:远端分支名] ]
如果远程分支名和本地分支名称相同,则可以只写本地分支
-f 表示强制覆盖(如果本地代码和云端代码修改了同一个东西产生冲突,不让推送,可以使用-f强制覆盖,以提交的为准)
–set-upstream 推送到远端的同时并且建立起和远端分支的关联关系。(远端分支与本地分支进行关联)
如果当前分支已经和远端分支关联,则可以省略分支名和远端名。
关联前:
使用–set-upstream关联后:
命令:git clone <仓库路径> [本地目录]
远程分支和本地的分支一样,我们可以进行merge操作,只是需要先把远端仓库里的更新都下载到本地,再进行操作。
抓取 命令:git fetch [remote name] [branch name]
02Git_demo推送file03.txt
01Git_demo使用fetch抓取命令
远端分支也是分支,执行抓取后还未与本地master合并,所以本地还看不到file03.txt
合并本地和远端分支
拉取 命令:git pull [remote name] [branch name]
02Git_demo推送file04.txt
01Git_demo使用pull拉取命令 自动合并本地和远端分支
在一段时间,A、B用户修改了同一个文件,且修改了同一行位置的代码,此时会发生合并冲突
A用户在本地修改代码后优先推送到远程仓库,此时B用户在本地修订代码,提交到本地仓库后,也需要推送到远程仓库,此时B用户晚于A用户,故需要先拉取远程仓库的提交,经过合并后才能推送到远端分支,如下图所示。
在B用户拉取代码时,因为A、B用户同一段时间修改了同一个文件的相同位置代码,故会发生合并冲突。
远程分支也是分支,所以合并时冲突的解决方式也和解决本地分支冲突相同相同。(冲突的地方会用’==='区分,改成想要的样子提交再推送即可)
安装好IntelliJ IDEA后,如果Git安装在默认路径下,那么idea会自动找到git的位置,如果更改了Git的安装位置则需要手动配置下Git的路径。选择File→Settings打开设置窗口,找到Version Control下的git选项:
成功初始化导航栏会出现这个
安装.ignore插件
自定义.gitignore文件模板
# Created by .ignore support plugin (hsz.mobi)
### Java template
# 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
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
### Maven template
target/
pom.xml.tag
pom.xml.releaseBackup
pom.xml.versionsBackup
pom.xml.next
release.properties
dependency-reduced-pom.xml
buildNumber.properties
.mvn/timing.properties
# https://github.com/takari/maven-wrapper#usage-without-binary-jar
.mvn/wrapper/maven-wrapper.jar
idea把工作区和暂存区归一起了,只需全选提交即可
两次弹窗点击提交commit
提交成功
推送成功
原则:工作第一件事pull
模拟冲突:两个成员修改了同一处的代码,成员1先提交推送了,成员2还没提交。推送解决办法:成员2先提交到本地仓库,进行拉取pull操作。在本地解决完冲突在进行推送
成员1修改后提交推送内容
成员2也在同一处修改内容
解决:
成员2先提交到本地仓库
执行拉取pull操作
手动合并,并重新加入暂存区
冲突解决,成员2进行推送
成员1重新拉取
如果当两个人修改了同一个地方,成员1提交推送了,成员2也提交推送,这是会弹出解决冲突合并的提示,如下图。解决办法同上。
总结:工作前第一件是就是pull
创建分支
常规方式
最强大的方式
切换分支及其它分支相关操作
该内容是根据B站黑马程序员学习时所记,相关资料可在B站查询:黑马程序员Git全套教程,完整的git项目管理工具教程,一套精通git