Git概述及基本操作
一.Git简介
Git是目前世界上最先进的分布式版本控制系统。
首先,版本管理系统能干什么:
- 协同开发
- 冲突解决
- 版本记录
- 历史追查
- 代码备份
- 版本还原
- 权限管理
- 分支管理
- 代码审查
而经典的集中管理型,如:CVS、VSS、SVN之类的集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。
其特点是:
- 实现了大部分开发中对版本管理的需求
- 结构简单,上手容易
但也存在着一些弊端:
- 1、版本管理的服务器一旦崩溃,硬盘损坏,代码如何恢复?
- 2、程序员上传到服务器的代码要求是完整版本,但是程序员开发过程中想做小版本的管理,以便追溯查询,怎么破?
- 3、系统正在上线运行,时不时还要修改bug,要增加好几个功能要几个月,如何管理几个版本?
- 4、如何管理一个分布在世界各地、互不相识的大型开发团队?
对应的分布式版本控制系统Git与GitHub,有着以下优点:
- 容灾能力强
- 本地版本管理
- 异地协作
- 灵活分支
具体见“集中式vs分布式”
二.Git的基本操作
详细操作见Git文档:https://git-scm.com/doc
理解:工作区+暂存区+本地库
要理解Git每一步操作的目的与作用,首先要理解Git中的工作区、暂存区与本地库:
- 工作区(Working Directory):就是你电脑本地硬盘目录
- 本地库(Repository):工作区有个隐藏目录.git,它就是Git的本地版本库
- 暂存区(stage):一般存放在"git目录"下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
设置全局属性:用户名与邮箱地址
Git是分布式版本控制系统,所以需要填写用户名和邮箱作为一个标识:
git config --global user.name "name"
git config --global user.email "name@***"
- –global 表示全局属性,所有的git项目都会共用属性(每个版本库也可以单独设置)
- 如果是windows系统下,可以在C:\Users\Administrator路径下的.gitconfig文件里面看到配置信息
1.创建本地版本库 repository:git init
repository可以理解为一个文件目录,该目录中记录着所有关于文件的操作记录,并可以根据这些记录对版本进行回退、还原等操作。
1)首先,在合适位置,创建一个空目录,作为版本库的文件目录:
$ mkdir test
$ cd test
$ pwd
/Users/test
2)创建版本库:在项目文件夹内执行git init ,通过git init命令把这个文件目录变成Git可以管理的仓库
git init
执行此命令之后,test目录下会有一个**.git的隐藏文件夹**,此文件夹是Git用来跟踪管理版本库,以及一些配置信息。
3)配置该版本库用户名与邮箱属性:
git config user.name "name"
git config user.email "name@***"
该属性为本目录自有,其在.git文件夹下的config文件汇总
2.提交文件:git status/add/commit
- 1)新建文件后,通过git status 进行查看文件状态
- 2)将文件添加到暂存区 git add 文件名
- 3)提交文件到本地库 git commit
- 编写注释 ,完成提交
- 4)或者也可以git commit –m “注释内容”, 直接带注释提交
git status
git add 文件名
git commit
git commit -m "comment"
3.查看文件提交记录:git log
# 查看历史记录
git log 文件名
# 简易信息查看
git log --pretty=oneline 文件名
4.回退历史:git reset --hard HEAD^
# 1.回退到上一次提交
git reset --hard HEAD^
# 2.回退n次操作
git reset --hard HEAD~n
5.版本穿越:git reflog/reset
# 1)查看历史记录的版本号
git reflog 文件名
# 2)直接回退到该号对应版本
git reset --hard 版本号
6.还原文件(没有add和commit的前提下)
git checkout -- 文件名
7.删除某个文件
先删除文件,再git add ,再git commit
三.Git分支
系统上线了,但是产品经理又提了新的需求,评估一下工期要两个月,但是同时系统正在上线运行,时不时还要修改bug,如何管理几个版本?
Git通过分支branch来实现项目的版本控制。
1.创建分支:git branch <分支名>
# 创建分支
git branch <分支名>
# 查看分支
git branch –v
# 删除分支
git branch –d <分支名>
2.切换分支:git checkout <分支名>
# 切换分支
git checkout <分支名>
# 一步完成(创建新分支并跳转)
git checkout –b <分支名>
3.合并分支:git merge <分支名>
# 先切换到主干
git checkout master
# 合并分支
git merge <分支名>
4.合并时冲突:git diff
1)冲突:
- 一般指同一个文件同一位置的代码,在两种版本合并时版本管理软件无法判断到底应该保留哪个版本,因此会提示该文件发生冲突,需要程序员来手工判断解决冲突。
2)合并时冲突:
- git merge <分支名>程序合并时发生冲突系统会提示CONFLICT关键字;
- 命令行后缀会进入MERGING状态,表示此时是解决冲突的状态。
3)解决冲突
- 此时通过git diff 可以找到发生冲突的文件及冲突的内容
- 然后修改冲突文件的内容,再次git add 和git commit 提交后,后缀MERGING消失,说明冲突解决完成。
四.配置Git忽略文件
1.为什么要忽略它们?
与项目的实际功能无关,不参与服务器上部署运行,此时把它们忽略掉能够屏蔽IDE工具之间的差异。
2.哪些文件需要忽略?
1)Eclipse特定文件
2)IDEA特定文件
3)Maven工程的target目录
3.如何忽略?
1)创建忽略规则文件——git.ignore
这个文件的存放位置原则上在哪里都可以,为了便于让~/.gitconfig文件引用,建议也放在用户家目录下。
# 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*
.classpath
.project
.settings
target
.idea
*.iml
2) 在.gitconfig文件中引用忽略规则文件
[user]
name = peter
email = peter@atguigu.com
[core]
excludesfile = C:/Users/Admin/git.ignore
注意:这里要使用“正斜线(/)”,不要使用“反斜线(\)”