<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://senmo996.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://senmo996.github.io/" rel="alternate" type="text/html" /><updated>2026-05-19T23:06:29-07:00</updated><id>https://senmo996.github.io/feed.xml</id><title type="html">Henry Zhu / Site Title</title><subtitle>personal description</subtitle><author><name>Henry Zhu</name><email>z1113609151@gmail.com</email></author><entry><title type="html">Git常用命令实用指南</title><link href="https://senmo996.github.io/posts/2026/01/git-commands/" rel="alternate" type="text/html" title="Git常用命令实用指南" /><published>2026-01-30T00:00:00-08:00</published><updated>2026-01-30T00:00:00-08:00</updated><id>https://senmo996.github.io/posts/2026/01/git-commands</id><content type="html" xml:base="https://senmo996.github.io/posts/2026/01/git-commands/"><![CDATA[<p><code class="language-plaintext highlighter-rouge">Git</code> 是目前世界上最流行的分布式版本控制系统。它不仅能够高效地处理从小型到大型项目的各种版本管理需求，还提供了强大的分支管理、协作开发和历史追溯功能。本文将重点介绍 Git 的常用命令和实用技巧，帮助您在日常开发中更高效地使用 Git。</p>

<h2 id="核心概念">核心概念</h2>

<p>在使用 Git 之前，理解以下核心概念至关重要：</p>

<ol>
  <li><strong>工作区 (Working Directory)</strong>:
    <ul>
      <li>您当前正在编辑的文件所在目录。</li>
      <li>这里的文件是可见的，但尚未被 Git 跟踪或暂存。</li>
    </ul>
  </li>
  <li><strong>暂存区 (Staging Area/Index)</strong>:
    <ul>
      <li>也称为索引区，是 Git 的一个中间区域。</li>
      <li>通过 <code class="language-plaintext highlighter-rouge">git add</code> 命令将文件从工作区添加到暂存区。</li>
      <li>暂存区的文件将被包含在下一次提交中。</li>
    </ul>
  </li>
  <li><strong>本地仓库 (Local Repository)</strong>:
    <ul>
      <li>通过 <code class="language-plaintext highlighter-rouge">git commit</code> 命令将暂存区的内容提交到本地仓库。</li>
      <li>包含项目的完整历史记录和版本信息。</li>
    </ul>
  </li>
  <li><strong>远程仓库 (Remote Repository)</strong>:
    <ul>
      <li>托管在远程服务器（如 GitHub、GitLab）上的仓库。</li>
      <li>通过 <code class="language-plaintext highlighter-rouge">git push</code> 和 <code class="language-plaintext highlighter-rouge">git pull</code> 命令与本地仓库同步。</li>
    </ul>
  </li>
</ol>

<h2 id="git-基本指令">Git 基本指令</h2>

<h3 id="一初始化与配置">一、初始化与配置</h3>

<table>
  <thead>
    <tr>
      <th style="text-align: left">指令</th>
      <th style="text-align: left">作用</th>
      <th style="text-align: left">备注</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">git init</code></td>
      <td style="text-align: left">在当前目录初始化一个新的 Git 仓库。</td>
      <td style="text-align: left">创建一个 <code class="language-plaintext highlighter-rouge">.git</code> 隐藏目录，用于存储 Git 数据。</td>
    </tr>
    <tr>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">git clone [仓库地址]</code></td>
      <td style="text-align: left">克隆远程仓库到本地。</td>
      <td style="text-align: left">例如：<code class="language-plaintext highlighter-rouge">git clone https://github.com/user/repo.git</code>。</td>
    </tr>
    <tr>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">git config --global user.name "姓名"</code></td>
      <td style="text-align: left">设置全局用户名。</td>
      <td style="text-align: left">用于标识提交者。</td>
    </tr>
    <tr>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">git config --global user.email "邮箱"</code></td>
      <td style="text-align: left">设置全局邮箱。</td>
      <td style="text-align: left">用于标识提交者。</td>
    </tr>
    <tr>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">git config --list</code></td>
      <td style="text-align: left">查看当前 Git 配置。</td>
      <td style="text-align: left"> </td>
    </tr>
  </tbody>
</table>

<h3 id="二基本操作">二、基本操作</h3>

<table>
  <thead>
    <tr>
      <th style="text-align: left">指令</th>
      <th style="text-align: left">作用</th>
      <th style="text-align: left">备注</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">git status</code></td>
      <td style="text-align: left">查看工作区和暂存区的状态。</td>
      <td style="text-align: left">显示哪些文件被修改、哪些文件被暂存、哪些文件未被跟踪。</td>
    </tr>
    <tr>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">git add [文件名]</code></td>
      <td style="text-align: left">将文件添加到暂存区。</td>
      <td style="text-align: left">例如：<code class="language-plaintext highlighter-rouge">git add file.txt</code> 或 <code class="language-plaintext highlighter-rouge">git add .</code>（添加所有文件）。</td>
    </tr>
    <tr>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">git commit -m "提交信息"</code></td>
      <td style="text-align: left">将暂存区的内容提交到本地仓库。</td>
      <td style="text-align: left">提交信息应简洁明了，描述本次提交的内容。</td>
    </tr>
    <tr>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">git commit -am "提交信息"</code></td>
      <td style="text-align: left">跳过暂存区，直接提交所有已跟踪文件的修改。</td>
      <td style="text-align: left">只适用于已跟踪的文件，新文件仍需先 <code class="language-plaintext highlighter-rouge">git add</code>。</td>
    </tr>
    <tr>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">git log</code></td>
      <td style="text-align: left">查看提交历史。</td>
      <td style="text-align: left">显示提交的哈希、作者、日期和提交信息。</td>
    </tr>
    <tr>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">git log --oneline</code></td>
      <td style="text-align: left">以简洁的一行格式查看提交历史。</td>
      <td style="text-align: left">只显示提交哈希的前几位和提交信息。</td>
    </tr>
  </tbody>
</table>

<h3 id="三分支管理">三、分支管理</h3>

<table>
  <thead>
    <tr>
      <th style="text-align: left">指令</th>
      <th style="text-align: left">作用</th>
      <th style="text-align: left">备注</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">git branch</code></td>
      <td style="text-align: left">查看本地分支列表。</td>
      <td style="text-align: left">当前分支前会有 <code class="language-plaintext highlighter-rouge">*</code> 标记。</td>
    </tr>
    <tr>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">git branch [分支名]</code></td>
      <td style="text-align: left">创建新分支。</td>
      <td style="text-align: left">例如：<code class="language-plaintext highlighter-rouge">git branch feature-login</code>。</td>
    </tr>
    <tr>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">git checkout [分支名]</code></td>
      <td style="text-align: left">切换到指定分支。</td>
      <td style="text-align: left">例如：<code class="language-plaintext highlighter-rouge">git checkout feature-login</code>。</td>
    </tr>
    <tr>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">git checkout -b [分支名]</code></td>
      <td style="text-align: left">创建并切换到新分支。</td>
      <td style="text-align: left">例如：<code class="language-plaintext highlighter-rouge">git checkout -b feature-login</code>。</td>
    </tr>
    <tr>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">git branch -d [分支名]</code></td>
      <td style="text-align: left">删除已合并的分支。</td>
      <td style="text-align: left">例如：<code class="language-plaintext highlighter-rouge">git branch -d feature-login</code>。</td>
    </tr>
    <tr>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">git branch -D [分支名]</code></td>
      <td style="text-align: left">强制删除分支（即使未合并）。</td>
      <td style="text-align: left">请谨慎使用。</td>
    </tr>
    <tr>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">git merge [分支名]</code></td>
      <td style="text-align: left">将指定分支合并到当前分支。</td>
      <td style="text-align: left">例如：<code class="language-plaintext highlighter-rouge">git merge feature-login</code>。</td>
    </tr>
    <tr>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">git merge --no-ff [分支名]</code></td>
      <td style="text-align: left">以非快进方式合并分支，保留分支历史。</td>
      <td style="text-align: left">适用于需要保留分支结构的场景。</td>
    </tr>
  </tbody>
</table>

<h3 id="四远程操作">四、远程操作</h3>

<table>
  <thead>
    <tr>
      <th style="text-align: left">指令</th>
      <th style="text-align: left">作用</th>
      <th style="text-align: left">备注</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">git remote -v</code></td>
      <td style="text-align: left">查看远程仓库信息。</td>
      <td style="text-align: left">显示远程仓库的名称和 URL。</td>
    </tr>
    <tr>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">git remote add [名称] [URL]</code></td>
      <td style="text-align: left">添加远程仓库。</td>
      <td style="text-align: left">例如：<code class="language-plaintext highlighter-rouge">git remote add origin https://github.com/user/repo.git</code>。</td>
    </tr>
    <tr>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">git push [远程名] [分支名]</code></td>
      <td style="text-align: left">将本地分支推送到远程仓库。</td>
      <td style="text-align: left">例如：<code class="language-plaintext highlighter-rouge">git push origin main</code>。</td>
    </tr>
    <tr>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">git push -u [远程名] [分支名]</code></td>
      <td style="text-align: left">推送并设置上游分支。</td>
      <td style="text-align: left">下次推送时只需 <code class="language-plaintext highlighter-rouge">git push</code>。</td>
    </tr>
    <tr>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">git pull [远程名] [分支名]</code></td>
      <td style="text-align: left">从远程仓库拉取并合并到本地分支。</td>
      <td style="text-align: left">相当于 <code class="language-plaintext highlighter-rouge">git fetch</code> + <code class="language-plaintext highlighter-rouge">git merge</code>。</td>
    </tr>
    <tr>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">git fetch [远程名]</code></td>
      <td style="text-align: left">从远程仓库获取最新数据，但不合并。</td>
      <td style="text-align: left">可以先查看远程更新，再决定是否合并。</td>
    </tr>
  </tbody>
</table>

<h3 id="五撤销与恢复">五、撤销与恢复</h3>

