前言 视频1:快速学习
视频2:黑马程序员
命令练习
注: 此笔记在黑马程序员共享的资料基础上,加上自己的一些理解所写,不存在侵权。
1.学习目标
了解Git基本概念
能够概述git工作流程
能够使用Git常用命令
熟悉Git代码托管服务
能够使用idea操作git
学习Git,不依赖于任何的编程知识,且可以保存代码或者资料(相当于一个云盘,但比百度云盘这种更加的方便)
重点是要掌握使用idea操作Git,企业用的最多,一般不会去使用命令
2.概述 1. 开发中的实际场景 1 2 3 4 5 6 7 8 9 10 11 12 场景一:备份 小明负责的模块就要完成了,就在即将Release之前的一瞬间,电脑突然蓝屏,硬盘光荣牺牲!几个月 来的努力付之东流 场景二:代码还原 这个项目中需要一个很复杂的功能,老王摸索了一个星期终于有眉目了,可是这被改得面目全非的 代码已经回不到从前了。什么地方能买到哆啦A梦的时光机啊? 场景三:协同开发 小刚和小强先后从文件服务器上下载了同一个文件:Analysis.java。小刚在Analysis.java 文件中的第30行声明了一个方法,叫count(),先保存到了文件服务器上;小强在Analysis.java文件中的 第50行声明了一个方法,叫sum(),也随后保存到了文件服务器上,于是,count()方法就只存在于小刚的记 忆中了 场景四: 追溯问题代码的编写人和编写时间! 老王是另一位项目经理,每次因为项目进度挨骂之后,他都不知道该扣哪个程序员的工资!就拿这 次来说吧,有个Bug调试了30多个小时才知道是因为相关属性没有在应用初始化时赋值!可是二胖、王东、刘 流和正经牛都不承认是自己干的!
2. 版本控制器的方式 1 2 3 4 5 6 a、集中式版本控制工具 集中式版本控制工具,版本库是集中存放在中央服务器的,team里每个人work时从中央服务器下载代码,是必须联网才能工作,局域网或互联网。个人修改后然后提交到中央版本库。 举例:SVN和CVS b、分布式版本控制工具 分布式版本控制系统没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样工作的时候,无需联网了,因为版本库就在你自己的电脑上。多人协作只需要各自的修改推送给对方,就能互相看到对方的 修改了。举例:Git
集中式版本控制的缺点:
需要联网,中央服务器磁盘损坏,项目会彻底崩溃
3. Git Git是一个分布式版本管理系统,他通过共享版本库来共享版本信息,所以相当于每个开发人员的本地都有一个共享版本库的拷贝,所有人员的本地版本库和共享版本库都是同步的,所以不用担心共享版本库宕机的问题,只要拿一个开发人员的本地版本库传到共享版本库就好了,开发人员之间可以直接交换版本信息,但是这种方式不常用,我们一般还是通过共享版本库实现共享,这样所有的人员都可以共享到版本信息,无需联网了,因为版本库就在你自己的电脑上,但是要实现版本共享的时候还是需要联网的,自己开发的时候不需要联网。
4. Git工作流程
命令如下:
clone(克隆): 从远程仓库中克隆代码到本地仓库
checkout (检出):从本地仓库中检出一个仓库分支然后进行修订
add(添加): 在提交前先将代码提交到暂存区
commit(提交): 提交到本地仓库。本地仓库中保存修改的各个历史版本
fetch (抓取) : 从远程库,抓取到本地仓库,不进行任何的合并动作,一般操作比较少。
pull (拉取) : 从远程库拉到本地库,自动进行合并(merge),然后放到到工作区,相当于fetch+merge
push(推送) : 修改完成后,需要和团队成员共享代码时,将代码推送到远程仓库
3.Git安装与配置 本教程里的git命令例子都是在Git Bash中演示的,会用到一些基本的linux命令,在此为大家提前列举:
ls/ll 查看当前目录 ll是查看当前文件夹下的所有文件,包括隐藏文件
cat 查看文件内容
touch 创建文件
vi vi编辑器(使用vi编辑器是为了方便展示效果,可以记事本、editPlus、notPad++等其它编辑器)
1. 下载与安装 下载地址: https://git-scm.com/download
备注:
Git GUI:Git提供的图形界面工具
Git Bash:Git提供的命令行工具
当安装Git后首先要做的事情是设置用户名称和email地址。这是非常重要的,因为每次Git提交都会使用该用户信息
Git版本控制要记录哪个人什么时候做了什么事情,Git就是通过邮箱去辨识是哪个人的
2. 基本配置
打开Git Bash
设置用户信息
git config –global user.name “hbk”
git config –global user.email “hello@itcast.cn ”
注:邮箱可以是假邮箱
查看配置信息
git config –global user.name
git config –global user.email
1. 为常用指令配置别名(可选) 有些常用的指令参数非常多,每次都要输入好多参数,我们可以使用别名。
打开用户目录,创建 .bashrc 文件
打开Git Bash,执行 touch ~/.bashrc
在 .bashrc 文件中输入如下内容:
1 2 3 4 5 #用于输出git提交日志 alias git-log='git log --pretty=oneline --all --graph --abbrev-commit' #用于输出当前目录所有文件及基本信息 alias ll='ls -al'
打开Git Bash,执行 source ~/.bashrc
2. 解决GitBash乱码问题(可选)
打开GitBash执行下面命令
1 git config --global core.quotepath false
${git_home}/etc/bash.bashrc 文件最后加入下面两行
1 2 export LANG="zh_CN.UTF-8" export LC_ALL="zh_CN.UTF-8"
4.Git本地仓库 要使用Git对我们的代码进行版本控制,首先需要获得本地仓库
1 2 3 4 5 6 7 8 1)在电脑的任意位置创建一个空目录,作为我们的本地Git仓库 2)进入这个目录中,点击右键打开Git Bash窗口 3)执行命令 git init 4)如果创建成功后,可在文件夹下看到隐藏的.git目录。
1. 基础操作命令(重要) Git工作目录下对于文件的修改 (增加、删除、更新)会存在几个状态,这些修改 的状态会随着我们执行Git的命令而发生变化。
工作区,就是平时存放项目代码的地方。
git add (工作区 –> 暂存区)
git commit (暂存区 –> 本地仓库)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 命令: 1.工作区 --> 暂存区(包括.gitignore和以点开头的任何其他内容) git add . 2.暂存区 --> 本地仓库 git commit -m "注释内容" 3.查看修改的状态 git status 4.查看提交日志 git log [option] options: --all 显示所有分支 --pretty=oneline 将提交信息显示为一行 --abbrev-commit 使得输出的commitId更简短 --graph 以图的形式显示 注:配置别名为git-log,然后加上所有参数即可 5.版本回退 git reset --hard commitID 注:commitID 可以使用 git-log 或 git log 指令查看 6.查看已经删除的记录 git reflog 7.添加文件至忽略列表 工作目录中创建一个名为 .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
练习:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 #####################仓库初始化###################### # 创建目录(git_test01)并在目录下打开gitbash 略 # 初始化git仓库 git init #####################创建文件并提交##################### # 目录下创建文件 file01.txt touch ~/file01.txt # 将修改加入暂存区 git add . # 将修改提交到本地仓库,提交记录内容为:commit 001 git commit -m 'commit 001' # 查看日志 git log ####################修改文件并提交###################### # 修改file01的内容为:count=1 vim file01 # 将修改加入暂存区 git add . # # 将修改提交到本地仓库,提交记录内容为:update file01 git commit -m 'update file01' # 查看日志 git log # 以精简的方式显示提交记录 git-log ####################将最后一次修改还原################## # 查看提交记录 git-log # 找到倒数第2次提交的commitID 略 # 版本回退 git reset commitID --hard
2. 分支 几乎所有的版本控制系统都以某种形式支持分支。 使用分支意味着你可以把你的工作从开发主线上分离 开来进行重大的Bug修改、开发新的功能,以免影响开发主线。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1.查看本地分支 git branch 2.创建本地分支 git branch 分支名 3.切换分支(checkout) git checkout 分支名 4.创建并切换分支(相当于2,3) git checkout -b 分支名 5.合并分支(merge):先到目标分支上 git merge 分支名称 6.删除分支:不能删除当前分支,只能删除其他分支 git branch -d b1 删除分支时,需要做各种检查 git branch -D b1 不做任何检查,强制删除
解决冲突 当两个分支上对文件的修改可能会存在冲突,例如同时修改了同一个文件的同一行,这时就需要手动解决冲突,解决冲突步骤如下:
其实我们就是直接手动去删除文件中的一个分支,留下一个分支,这样就不会冲突了
处理文件中冲突的地方
将解决完冲突的文件加入暂存区(add)
提交到仓库(commit)
开发中分支使用原则与流程
master (生产) 分支
线上分支,主分支,中小规模项目作为线上运行的应用对应的分支;
develop(开发)分支
是从master创建的分支,一般作为开发部门的主要开发分支,如果没有其他并行开发不同期上线。要求,都可以在此版本进行开发,阶段开发完成后,需要是合并到master分支,准备上线。
注:develop和master分支是不可删除的
feature/xxxx分支(用完可删)
从develop创建的分支,一般是同期并行开发,但不同期上线时创建的分支,分支上的研发任务完成后合并到develop分支,用完后可删除。
hotfifix/xxxx分支
从master派生的分支,一般作为线上bug修复使用,修复测试完成后需要合并到master、test、develop分支。
还有一些其他分支,在此不再详述,例如test分支(用于代码测试)、pre分支(预上线分支)等等。
3. 练习 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 ##########################创建并切换到dev01分支,在dev01分支提交 # [master]创建分支dev01 git branch dev01 # [master]切换到dev01 git checkout dev01 # [dev01]创建文件file02.txt touch ~/file02.txt # [dev01]将修改加入暂存区并提交到仓库,提交记录内容为:add file02 on dev git add . git commit -m 'add file02 on dev' # [dev01]以精简的方式显示提交记录 git-log ###########################切换到master分支,将dev01合并到master分支 # [dev01]切换到master分支 git checkout master # [master]合并dev01到master分支 git merge dev01 # [master]以精简的方式显示提交记录 git-log # [master]查看文件变化(目录下也出现了file02.txt) 略 ##########################删除dev01分支 # [master]删除dev01分支 git branch -d dev01 # [master]以精简的方式显示提交记录 git-log
5.Git远程仓库(GitHub) 1. 连接远程仓库 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 1.配置SSH密钥 ssh-keygen -t rsa 一直回车 2.cat ~/.ssh/id_tsa.pub 复制到GitHub的SSH公钥中 3.验证是否配置成功 ssh -T git@github.com 4.添加远程仓库 git remote add origin git@gitee.com:czbk_zhang_meng/git_test.git 5.查看远程仓库 git remote 6.推送到远程仓库 git push [-f] [--set-upstream] [远端名称 [本地分支名][:远端分支名] ] 如果远程分支名和本地分支名称相同,则可以只写本地分支 git push origin master -f 表示强制覆盖 --set-upstream 推送到远端的同时并且建立起和远端分支的关联关系。 git push --set-upstream origin master 如果当前分支已经和远端分支关联,则可以省略分支名和远端名。 git push 将master分支推送到已关联的远端分支。 7.本地分支与远程分支的关联关系 git branch -vv 8.从远程仓库克隆 git clone <仓库路径> [本地目录] 本地目录可以省略,会自动生成一个目录 9.从远程仓库中抓取和拉取 抓取:将仓库里的更新都抓取到本地,不会进行合并 git fetch [remote name] [branch name] 如果不指定远端名称和分支名,则抓取所有分支。 拉取: git pull [remote name] [branch name] 拉取指令就是将远端仓库的修改拉到本地并自动进行合并,等同于fetch+merge 如果不指定远端名称和分支名,则抓取所有并更新当前分支。
2. 解决合并冲突 在一段时间,A、B用户修改了同一个文件,且修改了同一行位置的代码,此时会发生合并冲突。 A用户在本地修改代码后优先推送到远程仓库,此时B用户在本地修订代码,提交到本地仓库后,也需要 推送到远程仓库,此时B用户晚于A用户,故需要先拉取远程仓库的提交,经过合并后才能推送到远端分 支,如下图所示。
在B用户拉取代码时,因为A、B用户同一段时间修改了同一个文件的相同位置代码,故会发生合并冲突。
远程分支也是分支,所以合并时冲突的解决方式也和解决本地分支冲突相同相同,在此不再赘述,需要自己练习。
3. 练习 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 #########################1-将本地仓库推送到远程仓库 # 完成4.1、4.2、4.3、4.4的操作 略 # [git_test01]添加远程仓库 git remote add origin git@gitee.com/**/**.git # [git_test01]将master分支推送到远程仓库,并与远程仓库的master分支绑定关联关系 git push --set-upstream origin master ###########################2-将远程仓库克隆到本地 # 将远程仓库克隆到本地git_test02目录下 git clone git@gitee.com/**/**.git git_test02 # [git_test02]以精简的方式显示提交记录 git-log ###########################3-将本地修改推送到远程仓库 # [git_test01]创建文件file03.txt 略 # [git_test01]将修改加入暂存区并提交到仓库,提交记录内容为:add file03 git add . git commit -m 'add file03' # [git_test01]将master分支的修改推送到远程仓库 git push origin master ###########################4-将远程仓库的修改更新到本地 # [git_test02]将远程仓库修改再拉取到本地 git pull # 以精简的方式显示提交记录 git-log # 查看文件变化(目录下也出现了file03.txt) 略