手把手陪你玩Git
Git简介
Git是一款免费、开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。它拥有完整的版本控制功能,可以实现多人协作,提高开发效率。版本控制可以方便添加新功能,在新版本出问题的时候也方便回滚到上一个版本。当前许多优秀的开源项目都通过Git进行协作开发,如node、sqlmap等等。
Git核心概念
分布式
集中式版本控制系统:版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑。所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。中央服务器比作一个图书馆,你要改一本书,必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆。
分布式版本控制系统:没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样工作的时候,就不需要联网了,因为版本库就在电脑上。
既然每台电脑上都有一个完整的版本库,那多个人如何协作呢?
比方说你在自己电脑上改了文件A,你的同事在他的电脑上改了文件A。你们俩之间只需要把各自的修改推送给对方,就可以互相看到对方的修改了。
实际使用分布式版本控制系统的时候,很少在两台电脑之间推送版本库的修改。因为可能两台电脑之间不能互相访问,也可能其中一台电脑压根就没有开机。因此,分布式版本控制系统通常也有一台充当“中央服务器”的电脑,这个服务器的作用仅仅是用来方便“交换”大家的修改。没有它大家也一样干活,只是交换修改不方便而已。
集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了。
分布式版本控制系统的每台电脑里都有完整的版本库,某台电脑坏掉了不要紧,从其他电脑里复制一份就可以。因此,代码安全性要高很多。
Git的优势是拥有极其强大的分支管理,把Svn等远远抛在了身后。
分支
一个项目一般有一个主分支master(在新版的github中称为main分支),开发者可以在一个分支的基础上复制一个新分支,在新分支上进行开发,之后可以与其他分支进行合并(merge),这样就可以对一个项目的特性进行开发,实现多人协作开发。
工作区、暂存区、版本库、远程仓库
Workspace: 工作区,就是你平时存放项目代码的地方
Index / Stage: 暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息
Repository: 仓库区(或版本库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本
Remote: 远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换
Git使用实践
Git的攻略在网上能够找到很多,这里推荐菜鸟教程。
这里不多介绍命令,在Linux环境下结合github直接通过一次实操为大家介绍Git的部分使用。
Git基本配置
如同在教程中所写,Git在Linux、Windows、MAC系统中都可以下载使用,可根据对应章节进行下载。
用户名、邮箱配置仅仅是作为分布式管理的标识,与Github账号等无关,甚至可以是不存在的邮箱。
sudo apt-get install git
git config --global user.name "name"
git config --global user.email "email"
创建仓库
创建仓库有三种起点
- 一个克隆的仓库
- 一个文件未被跟踪(有文件但没通过Git组合)的文件夹
- 一个空目录
2和3基本没区别,我们等下选取2来讲解。
远程仓库克隆(clone)
第二个是克隆仓库,是比较简单的做法,我们先在github上创建一个远程仓库。
这里有一点要注意的是,Git的默认主分支一直都是master,但Github近期因种族歧视的原因将其改为main,为了与大多数教程接轨,可以在settings把默认的主分支改回为master。
现在创建好了仓库,就可以clone到本地进行开发了
git clone url #克隆已有仓库到本地
本地创建仓库(init、status、add、commit、remote、push)
git init #在已有文件的文件夹中使用
看到提示Initialized empty Git repository .../.git/表明系统并没有立即将文件加入仓库,需要后面使用git add命令实现,这里可用git status查看文件状态,可以看到,readme.txt并没有被track。需要注意,.git文件夹是隐藏文件夹,需要ls -a等命令才能查看到。
接下来使用git add提交到暂存区,再用git commit命令提交到版本库
在github上创建远程仓库,使用git remote命令连接远程仓库,并用git push将文件传送过去。
创建好的空项目其实是有代码指引的。
这里要注意,我们是不能从本地直接在github上创建仓库的,需要提前从github创建好,再用git remote连接。
创建分支及修改(branch、checkout、merge)
我们对git-share2项目进行修改,我们尽量不要直接在master分支上进行修改,而应先创建一个分支,然后进行merge合并。
git branch branch-name #创建分支
git branch --all #显示所有分支(包括远程仓库)
git branch #显示本地分支
git checkout branch-name #切换分支
也可加入-b参数从某一分支创建并直接转移至新分支
git checkout -b newbranch oldbranch
接下来开始修改内容
初始状态下test.txt
在branch1中写入内容,通过add、commit、push传送到远程仓库
这里commit的-m参数表示后面接提交信息,push中的origin表示当前连接仓库的别名,可通过git remote来进行修改
push之后,branch1被正式提交到github的远程仓库
内容也被成功提交
对branch2进行同样类似的修改,但改为branch2
我们先转到master分支,将branch1与master合并,自动合并顺利,然后尝试将branch2也合并进来,此时相当于两位开发者对同一个项目进行了不同的修改,且产生了冲突(一个是branch1,一个是branch2),在merge中会有所影响。
此时,冲突的文件test.txt会显示冲突的内容
针对冲突内容进行修改,之后保存即可相当于修改完成,这里我们将branch2添加进去
之后add、commit、push即可
删除(rm)
在github中点开文件可直接删除远程仓库中文件
也可使用git rm 文件名从本地版本库删除文件
git rm --cached 文件名可在本地版本库中删除文件,但本地不删除
git checkout 文件名可撤销删除
撤销、回退(reset、reflog)
如果不小心把不想添加的文件add进去了,可以使用git reset来取消
使用reflog可以列出你在 Git 上的所有操作记录,根据它使用git reset HEAD@{index}
可进行版本回退
更新(pull、fetch)
先用一张图来理一下git fetch
和git pull
的概念:
可以简单的概括为:
git fetch是将远程主机的最新内容拉到本地,用户在检查了以后决定是否合并到工作本机分支中。
而git pull 则是将远程主机的最新内容拉下来后直接合并,即:git pull = git fetch + git merge,这样可能会产生冲突,需要手动解决。
git pull 远程主机名 远程分支名:本地分支名
额外小技巧
配置远程ssh连接,可将机器与github账号绑定,无需多次输入密码,也是在本地使用git remote add创建远程仓库必须的一步。
忽略文件.gitignore可以在git add --all
的时候不提交部分文件,如不提交.o文件,则在.gitignore中写"*.o"
除了上面带领大家进行的一些操作,git还有许多丰富的命令,感兴趣可以积极尝试一下。