前言
- 该笔记是本人经过学习黑马程序员课程及个人学习之后,根据自己理解的知识架构整理的笔记。
- 笔记目录即为整理的本人认为最好理解的知识架构的体现。可以先初步浏览判断适不适合自己
- 本套笔记适合已完全理解git工作流程,掌握git基本命令的朋友整理、复习使用
一、目标
- 了解Git基本概念
- 能够概述git工作流程
- 能够使用Git常用命令
- 熟悉Git代码托管服务
- 能够使用idea操作git
二、概述
2.1 开发中的实际场景
场景一:备份
小明负责的模块就要完成了,就在即将Release之前的一瞬间,电脑突然蓝屏,硬盘光荣牺牲!几个月来的努力付之东流
场景二:代码还原
这个项目中需要一个很复杂的功能,老王摸索了一个星期终于有眉目了,可是这被改得面目全非的代码已经回不到从前了。什么地方能买到哆啦A梦的时光机啊?
场景三:协同开发
小刚和小强先后从文件服务器上下载了同一个文件:Analysis.java。小刚在Analysis.java文件中的第30行声明了一个方法,叫count(),先保存到了文件服务器上;小强在Analysis.java文件中的第50行声明了一个方法,叫sum(),也随后保存到了文件服务器上,于是,count()方法就只存在于小刚的记忆中了
场景四:追溯问题代码的编写人和编写时间!
老王是另一位项目经理,每次因为项目进度挨骂之后,他都不知道该扣哪个程序员的工资!就拿这次来说吧,有个Bug调试了30多个小时才知道是因为相关属性没有在应用初始化时赋值!可是二胖、王东、刘流和正经牛都不承认是自己干的!
2.2 版本控制器方式
a、集中式版本控制工具
集中式版本控制工具,版本库是集中存放在中央服务器的,team里每个人work时从中央服务器下载代码,是必须联网才能工作,局域网或互联网。个人修改后然后提交到中央版本库。
举例:SVN和CVS
b、分布式版本控制工具
分布式版本控制系统没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样工作的时候,无需要联网了,因为版本库就在你自己的电脑上。多人协作只需要各自的修改推送给对方,就能互相看到对方的修改了。
举例:Git
2.3 SVN
2.4 Git介绍
Git是分布式的,Git不需要有中心服务器,我们每台电脑拥有的东西都是一样的。我们使用Git并且有个中心服务器,仅仅是为了方便交换大家的修改,但是这个服务器的地位和我们每个人的PC是一样的。我们可以把它当做一个开发者的pc就可以就是为了大家代码容易交流不关机用的。没有它大家一样可以工作,只不过“交换”修改不方便而已。
git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。Git是Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。同生活中的许多伟大事物一样,Git 诞生于一个极富纷争大举创新的年代。Linux 内核开源项目有着为数众多的参与者。 绝大多数的 Linux 内核维护工作都花在了提交补丁和保存归档的繁琐事务上(1991-2002年间)。 到 2002 年,整个项目组开始启用一个专有的分布式版本控制系统 BitKeeper 来管理和维护代码。
到了 2005 年,开发 BitKeeper 的商业公司同 Linux 内核开源社区的合作关系结束,他们收回了Linux 内核社区免费使用 BitKeeper 的权力。 这就迫使 Linux 开源社区(特别是 Linux 的缔造者Linus Torvalds)基于使用 BitKeeper 时的经验教训,开发出自己的版本系统。 他们对新的系统制订了若干目标:
速度
简单的设计
对非线性开发模式的强力支持(允许成千上万个并行开发的分支)
完全分布式
有能力高效管理类似 Linux 内核一样的超大规模项目(速度和数据量)
2.4.1 仓库
- Workspace:工作区,就是你平时存放项目代码的地方
- Index / Stage:暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息
- Repository:仓库区(或本地仓库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本
- Remote:远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换
2.4.2 远程仓库
- 常用的托管服务
前面我们已经知道了Git中存在两种类型的仓库,即本地仓库和远程仓库。那么我们如何搭建Git远程仓库呢?我们可以借助互联网上提供的一些代码托管服务来实现,其中比较常用的有GitHub、码云、GitLab等。
gitHub( 地址:https://github.com/ )是一个面向开源及私有软件项目的托管平台,因为只支持Git 作为唯一的版本库格式进行托管,故名gitHub
码云(地址: https://gitee.com/ )是国内的一个代码托管平台,由于服务器在国内,所以相比于GitHub,码云速度会更快
GitLab (地址: https://about.gitlab.com/ )是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务,一般用于在企业、学校等内部网络搭建git私服。
- 配置SSH公钥
1.进入 C:\Users\Administrator\.ssh 目录
2.生成公钥:ssh-keygen -t rsa
3.将公钥信息public key 添加到码云账户中
-
团队内协作
- 邀请队员
-
跨团队协作
-
fork仓库
-
创建一个Pull requests请求
-
同意合并
-
2.4.3 工作流程
- clone(克隆): 从远程仓库中克隆代码到本地仓库
- checkout (检出):从本地仓库中检出一个仓库分支然后进行修订
- add(添加): 在提交前先将代码提交到暂存区
- commit(提交): 提交到本地仓库。本地仓库中保存修改的各个历史版本
- fetch (抓取) : 从远程库,抓取到本地仓库,不进行任何的合并动作,一般操作比较少。
- pull (拉取) : 从远程库拉到本地库,自动进行合并(merge),然后放到到工作区,相当于fetch+merge
- push(推送) : 修改完成后,需要和团队成员共享代码时,将代码推送到远程仓库
三、Git安装
3.1 下载与安装
- Git官方下载
- 没有特殊需求直接默认安装。
3.2 基本配置
--------------------------------------------------F:\Git\etc\gitconfig
git config -l 查看配置
git config --system --list 查看系统配置
git config --global --list 查看用户(global)配置
3.2.1 设置用户信息
--------------------------------------------------C:\Users\李泽伟\.gitconfig
git config --global user.name “李泽伟”
git config --global user.email "Lizewei2105@163.com"
3.2.2 配置指令别名
--------------------------------------------------1.创建文件:C:\Users\李泽伟\.bashrc
#用于输出git提交日志
alias git-log='git log --pretty=oneline --all --graph --abbrev-commit'
#用于输出当前目录所有文件及基本信息
alias ll='ls -al'
--------------------------------------------------2.运行:source C:\Users\李泽伟\.bashrc
3.2.3 解决GitBash乱码问题
--------------------------------------------------1.打开gitBash执行下面命令
git config --global core.quotepath false
--------------------------------------------------2.修改文件: F:\Git\etc\bash.bashrc ,文件最后加入下面两行
export LANG="zh_CN.UTF-8"
export LC_ALL="zh_CN.UTF-8"
3.2.4 配置忽略文件
-
创建文件:F:\Git\git.ignore
# Compiled class file *.class build/ # Log file *.log # Package Files # *.jar *.war *.nar *.ear *.zip *.tar.gz *.rar target/ # IDEA .idea/ .idea *.iml *.ipr *.iws .classpath .project .settings/ bin/ # no files *.a !lib.a /TODO doc/*.txt doc/**/*.pdf
-
配置:C:\Users\李泽伟\.gitconfig
[user] name = “李泽伟” email = Lizewei2105@163.com [core] excludesfile = F:/Git/git.ignore
四、仓库
4.1 本地
4.1.1 基本命令
---------------------------------------------初始化、状态、日志---------------------------------------------
git init 初始化本地库
git status 查看本地状态(暂存区、工作区)
git show <标签名/版本号> 显示对应的提交信息
git log [option] 查看提交记录详细信息(当前分支所在版本为止的)
--all 显示所有
--pretty=oneline 一行显示,省略提交日期和提交人。
--abbrev-commit 缩短版本号
--graph 图形化,不按时间展示
--follow <文件名> 指定文件
git reflog 查看版本记录(不包括提交人和日期,所有版本)
--------------------------------------------------提交-----------------------------------------------------
git add <.>/<文件名> 添加到暂存区
git commit -m <"注释信息"> 提交到本地仓库的当前分支
-a 添加到暂存区然后提交(存在Untracked状态的文件则无法使用)
4.1.2 撤销命令
--------------------------------------------------撤销-----------------------------------------------------
git commit --amend -m <"修改注释信息"> 修改当前分支上一次提交的注释、
git restore <文件名> 撤销工作区的更改(与暂存区比较)
--staged:撤销暂存区的更改(与HEAD本地仓库比较,保留工作区)
git checkout -- <./文件名> 丢弃工作区的更改(与暂存区比较)
--------------------------------------------------删除,需要提交---------------------------------------------
git rm <文件名> 删除工作区和暂存区中的文件。
-f:强制删除
--cached:只删除暂存区中的文件
-r:删除文件夹中的文件
--------------------------------------------------回退-----------------------------------------------------
git revert <版本号> 提交新版本来回退到指定版本
git reset [--hard] <版本号> 回到之前提交的版本
--soft:保留工作区、暂存区
--mixed:保留工作区。默认参数
--hard:重置HEAD(本地仓库)、工作区、暂存区
4.2 远程
git remote add <别名> <仓库地址> 添加
别名:默认oigin,由远程仓库设置
git remote 查看
-v 显示详情
git remote rm <别名> 删除
五、分支
5.1 本地
--------------------------------------------------增删改查--------------------------------------------------
git branch 查看所有本地分支
-r 查看所有远程分支
-v 显示详情(版本号、注释)
git branch <分支名> 创建分支
git branch -d <分支名> 删除分支(做各种检查),无法删除当前分支
-D 强制删除(不做检测)
-r 删除远程分支
--------------------------------------------------[标签]切换------------------------------------------------
git checkout <分支名>/<版本号> 切换分支/切换版本(切换前需要先提交,否则修改内容可能会与目标分支产生冲突导致切换报错)
-b 创建并切换
--------------------------------------------------分支差异--------------------------------------------------
git diff <分支1/版本1> <分支2/版本2> 显示差异
--------------------------------------------------分支合并--------------------------------------------------
git rebase <分支>
git merge <b分支>/<版本号> 将b分支合并a分支到版本3。(没有冲突自动执行提交,有冲突需要解决后手动提交)
b分支可以通过merge <版本3>提升到版本3
-解决冲突:
1. 手动修改冲突的文件。
2. 添加到暂存区:add。
3. 添加到本地仓库:commit
5.2 远程
提示:远程分支和本地的分支一样,我们可以进行merge操作,只是需要先把远端仓库里的更新都下载到本地,再进行操作。
--------------------------------------------------查看----------------------------------------------------
git branch -vv 查看关联关系
--------------------------------------------------拉下来--------------------------------------------------
git clone [-b <分支名>] <远程地址> [本地目录] 克隆远程仓库
[-b <分支名>]:指定分支名
git fetch [--set-upstream] [别名/远程地址] [远程分支名] 抓取最新内容到远程分支
--set-upstream:建立与远程分支的关联关系
[别名/远程地址]:不指定则抓取所有
[远程分支名]:不指定则抓取所有
git pull [别名/远程地址] [远程分支名](fetch+merge) 拉取最新内容到本地分支和远程分支
[别名/远程地址]:不指定则拉取所有
[远程分支名]:不指定则拉取所有
--------------------------------------------------推上去--------------------------------------------------
git push [-u] [--all] [--force] [--set-upstream] [远端名称 [本地分支名][:远端分支名] ] 推送到远程分支
-u:设置默认远程主机,如果存在多个远程主机关系
--all:不管是否存在,将本地所有分支推送到远程
--force:省略pull,强制push
--set-upstream:建立与远程分支的关联关系
[本地分支名]省略:相当于推送空分支到远程分支,即删除远程分支(远程分支只剩一个时无法删除)
[:远端分支名]省略:存在追踪关系->同名分支(没有就创建)
[远端名称]省略:当前分支只存在一个远程分支
5.3 使用原则与流程
几乎所有的版本控制系统都以某种形式支持分支。 使用分支意味着你可以把你的工作从开发主线上分离开来进行重大的Bug修改、开发新的功能,以免影响开发主线。
在开发中,一般有如下分支使用原则与流程:
- master (生产) 分支
- 线上分支,主分支,中小规模项目作为线上运行的应用对应的分支;
- develop(开发)分支
- 是从master创建的分支,一般作为开发部门的主要开发分支,如果没有其他并行开发不同期上线要求,都可以在此版本进行开发,阶段开发完成后,需要是合并到master分支,准备上线。
- feature/xxxx分支
- 从develop创建的分支,一般是同期并行开发,但不同期上线时创建的分支,分支上的研发任务完成后合并到develop分支。
- hotfix/xxxx分支,
- 从master派生的分支,一般作为线上bug修复使用,修复完成后需要合并到master、test、develop分支。
- 还有一些其他分支,在此不再详述,例如test分支(用于代码测试)、pre分支(预上线分支)等等。
六、标签
6.1 本地
--------------------------------------------------查看--------------------------------------------------
git tag 查看所有本地标签
-l [通配符*]:根据通配符筛选
--list [通配符*]:根据通配符筛选
--------------------------------------------------创建--------------------------------------------------
git tag <标签名> [版本号] 为最新提交创建【轻量标签】
[版本号]:指定版本
git tag -a <标签名> [版本号] -m <附注信息> 给当前的提交版本创建一个【附注标签】
[版本号]:指定版本
--------------------------------------------------删除--------------------------------------------------
git tag -d <标签名> 删除标签
--------------------------------------------------检出--------------------------------------------------
git checkout -b 分支名称 标签名称 以标签指定的版本的基础上创建分支
6.2 远程
--------------------------------------------------推上去--------------------------------------------------
git push origin 标签名称 将指定的标签上传到远程仓库
git push origin --tags 将所有不在远程仓库中的标签上传到远程仓库
--------------------------------------------------删除掉--------------------------------------------------
git push origin :regs/tags/标签名称
git push origin --delete 标签名称
七、在IDEA中使用
7.1 配置Git
7.2 操作Git
7.3 常用的操作入口
7.3.1 仓库初始化
7.3.2 拉取推送
7.3.3 分支、版本
7.4 场景分析
7.5 集成GitBash
八、注意事项
- 切换分支前先提交本地的修改
- 代码及时提交,提交过了就不会丢
- pull后(本地分支版本比远程分支低):本地分支 git merge 远程分支
- commit后(本地分支版本比远程分支高):本地分支 git push 远程分支
- push:无法推送低版本的到高版本,只能合并或切换版本形成高版本记录后才能推送。
- clone远程仓库:克隆一个分支,分支默认绑定。
- push远程新分支:没有绑定
九、复习
【】表示出错的答案,下次重点关注
9.1 仓库
---------------------------------------------初始化、状态、日志---------------------------------------------
初始化本地库:git init
查看本地状态(暂存区、工作区):git status
显示对应的提交信息:git show <版本号/标签>
查看提交记录详细信息(当前分支所在版本为止的):git log
--all:显示全部
--pretty=oneline:一行显示(省略提交人与日期)
--abbrev-commit:【缩短版本号】
--graph:图形化【不按时间显示】
--follow <文件名>:指定文件
查看版本记录(所有版本,不包括提交人和日期):git reflog
--------------------------------------------------提交-----------------------------------------------------
添加到暂存区:git add <./文件名>
提交到本地仓库的当前分支:git commit -m <"">
添加到暂存区然后提交(存在Untracked状态的文件则无法使用):-a
--------------------------------------------------撤销-----------------------------------------------------
修改当前分支上一次提交的注释:git commit --amend -m ""
撤销工作区的更改(与暂存区比较):git restore
撤销暂存区的更改(与HEAD本地仓库比较,保留工作区):--staged
丢弃工作区的更改(与暂存区比较):git checkout -- <./文件名>
--------------------------------------------------删除-----------------------------------------------------
删除工作区和暂存区中的文件:git rm <文件名>
强制删除:-f
只删除暂存区中的文件:--cached
删除文件夹中的文件:-r
--------------------------------------------------回退-----------------------------------------------------
提交新版本来回退到指定版本:git revert <版本号>
回到之前提交的版本:git reset <版本号/标签名>
保留工作区、暂存区:--soft
保留工作区。默认参数:--mixed
重置HEAD(本地仓库)、工作区、暂存区:--hard
添加:git remote add <别名> <url>
别名:默认oigin,由远程仓库设置
查看:git remote
显示详情:-v
删除:git remote rm <别名>
9.2 分支
--------------------------------------------------增删改查--------------------------------------------------
查看所有本地分支:git branch
查看所有远程分支:-r
显示详情(版本号、注释):-v
创建分支:git branch <分支名>
删除分支(做各种检查),无法删除当前分支:git branch -d <分支名>
强制删除(不做检测):-D
删除远程分支:-dr
--------------------------------------------------[标签]切换------------------------------------------------
切换分支/切换版本(切换前需要先提交,否则修改内容可能会与目标分支产生冲突导致切换报错):git checkout <分支名/版本号/标签名>
创建并切换:-b
--------------------------------------------------分支差异--------------------------------------------------
显示差异:git diff <分支名/标签名/版本号> <分支名/标签名/版本号>
--------------------------------------------------分支合并--------------------------------------------------
将b分支合并a分支到版本3。(没有冲突自动执行提交,有冲突需要解决后手动提交)b分支可以通过merge <版本3>提升到版本3:git merge <分支名/版本号/标签名>
简约合并:git rebase <分支名/版本号/标签名>
--------------------------------------------------查看----------------------------------------------------
查看关联关系:git branch -vv
--------------------------------------------------拉下来--------------------------------------------------
克隆远程仓库:git clone <url> [文件名]
指定分支名:-b <分支名>
抓取最新内容到远程分支:git fetch <别名/url> <远程分支名>
建立与远程分支的关联关系:--set-upstream
不指定则抓取所有:git fetch <别名/url>
不指定则抓取所有:git fetch
拉取最新内容到本地分支和远程分支:git pull <别名/url> <远程分支名>
不指定则拉取所有:git pull <别名/url>
不指定则拉取所有:git pull
--------------------------------------------------推上去--------------------------------------------------
推送到远程分支:git push <别名/url> <本地分支名:远程分支名>
设置默认远程主机,如果存在多个远程主机关系:【-u】
不管是否存在,将本地所有分支推送到远程:【--all】
省略pull,强制push:【--force】
建立与远程分支的关联关系:--set-upstream
[本地分支名]省略:删除远程分支,即推送空内容到指定的远程分支
[:远端分支名]省略:已关联的远程分支->同名分支
[远端名称]省略:当前分支有已关联的远程分支【且只存在一个】,否则报错
9.3 标签
--------------------------------------------------查看--------------------------------------------------
查看所有本地标签:【git tag】
根据通配符筛选:【-l 通配符*】
根据通配符筛选:【--list 通配符*】
--------------------------------------------------创建--------------------------------------------------
为最新提交创建【轻量标签】:【git tag <标签名>】
指定版本:【<版本号>】
给当前的提交版本创建一个【附注标签】:【git tag -a <标签名> -m <附注信息>】
指定版本:【<版本号>】
--------------------------------------------------删除--------------------------------------------------
删除标签:【git tag -d <标签名>】
--------------------------------------------------检出--------------------------------------------------
以标签指定的版本的基础上创建分支:【git checkout -b <分支名> <标签名>】
--------------------------------------------------推上去--------------------------------------------------
将指定的标签上传到远程仓库:【git push <origin> <标签名>】
将所有不在远程仓库中的标签上传到远程仓库:【git push <origin> --tags】
--------------------------------------------------删除掉--------------------------------------------------
【git push <origin> :regs/tags/<标签名>】
【git push origin --delete <标签名>】