一转身的距离 發表於 2022-10-15 14:40:00

Git&Gitee

<p></p><div class="toc"><div class="toc-container-header">目录</div><ul><li>Git介绍<ul><li>下载原装</li><li>git命令学习小游戏</li><li>Git的作用</li><li>git与svn比较</li></ul></li><li>Git衍生三种工具</li><li>Git工作流程</li><li>Git常用命令<ul><li>在仓库目录终端下 - 设置用户</li><li>初始化仓库</li><li>查看状态</li><li>工作区变化提交到暂存区</li><li>暂存区提交到版本库</li><li>查看版本库的版本信息</li><li>回退到工作区的某个版本</li><li>把工作区变化撤销</li></ul></li><li>Git过滤文件<ul><li>文件过滤语法</li><li>后端项目的.gitignore</li></ul></li><li>分支操作<ul><li>分支操作常用命令</li><li>实操</li></ul></li><li>远程仓库-gitee<ul><li>创建仓库</li><li>remote源操作<ul><li>凭据管理:控制面板\用户帐户\凭据管理器</li></ul></li><li>SSH 连接远程仓库</li><li>协同开发</li></ul></li><li>解决冲突<ul><li>代码冲突</li><li>合并分支冲突</li></ul></li><li>变基</li><li>搭建gitlab</li></ul></div><p></p>
<h2 id="git介绍">Git介绍</h2>
<blockquote>
<p>Git是分布式版本控制系统,控制的对象是开发的项目代码</p>
</blockquote>
<ul>
<li>
<h3 id="下载原装">下载原装</h3>
<blockquote>
<p>https://git-scm.com/downloads</p>
</blockquote>
</li>
<li>
<h3 id="git命令学习小游戏">git命令学习小游戏</h3>
<blockquote>
<p>https://oschina.gitee.io/learn-git-branching/</p>
</blockquote>
</li>
<li>
<h3 id="git的作用">Git的作用</h3>
<ul>
<li>对文件(代码)进行版本管理</li>
<li>完成协同开发 项目,帮助程序员整合代码
<ul>
<li>帮助开发者合并开发的代码</li>
<li>如果出现冲突代码的合并,会提示后提交合并代码的开发者,让其解决冲突</li>
</ul>
</li>
</ul>
</li>
<li>
<h3 id="git与svn比较">git与svn比较</h3>
<blockquote>
<p>git分布式管理:每个客户端都能完成版本管理的功能</p>
</blockquote>
<p><img src="https://img2022.cnblogs.com/blog/2358523/202210/2358523-20221015144534658-263544242.png" alt="image" loading="lazy"></p>
<blockquote>
<p>svn集中式管理:所有代码都放在服务端,版本管理由服务端完成</p>
</blockquote>
<p><img src="https://img2022.cnblogs.com/blog/2358523/202210/2358523-20221015144523922-1463853258.png" alt="image" loading="lazy"></p>
<pre><code>Git:分布式,无网络时也可以提交到本地版本库,待到有网络时再push到服务器.
svn:非分布式,无网络不可以提交
</code></pre>
</li>
</ul>
<h2 id="git衍生三种工具">Git衍生三种工具</h2>
<blockquote>
<p>Git:是一种版本控制系统,是一个命令,是一种工具。<code>空文件夹不会被版本管理</code></p>
</blockquote>
<ul>
<li>GitHub:是一个基于Git实现的在线代码托管仓库,包含一个网站界面,向互联网开放,公有仓库免费,部分私有仓库收费,全球最大的开源代码托管平台</li>
<li>GitLab:是一个基于Git实现的在线代码仓库托管软件,可以通过GitLab自己搭建一个类似于GitHub一样的系统,用在企业内部网络搭建Git私服,用于企业团队内部协作开发</li>
<li>Gitee:(码云) 是 OSCHINA 推出的代码托管平台,支持 Git 和 SVN,提供免费的私有仓库托管,面向互联网开发,分收费和付费,中国最大的开源代码托管平台</li>
</ul>
<h2 id="git工作流程">Git工作流程</h2>
<p><img src="https://img2022.cnblogs.com/blog/2358523/202210/2358523-20221015144918563-2119403645.png" alt="image" loading="lazy"></p>
<blockquote>
<p>Git的工作流程就是三个区的来回切换:</p>
</blockquote>
<ul>
<li>工作区(文件变红色):操作文件就能变红,比如增加内容等操作</li>
<li>工作区提交到暂存区(文件变绿色):git add . 或文件名</li>
<li>暂存区提交到版本库:<code>git commit -m '注释'</code>,注释是必须加的</li>
<li>版本库回退到工作区没有更改的时候:git reset --hard 版本号,版本号版本库有<pre><code>1)有红色信息(工作区有内容),就执行 add
2)全绿信息(内容全部在暂存区),才执行 commit
3)只有被版本库控制的代码,才能被监听,所以可以回滚到任何一个版本
</code></pre>
<blockquote>
<p>总结:工作区管理的文件发生变化会变色,变为红色,通过命令git add .提交到暂存区变绿,暂存区通过git commit -m '注释'提交到版本库</p>
</blockquote>
</li>
</ul>
<h2 id="git常用命令">Git常用命令</h2>
<blockquote>
<p><code>使用的时候切到该文件夹的路径下</code></p>
</blockquote>
<ul>
<li>
<h3 id="在仓库目录终端下---设置用户">在仓库目录终端下 - 设置用户</h3>
<pre><code># 查看当前git下用户名
git config --global --list

