Git和GitHub/Gitee 应用入门

TOC
本教程参考:
1.廖雪峰Git教程:https://www.liaoxuefeng.com/wiki/896043488029600

Git和GitHub/Gitee介绍

Git是一个分布式的版本控制系统。Github是一个基于Git的项目托管平台,它提供了web界面,在本地或服务器创建一个资源仓库通过shell命令或图形用户界面可以和远端的github进行项目同步更新,实现对项目的管理。同时public的项目还可以同网友一同完成项目。

  • Git安装
    git的安装非常简单(官网):https://git-scm.com/download/
    或者使用命令sudo apt-get install git
    安装完毕后,需要初始设置git。包括:设置姓名和邮箱地址。
git config --global user.name "Your Name" 
git config --global user.email "Your Email"。

(注意:emai最好与github相同,方便统一git管理,用于与github关联。 )
之后输入
$ cat ~/.gitconfig
会输出设置文件。
另外,为了让命令的输入拥有更高的可读性。输入:
$ git config --global color.ui auto。
再输入$ cat ~/.gitconfig,可以看到增加了【color】一行。

  • Git创建版本库(repository)
git init

文件备份与版本管理

Git 的框架哲学与常说的“三思而后行”有些类似,包括工作区(Working Directory)、暂存区(stage)和最终的分支库。暂存区是为了方便保存不完整修改而专门设定的一个空间,分支库是完成修改的版本。

版本回退

这个最常见发生在修改程序失败时。
关键命令

git reset --hard HEAD
git reset --hard (IDhead)

辅助命令
git loggit reflog
git log --graph还可以显示成树型图。

管理修改

正向修改,需要用到的命令包括
git addgit commit -m "(Explanation)"。建议不要采用git commit,如果采用了该命令,用:q!可以退出。
辅助命令
git diff HEAD -- (filename)
git status -sb

撤销修改

这个主要是用在撤回暂存区中的修改和对直接修改不满的情况。
关键命令
直接舍弃修改,还原branch中的分支文件

git checkout -- (file)

撤回暂存区中的修改

git reset HEAD (file)

删除文件

这里主要是指删除分支库中的文件
git rmgit commit

远程仓库

设立远程仓库管理自己的代码,需要注册github或gitee账号。
其中Github:登陆 https://github.com/ ,Gitee:登录

SSH秘钥与远程仓库创建

由于本地的git与远程服务器的github的传输是通过ssh进行加密的,GitHub需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,所以,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送。因此要想把本地的程序传输至服务器就必须要了解如何加密,以及如何设置密钥。

如何加密

密钥产生于一种加密算法中,常见的加密算法包括:对称加密、非对称加密以及不可逆加密。
对称加密是指:数据发信方将明文(原始数据)和加密密钥一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去。收信方收到密文后,若想解读原文,则需要使用加密用过的密钥及相同算法的逆算法对密文进行解密,才能使其恢复成可读明文。在对称加密算法中,使用的密钥只有一个,发收信双方都使用这个密钥对数据进行加密和解密,这就要求解密方事先必须知道加密密钥。对称加密算法的特点是算法公开、计算量小、加密速度快、加密效率高。不足之处是,交易双方都使用同样钥匙,安全性得不到保证。此外,每对用户每次使用对称加密算法时,都需要使用其他人不知道的惟一钥匙,这会使得发收信双方所拥有的钥匙数量成几何级数增长,密钥管理成为用户的负担。对称加密算法在分布式网络系统上使用较为困难,主要是因为密钥管理困难,使用成本较高。在计算机专网系统中广泛使用的对称加密算法有DES(Data Encryption Standard)和IDEA等。美国国家标准局倡导的AES即将作为新标准取代DES。
非对称加密是指:不对称加密算法使用两把完全不同但又是完全匹配的一对钥匙—公钥和私钥。不对称加密算法的基本原理是,如果发信方想发送只有收信方才能解读的加密信息,发信方必须首先知道收信方的公钥,然后利用收信方的公钥来加密原文;收信方收到加密密文后,使用自己的私钥才能解密密文。显然,采用不对称加密算法,收发信双方在通信之前收信方必须将自己早已随机生成的公钥送给发信方,而自己保留私钥。广泛应用的不对称加密算法有RSA算法和美国国家标准局提出的DSA(Digital Signature Algorithm)
不可逆加密是指:不可逆加密算法的特征是加密过程中不需要使用密钥,输入明文后由系统直接经过加密算法处理成密文,这种加密后的数据是无法被解密的,只有重新输入明文,并再次经过同样不可逆的加密算法处理,得到相同的加密密文并被系统重新识别后,才能真正解密。所谓解密,实际上就是重新加一次密,所应用的“密码”也就是输入的明文。不可逆加密算法不存在密钥保管和分发问题,非常适合在分布式网络系统上使用,但因加密计算复杂,工作量相当繁重,通常只在数据量有限的情形下使用。近年来,随着计算机系统性能的不断提高,不可逆加密的应用领域正在逐渐增大。在计算机网络中应用较多不可逆加密算法的有RSA公司发明的MD5算法和由美国国家标准局建议的不可逆加密标准SHS(Secure Hash Standard:安全杂乱信息标准)等。
Git与Github则是采用非对称加密方式,有公钥和私钥。