<table>
  <thead>
    <tr>
      <th style="text-align: left">指令</th>
      <th style="text-align: left">作用</th>
      <th style="text-align: left">备注</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">git checkout -- [文件名]</code></td>
      <td style="text-align: left">撤销工作区中文件的修改（恢复到暂存区或上一次提交的状态）。</td>
      <td style="text-align: left">例如：<code class="language-plaintext highlighter-rouge">git checkout -- file.txt</code>。</td>
    </tr>
    <tr>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">git reset HEAD [文件名]</code></td>
      <td style="text-align: left">将文件从暂存区移除，但保留工作区的修改。</td>
      <td style="text-align: left">例如：<code class="language-plaintext highlighter-rouge">git reset HEAD file.txt</code>。</td>
    </tr>
    <tr>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">git reset --soft HEAD~1</code></td>
      <td style="text-align: left">撤销上一次提交，但保留修改在暂存区。</td>
      <td style="text-align: left">适用于重新提交。</td>
    </tr>
    <tr>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">git reset --mixed HEAD~1</code></td>
      <td style="text-align: left">撤销上一次提交，将修改保留在工作区（默认）。</td>
      <td style="text-align: left"> </td>
    </tr>
    <tr>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">git reset --hard HEAD~1</code></td>
      <td style="text-align: left">撤销上一次提交，并丢弃所有修改。</td>
      <td style="text-align: left">请谨慎使用，修改将无法恢复。</td>
    </tr>
    <tr>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">git revert [提交哈希]</code></td>
      <td style="text-align: left">创建一个新的提交，撤销指定提交的修改。</td>
      <td style="text-align: left">保留完整历史，推荐用于公共分支。</td>
    </tr>
  </tbody>
</table>

<h3 id="六查看与比较">六、查看与比较</h3>

<table>
  <thead>
    <tr>
      <th style="text-align: left">指令</th>
      <th style="text-align: left">作用</th>
      <th style="text-align: left">备注</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">git diff</code></td>
      <td style="text-align: left">查看工作区与暂存区的差异。</td>
      <td style="text-align: left"> </td>
    </tr>
    <tr>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">git diff --cached</code></td>
      <td style="text-align: left">查看暂存区与本地仓库的差异。</td>
      <td style="text-align: left"> </td>
    </tr>
    <tr>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">git diff [分支A] [分支B]</code></td>
      <td style="text-align: left">查看两个分支之间的差异。</td>
      <td style="text-align: left">例如：<code class="language-plaintext highlighter-rouge">git diff main feature-login</code>。</td>
    </tr>
    <tr>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">git show [提交哈希]</code></td>
      <td style="text-align: left">查看指定提交的详细信息。</td>
      <td style="text-align: left">显示提交的修改内容、作者、日期等。</td>
    </tr>
    <tr>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">git blame [文件名]</code></td>
      <td style="text-align: left">查看文件每一行的修改历史。</td>
      <td style="text-align: left">显示每一行是由谁、在哪个提交中修改的。</td>
    </tr>
  </tbody>
</table>

<h2 id="常用场景示例">常用场景示例</h2>

<h3 id="场景-1-开始新项目">场景 1: 开始新项目</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 初始化仓库</span>
git init

<span class="c"># 添加所有文件</span>
git add <span class="nb">.</span>

<span class="c"># 提交</span>
git commit <span class="nt">-m</span> <span class="s2">"Initial commit"</span>

<span class="c"># 添加远程仓库</span>
git remote add origin https://github.com/user/repo.git

<span class="c"># 推送到远程</span>
git push <span class="nt">-u</span> origin main
</code></pre></div></div>

<h3 id="场景-2-开发新功能">场景 2: 开发新功能</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 创建并切换到新分支</span>
git checkout <span class="nt">-b</span> feature-login

<span class="c"># 进行开发，修改文件</span>

<span class="c"># 查看状态</span>
git status

<span class="c"># 添加修改的文件</span>
git add <span class="nb">.</span>

<span class="c"># 提交</span>
git commit <span class="nt">-m</span> <span class="s2">"Add login feature"</span>

<span class="c"># 切换回主分支</span>
git checkout main

<span class="c"># 合并功能分支</span>
git merge feature-login

<span class="c"># 推送到远程</span>
git push origin main

<span class="c"># 删除功能分支</span>
git branch <span class="nt">-d</span> feature-login
</code></pre></div></div>

<h3 id="场景-3-修复错误">场景 3: 修复错误</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 发现错误，查看修改</span>
git diff

<span class="c"># 撤销某个文件的修改</span>
git checkout <span class="nt">--</span> file.txt

<span class="c"># 如果已经提交，可以使用 revert</span>
git revert HEAD

<span class="c"># 或者使用 reset（谨慎使用）</span>
git reset <span class="nt">--hard</span> HEAD~1
</code></pre></div></div>

<h3 id="场景-4-协作开发">场景 4: 协作开发</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 拉取最新代码</span>
git pull origin main

<span class="c"># 创建分支进行开发</span>
git checkout <span class="nt">-b</span> feature-new

<span class="c"># 开发并提交</span>
git add <span class="nb">.</span>
git commit <span class="nt">-m</span> <span class="s2">"Add new feature"</span>

<span class="c"># 推送分支到远程</span>
git push <span class="nt">-u</span> origin feature-new

<span class="c"># 在 GitHub 上创建 Pull Request</span>
<span class="c"># 等待代码审查和合并</span>
</code></pre></div></div>

<h2 id="git-配置优化">Git 配置优化</h2>

<h3 id="1-设置别名">1. 设置别名</h3>

<p>为常用命令设置别名，提高效率：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git config <span class="nt">--global</span> alias.st status
git config <span class="nt">--global</span> alias.co checkout
git config <span class="nt">--global</span> alias.br branch
git config <span class="nt">--global</span> alias.ci commit
git config <span class="nt">--global</span> alias.unstage <span class="s1">'reset HEAD --'</span>
git config <span class="nt">--global</span> alias.last <span class="s1">'log -1 HEAD'</span>
git config <span class="nt">--global</span> alias.visual <span class="s1">'!gitk'</span>
</code></pre></div></div>

<p>使用示例：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git st          <span class="c"># 等同于 git status</span>
git co main     <span class="c"># 等同于 git checkout main</span>
git ci <span class="nt">-m</span> <span class="s2">"msg"</span> <span class="c"># 等同于 git commit -m "msg"</span>
</code></pre></div></div>

<h3 id="2-设置默认分支名">2. 设置默认分支名</h3>

<p>将默认分支名从 <code class="language-plaintext highlighter-rouge">master</code> 改为 <code class="language-plaintext highlighter-rouge">main</code>：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git config <span class="nt">--global</span> init.defaultBranch main
</code></pre></div></div>

<h3 id="3-配置编辑器">3. 配置编辑器</h3>

<p>设置 Git 使用的默认编辑器：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 使用 VS Code</span>
git config <span class="nt">--global</span> core.editor <span class="s2">"code --wait"</span>

<span class="c"># 使用 Vim</span>
git config <span class="nt">--global</span> core.editor <span class="s2">"vim"</span>

<span class="c"># 使用 Notepad++ (Windows)</span>
git config <span class="nt">--global</span> core.editor <span class="s2">"'C:/Program Files/Notepad++/notepad++.exe' -multiInst -notabbar -nosession -noPlugin"</span>
</code></pre></div></div>

<h3 id="4-配置差异工具">4. 配置差异工具</h3>

<p>设置图形化的差异比较工具：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 使用 VS Code</span>
git config <span class="nt">--global</span> diff.tool vscode
git config <span class="nt">--global</span> difftool.vscode.cmd <span class="s1">'code --wait --diff $LOCAL $REMOTE'</span>

<span class="c"># 使用 Beyond Compare (Windows)</span>
git config <span class="nt">--global</span> diff.tool bc3
git config <span class="nt">--global</span> difftool.bc3.cmd <span class="s1">'"C:/Program Files/Beyond Compare 3/BCompare.exe" "$LOCAL" "$REMOTE"'</span>
</code></pre></div></div>

<h2 id="高级技巧">高级技巧</h2>

<h3 id="1-交互式暂存">1. 交互式暂存</h3>

<p>使用 <code class="language-plaintext highlighter-rouge">git add -i</code> 进入交互式暂存模式，可以选择性地暂存文件的某些部分：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git add <span class="nt">-i</span>
</code></pre></div></div>

<p>或者使用 <code class="language-plaintext highlighter-rouge">git add -p</code> 逐块查看和暂存修改：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git add <span class="nt">-p</span>
</code></pre></div></div>

<h3 id="2-储藏-stash">2. 储藏 (Stash)</h3>

<p>临时保存工作区的修改，以便切换分支或处理其他任务：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 保存当前修改</span>
git stash

<span class="c"># 查看储藏列表</span>
git stash list

<span class="c"># 应用最近的储藏</span>
git stash pop

<span class="c"># 应用指定的储藏</span>
git stash apply stash@<span class="o">{</span>0<span class="o">}</span>

<span class="c"># 删除储藏</span>
git stash drop stash@<span class="o">{</span>0<span class="o">}</span>

<span class="c"># 清除所有储藏</span>
git stash clear
</code></pre></div></div>

<h3 id="3-变基-rebase">3. 变基 (Rebase)</h3>

<p>使用变基来整理提交历史：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 将当前分支变基到 main 分支</span>
git rebase main

<span class="c"># 交互式变基，可以修改提交历史</span>
git rebase <span class="nt">-i</span> HEAD~3
</code></pre></div></div>

<h3 id="4-挑选-cherry-pick">4. 挑选 (Cherry-pick)</h3>

<p>将某个提交应用到当前分支：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git cherry-pick <span class="o">[</span>提交哈希]
</code></pre></div></div>

<h3 id="5-标签-tag">5. 标签 (Tag)</h3>

<p>为重要的版本打标签：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 创建轻量标签</span>
git tag v1.0.0

<span class="c"># 创建带注释的标签</span>
git tag <span class="nt">-a</span> v1.0.0 <span class="nt">-m</span> <span class="s2">"Version 1.0.0 release"</span>

<span class="c"># 查看标签</span>
git tag

<span class="c"># 推送标签到远程</span>
git push origin v1.0.0

<span class="c"># 推送所有标签</span>
git push origin <span class="nt">--tags</span>
</code></pre></div></div>

<h2 id="常见问题解决">常见问题解决</h2>

<h3 id="1-合并冲突">1. 合并冲突</h3>

<p>当合并分支时出现冲突，Git 会标记冲突的文件：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 查看冲突文件</span>
git status

<span class="c"># 手动编辑文件，解决冲突</span>
<span class="c"># 保留需要的代码，删除冲突标记</span>

<span class="c"># 添加解决后的文件</span>
git add <span class="o">[</span>冲突文件]

<span class="c"># 完成合并</span>
git commit
</code></pre></div></div>

<h3 id="2-撤销已推送的提交">2. 撤销已推送的提交</h3>

<p>如果已经推送到远程，需要谨慎处理：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 方法 1: 使用 revert（推荐）</span>
git revert HEAD
git push origin main