# 全局用户
&gt;: git config --global user.name '用户名'
&gt;: git config --global user.email '用户邮箱'
注:在全局文件 C:\Users\用户文件夹\.gitconfig新建用户信息,在所有仓库下都可以使用

# 局部用户
&gt;: git config user.name '用户名'
-- 用户名
&gt;: git config user.email '用户邮箱'
-- 用户邮箱

注:在当前仓库下的config新建用户信息,只能在当前仓库下使用
注:一个仓库有局部用户,优先使用局部用户,没有配置再找全局用户
</code></pre>
</li>
<li>
<h3 id="初始化仓库">初始化仓库</h3>
<blockquote>
<p>初始化会在当前文件夹下创建出一个<code>.git</code>的隐藏文件夹,git配置,版本信息在里面。比如使用我们创建的gittest文件夹来初始化。</p>
</blockquote>
<pre><code>&gt;: cd 目标目录
&gt;: git init 文件/文件夹

初始化仓库,会在当前文件夹下创建出一个.git的隐藏文件夹,git配置,版本信息在里面
</code></pre>
<img src="https://img2022.cnblogs.com/blog/2358523/202210/2358523-20221015150038267-678376365.png" alt="image" loading="lazy"></li>
<li>
<h3 id="查看状态">查看状态</h3>
<blockquote>
<p>查看文件是处于工作区还是暂存区还是版本库</p>
</blockquote>
<ul>
<li>命令:<code>git status</code><br>
<img src="https://img2022.cnblogs.com/blog/2358523/202210/2358523-20221015150305013-1997003999.png" alt="image" loading="lazy"></li>
</ul>
</li>
<li>
<h3 id="工作区变化提交到暂存区">工作区变化提交到暂存区</h3>
<ul>
<li>命令:<code>git add .</code><br>
<img src="https://img2022.cnblogs.com/blog/2358523/202210/2358523-20221015150253189-342320251.png" alt="image" loading="lazy"></li>
</ul>
</li>
<li>
<h3 id="暂存区提交到版本库">暂存区提交到版本库</h3>
<ul>
<li>命令:<code>git commit -m '注释'</code><br>
<img src="https://img2022.cnblogs.com/blog/2358523/202210/2358523-20221015150427450-661580167.png" alt="image" loading="lazy"></li>
</ul>
</li>
<li>
<h3 id="查看版本库的版本信息">查看版本库的版本信息</h3>
<ul>
<li><code>git log</code> : 查看版本信息,显示详细信息,变化记录的少</li>
<li><code>git reflog</code> :查看版本信息,显示简略信息,变化都会记录<br>
<img src="https://img2022.cnblogs.com/blog/2358523/202210/2358523-20221015150549611-1409582079.png" alt="image" loading="lazy"></li>
</ul>
</li>
<li>
<h3 id="回退到工作区的某个版本">回退到工作区的某个版本</h3>
<ul>
<li>命令:<code>git reset --hard 版本</code></li>
<li>把暂存区拉回到工作区(绿变红)
<ul>
<li>命令:<code>git reset HEAD</code></li>
</ul>
</li>
</ul>
</li>
<li>
<h3 id="把工作区变化撤销">把工作区变化撤销</h3>
<ul>
<li>命令:<code>git checkout .</code></li>
</ul>
</li>
</ul>
<h2 id="git过滤文件">Git过滤文件</h2>
<blockquote>
<p>在仓库路径下(被git管理的文件夹),创建一个 <code>.gitignore</code> 的文件,在文件中写入忽略,文件与文件夹均可以被过滤</p>
</blockquote>
<ul>
<li>
<h3 id="文件过滤语法">文件过滤语法</h3>
<pre><code>""" 过滤文件内容
文件或文件夹名:代表所有目录下的同名文件或文件夹都被过滤
/文件或文件夹名:代表仓库根目录下的文件或文件夹被过滤

举例:
a.txt:项目中所有a.txt文件和文件夹都会被过滤
/a.txt:项目中只有根目录下a.txt文件和文件夹会被过滤
/b/a.txt:项目中只有根目录下的b文件夹下的a.txt文件和文件夹会被过滤
*x*:名字中有一个x的都会被过滤(*代表0~n个任意字符)
空文件夹不会被提交,空包会被提交,包可以被提交(包中有一个init空文件)
"""
</code></pre>
<img src="https://img2022.cnblogs.com/blog/2358523/202210/2358523-20221015151430769-1240790086.png" alt="image" loading="lazy"></li>
<li>
<h3 id="后端项目的gitignore">后端项目的.gitignore</h3>
<blockquote>
<p>一般这些文件或文件夹需要被过滤掉</p>
</blockquote>
<ul>
<li>.idea</li>
<li><strong>pycache</strong></li>
<li>*.pyc</li>
<li>logs/*.log</li>
<li>scripts</li>
</ul>
</li>
</ul>
<h2 id="分支操作">分支操作</h2>
<blockquote>
<p>分支操作就是git 可以创建多条分支,创建完以后,在不通分支上提交版本,不同分支的版本相互不影响</p>
</blockquote>
<p><img src="https://img2022.cnblogs.com/blog/2358523/202210/2358523-20221015151744815-1863796711.png" alt="image" loading="lazy"></p>
<ul>
<li>
<h3 id="分支操作常用命令">分支操作常用命令</h3>
<div class="table-wrapper"><table>
<thead>
<tr>
<th>命令</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>git branch 分支名</td>
<td>创建分支</td>
</tr>
<tr>
<td>git branch</td>
<td>查看分支</td>
</tr>
<tr>
<td>git checkout 分支名</td>
<td>切换分支</td>
</tr>
<tr>
<td>git checkout -b 分支名</td>
<td>创建并切换到分支</td>
</tr>
<tr>
<td>git branch -d 分支名</td>
<td>删除分支</td>
</tr>
<tr>
<td>git branch -a</td>
<td>查看所有分支</td>
</tr>
<tr>
<td>git branch -r</td>
<td>查看远程分支</td>
</tr>
<tr>
<td>git merge 分支名</td>
<td>合并分支</td>
</tr>
</tbody>
</table></div>
<ul>
<li>注意:
<ul>
<li>合并分支的时候是在master主干合并,比如把dev分支合并到master分支,切换到master分支,执行合并dev分支的命令</li>
<li>分支合并可能会出冲突,比如master主干改了代码提交了,dev改了代码提交了,他们改的是同一个代码,合并就会出冲突</li>
</ul>
</li>
</ul>
</li>
<li>
<h3 id="实操">实操</h3>
<pre><code>git checkout -b dev
touch dev.txt
git add .
git commit -m 'dev分支增加了dev.txt'
git checkout master
git merge dev
----------
git checkout dev
git add .
git commit -m 'dev分dev.txt增加了一行'
git checkout master
git merge dev
------
</code></pre>
</li>
</ul>
<h2 id="远程仓库-gitee">远程仓库-gitee</h2>
<pre><code>"""
1)你作为项目仓库初始化人员:
    线上要创建空仓库 =&gt; 本地初始化好仓库 =&gt; 建立remote链接(remote add) =&gt; 提交本地仓库到远程(push)

2)你作为项目后期开发人员:(大部分都是公司已经有项目了,你基于这个项目继续开发)
    远程项目仓库已经创建成功 =&gt; 复制远程仓库到本地(clone) =&gt; 进入仓库就可以进行接下来的开发
"""
</code></pre>
<ul>
<li>
<h3 id="创建仓库">创建仓库</h3>
<p><img src="https://img2022.cnblogs.com/blog/2358523/202210/2358523-20221015152343174-851718468.png" alt="image" loading="lazy"></p>
<ul>
<li>把本地代码提交到远程仓库<br>
<code>创建空仓库,如上图</code></li>
<li>Git 全局设置<pre><code>git config --global user.name "用户名"
git config --global user.email "邮箱"
</code></pre>
</li>
<li>如果没有仓库,创建 git 仓库<pre><code>mkdir luffy_api
cd luffy_api
git init
touch README.md
git add README.md
git commit -m "first commit"
git remote add origin https://gitee.com/li-gitte/luffy_api.git
git push -u origin "master"
</code></pre>
</li>
<li>如果有仓库了<pre><code>cd existing_git_repo
git remote add origin https://gitee.com/li-gitte/luffy_api.git
git push -u origin "master"

# git push -u origin master 中-u的意思是,只要执行一遍这个命令,以后执行git push 就等同于git push origin maste,所有-u表示设置一个默认
</code></pre>
</li>
</ul>
</li>
<li>
<h3 id="remote源操作">remote源操作</h3>
<pre><code># 1 查看远程仓库
git remote
# 2添加远程仓库
git remote add 起一个名字 远程仓库地址
git remote add origin https://gitee.com/li-gitte/luffy_api.git

# 3 删除远程仓库
git remote remove origin

# 4把本地仓库提交到远程仓库
git push 远程仓库名字 分支名
# 第一次:要输入用户名密码,只要输入一次,以后就记录到操作系统上了
# windows:凭证管理,删除
git push origin master

# 5 从远端仓库更新(拉取)代码
git pull 远程仓库名字 分支名
git pull origin master


# 常用的命令
git add .
git status
git commit -m '注释'
git pull origin master
git push origin master
</code></pre>
<ul>
<li>
<h4 id="凭据管理控制面板用户帐户凭据管理器">凭据管理:控制面板\用户帐户\凭据管理器</h4>
<img src="https://img2022.cnblogs.com/blog/2358523/202210/2358523-20221015153118994-1689588381.png" alt="image" loading="lazy"></li>
</ul>
</li>
<li>
<h3 id="ssh-连接远程仓库">SSH 连接远程仓库</h3>
<blockquote>
<p>https://gitee.com/help/articles/4181</p>
</blockquote>
<ul>
<li>注意,如果连接方式改变,需要删除原理的远程仓库,再次添加换成新的连接方式<pre><code>
git remote remove origin# 删除
git remote add origin git@gitee.com:li-gitte/luffy_api.git # 添加
git push oringin master    # 提交
</code></pre>
<pre><code>ssh-keygen -t rsa-C "xxx@outlook.com"
-t:指定生成密钥的类型,默认使用SSH2d的rsa
-f:指定生成密钥的文件名,默认id_rsa(私钥id_rsa,公钥id_rsa.pub)
-P:提供旧密码,空表示不需要密码(-P ‘’)
-N:提供新密码,空表示不需要密码(-N ‘’)
-b:指定密钥长度(bits),RSA最小要求768位,默认是2048位;DSA密钥必须是1024位(FIPS 1862标准规定)
-C:提供一个新注释
-R hostname:从known_hosta(第一次连接时就会在家目录.ssh目录下生产该密钥文件)文件中删除所有属于hostname的密钥
</code></pre>
</li>
</ul>
</li>
<li>
<h3 id="协同开发">协同开发</h3>
<blockquote>
<p>一般都是项目的管理员邀请你称为开发者或者观察者···</p>
</blockquote>
<p><img src="https://img2022.cnblogs.com/blog/2358523/202210/2358523-20221015153547602-2064598687.png" alt="image" loading="lazy"></p>
<pre><code>"""
1)作为开发者,第一次同步项目&gt;: git clone 项目地址
2)保证自己本地有dev分支,且与远程仓库版本同步(没有就自己新建)
3)本地开发的代码,必须add、commit到本地版本库后,才和远程仓库进行交互
4)交互顺序:必须 先拉(pull)后提(push)
5)必须切换到要交互的分支,在与远程同名的分支进行交互,如本地dev与远程dev交互
&gt;: git checkout dev&gt;: git add .
&gt;: git commit -m '本次提交的信息提示'
&gt;: git pull origin dev
&gt;: git push origin dev
"""
</code></pre>
</li>
</ul>
<h2 id="解决冲突">解决冲突</h2>
<ul>
<li>
<h3 id="代码冲突">代码冲突</h3>
<blockquote>
<p>我们本地提交代码的时候需要将本地的代码更新到最新,所以需要先git pull ···,然后再git push···</p>
</blockquote>
<ul>
<li>出现冲突<br>
<img src="https://img2022.cnblogs.com/blog/2358523/202210/2358523-20221015153843306-608834612.png" alt="image" loading="lazy"></li>
<li>只要我们pull下来就会发现冲突,哪个文件冲突了文件名就会变红<pre><code>会把远端冲突的代码合并进来
&lt;&lt;&lt;&lt;&lt;&lt;&lt; HEAD# 冲突开始
ALAN is big    # 这里是我的代码
=======
ALAN is tobig    # 这里是远端代码
&gt;&gt;&gt;&gt;&gt;&gt;&gt; e2d67d7517d66d244f824a32e20d4dd43f4ffc4d # 冲突结束
</code></pre>
</li>
<li>解决冲突<pre><code># 查看代码,如果是同样的功能,选择保留同事的或自己的,如果是不同功能,两个代码都保留,如果真的要删同事的代码,交流抉择删除冲突代码,最终解决冲突
git add .
git commit -m '解决冲突'
git pull origin master
git push origin master
</code></pre>
</li>
</ul>
</li>
<li>
<h3 id="合并分支冲突">合并分支冲突</h3>
<ul>
<li>比如如果我们在主干master和开发分支dev增加或修改了相同的代码,这样再合并就会冲突<pre><code>git branch dev
# 加入会冲突的代码
git add .
git commit -m '主分支加入了一行'
git checkout dev
git status
# 加入会冲突的代码
git add .
git commit -m 'dev分支加入了一行'
git checkout master
git merge dev
# 出现下面冲突

&lt;&lt;&lt;&lt;&lt;&lt;&lt; HEAD
HammerZe is big
=======
HammerZe is very big
&gt;&gt;&gt;&gt;&gt;&gt;&gt; dev
</code></pre>
</li>
<li>解决办法和上面的一样,如果代码功能相同选择性删除另外分支的代码,如果代码功能不相同都保留或优化<pre><code># 手动解决冲突,再提交
git add .
git commit -m '分支合并冲突解决'
</code></pre>
</li>
<li>线上分支合并
<ul>
<li>提交PR<br>
<img src="https://img2022.cnblogs.com/blog/2358523/202210/2358523-20221015154416353-551428187.png" alt="image" loading="lazy"><pre><code># 提交pull request---》提交pr---》提个合并分支请求

# 提交pr---》你领导审核---》审核通过同意---》代码合并完成

# 本地某个分支加入了代码,提交到远端

# 在远端新建一个pull Request,选择要合并的两条分支---》提交了领导收到请求

# 看你的代码---》没有问题---》同意---》合并到分支中去,完成线上分支合并
</code></pre>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<h2 id="变基">变基</h2>
<p>https://www.cnblogs.com/liuqingzheng/p/15328319.html</p>
<h2 id="搭建gitlab">搭建gitlab</h2>
<p>https://zhuanlan.zhihu.com/p/413217715</p><br><br>
来源:https://www.cnblogs.com/joyjoyly/p/16794193.html
頁: [1]
查看完整版本: Git&Gitee