Git和GitHub/Gitee 应用入门
<div id="MathJax_Message" style="display: none"> </div><div class="wiz_toc_layer">Git和GitHub/Gitee介绍<br>文件备份与版本管理<br> 版本回退<br> 管理修改<br> 撤销修改<br> 删除文件<br>远程仓库<br> SSH秘钥与远程仓库创建<br> 如何加密<br> 如何生成秘钥<br> 添加远程库<br> 如果是新建的,希望和本地的仓库关联<br> 如果是以前就有的,希望克隆到本地来<br>分支<br> 什么是分支?<br> 如何运用分支<br> 如何解决分支冲突<br>Git标签<br>术语总结</div>
<p>TOC <br>
本教程参考: <br>
1.廖雪峰Git教程:https://www.liaoxuefeng.com/wiki/896043488029600</p>
<h1>Git和GitHub/Gitee介绍</h1>
<p>Git是一个分布式的版本控制系统。Github是一个基于Git的项目托管平台,它提供了web界面,在本地或服务器创建一个资源仓库通过shell命令或图形用户界面可以和远端的github进行项目同步更新,实现对项目的管理。同时public的项目还可以同网友一同完成项目。</p>
<ul>
<li>Git安装 <br>
git的安装非常简单(官网):https://git-scm.com/download/ <br>
或者使用命令<code>sudo apt-get install git</code> <br>
<strong>安装完毕后,需要初始设置git</strong>。包括:设置姓名和邮箱地址。</li>
</ul>
<div>
<pre><code>git config --global user.name "Your Name"
git config --global user.email "Your Email"。</code></pre>
</div>
<p>(注意:emai最好与github相同,方便统一git管理,用于与github关联。 ) <br>
之后输入 <br>
<code>$ cat ~/.gitconfig</code> <br>
会输出设置文件。 <br>
另外,为了让命令的输入拥有更高的可读性。输入: <br>
<code>$ git config --global color.ui auto。</code> <br>
再输入<code>$ cat ~/.gitconfig</code>,可以看到增加了【color】一行。</p>
<ul>
<li>Git创建版本库(repository)</li>
</ul>
<div>
<pre><code>git init</code></pre>
</div>
<h1>文件备份与版本管理</h1>
<p>Git 的框架哲学与常说的“三思而后行”有些类似,包括工作区(Working Directory)、暂存区(stage)和最终的分支库。暂存区是为了方便保存不完整修改而专门设定的一个空间,分支库是完成修改的版本。</p>
<h2 id="版本回退">版本回退</h2>
<p>这个最常见发生在修改程序失败时。 <br>
关键命令 </p>
<div>
<pre><code>git reset --hard HEAD</code></pre>
</div>
<div>
<pre><code>git reset --hard (IDhead)</code></pre>
</div>
<p>辅助命令 <br>
<code>git log</code>和<code>git reflog</code> <br>
<code>git log --graph</code>还可以显示成树型图。</p>
<h2 id="管理修改">管理修改</h2>
<p>正向修改,需要用到的命令包括 <br>
<code>git add</code>和<code>git commit -m "(Explanation)"</code>。建议不要采用<code>git commit</code>,如果采用了该命令,用<code>:q!</code>可以退出。 <br>
辅助命令 <br>
<code>git diff HEAD -- (filename)</code> <br>
<code>git status -sb</code></p>
<h2 id="撤销修改">撤销修改</h2>
<p>这个主要是用在撤回暂存区中的修改和对直接修改不满的情况。 <br>
关键命令<br>
直接舍弃修改,还原branch中的分支文件</p>
<div>
<pre><code>git checkout -- (file)</code></pre>
</div>
<p>撤回暂存区中的修改</p>
<div>
<pre><code>git reset HEAD (file)</code></pre>
</div>
<h2 id="删除文件">删除文件</h2>
<p>这里主要是指删除分支库中的文件 <br>
<code>git rm</code>和<code>git commit</code></p>
<h1>远程仓库</h1>
<p>设立远程仓库管理自己的代码,需要注册github或gitee账号。 <br>
其中Github:登陆 https://github.com/ ,Gitee:登录</p>
<h2 id="SSH秘钥与远程仓库创建">SSH秘钥与远程仓库创建</h2>
<p>由于本地的git与远程服务器的github的传输是通过ssh进行加密的,GitHub需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,所以,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送。因此要想把本地的程序传输至服务器就必须要了解如何加密,以及如何设置密钥。</p>
<h3 id="如何加密">如何加密</h3>
<p>密钥产生于一种加密算法中,常见的加密算法包括:对称加密、非对称加密以及不可逆加密。 <br>
对称加密是指:数据发信方将明文(原始数据)和加密密钥一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去。收信方收到密文后,若想解读原文,则需要使用加密用过的密钥及相同算法的逆算法对密文进行解密,才能使其恢复成可读明文。在对称加密算法中,<span style="text-decoration: underline">使用的密钥只有一个</span>,发收信双方都使用这个密钥对数据进行加密和解密,这就要求解密方事先必须知道加密密钥。对称加密算法的特点是算法公开、计算量小、加密速度快、加密效率高。不足之处是,交易双方都使用同样钥匙,安全性得不到保证。此外,每对用户每次使用对称加密算法时,都需要使用其他人不知道的惟一钥匙,这会使得发收信双方所拥有的钥匙数量成几何级数增长,<span style="text-decoration: underline">密钥管理</span>成为用户的<span style="text-decoration: underline">负担</span>。对称加密算法在分布式网络系统上使用较为困难,主要是因为密钥管理困难,使用成本较高。在计算机专网系统中广泛使用的对称加密算法有DES(Data Encryption Standard)和IDEA等。美国国家标准局倡导的AES即将作为新标准取代DES。 <br>
非对称加密是指:不对称加密算法使用两把完全不同但又是完全匹配的一对钥匙—公钥和私钥。不对称加密算法的基本原理是,如果<span style="text-decoration: underline">发信方想发送</span>只有收信方才能解读的加密信息,<span style="text-decoration: underline">发信方必须首先知道收信方的公钥</span>,然后利用收信方的公钥来加密原文;收信方收到加密密文后,<span style="text-decoration: underline">使用自己的私钥才能解密</span>密文。显然,采用不对称加密算法,收发信双方在<span style="text-decoration: underline">通信之前</span>,<span style="text-decoration: underline">收信方必须将自己早已随机生成的公钥送给发信方,而自己保留私钥</span>。广泛应用的不对称加密算法有<strong>RSA算法</strong>和美国国家标准局提出的<strong>DSA(Digital Signature Algorithm)</strong>。 <br>
不可逆加密是指:不可逆加密算法的特征是加密过程中<span style="text-decoration: underline">不需要使用密钥</span>,输入明文后由系统直接经过加密算法处理成密文,这种加密后的数据是无法被解密的,只有<span style="text-decoration: underline">重新输入明文</span>,并再次经过同样不可逆的加密算法处理,得到相同的加密密文并被系统重新识别后,才能真正解密。所谓<span style="text-decoration: underline">解密,实际上就是重新加一次密</span>,所应用的“密码”也就是输入的明文。不可逆加密算法不存在密钥保管和分发问题,非常适合在分布式网络系统上使用,但因加密计算复杂,工作量相当繁重,通常只在数据量有限的情形下使用。近年来,随着计算机系统性能的不断提高,不可逆加密的应用领域正在逐渐增大。在计算机网络中应用较多不可逆加密算法的有RSA公司发明的<strong>MD5算法</strong>和由美国国家标准局建议的<strong>不可逆加密标准SHS(Secure Hash Standard:安全杂乱信息标准)</strong>等。 <br>
<strong>Git与Github</strong>则是采用非对称加密方式,有公钥和私钥。</p>
<h3 id="如何生成秘钥">如何生成秘钥</h3>
<p>Git系统下有一个专门的密钥管理软件,即ssh,也叫openssh。linux下可以通过<code>ssh-keygen -t rsa</code>命令,windows下则在GitShell中采用相同的命令来生成RSA密钥。 <br>
ssh-keygen提示输入密码短语(<strong>输入的不是远程服务器上系统账户的密码,可以直接回车</strong>),输入密码短语后,ssh-keygen用这个密码短语加密了私用密钥,以使私用密钥对于那些不知道这个密码短语的人将变得毫无用处。</p>
<ul>
<li>生成ssh key <br>
<code>ssh-keygen -t rsa -C enginelee@yeah.net</code> <br>
其中会在主文件下(windows位于用户主目录中)生成私钥和公钥,公钥的名称为“id_rsa.pub”,私钥的名称为“id_rsa”。通过以下命令,可以显示公钥的内容。 <br>
<code>cat ~/.ssh/id_rsa.pub</code></li>
<li>添加公开密钥 <br>
在github中添加公开密钥,操作流程通常是在“Account settings”->“SSH Keys”页面,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容。之后再在本地GitShell中输入 <br>
<code>ssh -T git@github.com</code> <br>
出现如下结果表示成功</li>
</ul>
<div>
<pre><code>Hi|(your name)|! You've successfully authenticated, but GitHub does not provide shell access.</code></pre>
</div>
<h3 id="添加远程库">添加远程库</h3>
<p>添加远程库,要求远程库存在一个Respository,这个Respository可以是新建的,也可以是之前就有的。</p>
<h4 id="如果是新建的,希望和本地的仓库关联">如果是新建的,希望和本地的仓库关联</h4>
<p>新建Respository后会出现以下界面,注意要将username(下图中的Aipowerli)改为自己的。 <br>
<img src="https://img2020.cnblogs.com/blog/1709413/202003/1709413-20200330142939148-997611575.png" alt=""> <br>
在第三行中,如果本地仓库已有,则可以采用以下命令来建立远程缓冲和将本地库推送到远程中。 <br>
<img src="https://img2020.cnblogs.com/blog/1709413/202003/1709413-20200330142939582-1317958167.png" alt=""></p>
<div>
<pre><code>git remote add origin git@github.com:Aipowerli/testgit.git
git push -u origin master</code></pre>
</div>
<p>这里有几点注意:1.私有仓库无法通过这种方式推送;2.命令中的origin可以修改,但两个命令必须保持一致。3.Git支持多种协议,包括https,但ssh协议速度最快,上文中的git格式是ssh协议的格式。</p>
<h4 id="如果是以前就有的,希望克隆到本地来">如果是以前就有的,希望克隆到本地来</h4>
<div>
<pre><code>git clone git@github.com:Aipowerli/testgit.git</code></pre>
</div>
<h1>分支</h1>
<blockquote>
<p>分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。 <br>
现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。--廖雪峰</p>
</blockquote>
<h2 id="那什么是分支呢?">那什么是分支呢?</h2>
<p>分支对应的英文原文叫Branch。其官方文档中提到,It is the way to work on different versions of a repository at one time。说白了,他就像版本管理树上的一个节点,可以是主节点,也可以是还在探索成长的分节点。这么说来,可能比较抽象。 <br>
我们看,之前在版本回退里面,我们可以用git log命令,看到版本库中的“一串”commit,可以说每一次commit,就在版本库中的master分支中生成了一个节点。目前,最上方的commit括号后显示有master branch和learning/master branch,表示本地和远程两个分支(如果没有远程,则只有本地Master一个分支),HEAD节点指向了master最新的以此commit。 <br>
<img src="https://img2020.cnblogs.com/blog/1709413/202003/1709413-20200330142939960-29871558.png" alt="" width="327" height="302"> <br>
如果此时在本地进行commit,而不push到远程。可以看到 <br>
<img src="https://img2020.cnblogs.com/blog/1709413/202003/1709413-20200330142940515-2126538412.png" alt="" width="318" height="115"> <br>
也就是HEAD指向了本地的master,而Github的版本则停留在了上次的push。 <br>
因此,分支的原理,其实就像C++语言当中的指针,只不过他运用的是多个指针。 <br>
比如,Git用<code>master</code>指向最初branch的最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点。 <br>
如果一旦新建了一个branch,就会新建一个指针,原来的master指针指向的位置,不会发生改变。而HEAD指针则会指向新指针,表示当前分支在新指针上。</p>
<h2 id="如何运用分支">如何运用分支</h2>
<p>直接创建并切换分支 <br>
<code>git checkout -b dev(branchname)</code> <br>
或者 <br>
创建分支 <br>
<code>git branch dev</code>,该命令创建分支完后,需要修改的内容commit才能在这个分支中进行真正的改变。 <br>
切换分支 <br>
<code>git checkout dev</code>,该命令也可以在已有分支时,做切换用。一旦切换了分支,本地文件会自动变成新分支的内容。 <br>
查看分支 <br>
<code>git branch</code>,该命令会列出所有分支,当前分支前面会标一个*号。 <br>
合并某分支到当前分支 <br>
<code>git merge dev</code>,该命令执行前,需要把先把HEAD切换回master分支。而且一旦合并后,自动将master分支更新。如果没有参数,合并的方式则是fast forward合并,看不出来曾经做过合并。 <br>
合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并。同时需要加入描述,如<code>git merge --no-ff -m "merge with no-ff" dev</code> <br>
删除分支 <br>
<code>git branch -d dev</code>,一般要在完成合并后,再删除分支。如果未合并分支,无法直接删除分支,如下图。 <br>
<img src="https://img2020.cnblogs.com/blog/1709413/202003/1709413-20200330142940869-2002942526.png" alt="" width="381" height="85"> <br>
而将分支切换至master后,未合并分支就像删除分支,会报错。提示用<code>git branch -D dev</code>。 <br>
<img src="https://img2020.cnblogs.com/blog/1709413/202003/1709413-20200330142941201-1740788710.png" alt="" width="385" height="128"> <br>
一旦删除,该分支名‘dev’就会永久删除,虽然可以通过git log的ID找到,但是需要重新新建分支名,切换到该分支,才可以像原来一样操作。</p>
<h2 id="如何解决分支冲突">如何解决分支冲突</h2>
<p>当两个分支都是由同一个分支分出来,要合并时,就有可能有冲突。通常,这种情况就像两个不同的人,同时对每一个版本节点进行了修改,需要合并的时候。 <br>
<img src="https://img2020.cnblogs.com/blog/1709413/202003/1709413-20200330142941501-669709223.png" alt="git-br-feature1"> <br>
解决冲突需要把Git合并失败的文件手动编辑为我们希望的内容。也就是说是在merge之后,手动修改,然后add,commit,并没有什么额外的操作。 <br>
<img src="https://img2020.cnblogs.com/blog/1709413/202003/1709413-20200330142941894-1532529812.png" alt="git-br-conflict-merged" width="443" height="219"></p>
<h1>Git标签</h1>
<p>标签的作用是用一个比较熟悉的名字来记ID,它虽然也是指针,但是是不能修改的和移动的。</p>
<div>
<pre><code>git tag (tagname)</code></pre>
</div>
<div>
<pre><code> git tag (tagname) ID</code></pre>
</div>
<p>注意,标签不是按时间顺序列出,而是按字母排序的。可以用<code>git show (tagname)</code>查看标签信息。 <br>
属性包括: <br>
-a:指定标签名,-m指定说明文字 <br>
查看标签采用<code>git tag</code> <br>
因为创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除。删除标签采用<code>git tag -d (tagname)</code>来实现。 <br>
如果要将标签推送到远程,可以采用</p>
<div>
<pre><code>git push origin --tags</code></pre>
</div>
<p>如果要删除远程的标签,需要先删除本地标签,然后采用</p>
<div>
<pre><code>git push origin :refs/tags/<tagname></code></pre>
</div>
<h1>术语总结</h1>
<ol class="wiz-list-level1">
<li>repository:A repository is usually used to organize <strong>a single project</strong>.就是远程的文件夹,最好是这一个项目就是一个<strong>项目库</strong>。放你想放的项目,建议包含一个readme文件,用来描述项目信息。</li>
<li>new branch:<strong>Branching</strong> is the way to work on different versions of a repository at one time.branch的思想是,只有非常有用的<strong>核心版本</strong>才能够成为我们项目库中的最主干的部分,这样既有利于看到项目的进展(而不是只要最新,不要过往的版本),同时又能保持整洁,不至于每一点点小改动都给专门记录以下,哪怕是修改一个极为小的bug,这样是不利于聚焦的。所以不是很重要的版本,只能够在branch当中成为枝叶了。最开始的时候,master被设定为默认主枝节。当你从master枝节创造一个新的枝节时,你会全部复制master branch当中的所有文件。如果其他人对你的branch进行了富有成效的修改,你可以pull in.一句话:主枝节中的程序都是可以直接部署应用的程序(deployable)</li>
<li>commit:所谓的commit是指每一次对程序(绝不仅仅是对branch)的<strong>修改</strong>。每一次commit都会对应一个message,用来描述具体做了什么修改。commit message记录了你对程序的修改情况,方便自己和他人的阅读。记住,在每一个branch当中,所做的修改都要记录commit,并且commit change,这个commit才会生效,即才会被改动。 <br>
<img src="https://img2020.cnblogs.com/blog/1709413/202003/1709413-20200330142942627-22273823.png" alt="commit" width="546" height="372"></li>
<li>Pull Request:其实可以理解为<strong>开放请求</strong>,一是方便给他人检查评论以及修改订正;二是告诉大家,这个版本是欢迎来聊骚的(可以使用@mention system来指定谁来修改(如同“知乎”上指定谁回答一样))。Pull requests显示了所有的diffs, or differences. The changes, additions, and subtractions are shown in green and red.有一个好消息:Pull Request的评论是支持Markdown的。</li>
<li>merge:不管branch有没有被pull request,都可以将其<strong>合并</strong>到主枝节上</li>
<li>Issue:这是将一个任务或问题分配给一个Issue进行追踪和管理的功能。在github上,每当进行一次pull,都会同时创建一个issue。在git的提交信息中写上issue的ID(#number),github就会自动生成从issue到对应提交的链接。</li>
</ol>
<h1><wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;"></h1>
<div id="wiz-table-col-line" style="display: none"> </div>
<div id="wiz-table-row-line" style="display: none"> </div>
<div id="wiz-table-range-border_start" style="display: none"> </div>
<div id="wiz-table-range-border_range" style="display: none"> </div>
<div>
<h3>附件列表</h3>
</div>
<p> </p><br><br>
来源:https://www.cnblogs.com/AIpower/p/12598427.html
頁:
[1]