前言
Git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。它是Linux之父为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。目前公司使用较多的是集中式版本控制SVN和分布式版本控制Git。本文不对具体原理及专有名词死磕,将带你从Git工具的安装到基本掌握。肝了挺久的,如有表达不够准确的地方,欢迎指正,后续也将继续完善它。
一、Git与SVN的区别
1、最核心的区别Git是分布式的,而SVN是集中式的。集中式版本控制,意味着所有的版本数据都保存在服务器上,协同开发者从服务器上同步更新或上传自己的修改。分布式版本控制,意味着每个人都拥有全部的代码,所有版本信息仓库全部同步到本地的每个用户,这样就可以在本地查看所有版本历史。
2、Git是每个历史版本都存储完整的文件,便于恢复;SVN是存储差异文件,历史版本不可恢复
3、Git把内容按元数据方式存储,而SVN是按文件
4、Git的内容的完整性要优于SVN
5、Git可离线完成大部分操作,SVN则不能;Git速度更快,效率更高
6、Git意味着每个人都拥有全部代码,SVN将所有版本数据保存在服务器上,所以Git的安全性不如SVN高
二、Git安装详细教程
1、官网下载
去Git官网下载对应系统的软件安装包,可以看见Git版本已经更新到了2.36.1了,因为国外的网站大多有墙,下载速度比较慢(建议采取镜像下载,当然有梯子的可以挂个梯子)
2、镜像下载
这里采用淘宝镜像下载,网址:CNPM Binaries Mirror ,我使用了一个比较稳定的Git版本,Git-2.25.1-64-bit.exe安装在Windows系统下
3、Git的安装步骤
(1)点击下好的exe文件,点击next,再选择安装目录
(2) 选择要安装的组件,默认勾选就行,如有需要可勾选On the Desktop,生成桌面快捷方式,其实Duck不必,因为它会自动注册到你的系统环境,鼠标右击一下就可以看见
(3)选择Git默认的编辑器,我电脑上有的且比较习惯的是NotePad++,有vim的选择vim
(4)调整你的path环境变量,推荐使用命令行运行Git
(5)选择哪个加密库来加密http传输的信息,使用默认的openSSL就行。当后续执行相关命令的时候,会生成一个.ssh的文件夹(Users\Administrator.ssh),里面有Git自动生成的ssh密钥
(6)选择提交的时候的换行符格式,点击默认的就行(检查出windows的换行符格式再转换为unix换行符格式,最后再进行提交)
(7)选择Git的终端模拟器,使用默认的MinTTY即可。这个模拟器具有可调整大小的窗口(Ctrl+滚轮就可以放大缩小字体),非矩形选区和Unicode字体。上面那种是Linux控制窗口,另外一种是Windows默认的控制窗口(一个clear命令可以看出差别)
(8)配置额外选项,点击默认就行,然后安装,安装完成之后Finish即可(不勾选那两个选项)
4、安装完查看目录
安装成功后在开始菜单中会有Git文件项,菜单下有5个程序。鼠标右击有两个程序,一个Git GUI Here,一个Git Bash Here,一般选择Linux命令行Git Bash
Git Bash:Unix与Linux风格的命令行,使用的比较多,推荐使用
Git CMD:Windows风格的命令行
Git GUI:图形界面的Git,不建议初学者使用
三、常用的Linux命令
1、cd : 更改目录。
2、**cd . . **:回退到上一个目录,直接cd进入默认目录(cd空格再打两点)。
3、**pwd **: (print working directory)显示当前所在的目录路径。
4、ls(ll): 都是列出当前目录中的所有文件,只不过LL列出的内容更为详细。
5、mkdir: 新建一个目录,有时候,你想要创建一个新的文件夹或子文件夹。可以使用mkdir+你要创建的文件名来做到这一点。
6、touch : 新建一个文件 如 touch bash.txt 就会在当前目录下新建一个bash.txt 文件。
7、stat:查看文件的详细信息。
8、rm: 删除一个文件,rm bash.txt 就会把bash.txt文件删除。rm -r : 删除一个文件夹,rm -r src 删除src目录,rm -rf / ** :切勿在Linux中尝试!它会删除电脑中的全部文件(/表示根目录,删库跑路风险大)!
9、mv** :移动文件,mv index.html src ,index.html 是我们要移动的文件, src 是目标文件夹,当然,这样写,必须保证文件和目标文件夹在同一目录下。在相同路径下,可以重命名文件,比如:mv/原来文件的名字/新文件的名字。10、cp:可以复制文件或目录,cp /源文件 /目标文件 相当改名复制,比如:cp index.html index.js,表示将index.html文件复制到当前目录下,并改名为index.js。cp/源文件/目标文件夹,比如:cp 1.jpg src ,表示把1.jpg复制到src文件夹。cp -r :递归拷贝目录(包括复制目录所有的子文件),比如:cp -r src src1表示复制src文件夹并命名为src1。
11、cat:查看文本内容,如果文本编码格式有问题,会出现乱码现象。cat也可以从键盘键入一个文件,比如:cat > 1.txt,表示创建一个txt文件,可以输入文本内容,world,按Ctrl+c结束输入。
12、echo:使用echo命令向文件中写入内容,例如:echo "字符串" > hello.txt,使用>指令覆盖文件原内容并重新输入内容,若文件不存在则创建文件。
13、reset 重新初始化终端/清屏。
14、clear 清屏。
15、history 查看命令历史。
16、help 帮助。
17、exit 退出。
四、Git基本配置
Git所有的配置文件都保存到本地
--local:项目级,项目目录下
--global:当前用户级,C:\Users\Administrator\ .gitconfig :只适用于当前登录用户的配置
--system:系统级,Git\etc\gitconfig :Git 安装目录下的 gitconfig
1、配置用户名及邮箱(必须要配置的)
(1)配置用户名
git config --global user.name "全村第二帅"
(2)配置邮箱
git config --global user.email [email protected]
(3)查看用户名和邮箱
git config user.name
git config user.email
2、查看配置信息
(1)查看当前git所有配置信息
#-l是list的缩写
git config -l
#不能缩写为--l,因为可能有list和local两种查看方式,--list查看当前git的所有配置信息
git config --list
(2) 查看某个项目的配置信息(或者说当前仓库配置信息)
#查看某个项目的配置信息(可以省略--list)
git config --local --list
(3) 查看当前用户(global)配置信息
git config --global --list
(4)查看系统配置信息
git config --system --list
3、本地仓库的搭建
(1)创建一个全新的仓库,在当前目录下新建一个Git代码库
git init
执行之后可以看到在项目下多出了一个.git文件,关于版本等的所有信息都在这个目录里面。注意:这个.git是隐藏的文件夹,需要勾选隐藏的项目才能看见。
# 普通的“ls”命令也是看不见该文件夹的,需要使用“ls -ah”查看隐藏目录
ls -ah
(2) 进入.git目录查看相应的配置
#进入.git目录下
cd .git
#查看配置文件
ls -ah
4、查看文件状态
add:将文件添加进缓存区
commit:将文件提交到本地仓库
(1)文件的四种状态
版本控制就是对文件的版本控制,要对文件进行修改、提交等操作,首先要知道文件当前在什么状态,不然可能会提交了现在还不想提交的文件,或者要提交的文件没提交上。
**Untracked: **未跟踪, 此文件在文件夹中, 但并没有加入到git库, 不参与版本控制. 通过 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
(2) 查看文件状态
1)创建两个文件:index.html、login.html
touch index.html
touch login.html
2)查看指定文件状态:git status [filename]
git status index.html
3)查看所有文件的状态
git status
可以看见在add之前,文件显示untracked状态,还可以看见先前添加进缓冲区还未提交但被我删除的文件1.html。
4)添加所有文件进缓存区
#添加所有文件到暂存区
git add .
#查看文件状态
git status
可以看见有两个文件已经处于待提交的状态了
5)将缓存区的文件提交到本地仓库,git commit -m "消息内容" ,再查看提交状态
git commit -m "new file"
git status
注:使用git commit -am可以省略使用git add命令将已跟踪文件放到暂存区的功能
5、忽略文件
有些时候我们不想把某些文件纳入版本控制中,比如数据库文件,临时文件,设计文件等,这时候就要在主目录下建立".gitignore"文件,它用来指定 git 需要忽略的文件,且对已经被 git 跟踪的文件是不起作用的。此文件有如下规则:
1、忽略文件中的空行或以井号(#)开始的行将会被忽略。
2、可以使用Linux通配符。例如:星号(*)代表任意多个字符,问号(?)代表一个字符,方括号([abc])代表可选字符范围,大括号({string1,string2,...})代表可选的字符串等。
3、如果名称的最前面有一个感叹号(!),表示例外规则,将不被忽略。
4、如果名称的最前面是一个路径分隔符(/),表示要忽略的文件在此目录下,而子目录中的文件不忽略。
5、如果名称的最后面是一个路径分隔符(/),表示要忽略的是此目录下该名称的子目录,而非文件(默认文件或目录都忽略)。
#为注释
*.txt #忽略所有 .txt结尾的文件,这样的话上传就不会被选中!
!lib.txt #但lib.txt除外
/temp #仅忽略项目根目录下的TODO文件,不包括其它目录temp
build/ #忽略build/目录下的所有文件
doc/*.txt #会忽略 doc/notes.txt 但不包括 doc/server/arch.txt
忽略文件的配置参考示例:
#字节码文件,日志文件以及
#锁文件(被很多的操作系统和应用程序所使用来锁住某些资源)
*.class
*.log
*.lock
#一些包文件以及生成目录target
*.jar
*.war
*.ear
target/
# idea的配置文件
.idea/
*.iml/
*velocity.log*
### STS ###
.apt_generated
.factorypath
.springBeans
### IntelliJ IDEA ###
*.iml
*.ipr
*.iws
.idea
.classpath
.project
.settings/
bin/
#日志文件及临时文件
*.log
tem/
#rebel
*rebel.xml*
6、配置SSH公钥
(1)生成一个公钥
ssh-keygen -t rsa
配置完之后,会在C:\Users\Administrator文件下生成.ssh文件,该文件包括以下两个子文件
(2)将公钥添加进码云(Gitee)的SSH公钥框里,标题会自动生成
添加完成之后,会显示你当前添加的SSH公钥
(3)Github(有时候上不去,有梯子的挂个梯子)上添加密钥步骤如下:
添加成功后,可以查看到你添加的密钥(Github还会贴心地发个邮件给你)
五、新建远程仓库
1、Gitee上的操作
(1)点击新建仓库
(2)新建仓库的配置
按下面配置即可,开源许可证可自行百度,这里不过多说明
(3)查看刚刚所创建的仓库
2、Github上的操作
(1)点击新建仓库,New repository
(2)新建仓库的配置
(3)查看刚刚所创建的仓库
六、将远程仓库克隆到本地
1、使用Https的方式克隆仓库
(1)复制克隆地址
(2) 在Bash里进行克隆
git clone 刚刚复制的链接
这时候要输入你的用户名和密码了(码云的用户名和密码)
(3)错误解决
由于本人在第一次SSH输入验证的时候不小心输错了用户名和密码,然后就报了如下的错误:
解决方案:控制面板-->用户账户-->管理你的凭据
Windows凭据-->普通凭据-->编辑普通凭据-->修改密码(码云的账户名和密码)-->保存
重置密码后,输入以下密令,重新输入用户名和密码
git config --system --unset credential.helper
2、使用SSH的方式克隆仓库
(1)复制克隆地址
(2) 在Bash里进行克隆,无需输入密码
git clone [email protected]:poly-ma/mystudy.git
会出现Are you sure you want to continue connecting (yes/no/[fingerprint])?,输入yes就行
3、克隆结果
七、将本地仓库上传至远程仓库
1、第一种方式提交
(1)在码云上创建一个远程的仓库,我给这个仓库取名为“hello”
(2)创建一个本地的仓库,并初始化本地仓库
#初始化仓库
git init
(3)用命令行创建一个文件hello.java,并输入相关内容
#创建一个java文件,并随便输入一些内容,比如说:hello,world!
$ cat >hello.java
hello,world!
(4)将本地仓库和远程仓库连接起来,使用SSH连接,采用HTTPS连接需要输入账户名和密码
git remote add origin "SSH链接"
添加后,远程库的名字就是
origin
,这是Git默认的叫法,也可以改成别的,但是
origin
这个名字一看就知道是远程库。
(5) 将项目的所有文件添加至暂存区,并提交至本地仓库
git add .
git commit -m "first commit"
(6)远程仓库有的文件不在本地代码目录里,合并本地仓库和远程仓库
git pull --rebase origin master
(7) 将文件提交至远程仓库
git push origin master
注1:上面命令表示,将当前分支推送到origin主机的对应分支master。 git push -u origin master 命令将本地的master分支推送到origin主机,同时指定origin为默认主机,后面就可以不加任何参数使用git push了。
** 注2:如果不进行第六步合并本地仓库和远程仓库**,直接提交的话,会出现下述错误
(8)查看上传结果
2、第二种方式提交
(1)在码云上创建一个远程的仓库,我给这个仓库取名为“mystudy”
(2)克隆这个远程仓库,采用SSH的方式克隆
git clone "SSH的链接"
(3)把项目放进这个克隆到本地的仓库里
(4)提交至远程仓库
git add .
git commit -m "new html file"
git push
(5) 查看提交结果
3、查看提交历史
(1)查看历史提交记录
在使用 Git 提交了若干更新之后,又或者克隆了某个项目,想回顾下提交历史,我们可以使用 git log 命令查看。
git log
(2)以列表的形式查看指定文件的历史修改记录(文件名不用打引号)
git blame 文件名
八、Git分支
几乎每一种版本控制系统都以某种形式支持分支,一个分支代表一条独立的开发线。使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作。而且当初始化Git仓库的时候,Git会默认创建一个名为master的主分支(它是必须要有的分支)。在Git中,分支只是一个指向单个commit的指针,Git为我们创建分支可以说就是创建了一个可以移动的新指针。在比较大的公司里,可能会面临多人协同开发的场面,这时候Git分支就可以防止互相干扰,提高协同开发的效率。
1、列出当前分支
当branch 后面不带具体参数时,下列命令会列出当前本地的分支
git branch
从上图可以看出,当前本地只有一个叫master的分支。事实上在我们执行git init初始化仓库的时候,Git就会默认为你创建一个master分支(一般来说,master分支必须得有)。
2、列出远程分支
git branch -r
master: 代表本地的某个分支名
origin master:代表着两个概念,前面的 origin 代表远程名,后面的 master 代表远程分支名
origin/master: 只代表一个概念,即远程分支名,是从远程拉取代码后在本地建立的一份拷贝
3、创建一个新分支
(1)当我们要创建一个新的分支时,直接git branch+分支名即可
#创建了一个开发用的新分支,名字叫dev
git branch dev
#创建了一个测试分支
git branch test
(2) 查看当前存在的分支
git branch
从上图可以看见,除了默认的master分支外,还有我们新创建的dev和test分支
4、切换分支
(1)切换到我们要修改的分支
#创建test.txt文件,输入内容hello,world
echo "hello,word" > test.txt
#将文件添加进暂存区
git add .
#将文件提交至本地仓库
git commit -m 'add test.txt'
用“ls”查看当前分支(master分支)的文件
用git checkout (分支名) 切换我们需要修改的分支
git checkout test
再用“ls”查看当前分支(test分支)的文件
当我们切换到test分支或者dev分支的时候,新添加的文件test.txt被移除了。当切换回主分支时,文件又重新出现了。
(2) 新建一个分支并切换到该分支下
表示创建了一个新分支v1,这里的v1表示分支名字,并切换到该分支下
git checkout -b v1
查看当前分支(v1分支),并在该分支下进行删除操作
#在当前分支下删除文件test.txt
git rm test.txt
用touch命令在该分支下新建一个文件,并进行下列操作
#新建一个login.html文件
touch login.html
#查看当前分支下的文件
ls
#将文件添加进暂存区
git add .
#将暂存区的文件提交至本地仓库
git commit -m 'removed test.txt、add login.html'
#查看当前分支下的文件
ls
#切换回主分支
git checkout master
#查看主分支下的文件
ls
我们可以发现,在v1分支下,我们看不见删除的test.txt文件,但可以看见新创建的login.html文件;切换回主分支时,删除的文件回来了,但新增加的文件不存在于主分支中了。就好比多个版本的发布,一般开发都会保留修改之前的版本。上一个版本出现bug了,创建一个分支并在当前分支下去修改一些内容,而不是在原始版本上直接修改。可以把master分支看作初始版本,v1版本是修复版本。利用切换分支机制,可以将工作切分开来,从而让我们能够在不同开发环境中做事,并来回切换。
5、合并分支
假如我们在当前分支上刚开发完一个项目,这个分支有了独立的内容,我们便会想让这个分支合并到主分支里。
git merge v1
将v1分支合并到主分支上,再用ls命令查看,可以看见之前删除的test.txt文件不见了,出现了新文件login.html
6、删除分支
(1)将v1分支合并完就可以将其删除了
git branch -d v1
(2) 再次查看当前分支,发现v1分支被删除
git branch
7、其它分支命令
#更新远程分支列表,如果你的remote branch不是在origin下,按你得把origin换成你的名字
git remote update origin --prune
#删除远程分支
git push origin --delete 远程分支名
#查看所有分支,包括本地和远程的
git branch -a
九、IDEA集成Git
1、第一种方式提交
(1)绑定Git
将刚刚克隆的远程仓库文件复制到我们的项目目录下即可
(2)查看IDEA是否绑定
打开IDEA查看项目是否已经绑定Git成功,会出现三种图标,第一个是“Update Project”,更新项目;第二个是“Commit”提交;第三个是“Push”,上传至远程仓库。
(3)提交项目
点击绿色的√(commit),先勾选要提交的项目,可以看见右侧绿字显示添加的数量,再添加message描述(这个一定要添加),然后再commit提交至本地仓库
(4)从本地仓库提交至远程仓库,点击绿色箭头push
(5)查看提交结果
2、使用命令行提交
使用IDEA Terminal 命令行实现项目上传至远程仓库(不推荐使用)
#将项目的所有文件添加至缓存区
git add .
#将缓存区的文件提交至本地仓库
git commit -m "new file update map2.html"
#将本地的仓库上传至远程仓库
git push
3、第三种方式提交
(1)使用IDEA完成本地库的初始化操作
在IDEA导航栏里找到VCS,然后选择Create Git Repository,可以看见项目目录里多了一个.git文件,IDEA上面也多了几个图标,均表示本地库初始化完成了
(2) 使用IDEA将文件添加至暂存区
创建文件以后就会提示是否需要Add操作,当点击了Add后就会变为绿色,说明添加到了暂存区,未点击add会显示红色。
将整个模块添加至暂存区,然后整个src目录下的文件均变成绿色了
(3) 将暂存区的文件提交至本地仓库(进行commit操作)
填写好描述信息(必填),点击commit提交至本地仓库
IDEA会显示提交的日志和修改的日志
(4)将本地仓库上传至远程仓库,点击绿色箭头就行(Push),然后添加远程仓库的地址(这里采用的是SSH地址),默认的远程仓库名为origin
上传至远程仓库的时候被系统拒绝push了
在push之前,一定要在控制台加上下面的命令来拉取远程仓库的文件,否者会被拒绝提交,因为本地仓库和远程仓库是两个不同的仓库,远程仓库中有的一些配置文件本地仓库没有。
git pull --rebase origin master
(5)上传结果
4、使用IDEA克隆远程仓库
(1)File-->new-->Project from Version Control
(2)填入要克隆的远程仓库的地址,选择一个空的文件夹放克隆下来的文件
(3)克隆成功
5、IDEA分支管理
(1)在IDEA的右下方有个分支管理,在这里可以进行新建分支、切换分支等操作。比如我在这里创建了一个dev的分支。
点击New Branch可以新建一个分支,自定义一个分支名即可
(2) 我将分支切换至dev,并修改文件重新提交至远程仓库,结果如下所示:
版权归原作者 全村第二帅 所有, 如有侵权,请联系我们删除。