<span class="c"># 方法 2: 使用 reset（需要强制推送，谨慎使用）</span>
git reset <span class="nt">--hard</span> HEAD~1
git push <span class="nt">-f</span> origin main
</code></pre></div></div>

<h3 id="3-忘记添加文件到提交">3. 忘记添加文件到提交</h3>

<p>如果提交后发现忘记添加某个文件：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 添加忘记的文件</span>
git add forgotten-file.txt

<span class="c"># 修改上一次提交</span>
git commit <span class="nt">--amend</span> <span class="nt">--no-edit</span>
</code></pre></div></div>

<h3 id="4-查看文件历史">4. 查看文件历史</h3>

<p>查看某个文件的修改历史：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 查看文件的提交历史</span>
git log <span class="nt">--follow</span> <span class="o">[</span>文件名]

<span class="c"># 查看文件每次提交的差异</span>
git log <span class="nt">-p</span> <span class="o">[</span>文件名]
</code></pre></div></div>

<h2 id="总结">总结</h2>

<p>Git 是现代软件开发中不可或缺的工具。通过本文介绍的常用命令和技巧，您可以：</p>

<ol>
  <li>熟练使用 Git 的基本操作（初始化、提交、分支、合并等）</li>
  <li>高效地进行团队协作开发</li>
  <li>灵活地处理各种版本控制场景</li>
  <li>配置和优化 Git 以适应个人工作习惯</li>
  <li>解决常见的 Git 使用问题</li>
</ol>

<p>掌握 Git 不仅能够提高开发效率，还能帮助您更好地管理项目历史和协作流程。建议在实际项目中多加练习，逐步深入理解 Git 的工作原理和高级功能。</p>

<p>无论您是个人开发者还是团队成员，熟练使用 Git 都将为您的开发工作带来巨大的便利。</p>]]></content><author><name>Henry Zhu</name><email>z1113609151@gmail.com</email></author><category term="linux-command" /><summary type="html"><![CDATA[Git 是目前世界上最流行的分布式版本控制系统。它不仅能够高效地处理从小型到大型项目的各种版本管理需求，还提供了强大的分支管理、协作开发和历史追溯功能。本文将重点介绍 Git 的常用命令和实用技巧，帮助您在日常开发中更高效地使用 Git。]]></summary></entry><entry><title type="html">Hugging Face CLI (hf命令) 实用指南</title><link href="https://senmo996.github.io/posts/2026/01/huggingface-cli/" rel="alternate" type="text/html" title="Hugging Face CLI (hf命令) 实用指南" /><published>2026-01-17T00:00:00-08:00</published><updated>2026-01-17T00:00:00-08:00</updated><id>https://senmo996.github.io/posts/2026/01/huggingface-cli</id><content type="html" xml:base="https://senmo996.github.io/posts/2026/01/huggingface-cli/"><![CDATA[<p><code class="language-plaintext highlighter-rouge">huggingface-cli</code> 是 Hugging Face 官方提供的命令行工具，用于与 Hugging Face Hub 进行交互。随着其功能的不断增强，现在已更名为 <code class="language-plaintext highlighter-rouge">hf</code> 命令，提供了更简洁、强大的接口。本文将重点介绍 <code class="language-plaintext highlighter-rouge">hf</code> 命令的具体用法，包括如何使用 hf-mirror 镜像加速下载，以及其他实用的加速措施。</p>

<h2 id="核心功能">核心功能</h2>

<p><code class="language-plaintext highlighter-rouge">hf</code> 命令行工具的核心功能包括：</p>

<ol>
  <li><strong>模型和数据集管理</strong>: 下载、上传、列出 Hugging Face Hub 上的模型和数据集。</li>
  <li><strong>空间管理</strong>: 创建和管理 Hugging Face Spaces（用于部署模型和应用）。</li>
  <li><strong>认证管理</strong>: 处理用户登录和令牌管理。</li>
  <li><strong>配置管理</strong>: 设置和查看工具配置。</li>
  <li><strong>镜像加速</strong>: 支持使用镜像源加速下载。</li>
</ol>

<h2 id="安装-hf-命令">安装 <code class="language-plaintext highlighter-rouge">hf</code> 命令</h2>

<h3 id="从-pypi-安装">从 PyPI 安装</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pip <span class="nb">install</span> <span class="nt">-U</span> huggingface_hub
</code></pre></div></div>

<p>安装完成后，您可以通过以下命令验证安装是否成功：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>hf <span class="nt">--version</span>
</code></pre></div></div>

<h2 id="基本认证">基本认证</h2>

<p>在使用 <code class="language-plaintext highlighter-rouge">hf</code> 命令与 Hugging Face Hub 交互之前，您需要进行认证：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>hf login
</code></pre></div></div>

<p>这将打开浏览器窗口，引导您完成登录过程。如果您在没有图形界面的环境中，可以使用令牌进行认证：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>hf login <span class="nt">--token</span> YOUR_TOKEN_HERE
</code></pre></div></div>

<h2 id="hf-命令基本用法"><code class="language-plaintext highlighter-rouge">hf</code> 命令基本用法</h2>

<h3 id="1-模型和数据集管理">1. 模型和数据集管理</h3>

<h4 id="下载模型">下载模型</h4>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 下载完整模型</span>
hf download username/model-name

<span class="c"># 下载特定文件</span>
hf download username/model-name <span class="nt">--include</span> <span class="s2">"*.bin"</span>

<span class="c"># 下载到指定目录</span>
hf download username/model-name <span class="nt">--local-dir</span> ./my-model
</code></pre></div></div>

<h4 id="上传模型">上传模型</h4>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>hf upload username/model-name ./my-model
</code></pre></div></div>

<h4 id="列出模型">列出模型</h4>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>hf list models <span class="nt">--filter</span> <span class="s2">"text-generation"</span>
</code></pre></div></div>

<h3 id="2-空间管理">2. 空间管理</h3>

<h4 id="创建空间">创建空间</h4>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>hf space create <span class="nt">--name</span> my-space <span class="nt">--type</span> model
</code></pre></div></div>

<h4 id="部署到空间">部署到空间</h4>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>hf space deploy <span class="nt">--space</span> username/my-space
</code></pre></div></div>

<h3 id="3-配置管理">3. 配置管理</h3>

<h4 id="查看配置">查看配置</h4>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>hf config
</code></pre></div></div>

<h4 id="设置配置">设置配置</h4>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>hf config <span class="nb">set </span>cache_dir /path/to/cache
</code></pre></div></div>

<h2 id="使用-hf-mirror-镜像加速">使用 hf-mirror 镜像加速</h2>

<p>由于网络原因，直接从 Hugging Face Hub 下载可能会很慢。使用 hf-mirror 镜像是最有效的加速方法之一。</p>

<h3 id="临时使用镜像">临时使用镜像</h3>

<p>在执行命令时通过环境变量指定：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Linux/MacOS</span>
<span class="nb">export </span><span class="nv">HF_ENDPOINT</span><span class="o">=</span>https://hf-mirror.com <span class="o">&amp;&amp;</span> hf download username/model-name

<span class="c"># Windows (PowerShell)</span>
<span class="nv">$env</span>:HF_ENDPOINT<span class="o">=</span><span class="s2">"https://hf-mirror.com"</span><span class="p">;</span> hf download username/model-name

<span class="c"># Windows (CMD)</span>
<span class="nb">set </span><span class="nv">HF_ENDPOINT</span><span class="o">=</span>https://hf-mirror.com <span class="o">&amp;&amp;</span> hf download username/model-name
</code></pre></div></div>

<h3 id="永久设置镜像">永久设置镜像</h3>

<p>将镜像设置添加到配置文件中：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>hf config <span class="nb">set </span>endpoint https://hf-mirror.com
</code></pre></div></div>

<p>或者直接编辑配置文件 <code class="language-plaintext highlighter-rouge">~/.cache/huggingface/token</code>，添加：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>endpoint = https://hf-mirror.com
</code></pre></div></div>

<h2 id="其他加速措施">其他加速措施</h2>

<h3 id="1-配置缓存目录">1. 配置缓存目录</h3>

<p>设置较大的缓存目录，避免重复下载：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>hf config <span class="nb">set </span>cache_dir /path/to/large-cache
</code></pre></div></div>

<h3 id="2-使用---resume-download-参数">2. 使用 <code class="language-plaintext highlighter-rouge">--resume-download</code> 参数</h3>

<p>在下载大文件时启用断点续传：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>hf download username/model-name <span class="nt">--resume-download</span>
</code></pre></div></div>

<h3 id="3-批量下载优化">3. 批量下载优化</h3>

<p>对于多个文件的下载，使用 <code class="language-plaintext highlighter-rouge">--include</code> 或 <code class="language-plaintext highlighter-rouge">--exclude</code> 参数精确控制：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>hf download username/model-name <span class="nt">--include</span> <span class="s2">"*.bin"</span> <span class="s2">"*.json"</span>
</code></pre></div></div>

<h3 id="4-并行下载">4. 并行下载</h3>

<p>使用 <code class="language-plaintext highlighter-rouge">--parallel</code> 参数启用并行下载（需要较新版本的 huggingface_hub）：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>hf download username/model-name <span class="nt">--parallel</span>
</code></pre></div></div>

<h3 id="5-使用系统代理">5. 使用系统代理</h3>

<p>如果您有可用的代理，可以通过环境变量设置：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># HTTP 代理</span>
<span class="nb">export </span><span class="nv">HTTP_PROXY</span><span class="o">=</span>http://proxy-server:port
<span class="nb">export </span><span class="nv">HTTPS_PROXY</span><span class="o">=</span>http://proxy-server:port

<span class="c"># SOCKS 代理</span>
<span class="nb">export </span><span class="nv">ALL_PROXY</span><span class="o">=</span>socks5://proxy-server:port
</code></pre></div></div>

<h3 id="6-使用-hf-transfer-加速">6. 使用 hf-transfer 加速</h3>

<p><code class="language-plaintext highlighter-rouge">hf-transfer</code> 是 Hugging Face 官方开发的高性能下载加速工具，通过多线程和断点续传技术显著提高下载速度。</p>

<h4 id="安装-hf-transfer">安装 hf-transfer</h4>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pip <span class="nb">install </span>hf-transfer
</code></pre></div></div>

<h4 id="启用-hf-transfer">启用 hf-transfer</h4>

<p>安装完成后，通过设置环境变量启用：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Linux/MacOS</span>
<span class="nb">export </span><span class="nv">HF_HUB_ENABLE_HF_TRANSFER</span><span class="o">=</span>1 <span class="o">&amp;&amp;</span> hf download username/model-name

