> 文档中心 > 猿创征文|一篇学会Git的使用

猿创征文|一篇学会Git的使用

目录

Git的版本控制

常见的版本控制工具

版本控制分类

1、本地版本控制

2、集中版本控制 svn

3、分布式控制 git

Git和SVN的主要区别

Git的历史

Git环境配置

软件下载

启动git

常用的Linux命令

Git配置

Git相关的配置文件

设置用户名与邮箱(用户标识必须填写)

git基本理论(重点)

三个区域

工作流程 

Git项目搭建

 本地仓库搭建

init 创建全新的仓库

 克隆远程仓库

 Git的文件操作

查看文件状态

忽略文件

使用远程仓库码云

创建仓库

代码提交

 idea中集成Git

方式1:将新建的项目放在远程的git文件目录下

方式2:将远程仓库中的.git文件和其他文件拷贝到项目中

碰到git上传文件出错[rejected] master -> master (fetch first) error: failed to push some refs to '

git中的分支


Git的版本控制

什么是版本控制

版本控制是一种在开发的过程中用于管理我们对文件、目录或工程等内容的修改历史,方便查看更改历史记录,备份以便恢复御前的版本的软件工程技术

  • 实现跨区域多人协同开发
  • 追中和记载一个或者多个文件的历史记录
  • 组织和保护你的源代码和文档
  • 统计工作量
  • 并行开发、提高开发效率
  • 跟踪记录整个软件的开发过程
  • 减轻开发人员的负担,计生时间,同时降低人为错误

多人开发就必须使用版本控制

常见的版本控制工具

主流的版本控制器有如下这些

  • Git
  • SVN(Subversion)
  • CVS(Concurrent Versions System)
  • VSS(Micorosoft Visual SourceSafe)
  • TFS(Team Foundation Server)
  • Visual Studio Online

版本控制产品非常的多(Perforce、Rational ClearCase、RCS(GNU Revision Control System)、Serena Dimention、SVK、BitKeeper、Monotone、Bazaar、Mercurial、SourceGear Vault),现在影响力最大且使用最广泛的是Git与SVN

版本控制分类

1、本地版本控制

记录文件每次的更新,可以对每个版本做一个快照,或是记录补丁文件,适合个人用,如RCS

2、集中版本控制 svn

所有的版本数据都保存在服务器上,协同开发者从服务器上绒布更新或者上传自己的修改

 所有的版本数据都存在服务器上,用户的本地只有自己以前所同步的版本,如果不连网的话,用户就看不到历史版本,也无法切换版本验证问题,或在不同分支工作。而且,所有数据都保存在单一的服务器上,有很大的风险这个服务器会损坏,这样就会丢失所有的数据,当然可以定期备份。代表产品:SVN、CVS、VSS

3、分布式控制 git

每个人都有所有的代码,这存在安全隐患

所有版本信息仓库全部同步到本地的每个用户,这样就可以在本地查看所有版本历史,可以离线在本地提交,只需要在联网是推到相应的服务器或者其他用户哪里,由于每个用户保存的都是所有版本数据,只要有一个用户的设备就可恢复所有的数据,但这增加了本地存储空间的占用,不会因为服务器或者网络问题,造成不能工作的情况

Git和SVN的主要区别

svn是集中式版本控制系统,版本库是集中在中央服务器的,而工作的时候,用的都是自己的电脑,所以首先要从中央服务器中得到最新的版本,然后工作,完成工作后,需要把自己做完的东西推送到中央服务器。集中式版本控制系统必须联网才能工作,对网络宽带要求较高

Git是分布式版本控制系统,没有中央服务器,每个人的电脑就是一个完整的版本库,工作的时候不需要联网了,因为版本都在自己电脑上。协同的方法是这样的:比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。Git可以直接看到更新了哪些代码和文件!

git是目前世界上最先进的分布式版本控制系统

Git的历史

同生活中的许多伟大事物一样,Git 诞生于一个极富纷争大举创新的年代。

Linux 内核开源项目有着为数众广的参与者。绝大多数的 Linux 内核维护工作都花在了提交补丁和保存归档的繁琐事务上(1991-2002年间)。到 2002 年,整个项目组开始启用一个专有的分布式版本控制系统 BitKeeper 来管理和维护代码。