如何生成秘钥

Git系统下有一个专门的密钥管理软件,即ssh,也叫openssh。linux下可以通过ssh-keygen -t rsa命令,windows下则在GitShell中采用相同的命令来生成RSA密钥。
ssh-keygen提示输入密码短语(输入的不是远程服务器上系统账户的密码,可以直接回车),输入密码短语后,ssh-keygen用这个密码短语加密了私用密钥,以使私用密钥对于那些不知道这个密码短语的人将变得毫无用处。

  • 生成ssh key
    ssh-keygen -t rsa -C enginelee@yeah.net
    其中会在主文件下(windows位于用户主目录中)生成私钥和公钥,公钥的名称为“id_rsa.pub”,私钥的名称为“id_rsa”。通过以下命令,可以显示公钥的内容。
    cat ~/.ssh/id_rsa.pub
  • 添加公开密钥
    在github中添加公开密钥,操作流程通常是在“Account settings”->“SSH Keys”页面,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容。之后再在本地GitShell中输入
    ssh -T git@github.com
    出现如下结果表示成功
Hi  |(your name)|! You've successfully authenticated, but GitHub does not provide shell access.

添加远程库

添加远程库,要求远程库存在一个Respository,这个Respository可以是新建的,也可以是之前就有的。

如果是新建的,希望和本地的仓库关联

新建Respository后会出现以下界面,注意要将username(下图中的Aipowerli)改为自己的。

在第三行中,如果本地仓库已有,则可以采用以下命令来建立远程缓冲和将本地库推送到远程中。

git remote add origin git@github.com:Aipowerli/testgit.git
git push -u origin master

这里有几点注意:1.私有仓库无法通过这种方式推送;2.命令中的origin可以修改,但两个命令必须保持一致。3.Git支持多种协议,包括https,但ssh协议速度最快,上文中的git格式是ssh协议的格式。

如果是以前就有的,希望克隆到本地来

git clone git@github.com:Aipowerli/testgit.git

分支

分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。
现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。--廖雪峰

那什么是分支呢?

分支对应的英文原文叫Branch。其官方文档中提到,It is the way to work on different versions of a repository at one time。说白了,他就像版本管理树上的一个节点,可以是主节点,也可以是还在探索成长的分节点。这么说来,可能比较抽象。
我们看,之前在版本回退里面,我们可以用git log命令,看到版本库中的“一串”commit,可以说每一次commit,就在版本库中的master分支中生成了一个节点。目前,最上方的commit括号后显示有master branch和learning/master branch,表示本地和远程两个分支(如果没有远程,则只有本地Master一个分支),HEAD节点指向了master最新的以此commit。

如果此时在本地进行commit,而不push到远程。可以看到

也就是HEAD指向了本地的master,而Github的版本则停留在了上次的push。
因此,分支的原理,其实就像C++语言当中的指针,只不过他运用的是多个指针。
比如,Git用master指向最初branch的最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点。
如果一旦新建了一个branch,就会新建一个指针,原来的master指针指向的位置,不会发生改变。而HEAD指针则会指向新指针,表示当前分支在新指针上。

如何运用分支