<span class="c"># Windows (PowerShell)</span>
<span class="nv">$env</span>:HF_HUB_ENABLE_HF_TRANSFER<span class="o">=</span>1<span class="p">;</span> hf download username/model-name

<span class="c"># Windows (CMD)</span>
<span class="nb">set </span><span class="nv">HF_HUB_ENABLE_HF_TRANSFER</span><span class="o">=</span>1 <span class="o">&amp;&amp;</span> hf download username/model-name
</code></pre></div></div>

<h4 id="永久启用-hf-transfer">永久启用 hf-transfer</h4>

<p>将环境变量添加到系统配置文件中：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Linux/MacOS: 添加到 ~/.bashrc 或 ~/.zshrc</span>
<span class="nb">echo</span> <span class="s1">'export HF_HUB_ENABLE_HF_TRANSFER=1'</span> <span class="o">&gt;&gt;</span> ~/.bashrc
<span class="nb">source</span> ~/.bashrc

<span class="c"># Windows: 在系统环境变量中添加</span>
<span class="c"># HF_HUB_ENABLE_HF_TRANSFER = 1</span>
</code></pre></div></div>

<h4 id="与镜像结合使用">与镜像结合使用</h4>

<p><code class="language-plaintext highlighter-rouge">hf-transfer</code> 可以与 hf-mirror 镜像结合使用，获得最佳下载速度：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">export </span><span class="nv">HF_ENDPOINT</span><span class="o">=</span>https://hf-mirror.com <span class="o">&amp;&amp;</span> <span class="nb">export </span><span class="nv">HF_HUB_ENABLE_HF_TRANSFER</span><span class="o">=</span>1 <span class="o">&amp;&amp;</span> hf download username/model-name
</code></pre></div></div>

<h2 id="常用场景示例">常用场景示例</h2>

<h3 id="场景-1-快速下载大模型">场景 1: 快速下载大模型</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 使用镜像和 hf-transfer 加速下载 Llama 3 模型</span>
<span class="nb">export </span><span class="nv">HF_ENDPOINT</span><span class="o">=</span>https://hf-mirror.com <span class="o">&amp;&amp;</span> <span class="nb">export </span><span class="nv">HF_HUB_ENABLE_HF_TRANSFER</span><span class="o">=</span>1 <span class="o">&amp;&amp;</span> hf download meta-llama/Llama-3-8B <span class="nt">--local-dir</span> ./llama3
</code></pre></div></div>

<h3 id="场景-2-上传本地模型到-hub">场景 2: 上传本地模型到 Hub</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 登录后上传模型</span>
hf login
hf upload my-username/my-model ./local-model
</code></pre></div></div>

<h3 id="场景-3-批量下载数据集">场景 3: 批量下载数据集</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 使用镜像加速下载 GLUE 数据集</span>
<span class="nb">export </span><span class="nv">HF_ENDPOINT</span><span class="o">=</span>https://hf-mirror.com <span class="o">&amp;&amp;</span> <span class="nb">export </span><span class="nv">HF_HUB_ENABLE_HF_TRANSFER</span><span class="o">=</span>1 <span class="o">&amp;&amp;</span> hf download <span class="nt">--repo-type</span> dataset glue <span class="nt">--local-dir</span> ./glue-dataset
</code></pre></div></div>

<h2 id="高级配置">高级配置</h2>

<h3 id="配置文件结构">配置文件结构</h3>

<p><code class="language-plaintext highlighter-rouge">hf</code> 命令的配置文件位于 <code class="language-plaintext highlighter-rouge">~/.cache/huggingface/token</code>，您可以手动编辑它来设置更多选项：</p>

<div class="language-ini highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nn">[DEFAULT]</span>
<span class="py">endpoint</span> <span class="p">=</span> <span class="s">https://hf-mirror.com</span>
<span class="py">cache_dir</span> <span class="p">=</span> <span class="s">/path/to/cache</span>
<span class="py">user_agent</span> <span class="p">=</span> <span class="s">hf-cli/0.1.0</span>
</code></pre></div></div>

<h3 id="环境变量优先级">环境变量优先级</h3>

<p>配置的优先级从高到低为：</p>
<ol>
  <li>命令行参数</li>
  <li>环境变量</li>
  <li>配置文件</li>
  <li>默认值</li>
</ol>

<h2 id="故障排除">故障排除</h2>

<h3 id="常见问题及解决方案">常见问题及解决方案</h3>

<table>
  <thead>
    <tr>
      <th style="text-align: left">问题</th>
      <th style="text-align: left">解决方案</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left">下载速度慢</td>
      <td style="text-align: left">使用 hf-mirror 镜像或代理</td>
    </tr>
    <tr>
      <td style="text-align: left">下载中断</td>
      <td style="text-align: left">使用 <code class="language-plaintext highlighter-rouge">--resume-download</code> 参数</td>
    </tr>
    <tr>
      <td style="text-align: left">认证失败</td>
      <td style="text-align: left">重新运行 <code class="language-plaintext highlighter-rouge">hf login</code> 或检查令牌权限</td>
    </tr>
    <tr>
      <td style="text-align: left">上传失败</td>
      <td style="text-align: left">检查网络连接和存储空间</td>
    </tr>
  </tbody>
</table>

<h3 id="查看详细日志">查看详细日志</h3>

<p>使用 <code class="language-plaintext highlighter-rouge">--debug</code> 参数查看详细日志，帮助诊断问题：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>hf download username/model-name <span class="nt">--debug</span>
</code></pre></div></div>

<h2 id="总结">总结</h2>

<p><code class="language-plaintext highlighter-rouge">hf</code> 命令是 Hugging Face 生态系统中不可或缺的工具，它简化了与 Hugging Face Hub 的交互过程。通过本文介绍的方法，您可以：</p>

<ol>
  <li>熟练使用 <code class="language-plaintext highlighter-rouge">hf</code> 命令的各种功能</li>
  <li>通过 hf-mirror 镜像显著加速下载速度</li>
  <li>使用 hf-transfer 工具进一步提升下载性能</li>
  <li>应用其他优化措施最大化效率</li>
  <li>解决常见的使用问题</li>
</ol>

<p>特别是结合使用 hf-mirror 镜像和 hf-transfer 工具，可以获得最佳的下载体验，即使在网络条件不佳的情况下也能高效地获取 Hugging Face Hub 上的资源。</p>

<p>无论您是在本地开发还是在服务器上部署模型，掌握这些技巧都能大大提高您的工作效率。</p>]]></content><author><name>Henry Zhu</name><email>z1113609151@gmail.com</email></author><category term="linux-command" /><summary type="html"><![CDATA[huggingface-cli 是 Hugging Face 官方提供的命令行工具，用于与 Hugging Face Hub 进行交互。随着其功能的不断增强，现在已更名为 hf 命令，提供了更简洁、强大的接口。本文将重点介绍 hf 命令的具体用法，包括如何使用 hf-mirror 镜像加速下载，以及其他实用的加速措施。]]></summary></entry><entry><title type="html">zip、unzip 和 tar 压缩解压实用指南</title><link href="https://senmo996.github.io/posts/2025/12/unzip-tar/" rel="alternate" type="text/html" title="zip、unzip 和 tar 压缩解压实用指南" /><published>2025-12-15T00:00:00-08:00</published><updated>2025-12-15T00:00:00-08:00</updated><id>https://senmo996.github.io/posts/2025/12/unzip-tar</id><content type="html" xml:base="https://senmo996.github.io/posts/2025/12/unzip-tar/"><![CDATA[<p><code class="language-plaintext highlighter-rouge">zip</code>、<code class="language-plaintext highlighter-rouge">unzip</code> 和 <code class="language-plaintext highlighter-rouge">tar</code> 是 Linux 系统中最常用的三个压缩解压工具。<code class="language-plaintext highlighter-rouge">zip</code> 和 <code class="language-plaintext highlighter-rouge">unzip</code> 专门用于处理 <code class="language-plaintext highlighter-rouge">.zip</code> 格式的压缩文件，其中 <code class="language-plaintext highlighter-rouge">zip</code> 用于创建压缩包，<code class="language-plaintext highlighter-rouge">unzip</code> 用于解压。而 <code class="language-plaintext highlighter-rouge">tar</code> 则主要用于打包多个文件和目录，并可以配合压缩算法（如 gzip、bzip2、xz）进行压缩。本文将重点介绍这三个工具的实用操作和常见场景，帮助您在日常工作中高效地处理各种压缩文件。</p>

<h2 id="核心功能">核心功能</h2>

<h3 id="zip-工具"><code class="language-plaintext highlighter-rouge">zip</code> 工具</h3>

<p><code class="language-plaintext highlighter-rouge">zip</code> 是专门用于创建 <code class="language-plaintext highlighter-rouge">.zip</code> 格式压缩文件的命令行工具，支持：</p>
<ul>
  <li>压缩单个或多个文件</li>
  <li>压缩整个目录</li>
  <li>递归压缩子目录</li>
  <li>设置压缩级别</li>
  <li>添加密码保护</li>
  <li>排除特定文件或目录</li>
  <li>更新已有压缩包</li>
</ul>

<h3 id="unzip-工具"><code class="language-plaintext highlighter-rouge">unzip</code> 工具</h3>

<p><code class="language-plaintext highlighter-rouge">unzip</code> 是专门用于解压 <code class="language-plaintext highlighter-rouge">.zip</code> 格式压缩文件的命令行工具，支持：</p>
<ul>
  <li>解压单个或多个文件</li>
  <li>查看压缩包内容而不解压</li>
  <li>选择性解压特定文件</li>
  <li>处理密码保护的压缩包</li>
  <li>覆盖控制和解压到指定目录</li>
</ul>

<h3 id="tar-工具"><code class="language-plaintext highlighter-rouge">tar</code> 工具</h3>

<p><code class="language-plaintext highlighter-rouge">tar</code> (Tape Archive) 最初用于磁带备份，现在已成为 Linux 系统中标准的打包工具。它可以：</p>
<ul>
  <li>将多个文件和目录打包成一个文件</li>
  <li>配合压缩算法（gzip、bzip2、xz）进行压缩</li>
  <li>解压和提取打包文件</li>
  <li>查看打包文件内容</li>
  <li>增量备份和恢复</li>
</ul>

<h2 id="安装工具">安装工具</h2>

<h3 id="安装-zip">安装 <code class="language-plaintext highlighter-rouge">zip</code></h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Debian/Ubuntu</span>
<span class="nb">sudo </span>apt-get <span class="nb">install </span>zip