Linux社区中存在很多的大佬!破解研究 BitKeeper !

到了 2005 年,开发 BitKeeper 的商业公司同 Linux 内核开源社区的合作关系结束,他们收回了 Linux 内核社区免费使用 BitKeeper 的权力。这就迫使 Linux 开源社区(特别是 Linux 的缔造者 Linus Torvalds)基于使用 BitKeeper 时的经验教训,开发出自己的版本系统。(2周左右!) 也就是后来的 Git!

Git是免费、开源的,最初Git是为辅助 Linux 内核开发的,来替代 BitKeeper!

     Linux和Git之父李纳斯·托沃兹(Linus Benedic Torvalds)1969、芬兰人

Git环境配置

软件下载

打开 [git官网] https://git-scm.com/https://git-scm.com/,下载git对应操作系统的版本。

所有东西下载慢的话就可以去找镜像!

官网下载太慢,我们可以使用淘宝镜像下载:http://npm.taobao.org/mirrors/git-for-windows/http://npm.taobao.org/mirrors/git-for-windows/

 下载后选择对应版本安装即可

环境变量只是为了全局使用而已,配置了就可以在任意地方使用

启动git

Git Bash:Unix与Linx分隔的命令行,使用最多,建议使用这个

Git CMD:Windows风格的命令行

Git GUI:图形界面的Git,不建议使用这个,尽量先熟悉命令操作

常用的Linux命令

1)cd : 改变目录。

2)cd . . 回退到上一个目录,直接cd进入默认目录

3)pwd : 显示当前所在的目录路径。

4)ls(ll):  都是列出当前目录中的所有文件,只不过ll(两个ll)列出的内容更为详细。

5)touch : 新建一个文件 如 touch index.js 就会在当前目录下新建一个index.js文件。

6)rm:  删除一个文件, rm index.js 就会把index.js文件删除。

7)mkdir:  新建一个目录,就是新建一个文件夹。

8)rm -r :  删除一个文件夹, rm -r src 删除src目录

9)、mv 移动文件, mv index.html src index.html 是我们要移动的文件, src 是目标文件夹,当然, 这样写,必须保证文件和目标文件夹在同一目录下。

10)reset 重新初始化终端/清屏。

11)clear 清屏。

12)history 查看命令历史。

13)help 帮助。

14)exit 退出。

15)#表示注释

 和Linux的命令基本一致

Git配置

所有的陪文件,其实都是保存在本地

查看配置 git config -l

查看不同级别的配置文件:

#查看系统的configgit config --system --list#查看当前用户(global)配置git config --global --list

Git相关的配置文件:

1)、Git\etc\gitconfig:Git安装目录下的gitconfig   --system 系统级 

2)、C:\Users\Administrator\ .gitconfig    只适用于当前登录用户的配置  --global 全局

 这里可以直接编辑配置文件,通过命令设置后会响应到这里

设置用户名与邮箱(用户标识必须填写)

当你安装Git后首先要做的事情是设置你的用户名称和e-mail地址,这是非常重要的,因为每次gir提交都会使用该信息,他被永远的跟随到你的提交中:

git config --global  user.name  "xxxxx" #名称git config --global user.email  "xxxxx" #邮箱

git基本理论(重点)

三个区域

Git本地有三个工作区域:工作目录(Working Dierctory)、暂存区(Stage/Index)、资源库(Repository 或Git Directory),如果在加上远程的git仓库(Remote Directory)就可以分为四个工作区域。文件在这四个区域之间你的转换关系如下

Workspace:工作区,就是你平时存放项目代码的地方

index/Stage:暂存区,用于临时存放你的改动,事实上他只是一个文件,保存即将提交到文件列表信息

Repository:仓库区(或本地仓库),就是安全存放数据的位置,这里面有你提交到所有版本的数据,其中HEAD是指向最放入仓库的版本

Remote:远程仓库,托管代码的服务器,可以简单的人为你是项目组中的一台电脑用于远程数据交换

