• 手把手陪你玩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

  • 相关阅读:
    EF架构~简洁关联表插入,优越的代码性能!
    基础才是重中之重~你是否真正了解TransactionScope?
    基础才是重中之重~如何整理BLL与DAL层的文件
    java Byte 和byte 差别及byte[ ]和string转换
    转: java的InputStream和OutputStream的理解
    java.awt.list java.util.list 区别
    java.util.Scanner 总结
    java .io OutputStream 与InputStream
    java 3中方法复制一个文件
    网络爬虫 简介
  • 原文地址:https://www.cnblogs.com/WHU-TD/p/14296011.html
Copyright © 2020-2023  润新知