GitLab与Gitee安装与使用(windows下)及基本操作命令
<h1 class="md-end-block md-heading md-focus"><span class="md-plain md-expand">GitLab与Gitee安装与使用(windows下)</span></h1><p>常用命令</p>
<ul>
<li>git config -l 查看git的详细配置</li>
<li>$ git config --global user.name "名称"</li>
<li>$ git config --global user.email "邮箱"</li>
<li>部分简单操作命令与liunx命令相似</li>
<li>如:cd 进入目录或退回目录</li>
<li>pwd显示所在当前路径</li>
<li>ls(ll)显示当前目录下的所有文件(ll显示的内容更加详细)</li>
<li>touch aa.txt 新建一个文件aa.txt</li>
<li>rm 文件名 删除文件</li>
<li>mkdir 文件名 创建一个文件夹</li>
<li>mv 移动文件 mv 文件名 目标文件路径</li>
<li>git init 是把自己创建的问价夹变成一个git仓库</li>
<li>git add 文件名 添加文件到仓库</li>
<li>git commit 提交刚才添加的文件 -m后面跟的是本次提交的说明(相当于注释)</li>
<li>git status 查看当前的状态</li>
<li>git digff 文件名 可以查看文件被修改的内容</li>
<li>git rm 文件名 删除仓库的文件</li>
<li>版本回退</li>
<li>git log 可以查看最近提交的版本日志</li>
<li>git log --pretty=oneline 查看最近提交的版本的参数及文件id</li>
<li>git reset --hard HEAD^ 返回到上一次提交的版本</li>
<li>cat 文件名 查看文件内容信息</li>
<li>git reset --hard 3a80e 注:3a80e 是文件id 指定返回到指定版本</li>
<li>git reflog 查看命令历史</li>
<li>git checkout -- 文件名 撤销修改,如果文件已经添加在暂存区则返回添加到暂存区后的状态</li>
<li>如果文件修改后还没放到暂存区,则返回到和版本库一模一样的状态</li>
<li>git reset HEAD 文件名 退回文件</li>
</ul>
<p style="margin-left: 30px"><span style="font-family: "Microsoft YaHei"; font-size: 18pt"><strong>下面是安装后的一些基本操作,简单易上手,希望可以帮助到你!</strong></span></p>
<h2 class="md-end-block md-heading"><span class="md-plain">1.安装gitlab,选择windows即可</span></h2>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span>https://git-scm.com/downloads</span></pre>
<p class="md-end-block md-p"><span class="md-tab"> <span class="md-plain">安装成功,点击GIt Bash弹出一个黑框框就说明安装成功</span></span></p>
<p class="md-end-block md-p"><span class="md-plain">安装完成之后,需要设置自己的姓名和邮箱</span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">$ git config --global user.name "name"
$ git config --global user.email "email"</pre>
</div>
<h2 class="md-end-block md-heading"><span class="md-plain">2.创建版本库</span></h2>
<p class="md-end-block md-p"><span class="md-plain">1.首先找一个合适的位置,创建一个目录,可以使用命令,也可以在文件夹中直接创建,</span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span>//命令创建(大部分操作命令和linux相同) mkdir fileName<span><span><br></span></span></span></pre>
<div class="cnblogs_Highlighter">
<pre class="brush:java;gutter:true;">乌鸦@DESKTOP-SCU216L MINGW64 /f
$ cd GitLab/
乌鸦@DESKTOP-SCU216L MINGW64 /f/GitLab
$ pwd
/f/GitLab</pre>
</div>
<p class="md-end-block md-p"><span class="md-plain">2.然后使用git init 命令把这个目录变成Git可以管理的仓库,生成了一个.get文件</span></p>
<div class="cnblogs_code">
<pre>乌鸦@DESKTOP-SCU216L MINGW64 /f/<span style="color: rgba(0, 0, 0, 1)">GitLab
$ git init
Initialized empty Git repository </span><span style="color: rgba(0, 0, 255, 1)">in</span> F:/GitLab/.git/</pre>
</div>
<p> </p>
<h2 class="md-end-block md-heading"><span class="md-plain">3.把文件添加到版本库</span></h2>
<p class="md-end-block md-p"><span class="md-plain">1.现在来编写一个readme.txt文件,此文件一定要放在刚刚创建的目录下面,因为这是一个Git仓库,放到其他地方.git文件找不到</span></p>
<p class="md-end-block md-p"><span class="md-plain">:内如如下</span></p>
<div class="cnblogs_code">
<pre>Git <span style="color: rgba(0, 0, 255, 1)">is</span><span style="color: rgba(0, 0, 0, 1)"> a version control system.
Git </span><span style="color: rgba(0, 0, 255, 1)">is</span> free software.</pre>
</div>
<p> </p>
<p class="md-end-block md-p"><span class="md-plain">第一步,使用git add告诉Git,把文件添加到了仓库:</span></p>
<div class="cnblogs_code">
<pre>$ git add readme.txt</pre>
</div>
<p> </p>
<p class="md-end-block md-p"><span class="md-plain">执行上面命令,没有任何显示就对了,”没有消息就是最好的消息“</span></p>
<p class="md-end-block md-p"><span class="md-plain">第二步,用命令git commit告诉Git,把文件提交到仓库,第一步只是添加了,并没有提交:</span></p>
<div class="cnblogs_code">
<pre>乌鸦@DESKTOP-SCU216L MINGW64 /f/<span style="color: rgba(0, 0, 0, 1)">GitLab (master)
$ git commit </span>-m <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">wrote a readme file</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
wrote a readme file
</span><span style="color: rgba(128, 0, 128, 1)">1</span> file changed, <span style="color: rgba(128, 0, 128, 1)">2</span> insertions(+<span style="color: rgba(0, 0, 0, 1)">)
create mode </span><span style="color: rgba(128, 0, 128, 1)">100644</span> readme.txt</pre>
</div>
<p> </p>
<p class="md-end-block md-p"><span class="md-plain">简单解释一下git commit 命令,-m后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。</span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span>小贴士:<br><span>使用add命令,一次可以添加多个文件,commit一次可以把添加的文件全部提交,所以你可以额add很多不同的文件,例如<br></span></span></pre>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">$ git add file1.txt
$ git add file2.txt file3.txt
$ git commit </span>-m <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">add 3 files.</span><span style="color: rgba(128, 0, 0, 1)">"</span></pre>
</div>
<p class="md-end-block md-p"><span class="md-plain">第三步,联系使用</span></p>
<p class="md-end-block md-p"><span class="md-plain">我们已经成功添加并提交了readme.txt文件,现在,是时候继续工作了,于是,我们继续修改readme.txt文件,改成如下内容:</span></p>
<div class="cnblogs_code">
<pre>Git <span style="color: rgba(0, 0, 255, 1)">is</span><span style="color: rgba(0, 0, 0, 1)"> a distributed version control system.
Git </span><span style="color: rgba(0, 0, 255, 1)">is</span> free software.</pre>
</div>
<p> </p>
<p class="md-end-block md-p"><span class="md-plain">现在使用git status命令查看结果</span></p>
<div class="cnblogs_code">
<pre>乌鸦@DESKTOP-SCU216L MINGW64 /f/<span style="color: rgba(0, 0, 0, 1)">GitLab (master)
$ git status
On branch master
Changes not staged </span><span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)"> commit:
(use </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">git add <file>...</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> to update what will be committed)
(use </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">git restore <file>...</span><span style="color: rgba(128, 0, 0, 1)">"</span> to discard changes <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> working directory)
modified: readme.txt
Untracked files:
(use </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">git add <file>...</span><span style="color: rgba(128, 0, 0, 1)">"</span> to include <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> what will be committed)
.readme.txt.swp
no changes added to commit (use </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">git add</span><span style="color: rgba(128, 0, 0, 1)">"</span> and/or <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">git commit -a</span><span style="color: rgba(128, 0, 0, 1)">"</span>)</pre>
</div>
<p> </p>
<p class="md-end-block md-p"><span class="md-plain">git status命令可以让我们时刻掌握仓库当前的状态,上面的命令输出告诉我们,readme.txt被修改过了,但还没有准备提交的修改。modified(修改) Untracked files(未添加的文件)</span></p>
<p class="md-end-block md-p"><span class="md-plain">此命令只可以告诉我们文件被修改过,如果想看到被修改的内容,需要使用git digff:</span></p>
<div class="cnblogs_code">
<pre>乌鸦@DESKTOP-SCU216L MINGW64 /f/<span style="color: rgba(0, 0, 0, 1)">GitLab (master)
$ git diff readme.txt
diff </span>--git a/readme.txt b/<span style="color: rgba(0, 0, 0, 1)">readme.txt
index d8036c1..9247db6 </span><span style="color: rgba(128, 0, 128, 1)">100644</span>
--- a/<span style="color: rgba(0, 0, 0, 1)">readme.txt
</span>+++ b/<span style="color: rgba(0, 0, 0, 1)">readme.txt
@@ </span>-<span style="color: rgba(128, 0, 128, 1)">1</span>,<span style="color: rgba(128, 0, 128, 1)">2</span> +<span style="color: rgba(128, 0, 128, 1)">1</span>,<span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)"> @@
</span>-Git <span style="color: rgba(0, 0, 255, 1)">is</span><span style="color: rgba(0, 0, 0, 1)"> a version control system.
</span>-Git <span style="color: rgba(0, 0, 255, 1)">is</span><span style="color: rgba(0, 0, 0, 1)"> free software.
\ No newline at end of file
</span>+Git <span style="color: rgba(0, 0, 255, 1)">is</span><span style="color: rgba(0, 0, 0, 1)"> a distributed version control system.
</span>+Git <span style="color: rgba(0, 0, 255, 1)">is</span> free software.</pre>
</div>
<p> </p>
<p class="md-end-block md-p"><span class="md-plain">然后继续对文件进行提交:</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">$ git add readme.txt
$ git commit </span>-m <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">add distributed</span><span style="color: rgba(128, 0, 0, 1)">"</span></pre>
</div>
<p> </p>
<p class="md-end-block md-p"><span class="md-plain">提交后,我们再用git status命令看看仓库的当前状态:</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">$ git status
On branch master
nothing to commit, working tree clean</span></pre>
</div>
<p> </p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span>小结<br><span>要随时掌握工作区的状态,使用git status命令。<br><span>如果git status告诉你有文件被修改过,用git diff可以查看修改内容。</span></span></span></pre>
<h2 class="md-end-block md-heading"><span class="md-plain">4.版本回退</span></h2>
<h3 class="md-end-block md-heading"><span class="md-plain">1.版本回退</span></h3>
<p class="md-end-block md-p"><span class="md-plain">现在,我们已经学会了修改文件,然后提交到Git版本库,现在,再练习一次,修改readme.xml文件如下:</span></p>
<div class="cnblogs_code">
<pre>Git <span style="color: rgba(0, 0, 255, 1)">is</span><span style="color: rgba(0, 0, 0, 1)"> a distributed version control system.
Git </span><span style="color: rgba(0, 0, 255, 1)">is</span> free software distributed under the GPL.</pre>
</div>
<p> </p>
<p class="md-end-block md-p"><span class="md-plain">然后尝试提交:</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">$ git add readme.txt
$ git commit </span>-m <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">append GPL</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
append GPL
</span><span style="color: rgba(128, 0, 128, 1)">1</span> file changed, <span style="color: rgba(128, 0, 128, 1)">1</span> insertion(+), <span style="color: rgba(128, 0, 128, 1)">1</span> deletion(-)</pre>
</div>
<p> </p>
<p class="md-end-block md-p"><span class="md-plain">我们回顾一下readme.txt文件一共有几个版本被提交到Git仓库里了:</span></p>
<p class="md-end-block md-p"><span class="md-plain">版本1:wrote a readme file</span></p>
<div class="cnblogs_code">
<pre>Git <span style="color: rgba(0, 0, 255, 1)">is</span><span style="color: rgba(0, 0, 0, 1)"> a version control system.
Git </span><span style="color: rgba(0, 0, 255, 1)">is</span> free software.</pre>
</div>
<p> </p>
<p class="md-end-block md-p"><span class="md-plain">版本2:add distributed</span></p>
<div class="cnblogs_code">
<pre>Git <span style="color: rgba(0, 0, 255, 1)">is</span><span style="color: rgba(0, 0, 0, 1)"> a distributed version control system.
Git </span><span style="color: rgba(0, 0, 255, 1)">is</span> free software.</pre>
</div>
<p> </p>
<p class="md-end-block md-p"><span class="md-plain">版本3:append GPL</span></p>
<div class="cnblogs_code">
<pre>Git <span style="color: rgba(0, 0, 255, 1)">is</span><span style="color: rgba(0, 0, 0, 1)"> a distributed version control system.
Git </span><span style="color: rgba(0, 0, 255, 1)">is</span> free software distributed under the GPL.</pre>
</div>
<p> </p>
<p class="md-end-block md-p"><span class="md-plain">当然了,在实际工作中,我们脑子里怎么可能记得一个几千行的文件每次都改了什么内容,不然要版本控制系统干什么。版本控制系统肯定有某个命令可以告诉我们历史记录,在Git中,我们用git log命令查看:</span></p>
<div class="cnblogs_code">
<pre>乌鸦@DESKTOP-SCU216L MINGW64 /f/<span style="color: rgba(0, 0, 0, 1)">GitLab (master)
$ git log
commit 3a80eccd4ab5fe684de201322f330900eba9f32f (HEAD </span>-><span style="color: rgba(0, 0, 0, 1)"> master)
Author: wuya </span><<span style="color: rgba(128, 0, 128, 1)">985472988</span>@qq.com><span style="color: rgba(0, 0, 0, 1)">
Date: Wed Nov </span><span style="color: rgba(128, 0, 128, 1)">25</span> <span style="color: rgba(128, 0, 128, 1)">09</span>:<span style="color: rgba(128, 0, 128, 1)">54</span>:<span style="color: rgba(128, 0, 128, 1)">30</span> <span style="color: rgba(128, 0, 128, 1)">2020</span> +<span style="color: rgba(128, 0, 128, 1)">0800</span><span style="color: rgba(0, 0, 0, 1)">
append GPL
commit a793f6a6a884f1a6561e888de06779799e9693e0
Author: wuya </span><<span style="color: rgba(128, 0, 128, 1)">985472988</span>@qq.com><span style="color: rgba(0, 0, 0, 1)">
Date: Wed Nov </span><span style="color: rgba(128, 0, 128, 1)">25</span> <span style="color: rgba(128, 0, 128, 1)">09</span>:<span style="color: rgba(128, 0, 128, 1)">51</span>:<span style="color: rgba(128, 0, 128, 1)">19</span> <span style="color: rgba(128, 0, 128, 1)">2020</span> +<span style="color: rgba(128, 0, 128, 1)">0800</span><span style="color: rgba(0, 0, 0, 1)">
add distributed
commit 0d52edb3474a77c8a093eb466718192aaa7e6cd4
Author: wuya </span><<span style="color: rgba(128, 0, 128, 1)">985472988</span>@qq.com><span style="color: rgba(0, 0, 0, 1)">
Date: Wed Nov </span><span style="color: rgba(128, 0, 128, 1)">25</span> <span style="color: rgba(128, 0, 128, 1)">09</span>:<span style="color: rgba(128, 0, 128, 1)">45</span>:<span style="color: rgba(128, 0, 128, 1)">25</span> <span style="color: rgba(128, 0, 128, 1)">2020</span> +<span style="color: rgba(128, 0, 128, 1)">0800</span><span style="color: rgba(0, 0, 0, 1)">
wrote a readme file</span></pre>
</div>
<p> </p>
<p class="md-end-block md-p"><span class="md-plain">git log命令显示从最近到最远的提交日志,最近的一次是append GPL,上一次是add distributed,最早的一次是wrote a readme file。</span></p>
<p class="md-end-block md-p"><span class="md-plain">如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline参数:</span></p>
<div class="cnblogs_code">
<pre>$ git log --pretty=<span style="color: rgba(0, 0, 0, 1)">oneline
3a80eccd4ab5fe684de201322f330900eba9f32f (HEAD </span>-><span style="color: rgba(0, 0, 0, 1)"> master) append GPL
a793f6a6a884f1a6561e888de06779799e9693e0 add distributed
0d52edb3474a77c8a093eb466718192aaa7e6cd4 wrote a readme file</span></pre>
</div>
<p> </p>
<p class="md-end-block md-p"><span class="md-plain">前面的一大串是版本号,Git不是1,2,3......增的数字,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示,所以我们的commit id 肯定都不一样,以自己的为准</span></p>
<p class="md-end-block md-p"><span class="md-plain">一切准备就绪,可以进行版本回退,退回到上一个版本,也就是add distributed这个版本</span></p>
<p class="md-end-block md-p"><span class="md-plain">首先,Git必须知道当前版本是哪个版本,在Git中,用<span class="md-pair-s"><code>HEAD</code><span class="md-plain">表示当前版本,也就是最新的提交<span class="md-pair-s"><code>1094adb...</code><span class="md-plain">(注意我的提交ID和你的肯定不一样),上一个版本就是<span class="md-pair-s"><code>HEAD^</code><span class="md-plain">,上上一个版本就是<span class="md-pair-s"><code>HEAD^^</code><span class="md-plain">,当然往上100个版本写100个<span class="md-pair-s"><code>^</code><span class="md-plain">比较容易数不过来,所以写成<span class="md-pair-s"><code>HEAD~100</code><span class="md-plain">。</span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p class="md-end-block md-p"><span class="md-plain">现在,我们要把当前版本<span class="md-pair-s"><code>append GPL</code><span class="md-plain">回退到上一个版本<span class="md-pair-s"><code>add distributed</code><span class="md-plain">,就可以使用<span class="md-pair-s"><code>git reset</code><span class="md-plain">命令:</span></span></span></span></span></span></span></p>
<div class="cnblogs_code">
<pre>$ git reset --hard HEAD^<span style="color: rgba(0, 0, 0, 1)">
HEAD </span><span style="color: rgba(0, 0, 255, 1)">is</span> now at e475afc add distributed</pre>
</div>
<p> </p>
<p class="md-end-block md-p"><span class="md-plain">看看<span class="md-pair-s"><code>readme.txt</code><span class="md-plain">的内容是不是版本<span class="md-pair-s"><code>add distributed</code><span class="md-plain">:</span></span></span></span></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">$ cat readme.txt
Git </span><span style="color: rgba(0, 0, 255, 1)">is</span><span style="color: rgba(0, 0, 0, 1)"> a distributed version control system.
Git </span><span style="color: rgba(0, 0, 255, 1)">is</span> free software.</pre>
</div>
<p> </p>
<p class="md-end-block md-p"><span class="md-plain">还可以继续回退到上一个版本<span class="md-pair-s"><code>wrote a readme file</code><span class="md-plain">,不过且慢,让我们用<span class="md-pair-s"><code>git log</code><span class="md-plain">再看看现在版本库的状态:</span></span></span></span></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">$ git log
commit e475afc93c209a690c39c13a46716e8fa000c366 (HEAD </span>-><span style="color: rgba(0, 0, 0, 1)"> master)
Author: Michael Liao </span><askxuefeng@gmail.com><span style="color: rgba(0, 0, 0, 1)">
Date: Fri May </span><span style="color: rgba(128, 0, 128, 1)">18</span> <span style="color: rgba(128, 0, 128, 1)">21</span>:<span style="color: rgba(128, 0, 128, 1)">03</span>:<span style="color: rgba(128, 0, 128, 1)">36</span> <span style="color: rgba(128, 0, 128, 1)">2018</span> +<span style="color: rgba(128, 0, 128, 1)">0800</span><span style="color: rgba(0, 0, 0, 1)">
add distributed
commit eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0
Author: Michael Liao </span><askxuefeng@gmail.com><span style="color: rgba(0, 0, 0, 1)">
Date: Fri May </span><span style="color: rgba(128, 0, 128, 1)">18</span> <span style="color: rgba(128, 0, 128, 1)">20</span>:<span style="color: rgba(128, 0, 128, 1)">59</span>:<span style="color: rgba(128, 0, 128, 1)">18</span> <span style="color: rgba(128, 0, 128, 1)">2018</span> +<span style="color: rgba(128, 0, 128, 1)">0800</span><span style="color: rgba(0, 0, 0, 1)">
wrote a readme file</span></pre>
</div>
<p> </p>
<p class="md-end-block md-p"><span class="md-plain">最新的那个版本<span class="md-pair-s"><code>append GPL</code><span class="md-plain">已经看不到了!好比你从21世纪坐时光穿梭机来到了19世纪,想再回去已经回不去了,肿么办?</span></span></span></p>
<p class="md-end-block md-p"><span class="md-plain">办法其实还是有的,只要上面的命令行窗口还没有被关掉,你就可以顺着往上找啊找啊,找到那个<span class="md-pair-s"><code>append GPL</code><span class="md-plain">的<span class="md-pair-s"><code>commit id</code><span class="md-plain">是<span class="md-pair-s"><code>1094adb...</code><span class="md-plain">,于是就可以指定回到未来的某个版本:</span></span></span></span></span></span></span></p>
<div class="cnblogs_code">
<pre>$ git reset --<span style="color: rgba(0, 0, 0, 1)">hard 3a80e
HEAD </span><span style="color: rgba(0, 0, 255, 1)">is</span> now at 3a80ecc append GPL</pre>
</div>
<p> </p>
<p class="md-end-block md-p"><span class="md-plain">版本号没必要写全,前几位就可以了,Git会自动去找。当然也不能只写前一两位,因为Git可能会找到多个版本号,就无法确定是哪一个了。</span></p>
<p class="md-end-block md-p"><span class="md-plain">再小心翼翼地看看<span class="md-pair-s"><code>readme.txt</code><span class="md-plain">的内容:</span></span></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">$ cat readme.txt
Git </span><span style="color: rgba(0, 0, 255, 1)">is</span><span style="color: rgba(0, 0, 0, 1)"> a distributed version control system.
Git </span><span style="color: rgba(0, 0, 255, 1)">is</span> free software distributed under the GPL.</pre>
</div>
<p> </p>
<p class="md-end-block md-p"><span class="md-plain">Git的版本回退速度非常快,因为Git在内部有个指向当前版本的<span class="md-pair-s"><code>HEAD</code><span class="md-plain">指针,当你回退版本的时候,Git仅仅是把HEAD从指向<span class="md-pair-s"><code>append GPL</code></span></span></span></span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span>┌────┐<br><span>│HEAD│<br><span>└────┘<br><span> │<br><span> └──> ○ append GPL<br><span> │<br><span> ○ add distributed<br><span> │<br><span> ○ wrote a readme file<br><span>改为指向add distributed:<br><span><span><br><span>┌────┐<br><span>│HEAD│<br><span>└────┘<br><span> │<br><span> │ ○ append GPL<br><span> │ │<br><span> └──> ○ add distributed<br><span> │<br><span> ○ wrote a readme file</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<p class="md-end-block md-p"><span class="md-plain">现在,你回退到了某个版本,关掉了电脑,第二天早上就后悔了,想恢复到新版本怎么办?找不到新版本的<span class="md-pair-s"><code>commit id</code><span class="md-plain">怎么办?</span></span></span></p>
<p class="md-end-block md-p"><span class="md-plain">在Git中,总是有后悔药可以吃的。当你用<span class="md-pair-s"><code>$ git reset --hard HEAD^</code><span class="md-plain">回退到<span class="md-pair-s"><code>add distributed</code><span class="md-plain">版本时,再想恢复到<span class="md-pair-s"><code>append GPL</code><span class="md-plain">,就必须找到<span class="md-pair-s"><code>append GPL</code><span class="md-plain">的commit id。Git提供了一个命令<span class="md-pair-s"><code>git reflog</code><span class="md-plain">用来记录你的每一次命令:</span></span></span></span></span></span></span></span></span></span></span></p>
<div class="cnblogs_code">
<pre>乌鸦@DESKTOP-SCU216L MINGW64 /f/<span style="color: rgba(0, 0, 0, 1)">GitLab (master)
$ git reflog
3a80ecc (HEAD </span>-> master) HEAD@{<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">}: reset: moving to 3a80e
a793f6a HEAD@{</span><span style="color: rgba(128, 0, 128, 1)">1</span>}: reset: moving to HEAD^<span style="color: rgba(0, 0, 0, 1)">
3a80ecc (HEAD </span>-> master) HEAD@{<span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">}: commit: append GPL
a793f6a HEAD@{</span><span style="color: rgba(128, 0, 128, 1)">3</span><span style="color: rgba(0, 0, 0, 1)">}: commit: add distributed
0d52edb HEAD@{</span><span style="color: rgba(128, 0, 128, 1)">4</span>}: commit (initial): wrote a readme file</pre>
</div>
<p> </p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span><span><span><span><span><span><span><br><span><span></span></span></span></span></span></span></span></span></span></pre>
<p class="md-end-block md-p"><span class="md-plain">终于舒了口气,从输出可知,<span class="md-pair-s"><code>append GPL</code><span class="md-plain">的commit id是<span class="md-pair-s"><code>1094adb</code><span class="md-plain">,现在,你又可以乘坐时光机回到未来了。</span></span></span></span></span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span>小结<br><span>现在总结一下:<br><span><span><br><span>HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id。<br><span><span><br><span>穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。<br><span><span><br><span>要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。</span></span></span></span></span></span></span></span></span></span></span></pre>
<p class="md-end-block md-p"> </p>
<h3 class="md-end-block md-heading"><span class="md-plain">2.工作区和缓存库</span></h3>
<p class="md-end-block md-p"><span class="md-plain">工作区(Working Directory)</span></p>
<p class="md-end-block md-p"><span class="md-plain">就是你在电脑里能看到的目录,比如我的GitLab文件夹就是一个工作区</span></p>
<p class="md-end-block md-p"><span class="md-plain">版本库(Repository)</span></p>
<p class="md-end-block md-p"><span class="md-plain">作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。</span></p>
<p class="md-end-block md-p"><span class="md-plain">Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支<span class="md-pair-s"><code>master</code><span class="md-plain">,以及指向<span class="md-pair-s"><code>master</code><span class="md-plain">的一个指针叫<span class="md-pair-s"><code>HEAD</code><span class="md-plain">。</span></span></span></span></span></span></span></p>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" data-src="https://www.liaoxuefeng.com/files/attachments/919020037470528/0"><img src="https://www.liaoxuefeng.com/files/attachments/919020037470528/0"></span></p>
<p class="md-end-block md-p"><span class="md-plain">分支和<span class="md-pair-s"><code>HEAD</code><span class="md-plain">的概念我们以后再讲。</span></span></span></p>
<p class="md-end-block md-p"><span class="md-plain">前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:</span></p>
<p class="md-end-block md-p"><span class="md-plain">第一步是用<span class="md-pair-s"><code>git add</code><span class="md-plain">把文件添加进去,实际上就是把文件修改添加到暂存区;</span></span></span></p>
<p class="md-end-block md-p"><span class="md-plain">第二步是用<span class="md-pair-s"><code>git commit</code><span class="md-plain">提交更改,实际上就是把暂存区的所有内容提交到当前分支。</span></span></span></p>
<p class="md-end-block md-p"><span class="md-plain">因为我们创建Git版本库时,Git自动为我们创建了唯一一个<span class="md-pair-s"><code>master</code><span class="md-plain">分支,所以,现在,<span class="md-pair-s"><code>git commit</code><span class="md-plain">就是往<span class="md-pair-s"><code>master</code><span class="md-plain">分支上提交更改。</span></span></span></span></span></span></span></p>
<p class="md-end-block md-p"><span class="md-plain">你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。</span></p>
<p class="md-end-block md-p"><span class="md-plain">俗话说,实践出真知。现在,我们再练习一遍,先对<span class="md-pair-s"><code>readme.txt</code><span class="md-plain">做个修改,比如加上一行内容:</span></span></span></p>
<div class="cnblogs_code">
<pre>Git <span style="color: rgba(0, 0, 255, 1)">is</span><span style="color: rgba(0, 0, 0, 1)"> a distributed version control system.
Git </span><span style="color: rgba(0, 0, 255, 1)">is</span><span style="color: rgba(0, 0, 0, 1)"> free software distributed under the GPL.
Git has a mutable index called stage.</span></pre>
</div>
<p> </p>
<p class="md-end-block md-p"><span class="md-plain">然后,在工作区新增一个<span class="md-pair-s"><code>LICENSE</code><span class="md-plain">文本文件(内容随便写)。</span></span></span></p>
<p class="md-end-block md-p"><span class="md-plain">先用<span class="md-pair-s"><code>git status</code><span class="md-plain">查看一下状态:</span></span></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">$ git status
On branch master
Changes not staged </span><span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)"> commit:
(use </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">git add <file>...</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> to update what will be committed)
(use </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">git checkout -- <file>...</span><span style="color: rgba(128, 0, 0, 1)">"</span> to discard changes <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> working directory)
modified: readme.txt
Untracked files:
(use </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">git add <file>...</span><span style="color: rgba(128, 0, 0, 1)">"</span> to include <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> what will be committed)
LICENSE
no changes added to commit (use </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">git add</span><span style="color: rgba(128, 0, 0, 1)">"</span> and/or <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">git commit -a</span><span style="color: rgba(128, 0, 0, 1)">"</span>)</pre>
</div>
<p> </p>
<p class="md-end-block md-p"><span class="md-plain">Git非常清楚地告诉我们,<span class="md-pair-s"><code>readme.txt</code><span class="md-plain">被修改了,而<span class="md-pair-s"><code>LICENSE</code><span class="md-plain">还从来没有被添加过,所以它的状态是<span class="md-pair-s"><code>Untracked</code><span class="md-plain">。</span></span></span></span></span></span></span></p>
<p class="md-end-block md-p"><span class="md-plain">现在,使用两次命令<span class="md-pair-s"><code>git add</code><span class="md-plain">,把<span class="md-pair-s"><code>readme.txt</code><span class="md-plain">和<span class="md-pair-s"><code>LICENSE</code><span class="md-plain">都添加后,用<span class="md-pair-s"><code>git status</code><span class="md-plain">再查看一下:</span></span></span></span></span></span></span></span></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">$ git status
On branch master
Changes to be committed:
(use </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">git reset HEAD <file>...</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> to unstage)
</span><span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> file: LICENSE
modified: readme.txt</span></pre>
</div>
<p> </p>
<p class="md-end-block md-p"><span class="md-plain">现在,暂存区的状态就变成这样了:</span></p>
<p class="md-end-block md-p"><span class="md-plain">现在,暂存区的状态就变成这样了:</span></p>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" data-src="https://www.liaoxuefeng.com/files/attachments/919020074026336/0"><img src="https://www.liaoxuefeng.com/files/attachments/919020074026336/0"></span></p>
<p class="md-end-block md-p"><span class="md-plain">所以,<span class="md-pair-s"><code>git add</code><span class="md-plain">命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行<span class="md-pair-s"><code>git commit</code><span class="md-plain">就可以一次性把暂存区的所有修改提交到分支。</span></span></span></span></span></p>
<div class="cnblogs_code">
<pre>$ git commit -m <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">understand how stage works</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
understand how stage works
</span><span style="color: rgba(128, 0, 128, 1)">2</span> files changed, <span style="color: rgba(128, 0, 128, 1)">2</span> insertions(+<span style="color: rgba(0, 0, 0, 1)">)
create mode </span><span style="color: rgba(128, 0, 128, 1)">100644</span> LICENSE</pre>
</div>
<p> </p>
<p class="md-end-block md-p"><span class="md-plain">一旦提交后,如果你又没有对工作区做任何修改,那么工作区就是“干净”的:</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">$ git status
On branch master
nothing to commit, working tree clean</span></pre>
</div>
<p> </p>
<p class="md-end-block md-p"><span class="md-plain">现在版本库变成了这样,暂存区就没有任何内容了:</span></p>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" data-src="https://www.liaoxuefeng.com/files/attachments/919020100829536/0"><img src="https://www.liaoxuefeng.com/files/attachments/919020100829536/0"></span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span>小结<br><span>暂存区是Git非常重要的概念,弄明白了暂存区,就弄明白了Git的很多操作到底干了什么。<br><span><span><br><span>没弄明白暂存区是怎么回事的童鞋,请向上滚动页面,再看一次。</span></span></span></span></span></pre>
<p class="md-end-block md-p"><span class="md-plain">思考一下</span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span>第一次修改 -> git add -> 第二次修改 -> git commit<br><span>文件到底会不会被修改呢?如果没修改,如何才能修改呢?<br><span><span><br><span>请先思考一下!!!!!!!!!!!!!!!!!!!!!<br><span><span><br><span>答案:<br><span>第一次修改 -> git add -> 第二次修改 -> git add -> git commit<br><span><span><br><span>现在,你又理解了Git是如何跟踪修改的,每次修改,如果不用git add到暂存区,那就不会加入到commit中。</span></span></span></span></span></span></span></span></span></span></span></span></pre>
<p class="md-end-block md-p"><span class="md-plain">自然,你是不会犯错的。不过现在是凌晨两点,你正在赶一份工作报告,你在<span class="md-pair-s"><code>readme.txt</code><span class="md-plain">中添加了一行:</span></span></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">$ cat readme.txt
Git </span><span style="color: rgba(0, 0, 255, 1)">is</span><span style="color: rgba(0, 0, 0, 1)"> a distributed version control system.
Git </span><span style="color: rgba(0, 0, 255, 1)">is</span><span style="color: rgba(0, 0, 0, 1)"> free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
My stupid boss still prefers SVN.</span></pre>
</div>
<p> </p>
<p class="md-end-block md-p"><span class="md-plain">在你准备提交前,一杯咖啡起了作用,你猛然发现了<span class="md-pair-s"><code>stupid boss</code><span class="md-plain">可能会让你丢掉这个月的奖金!</span></span></span></p>
<p class="md-end-block md-p"><span class="md-plain">既然错误发现得很及时,就可以很容易地纠正它。你可以删掉最后一行,手动把文件恢复到上一个版本的状态。如果用<span class="md-pair-s"><code>git status</code><span class="md-plain">查看一下:</span></span></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">$ git status
On branch master
Changes not staged </span><span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)"> commit:
(use </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">git add <file>...</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> to update what will be committed)
(use </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">git checkout -- <file>...</span><span style="color: rgba(128, 0, 0, 1)">"</span> to discard changes <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> working directory)
modified: readme.txt
no changes added to commit (use </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">git add</span><span style="color: rgba(128, 0, 0, 1)">"</span> and/or <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">git commit -a</span><span style="color: rgba(128, 0, 0, 1)">"</span>)</pre>
</div>
<p> </p>
<p class="md-end-block md-p"><span class="md-plain">你可以发现,Git会告诉你,<span class="md-pair-s"><code>git checkout -- file</code><span class="md-plain">可以丢弃工作区的修改:</span></span></span></p>
<div class="cnblogs_code">
<pre>$ git checkout -- readme.txt</pre>
</div>
<p> </p>
<p class="md-end-block md-p"><span class="md-plain">命令<span class="md-pair-s"><code>git checkout -- readme.txt</code><span class="md-plain">意思就是,把<span class="md-pair-s"><code>readme.txt</code><span class="md-plain">文件在工作区的修改全部撤销,这里有两种情况:</span></span></span></span></span></p>
<p class="md-end-block md-p"><span class="md-plain">一种是<span class="md-pair-s"><code>readme.txt</code><span class="md-plain">自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;</span></span></span></p>
<p class="md-end-block md-p"><span class="md-plain">一种是<span class="md-pair-s"><code>readme.txt</code><span class="md-plain">已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。</span></span></span></p>
<p class="md-end-block md-p"><span class="md-plain">总之,就是让这个文件回到最近一次<span class="md-pair-s"><code>git commit</code><span class="md-plain">或<span class="md-pair-s"><code>git add</code><span class="md-plain">时的状态。</span></span></span></span></span></p>
<p class="md-end-block md-p"><span class="md-plain">现在,看看<span class="md-pair-s"><code>readme.txt</code><span class="md-plain">的文件内容:</span></span></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">$ cat readme.txt
Git </span><span style="color: rgba(0, 0, 255, 1)">is</span><span style="color: rgba(0, 0, 0, 1)"> a distributed version control system.
Git </span><span style="color: rgba(0, 0, 255, 1)">is</span><span style="color: rgba(0, 0, 0, 1)"> free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.</span></pre>
</div>
<p> </p>
<p class="md-end-block md-p"><span class="md-plain">文件内容果然复原了。</span></p>
<p class="md-end-block md-p"><span class="md-pair-s"><code>git checkout -- file</code><span class="md-plain">命令中的<span class="md-pair-s"><code>--</code><span class="md-plain">很重要,没有<span class="md-pair-s"><code>--</code><span class="md-plain">,就变成了“切换到另一个分支”的命令,我们在后面的分支管理中会再次遇到<span class="md-pair-s"><code>git checkout</code><span class="md-plain">命令。</span></span></span></span></span></span></span></span></p>
<p class="md-end-block md-p"> </p>
<p class="md-end-block md-p"><span class="md-plain">现在假定是凌晨3点,你不但写了一些胡话,还<span class="md-pair-s"><code>git add</code><span class="md-plain">到暂存区了:</span></span></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">$ cat readme.txt
Git </span><span style="color: rgba(0, 0, 255, 1)">is</span><span style="color: rgba(0, 0, 0, 1)"> a distributed version control system.
Git </span><span style="color: rgba(0, 0, 255, 1)">is</span><span style="color: rgba(0, 0, 0, 1)"> free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
My stupid boss still prefers SVN.
$ git add readme.txt</span></pre>
</div>
<p> </p>
<p class="md-end-block md-p"><span class="md-plain">庆幸的是,在<span class="md-pair-s"><code>commit</code><span class="md-plain">之前,你发现了这个问题。用<span class="md-pair-s"><code>git status</code><span class="md-plain">查看一下,修改只是添加到了暂存区,还没有提交:</span></span></span></span></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">$ git status
On branch master
Changes to be committed:
(use </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">git reset HEAD <file>...</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> to unstage)
modified: readme.txt</span></pre>
</div>
<p> </p>
<p class="md-end-block md-p"><span class="md-plain">Git同样告诉我们,用命令<span class="md-pair-s"><code>git reset HEAD <file></code><span class="md-plain">可以把暂存区的修改撤销掉(unstage),重新放回工作区:</span></span></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">$ git reset HEAD readme.txt
Unstaged changes after reset:
M readme.txt</span></pre>
</div>
<p> </p>
<p class="md-end-block md-p"><span class="md-pair-s"><code>git reset</code><span class="md-plain">命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用<span class="md-pair-s"><code>HEAD</code><span class="md-plain">时,表示最新的版本。</span></span></span></span></p>
<p class="md-end-block md-p"><span class="md-plain">再用<span class="md-pair-s"><code>git status</code><span class="md-plain">查看一下,现在暂存区是干净的,工作区有修改:</span></span></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">$ git status
On branch master
Changes not staged </span><span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)"> commit:
(use </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">git add <file>...</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> to update what will be committed)
(use </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">git checkout -- <file>...</span><span style="color: rgba(128, 0, 0, 1)">"</span> to discard changes <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> working directory)
modified: readme.txt</span></pre>
</div>
<p> </p>
<p class="md-end-block md-p"><span class="md-plain">还记得如何丢弃工作区的修改吗?</span></p>
<div class="cnblogs_code">
<pre>$ git checkout --<span style="color: rgba(0, 0, 0, 1)"> readme.txt
$ git status
On branch master
nothing to commit, working tree clean</span></pre>
</div>
<p> </p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span>小结<br><span>又到了小结时间。<br><span><span><br><span>场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file。<br><span><span><br><span>场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD <file>,就回到了场景1,第二步按场景1操作。<br><span><span><br><span>场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。</span></span></span></span></span></span></span></span></span></span></span></pre>
<p class="md-end-block md-p"><span class="md-plain">删除文件</span></p>
<p class="md-end-block md-p"><span class="md-plain">创建一个新的文件aa.txt,并且提交</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">touch aa.txt
git add aa.txt
git commit im </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">add aa.txt</span><span style="color: rgba(128, 0, 0, 1)">"</span></pre>
</div>
<p> </p>
<p class="md-end-block md-p"><span class="md-plain">一般情况下,如果我们不想要这个文件,会直接把他删除</span></p>
<div class="cnblogs_code">
<pre>rm aa.txt</pre>
</div>
<p> </p>
<p class="md-end-block md-p"><span class="md-plain">这个时候Git知道你已经删除了这个文件,导致工作区和版本库就不一致了,使用git status命令,会立即告诉你哪些文件被删除了:</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">$ git status
On branch master
Changes not staged </span><span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)"> commit:
(use </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">git add/rm <file>...</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> to update what will be committed)
(use </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">git restore <file>...</span><span style="color: rgba(128, 0, 0, 1)">"</span> to discard changes <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> working directory)
deleted: aa.txt
no changes added to commit (use </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">git add</span><span style="color: rgba(128, 0, 0, 1)">"</span> and/or <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">git commit -a</span><span style="color: rgba(128, 0, 0, 1)">"</span>)</pre>
</div>
<p> </p>
<p class="md-end-block md-p"><span class="md-plain">现在我们有两个选择,一是确实要从版本库中删除该文件,那就用命令<span class="md-pair-s"><code>git rm</code><span class="md-plain">删掉,并且<span class="md-pair-s"><code>git commit</code><span class="md-plain">:</span></span></span></span></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">$ git rm aa.txt
rm </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">aa.txt</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
$ git commit </span>-m <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">remove aa.txt</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
remove aa.txt
</span><span style="color: rgba(128, 0, 128, 1)">1</span> file changed, <span style="color: rgba(128, 0, 128, 1)">0</span> insertions(+), <span style="color: rgba(128, 0, 128, 1)">0</span> deletions(-<span style="color: rgba(0, 0, 0, 1)">)
delete mode </span><span style="color: rgba(128, 0, 128, 1)">100644</span> aa.txt</pre>
</div>
<p> </p>
<p class="md-end-block md-p"><span class="md-plain">现在,文件就从版本库中被删除了。</span></p>
<p class="md-end-block md-p"> </p>
<p class="md-end-block md-p"><span class="md-plain">另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:</span></p>
<div class="cnblogs_code">
<pre>$ git checkout -- aa.txt</pre>
</div>
<p> </p>
<p class="md-end-block md-p"><span class="md-pair-s"><code>git checkout</code><span class="md-plain">其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。</span></span></p>
<p class="md-end-block md-p"><span class="md-plain"> 注意:从来没有被添加到版本库就被删除的文件,是无法恢复的!</span></p>
<p class="md-end-block md-p"> </p>
<h2 class="md-end-block md-heading"><span class="md-plain">5.远程仓库</span></h2>
<p class="md-end-block md-p"><span class="md-plain">到目前为止,我们已经掌握了如何在Git仓库里对一个文件进行时光穿梭,你再也不用担心文件备份或者丢失的问题了。</span></p>
<p class="md-end-block md-p"><span class="md-plain">Git是分布式版本控制系统,同一个Git仓库,可以分布到不同的机器上。怎么分布呢?最早,肯定只有一台机器有一个原始版本库,此后,别的机器可以“克隆”这个原始版本库,而且每台机器的版本库其实都是一样的,并没有主次之分。</span></p>
<p class="md-end-block md-p"><span class="md-plain">你肯定会想,至少需要两台机器才能玩远程库不是?但是我只有一台电脑,怎么玩?</span></p>
<p class="md-end-block md-p"><span class="md-plain">其实一台电脑上也是可以克隆多个版本库的,只要不在同一个目录下。不过,现实生活中是不会有人这么傻的在一台电脑上搞几个远程库玩,因为一台电脑上搞几个远程库完全没有意义,而且硬盘挂了会导致所有库都挂掉,所以我也不告诉你在一台电脑上怎么克隆多个仓库。</span></p>
<p class="md-end-block md-p"><span class="md-plain">实际情况往往是这样,找一台电脑充当服务器的角色,每天24小时开机,其他每个人都从这个“服务器”仓库克隆一份到自己的电脑上,并且各自把各自的提交推送到服务器仓库里,也从服务器仓库中拉取别人的提交。</span></p>
<p class="md-end-block md-p"><span class="md-plain">完全可以自己搭建一台运行Git的服务器,不过现阶段,为了学Git先搭个服务器绝对是小题大作。好在这个世界上有个叫GitHub托管服务的,在国内,我们可以使用码云(Gitee),和GitHub的作用一样都是用来管理项目的,而且还提供了免费的Git 仓库,还集成了代码质量检测、项目演示等功能。对于团队协作开发,Gitee 还提供了项目管理、代码托管、文档管理的服务,5 人以下小团队免费。废话不多说,接下来开始介绍如何使用。</span></p>
<p class="md-end-block md-p"><span class="md-plain">1.建立连接</span></p>
<p class="md-end-block md-p"><span class="md-plain">创建SSH Key</span></p>
<div class="cnblogs_code">
<pre>ssh-keygen -t rsa -C <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">xxxxx@xxxxx.com</span><span style="color: rgba(128, 0, 0, 1)">"</span>;</pre>
</div>
<p> </p>
<p class="md-end-block md-p"><span class="md-plain">看你的 public key,并把他添加到码云(Gitee.com) SSH key添加地址:<span class="md-link md-pair-s">https://gitee.com/profile/sshkeys</span></span></p>
<p class="md-end-block md-p"><span class="md-plain">(开头是ssh-rsa,结尾是邮箱)</span></p>
<div class="cnblogs_code">
<pre>cat ~/.ssh/<span style="color: rgba(0, 0, 0, 1)">id_rsa.pub
# ssh</span>-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC6eNtGpNGwstc....</pre>
</div>
<p> </p>
<p class="md-end-block md-p"><span class="md-plain">添加后,在终端(Terminal)中输入</span></p>
<div class="cnblogs_code">
<pre>ssh -T git@gitee.com</pre>
</div>
<p> </p>
<p class="md-end-block md-p"><span class="md-plain">若返回则成功,过程中如果有提示,输入yes</span></p>
<div class="cnblogs_code">
<pre>Hi 乌鸦! You<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">ve successfully authenticated, but GITEE.COM does not provide shell access.</span></pre>
</div>
<p> </p>
<p class="md-end-block md-p"><span class="md-plain">2.上传文件</span></p>
<p class="md-end-block md-p"><span class="md-plain">我们在本地库上使用命令 git remote add 把它和 Gitee 的远程库关联:</span></p>
<div class="cnblogs_code">
<pre>git remote add origin(注:连接名)git@gitee.com:Wuya_Lord/learngit.git(注:连接地址)</pre>
</div>
<p> </p>
<p class="md-end-block md-p"><span class="md-pair-s"><strong><span class="md-pair-s "><em>连接名随便起,连接地址在新建的仓库中这个位置</em></span></strong></span></p>
<p class="md-end-block md-p"><span class="md-image md-img-loaded" data-src="https://www.runoob.com/wp-content/uploads/2020/03/gitee7.png"><img src="https://www.runoob.com/wp-content/uploads/2020/03/gitee7.png"></span></p>
<p class="md-end-block md-p"><span class="md-plain">然后使用git remote -v查看,如下,则连接成功</span></p>
<div class="cnblogs_code">
<pre>$ git remote -<span style="color: rgba(0, 0, 0, 1)">v
origingit@gitee.com:Wuya_Lord</span>/<span style="color: rgba(0, 0, 0, 1)">learngit.git (fetch)
origingit@gitee.com:Wuya_Lord</span>/learngit.git (push)</pre>
</div>
<p> </p>
<p class="md-end-block md-p"><span class="md-plain">接下来我们就可以使用git push origin master上传本工作区的所有文件到Gitee的仓库中</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">$ git push origin master
Enumerating objects: </span><span style="color: rgba(128, 0, 128, 1)">8</span><span style="color: rgba(0, 0, 0, 1)">, done.
Counting objects: </span><span style="color: rgba(128, 0, 128, 1)">100</span>% (<span style="color: rgba(128, 0, 128, 1)">8</span>/<span style="color: rgba(128, 0, 128, 1)">8</span><span style="color: rgba(0, 0, 0, 1)">), done.
Delta compression </span><span style="color: rgba(0, 0, 255, 1)">using</span> up to <span style="color: rgba(128, 0, 128, 1)">6</span><span style="color: rgba(0, 0, 0, 1)"> threads
Compressing objects: </span><span style="color: rgba(128, 0, 128, 1)">100</span>% (<span style="color: rgba(128, 0, 128, 1)">5</span>/<span style="color: rgba(128, 0, 128, 1)">5</span><span style="color: rgba(0, 0, 0, 1)">), done.
Writing objects: </span><span style="color: rgba(128, 0, 128, 1)">100</span>% (<span style="color: rgba(128, 0, 128, 1)">7</span>/<span style="color: rgba(128, 0, 128, 1)">7</span>), <span style="color: rgba(128, 0, 128, 1)">657</span> bytes | <span style="color: rgba(128, 0, 128, 1)">657.00</span> KiB/<span style="color: rgba(0, 0, 0, 1)">s, done.
Total </span><span style="color: rgba(128, 0, 128, 1)">7</span> (delta <span style="color: rgba(128, 0, 128, 1)">1</span>), reused <span style="color: rgba(128, 0, 128, 1)">0</span> (delta <span style="color: rgba(128, 0, 128, 1)">0</span>), pack-reused <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">
remote: Powered by GITEE.COM
To gitee.com:Wuya_Lord</span>/<span style="color: rgba(0, 0, 0, 1)">learngit.git
41e5c22..5ddd2d4master </span>-> master</pre>
</div>
<p> </p>
<p class="md-end-block md-p"><span class="md-pair-s "><strong>注意</strong><span class="md-plain">:如果出现以下报错,则是因为gitlab中READE.md文件不在本地代码目录中</span></span></p>
<div class="cnblogs_code">
<pre>To gitee.com:Wuya_Lord/<span style="color: rgba(0, 0, 0, 1)">learngit.git
</span>! master -><span style="color: rgba(0, 0, 0, 1)"> master (fetch first)
error: failed to push some refs to </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">gitee.com:Wuya_Lord/learngit.git</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
hint: Updates were rejected because the remote contains work that you </span><span style="color: rgba(0, 0, 255, 1)">do</span><span style="color: rgba(0, 0, 0, 1)">
hint: not have locally. This </span><span style="color: rgba(0, 0, 255, 1)">is</span><span style="color: rgba(0, 0, 0, 1)"> usually caused by another repository pushing
hint: to the same </span><span style="color: rgba(0, 0, 255, 1)">ref</span><span style="color: rgba(0, 0, 0, 1)">. You may want to first integrate the remote changes
hint: (e.g., </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">git pull ...</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">) before pushing again.
hint: See the </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Note about fast-forwards</span><span style="color: rgba(128, 0, 0, 1)">'</span> <span style="color: rgba(0, 0, 255, 1)">in</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">git push --help</span><span style="color: rgba(128, 0, 0, 1)">'</span> <span style="color: rgba(0, 0, 255, 1)">for</span> details.</pre>
</div>
<p> </p>
<p class="md-end-block md-p"><span class="md-plain">解决办法:</span></p>
<div class="cnblogs_code">
<pre>$ git pull --rebase origin master</pre>
</div>
<p> </p>
<p class="md-end-block md-p"><span class="md-plain">从现在起,只要本地作了提交,就可以通过命令:</span></p>
<div class="cnblogs_code">
<pre>$ git push origin master</pre>
</div>
<p> </p>
<p class="md-end-block md-p"><span class="md-plain">把本地master分支的最新修改推送至Gitee,现在,你就拥有了真正的分布式版本库!</span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span>小结<br><span>要关联一个远程库,使用命令git remote add origin git@server-name:path/repo-name.git;<br><span><span><br><span>关联后,使用命令git push -u origin master第一次推送master分支的所有内容;<br><span><span><br><span>此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改;<br><span><span><br><span>分布式版本系统的最大好处之一是在本地工作完全不需要考虑远程库的存在,也就是有没有联网都可以正常工作,而SVN在没有联网的时候是拒绝干活的!当有网络的时候,再把本地提交推送一下就完成了同步,真是太方便了!</span></span></span></span></span></span></span></span></span></span></span></pre>
<p class="md-end-block md-p"><span class="md-plain">既然可以上传,那么我们也可以下载在Gitee仓库存放的项目</span></p>
<p class="md-end-block md-p"><span class="md-plain">使用git clone克隆一个本地库:注意吧git库的地址换成自己的</span></p>
<div class="cnblogs_code">
<pre>$ git clone git@gitee.com:Wuya_Lord/<span style="color: rgba(0, 0, 0, 1)">learngit.git
Cloning into </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">learngit</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">...
remote: Enumerating objects: </span><span style="color: rgba(128, 0, 128, 1)">11</span><span style="color: rgba(0, 0, 0, 1)">, done.
remote: Counting objects: </span><span style="color: rgba(128, 0, 128, 1)">100</span>% (<span style="color: rgba(128, 0, 128, 1)">11</span>/<span style="color: rgba(128, 0, 128, 1)">11</span><span style="color: rgba(0, 0, 0, 1)">), done.
remote: Compressing objects: </span><span style="color: rgba(128, 0, 128, 1)">100</span>% (<span style="color: rgba(128, 0, 128, 1)">9</span>/<span style="color: rgba(128, 0, 128, 1)">9</span><span style="color: rgba(0, 0, 0, 1)">), done.
remote: Total </span><span style="color: rgba(128, 0, 128, 1)">11</span> (delta <span style="color: rgba(128, 0, 128, 1)">2</span>), reused <span style="color: rgba(128, 0, 128, 1)">0</span> (delta <span style="color: rgba(128, 0, 128, 1)">0</span>), pack-reused <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">
Receiving objects: </span><span style="color: rgba(128, 0, 128, 1)">100</span>% (<span style="color: rgba(128, 0, 128, 1)">11</span>/<span style="color: rgba(128, 0, 128, 1)">11</span><span style="color: rgba(0, 0, 0, 1)">), done.
Resolving deltas: </span><span style="color: rgba(128, 0, 128, 1)">100</span>% (<span style="color: rgba(128, 0, 128, 1)">2</span>/<span style="color: rgba(128, 0, 128, 1)">2</span>), done.</pre>
</div>
<p> </p>
<p class="md-end-block md-p"><span class="md-plain">然后再用ls查看,多了一个和仓库名一样的文件,进去查看,和仓库存储的一模一样</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">$ ls
learngit</span>/<span style="color: rgba(0, 0, 0, 1)">test
乌鸦@DESKTOP</span>-SCU216L MINGW64 /f/GitLab/<span style="color: rgba(0, 0, 0, 1)">learngit (master)
$ cd learngit</span>/<span style="color: rgba(0, 0, 0, 1)">
乌鸦@DESKTOP</span>-SCU216L MINGW64 /f/GitLab/learngit/<span style="color: rgba(0, 0, 0, 1)">learngit (master)
$ ls
README.en.mdREADME.mdtest</span></pre>
</div>
<p> </p>
<p class="md-end-block md-p md-focus"><span class="md-plain">如果有多个人协作开发,那么每个人各自从远程克隆一份就可以了。</span></p>
<p class="md-end-block md-p md-focus"><span class="md-plain"><strong>以上内容如有帮助到你,请给个👍!谢谢!</strong></span></p>
</div>
<div id="MySignature" role="contentinfo">
胖子哈登<br><br>
来源:https://www.cnblogs.com/Nick62/p/14042040.html
頁:
[1]