-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsearch.xml
22 lines (12 loc) · 20.1 KB
/
search.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?xml version="1.0" encoding="utf-8"?>
<search>
<entry>
<title>Git基础</title>
<link href="/2016/04/02/git/"/>
<url>/2016/04/02/git/</url>
<content type="html"><![CDATA[<p> 通过这段时间对Git的学习与使用在这里将git的基本使用流程及自己对git的一些见解写一篇文章。git使用的时间很长了,但是由于一直使用工具,对命令操作记得不是太清晰,所以在这里记录一下,方便以后的使用的时候查阅。<br><a id="more"></a></p><h2 id="为什么要使用Git"><a href="#为什么要使用Git" class="headerlink" title="为什么要使用Git"></a>为什么要使用Git</h2><p> 我们为什么要用Git呢?比如我们在写一个文档,你突然想删除一部分内容,但是你又怕删除后发现那部分内容不应该删除,这时候你会存一个副本用来存储原来的历史信息,在原文件中删除自己想删除的内容,但是有个问题,也就是我们每次修改和删除都会存个副本,那么当修改的次数足够多的时候,我们这个文件夹就会变的非常乱,非常庞大,管理起来非常不方便,但是用Git可以做到这一点,可以很方便管理我们每一次修改过的版本。当然Git并不是这一点好处,比如团队协同开发的时候也非常有用,每个团队的成员都可以在不影响别人的情况下开发自己的模块,在开发好后进行合并等。 Git的用途还有很多很多,我只是是举了个很小的例子。</p><h2 id="Git和svn的差别"><a href="#Git和svn的差别" class="headerlink" title="Git和svn的差别"></a>Git和svn的差别</h2><p> Git为分布式的版本控制系统,与SVN的区别就是每次客户端从远程clone一个版本时,会将远程仓库的所有历史纪录的镜像克隆了下来。这样的话,我们每个使用客户端的开发人员就可以在本地对提交修改自己的项目,最后再push到远程仓库中去。</p><h2 id="Git命令的使用介绍-(该教程基于Mac系统)"><a href="#Git命令的使用介绍-(该教程基于Mac系统)" class="headerlink" title="Git命令的使用介绍 (该教程基于Mac系统)"></a>Git命令的使用介绍 (该教程基于Mac系统)</h2><h3 id="Git的安装"><a href="#Git的安装" class="headerlink" title="Git的安装"></a><strong>Git的安装</strong></h3><p> 安装这部分比较简单,我门都可以通过谷歌和百度搜索的到简单的教程: </p><ol><li><a href="git-scm.com/downloads" title="git的下载">下载git</a> </li><li>下载成功后双击打开按照提示即可 </li><li>安装成功后使用 git –version可以看到版本信息,如下<br><code>➜ ~ git --version</code><br><code>git version 2.5.4 (Apple Git-61)</code></li><li>配置提交时的信息<br>使用git config —global user.name “….”<br>使用git config —global user.email “….”<br>配置成功后使用cat .gitconfig可以显示类似如下的信息。 </li></ol><p><code>➜ ~ cat .gitconfig</code><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">[core]</span><br><span class="line">excludesfile = /Users/***/.gitignore_global</span><br><span class="line">[difftool "sourcetree"]</span><br><span class="line">cmd = opendiff \"$LOCAL\" \"$REMOTE\"</span><br><span class="line">path =</span><br><span class="line">[mergetool "sourcetree"]</span><br><span class="line">cmd = /Applications/SourceTree.app/Contents/Resources/opendiff-w.sh \"$LOCAL\" \"$REMOTE\" -ancestor \"$BASE\" -merge \"$MERGED\"</span><br><span class="line">trustExitCode = true</span><br><span class="line">[user]</span><br><span class="line">name = ******</span><br><span class="line">email = *****</span><br><span class="line">[commit]</span><br><span class="line">template = /Users/***/.stCommitMsg</span><br><span class="line">[color]</span><br><span class="line">ui = auto</span><br></pre></td></tr></table></figure></p><h3 id="Git-的基本操作:"><a href="#Git-的基本操作:" class="headerlink" title="Git 的基本操作:"></a><strong>Git 的基本操作:</strong></h3><p><在这里我只是将简单的命令组合进行一下介绍,如果想详细了解可以使用man命令或者--help命令来看一个命令的使用介绍> <code>以下操作都是在终端进行</code> </p><ol><li><strong>在本地新建空的仓库</strong><br> 用mkdir 创建本地的仓库文件夹 <pre><code>mkdir mygit</code></pre> 用然后进入创建的文件夹 <pre><code>cd mygit</code></pre> 使用git init命令进行仓库的初始化 <pre><code>git init</code></pre> 这时候一个空的本地仓库就已经创建成功了。 </li><li><strong>克隆仓库到本地也是比较简单的,使用git clone命令就可以将远程的仓库下载到本地。</strong><br> 这里我以github为例子,我从我的github远程仓库中clone项目到本地。<br> 这里直接将我远程的wokforme仓库clone到本地 <pre><code>git clone https://github.com/viplwj/workforme.git</code></pre> 这是候本地就将远程的git仓库clone下来。 </li><li><p><strong>Git本地仓库三种状态介绍</strong><br>到现在为止我已经拥有了和远程仓库一样的本地仓库,我可以在其中修改和删除并且提交这个项目的更改了<br>在做这些操作之前,我先对本地仓库文件的三种状态进行一个简单的介绍 </p><p><img src="http://7xskpb.com2.z0.glb.clouddn.com/three.png" alt=""><br>ps:图片来自网络。<br>该图片中叙述了文件的三种状态,以及三种状态的切换,(<strong>modified , staged,committed</strong>)我门clone下来的项目后,项目的文件夹属于工作目录。修改过后的文件和本地仓库最开始的状态不同的时候,这时候文件的状态为<strong>modified</strong>然后我们需要将文件add进staged中去 <strong>staged就是暂存区域</strong>,用来我们存放那些改动的文件,最后通过commit提交到本地的仓库中去,提交成功后该文件就属于 <strong>committed状态</strong>。 </p></li><li><strong>对本地仓库进行简单的命令操作</strong><br> 当我们修改过本地文件的时候,我们需要看当前分支的中改动过的文件,在没有改动过文件之前使用如下命令:<br> <code>git status</code><br> 会提示如下<br> <img src="http://7xskpb.com2.z0.glb.clouddn.com/100.png" alt=""><br> 用touch命令创建一个test.txt文件然后再来看看status<br> <code>touch test.txt</code><br> <code>git status</code><br> 会有如下提示<br> <img src="http://7xskpb.com2.z0.glb.clouddn.com/101.png" alt=""><br> 这里将看到我的test.txt文件这时候属于modified状态,现在我需要将其加入到staged状态中去<br> 使用git add命令将其加入到暂存区域中。<br> <img src="http://7xskpb.com2.z0.glb.clouddn.com/102.png" alt=""><br>这时候该文件就在<code>staged</code>状态中了,下一步我将要提交这次修改到本地<br> 这里可以使用commit命令进行提交,使用commit 命令时如果后面不加任何参数则会跳出一个<br> 文本框让你输入提交说明,这里我使用的是-m命令进行提交,使用<code>-m</code>后面可以直接加参数,该参数的内容为这次提交的说明。如果想要跳过暂存状态进行提交,则直接加 <code>-a</code> 这个命令会直接将本地修改过后的文件先加入staged中然后再commit。也就是直接执行了两条命令。<br><img src="http://7xskpb.com2.z0.glb.clouddn.com/103.png" alt=""><br>提交成功后我们就看到了本地仓库为clean状态。也就是代表在上次提交之后没有任何修改。<br>这里我在test.txt文件中添加一些内容<br><img src="http://7xskpb.com2.z0.glb.clouddn.com/104.png" alt=""><br>这时候如果我们想看一下我们和上次提交过后有什么内容的不同,这时候可以使用<code>git diff</code>命令进行查看。<br><img src="http://7xskpb.com2.z0.glb.clouddn.com/105.png" alt=""><br> 可以看到我刚才在test.txt中添加的一段文字。如果我们将文件加入到暂存区域了我们可以使用<code>git diff —cached</code>命令进行查看和上一次提交的差异<br> <img src="http://7xskpb.com2.z0.glb.clouddn.com/106.png" alt=""><br> 这时候我想看一下改项目的日志,我们可以使用 git log 如果想看详细一点的话可以用<br> <code>git log -p</code><br> 该命令可以查看到自己提交的详细信息,<code>作者,邮箱,时间,提交的注释等</code><br> <img src="http://7xskpb.com2.z0.glb.clouddn.com/107x.png" alt=""><br>这里可以看到我刚才的那一次提交,以及修改的文件名称等信息。<br> 我们每一次提交就会生成一串SHA-1值这个id可以帮助我们回滚项目的版本,以及切换到某个版本中去。<br> 这里我们使用<code>git reset</code>命令将加入暂存的test.txt文件恢复出来<br> <img src="http://7xskpb.com2.z0.glb.clouddn.com/108.png" alt=""><br> 当然reset命令并不是这么简单,用<code>git reset —hard commit id</code>可以回退到commit id 提交的状态。<br> 如果在工作中错误的修改了一个文件,那么我们可以用<code>git checkout</code>命令将该文件恢复成原始状态。<br> <img src="http://7xskpb.com2.z0.glb.clouddn.com/109.png" alt=""><br> 如果我们想从git 中删除某个文件可以使用<code>git rm</code>命令,但是我们使用普通的命令进行删除则会出现下面的情况<br> <img src="http://7xskpb.com2.z0.glb.clouddn.com/110.png" alt=""><br> 不过这时候我们可以使用<code>git rm</code>命令进行删除<br> <img src="http://7xskpb.com2.z0.glb.clouddn.com/111.png" alt=""><br> <strong>下面一些简单的命令紧紧介绍一下不做详细的操作流程演示:</strong><br> <code>git commit —amend</code>该命令可以将最后一次提交回滚重新提交,如果我提交的说明写的有点问题,或者我少提交几个文件,那么我可以使用这个命令将其重新提提交。<br> <code>git mv</code>移动文件,这个命令相当于运行了三条命令,即: <ol><li><code>mv a.txt b.txt</code></li><li><code>git rm a.txt</code></li><li><code>git add b.txt</code> </li></ol></li></ol><h3 id="远程仓库"><a href="#远程仓库" class="headerlink" title="远程仓库"></a><strong>远程仓库</strong></h3><p>在使用远程仓库之前,我们为了方便不每次都输入用户名和密码所以这里要将自己电脑的SSH key加入到github账户中去。<br> <img src="http://7xskpb.com2.z0.glb.clouddn.com/112x.png" alt=""><br> 这里已经生成了ssh key,找到key后将其加入到github上面,将下面的id_rsa.pub里面的内容复制出来粘贴到下面的key框中<br> <img src="http://7xskpb.com2.z0.glb.clouddn.com/113x.png" alt=""><br> title随便来<br> <img src="http://7xskpb.com2.z0.glb.clouddn.com/114x.png" alt=""><br> 添加成功后如下<br> <img src="http://7xskpb.com2.z0.glb.clouddn.com/115x.png" alt=""><br> 如果远程是个空仓库,本地仓库不是空的,这里需要将本地仓库使用<code>git remote add 仓库命名 “url”</code>这个命令将本地仓库和远程仓库进行关联。<br> 成功关联后就可以推送我们的项目到远程去,我这个项目是clone的所以已经关联好了。<br>通过<code>git remote -v</code>命令可以显示出来远程仓库中的地址和名称<br> <img src="http://7xskpb.com2.z0.glb.clouddn.com/116.png" alt=""><br> 接下来我们将之前的本地修改的提交push到远程仓库中去。<br> <code>git push 将要推送的仓库:远端目的地</code><br> <img src="http://7xskpb.com2.z0.glb.clouddn.com/117.png" alt=""><br> 下面已经推送到远程仓库了<br> <img src="http://7xskpb.com2.z0.glb.clouddn.com/118.png" alt=""><br> 当远程仓库有改动的情况下,我们需要使用<code>git pull</code>命令将远程的仓库拉取下来,然后与本地的分支进行合并,下面我修改远端文件<br> <img src="http://7xskpb.com2.z0.glb.clouddn.com/119.png" alt=""><br><code>git pull</code>命令其实是执行了两个操作一个是 <code>git fetch</code> 一个是<code>git merge</code><br> <img src="http://7xskpb.com2.z0.glb.clouddn.com/120.png" alt=""><br> 我们平时应该少用pull 因为他直接将远程与本地的合并了,并不能看到远程仓库与本地的区别。<br> 这里我们用<code>git fetch</code>后可以先将内容拉取下来然后可以对比本地和远程的区别。<br> <img src="http://7xskpb.com2.z0.glb.clouddn.com/121.png" alt=""> <img src="http://7xskpb.com2.z0.glb.clouddn.com/122.png" alt=""><br>确认后便可以进行<code>git merge</code>操作<br><img src="http://7xskpb.com2.z0.glb.clouddn.com/123.png" alt=""></p><h3 id="分支"><a href="#分支" class="headerlink" title="分支"></a><strong>分支</strong></h3><p>分支感觉是git中非常强大的地方,我们在平时的开发中,有一个稳定版本的开发主线,还有一条体验版的开发主线,体验版的上面会有些比较新的功能,这时候就不能将两条线放到一起开发,可以分出两条分支来一条分支用来稳定版开发,一条用来体验版功能的开发,等体验版的功能完善并且可以合并到稳定版的时候,我们可以将体验版的功能分支合并到自己的稳定版的分支中。在我们创建仓库的时候就已经默认的为我们创建了一个分支,这个分支为master分支,我们每一次提交都会在该分支上增加一个节点。并且每个节点都会有一个独有的哈希值,我们可以通过这个值找到我们任何一次提交的版本。之后我会对gitflow写一篇文章。</p><h4 id="分支中基本命令的使用"><a href="#分支中基本命令的使用" class="headerlink" title="分支中基本命令的使用"></a><strong>分支中基本命令的使用</strong></h4><p> 我们可以使用<code>git branch name</code>命令创建分支。<br> 通过<code>git branch</code>命令来查看当前仓库的所有分支,以及看现在属于在哪个分支上。<br> 用<code>git checkout name</code> 命令来切换分支<br> <img src="http://7xskpb.com2.z0.glb.clouddn.com/124.png" alt=""><br> 现在我已经切换到了test分支中了<br> 如果想删除该分支要先切换到其他分支中去然后再删除 test分支使用<br> <code>git brach -d test</code><br> <img src="http://7xskpb.com2.z0.glb.clouddn.com/125.png" alt=""><br> 使用<code>git checkout -b test</code>也可以创建分支,并且直接切换到创建的分支上去;<br> <code>git checkout</code>加上任意一次提交的版本就可以切换工作目录到相应的版本上去。将HEAD切换到想要切换的版本上面去<br> ps:借用网上的图片加深理解<br> <img src="http://7xskpb.com2.z0.glb.clouddn.com/126.png" alt=""> </p><h4 id="merge合并"><a href="#merge合并" class="headerlink" title="merge合并"></a><strong>merge合并</strong></h4><p>当我们在一个项目中开了另一个分支进行工作后,工作完成后我们需要将两个分支进行合并。<br>为了理解合并分支我这里从网上找了一张图<br><img src="http://7xskpb.com2.z0.glb.clouddn.com/127.png" alt=""><br> 在开发中从<code>b325c</code>节点创建了一个<code>other分支</code>需要协同开发,然后我在<code>master</code>中也同时进行开发,同时提交了几次后到<code>ed489</code>然后<code>other分支</code>中也同时提交了几次到<code>33104</code>这时候发现我的功能和<code>other分支</code>的功能都开发完了,需要将<code>other分支</code>中的内容合并进我的<code>master分支</code>中去,这时候在<code>master分支</code>中使用<code>git merge other</code>命令将进行合并,如果两个分支没有同时修改一个文件的话,也就是合并顺利的情况下将会看到上图,在master后面新建一个节点然后将<code>33104</code>和<code>ed489</code>以及两个分支共同的父节点<code>b325c</code>的信息记录下来。<br> 还有一种简单的merge 也就是开了一个<code>dev的分支</code>但是我的master分支没有进行开发,所以这时候使用<code>git merge dev</code>的时候就会直接将master的移动到最新的提交节点上,这种提交叫做<code>Fast forward</code>,如下图所示<br> ps:图片来自网络<br><img src="http://7xskpb.com2.z0.glb.clouddn.com/128.png" alt=""><br><img src="http://7xskpb.com2.z0.glb.clouddn.com/129.png" alt=""><br>也可以使用<code>-no-ff</code>不使用着用<code>Fast forward</code>方式进行提交,这样会和一开始的merge的效果一样,有两个分支汇集到一条线上.</p><h4 id="rebase-衍合"><a href="#rebase-衍合" class="headerlink" title="rebase 衍合"></a><strong>rebase 衍合</strong></h4><p> 这个也是git中的分支合并的命令,如果使用merge的话会将两条时间线汇集到一个节点上。但是使用rebase的时候会将时间线汇集成一条,从共同的祖先开始,先是对方的提交,然后是自己的提交<br> ps:借用网上的图片来理解一下<br><img src="http://7xskpb.com2.z0.glb.clouddn.com/135.png" alt=""><br>这个图片和上面merge的时候很相似,但是又不相同,使用<code>git rebase master</code>的时候将自己的<code>topic分支</code>中的提交在<code>master中最后一次提交</code>的<code>基础</code>之上<code>“重放一遍”</code>将自己的提交加在后面,这时候会生成新的<code>SHA-1值</code>,之前生成的废弃掉了。然后将HEAD移动到现在的<code>topic</code>上,便合成了一条时间线。<br><code>cherry-pick命令解释</code><br> 该命令是复制一次提交到当前分支上面,比如在工作中在master分支中提交两次后发现自己不应该直接在master分支中操作,这时候cherry-pick命令就有用了,自己在没有这两次提交之前先建立一个新的分支,然后将master的两次提交用cherry-pick命令复制到分支上面,然后将master的两次提交给删除就可以了。</p><h4 id="冲突的解决"><a href="#冲突的解决" class="headerlink" title="冲突的解决"></a><strong>冲突的解决</strong></h4><p>要解决冲突就要有冲突,我这里先自己制造冲突<br>在test分支中修改a.b文件<br><img src="http://7xskpb.com2.z0.glb.clouddn.com/130.png" alt=""><br>然后切回master分支中修改a.b 文件<br><img src="http://7xskpb.com2.z0.glb.clouddn.com/131.png" alt=""><br>下图是详细的操作步骤<br><img src="http://7xskpb.com2.z0.glb.clouddn.com/132.png" alt=""><br>这时候就有冲突了 需要手动的修改a.b文件<br><img src="http://7xskpb.com2.z0.glb.clouddn.com/133.png" alt=""><br>下面我修改后再次提交,冲突成功解决<br><img src="http://7xskpb.com2.z0.glb.clouddn.com/134.png" alt=""> </p><h2 id="Git工具推荐"><a href="#Git工具推荐" class="headerlink" title="Git工具推荐"></a>Git工具推荐</h2><p>也许你对上面提到的命令行感觉到繁琐,在这里强列推荐使用git工具进行代码的提交管理,<code>sourcetree</code></p><h2 id="Git学习网站推荐"><a href="#Git学习网站推荐" class="headerlink" title="Git学习网站推荐"></a>Git学习网站推荐</h2><p><a href="http://git-scm.com/book/en/v2" target="_blank" rel="noopener">GitPro</a><br><code>第一次写博客,一直想写,但是一直没有付出行动,这次终于搭建了自己的空间,写了第一篇博客,若有不好请帮忙指出,互相学习。</code> </p>]]></content>
<tags>
<tag> git </tag>
</tags>
</entry>
</search>