文章目录
前言
Git的官网:https://git-scm.com/
GitForWindows清华源下载:https://mirrors.tuna.tsinghua.edu.cn/github-release/git-for-windows/git/
Git的安装:在Windows平台,下载好Git后直接无脑下一步安装;在Linux系统通过yum install git安装。
Gitee官网:https://gitee.com/
Gitee官网提供的“Gitee大全”:https://gitee.com/all-about-git
说明:本博客是以Windows版本Git做基本操作,在Linux系统下的操作基本无差异。本文的受众人群:有Linux基础或是其他编程能力的人。
一、Git是什么?
1. 分布式版本控制Git
所有版本信息仓库全部同步到本地的每个用户,这样就可以在本地查看所有版本历史,可以离线在本地提交,只需在连网时push到相应的服务器或其他用户那里。由于每个用户那里保存的都是所有的版本数据,只要有一个用户的设备没有问题就可以恢复所有的数据,但这增加了本地存储空间的占用。
不会因为服务器损坏或者网络问题,造成不能工作的情况!
2. Git和SVN的主要区别?
SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而工作的时候,用的都是自己的电脑,所以首先要从中央服务器得到最新的版本,然后工作,完成工作后,需要把自己做完的活推送到中央服务器。集中式版本控制系统是必须联网才能工作,对网络带宽要求较高。
Git是分布式版本控制系统,没有中央服务器,每个人的电脑就是一个完整的版本库,工作的时候不需要联网了,因为版本都在自己电脑上。协同的方法是这样的:比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。Git可以直接看到更新了哪些代码和文件!
3. Git的Windows版本
主要有三个版本:
Bash版本:linux操作风格,推荐
CMD版本:Windows的命令号操作风格,抛弃
GUI版本:图形界面操作,抛弃
二、Git使用步骤
1. Git的必要配置
1.1 查看配置:
查看Git的全部配置信息:
git config -l
git config --list
查看系统config:
git config --system --list
查看当前用户(global)配置:
git config --global --list
默认没有当前用户的配置文件,可以通过指令直接配置并自动新建.gitconfig文件
1.2 Git相关的配置文件:
所有的配置文件都保存在本地。
(1)Git\etc\gitconfig #Git 安装目录下的 gitconfig --system 系统级
(2)C:\Users\Administrator\ .gitconfig #只适用于当前登录用户的配置 --global 全局 --Linux路径在当前用户根目录下
(3)./.git/config #当前仓库的配置信息
首次安装Git后首先要做的事情是设置用户名和e-mail地址。 这是非常重要的,因为每次Git提交都会使用该信息。它被永远的嵌入到了你的提交中:
git config --global user.name “name” #名称
git config --global user.email “email” #邮箱
只需要做一次这个设置,如果你传递了–global 选项,因为Git将总是会使用该信息来处理你在系统中所做的一切操作。如果你希望在一个特定的项目中使用不同的名称或e-mail地址,你可以在该项目中运行该命令而不要–global选项。总之–global为全局配置,不加为某个项目的特定配置。
2. Git的工作原理
2.1 三个区域
Git本地有三个工作区域:
工作区(Working Directory)
暂存区 (Stage/Index)
Git仓库 (Repository或Git Directory)。
如果在加上远程的Git仓库(Remote Directory)就可以分为四个工作区域。文件在这四个区域之间的转换关系如下:
(1)Workspace:工作区,就是你平时存放项目代码的地方
(2)Index / Stage:暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息
(3)Repository:仓库区(或本地仓库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本
(4)Remote:远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换
本地的三个区域确切的说应该是git仓库中HEAD指向的版本:
(1)Directory:使用Git管理的一个目录,也就是一个仓库,包含我们的工作空间和Git的管理空间。
(2)WorkSpace:需要通过Git进行版本控制的目录和文件,这些目录和文件组成了工作空间。
(3).git:存放Git管理信息的目录,初始化仓库的时候自动创建。
(4)Index/Stage:暂存区,或者叫待提交更新区,在提交进入repo之前,我们可以把所有的更新放在暂存区。
(5)Local Repo:本地仓库,一个存放在本地的版本库;HEAD会只是当前的开发分支(branch)。
(6)Stash:隐藏,是一个工作状态保存栈,用于保存/恢复WorkSpace中的临时状态。
2.2 工作流程和三种Git管理文件的状态
Git的工作流程一般是这样的:
(1)在工作目录中添加、修改文件;
(2)将需要进行版本管理的文件放入暂存区域;
(3)将暂存区域的文件提交到git仓库。
因此,Git管理的文件有三种状态:
(1)已修改(modified):修改了工作区的文件,但是没有放到暂存区。
(2)已暂存(staged):通过git add 指令把已修改的文件做标记。
(3)已提交(committed):通过git commit指令,把暂存区的文件正式保存到Git仓库。
3. Git项目搭建
3.1 工作目录与常用指令
工作目录(WorkSpace)一般就是你希望Git帮助你管理的文件夹,可以是你现有项目的目录,也可以是一个新建空目录。
日常使用只要记住下图6个命令:
3.2 建立Git仓库的两种方式
3.2.1 本地仓库的建立
在需要Git管理的项目根目录执行:
git init
执行指令后,根目录会生成一个.git目录,关于版本等的所有信息都在这个目录里面。
3.2.2 克隆远程仓库
复制gitee或者github仓库地址:
通过下面指令完成克隆:
git clone [url] #[url]是仓库的地址
注意:
推荐使用SSH克隆,使用https克隆,在后面配置SSH公钥后仍然需要验证账号密码,后文(6.1.3 配置SSH无效问题)有说明以及解决办法。
4. Git文件操作
4.1 Git仓库文件的四种状态
版本控制就是对文件的版本控制,要对文件进行修改、提交等操作,首先要知道文件当前在什么状态,不然可能会提交了现在还不想提交的文件,或者要提交的文件没提交上。
(1)Untracked: 未跟踪, 此文件在文件夹中, 但并没有加入到git库, 不参与版本控制. 通过git add 状态变为Staged.
(2)Unmodify: 文件已经入库, 未修改, 即版本库中的文件快照内容与文件夹中完全一致. 这种类型的文件有两种去处, 如果它被修改, 而变为Modified. 如果使用git rm移出版本库, 则成为Untracked文件
(3)Modified: 文件已修改, 仅仅是修改, 并没有进行其他的操作. 这个文件也有两个去处, 通过git add可进入暂存staged状态, 使用git checkout 则丢弃修改过, 返回到unmodify状态, 这个git checkout即从库中取出文件, 覆盖当前修改 !
(4)Staged: 暂存状态. 执行git commit则将修改同步到库中, 这时库中的文件和本地文件又变为一致, 文件为Unmodify状态. 执行git reset HEAD filename取消暂存, 文件状态为Modified。
4.2 查看文件状态和修改文件状态
git status [filename] #查看指定文件[filename]状态
git status #查看所有文件状态
git status -s #精简的方式显示文件状态
git diff #查看difference,在add之前,查看文件修改的内容
git add [filename] #添加文件[filename]到暂存区
git add . #会把本地所有Untracked的文件都加入暂存区,并且会根据.gitignore做过滤
git add * #会略过.gitignore文件,并把任何文件都加入
git commit -m “消息内容” #提交暂存区中的内容到本地仓库 -m 提交信息
git log #查看当前版本从最近到最远的提交日志(历史版本信息)
git log --pretty=oneline #以单行的形式显示提交日志
git reflog #查看所有的版本信息
git reset --hard 版本号 #切换版本, HEAD为当前版本,HEAD^为上个版本
git checkout – [filename] #撤销修改(命令中的–很重要,没有–,就变成了“切换到另一个分支”的命令):文件add之前,即丢弃工作区的修改,回到和版本库一模一样
git restore [filename] #撤销修改,和git checkout – [filename] 功能一样
git reset HEAD [filename] #取消暂存,文件add之后,把暂存区的修改撤销掉(unstage),重新放回工作区
git restore --staged [filename] #取消暂存,和git reset HEAD [filename]功能一样
git rm [filename] #删除文件,删除后件记录在暂存区,然后git commit提交;如果不想删除了,使用git reset HEAD [filename] 即可
4.3 忽略文件.gitignore
有些时候我们不想把某些文件纳入版本控制中,比如数据库文件,临时文件,设计文件等。
在主目录下建立".gitignore"文件,此文件有如下规则:
test.txt #忽略单个文件
.txt #忽略所有 .txt结尾的文件,这样的话上传就不会被选中!
!lib.txt #但lib.txt除外
/temp #仅忽略当前目录下的temp文件,不包括其它目录的temp
build/ #忽略所有目录下名字为build的文件夹
doc/.txt #会忽略 doc/notes.txt 但不包括 doc/server/arch.txt
5. Git分支管理
分支类似科幻电影里面的平行宇宙,如果两个平行宇宙互不干扰,那对现在的你也没啥影响。不过,在某个时间点,两个平行宇宙合并了,我们就需要处理一些问题了!
主分支是基于提交而产生的,功能分支是基于主分支的创建而产生的。
5.1 Git分支常用指令
git checkout -b [branch-name] #新建一个分支,并切换至新分支
git switch -c [branch-name] #新版本指令,同上
git checkout [branch-name] #切换到指定分支,并更新工作区
git switch [branch-name] #新版本指令,同上
git branch [branch-name] #新建一个分支,但依然停留在当前分支
git branch #列出所有本地分支
git branch -r #列出所有远程分支
git merge [branch-name] #合并指定分支到当前分支,分支代码提交之后,才能切换;合并代码是站在主分支上合并功能分支。
git log --graph #命令可以看到分支合并图
git log --graph --pretty=oneline --abbrev-commit # 美化输出
–graph commit之间将展示连线
–decorate 显示commit里面的分支
–pretty=oneline 只显示commit信息的标题
–abbrev-commit 只显示commit SHA1的前7位
git branch -d [branch-name] #删除分支
git push origin --delete [branch-name] #删除远程分支
git branch -dr [remote/branch] #
5.2 解决合并冲突
如果同一个文件,在master和其它分支上同时修改了内容,在主分支上进行合并操作的时候就会提示冲突。
解决:
遇到冲突的文件,必须手动解决冲突后再提交,git status也可以告诉我们冲突的文件,Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,手动修改为有效文件,再进行add和commit操作即可
6. 远程仓库:推荐使用码云(Gitee)
Gitee的注册登录还有创建仓库,过于简单,不便演示。
6.1 远程仓库的两种访问方式
6.1.1 HTTPS: 无需配置,但是每次访问仓库时,需要重复验证账号远程仓库密码。
在本地的Git仓库目录添加远程仓库地址,要确保本地仓库文件已经commit:
git remote add origin [https仓库地址] #添加远程仓库地址,–origin是变量名,保存的是你输入的地址
git remote -v #查看变量中储存的地址
git push -u origin “master” #把master分支,推送到origin保存的地址
git push #上一句在第一次执行完后,-u就记录了master,以后都可以执行此句向远程仓库提交master
git push origin “其他分支” #把其他分支,推送到origin保存的地址
如果是克隆的仓库,不需要添加origin,origin会被自动配置为你克隆的仓库地址,直接正常操作(push、pull)即可。
6.1.2 SSH:需要简单配置,配置成功后不需要重复验证账号远程仓库密码
设置SSH公钥,来实现免密登录:Gitee官方教程公钥管理
前两个顺序观看,后面的选择观看。
6.1.3 配置SSH无效问题
本人刚开始遇到的问题:
在linux系统配置好SSH以后push、pull操作还需要验证账号密码。
问题的原因是:
用https方式克隆了仓库,上面说过的origin变量会被自动配置为https地址。如果一开始使用ssh方式克隆就不会有此问题。Windows即使https克隆仓库,也不会验证密码,是因为Windows自动把账号密码保存了,可以在控制面板->用户账户->管理你的凭据->Windows凭据->普通凭据里查看你保存的账号密码。
问题的解决:
把https的地址改为ssh的地址,在当前仓库的.git/config文件中,找到url = https地址并修改为你的仓库的SSH地址