本地的三个区域确切的说应该是git仓库中HEAD指向的版本:(.git是隐藏文件,在windows中勾选之后显示出来)

  •  Directory:使用Git管理的一个目录,也就是一个仓库,包含我们的工作空间和Git的管理空间。
  • WorkSpace:需要通过Git进行版本控制的目录和文件,这些目录和文件组成了工作空间。
  • .git:存放Git管理信息的目录,初始化仓库的时候自动创建。
  • Index/Stage:暂存区,或者叫待提交更新区,在提交进入repo之前,我们可以把所以的更新放在暂存区。
  • Local Repo:本地仓库,一个存放在本地的版本库,HEAD会知识当前的开发分支(branch)。
  • Stash:隐藏,是一个工作状态保存栈。

工作流程 

git的工作流程一般为:

1、在工作目录中添加、修改文件;(如:UserMapper.xml)

2、将需要进行版本管理的文件放入暂存区域;(git add .) . 表示全部

3、将暂存区域的文件提交到git仓库  (git  commit)

因此git管理的文件有三种状态:已修改(modified),已暂存(staged),已提交(committed)

Git项目搭建

闯进工作目录与常用指令

工作目录(WorkSpace)一般就是你希望Git版主你管理的文件夹,可以是你项目的目录,也可以是一个空目录,建议不要有中文

常用的一下六个命令

 本地仓库搭建

创建本地长裤的方法有两种:一种是创建全新的仓库,另一种是克隆远程仓库,

init 创建全新的仓库

1、创建全新的仓库,需要用Git管理的项目的根目录执行:

#在当前目录新建一个Git代码库git init

找一个文件夹,右键打开git,输入命令即可 

 执行后可以看到,只是在项目目录中多出来一个.git目录,关于版本等的所有信息都在这个目录里。

 克隆远程仓库

另一种方式是可隆远程目录,由于是将远程服务器上的仓库完全镜像一份至本地

#克隆一个项目和他的整个代码历史(版本信息)git clone  [url] 如:克隆springmeng的水果商城源码$ git clone https://gitee.com/springmeng/ssm-code.git

 Git的文件操作

文件操作的四种状态

版本控制就是对文件的版本控制,要对文件进行修改、提交等操作,首先要知道文件当前在什么状态,不然可能提交了现在还不想提交得文件,或者要提交得文件还没有提交上去。

Untracked:未跟踪,此文件在文件夹中,但是没有加入doagit库中,不参与版本控制,通过

 git add 命令 状态变为Staged(暂存状态)

Unmodify:文件已经入库,未修改 即版本库中的文件快照内容与文件夹中完全一致. 这种类型的文件有两种去处, 如果它被修改, 而变为Modified. 如果使用git rm移出版本库, 则成为Untracked文件

Modified:文件已修改,但仅仅是修改并没有进行其他的操作. 这个文件也有两个去处, 通过git add可进入暂存staged状态, 使用git checkout 则丢弃修改过, 返回到unmodify状态, 这个                     git  checkout即从库中取出文件, 覆盖当前修改 !

Staged:暂存状态,执行git commit则将修该同步到库中,这时候库中的文件和本地文件又变为一致, 文件为Unmodify状态. 执行git reset HEAD filename取消暂存, 文件状态为Modified

文件得建立在.git之下

查看文件状态

#查看指定文件状态git status [filename]#查看所有文件状态git status# git add .    添加所有文件到暂存区# git commit -m "消息内容"    提交暂存区中的内容到本地仓库 -m 提交信息

新建两个文件,使用git status查看他们的状态可以发现他们都是Untracked未跟踪的状态

 当使用git add  文件时,发现两个文件的状态,一个已经处于staged暂存状态,一个还是处于未跟踪的状态

 已经提交后,所变得颜。

忽略文件

有时候我们不想把某些文件纳入版本控制中,比如数据库文件,临时文件吗,设计文件等在主目录下建立“.gitignore”文件,此文件有如下规则:

