手把手陪你玩Git

Git简介

Git是一款免费、开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。它拥有完整的版本控制功能,可以实现多人协作,提高开发效率。版本控制可以方便添加新功能,在新版本出问题的时候也方便回滚到上一个版本。当前许多优秀的开源项目都通过Git进行协作开发,如node、sqlmap等等。

Git核心概念

分布式

集中式版本控制系统:版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑。所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。中央服务器比作一个图书馆,你要改一本书,必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆。

img

分布式版本控制系统:没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样工作的时候,就不需要联网了,因为版本库就在电脑上。

既然每台电脑上都有一个完整的版本库,那多个人如何协作呢?

比方说你在自己电脑上改了文件A,你的同事在他的电脑上改了文件A。你们俩之间只需要把各自的修改推送给对方,就可以互相看到对方的修改了。

实际使用分布式版本控制系统的时候,很少在两台电脑之间推送版本库的修改。因为可能两台电脑之间不能互相访问,也可能其中一台电脑压根就没有开机。因此,分布式版本控制系统通常也有一台充当“中央服务器”的电脑,这个服务器的作用仅仅是用来方便“交换”大家的修改。没有它大家也一样干活,只是交换修改不方便而已。

img

集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了。

分布式版本控制系统的每台电脑里都有完整的版本库,某台电脑坏掉了不要紧,从其他电脑里复制一份就可以。因此,代码安全性要高很多。

Git的优势是拥有极其强大的分支管理,把Svn等远远抛在了身后。

分支

一个项目一般有一个主分支master(在新版的github中称为main分支),开发者可以在一个分支的基础上复制一个新分支,在新分支上进行开发,之后可以与其他分支进行合并(merge),这样就可以对一个项目的特性进行开发,实现多人协作开发。

img

工作区、暂存区、版本库、远程仓库

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"

image-20210118200421261

创建仓库

创建仓库有三种起点

  • 一个克隆的仓库
  • 一个文件未被跟踪(有文件但没通过Git组合)的文件夹
  • 一个空目录

2和3基本没区别,我们等下选取2来讲解。

远程仓库克隆(clone)

第二个是克隆仓库,是比较简单的做法,我们先在github上创建一个远程仓库。

image-20210118202829130

image-20210118203306389

这里有一点要注意的是,Git的默认主分支一直都是master,但Github近期因种族歧视的原因将其改为main,为了与大多数教程接轨,可以在settings把默认的主分支改回为master。

现在创建好了仓库,就可以clone到本地进行开发了

image-20210118203643944

git clone url #克隆已有仓库到本地

image-20210118203741808

本地创建仓库(init、status、add、commit、remote、push)

git init #在已有文件的文件夹中使用

image-20210118201748756

看到提示Initialized empty Git repository .../.git/表明系统并没有立即将文件加入仓库,需要后面使用git add命令实现,这里可用git status查看文件状态,可以看到,readme.txt并没有被track。需要注意,.git文件夹是隐藏文件夹,需要ls -a等命令才能查看到。

接下来使用git add提交到暂存区,再用git commit命令提交到版本库

image-20210118213434799

在github上创建远程仓库,使用git remote命令连接远程仓库,并用git push将文件传送过去。

image-20210119000806987

创建好的空项目其实是有代码指引的。

image-20210119000835208

image-20210119001028059

这里要注意,我们是不能从本地直接在github上创建仓库的,需要提前从github创建好,再用git remote连接。

创建分支及修改(branch、checkout、merge)

我们对git-share2项目进行修改,我们尽量不要直接在master分支上进行修改,而应先创建一个分支,然后进行merge合并。

git branch branch-name #创建分支
git branch --all #显示所有分支(包括远程仓库)
git branch #显示本地分支
git checkout branch-name #切换分支

image-20210118221417903

也可加入-b参数从某一分支创建并直接转移至新分支

git checkout -b newbranch oldbranch

image-20210118221801442

接下来开始修改内容

初始状态下test.txt

image-20210118222337543

在branch1中写入内容,通过add、commit、push传送到远程仓库

image-20210118222312297

image-20210118222600403

这里commit的-m参数表示后面接提交信息,push中的origin表示当前连接仓库的别名,可通过git remote来进行修改

push之后,branch1被正式提交到github的远程仓库

image-20210118222756242

内容也被成功提交

image-20210118222916644

对branch2进行同样类似的修改,但改为branch2

image-20210118223416370

我们先转到master分支,将branch1与master合并,自动合并顺利,然后尝试将branch2也合并进来,此时相当于两位开发者对同一个项目进行了不同的修改,且产生了冲突(一个是branch1,一个是branch2),在merge中会有所影响。

image-20210118223944028

此时,冲突的文件test.txt会显示冲突的内容

image-20210118224859977

image-20210118224937739

针对冲突内容进行修改,之后保存即可相当于修改完成,这里我们将branch2添加进去

image-20210118225059418

之后add、commit、push即可

image-20210118225312661

删除(rm)

image-20210118233946333

image-20210118235922395

在github中点开文件可直接删除远程仓库中文件

也可使用git rm 文件名从本地版本库删除文件

git rm --cached 文件名可在本地版本库中删除文件,但本地不删除

image-20210119001601426

git checkout 文件名可撤销删除

image-20210119003002640

撤销、回退(reset、reflog)

如果不小心把不想添加的文件add进去了,可以使用git reset来取消

image-20210119003235572

使用reflog可以列出你在 Git 上的所有操作记录,根据它使用git reset HEAD@{index}可进行版本回退

image-20210119003812528

更新(pull、fetch)

先用一张图来理一下git fetchgit pull的概念:

img

可以简单的概括为:

git fetch是将远程主机的最新内容拉到本地,用户在检查了以后决定是否合并到工作本机分支中。

而git pull 则是将远程主机的最新内容拉下来后直接合并,即:git pull = git fetch + git merge,这样可能会产生冲突,需要手动解决。

git pull 远程主机名 远程分支名:本地分支名

image-20210119010243433

额外小技巧

配置远程ssh连接,可将机器与github账号绑定,无需多次输入密码,也是在本地使用git remote add创建远程仓库必须的一步。

忽略文件.gitignore可以在git add --all的时候不提交部分文件,如不提交.o文件,则在.gitignore中写"*.o"

image-20210119004538207

除了上面带领大家进行的一些操作,git还有许多丰富的命令,感兴趣可以积极尝试一下。

preview

原文地址:https://www.cnblogs.com/WHU-TD/p/14296011.html