<span class="c"># CentOS/RHEL</span>
<span class="nb">sudo </span>yum <span class="nb">install </span>zip

<span class="c"># Fedora</span>
<span class="nb">sudo </span>dnf <span class="nb">install </span>zip

<span class="c"># Arch Linux</span>
<span class="nb">sudo </span>pacman <span class="nt">-S</span> zip
</code></pre></div></div>

<h3 id="安装-unzip">安装 <code class="language-plaintext highlighter-rouge">unzip</code></h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Debian/Ubuntu</span>
<span class="nb">sudo </span>apt-get <span class="nb">install </span>unzip

<span class="c"># CentOS/RHEL</span>
<span class="nb">sudo </span>yum <span class="nb">install </span>unzip

<span class="c"># Fedora</span>
<span class="nb">sudo </span>dnf <span class="nb">install </span>unzip

<span class="c"># Arch Linux</span>
<span class="nb">sudo </span>pacman <span class="nt">-S</span> unzip
</code></pre></div></div>

<h3 id="安装-tar">安装 <code class="language-plaintext highlighter-rouge">tar</code></h3>

<p>大多数 Linux 发行版默认已安装 <code class="language-plaintext highlighter-rouge">tar</code>。如果需要安装：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Debian/Ubuntu</span>
<span class="nb">sudo </span>apt-get <span class="nb">install tar</span>

<span class="c"># CentOS/RHEL</span>
<span class="nb">sudo </span>yum <span class="nb">install tar</span>

<span class="c"># Fedora</span>
<span class="nb">sudo </span>dnf <span class="nb">install tar</span>

<span class="c"># Arch Linux</span>
<span class="nb">sudo </span>pacman <span class="nt">-S</span> <span class="nb">tar</span>
</code></pre></div></div>

<h2 id="zip-基本用法"><code class="language-plaintext highlighter-rouge">zip</code> 基本用法</h2>

<h3 id="1-基本压缩操作">1. 基本压缩操作</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 压缩单个文件</span>
zip archive.zip file1.txt

<span class="c"># 压缩多个文件</span>
zip archive.zip file1.txt file2.txt file3.txt

<span class="c"># 压缩目录（不包含子目录）</span>
zip archive.zip directory/

<span class="c"># 递归压缩目录（包含所有子目录）</span>
zip <span class="nt">-r</span> archive.zip directory/

<span class="c"># 压缩时不显示详细信息</span>
zip <span class="nt">-q</span> archive.zip file1.txt

<span class="c"># 压缩时显示详细信息</span>
zip <span class="nt">-v</span> archive.zip file1.txt
</code></pre></div></div>

<h3 id="2-设置压缩级别">2. 设置压缩级别</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 最快压缩（压缩率最低）</span>
zip <span class="nt">-0</span> archive.zip file1.txt

<span class="c"># 默认压缩级别</span>
zip <span class="nt">-6</span> archive.zip file1.txt

<span class="c"># 最高压缩率（速度最慢）</span>
zip <span class="nt">-9</span> archive.zip file1.txt
</code></pre></div></div>

<h3 id="3-添加密码保护">3. 添加密码保护</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 压缩时添加密码</span>
zip <span class="nt">-e</span> archive.zip file1.txt
<span class="c"># 系统会提示输入密码</span>

<span class="c"># 直接指定密码（不安全，不推荐）</span>
zip <span class="nt">-P</span> password archive.zip file1.txt
</code></pre></div></div>

<h3 id="4-排除文件和目录">4. 排除文件和目录</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 排除特定文件</span>
zip <span class="nt">-r</span> archive.zip directory/ <span class="nt">-x</span> <span class="s2">"*.log"</span>

<span class="c"># 排除多个文件类型</span>
zip <span class="nt">-r</span> archive.zip directory/ <span class="nt">-x</span> <span class="s2">"*.log"</span> <span class="s2">"*.tmp"</span> <span class="s2">"*.cache"</span>

<span class="c"># 排除特定目录</span>
zip <span class="nt">-r</span> archive.zip directory/ <span class="nt">-x</span> <span class="s2">"node_modules/*"</span> <span class="s2">"dist/*"</span>

<span class="c"># 排除隐藏文件</span>
zip <span class="nt">-r</span> archive.zip directory/ <span class="nt">-x</span> <span class="s2">".*"</span>
</code></pre></div></div>

<h3 id="5-更新已有压缩包">5. 更新已有压缩包</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 向已有压缩包添加文件</span>
zip <span class="nt">-u</span> archive.zip newfile.txt

<span class="c"># 更新压缩包中的文件</span>
zip <span class="nt">-u</span> archive.zip updatedfile.txt

<span class="c"># 刷新压缩包（仅更新已存在的文件）</span>
zip <span class="nt">-FS</span> archive.zip directory/
</code></pre></div></div>

<h3 id="6-查看压缩包内容">6. 查看压缩包内容</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 列出压缩包中的文件</span>
zip <span class="nt">-sf</span> archive.zip

<span class="c"># 详细列出压缩包信息</span>
zip <span class="nt">-v</span> archive.zip

<span class="c"># 测试压缩包的完整性</span>
zip <span class="nt">-T</span> archive.zip
</code></pre></div></div>

<h3 id="7-删除压缩包中的文件">7. 删除压缩包中的文件</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 从压缩包中删除文件</span>
zip <span class="nt">-d</span> archive.zip file1.txt

<span class="c"># 从压缩包中删除多个文件</span>
zip <span class="nt">-d</span> archive.zip file1.txt file2.txt
</code></pre></div></div>

<h3 id="8-分卷压缩">8. 分卷压缩</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 使用 split 创建分卷压缩（每卷 100MB）</span>
zip <span class="nt">-r</span> - archive.zip directory/ | <span class="nb">split</span> <span class="nt">-d</span> <span class="nt">-b</span> 100M - archive.zip.

<span class="c"># 合并分卷压缩文件</span>
<span class="nb">cat </span>archive.zip.<span class="k">*</span> <span class="o">&gt;</span> archive.zip
</code></pre></div></div>

<h2 id="unzip-基本用法"><code class="language-plaintext highlighter-rouge">unzip</code> 基本用法</h2>

<h3 id="1-基本解压操作">1. 基本解压操作</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 解压到当前目录</span>
unzip archive.zip

<span class="c"># 解压到指定目录</span>
unzip archive.zip <span class="nt">-d</span> /path/to/destination

<span class="c"># 解压时不显示详细信息</span>
unzip <span class="nt">-q</span> archive.zip

<span class="c"># 解压时显示详细信息</span>
unzip <span class="nt">-v</span> archive.zip
</code></pre></div></div>

<h3 id="2-查看压缩包内容">2. 查看压缩包内容</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 列出压缩包中的文件</span>
unzip <span class="nt">-l</span> archive.zip

<span class="c"># 详细列出压缩包信息</span>
unzip <span class="nt">-v</span> archive.zip
</code></pre></div></div>

<h3 id="3-选择性解压">3. 选择性解压</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 只解压特定文件</span>
unzip archive.zip file1.txt file2.txt

<span class="c"># 解压匹配模式的文件</span>
unzip archive.zip <span class="s2">"*.txt"</span>

<span class="c"># 排除特定文件</span>
unzip archive.zip <span class="nt">-x</span> <span class="s2">"*.log"</span>
</code></pre></div></div>

<h3 id="4-覆盖控制">4. 覆盖控制</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 覆盖已存在的文件（默认行为）</span>
unzip <span class="nt">-o</span> archive.zip

<span class="c"># 不覆盖已存在的文件</span>
unzip <span class="nt">-n</span> archive.zip

<span class="c"># 交互式询问是否覆盖</span>
unzip <span class="nt">-o</span> <span class="nt">-a</span> archive.zip
</code></pre></div></div>

<h3 id="5-处理密码保护的压缩包">5. 处理密码保护的压缩包</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 解压密码保护的压缩包</span>
unzip <span class="nt">-P</span> password archive.zip

<span class="c"># 解压时提示输入密码（更安全）</span>
unzip archive.zip
<span class="c"># 系统会提示输入密码</span>
</code></pre></div></div>

<h2 id="tar-基本用法"><code class="language-plaintext highlighter-rouge">tar</code> 基本用法</h2>

<p><code class="language-plaintext highlighter-rouge">tar</code> 命令的基本语法为：<code class="language-plaintext highlighter-rouge">tar [选项] [文件名]</code></p>

<p>常用选项：</p>
<ul>
  <li><code class="language-plaintext highlighter-rouge">-c</code>: 创建新的打包文件</li>
  <li><code class="language-plaintext highlighter-rouge">-x</code>: 解压打包文件</li>
  <li><code class="language-plaintext highlighter-rouge">-t</code>: 查看打包文件内容</li>
  <li><code class="language-plaintext highlighter-rouge">-v</code>: 显示详细过程</li>
  <li><code class="language-plaintext highlighter-rouge">-f</code>: 指定文件名（必须放在选项最后）</li>
  <li><code class="language-plaintext highlighter-rouge">-z</code>: 使用 gzip 压缩/解压</li>
  <li><code class="language-plaintext highlighter-rouge">-j</code>: 使用 bzip2 压缩/解压</li>
  <li><code class="language-plaintext highlighter-rouge">-J</code>: 使用 xz 压缩/解压</li>
  <li><code class="language-plaintext highlighter-rouge">-C</code>: 切换到指定目录</li>
</ul>

<h3 id="1-打包操作">1. 打包操作</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 打包多个文件</span>
<span class="nb">tar</span> <span class="nt">-cvf</span> archive.tar file1.txt file2.txt

<span class="c"># 打包整个目录</span>
<span class="nb">tar</span> <span class="nt">-cvf</span> archive.tar /path/to/directory

<span class="c"># 打配 gzip 压缩（.tar.gz 或 .tgz）</span>
<span class="nb">tar</span> <span class="nt">-czvf</span> archive.tar.gz /path/to/directory

<span class="c"># 打配 bzip2 压缩（.tar.bz2）</span>
<span class="nb">tar</span> <span class="nt">-cjvf</span> archive.tar.bz2 /path/to/directory

<span class="c"># 打配 xz 压缩（.tar.xz）</span>
<span class="nb">tar</span> <span class="nt">-cJvf</span> archive.tar.xz /path/to/directory
</code></pre></div></div>

<h3 id="2-解压操作">2. 解压操作</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 解压 .tar 文件</span>
<span class="nb">tar</span> <span class="nt">-xvf</span> archive.tar