直接创建并切换分支
git checkout -b dev(branchname)
或者
创建分支
git branch dev,该命令创建分支完后,需要修改的内容commit才能在这个分支中进行真正的改变。
切换分支
git checkout dev,该命令也可以在已有分支时,做切换用。一旦切换了分支,本地文件会自动变成新分支的内容。
查看分支
git branch,该命令会列出所有分支,当前分支前面会标一个*号。
合并某分支到当前分支
git merge dev,该命令执行前,需要把先把HEAD切换回master分支。而且一旦合并后,自动将master分支更新。如果没有参数,合并的方式则是fast forward合并,看不出来曾经做过合并。
合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并。同时需要加入描述,如git merge --no-ff -m "merge with no-ff" dev
删除分支
git branch -d dev,一般要在完成合并后,再删除分支。如果未合并分支,无法直接删除分支,如下图。

而将分支切换至master后,未合并分支就像删除分支,会报错。提示用git branch -D dev

一旦删除,该分支名‘dev’就会永久删除,虽然可以通过git log的ID找到,但是需要重新新建分支名,切换到该分支,才可以像原来一样操作。

如何解决分支冲突

当两个分支都是由同一个分支分出来,要合并时,就有可能有冲突。通常,这种情况就像两个不同的人,同时对每一个版本节点进行了修改,需要合并的时候。
git-br-feature1
解决冲突需要把Git合并失败的文件手动编辑为我们希望的内容。也就是说是在merge之后,手动修改,然后add,commit,并没有什么额外的操作。
git-br-conflict-merged

Git标签

标签的作用是用一个比较熟悉的名字来记ID,它虽然也是指针,但是是不能修改的和移动的。

git tag (tagname)
 git tag (tagname) ID

注意,标签不是按时间顺序列出,而是按字母排序的。可以用git show (tagname)查看标签信息。
属性包括:
-a:指定标签名,-m指定说明文字
查看标签采用git tag
因为创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除。删除标签采用git tag -d (tagname)来实现。
如果要将标签推送到远程,可以采用

git push origin --tags

如果要删除远程的标签,需要先删除本地标签,然后采用

git push origin :refs/tags/<tagname>

术语总结

  1. repository:A repository is usually used to organize a single project.就是远程的文件夹,最好是这一个项目就是一个项目库。放你想放的项目,建议包含一个readme文件,用来描述项目信息。
  2. new branch:Branching is the way to work on different versions of a repository at one time.branch的思想是,只有非常有用的核心版本才能够成为我们项目库中的最主干的部分,这样既有利于看到项目的进展(而不是只要最新,不要过往的版本),同时又能保持整洁,不至于每一点点小改动都给专门记录以下,哪怕是修改一个极为小的bug,这样是不利于聚焦的。所以不是很重要的版本,只能够在branch当中成为枝叶了。最开始的时候,master被设定为默认主枝节。当你从master枝节创造一个新的枝节时,你会全部复制master branch当中的所有文件。如果其他人对你的branch进行了富有成效的修改,你可以pull in.一句话:主枝节中的程序都是可以直接部署应用的程序(deployable)
  3. commit:所谓的commit是指每一次对程序(绝不仅仅是对branch)的修改。每一次commit都会对应一个message,用来描述具体做了什么修改。commit message记录了你对程序的修改情况,方便自己和他人的阅读。记住,在每一个branch当中,所做的修改都要记录commit,并且commit change,这个commit才会生效,即才会被改动。
    commit
  4. Pull Request:其实可以理解为开放请求,一是方便给他人检查评论以及修改订正;二是告诉大家,这个版本是欢迎来聊骚的(可以使用@mention system来指定谁来修改(如同“知乎”上指定谁回答一样))。Pull requests显示了所有的diffs, or differences. The changes, additions, and subtractions are shown in green and red.有一个好消息:Pull Request的评论是支持Markdown的。
  5. merge:不管branch有没有被pull request,都可以将其合并到主枝节上
  6. Issue:这是将一个任务或问题分配给一个Issue进行追踪和管理的功能。在github上,每当进行一次pull,都会同时创建一个issue。在git的提交信息中写上issue的ID(#number),github就会自动生成从issue到对应提交的链接。

<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">

附件列表

 

posted @ 2020-03-30 14:30  aipower  阅读(551)  评论(0)    收藏  举报