git常用操作以及码云Gitee连接git
<p></p><div class="toc"><div class="toc-container-header">目录</div><ul><li>1 git简介<ul><li>1.1 Git四大工作区域</li><li>1.2 Git工作流程</li><li>1.3 Git文件四种状态</li></ul></li><li>2 和gitee连接<ul><li>2.1 创建git仓库</li><li>2.2 通过ssh公钥连接<ul><li>2.2.1 获取公钥</li><li>2.2.2 gitee免密码登录</li><li>2.2.3 配置本地仓库连接远程仓库</li></ul></li><li>2.3 通过https连接</li></ul></li><li>3 git常用命令<ul><li>3.1 新建初始配置类<ul><li>3.1.1 初始化命令</li><li>3.1.2 拉取命令</li><li>3.1.3 配置类命令</li></ul></li><li>3.2 修改提交类命令<ul><li>3.2.1 本地修改</li><li>3.2.2 提交类命令</li><li>3.2.3 查看日志</li><li>3.2.4 显示提交时内容</li></ul></li><li>3.3 远端仓库类命令<ul><li>3.3.1 显示远端仓库</li><li>3.3.2 远端拉取</li><li>3.3.3 远端推送</li></ul></li><li>3.4分支类命令<ul><li>3.4.1 查看分支</li><li>3.4.2 切换分支</li><li>3.4.3 新建分支</li><li>3.4.4 删除分支</li><li>3.4.5 合并分支</li><li>3.4.6 比较不同</li></ul></li><li>3.5 撤销操作<ul><li>3.5.1 git checkout</li><li>3.5.2 git reset<ul><li>3.5.2.1 简介</li><li>3.5.2.2 命令</li><li>3.5.2.3 回滚操作</li></ul></li><li>3.5.3 git revert</li><li>3.5.4 Idea中撤销操作<ul><li>3.5.4.1 Undo Commit</li><li>3.5.4.2 Revert Commit</li><li>3.5.4.3 Drop Commit(慎用)</li><li>3.5.4.4 不能Undo,Revert,Drop的撤销</li></ul></li></ul></li><li>3.6 高级命令<ul><li>3.6.1 标签相关</li><li>3.6.2 git rebase</li><li>3.6.3 git stash</li><li>3.6.4 其他命令</li></ul></li><li>3.7 Git添加新项目<ul><li>3.7.1 基本设置</li><li>3.7.2 初始化 Git 仓库</li><li>3.7.3 添加文件到 Git 暂存区</li><li>3.7.4 提交到本地仓库</li><li>3.7.5 配置远程仓库</li><li>3.7.6 推送代码到远程仓库</li></ul></li></ul></li></ul></div><p></p><h1 id="1-git简介">1 git简介</h1>
<p>每次提交代码都是提交到本地仓库,我们现在将本地仓库的代码推送至远程仓库,供所有人下载<br>
远程仓库:一个远程仓库对应一个本地仓库,不会混乱</p>
<h2 id="11-git四大工作区域">1.1 Git四大工作区域</h2>
<p>先学习下Git的几个工作区域:<br>
<img src="https://img-blog.csdnimg.cn/direct/160573def65644e4a9a7bab3335ec88c.png"></p>
<ul>
<li><code>Workspace</code>:电脑本地看到的文件和目录,在<code>Git</code>的版本控制下,构成了工作区</li>
<li><code>Index/Stage</code>:暂存区,一般存放在 <code>.git</code>目录下,即<code>.git/index</code>,它又叫待提交更新区,用于临时存放你未提交的改动。比如,你执行git add,这些改动就添加到这个区域</li>
<li><code>Repository</code>:本地仓库,当执行<code>git clone 地址</code>,就是把远程仓库克隆到本地仓库。它是一个存放在本地的版本库,其中<code>HEAD</code>指向最新放入仓库的版本。当执行<code>git commit</code>,文件改动就到本地仓库来了<br>
或者在计算机中使用 <code>Git</code> 初始化一个仓库时,<code>Git</code> 会在当前目录下创建一个名为<code>.git</code> 的隐藏文件夹来存储仓库的所有相关信息。这个<code>.git</code>文件夹包含了版本历史、分支、标签、配置等信息,是 <code>Git</code> 本地仓库的核心部分</li>
<li><code>Remote</code>:远程仓库,就是类似github,码云等网站所提供的仓库,可以理解为远程数据交换的仓库</li>
</ul>
<h2 id="12-git工作流程">1.2 Git工作流程</h2>
<p>详情图<br>
<img src="https://img-blog.csdnimg.cn/direct/9a2c55624e3e4061962659248136b02b.png"><br>
原理图:<br>
<img src="https://img-blog.csdnimg.cn/da5499799d7a4033a832c628aff30da0.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA56m65bGx5paw6Zuo5aSp5rCU5pma56eL,size_20,color_FFFFFF,t_70,g_se,x_16"><br>
<code>git</code> 的正向工作流程一般就这样:</p>
<ul>
<li>从远程仓库拉取文件代码回来;</li>
<li>在工作目录,增删改查文件;</li>
<li>把改动的文件放入暂存区;</li>
<li>将暂存区的文件提交本地仓库;</li>
<li>将本地仓库的文件推送到远程仓库;</li>
</ul>
<h2 id="13-git文件四种状态">1.3 Git文件四种状态</h2>
<p>根据一个文件是否已加入版本控制,可以把文件状态分为:<code>Tracked</code>(已跟踪)和<code>Untracked</code>(未跟踪),而<code>tracked</code>(已跟踪)又包括三种工作状态:<code>Unmodified</code>,<code>Modified</code>,<code>Staged</code><br>
<img src="https://img-blog.csdnimg.cn/direct/f1a69e7966194262a516c5ac57d9f1a6.png"></p>
<ul>
<li><code>Untracked</code>: 文件还没有加入到<code>git</code>库,还没参与版本控制,即未跟踪状态。这时候的文件,通过<code>git add</code> 状态,可以变为<code>Staged</code>状态</li>
<li><code>Unmodified</code>:文件已经加入<code>git</code>库, 但是还没修改, 就是说版本库中的文件快照内容与文件夹中还完全一致。<code>Unmodified</code>的文件如果被修改, 就会变为<code>Modified</code>,如果使用<code>git remove</code>移出版本库, 则成为<code>Untracked</code>文件。</li>
<li><code>Modified</code>:文件被修改了,就进入<code>modified</code>状态啦,文件这个状态通过<code>stage</code>命令可以进入<code>staged</code>状态</li>
<li><code>staged</code>:暂存状态. 执行<code>git commit</code>则将修改同步到库中, 这时库中的文件和本地文件又变为一致, 文件为<code>Unmodified</code>状态.</li>
</ul>
<h1 id="2-和gitee连接">2 和gitee连接</h1>
<h2 id="21-创建git仓库">2.1 创建git仓库</h2>
<p>在需要和远端交互的总文件夹内创建<code>git仓库</code>,右键单击->选择<code>Git Bash Here</code><br>
<code>git init</code>:创建git仓库,这会在项目根目录下生成一个隐藏的名为<code>.git</code>的文件夹,这个文件夹存放的就是git仓库</p>
<h2 id="22-通过ssh公钥连接">2.2 通过ssh公钥连接</h2>
<p>通过<code>ssh公钥</code>连接就需要<code>ssh</code>的连接地址,比如:<code>git@gitee.com:xxxx/git-test.git</code></p>
<h3 id="221-获取公钥">2.2.1 获取公钥</h3>
<p><code>ssh-keygen:</code>创建SSH密钥,在用户根目录下创建一个<code>.ssh</code>文件夹, 里面包含了<code>id_rsa</code>和<code>id_rsa.pub</code>两个文件。 前者是私钥, 后者是公钥。秘钥不能泄露出去, 而公钥要设置在gitee相应位置</p>
<h3 id="222-gitee免密码登录">2.2.2 gitee免密码登录</h3>
<p>点击头像--设置---ssh公钥---填写内容---确定<br>
<img src="https://img-blog.csdnimg.cn/6c3d3f8e81804fc69bd727b418f210aa.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTIwNjAwMzM=,size_16,color_FFFFFF,t_70"></p>
<h3 id="223-配置本地仓库连接远程仓库">2.2.3 配置本地仓库连接远程仓库</h3>
<p><code>git remote add test git@gitee.com:xx/xx.git:</code>会关联<code>git@gitee.com:xx/xx.git</code>所对应的远程仓库。<code>test</code>是设置的关联名字,可以随便起, 以后通过它向远程仓库提交程序</p>
<h2 id="23-通过https连接">2.3 通过https连接</h2>
<p>通过<code>https</code>连接就需要<code>https</code>的连接地址,比如:<code>https://gitee.com/xxxx/git-test.git</code><br>
此时就不需要<code>ssh</code>生成公钥,也不用在gitee上配置<code>ssh公钥</code></p>
<p><code>git remote add test https://gitee.com/xxxx/git-test.git:</code>用来和远端仓库进行关联,在拉取或者推送时只用输入账号或者密码就可以了</p>
<h1 id="3-git常用命令">3 git常用命令</h1>
<p>专用名词:</p>
<ul>
<li><code>master</code>: 默认开发分支</li>
<li><code>origin</code>: 默认远程版本库</li>
<li><code>Index / Stage</code>:暂存区</li>
<li><code>Workspace</code>:工作区</li>
<li><code>Repository</code>:仓库区(或本地仓库)</li>
<li><code>Remote</code>:远程仓库</li>
</ul>
<p>这个图只是模拟一下git基本命令使用的大概流程<br>
<img src="https://img-blog.csdnimg.cn/direct/1b0a27d110dc496da75258bb5c883006.png"></p>
<h2 id="31-新建初始配置类">3.1 新建初始配置类</h2>
<h3 id="311-初始化命令">3.1.1 初始化命令</h3>
<p><code>git init</code>:在当前目录新建一个代码仓库<br>
<code>git init </code>:新建一个目录,把它初始化为git代码仓库</p>
<h3 id="312-拉取命令">3.1.2 拉取命令</h3>
<p><code>git clone </code>:下载一个项目和它整个代码的历史,即从远程把仓库复制一份到本地,克隆后会创建一个新的本地仓库<br>
<code>git checkout -b dev</code>: 创建开发分支dev,并切换到该分支下,<code>-b</code> 选项表示创建一个新的分支。具体来说是:切换到名为 <code>dev</code> 的分支,如果 <code>dev</code> 分支不存在,则创建一个名为 <code>dev</code> 的新分支</p>
<h3 id="313-配置类命令">3.1.3 配置类命令</h3>
<p><code>git config --list</code>:查看git配置<br>
<code>git config -e [--global]</code>:编辑git配置文件<br>
<code>git config [--global] user.name "用户名"</code>:设置[全局]配置用户名<br>
<code>git config [--global] user.password "密码"</code>:设置[全局]配置密码<br>
<code>git config [--global] user.email"邮箱"</code>:重新全局配置邮箱<br>
<code>ssh-keygen</code>:生成ssh 公钥</p>
<h2 id="32-修改提交类命令">3.2 修改提交类命令</h2>
<h3 id="321-本地修改">3.2.1 本地修改</h3>
<p><code>git status</code>:查看当前工作区的状态<br>
<code>git diff -- fileName</code>:命令可以查看工作区和版本库里面最新版本的区别<br>
<code>git add </code>: 添加文件到暂存区<br>
<code>git add dir</code>: 添加文件目录到暂存区<br>
<code>git add . </code>: 添加当前目录所有文件到暂存区<br>
<code>git add -p </code>: 添加每个变化前都会要求确认,对于同一文件多处变化,可以实现分次提交</p>
<p><code>git rm </code>: 删除工作区文件,并把删除放入暂存区<br>
<code>git rm --cached </code>:停止追踪指定文件(主要用于在<code>.gitignore</code>中添加屏蔽文件,但是commit窗口还有该文件时使用),该文件会保留在工作区,如果文件太多,可以指定目录,添加 <code>-r</code> 递归目录,rm后要记得commit并push,否则不会生效<br>
<code>git mv </code>: 改名文件,并把改名放入暂存区</p>
<h3 id="322-提交类命令">3.2.2 提交类命令</h3>
<p><code>git commit -m </code>:提交暂存区到本地仓库区<br>
<code>git commit ... -m </code>:提交暂存区的指定文件本地仓库区<br>
<code>git commit -a </code>:提交工作区自上次commit之后的变化直接到本地仓库区<br>
<code>git commit -v </code>:提交时显示所有的diff信息<br>
<code>git commit --amend -m </code>:使用一次新的commit,替代上一次提交,如果代码没有变化,就改写上一次commit的提交信息<br>
<code>git commit --amend </code>:重做上一次commit,并包括指定文件的新变化<br>
<code>git commit --amend --only -m 'xxxxxxx'</code>:如果提交信息(commit message)写错了且这次提交(commit)还没有推(push), 可以通过此方法来修改提交信息(commit message)<br>
<code>git commit --amend --author "New Authorname <authoremail@mydomain.com>"</code>:提交(commit)里的用户名和邮箱不对</p>
<h3 id="323-查看日志">3.2.3 查看日志</h3>
<p><code>git status</code>:显示有变更的文件<br>
<code>git log</code>:查看历史的每次提交信息,但是如果回退版本了,那么对应的历史信息就没了,那就使用<code>git reflog</code><br>
<code>git reflog</code>:看到以前的每次执行动作<br>
<code>git log --stat</code>:显示commit历史,以及每次commit发生变更的文件<br>
<code>git log -S </code>:根据关键字搜索提交历史<br>
<code>git log HEAD --pretty=format:%s</code>:显示某个commit之后所有变动,每个commit占据一行<br>
<code>git log HEAD --grep feature </code>:显示某个commit之后所有变动,其<code>提交说明</code>必须符合搜索条件<br>
<code>git log --follow </code>:显示某个文件版本历史,包括文件改名<br>
<code>git whatchanged</code>:显示某个文件版本历史,包括文件改名<br>
<code>git log -p </code>:显示指定文件相关的每一次的diff<br>
<code>git log -5 --pretty --online </code>:显示过去5次提交<br>
<code>git log --before="1 days" </code>:之前一天的版本提交<br>
<code>git shortlog -sn </code>:显示所有提交过的用户,按提交次数序排序<br>
<code>git blame </code>:以列表方式查看指定文件的提交历史,显示指定文件是什么人在什么时候修改过</p>
<h3 id="324-显示提交时内容">3.2.4 显示提交时内容</h3>
<p><code>git show </code>:显示某次提交元数据和内容变化<br>
<code>git show --name-only </code>:显示某次提交发生变化的文件<br>
<code>git show :</code>:显示某次时某个文件的内容</p>
<h2 id="33-远端仓库类命令">3.3 远端仓库类命令</h2>
<h3 id="331-显示远端仓库">3.3.1 显示远端仓库</h3>
<p><code>git remote</code>:查看关联的远程仓库的名称<br>
<code>git remote -v</code>:显示所有远程仓库<br>
<code>git remote add url</code>:添加一个远程仓库<br>
<code>git remote show </code>:显示某个远程仓库信息<br>
<code>git remote add </code>:增加一个新的远程仓库并命名</p>
<h3 id="332-远端拉取">3.3.2 远端拉取</h3>
<p><code>git fetch </code>:下载远程仓库所有变动<br>
<code>git fetch --all</code>:拉取所有远端的最新代码<br>
<code>git fetch origin master</code>:拉取远程最新master分支代码<br>
<code>git pull</code>:拉取远程仓库所有分支更新并合并到本地分支<br>
<code>git pull origin master </code>:将远程master分支合并到当前本地分支<br>
<code>git pull </code>:获取远程仓库变化,并与本地代码合并<br>
<code>git pull origin master:master</code>:将远程<code>master</code>分支合并到当前本地<code>master</code>分支,<code>冒号</code>后面表示本地分支</p>
<h3 id="333-远端推送">3.3.3 远端推送</h3>
<p><code>git push </code>:上传本地指定分支到远程仓库<br>
<code>git push --force</code>:强行推当前分支到远程仓库,即使有冲突<br>
<code>git push --all </code>:推送所有分支到远程仓库<br>
<code>git push <remote> :<branch/tag-name></code>:删除远程分支或标签<br>
<code>git push --tags </code>:上传所有标签<br>
<code>git push origin -d <branchname></code>:删除远程branchname分支</p>
<h2 id="34--分支类命令">3.4分支类命令</h2>
<h3 id="341-查看分支">3.4.1 查看分支</h3>
<p><code>git branch</code>:查看所有分支,当前分支前面会有一个<code>*</code>表示<br>
<code>git branch -r </code>:列出所有远程分支<br>
<code>git branch -a </code>:列出所有本地分支和远程分支</p>
<h3 id="342-切换分支">3.4.2 切换分支</h3>
<p><code>git checkout -b </code>:创建并切换到新的分支<br>
<code>git checkout </code>:切换到指定分支,并更新工作区<br>
<code>git checkout - </code>:切换到上一个分支</p>
<h3 id="343-新建分支">3.4.3 新建分支</h3>
<p><code>git branch </code>:新建一个分支,但依然停留在当前分支<br>
<code>git branch --track </code>:新建一个分支,与远程指定分支建立追踪关系<br>
<code>git branch --set-upstream </code>:建立追踪关系,在现有分支与指定远程分支之间<br>
<code>git checkout -b </code>:创建并切换到新的分支<br>
<code>git branch -M</code>:重命名当前分支,尤其在本地分支名和远程仓库的分支名不一致时非常有用</p>
<h3 id="344-删除分支">3.4.4 删除分支</h3>
<p><code>git branch -d </code>:删除分支<br>
<code>git push origin --delete </code>:删除远程分支<br>
<code>git branch -dr </code>:删除远程分支</p>
<h3 id="345-合并分支">3.4.5 合并分支</h3>
<p><code>git merge </code>:用来合并指定分支到当前分支,假如要合并dev到master,使用此命令时需要先使用<code>checkout命令</code>切换到<code>master分支</code>,然后将 <code>dev分支</code>的修改合并到<code>master分支</code><br>
<code>git merge --no-ff origin/dev</code>:在当前分支上合并远程分支dev<br>
<code>git merge --abort</code>:终止本次merge,并回到merge前的状态<br>
<code>git rebase </code>:衍合指定分支到当前分支<br>
<code>git cherry-pick </code>:合并部分commit,不像merge是合并全部commit,选择一个commit合并到当前分支</p>
<h3 id="346-比较不同">3.4.6 比较不同</h3>
<p><code>git diff</code>:显示暂存区和工作区差异<br>
<code>git diff --cache </code>:显示暂存区和上一个文件的差异<br>
<code>git diff HEAD </code>:显示工作区和当前分支最新commit之间差异<br>
<code>git diff ... </code>:显示两次提交之间差异<br>
<code>git diff --shortstat "@{0 day ago}"</code>:显示今天写了多少行代码</p>
<h2 id="35-撤销操作">3.5 撤销操作</h2>
<p><code>Git</code>的撤销与回退,在日常工作中使用的比较频繁。比如我们想将某个修改后的文件撤销到上一个版本,或者想撤销某次多余的提交,都要用到git的撤销和回退操作。</p>
<p>代码在<code>Git</code>的每个工作区域都是用哪些命令撤销或者回退的呢,如下图所示:<br>
<img src="https://img-blog.csdnimg.cn/direct/7cdd218947ba47018c0b1f2491f3bff6.png"></p>
<h3 id="351-git-checkout">3.5.1 git checkout</h3>
<p>如果文件还在工作区,还没添加到暂存区,可以使用<code>git checkout</code>撤销<br>
<code>git checkout</code>:恢复暂存区指定文件到工作区<br>
<code>git checkout </code>:恢复某个commit指定文件到暂存区和工作区<br>
<code>git checkout . </code>:恢复暂存区所有文件到工作区<br>
<code>git checkout HEAD <file></code>:撤销指定的未提交文件的修改内容</p>
<h3 id="352-git-reset">3.5.2 git reset</h3>
<h4 id="3521-简介">3.5.2.1 简介</h4>
<p><code>git reset</code>的作用是修改<code>HEAD</code>的位置,即将<code>HEAD</code>指向的位置改变为之前存在的某个版本,为了更好地理解<code>git reset</code>,我们来回顾一下,<code>Git</code>的版本管理及<code>HEAD</code>的理解<br>
<code>Git</code>的所有提交,会连成一条时间轴线,这就是分支。如果当前分支是<code>master</code>,<code>HEAD</code>指针一般指向当前分支,如下:<br>
<img src="https://img-blog.csdnimg.cn/direct/62666a12dfb4489e9bca003574f3c396.png"><br>
假设执行<code>git reset</code>,回退到版本二之后,版本三不见了哦,如下:</p>
<p><img src="https://img-blog.csdnimg.cn/direct/07d46f1122a941a48f8857420e814a7f.png"><br>
使用模式<br>
<img src="https://img-blog.csdnimg.cn/direct/1272bb1a39f34c54a7b0147064c325bd.png"></p>
<h4 id="3522-命令">3.5.2.2 命令</h4>
<p><code>git reset </code>:重置暂存区指定文件,与上一次commit保持一致,但工作区不变<br>
<code>git reset </code>:重置当前分支指针为指定commit,同时重置暂存区,但工作区不变<br>
<code>git reset --hard </code>:重置暂存区与工作区,与上一次commit保持一致<br>
<code>git reset--hard HEAD</code>:撤销工作目录中所有未提交文件的修改内容,这个操作是不可逆的,慎用<br>
<code>git reset--hard HEAD^</code>:把当前的版本回退到上一个版本,如果退到上上个版本只需把<code>HEAD^ </code>改成 <code>HEAD^^</code> 以此类推<br>
<code>git reset--hard HEAD~100</code>:回退到前100个版本<br>
<code>git reset HEAD --file</code>:回退暂存区里的某个文件,回退到当前版本工作区状态,即可以取消已经使用<code>git add</code>命令暂存的文件<br>
<code>git reset --hard </code>:重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致<br>
<code>git reset --keep </code>:重置当前分支的HEAD为指定commit,但是保持暂存区和工作区不变</p>
<p><code>hard,mixed,soft</code>三个区别:</p>
<ul>
<li><code>git reset –-soft目标版本号</code>:可以把版本库上的提交回退到暂存区,修改记录保留</li>
<li><code>git reset –-mixed 目标版本号</code>:可以把版本库上的提交回退到工作区,修改记录保留</li>
<li><code>git reset –-hard</code>:可以把版本库上的提交彻底回退,修改的记录全部<code>revert</code></li>
</ul>
<h4 id="3523-回滚操作">3.5.2.3 回滚操作</h4>
<p>假如代码<code>git add</code>到暂存区,并未<code>commit</code>提交,可以这样回退,如下:</p>
<ul>
<li><code>git reset HEAD file</code>:取消暂存</li>
<li><code>git checkout file</code>:撤销修改</li>
</ul>
<p>假如代码已经<code>git commit</code>了,但是还没有<code>push</code>:</p>
<ul>
<li><code>git log</code>:获取到想要回退的<code>commit_id</code></li>
<li><code>git reset --hard commit_id</code>:想回到过去,回到过去的commit_id</li>
</ul>
<p>如果代码已经<code>push</code>到远程仓库了,也可以使用<code>reset</code>回滚</p>
<ul>
<li><code>git log</code></li>
<li><code>git reset --hard commit_id</code></li>
<li><code>git push origin HEAD --force</code></li>
</ul>
<h3 id="353-git-revert">3.5.3 git revert</h3>
<p>与<code>git reset</code>不同的是,<code>revert</code>复制了那个想要回退到的历史版本,将它加在当前分支的最前端。<br>
revert之前:<img src="https://img-blog.csdnimg.cn/direct/fee5fa43e0f74c39bec4a555ec7f4e03.png"><br>
revert 之后:<img src="https://img-blog.csdnimg.cn/direct/cb2696c34dc84403ab5001ef9dc75afd.png"><br>
当然,如果代码已经推送到远程的话,还可以考虑<code>revert</code>回滚</p>
<ul>
<li><code>git log</code>:得到你需要回退一次提交的<code>commit id</code></li>
<li><code>git revert -n <commit_id></code>:撤销指定的版本,撤销也会作为一次提交进行,新建一个commit,用来撤销指定commit,后者所有变化都被前者抵消,并且应用到当前分支</li>
</ul>
<h3 id="354-idea中撤销操作">3.5.4 Idea中撤销操作</h3>
<table>
<thead>
<tr>
<th></th>
<th>是否删除对代码的修改</th>
<th>是否删除Commit提交记录</th>
<th>是否会新增Commit记录</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>Undo Commit</code></td>
<td>不会</td>
<td>未Push会,已Push不会</td>
<td>不会</td>
</tr>
<tr>
<td><code>Revert Commit</code></td>
<td>会</td>
<td>不会</td>
<td>会</td>
</tr>
<tr>
<td><code>Drop Commit</code></td>
<td>会</td>
<td>未Push会,已Push不会</td>
<td>不会</td>
</tr>
</tbody>
</table>
<h4 id="3541-undo-commit">3.5.4.1 Undo Commit</h4>
<p>如果代码修改完了,已经<code>Commit</code>了,但是还未<code>push</code>,然后发现还有地方需要修改,但是又不想增加一个新的<code>Commit</code>记录。这时可以进行<code>Undo Commit</code>,修改后再重新<code>Commit</code><br>
如果已经进行了<code>Push</code>,线上的<code>Commit</code>记录还是会存在的,简单来说,就是撤销了<code>Commit</code>的这个动作。<br>
详细解释下:<br>
首先,对项目进行了代码修改,然后进行commit操作。<br>
<img src="https://img-blog.csdnimg.cn/direct/fc4e57f224c94ca1a4d2c96b04bcc945.png"><br>
确认Commit之后(未进行Push),这时候分支用户什么都不要选都是默认才能看到已提交未Push 的记录<br>
<img src="https://img-blog.csdnimg.cn/direct/f673fadc22d8492f8289ddcf57967ec1.png"><br>
进行Undo Commit操作<br>
<img src="https://img-blog.csdnimg.cn/direct/3006cd727e624b0f833030ddf44bc9ae.png"><br>
执行后和未Commit之前完全一样。<br>
<img src="https://img-blog.csdnimg.cn/direct/95d71eca8ed448f7a8d899efba30af66.png"></p>
<h4 id="3542-revert-commit">3.5.4.2 Revert Commit</h4>
<p>会新建一个 <code>Revert “xxx Commit”</code>的<code>Commit</code>记录,该记录进行的操作是将<code>xxx Commit</code>中对代码进行的修改全部撤销掉。<br>
首先,对项目进行了代码修改,然后进行<code>commit</code>操作。<br>
<img src="https://img-blog.csdnimg.cn/direct/9fe1fc34000640f6811251dfa607ae8a.png"><br>
Commit之后:<br>
<img src="https://img-blog.csdnimg.cn/direct/d3dfdf5f2e7444268b2f877c0dce3b77.png"><br>
进行Revert Commit<br>
<img src="https://img-blog.csdnimg.cn/direct/dfd6f990bb404214bac6542e50252b31.png"><br>
执行成功后:<br>
可以看到,新增了Commit 记录<code>Revert “测试Revert Commit”</code>,该记录中将<code>测试Revert Commit</code>中对代码进行的修改删除了。<br>
<img src="https://img-blog.csdnimg.cn/direct/e34d95fc908449769adca2cad07f4c0b.png"></p>
<h4 id="3543-drop-commit慎用">3.5.4.3 Drop Commit(慎用)</h4>
<p><code>未push</code>和<code>已push</code>区别:</p>
<ul>
<li><code>未push</code>的<code>Commit</code>记录,会删除<code>Commit</code>记录,同时<code>Commit</code>中对代码进行的修改也会全部被删除</li>
<li><code>已push</code>的Commit记录,区别在于线上的<code>Commit</code>记录不会被删除</li>
</ul>
<p>修改代码,然后进行Commit<br>
<img src="https://img-blog.csdnimg.cn/direct/bb7c6e7dcf9d4a7d87cf3779fd0a2729.png"><br>
<img src="https://img-blog.csdnimg.cn/direct/1c88a8248bd743b7900e458e2e5d659b.png"><br>
进行Drop Commit操作后,Commit 记录被删除,代码修改也被删除<br>
<img src="https://img-blog.csdnimg.cn/direct/c31ad20b804e4e3bba58d68b3b61790b.png"><br>
已push的Commit记录<br>
<img src="https://img-blog.csdnimg.cn/direct/bd5b4f530db34363986d6e4f5f77de2e.png"></p>
<h4 id="3544-不能undorevertdrop的撤销">3.5.4.4 不能Undo,Revert,Drop的撤销</h4>
<p>如果在idea中是因为merge后操作,这时代码在 <code>commit</code> 没有 <code>push</code>,但是还不能使用<code>Undo,Revert,Drop</code>,可以使用强制撤销操作<br>
在<br>
<img src="https://img-blog.csdnimg.cn/direct/392067e258184d50a1417ed75c321b04.png"><br>
回退上个版本,使用 <code>HEAD^</code>or <code>HEAD~1</code><br>
以此类推,<code>HEAD~2</code>或<code>HEAD^^</code> 表示撤销最后两次提交;<code>HEAD~3</code>或<code>HEAD^^^</code> 表示撤销最后三次提交;</p>
<p><code>注意</code>:<code>Reset Type</code></p>
<ul>
<li><code>Mixed</code>:是默认方式。只保留源码,会回退 <code>commit 和 index</code> 的信息;(常用)</li>
<li><code>Soft</code>:回退到某个版本。只回退了 <code>commit</code> 的信息,之前写的代码还是保留的,不会恢复到 index file 一级。如果还要提交,直接 commit;</li>
<li><code>Hard</code>:彻底回退,本地源码也会变成上一个版本内容,不保留之前 <code>commit</code> 的代码。(一般不使用)</li>
</ul>
<h2 id="36-高级命令">3.6 高级命令</h2>
<h3 id="361-标签相关">3.6.1 标签相关</h3>
<p>打<code>tag</code>就是对发布的版本标注一个版本号,如果版本发布有问题,就把该版本拉取出来,修复bug,再合回去</p>
<ul>
<li><code>git tag</code>:列出所有本地标签</li>
<li><code>git show </code>:查看tag</li>
<li><code>git tag <tagname></code>:基于最新提交创建标签</li>
<li><code>git tag </code>:新建一个tag在指定commit</li>
<li><code>git tag -d <tagname></code>:删除指定标签</li>
<li><code>git show </code>:查看标签信息</li>
<li><code>git push origin :refs/tags/</code>:删除远程标签</li>
<li><code>git push </code>:提交指定tag</li>
<li><code>git push --tags</code>:提交所有tag</li>
<li><code>git checkout -b </code>:新建一个分支指向某个tag</li>
</ul>
<h3 id="362-git-rebase">3.6.2 git rebase</h3>
<p><code>rebase</code>又称为衍合,是合并的另外一种选择。</p>
<p>假设有两个分支master和test</p>
<pre><code class="language-txt"> D---E test
/
A---B---C---F--- master
</code></pre>
<p>执行 <code>git merge test</code>得到的结果</p>
<pre><code class="language-txt"> D--------E
/ \
A---B---C---F----G--- test, master
</code></pre>
<p>执行<code>git rebase test</code>,得到的结果</p>
<pre><code class="language-txt">A---B---D---E---C‘---F‘--- test, master
</code></pre>
<p><code>rebase</code>好处是: 获得更优雅的提交树,可以线性的看到每一次提交,并且没有增加提交节点。所以很多时候,看到有些伙伴都是这个命令拉代码:<code>git pull --rebase</code>,就是因为想更优雅</p>
<h3 id="363-git-stash">3.6.3 git stash</h3>
<p>假如当前开发分支的工作区有开发的东西,但是另一个分支也有需要急需开发的代码,如果直接切换到新的分支,那么当前分区的工作就白费了,如果先把代码提交啊,回头再接着写。但是这样的提交是不合理的,也没有任何实际意义的,因为代码并没有完成,提交的是不完整的功能<br>
<code>git</code>给提供了<code>stash</code>功能,可以把当前工作区的内容进行<code>快照</code>,等待以后恢复使用<br>
<code>stash</code>命令可用于临时保存和恢复修改</p>
<ul>
<li><code>git stash</code>:把当前的工作隐藏起来 等以后恢复现场后继续工作</li>
<li><code>git stash save "修改的信息"</code>:保存工作区</li>
<li><code>git stash list</code>:显示保存的工作进度列表</li>
<li><code>git stash pop stash@{num}</code>:恢复工作进度到工作区</li>
<li><code>git stash show</code>:显示做了哪些改动</li>
<li><code>git stash drop stash@{num}</code>:删除一条保存的工作进度,删除最近的一次stash</li>
<li><code>git stash clear</code>:删除所有缓存的stash</li>
<li><code>git stash apply</code>:恢复到工作区,但是恢复后,<code>stash</code>内容并不删除,需要用<code>git stash drop</code>来删除,用<code>git stash pop</code>,恢复的同时把<code>stash</code>内容也删了</li>
</ul>
<h3 id="364-其他命令">3.6.4 其他命令</h3>
<p><code>git archive</code>:生成一个可供发布的压缩包</p>
<h2 id="37-git添加新项目">3.7 Git添加新项目</h2>
<h3 id="371-基本设置">3.7.1 基本设置</h3>
<p>需要设置用户名和邮箱 如果是第一次使用 <code>Git</code>,需要设置用户名和邮箱:</p>
<pre><code class="language-sh">git config --global user.name "你的用户名"
git config --global user.email "你的邮箱"
</code></pre>
<h3 id="372-初始化-git-仓库">3.7.2 初始化 Git 仓库</h3>
<p>打开项目的本地目录,右键选择 <code>Git Bash Here</code> 或在终端中导航到该目录。<br>
运行以下命令初始化一个 Git 仓库:<code>git init</code>,这个命令会在项目根目录创建一个 <code>.git</code> 文件夹,表示这是一个 <code>Git 仓库</code>。</p>
<h3 id="373-添加文件到-git-暂存区">3.7.3 添加文件到 Git 暂存区</h3>
<p>添加所有文件到暂存区:<code>git add .</code><br>
<code>.</code>:表示将<code>当前目录</code>及其<code>子目录</code>的所有文件添加到暂存区。<br>
如果只想添加特定文件,可以用 <code>git add 文件名</code></p>
<h3 id="374-提交到本地仓库">3.7.4 提交到本地仓库</h3>
<p>提交暂存区的文件到本地仓库,并添加提交说明:</p>
<pre><code class="language-sh">git commit -m "初始化项目"
</code></pre>
<p><code>-m</code> 后面的内容是对提交的简短描述,便于团队成员理解此次提交的目的。</p>
<h3 id="375-配置远程仓库">3.7.5 配置远程仓库</h3>
<ul>
<li>如果还没有创建远程仓库:<br>
登录到 Git 服务平台(如 GitHub、GitLab、Gitee 等)。<br>
创建一个新仓库,记下仓库的远程地址(如 https://github.com/username/repository.git 或 git@github.com:username/repository.git)。</li>
<li>关联本地仓库到远程仓库:<code>git remote add origin <实际的远程仓库 URL></code><br>
<code>origin</code> 是远程仓库的<code>默认名称</code>,也可以修改为其他名称。</li>
</ul>
<h3 id="376-推送代码到远程仓库">3.7.6 推送代码到远程仓库</h3>
<p>如果远程仓库是空的,直接推送代码:</p>
<pre><code class="language-sh"># 将本地分支重命名为 main(与远程仓库保持一致)
git branch -M main
# 将代码推送到远程仓库的 main 分支,并设置默认上游分支
git push -u origin main
</code></pre>
<p>如果远程仓库已有内容(非空仓库),可能需要先拉取远程代码:</p>
<pre><code class="language-sh">git pull origin main --allow-unrelated-histories
git push -u origin main
</code></pre><br><br>
来源:https://www.cnblogs.com/jingzh/p/15119949.html
頁:
[1]