<span class="c"># 解压 .tar.gz 文件</span>
<span class="nb">tar</span> <span class="nt">-xzvf</span> archive.tar.gz

<span class="c"># 解压 .tar.bz2 文件</span>
<span class="nb">tar</span> <span class="nt">-xjvf</span> archive.tar.bz2

<span class="c"># 解压 .tar.xz 文件</span>
<span class="nb">tar</span> <span class="nt">-xJvf</span> archive.tar.xz

<span class="c"># 解压到指定目录</span>
<span class="nb">tar</span> <span class="nt">-xvf</span> archive.tar <span class="nt">-C</span> /path/to/destination
</code></pre></div></div>

<h3 id="3-查看打包文件内容">3. 查看打包文件内容</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 查看 .tar 文件内容</span>
<span class="nb">tar</span> <span class="nt">-tvf</span> archive.tar

<span class="c"># 查看 .tar.gz 文件内容</span>
<span class="nb">tar</span> <span class="nt">-tzvf</span> archive.tar.gz

<span class="c"># 查看文件列表（不显示详细信息）</span>
<span class="nb">tar</span> <span class="nt">-tf</span> archive.tar
</code></pre></div></div>

<h3 id="4-增量操作">4. 增量操作</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 向已有打包文件中添加文件</span>
<span class="nb">tar</span> <span class="nt">-rvf</span> archive.tar newfile.txt

<span class="c"># 更新打包文件中的文件（如果文件较新）</span>
<span class="nb">tar</span> <span class="nt">-uvf</span> archive.tar updatedfile.txt

<span class="c"># 从打包文件中删除文件</span>
<span class="nb">tar</span> <span class="nt">--delete</span> <span class="nt">-f</span> archive.tar file.txt
</code></pre></div></div>

<h2 id="常用场景示例">常用场景示例</h2>

<h3 id="场景-1-下载并解压软件包">场景 1: 下载并解压软件包</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 下载软件包</span>
wget https://example.com/software.tar.gz

<span class="c"># 解压到指定目录</span>
<span class="nb">tar</span> <span class="nt">-xzvf</span> software.tar.gz <span class="nt">-C</span> /opt/

<span class="c"># 或者解压到当前目录</span>
<span class="nb">tar</span> <span class="nt">-xzvf</span> software.tar.gz
</code></pre></div></div>

<h3 id="场景-2-创建项目压缩包">场景 2: 创建项目压缩包</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 压缩项目目录，排除不必要的文件</span>
zip <span class="nt">-r</span> project_<span class="si">$(</span><span class="nb">date</span> +%Y%m%d<span class="si">)</span>.zip project/ <span class="nt">-x</span> <span class="s2">"node_modules/*"</span> <span class="s2">"dist/*"</span> <span class="s2">".git/*"</span> <span class="s2">"*.log"</span>

<span class="c"># 创建带密码的项目备份</span>
zip <span class="nt">-e</span> <span class="nt">-r</span> project_backup.zip project/

<span class="c"># 创建分卷压缩包（每卷 500MB）</span>
zip <span class="nt">-r</span> - project.zip project/ | <span class="nb">split</span> <span class="nt">-d</span> <span class="nt">-b</span> 500M - project.zip.
</code></pre></div></div>

<h3 id="场景-3-备份项目目录">场景 3: 备份项目目录</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 创建带日期的备份</span>
<span class="nb">tar</span> <span class="nt">-czvf</span> backup_<span class="si">$(</span><span class="nb">date</span> +%Y%m%d<span class="si">)</span>.tar.gz /path/to/project

<span class="c"># 排除某些文件或目录</span>
<span class="nb">tar</span> <span class="nt">-czvf</span> backup.tar.gz /path/to/project <span class="nt">--exclude</span><span class="o">=</span><span class="s2">"*.log"</span> <span class="nt">--exclude</span><span class="o">=</span><span class="s2">"node_modules"</span>

<span class="c"># 排除多个目录</span>
<span class="nb">tar</span> <span class="nt">-czvf</span> backup.tar.gz /path/to/project <span class="nt">--exclude</span><span class="o">={</span>node_modules,dist,<span class="k">*</span>.log<span class="o">}</span>
</code></pre></div></div>

<h3 id="场景-4-解压-windows-传输的-zip-文件">场景 4: 解压 Windows 传输的 zip 文件</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 解压 zip 文件</span>
unzip windows_files.zip <span class="nt">-d</span> ./extracted

<span class="c"># 处理文件名编码问题（中文文件名）</span>
unzip <span class="nt">-O</span> GBK windows_files.zip <span class="nt">-d</span> ./extracted

<span class="c"># 查看压缩包内容</span>
unzip <span class="nt">-l</span> windows_files.zip
</code></pre></div></div>

<h3 id="场景-5-批量解压多个压缩文件">场景 5: 批量解压多个压缩文件</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 解压所有 .zip 文件</span>
<span class="k">for </span>file <span class="k">in</span> <span class="k">*</span>.zip<span class="p">;</span> <span class="k">do </span>unzip <span class="s2">"</span><span class="nv">$file</span><span class="s2">"</span> <span class="nt">-d</span> <span class="s2">"</span><span class="k">${</span><span class="nv">file</span><span class="p">%.zip</span><span class="k">}</span><span class="s2">"</span><span class="p">;</span> <span class="k">done</span>

<span class="c"># 解压所有 .tar.gz 文件</span>
<span class="k">for </span>file <span class="k">in</span> <span class="k">*</span>.tar.gz<span class="p">;</span> <span class="k">do </span><span class="nb">tar</span> <span class="nt">-xzvf</span> <span class="s2">"</span><span class="nv">$file</span><span class="s2">"</span><span class="p">;</span> <span class="k">done</span>

<span class="c"># 使用 find 命令递归解压</span>
find <span class="nb">.</span> <span class="nt">-name</span> <span class="s2">"*.tar.gz"</span> <span class="nt">-exec</span> <span class="nb">tar</span> <span class="nt">-xzvf</span> <span class="o">{}</span> <span class="se">\;</span>
</code></pre></div></div>

<h3 id="场景-6-创建分卷压缩文件">场景 6: 创建分卷压缩文件</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 使用 split 创建分卷压缩</span>
<span class="nb">tar</span> <span class="nt">-czvf</span> - /path/to/large/directory | <span class="nb">split</span> <span class="nt">-d</span> <span class="nt">-b</span> 100M - archive.tar.gz.

<span class="c"># 合并分卷压缩文件</span>
<span class="nb">cat </span>archive.tar.gz.<span class="k">*</span> | <span class="nb">tar</span> <span class="nt">-xzvf</span> -
</code></pre></div></div>

<h2 id="高级技巧">高级技巧</h2>

<h3 id="1-使用管道进行实时压缩">1. 使用管道进行实时压缩</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 将命令输出直接打包压缩</span>
<span class="nb">ls</span> <span class="nt">-l</span> | <span class="nb">tar</span> <span class="nt">-czvf</span> output.tar.gz <span class="nt">-T</span> -

<span class="c"># 备份数据库</span>
mysqldump <span class="nt">-u</span> root <span class="nt">-p</span> database_name | <span class="nb">gzip</span> <span class="o">&gt;</span> backup.sql.gz

<span class="c"># 解压并直接处理</span>
<span class="nb">tar</span> <span class="nt">-xOzf</span> archive.tar.gz file.txt | <span class="nb">grep</span> <span class="s2">"pattern"</span>
</code></pre></div></div>

<h3 id="2-压缩时排除特定文件">2. 压缩时排除特定文件</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 排除单个文件</span>
<span class="nb">tar</span> <span class="nt">-czvf</span> archive.tar.gz /path/to/dir <span class="nt">--exclude</span><span class="o">=</span><span class="s2">"file.txt"</span>

<span class="c"># 排除多个文件</span>
<span class="nb">tar</span> <span class="nt">-czvf</span> archive.tar.gz /path/to/dir <span class="nt">--exclude</span><span class="o">=</span><span class="s2">"*.log"</span> <span class="nt">--exclude</span><span class="o">=</span><span class="s2">"*.tmp"</span>

<span class="c"># 排除目录</span>
<span class="nb">tar</span> <span class="nt">-czvf</span> archive.tar.gz /path/to/dir <span class="nt">--exclude</span><span class="o">=</span><span class="s2">"node_modules"</span>

<span class="c"># 使用排除文件</span>
<span class="nb">echo</span> <span class="s2">"*.log"</span> <span class="o">&gt;</span> exclude.txt
<span class="nb">echo</span> <span class="s2">"node_modules"</span> <span class="o">&gt;&gt;</span> exclude.txt
<span class="nb">tar</span> <span class="nt">-czvf</span> archive.tar.gz /path/to/dir <span class="nt">-X</span> exclude.txt
</code></pre></div></div>

<h3 id="3-查看压缩文件大小">3. 查看压缩文件大小</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 查看 tar 文件大小</span>
<span class="nb">ls</span> <span class="nt">-lh</span> archive.tar.gz

<span class="c"># 查看 tar 文件中各文件的大小</span>
<span class="nb">tar</span> <span class="nt">-tvf</span> archive.tar.gz | <span class="nb">awk</span> <span class="s1">'{print $3, $6}'</span>

<span class="c"># 计算压缩率</span>
<span class="nv">original_size</span><span class="o">=</span><span class="si">$(</span><span class="nb">du</span> <span class="nt">-sb</span> /path/to/dir | <span class="nb">cut</span> <span class="nt">-f1</span><span class="si">)</span>
<span class="nv">compressed_size</span><span class="o">=</span><span class="si">$(</span><span class="nb">stat</span> <span class="nt">-f</span>%z archive.tar.gz<span class="si">)</span>
<span class="nb">echo</span> <span class="s2">"压缩率: </span><span class="si">$(</span><span class="nb">echo</span> <span class="s2">"scale=2; </span><span class="nv">$compressed_size</span><span class="s2"> * 100 / </span><span class="nv">$original_size</span><span class="s2">"</span> | bc<span class="si">)</span><span class="s2">%"</span>
</code></pre></div></div>

<h3 id="4-验证压缩文件的完整性">4. 验证压缩文件的完整性</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 验证 tar 文件</span>
<span class="nb">tar</span> <span class="nt">-tzvf</span> archive.tar.gz <span class="o">&gt;</span> /dev/null <span class="o">&amp;&amp;</span> <span class="nb">echo</span> <span class="s2">"文件完整"</span> <span class="o">||</span> <span class="nb">echo</span> <span class="s2">"文件损坏"</span>

<span class="c"># 验证 zip 文件</span>
unzip <span class="nt">-t</span> archive.zip

