Files
My-Blog/public/about-git/index.html
2025-11-21 19:20:24 +08:00

715 lines
46 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="en">
<head>
<title>Dich&#x27;s Blog</title>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="robots" content="noodp"/>
<!-- 字体预加载 - 减少布局偏移 CLS -->
<link rel="preload" href="https://blog.dich.bid/fonts/hack-regular.woff2?sha=3114f1256" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="https://blog.dich.bid/fonts/hack-bold.woff2?sha=3114f1256" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="https://blog.dich.bid/fonts/hack-italic.woff2?sha=3114f1256" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="https://blog.dich.bid/fonts/hack-bolditalic.woff2?sha=3114f1256" as="font" type="font/woff2" crossorigin>
<link rel="stylesheet" href="https://blog.dich.bid/style.css">
<link rel="stylesheet" href="https://blog.dich.bid/color/blue.css">
<link rel="stylesheet" href="https://blog.dich.bid/font-hack-subset.css">
<meta name="description" content="">
<meta property="og:description" content="">
<meta property="og:title" content="Dich's Blog">
<meta property="og:type" content="article">
<meta property="og:url" content="https://blog.dich.bid/about-git/">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:description" content="">
<meta name="twitter:title" content="Dich's Blog">
<meta property="twitter:domain" content="blog.dich.bid">
<meta property="twitter:url" content="https://blog.dich.bid/about-git/">
<link rel="alternate" type="application/atom+xml" title="Dich&#x27;s Blog Atom Feed" href="https://blog.dich.bid/atom.xml" />
<link rel="shortcut icon" type="image/webp" href="/dich.webp">
<!-- ✅ Added center alignment styles -->
<style>
.footer {
text-align: center;
padding: 1rem 0;
}
.footer__inner {
display: flex;
justify-content: center;
flex-direction: column;
align-items: center;
}
.copyright {
text-align: center;
}
</style>
</head>
<body class="">
<div class="container">
<header class="header">
<div class="header__inner">
<div class="header__logo">
<a href="https://blog.dich.bid" style="text-decoration: none;">
<div class="logo">
Dich&#x27;s Blog
</div>
</a>
</div>
</div>
<nav class="menu">
<ul class="menu__inner">
<li><a href="https://blog.dich.bid">Blog</a></li>
<li><a href="https://blog.dich.bid/archive">Archive</a></li>
<li><a href="https://blog.dich.bid/weekly">Weekly</a></li>
<li><a href="https://blog.dich.bid/tags">Tags</a></li>
<li><a href="https://blog.dich.bid/search">Search</a></li>
<li><a href="https://blog.dich.bid/links">Links</a></li>
<li><a href="https://blog.dich.bid/atom.xml">Rss</a></li>
<li class="active"><a href="https://blog.dich.bid/about">About me</a></li>
<li><a href="https://github.com/Dichgrem" target="_blank" rel="noopener noreferrer">My github</a></li>
<li><a href="https://github.com/getzola/zola" target="_blank" rel="noopener noreferrer">Zola frame</a></li>
</ul>
</nav>
</header>
<div class="content">
<div class="post" data-pagefind-body>
<h1 class="post-title"><a href="https://blog.dich.bid/about-git/">乱七八糟:Git使用简明手册</a></h1>
<div class="post-meta-inline">
<span class="post-date">
2023-12-15
</span>
</div>
<span class="post-tags-inline">
:: tags:&nbsp;
<a class="post-tag" href="https://blog.dich.bid/tags/luan-qi-ba-zao/">#乱七八糟</a></span>
<div class="post-content">
<p>前言 Git作为现代软件开发中不可或缺的版本控制工具常常让初学者感到困惑。本文旨在介绍 Git 的全流程安装和基本使用,希望能够帮助新手更轻松地理解和掌握 Git 的基本概念和操作。</p>
<span id="continue-reading"></span><h2 id="an-zhuang-git">安装git</h2>
<ul>
<li>
<p>Windows<a href="https://git-scm.com/download/">Git-download</a></p>
</li>
<li>
<p>Archlinux<code>sudo pacman -S git</code></p>
</li>
</ul>
<h2 id="yuan-li">原理</h2>
<p>一个Git仓库的目录里面包括<code>工作目录</code>(即我们要追踪的代码)以及<code>.git</code>目录Git 在这里存储自己的数据。Git 维护了三棵“树”:第一个是你的 <code>工作目录</code>,它持有实际文件;第二个是 <code>暂存区Index</code>,它像个缓存区域,临时保存你的改动;最后是 <code>HEAD</code>,它指向你最后一次提交的结果。</p>
<p><img src="http://marklodato.github.io/visual-git-guide/basic-usage.svg.png" alt="git-tree" /></p>
<h2 id="chuang-jian-xin-cang-ku">创建新仓库</h2>
<p>首先我们需要得到一个Git仓库一般有两种方法</p>
<ul>
<li>在本地初始化之后连接到远程;</li>
<li>在远程创建后”下载“到本地。</li>
</ul>
<p><strong>方法一</strong>
创建新文件夹,在你的项目目录中运行以下命令:</p>
<pre data-lang="bash" style="background-color:#151515;color:#e8e8d3;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffb964;">git</span><span> init</span><span style="color:#ffb964;"> --initial-branch</span><span>=main
</span></code></pre>
<p>这里设置默认仓库主分支名称为 main,避免因为 main/master 名称不同导致的推送问题。</p>
<blockquote>
<p>Git目前默认的主分支为 master和 github 默认分支 main 不同,这使得默认配置下 git 往往连接失败。除了创建的时候设定外还可以通过以下方法改变默认分支。</p>
</blockquote>
<pre data-lang="bash" style="background-color:#151515;color:#e8e8d3;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffb964;">git</span><span> config</span><span style="color:#ffb964;"> --global</span><span> init.defaultBranch main //将默认分支修改成main
</span></code></pre>
<p><strong>方法二</strong></p>
<p>克隆远端服务器上的仓库:</p>
<ul>
<li>HTTPS方法<code>git clone https://github.com/Dichgrem/script.git</code></li>
<li>或者使用SSH方法<code>git clone git@github.com:Dichgrem/script.git</code></li>
</ul>
<blockquote>
<p>建议使用SSH方法如果你使用HTTPS方法则提交代码时需要手动输入用户名/密码使用SSH方法则只需要在<code>~/.ssh/config</code>中配置即可。</p>
</blockquote>
<h2 id="pei-zhi">配置</h2>
<p>Git的设置文件为.gitconfig它可以在用户主目录下全局配置也可以在项目目录下项目配置</p>
<ul>
<li>显示当前的Git配置</li>
</ul>
<pre data-lang="bash" style="background-color:#151515;color:#e8e8d3;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffb964;">git</span><span> config</span><span style="color:#ffb964;"> --list
</span></code></pre>
<ul>
<li>编辑Git配置文件</li>
</ul>
<pre data-lang="bash" style="background-color:#151515;color:#e8e8d3;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffb964;">git</span><span> config</span><span style="color:#ffb964;"> -e </span><span style="color:#8fbfdc;">[</span><span>--global</span><span style="color:#8fbfdc;">]
</span></code></pre>
<ul>
<li>设置提交代码时的用户信息</li>
</ul>
<pre data-lang="bash" style="background-color:#151515;color:#e8e8d3;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffb964;">git</span><span> config </span><span style="color:#8fbfdc;">[</span><span>--global</span><span style="color:#8fbfdc;">]</span><span> user.name </span><span style="color:#556633;">&quot;</span><span style="color:#99ad6a;">[name]</span><span style="color:#556633;">&quot;
</span><span style="color:#ffb964;">git</span><span> config </span><span style="color:#8fbfdc;">[</span><span>--global</span><span style="color:#8fbfdc;">]</span><span> user.email </span><span style="color:#556633;">&quot;</span><span style="color:#99ad6a;">[email address]</span><span style="color:#556633;">&quot;
</span></code></pre>
<ul>
<li>设置大小写敏感windows不区分大小写的解决办法</li>
</ul>
<pre data-lang="bash" style="background-color:#151515;color:#e8e8d3;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffb964;">git</span><span> config core.ignorecase false
</span></code></pre>
<ul>
<li>配置git默认使用的编辑器</li>
</ul>
<pre data-lang="bash" style="background-color:#151515;color:#e8e8d3;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffb964;">git</span><span> config</span><span style="color:#ffb964;"> --global</span><span> core.editor </span><span style="color:#556633;">&quot;</span><span style="color:#99ad6a;">nvim</span><span style="color:#556633;">&quot;
</span></code></pre>
<h2 id="lian-jie-yuan-cheng-cang-ku">连接远程仓库</h2>
<p>连接到远程仓库并推送需要证明你有权写入仓库。早期Github可以使用密码认证现在则使用密钥认证。</p>
<ul>
<li>生成密钥:</li>
</ul>
<pre data-lang="bash" style="background-color:#151515;color:#e8e8d3;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffb964;">ssh-keygen -t</span><span> rsa</span><span style="color:#ffb964;"> -b</span><span> 4096</span><span style="color:#ffb964;"> -C </span><span style="color:#556633;">&quot;</span><span style="color:#99ad6a;">your_email@example.com</span><span style="color:#556633;">&quot;
</span></code></pre>
<ul>
<li>
<p>生成的文件位于<code>~/.ssh/config</code>路径下,带.pub后缀的文件为公钥不带.pub后缀的为私钥使用<code>cat ~/.ssh/id_rsa.pub</code>将公钥添加到github/gitee的设置-SSH中。</p>
</li>
<li>
<p>随后使用 <code>ssh-add</code> 命令将生成的密钥添加到 SSH 代理中。</p>
</li>
</ul>
<pre data-lang="bash" style="background-color:#151515;color:#e8e8d3;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffb964;">ssh-add ~</span><span>/.ssh/github_key
</span><span style="color:#ffb964;">ssh-add ~</span><span>/.ssh/gitee_key
</span></code></pre>
<ul>
<li><code>~/.ssh/config</code> 文件中配置不同的主机别名以及相应的密钥文件。编辑该文件并添加内容,例如:</li>
</ul>
<pre data-lang="bash" style="background-color:#151515;color:#e8e8d3;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#888888;"># GitHub repository 1
</span><span>
</span><span style="color:#ffb964;">Host</span><span> github1
</span><span>
</span><span> </span><span style="color:#ffb964;">HostName</span><span> github.com
</span><span>
</span><span> </span><span style="color:#ffb964;">User</span><span> git
</span><span>
</span><span> </span><span style="color:#ffb964;">IdentityFile ~</span><span>/.ssh/github_key
</span><span>
</span><span style="color:#888888;"># GitHub repository 2
</span><span>
</span><span style="color:#ffb964;">Host</span><span> github2
</span><span>
</span><span> </span><span style="color:#ffb964;">HostName</span><span> gitee.com
</span><span>
</span><span> </span><span style="color:#ffb964;">User</span><span> git
</span><span>
</span><span> </span><span style="color:#ffb964;">IdentityFile ~</span><span>/.ssh/gitee_key
</span></code></pre>
<ul>
<li>连接到github</li>
</ul>
<pre data-lang="bash" style="background-color:#151515;color:#e8e8d3;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffb964;">ssh -T</span><span> git@github.com
</span></code></pre>
<ul>
<li>添加远程仓库:</li>
</ul>
<pre data-lang="bash" style="background-color:#151515;color:#e8e8d3;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffb964;">git</span><span> remote add origin &lt;remote_repository_url&gt;
</span><span>
</span><span style="color:#888888;"># 例如git remote add origin git@github.com:Dichgrem/dichos.git
</span></code></pre>
<blockquote>
<p>如果你运行<code>git remote -v</code>发现URL为HTTP格式则可以用下面的命令改为Git格式</p>
</blockquote>
<pre data-lang="bash" style="background-color:#151515;color:#e8e8d3;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#888888;"># 例如git remote set-url origin git@github.com:Dichgrem/dichos.git
</span></code></pre>
<h2 id="chuang-jian-fen-zhi">创建分支</h2>
<pre data-lang="bash" style="background-color:#151515;color:#e8e8d3;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffb964;">git</span><span> branch main
</span></code></pre>
<p>这将创建一个名为 main 的分支。</p>
<ul>
<li>删除分支</li>
</ul>
<pre data-lang="bash" style="background-color:#151515;color:#e8e8d3;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffb964;">git</span><span> branch</span><span style="color:#ffb964;"> -d</span><span> master
</span></code></pre>
<ul>
<li>使用大写强制删除</li>
</ul>
<pre data-lang="bash" style="background-color:#151515;color:#e8e8d3;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffb964;">git</span><span> branch</span><span style="color:#ffb964;"> -D</span><span> master
</span></code></pre>
<h2 id="tian-jia-he-ti-jiao">添加和提交</h2>
<p>你可以提出更改(把它们添加到暂存区),使用如下命令:</p>
<pre data-lang="bash" style="background-color:#151515;color:#e8e8d3;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffb964;">git</span><span> add &lt;filename&gt;
</span><span style="color:#ffb964;">git</span><span> add *
</span></code></pre>
<p>这是 git 基本工作流程的第一步;使用如下命令以实际提交改动:</p>
<pre data-lang="bash" style="background-color:#151515;color:#e8e8d3;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffb964;">git</span><span> commit</span><span style="color:#ffb964;"> -m </span><span style="color:#556633;">&quot;</span><span style="color:#99ad6a;">代码提交信息</span><span style="color:#556633;">&quot;
</span><span style="color:#888888;"># 例如git commit -m &quot;Initial commit&quot;
</span></code></pre>
<p>现在,你的改动已经提交到了 <strong>HEAD</strong>,但是还没到你的远端仓库。</p>
<ul>
<li>添加指定文件到暂存区</li>
</ul>
<pre data-lang="bash" style="background-color:#151515;color:#e8e8d3;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffb964;">git</span><span> add </span><span style="color:#8fbfdc;">[</span><span>file1</span><span style="color:#8fbfdc;">] [</span><span>file2</span><span style="color:#8fbfdc;">]</span><span> ...
</span></code></pre>
<ul>
<li>添加指定目录到暂存区,包括子目录</li>
</ul>
<pre data-lang="bash" style="background-color:#151515;color:#e8e8d3;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffb964;">git</span><span> add </span><span style="color:#8fbfdc;">[</span><span>dir</span><span style="color:#8fbfdc;">]
</span></code></pre>
<ul>
<li>添加当前目录的所有文件到暂存区</li>
</ul>
<pre data-lang="bash" style="background-color:#151515;color:#e8e8d3;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffb964;">git</span><span> add .
</span></code></pre>
<p>添加每个变化前,都会要求确认</p>
<ul>
<li>对于同一个文件的多处变化,可以实现分次提交</li>
</ul>
<pre data-lang="bash" style="background-color:#151515;color:#e8e8d3;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffb964;">git</span><span> add</span><span style="color:#ffb964;"> -p
</span></code></pre>
<ul>
<li>删除工作区文件,并且将这次删除放入暂存区</li>
</ul>
<pre data-lang="bash" style="background-color:#151515;color:#e8e8d3;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffb964;">git</span><span> rm </span><span style="color:#8fbfdc;">[</span><span>file1</span><span style="color:#8fbfdc;">] [</span><span>file2</span><span style="color:#8fbfdc;">]</span><span> ...
</span></code></pre>
<ul>
<li>停止追踪指定文件,但该文件会保留在工作区</li>
</ul>
<pre data-lang="bash" style="background-color:#151515;color:#e8e8d3;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffb964;">git</span><span> rm</span><span style="color:#ffb964;"> --cached </span><span style="color:#8fbfdc;">[</span><span>file</span><span style="color:#8fbfdc;">]
</span></code></pre>
<ul>
<li>改名文件,并且将这个改名放入暂存区</li>
</ul>
<pre data-lang="bash" style="background-color:#151515;color:#e8e8d3;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffb964;">git</span><span> mv </span><span style="color:#8fbfdc;">[</span><span>file-original</span><span style="color:#8fbfdc;">] [</span><span>file-renamed</span><span style="color:#8fbfdc;">]
</span></code></pre>
<h2 id="tui-song-gai-dong">推送改动</h2>
<p>你的改动现在已经在本地仓库的 <strong>HEAD</strong> 中了。执行如下命令以将这些改动提交到远端仓库:</p>
<pre data-lang="bash" style="background-color:#151515;color:#e8e8d3;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffb964;">git</span><span> push origin main
</span></code></pre>
<p>可以把 <strong>main</strong> 换成你想要推送的任何分支,如<strong>master</strong>或者<strong>test</strong></p>
<p>如果你的远程仓库是最新的,可以使用以下命令更新本地仓库:</p>
<pre data-lang="bash" style="background-color:#151515;color:#e8e8d3;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffb964;">git</span><span> pull
</span></code></pre>
<blockquote>
<p>Verified</p>
</blockquote>
<p>在 GitHub 的 commit 历史中看到的 “Verified” 标记,表示该提交是经过 签名验证signed commit 的,也就是 GitHub 能确认这个 commit 的确是由声明的提交者签名并发布的。可以通过GPG或者SSH配置</p>
<ul>
<li>GPG方式</li>
</ul>
<pre data-lang="bash" style="background-color:#151515;color:#e8e8d3;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffb964;">sudo</span><span> pacman</span><span style="color:#ffb964;"> -S</span><span> gnupg //安装 GPG
</span><span style="color:#ffb964;">gpg --full-generate-key</span><span> //生成 GPG 密钥
</span><span style="color:#ffb964;">gpg --list-secret-keys --keyid-format</span><span>=long //查看你生成的密钥 ID
</span><span style="color:#ffb964;">git</span><span> config</span><span style="color:#ffb964;"> --global</span><span> user.signingkey ABCDEF1234567890 //让 Git 使用该密钥签名
</span><span style="color:#ffb964;">git</span><span> config</span><span style="color:#ffb964;"> --global</span><span> commit.gpgsign true //启用自动签名所有提交
</span><span style="color:#ffb964;">gpg --armor --export</span><span> ABCDEF1234567890 //导出公钥并添加到 GitHub
</span></code></pre>
<p>然后前往<code>GitHub → Settings → SSH and GPG keys → New GPG key</code>粘贴并保存。</p>
<ul>
<li>SSH方式</li>
</ul>
<p>可以用你平时登录 GitHub 的同一个 SSH 密钥:</p>
<pre data-lang="bash" style="background-color:#151515;color:#e8e8d3;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffb964;">git</span><span> config</span><span style="color:#ffb964;"> --global</span><span> gpg.format ssh //让 Git 使用 SSH 格式签名
</span><span style="color:#ffb964;">git</span><span> config</span><span style="color:#ffb964;"> --global</span><span> user.signingkey </span><span style="color:#ffb964;">~</span><span>/.ssh/Github.pub //指定使用的 SSH 公钥
</span><span style="color:#ffb964;">git</span><span> config</span><span style="color:#ffb964;"> --global</span><span> commit.gpgsign true //表示自动签名所有提交
</span></code></pre>
<p>然后前往<code>Settings → SSH and GPG keys → New SSH key → Signing key</code>粘贴并保存。</p>
<ul>
<li>本地查看</li>
</ul>
<p>首先创建这个文件:</p>
<pre data-lang="bash" style="background-color:#151515;color:#e8e8d3;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffb964;">mkdir -p ~</span><span>/.ssh
</span><span style="color:#ffb964;">nano ~</span><span>/.ssh/allowed_signers
</span></code></pre>
<p>写入你的 <code>test@mail.com ssh-ed25519 AAAABBBBBBBBBBBBBBBBxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</code>并保存。
随后配置Git信任该文件</p>
<pre data-lang="bash" style="background-color:#151515;color:#e8e8d3;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffb964;">git</span><span> config</span><span style="color:#ffb964;"> --global</span><span> gpg.ssh.allowedSignersFile </span><span style="color:#ffb964;">~</span><span>/.ssh/allowed_signers
</span></code></pre>
<p>随后使用<code>git log --show-signature</code>即可查看本地log中的</p>
<pre data-lang="bash" style="background-color:#151515;color:#e8e8d3;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffb964;">Good </span><span style="color:#556633;">&quot;</span><span style="color:#99ad6a;">git</span><span style="color:#556633;">&quot;</span><span> signature for test@mail.com with ED25519 key SHA256:ssh-ed25519 AAAABBBBBBBBBBBBBBBBBBBBB
</span></code></pre>
<h2 id="he-bing-fen-zhi">合并分支</h2>
<p>分支是用来将特性开发绝缘开来的。比如你在本地的test分支新增了一个功能想要合并到主分支中。</p>
<p>创建一个叫做“test”的分支并切换过去</p>
<pre data-lang="bash" style="background-color:#151515;color:#e8e8d3;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffb964;">git</span><span> checkout</span><span style="color:#ffb964;"> -b</span><span> test
</span></code></pre>
<p>新增某些功能后切换回主分支:</p>
<pre data-lang="bash" style="background-color:#151515;color:#e8e8d3;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffb964;">git</span><span> checkout master
</span></code></pre>
<p>在主分支上执行合并操作,将 test 分支的改动合并到主分支:</p>
<pre data-lang="bash" style="background-color:#151515;color:#e8e8d3;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffb964;">git</span><span> merge test
</span></code></pre>
<p>推送完成后可以把新建的分支删掉:</p>
<pre data-lang="bash" style="background-color:#151515;color:#e8e8d3;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffb964;">git</span><span> branch</span><span style="color:#ffb964;"> -d</span><span> test
</span></code></pre>
<h3 id="fen-zhi-chang-yong-cao-zuo">分支常用操作</h3>
<pre data-lang="bash" style="background-color:#151515;color:#e8e8d3;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffb964;">-</span><span> 列出所有本地分支
</span><span style="color:#ffb964;">git</span><span> branch
</span><span>
</span><span style="color:#ffb964;">-</span><span> 列出所有远程分支
</span><span style="color:#ffb964;">git</span><span> branch</span><span style="color:#ffb964;"> -r
</span><span>
</span><span style="color:#ffb964;">-</span><span> 列出所有本地分支和远程分支
</span><span style="color:#ffb964;">git</span><span> branch</span><span style="color:#ffb964;"> -a
</span><span>
</span><span style="color:#ffb964;">-</span><span> 列出所有本地分支,并展示没有分支最后一次提交的信息
</span><span style="color:#ffb964;">git</span><span> branch</span><span style="color:#ffb964;"> -v
</span><span>
</span><span style="color:#ffb964;">-</span><span> 列出所有本地分支,并展示没有分支最后一次提交的信息和远程分支的追踪情况
</span><span style="color:#ffb964;">git</span><span> branch</span><span style="color:#ffb964;"> -vv
</span><span>
</span><span style="color:#ffb964;">-</span><span> 列出所有已经合并到当前分支的分支
</span><span style="color:#ffb964;">git</span><span> branch</span><span style="color:#ffb964;"> --merged
</span><span>
</span><span style="color:#ffb964;">-</span><span> 列出所有还没有合并到当前分支的分支
</span><span style="color:#ffb964;">git</span><span> branch</span><span style="color:#ffb964;"> --no-merged
</span><span>
</span><span style="color:#ffb964;">-</span><span> 新建一个分支,但依然停留在当前分支
</span><span style="color:#ffb964;">git</span><span> branch </span><span style="color:#8fbfdc;">[</span><span>branch-name</span><span style="color:#8fbfdc;">]
</span><span>
</span><span style="color:#ffb964;">-</span><span> 新建一个分支,并切换到该分支
</span><span style="color:#ffb964;">git</span><span> checkout</span><span style="color:#ffb964;"> -b </span><span style="color:#8fbfdc;">[</span><span>branch</span><span style="color:#8fbfdc;">]
</span><span>
</span><span style="color:#ffb964;">-</span><span> 新建一个与远程分支同名的分支,并切换到该分支
</span><span style="color:#ffb964;">git</span><span> checkout</span><span style="color:#ffb964;"> --track </span><span style="color:#8fbfdc;">[</span><span>branch-name</span><span style="color:#8fbfdc;">]
</span><span>
</span><span style="color:#ffb964;">-</span><span> 新建一个分支指向指定commit
</span><span style="color:#ffb964;">git</span><span> branch </span><span style="color:#8fbfdc;">[</span><span>branch</span><span style="color:#8fbfdc;">] [</span><span>commit</span><span style="color:#8fbfdc;">]
</span><span>
</span><span style="color:#ffb964;">-</span><span> 新建一个分支,与指定的远程分支建立追踪关系
</span><span style="color:#ffb964;">git</span><span> branch</span><span style="color:#ffb964;"> --track </span><span style="color:#8fbfdc;">[</span><span>branch</span><span style="color:#8fbfdc;">] [</span><span>remote-branch</span><span style="color:#8fbfdc;">]
</span><span>
</span><span style="color:#ffb964;">-</span><span> 切换到指定分支,并更新工作区
</span><span style="color:#ffb964;">git</span><span> checkout </span><span style="color:#8fbfdc;">[</span><span>branch-name</span><span style="color:#8fbfdc;">]
</span><span>
</span><span style="color:#ffb964;">-</span><span> 切换到上一个分支
</span><span style="color:#ffb964;">git</span><span> checkout -
</span><span>
</span><span style="color:#ffb964;">-</span><span> 建立追踪关系,在现有分支与指定的远程分支之间
</span><span style="color:#ffb964;">git</span><span> branch</span><span style="color:#ffb964;"> --set-upstream-to</span><span>=</span><span style="color:#8fbfdc;">[</span><span>remote-branch</span><span style="color:#8fbfdc;">]
</span><span style="color:#ffb964;">git</span><span> branch</span><span style="color:#ffb964;"> --set-upstream </span><span style="color:#8fbfdc;">[</span><span>branch</span><span style="color:#8fbfdc;">] [</span><span>remote-branch</span><span style="color:#8fbfdc;">]</span><span> - 已被弃用
</span><span>
</span><span style="color:#ffb964;">-</span><span> 合并指定分支到当前分支
</span><span style="color:#ffb964;">git</span><span> merge </span><span style="color:#8fbfdc;">[</span><span>branch</span><span style="color:#8fbfdc;">]
</span><span>
</span><span style="color:#ffb964;">-</span><span> 中断此次合并(你可能不想处理冲突)
</span><span style="color:#ffb964;">git</span><span> merge</span><span style="color:#ffb964;"> --abort
</span><span>
</span><span style="color:#ffb964;">-</span><span> 选择一个commit合并进当前分支
</span><span style="color:#ffb964;">git</span><span> cherry-pick </span><span style="color:#8fbfdc;">[</span><span>commit</span><span style="color:#8fbfdc;">]
</span><span>
</span><span style="color:#ffb964;">-</span><span> 删除分支
</span><span style="color:#ffb964;">git</span><span> branch</span><span style="color:#ffb964;"> -d </span><span style="color:#8fbfdc;">[</span><span>branch-name</span><span style="color:#8fbfdc;">]
</span><span>
</span><span style="color:#888888;">#新增远程分支 远程分支需先在本地创建,再进行推送
</span><span style="color:#ffb964;">git</span><span> push origin </span><span style="color:#8fbfdc;">[</span><span>branch-name</span><span style="color:#8fbfdc;">]
</span><span>
</span><span style="color:#ffb964;">-</span><span> 删除远程分支
</span><span style="color:#ffb964;">git</span><span> push origin</span><span style="color:#ffb964;"> --delete </span><span style="color:#8fbfdc;">[</span><span>branch-name</span><span style="color:#8fbfdc;">]
</span><span style="color:#ffb964;">git</span><span> branch</span><span style="color:#ffb964;"> -dr </span><span style="color:#8fbfdc;">[</span><span>remote/branch</span><span style="color:#8fbfdc;">]
</span></code></pre>
<h2 id="biao-qian">标签</h2>
<p>Git 的 tag 功能主要用于<code>给仓库历史中的某个特定提交打上“标签”</code>,通常用于标记版本发布点(例如 v1.0、v2.0 等),以<code>便于后续的版本定位、回溯和发布管理</code></p>
<h3 id="biao-qian-lei-xing">标签类型</h3>
<p>Git 提供两种类型的标签:</p>
<ul>
<li>
<p>附注标签Annotated Tag会创建成一个完整的 Git 对象,存储打标签者的名字、邮箱、日期和标签说明,还可采用 GPG 进行签名。推荐用于正式发布,因为包含更多元数据和安全信息。</p>
</li>
<li>
<p>轻量标签Lightweight Tag实际上只是对某个提交的引用不保存额外信息类似一个固定的分支。适用于临时标记或非正式用途。</p>
</li>
</ul>
<h3 id="chuang-jian-biao-qian">创建标签</h3>
<ul>
<li>创建附注标签</li>
</ul>
<p>使用 -a 参数表示“annotated”并用 -m 提供标签说明。例如,给当前提交创建一个名为 v1.0 的附注标签:</p>
<pre data-lang="bash" style="background-color:#151515;color:#e8e8d3;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffb964;">git</span><span> tag</span><span style="color:#ffb964;"> -a</span><span> v1.0</span><span style="color:#ffb964;"> -m </span><span style="color:#556633;">&quot;</span><span style="color:#99ad6a;">发布版本 v1.0</span><span style="color:#556633;">&quot;
</span></code></pre>
<p>这会在 Git 数据库中生成一个完整的标签对象,可通过 git show v1.0 查看标签信息和对应的提交详情。</p>
<p>如果需要给旧提交贴标签,可以在命令末尾指定提交的 SHA 值(部分 SHA 也可):</p>
<pre data-lang="bash" style="background-color:#151515;color:#e8e8d3;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffb964;">git</span><span> tag</span><span style="color:#ffb964;"> -a</span><span> v1.0 &lt;commit-sha&gt; -m </span><span style="color:#556633;">&quot;</span><span style="color:#99ad6a;">发布版本 v1.0</span><span style="color:#556633;">&quot;
</span></code></pre>
<ul>
<li>创建轻量标签</li>
</ul>
<p>直接指定标签名即可,不加任何参数:</p>
<pre data-lang="bash" style="background-color:#151515;color:#e8e8d3;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffb964;">git</span><span> tag v1.0-light
</span></code></pre>
<p>轻量标签仅仅是一个提交引用,因此查看时不会显示附加信息。</p>
<h3 id="lie-chu-biao-qian">列出标签</h3>
<ul>
<li>列出所有标签</li>
</ul>
<pre data-lang="bash" style="background-color:#151515;color:#e8e8d3;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffb964;">git</span><span> tag
</span></code></pre>
<ul>
<li>还可以使用通配符过滤:</li>
</ul>
<pre data-lang="bash" style="background-color:#151515;color:#e8e8d3;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffb964;">git</span><span> tag</span><span style="color:#ffb964;"> -l </span><span style="color:#556633;">&quot;</span><span style="color:#99ad6a;">v1.*</span><span style="color:#556633;">&quot;
</span></code></pre>
<p>这样便于管理和筛选大量标签。</p>
<ul>
<li>查看标签详细信息</li>
</ul>
<pre data-lang="bash" style="background-color:#151515;color:#e8e8d3;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffb964;">git</span><span> show v1.0
</span></code></pre>
<p>这会显示标签对象的元数据以及对应的提交记录。</p>
<h3 id="tui-song-biao-qian">推送标签</h3>
<p><code>默认情况下git push 不会将本地标签推送到远程仓库。推送标签有两种方式:</code></p>
<ul>
<li>推送单个标签</li>
</ul>
<pre data-lang="bash" style="background-color:#151515;color:#e8e8d3;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffb964;">git</span><span> push origin v1.0
</span></code></pre>
<ul>
<li>一次性推送所有标签</li>
</ul>
<pre data-lang="bash" style="background-color:#151515;color:#e8e8d3;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffb964;">git</span><span> push origin</span><span style="color:#ffb964;"> --tags
</span></code></pre>
<h3 id="shan-chu-biao-qian">删除标签</h3>
<ul>
<li>删除本地标签</li>
</ul>
<pre data-lang="bash" style="background-color:#151515;color:#e8e8d3;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffb964;">git</span><span> tag</span><span style="color:#ffb964;"> -d</span><span> v1.0
</span></code></pre>
<ul>
<li>删除远程标签</li>
</ul>
<pre data-lang="bash" style="background-color:#151515;color:#e8e8d3;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffb964;">git</span><span> push origin</span><span style="color:#ffb964;"> --delete</span><span> v1.0
</span></code></pre>
<h2 id="ri-zhi">日志</h2>
<p>如果你想了解本地仓库的历史记录,最简单的命令就是使用:</p>
<pre data-lang="bash" style="background-color:#151515;color:#e8e8d3;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffb964;">git</span><span> log
</span></code></pre>
<ul>
<li>只看某一个人的提交记录:</li>
</ul>
<pre data-lang="bash" style="background-color:#151515;color:#e8e8d3;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffb964;">git</span><span> log</span><span style="color:#ffb964;"> --author</span><span>=bob
</span></code></pre>
<ul>
<li>一个压缩后的每一条提交记录只占一行的输出:</li>
</ul>
<pre data-lang="bash" style="background-color:#151515;color:#e8e8d3;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffb964;">git</span><span> log</span><span style="color:#ffb964;"> --pretty</span><span>=oneline
</span></code></pre>
<ul>
<li>看看哪些文件改变了:</li>
</ul>
<pre data-lang="bash" style="background-color:#151515;color:#e8e8d3;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffb964;">git</span><span> log</span><span style="color:#ffb964;"> --name-status
</span></code></pre>
<h2 id="sheng-cheng-bu-ding">生成补丁</h2>
<p>比如你修改了项目中的<code>fs/proc/base.c</code>,然后</p>
<pre data-lang="bash" style="background-color:#151515;color:#e8e8d3;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffb964;">git</span><span> add fs/proc/base.c
</span><span style="color:#ffb964;">git</span><span> commit</span><span style="color:#ffb964;"> -m </span><span style="color:#556633;">&quot;</span><span style="color:#99ad6a;">fix:base</span><span style="color:#556633;">&quot;
</span><span style="color:#ffb964;">git</span><span> format-patch origin/16.0
</span></code></pre>
<p>即可在目录下生成补丁<code>0001-fix-base.patch</code>.</p>
<h2 id="shan-chu-qian-yi-ge-ti-jiao-ji-lu">删除前一个提交记录</h2>
<p>有时候手滑或者不想使用一个commit说明可以用以下命令撤销上一个 commit</p>
<pre data-lang="bash" style="background-color:#151515;color:#e8e8d3;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffb964;">git</span><span> reset</span><span style="color:#ffb964;"> --soft</span><span> HEAD</span><span style="color:#ffb964;">~</span><span>1
</span></code></pre>
<p>这个命令会撤销上一个 commit但保留文件修改代码仍然在工作区。适用于 想要重新提交amend或调整 commit 的情况。</p>
<p>如果你想彻底删除更改(不保留代码修改),可以使用:</p>
<pre data-lang="bash" style="background-color:#151515;color:#e8e8d3;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffb964;">git</span><span> reset</span><span style="color:#ffb964;"> --hard</span><span> HEAD</span><span style="color:#ffb964;">~</span><span>1
</span></code></pre>
<blockquote>
<p>注意:--hard 会清除未提交的更改,无法恢复。</p>
</blockquote>
<h2 id="git-mu-lu-zhong-zhu-yao-wen-jian-he-zi-mu-lu-de-jie-gou-ji-qi-zuo-yong"><code>.git</code> 目录中主要文件和子目录的结构及其作用</h2>
<h3 id="file-folder-git-mu-lu-jie-gou-gai-lan">📁 <code>.git</code> 目录结构概览</h3>
<pre data-lang="bash" style="background-color:#151515;color:#e8e8d3;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffb964;">.git/
</span><span style="color:#ffb964;">├──</span><span> HEAD
</span><span style="color:#ffb964;">├──</span><span> config
</span><span style="color:#ffb964;">├──</span><span> description
</span><span style="color:#ffb964;">├──</span><span> hooks/
</span><span style="color:#ffb964;">├──</span><span> index
</span><span style="color:#ffb964;">├──</span><span> info/
</span><span style="color:#ffb964;"></span><span> └── exclude
</span><span style="color:#ffb964;">├──</span><span> logs/
</span><span style="color:#ffb964;"></span><span> ├── HEAD
</span><span style="color:#ffb964;"></span><span> └── refs/
</span><span style="color:#ffb964;">├──</span><span> objects/
</span><span style="color:#ffb964;"></span><span> ├── info/
</span><span style="color:#ffb964;"></span><span> └── pack/
</span><span style="color:#ffb964;">├──</span><span> refs/
</span><span style="color:#ffb964;"></span><span> ├── heads/
</span><span style="color:#ffb964;"></span><span> ├── remotes/
</span><span style="color:#ffb964;"></span><span> └── tags/
</span></code></pre>
<h3 id="dividers-he-xin-wen-jian-he-mu-lu-shuo-ming">🗂️ 核心文件和目录说明</h3>
<ul>
<li>
<p><strong>HEAD</strong>:指向当前检出的分支或提交。例如,<code>ref: refs/heads/main</code> 表示当前位于 <code>main</code> 分支。</p>
</li>
<li>
<p><strong>config</strong>:仓库级别的配置文件,包含用户名、邮箱、远程仓库等信息.</p>
</li>
<li>
<p><strong>description</strong>:用于描述仓库,仅供 GitWeb 等工具使用。</p>
</li>
<li>
<p><strong>hooks/</strong>:存放 Git 钩子脚本的目录,可用于在特定操作前后执行自定义脚本,如 <code>pre-commit</code><code>post-merge</code> 等.</p>
</li>
<li>
<p><strong>index</strong>暂存区staging area的索引文件记录了即将提交的文件信息。</p>
</li>
<li>
<p><strong>info/</strong>:包含辅助信息,如 <code>exclude</code> 文件用于定义仓库级别的忽略规则。</p>
</li>
<li>
<p><strong>logs/</strong>:记录了引用(如分支、标签)的更新历史,有助于追踪操作记录。</p>
</li>
<li>
<p><strong>objects/</strong>:存储 Git 的所有对象,包括:</p>
<ul>
<li><strong>blob</strong>:文件内容。</li>
<li><strong>tree</strong>:目录结构。</li>
<li><strong>commit</strong>:提交对象,记录提交信息和指向的树对象。</li>
<li><strong>tag</strong>:标签对象。
这些对象以 SHA-1 哈希命名,前两位作为子目录,其余作为文件名。</li>
</ul>
</li>
<li>
<p><strong>refs/</strong>:存储所有引用,包括:</p>
<ul>
<li><strong>heads/</strong>:本地分支。</li>
<li><strong>remotes/</strong>:远程分支。</li>
<li><strong>tags/</strong>:标签。</li>
</ul>
</li>
</ul>
<h2 id="commitgui-fan">Commit规范</h2>
<h3 id="ti-jiao-xin-xi-de-ji-ben-ge-shi">提交信息的基本格式</h3>
<ul>
<li>Header头部
格式:</li>
</ul>
<pre style="background-color:#151515;color:#e8e8d3;"><code><span>&lt;type&gt;[可选的 scope]: &lt;简短描述&gt;
</span></code></pre>
<p>type 表示提交类型feat新功能、fix修复bug等。
scope 是可选的,用于指出变更影响的模块或范围。
简短描述 用于概述本次提交的核心内容,通常使用祈使语气。</p>
<ul>
<li>
<p>Body正文
用于详细说明变更的动机、方法以及可能的影响,建议每行不超过 72 个字符。</p>
</li>
<li>
<p>Footer脚注
可选部分,用来引用相关 issue、任务或说明破坏性变更例如BREAKING CHANGE: ...)。例如:</p>
</li>
</ul>
<pre style="background-color:#151515;color:#e8e8d3;"><code><span>Fixes #123
</span></code></pre>
<p>这可以在提交后自动关闭相关问题。</p>
<h3 id="chang-jian-de-commit-lei-xing">常见的 Commit 类型</h3>
<pre data-lang="bash" style="background-color:#151515;color:#e8e8d3;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#ffb964;">-</span><span> feat新功能的添加
</span><span> </span><span style="color:#ffb964;">示例feat</span><span>(user): 添加用户注册功能
</span><span>
</span><span style="color:#ffb964;">-</span><span> fix修复 Bug
</span><span> </span><span style="color:#ffb964;">示例fix</span><span>(parser): 修复解析错误导致程序崩溃
</span><span>
</span><span style="color:#ffb964;">-</span><span> docs文档相关的修改
</span><span> </span><span style="color:#ffb964;">示例docs</span><span>(readme): 更新使用说明
</span><span>
</span><span style="color:#ffb964;">-</span><span> style代码格式、排版等不影响代码逻辑的调整
</span><span> </span><span style="color:#ffb964;">示例style:</span><span> 优化代码缩进和空格
</span><span>
</span><span style="color:#ffb964;">-</span><span> refactor代码重构不涉及新功能或 Bug 修复
</span><span> </span><span style="color:#ffb964;">示例refactor:</span><span> 优化数据处理逻辑
</span><span>
</span><span style="color:#ffb964;">-</span><span> perf性能优化
</span><span> </span><span style="color:#ffb964;">示例perf:</span><span> 提升数据查询速度
</span><span>
</span><span style="color:#ffb964;">-</span><span> test添加或修改测试代码
</span><span> </span><span style="color:#ffb964;">示例test:</span><span> 补充用户登录单元测试
</span><span>
</span><span style="color:#ffb964;">-</span><span> build构建相关的变更如依赖管理、构建脚本等
</span><span> </span><span style="color:#ffb964;">示例build:</span><span> 更新 webpack 配置
</span><span>
</span><span style="color:#ffb964;">-</span><span> ci持续集成相关的修改
</span><span> </span><span style="color:#ffb964;">示例ci:</span><span> 调整 GitHub Actions 配置
</span><span>
</span><span style="color:#ffb964;">-</span><span> chore其他杂项维护不涉及源代码或测试文件的修改
</span><span> </span><span style="color:#ffb964;">示例chore:</span><span> 更新项目依赖
</span><span>
</span><span style="color:#ffb964;">-</span><span> revert回滚到上一个版本的提交
</span><span> </span><span style="color:#ffb964;">示例revert:</span><span> 撤销上次提交
</span></code></pre>
<hr />
<p><strong>Done.</strong></p>
</div>
<div class="pagination">
<div class="pagination__title">
<span class="pagination__title-h">Thanks for reading! Read other posts?</span>
<hr />
</div>
<div class="pagination__buttons">
<span class="button previous">
<a href="https://blog.dich.bid/about-junk-cleanup/">
<span class="button__icon"></span>&nbsp;
<span class="button__text">乱七八糟:垃圾清理的艺术</span>
</a>
</span>
<span class="button next">
<a href="https://blog.dich.bid/network-isps/">
<span class="button__text">网络艺术:国内&#x2F;国际骨干ISP线路整理</span>&nbsp;
<span class="button__icon"></span>
</a>
</span>
</div>
</div>
</div>
</div>
<footer class="footer">
<div class="footer__inner">
<div class="copyright">
<span>©
2025
Dichgrem</span>
<span class="copyright-theme">
<span class="copyright-theme-sep"> :: CC BY-SA 4.0 :: A friend comes from distant lands</span>
</a>
</span>
</div>
</div>
</footer>
</div>
</body>
</html>