Git与Gitee
<svg xmlns="http://www.w3.org/2000/svg" style="display: none"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0)"></path>
</svg>
<h2>1.1Git 的优势 分支操作</h2>
<ol><li>大部分操作在本地完成,不需要联网</li><li>完整性保证</li><li>尽可能添加数据而不是删除或修改数据</li><li>分支操作非常快捷流畅</li><li>与 Linux 命令全面兼容</li></ol>
<h2>1.2Git流程</h2>
<p><img src="https://img-blog.csdnimg.cn/594a902742d24cf4a415cf35e90b337b.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5Y-45b6S5bCP5aSc,size_20,color_FFFFFF,t_70,g_se,x_16" alt="在这里插入图片描述"></p>
<h2>1.3命令行操作</h2>
<h3>1.3.1本地库(版本库或仓库)初始化</h3>
<p>命令:</p>
<pre><code>git init (git add//使用git管理这个文件放入暂存区)
</code></pre>
<p>效果 <code>$ls -lA (查看以.开始的隐藏文件)</code></p>
<p>注意:.git 目录中存放的是本地库相关的子目录和文件,不要删除,也不要胡<br> 乱修改。</p>
<h3>1.3.2设置签名</h3>
<blockquote>
<p>用户名:tom Email</p>
<p>地址:goodMorning@qq.com</p>
<p>作用:区分不同开发人员的身份</p>
<p>辨析:这里设置的签名和登录远程库(代码托管中心)的账号、密码没有任何关 系。</p>
</blockquote>
<p>命令 :</p>
<p>**项目级别/仓库级别:**仅在当前本地库范围内有效</p>
<pre><code>git config user.name 用户名
git config user.email 邮箱
</code></pre>
<ul><li>信息保存位置:./.git/config 文件</li></ul>
<p>**系统用户级别:**登录当前操作系统的用户范围</p>
<pre><code>git config*--global* user.name tom_glb
git config*--global* user.email goodMorning_pro@atguigu.com
</code></pre>
<ul><li>信息保存位置:~/.gitconfig 文件</li></ul>
<p><strong>级别优先级</strong></p>
<ul><li> <p>就近原则:项目级别优先于系统用户级别,二者都有时采用项目级别 的签名</p> </li><li> <p>如果只有系统用户级别的签名,就以系统用户级别的签名为准</p> </li><li> <p>二者都没有不允</p> </li></ul>
<pre><code>$ ls-lA |less //less 查看文件后按:q返回
</code></pre>
<h3>1.3.2Git基本操作</h3>
<h4>1.3.2.1 状态查看 status</h4>
<pre><code>git status# 查看工作区、暂存区状态
</code></pre>
<h4>1.3.2.2 添加 add</h4>
<pre><code>git add # 将工作区的“新建/修改”添加到暂存区
git add .# 提交所未定位的文件。
git rm --cached # 将文件从暂存区撤回
</code></pre>
<h4>1.3.2.3 提交 commit</h4>
<pre><code>git commit ... -m # 将暂存区的内容提交到本地库message备注信息
git commit -a -m # 不经过add 直接添加至本地库
</code></pre>
<p> 可以直接commit,在不add的情况下</p>
<h4>1.3.2.4 查看历史记录 log</h4>
<pre><code>git log
</code></pre>
<p><strong>多屏显示控制方式:</strong></p>
<blockquote>
<p>空格向下翻页</p>
<p>b 向上翻页</p>
<p>q 退出</p>
</blockquote>
<pre><code>git log --pretty=oneline//一个任务一行显示
git log --oneline //缩短hash值
git reflog //显示移动步数
</code></pre>
<p> HEAD@{移动到当前版本需要多少步} //head 指针</p>
<h4>1.3.2.5 前进后退 reset --hard</h4>
<ul><li> <p>基于索引值操作[推荐]</p> <pre><code>git reset --hard [局部索引值]
git reset --hard a6ace91
</code></pre> </li><li> <p>使用^符号:只能后退</p> <pre><code>git reset --hard HEAD^
</code></pre> <p>注:一个^表示后退一步,n 个表示后退 n 步</p> </li><li> <p>使用~符号:只能后退</p> <pre><code> git reset --hard HEAD~n
</code></pre> <p>注:表示后退 n 步</p>
<blockquote>
<p>当执行 git reset HEAD 命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。</p>
<p>当执行 git rm --cached 命令时,会直接从暂存区删除文件,工作区则不做出改变。</p>
<p>当执行 git checkout . 或者 git checkout – 命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区中的改动。</p>
<p>当执行 git checkout HEAD . 或者 git checkout HEAD 命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。</p>
</blockquote> </li></ul>
<h4>1.3.2.6 reset 命令的三个参数对比</h4>
<ul><li> <p>–soft 参数</p>
<ul><li> <p>仅仅在<strong>本地库</strong>(仓库)移动 HEAD 指针</p> <p>注:本地库若后退了,会让暂存区与工作区显得往前走了</p> </li></ul> </li><li> <p>–mixed 参数</p>
<ul><li>在<strong>本地库</strong>移动 HEAD 指针</li><li>重置<strong>暂存区</strong></li></ul> </li><li> <p>–hard 参数</p>
<ul><li>在<strong>本地库</strong>移动 HEAD 指针</li><li>重置<strong>暂存区</strong></li><li>重置<strong>工作区</strong>(云上)</li></ul> </li></ul>
<h4>1.3.2.7 删除文件并找回 reset前一个版本</h4>
<ul><li>前提:删除前,文件存在时的状态提交到了本地库。</li><li>操作:git reset --hard [指针位置] 回退版本
<ul><li>删除操作已经提交到本地库:指针位置指向历史记录</li><li>删除操作尚未提交到本地库:指针位置使用 HEAD</li></ul> </li></ul>
<h4>1.3.2.8 比较文件差异</h4>
<ul><li> <pre><code>git diff [文件名]
</code></pre>
<ul><li>将工作区中的文件和暂存区进行比较</li></ul> </li><li> <pre><code>git diff [本地库中历史版本] [文件名]
</code></pre>
<ul><li>将工作区中的文件和本地库历史记录比较</li></ul> </li><li> <p>不带文件名比较多个文件</p> </li></ul>
<h2>名词解释</h2>
<pre><code>名词解释:
CRLF: "\r\n", windows系统环境下的换行方式
LF: "\n", Linux系统环境下的换行方式
</code></pre>
<h2>Linux语法</h2>
<p>ctrl+l 清屏 clear</p>
<pre><code>linux语法
$ cat good.txt# 查看文本内容
$ vim good.txt# 编辑文件 i插入 ESC wq保存退出
$ pwd(英文全拼:print work directory) # 显示目前的目录
$ mkdir(英文全拼:make directory) # 创建一个新的目录
$ rmdir(英文全拼:remove directory) # 删除一个空的目录
$ cp(英文全拼:copy file) #复制文件或目录
$ rm(英文全拼:remove) #删除文件或目录
$ mv(英文全拼:move file) #移动文件与目录,或修改文件与目录的名称
$ tail -n 100 # 显示最后100行数据-f 常用于查阅正在改变的日志文件。
</code></pre>
<p><img src="https://img-blog.csdnimg.cn/2d04711f6f22403881bdddc327b8413e.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5Y-45b6S5bCP5aSc,size_20,color_FFFFFF,t_70,g_se,x_16" alt=""></p>
<blockquote>
<ol><li> <p>创建文件或文件夹的方式<br> touch # 用于修改文件或者目录的时间属性,包括存取时间和更改时间。若文件不存在,系统会建立一个新的文件。<br> vi # vi编辑器 编辑文件,没有会自动创建<br> mkdir # 创建目录,没有会自动创建</p> </li><li> <p>使用vim时,如果不小心按了 Ctrl + s后,会发现不能输入任何东西了,像死掉了一般,其实vim并没有死掉,这时vim只是停止向终端输出而已,要想退出这种状态,只需按Ctrl + q 即可恢复正常。</p> </li></ol>
</blockquote>
<h3>1.4分支管理</h3>
<h4>1.4.1 分支的好处</h4>
<ul><li>同时并行推进多个功能开发,提高开发效率</li><li>各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任 何影响。失败的分支删除重新开始即可</li><li>一般工作至少需要两个分支 master(主分支)、dev(开发分支)</li></ul>
<h3>1.4.2分支操作</h3>
<h4>1.4.2.1创建、删除分支命令:branch</h4>
<blockquote>
<p> 分支创建新分支时,<strong>新创建的分支</strong>代码与<strong>创建者的分支</strong>代码保持一至。</p>
</blockquote>
<pre><code>git branch (分支名)# 创建分支
git branch# 查看分支
git branch -d 需要删除的分支名# 查看分支
</code></pre>
<h4>1.4.2.2切换分支命令:checkout</h4>
<pre><code>git checkout (分支名)
</code></pre>
<p>当你切换分支的时候,Git 会用该分支的最后提交的快照替换你的工作目录的内容, 所以多个分支不需要多个目录。</p>
<h4>1.4.2.3合并分支命令:merge</h4>
<p>若A分支合并B分支:需要先切换到A分支,然后在A分支下合并B分支。</p>
<pre><code>git merge(有新内容分支)
</code></pre>
<h4>1.4.2.3 解决冲突</h4>
<ul><li> <p>冲突的表现</p>
<blockquote>
<p>CONFLICT (content): Merge conflict in good.txt<br> Automatic merge failed; fix conflicts and then commit the result.</p>
<p>提示产生冲突,需要解决。</p>
<p>**产生冲突的原因:**merge 分支的代码与原分支的代码修改过同一行的文件。(未修改同一行文件一般会自动合并)</p>
</blockquote> </li><li> <p>冲突的解决</p>
<ul><li>第一步:编辑文件,删除特殊符号</li><li>第二步:把文件修改到满意的程度,保存退出</li><li>第三步:<code>git add [文件名]</code></li><li>第四步:<code>git commit -m "日志信息"</code>
<ul><li>注意:此时 commit 一定不能带具体文件名,因为此时需要commit多个文件所以不加文件名。</li></ul> </li></ul> </li></ul>
<h2>1.5连接GitHub</h2>
<h3>1.5.1创建远程仓库的别名 remote add</h3>
<pre><code>git remote -v 查看当前所有远程地址别名
git remote add [别名] [远程地址]
</code></pre>
<h3>1.5.2 推送本地库(版本库)到远程仓库 push</h3>
<pre><code>git push [别名] [分支名]
</code></pre>
<h3>1.5.3 克隆 clone</h3>
<pre><code> git clone [远程地址]
</code></pre>
<h3>1.5.4 拉取 pull</h3>
<p><strong>git pull</strong> 命令用于从远程获取代码并合并本地的版本。用于冲突不是很多的情况,否则用fetch后merge</p>
<p><strong>git pull</strong> 其实就是 <strong>git fetch</strong> 和 <strong>git merge FETCH_HEAD</strong> 的简写。 命令格式如下:</p>
<pre><code>git fetch [远程库地址别名] [远程分支名] #从远程获取代码库
git merge [远程库地址别名/远程分支名]
git pull <远程主机名> <远程分支名>:<本地分支名>
$git pull origin master --allow-unrelated-histories# 强制合并 git库里有多个分支目前只想修改一个分支的内容
</code></pre>
<h3>1.5.5 团队其他人推送</h3>
<p><strong>如果不是基于 GitHub 远程库最新版所做的修改</strong>,不能直接推送(push),必须先拉取(pull)。拉取下来后进入冲突状态,解决冲突完成之后推送(push)。</p>
<h3>1.5.6 跨团队协作</h3>
<p>1.<strong>fork</strong></p>
<p> 在github的项目界面右上角<br> 2.<strong>clone</strong> 跨团队<strong>fork</strong>后拥有的远程库</p>
<p>3.改动后<strong>pull</strong> 跨团队的远程库</p>
<p>4.在GitHub上的项目界面点 <strong>Pull request</strong> >>> <strong>New pull request</strong> >>> 写消息<strong>Create pull request</strong></p>
<p>5.项目所有人查看跨团队的 <strong>Pull request</strong></p>
<p>6.审核代码</p>
<p>7.合并代码 <strong>Merge pull request</strong></p>
<p>8.将远程库拉取到本地 <strong>pull</strong></p>
<h2>1.6ssh连接Git</h2>
<p>略</p>
<h2>1.7Eclipse连接Git</h2>
<h3>1.7.1 查看Git 设置本地库的用户签名</h3>
<p> window >> preferences >> Team >> Git >> Configuration(Repository Settings选项卡) >> Add Entry</p>
<h3>1.7.2 解释 合并工具zoomit</h3>
<ul><li>创建好eclipse的本地库之后 需要git add 添加到缓存区将文件追踪。如果文件未被追踪文件无法上传到仓库。</li><li>项目中的所有文件不需要全部都进行追踪,有一些用于项目管理的文件不需要上传。</li><li>Navigator窗口可查看项目的所有文件</li><li>项目右键 >> Team >> Add to index(添加至仓库缓存)</li><li>commit 需要填写提交信息,一般是介绍操作的用途,或修改的文件名</li><li>转换工程类型:项目右键 >> Configure >> Convert to Maven Project</li><li>低版本导入git项目需要指定工作区以外的项目,高版本一般指定工作目录。</li><li>在做修改之后需要提交到本地库(commit)才能往git上提交,一般需要先pull 后 Push 。</li><li>冲突合并的工具:merge tool 左边是自己的,右边是git上的,左边可以修改,右边不可以修改。</li></ul>
<h2>1.8Git的工作流</h2>
<p>1.8.1 分类</p>
<ol><li> <p>集中式工作流</p> <p>像 SVN 一样,集中式工作流以中央仓库作为项目所有修改的单点实体。所有 修改都提交到 Master 这个分支上。 这种方式与 SVN 的主要区别就是开发人员有本地库。Git 很多特性并没有用到。</p> </li><li> <p>Gitflow工作流</p> <p>Gitflow 工作流通过为功能开发、发布准备和维护设立了独立的分支,让发布 迭代过程更流畅。严格的分支模型也为大型项目提供了一些非常必要的结构。</p> </li><li> <p>Forking 工作流</p> <p>Forking 工作流是在 GitFlow 基础上,充分利用了 Git 的 Fork 和 pull request 的 功能以达到代码审核的目的。更适合安全可靠地管理大团队的开发者,而且能接受 不信任贡献者的提交。</p> </li></ol>
<h3>1.8.2 GitFlow工作流详解</h3>
<h4>1.8.2.1分支的种类</h4>
<ol><li> <p>主干分支 master</p> <p>主要负责管理正在运行的生产环境代码。永远保持与正在运行的生产环境 完全一致。</p> </li><li> <p>开发分支 develop</p> <p>主要负责管理正在开发过程中的代码。一般情况下应该是最新的代码。</p> </li><li> <p>bug 修理分支 hotfix</p> <p>主要负责管理生产环境下出现的紧急修复的代码。 从主干分支分出,修 理完毕并测试上线后,并回主干分支。并回后,视情况可以删除该分支。</p> </li><li> <p>准生产分支(预发布分支) release</p> <p>较大的版本上线前,会从开发分支中分出准生产分支,进行最后阶段的集 成测试。该版本上线后,会合并到主干分支。生产环境运行一段阶段较稳定后 可以视情况删除。</p> </li><li> <p>功能分支 feature</p> <p>为了不影响较短周期的开发工作,一般把中长期开发模块,会从开发分支 中独立出来。 开发完成后会合并到开发分</p> </li></ol>
<h4>1.8.2.2GitFlow工作流举例</h4>
<p>操作:</p>
<p>切换分支:Team >> switch to >></p>
<p>合并分支:Merge</p>
<ol><li>创建分支 new Branch</li><li>切换分支审查代码 ,并从commit代码到Git库</li><li>项目经理 检出远程分支 checkout (项目经理本地创建出新的分支(前面新建的))</li><li>切回master</li><li>合并分支 merge</li><li>合并成功后推向Git</li></ol>
<h2>1.9 Gitee实战</h2>
<p>见:https://blog.csdn.net/qq_43530326/article/details/123435355</p><br><br>
来源:https://www.cnblogs.com/stblack/p/16637213.html
頁:
[1]