<span class="c"># 使用 md5sum 验证</span>
<span class="nb">md5sum </span>archive.tar.gz <span class="o">&gt;</span> checksum.md5
<span class="nb">md5sum</span> <span class="nt">-c</span> checksum.md5
</code></pre></div></div>

<h3 id="5-解压时保留权限和时间戳">5. 解压时保留权限和时间戳</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># tar 默认保留权限和时间戳</span>
<span class="nb">tar</span> <span class="nt">-xvpf</span> archive.tar

<span class="c"># unzip 保留权限和时间戳</span>
unzip <span class="nt">-o</span> archive.zip

<span class="c"># 解压时设置特定权限</span>
<span class="nb">tar</span> <span class="nt">-xvpf</span> archive.tar <span class="nt">--mode</span><span class="o">=</span>755
</code></pre></div></div>

<h2 id="常见问题及解决方案">常见问题及解决方案</h2>

<table>
  <thead>
    <tr>
      <th style="text-align: left">问题</th>
      <th style="text-align: left">解决方案</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left">解压时文件名乱码</td>
      <td style="text-align: left">使用 <code class="language-plaintext highlighter-rouge">unzip -O GBK</code> 或 <code class="language-plaintext highlighter-rouge">unzip -O UTF-8</code></td>
    </tr>
    <tr>
      <td style="text-align: left">磁盘空间不足</td>
      <td style="text-align: left">使用 <code class="language-plaintext highlighter-rouge">-C</code> 参数解压到其他分区，或使用管道直接处理</td>
    </tr>
    <tr>
      <td style="text-align: left">压缩文件损坏</td>
      <td style="text-align: left">尝试使用 <code class="language-plaintext highlighter-rouge">tar -xvf</code> 的 <code class="language-plaintext highlighter-rouge">--ignore-failed-read</code> 参数</td>
    </tr>
    <tr>
      <td style="text-align: left">解压速度慢</td>
      <td style="text-align: left">使用 <code class="language-plaintext highlighter-rouge">pigz</code> 替代 gzip 进行并行压缩解压</td>
    </tr>
    <tr>
      <td style="text-align: left">文件权限丢失</td>
      <td style="text-align: left">使用 <code class="language-plaintext highlighter-rouge">tar -p</code> 参数保留权限</td>
    </tr>
  </tbody>
</table>

<h2 id="性能优化">性能优化</h2>

<h3 id="1-使用并行压缩工具">1. 使用并行压缩工具</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 安装 pigz（并行 gzip）</span>
<span class="nb">sudo </span>apt-get <span class="nb">install </span>pigz

<span class="c"># 使用 pigz 压缩（速度更快）</span>
<span class="nb">tar</span> <span class="nt">-cvf</span> - /path/to/dir | pigz <span class="nt">-p</span> 4 <span class="o">&gt;</span> archive.tar.gz

<span class="c"># 使用 pigz 解压</span>
pigz <span class="nt">-d</span> <span class="nt">-p</span> 4 archive.tar.gz | <span class="nb">tar</span> <span class="nt">-xvf</span> -
</code></pre></div></div>

<h3 id="2-选择合适的压缩算法">2. 选择合适的压缩算法</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># gzip：速度最快，压缩率中等</span>
<span class="nb">tar</span> <span class="nt">-czvf</span> archive.tar.gz /path/to/dir

<span class="c"># bzip2：压缩率较高，速度较慢</span>
<span class="nb">tar</span> <span class="nt">-cjvf</span> archive.tar.bz2 /path/to/dir

<span class="c"># xz：压缩率最高，速度最慢</span>
<span class="nb">tar</span> <span class="nt">-cJvf</span> archive.tar.xz /path/to/dir
</code></pre></div></div>

<h3 id="3-调整压缩级别">3. 调整压缩级别</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># gzip 压缩级别（1-9，1最快，9压缩率最高）</span>
<span class="nb">tar</span> <span class="nt">-czvf</span> <span class="nt">-1</span> archive.tar.gz /path/to/dir  <span class="c"># 最快</span>
<span class="nb">tar</span> <span class="nt">-czvf</span> <span class="nt">-9</span> archive.tar.gz /path/to/dir  <span class="c"># 最高压缩率</span>

<span class="c"># bzip2 压缩级别（1-9）</span>
<span class="nb">tar</span> <span class="nt">-cjvf</span> <span class="nt">-1</span> archive.tar.bz2 /path/to/dir

<span class="c"># xz 压缩级别（0-9）</span>
<span class="nb">tar</span> <span class="nt">-cJvf</span> <span class="nt">-0</span> archive.tar.xz /path/to/dir
</code></pre></div></div>

<h2 id="总结">总结</h2>

<p><code class="language-plaintext highlighter-rouge">zip</code>、<code class="language-plaintext highlighter-rouge">unzip</code> 和 <code class="language-plaintext highlighter-rouge">tar</code> 是 Linux 系统中不可或缺的压缩解压工具。通过本文介绍的方法，您可以：</p>

<ol>
  <li>熟练使用 <code class="language-plaintext highlighter-rouge">zip</code> 创建各种 <code class="language-plaintext highlighter-rouge">.zip</code> 压缩文件</li>
  <li>熟练使用 <code class="language-plaintext highlighter-rouge">unzip</code> 处理各种 <code class="language-plaintext highlighter-rouge">.zip</code> 压缩文件</li>
  <li>掌握 <code class="language-plaintext highlighter-rouge">tar</code> 的打包和压缩操作</li>
  <li>根据不同场景选择合适的压缩算法</li>
  <li>使用高级技巧提高工作效率</li>
  <li>解决常见的压缩解压问题</li>
</ol>

<p>掌握这些工具的使用技巧，将大大提高您在 Linux 系统中处理文件和目录的效率。无论是日常开发、系统管理还是数据备份，这些工具都能为您提供强大的支持。</p>

<p>建议在实际工作中多加练习，根据具体需求选择最合适的压缩方式和参数，以达到最佳的性能和效果。</p>]]></content><author><name>Henry Zhu</name><email>z1113609151@gmail.com</email></author><category term="linux-command" /><summary type="html"><![CDATA[zip、unzip 和 tar 是 Linux 系统中最常用的三个压缩解压工具。zip 和 unzip 专门用于处理 .zip 格式的压缩文件，其中 zip 用于创建压缩包，unzip 用于解压。而 tar 则主要用于打包多个文件和目录，并可以配合压缩算法（如 gzip、bzip2、xz）进行压缩。本文将重点介绍这三个工具的实用操作和常见场景，帮助您在日常工作中高效地处理各种压缩文件。]]></summary></entry><entry><title type="html">关于Tmux的常用操作</title><link href="https://senmo996.github.io/posts/2024/05/tmux/" rel="alternate" type="text/html" title="关于Tmux的常用操作" /><published>2024-05-01T00:00:00-07:00</published><updated>2024-05-01T00:00:00-07:00</updated><id>https://senmo996.github.io/posts/2024/05/tmux</id><content type="html" xml:base="https://senmo996.github.io/posts/2024/05/tmux/"><![CDATA[<p><code class="language-plaintext highlighter-rouge">tmux</code> (Terminal Multiplexer) 是一个强大的终端复用器。它允许用户在单个终端窗口中创建、管理和切换多个独立的会话（Session）、窗口（Window）和面板（Pane）。<code class="language-plaintext highlighter-rouge">tmux</code> 的核心优势在于其<strong>会话持久化</strong>能力，即使终端关闭或网络断开，您在 <code class="language-plaintext highlighter-rouge">tmux</code> 中运行的任务也能继续在后台执行，随时可以重新连接并恢复工作。这对于远程开发、长时间运行任务以及提升终端工作效率至关重要。</p>

<h2 id="核心概念">核心概念</h2>

<p>在使用 <code class="language-plaintext highlighter-rouge">tmux</code> 之前，理解以下三个核心概念至关重要：</p>

<ol>
  <li><strong>会话 (Session)</strong>:
    <ul>
      <li><code class="language-plaintext highlighter-rouge">tmux</code> 的最高层级。</li>
      <li>每个会话都是一个独立的工作空间，可以包含多个窗口。</li>
      <li>可以有多个会话同时运行。</li>
    </ul>
  </li>
  <li><strong>窗口 (Window)</strong>:
    <ul>
      <li>每个会话可以包含多个窗口。</li>
      <li>每个窗口都相当于一个独立的终端标签页。</li>
    </ul>
  </li>
  <li><strong>面板 (Pane)</strong>:
    <ul>
      <li>每个窗口可以进一步分割成多个面板。</li>
      <li>每个面板都运行一个独立的 shell。</li>
      <li>类似于在同一个终端窗口中分屏。</li>
    </ul>
  </li>
</ol>

<h2 id="tmux-工作流程"><code class="language-plaintext highlighter-rouge">tmux</code> 工作流程</h2>

<p>典型的 <code class="language-plaintext highlighter-rouge">tmux</code> 工作流程包括以下步骤：</p>

<ol>
  <li><strong>启动 <code class="language-plaintext highlighter-rouge">tmux</code> 会话</strong>: 进入 <code class="language-plaintext highlighter-rouge">tmux</code> 环境。</li>
  <li><strong>在会话中工作</strong>: 创建窗口、分割面板，运行命令。</li>
  <li><strong>分离会话 (Detach)</strong>: 暂时离开 <code class="language-plaintext highlighter-rouge">tmux</code> 环境，但会话仍在后台运行。</li>
  <li><strong>重新连接会话 (Attach)</strong>: 重新进入之前分离的 <code class="language-plaintext highlighter-rouge">tmux</code> 会话，恢复工作。</li>
</ol>

<h2 id="tmux-基本指令"><code class="language-plaintext highlighter-rouge">tmux</code> 基本指令</h2>

<p><code class="language-plaintext highlighter-rouge">tmux</code> 的所有操作都通过一个<strong>前缀键 (Prefix Key)</strong> 加上一个命令键来完成。
<strong>默认前缀键</strong>: <code class="language-plaintext highlighter-rouge">Ctrl + b</code>。
这意味着：您需要先按下 <code class="language-plaintext highlighter-rouge">Ctrl + b</code>，然后松开，再按下后续的命令键。</p>

<h3 id="一会话-session-管理">一、会话 (Session) 管理</h3>