1、忽略文件中的空行或以井号(#)开始的行将会被忽略。

2、可以使用Linux通配符。例如:星号(*)代表任意多个字符,问号(?)代表一个字符,当括号([abc])代表可选字符范围,大括号({string1,string2,...})代表可选的字符串等。

3、如果名称的最前面有一个感叹号(!),表示例外规则,将不被忽略。

4、如果名称的最前面是一个路径分隔符(/),表示要忽略的文件在此目录下,而子目录中的文件不忽略。

5、如果名称的最后面是一个路径分隔符(/),表示要忽略的是此目录下该名称的子目录,而非文件(默认文件或目录都忽略)。

#为注释*.txt   #忽略所有 .txt结尾的文件,这样的话就不会上传上去了!.lib.txt   #但lib.txt除外,意思是这个文件会上传/temp#仅忽略项目根目录下的所有文件,不包括其他目录tempbuild/      #忽略build/目录下的所有文件

使用远程仓库码云

设置绑定ssh公钥,可以免密登录 

生成ssh公钥的指令

#rsa加密协议ssh-keygen -t rsa

 输入之后,连续两次回车就可以在你的users用户生成.ssh秘钥了。

 

将.pub的文件打开后复制过去即可,这样就可以实现免登陆了。

创建仓库

 将创建好的仓库克隆到本地

增加/删除文件 

# 添加指定文件到暂存区$ git add [file1] [file2] ...# 添加指定目录到暂存区,包括子目录$ git add [dir]# 添加当前目录的所有文件到暂存区$ git add .# 添加每个变化前,都会要求确认# 对于同一个文件的多处变化,可以实现分次提交$ git add -p# 删除工作区文件,并且将这次删除放入暂存区$ git rm [file1] [file2] ...# 停止追踪指定文件,但该文件会保留在工作区$ git rm --cached [file]# 改名文件,并且将这个改名放入暂存区$ git mv [file-original] [file-renamed]

代码提交

# 提交暂存区到仓库区$ git commit -m [message]# 提交暂存区的指定文件到仓库区$ git commit [file1] [file2] ... -m [message]# 提交工作区自上次commit之后的变化,直接到仓库区$ git commit -a# 提交时显示所有diff信息$ git commit -v# 使用一次新的commit,替代上一次提交# 如果代码没有任何新变化,则用来改写上一次commit的提交信息$ git commit --amend -m [message]# 重做上一次commit,并包括指定文件的新变化$ git commit --amend [file1] [file2] ...

 idea中集成Git

方式1:将新建的项目放在远程的git文件目录下

我的远程是gitTest,我们只需要将新建的目录放在gitTest/下即可

 

提交到远程仓库 

方式2:将远程仓库中的.git文件和其他文件拷贝到项目中

 在这依次输入git add  .   ,   git  commit  -m  "",  git  push  之后

 这样就传上来了。

碰到git上传文件出错[rejected] master -> master (fetch first) error: failed to push some refs to '

出现错误的主要原因是gitee中的README.md文件不在本地代码目录中

解决方法:

第一步此时我们要执行

git pull --rebase origin master命令将README.md拉到本地,

然后执行git push origin master就可以成功了

git中的分支

# 列出所有本地分支$ git branch# 列出所有远程分支$ git branch -r# 列出所有本地分支和远程分支$ git branch -a# 新建一个分支,但依然停留在当前分支$ git branch [branch-name]# 新建一个分支,并切换到该分支$ git checkout -b [branch]# 新建一个分支,指向指定commit$ git branch [branch] [commit]# 新建一个分支,与指定的远程分支建立追踪关系$ git branch --track [branch] [remote-branch]# 切换到指定分支,并更新工作区$ git checkout [branch-name]# 切换到上一个分支$ git checkout -# 建立追踪关系,在现有分支与指定的远程分支之间$ git branch --set-upstream [branch] [remote-branch]# 合并指定分支到当前分支$ git merge [branch]# 选择一个commit,合并进当前分支$ git cherry-pick [commit]# 删除分支$ git branch -d [branch-name]# 删除远程分支$ git push origin --delete [branch-name]$ git branch -dr [remote/branch]

 

如果同一个问价在合并分支是都被修改了则会引起冲突:解决方法是我们可以修改冲入问价后重新提交!选择要保留的要删除的代码。