<table>
  <thead>
    <tr>
      <th style="text-align: left">指令</th>
      <th style="text-align: left">作用</th>
      <th style="text-align: left">备注</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">tmux</code></td>
      <td style="text-align: left">启动一个新的 <code class="language-plaintext highlighter-rouge">tmux</code> 会话。如果当前没有会话，则创建一个并连接。</td>
      <td style="text-align: left">最简单的启动方式。</td>
    </tr>
    <tr>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">tmux new -s [会话名称]</code></td>
      <td style="text-align: left">启动一个带名称的新会话。例如：<code class="language-plaintext highlighter-rouge">tmux new -s my_project</code>。</td>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">-s</code> 指定会话名称。</td>
    </tr>
    <tr>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">tmux ls</code></td>
      <td style="text-align: left">列出所有当前的 <code class="language-plaintext highlighter-rouge">tmux</code> 会话。</td>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">tmux list-sessions</code> 的简写。</td>
    </tr>
    <tr>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">tmux attach -t [会话名称]</code></td>
      <td style="text-align: left">重新连接到指定名称的会话。例如：<code class="language-plaintext highlighter-rouge">tmux attach -t my_project</code>。</td>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">-t</code> 指定目标会话。如果只有一个会话，直接 <code class="language-plaintext highlighter-rouge">tmux attach</code> 即可。</td>
    </tr>
    <tr>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">Prefix + d</code></td>
      <td style="text-align: left"><strong>分离 (Detach)</strong> 当前的 <code class="language-plaintext highlighter-rouge">tmux</code> 会话。会话在后台继续运行。</td>
      <td style="text-align: left"><strong>最常用操作之一</strong>，用于退出 <code class="language-plaintext highlighter-rouge">tmux</code> 环境而不终止会话。</td>
    </tr>
    <tr>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">tmux kill-session -t [会话名称]</code></td>
      <td style="text-align: left">杀死（结束）指定名称的会话。</td>
      <td style="text-align: left">请谨慎使用，会话中的所有进程都会被终止。</td>
    </tr>
    <tr>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">tmux kill-server</code></td>
      <td style="text-align: left">杀死所有 <code class="language-plaintext highlighter-rouge">tmux</code> 会话和服务器。</td>
      <td style="text-align: left">极少使用，除非您需要彻底清理 <code class="language-plaintext highlighter-rouge">tmux</code> 环境。</td>
    </tr>
  </tbody>
</table>

<h3 id="二窗口-window-管理-前缀键-ctrl--b--命令键">二、窗口 (Window) 管理 (前缀键 <code class="language-plaintext highlighter-rouge">Ctrl + b</code> + 命令键)</h3>

<table>
  <thead>
    <tr>
      <th style="text-align: left">指令</th>
      <th style="text-align: left">作用</th>
      <th style="text-align: left">备注</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">Prefix + c</code></td>
      <td style="text-align: left"><strong>创建</strong>一个新的窗口。</td>
      <td style="text-align: left">新窗口会显示一个新的 shell。</td>
    </tr>
    <tr>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">Prefix + n</code></td>
      <td style="text-align: left">切换到<strong>下一个</strong>窗口。</td>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">n</code> for next。</td>
    </tr>
    <tr>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">Prefix + p</code></td>
      <td style="text-align: left">切换到<strong>上一个</strong>窗口。</td>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">p</code> for previous。</td>
    </tr>
    <tr>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">Prefix + &lt;数字键&gt;</code></td>
      <td style="text-align: left">切换到指定编号的窗口（例如 <code class="language-plaintext highlighter-rouge">Prefix + 0</code> 切换到第一个窗口）。</td>
      <td style="text-align: left">窗口编号从 0 开始。</td>
    </tr>
    <tr>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">Prefix + ,</code></td>
      <td style="text-align: left"><strong>重命名</strong>当前窗口。</td>
      <td style="text-align: left">底部状态栏会提示您输入新名称。</td>
    </tr>
    <tr>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">Prefix + w</code></td>
      <td style="text-align: left"><strong>选择</strong>窗口。会弹出一个交互式列表，显示所有会话和窗口。</td>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">w</code> for window。您可以使用方向键选择，回车确认。</td>
    </tr>
    <tr>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">Prefix + &amp;</code></td>
      <td style="text-align: left"><strong>关闭</strong>当前窗口。</td>
      <td style="text-align: left">会提示确认，<code class="language-plaintext highlighter-rouge">y</code> 确认，<code class="language-plaintext highlighter-rouge">n</code> 取消。</td>
    </tr>
  </tbody>
</table>

<h3 id="三其他常用指令-前缀键-ctrl--b--命令键">三、其他常用指令 (前缀键 <code class="language-plaintext highlighter-rouge">Ctrl + b</code> + 命令键)</h3>

<table>
  <thead>
    <tr>
      <th style="text-align: left">指令</th>
      <th style="text-align: left">作用</th>
      <th style="text-align: left">备注</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">Prefix + [</code></td>
      <td style="text-align: left"><strong>进入复制模式</strong>。允许您向上滚动查看历史输出，并复制文本。</td>
      <td style="text-align: left">进入后，可以使用方向键滚动，<code class="language-plaintext highlighter-rouge">Space</code> 开始选择，<code class="language-plaintext highlighter-rouge">Enter</code> 复制。</td>
    </tr>
    <tr>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">Prefix + ]</code></td>
      <td style="text-align: left"><strong>粘贴</strong> <code class="language-plaintext highlighter-rouge">tmux</code> 内部剪贴板中的内容。</td>
      <td style="text-align: left"> </td>
    </tr>
    <tr>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">Prefix + ?</code></td>
      <td style="text-align: left">显示所有 <code class="language-plaintext highlighter-rouge">tmux</code> 快捷键的帮助信息。</td>
      <td style="text-align: left"> </td>
    </tr>
    <tr>
      <td style="text-align: left"><code class="language-plaintext highlighter-rouge">Prefix + t</code></td>
      <td style="text-align: left">显示一个大时钟。</td>
      <td style="text-align: left"> </td>
    </tr>
  </tbody>
</table>

<h2 id="常用场景示例">常用场景示例</h2>

<ol>
  <li><strong>长时间运行任务</strong>:
    <ul>
      <li><code class="language-plaintext highlighter-rouge">tmux new -s my_build</code> (启动会话)</li>
      <li>运行 <code class="language-plaintext highlighter-rouge">npm install</code> 或 <code class="language-plaintext highlighter-rouge">git clone</code> 等耗时操作。</li>
      <li><code class="language-plaintext highlighter-rouge">Ctrl + b + d</code> (分离会话)</li>
      <li>关闭终端或断开 SSH 连接。</li>
      <li>稍后回来，<code class="language-plaintext highlighter-rouge">tmux attach -t my_build</code> 即可查看任务进度。</li>
    </ul>
  </li>
  <li><strong>分屏工作</strong>:
    <ul>
      <li><code class="language-plaintext highlighter-rouge">tmux</code> (启动会话)</li>
      <li><code class="language-plaintext highlighter-rouge">Ctrl + b + "</code> (垂直分割面板)</li>
      <li><code class="language-plaintext highlighter-rouge">Ctrl + b + %</code> (水平分割面板)</li>
      <li><code class="language-plaintext highlighter-rouge">Ctrl + b + 方向键</code> (在不同面板间切换)</li>
      <li>一个面板运行代码编辑器，一个面板运行服务器，一个面板查看日志。</li>
    </ul>
  </li>
  <li><strong>多项目管理</strong>:
    <ul>
      <li><code class="language-plaintext highlighter-rouge">tmux new -s project_alpha</code></li>
      <li>在 <code class="language-plaintext highlighter-rouge">project_alpha</code> 中工作。</li>
      <li><code class="language-plaintext highlighter-rouge">Ctrl + b + d</code> (分离 <code class="language-plaintext highlighter-rouge">project_alpha</code>)</li>
      <li><code class="language-plaintext highlighter-rouge">tmux new -s project_beta</code></li>
      <li>在 <code class="language-plaintext highlighter-rouge">project_beta</code> 中工作。</li>
      <li><code class="language-plaintext highlighter-rouge">Ctrl + b + d</code> (分离 <code class="language-plaintext highlighter-rouge">project_beta</code>)</li>
      <li><code class="language-plaintext highlighter-rouge">tmux ls</code> (查看所有会话)</li>
      <li><code class="language-plaintext highlighter-rouge">tmux attach -t project_alpha</code> (重新连接到 <code class="language-plaintext highlighter-rouge">project_alpha</code>)</li>
    </ul>
  </li>
</ol>

<h2 id="tmux-配置-tmuxconf"><code class="language-plaintext highlighter-rouge">tmux</code> 配置 (<code class="language-plaintext highlighter-rouge">~/.tmux.conf</code>)</h2>

<p><code class="language-plaintext highlighter-rouge">tmux</code> 可以通过编辑用户主目录下的配置文件 <code class="language-plaintext highlighter-rouge">~/.tmux.conf</code> 进行高度定制，以适应个人工作习惯。常见的定制包括：</p>

<ul>
  <li><strong>更改前缀键</strong>: 许多用户将前缀键从默认的 <code class="language-plaintext highlighter-rouge">Ctrl + b</code> 改为 <code class="language-plaintext highlighter-rouge">Ctrl + a</code>。
    <pre><code class="language-tmux"># ~/.tmux.conf
unbind C-b
set-option -g prefix C-a
bind-key C-a send-prefix
</code></pre>
  </li>
  <li><strong>启用鼠标支持</strong>: 允许使用鼠标点击切换面板、调整大小、滚动。
    <pre><code class="language-tmux"># ~/.tmux.conf
set -g mouse on
</code></pre>
  </li>
  <li><strong>状态栏美化</strong>: 自定义底部状态栏显示的信息和颜色，使其更具信息量和个性化。</li>
</ul>

<h2 id="示例">示例</h2>

<p><img src="/images/image-tmux.png" alt="image-20240430201442546" /></p>

<p>图中，[2]表示会话编号或会话名称。0:bash,1:2,2:666表示存在三个窗口，窗口编号分别为0,1,2;窗口名称分别为bash,2,666。*表示当前所处的为窗口0。</p>]]></content><author><name>Henry Zhu</name><email>z1113609151@gmail.com</email></author><category term="linux-command" /><summary type="html"><![CDATA[tmux (Terminal Multiplexer) 是一个强大的终端复用器。它允许用户在单个终端窗口中创建、管理和切换多个独立的会话（Session）、窗口（Window）和面板（Pane）。tmux 的核心优势在于其会话持久化能力，即使终端关闭或网络断开，您在 tmux 中运行的任务也能继续在后台执行，随时可以重新连接并恢复工作。这对于远程开发、长时间运行任务以及提升终端工作效率至关重要。]]></summary></entry></feed>