<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
>
<channel>
<title><![CDATA[EMSHOP]]></title> 
<atom:link href="https://em.ihehe.me/rss.php" rel="self" type="application/rss+xml" />
<description><![CDATA[]]></description>
<link>https://em.ihehe.me/</link>
<language>zh-cn</language>
<generator>www.baidu.com</generator>
<item>
    <title>Git撤销合并操作</title>
    <link>https://em.ihehe.me/?blog=3</link>
    <description><![CDATA[<h2>什么是Git合并冲突？</h2>
<p>当两个分支修改了同一部分代码并尝试合并时，Git无法自动决定采用哪个版本，就会产生合并冲突。解决冲突后，有时我们可能需要撤销这次合并操作。</p>
<div class="warning"><strong>警告：</strong>撤销合并操作可能会导致代码丢失，请在操作前确保已备份重要更改或充分理解操作的影响。</div>
<h2>撤销合并的几种情况</h2>
<p>根据合并后是否已经推送到远程仓库，撤销方法有所不同：</p>
<ul>
<li><strong>本地合并未推送：</strong>可以直接使用Git命令撤销</li>
<li><strong>已推送至远程：</strong>需要更谨慎的操作以避免影响其他协作者</li>
</ul>
<h2>撤销本地未推送的合并</h2>
<h3>方法一：使用 git reset（推荐用于本地分支）</h3>
<p>如果合并后还没有进行其他提交，可以使用以下命令：</p>
<pre>$ git reset --hard HEAD~1</pre>
<p>参数说明：</p>
<ul>
<li>--hard：完全丢弃工作区和暂存区的更改</li>
<li>HEAD~1：回到上一个提交状态</li>
</ul>
<p>如果需要回到指定的提交：</p>
<pre>$ git reset --hard &lt;commit-hash&gt;</pre>
<p>可以通过以下命令查找提交历史：</p>
<pre>$ git log --oneline</pre>
<h3>方法二：使用 git revert（适用于任何情况）</h3>
<p>创建一个新的提交来抵消合并操作：</p>
<pre>$ git revert -m 1 &lt;merge-commit-hash&gt;</pre>
<p>参数说明：</p>
<ul>
<li>-m 1：指定保留第一个父分支（通常是主分支）</li>
<li>&lt;merge-commit-hash&gt;：合并提交的哈希值</li>
</ul>
<h2>撤销已推送的合并</h2>
<h3>使用 git revert（推荐方法）</h3>
<p>这是最安全的方法，不会改写历史：</p>
<pre>$ git revert -m 1 &lt;merge-commit-hash&gt;
$ git push origin &lt;branch-name&gt;</pre>
<h3>使用 git reset（慎用）</h3>
<p>此方法会改写历史，影响其他协作者：</p>
<pre>$ git reset --hard &lt;commit-before-merge&gt;
$ git push --force-with-lease origin &lt;branch-name&gt;</pre>
<p class="warning"><strong>注意：</strong>强制推送会影响所有协作者，需提前沟通确认。</p>
<h2>查找合并提交的哈希值</h2>
<p>要撤销合并，首先需要找到合并提交的哈希值：</p>
<pre>$ git log --merges --oneline</pre>
<p>或者查看最近的提交历史：</p>
<pre>$ git log --oneline -10</pre>
<p>带有"Merge"字样的提交就是合并提交。</p>
<h2>实际操作示例</h2>
<p>假设我们有一个错误的合并需要撤销：</p>
<pre># 查看提交历史
$ git log --oneline
a1b2c3d (HEAD -&gt; master) Merge branch 'feature'
e4f5g6h Add feature files
i7j8k9l Fix bug in main

# 方法1：使用 revert 撤销合并
$ git revert -m 1 a1b2c3d
$ git push origin master

# 方法2：使用 reset 回退（仅限本地）
$ git reset --hard i7j8k9l
</pre>
<h2>特殊情况处理</h2>
<h3>撤销 squash merge</h3>
<p>如果使用了 squash merge（压缩合并），撤销方法略有不同：</p>
<pre>$ git reset --hard HEAD~1</pre>
<h3>撤销 fast-forward 合并</h3>
<p>对于快进合并，可以直接重置到合并前的提交：</p>
<pre>$ git reset --hard &lt;commit-before-merge&gt;</pre>
<h2>常见问题及解决方案</h2>
<table class="layui-table">
<thead>
<tr>
<th>问题</th>
<th>解决方案</th>
</tr>
</thead>
<tbody>
<tr>
<td>找不到合并提交</td>
<td>使用 git log --merges 查看所有合并提交</td>
</tr>
<tr>
<td>revert 失败</td>
<td>可能需要手动解决冲突后再提交</td>
</tr>
<tr>
<td>reset 后需要恢复</td>
<td>使用 git reflog 找到之前的提交并恢复</td>
</tr>
<tr>
<td>其他人已经基于合并提交进行了工作</td>
<td>只能使用 git revert 而不是 git reset</td>
</tr>
</tbody>
</table>
<h2>使用 git reflog 恢复误删的提交</h2>
<p>如果不小心撤销了错误的合并，可以通过 reflog 恢复：</p>
<pre># 查看引用日志
$ git reflog

# 恢复到特定提交
$ git reset --hard &lt;commit-hash&gt;</pre>
<h2>最佳实践建议</h2>
<ul>
<li>在执行撤销操作前，先使用 git log 或 git reflog 确认当前状态</li>
<li>团队协作时优先使用 git revert 而不是 git reset</li>
<li>撤销操作前先备份重要更改</li>
<li>与团队成员沟通后再执行可能影响他人的操作</li>
<li>定期推送代码以减少本地大量提交的风险</li>
</ul>
<h2>总结</h2>
<p>撤销Git合并操作是开发者必备的技能之一。根据具体情况选择合适的撤销方法非常重要：<br>- 对于本地未推送的合并，可以使用 git reset<br>- 对于已推送的合并，推荐使用 git revert<br>- 无论使用哪种方法，操作前都要确认影响范围并做好备份</p>]]></description>
    <pubDate>Wed, 10 Dec 2025 14:54:16 +0800</pubDate>
    <dc:creator>管理员</dc:creator>
    <guid>https://em.ihehe.me/?blog=3</guid>
</item>
<item>
    <title>Git关联远程仓库命令</title>
    <link>https://em.ihehe.me/?blog=2</link>
    <description><![CDATA[<h2>什么是Git远程仓库？</h2>
<p>远程仓库是指托管在网络上的Git仓库，可以实现代码备份、团队协作和版本管理等功能。常见的远程仓库服务有GitHub、GitLab、Gitee等。</p>
<h2>关联远程仓库的意义</h2>
<ul>
<li>代码备份：避免本地数据丢失</li>
<li>团队协作：多人共同维护项目</li>
<li>版本追踪：记录所有变更历史</li>
<li>开源分享：向社区贡献代码</li>
</ul>
<h2>准备工作</h2>
<p>在开始之前，请确保您已完成以下准备：</p>
<ol>
<li>已安装Git并完成基本配置</li>
<li>已在远程平台（如GitHub）创建账号</li>
<li>已创建远程仓库</li>
<li>已配置SSH密钥（可参考我们的<a href="../?blog=1" target="_blank" rel="noopener">SSH密钥配置教程</a>）</li>
</ol>
<h2>将本地仓库推送到新的远程仓库</h2>
<h3>第一步：在远程平台创建空仓库</h3>
<p>以GitHub为例：</p>
<ol>
<li>登录GitHub账户</li>
<li>点击右上角"+"号，选择"New repository"</li>
<li>填写仓库名称（建议与本地项目同名）</li>
<li>选择公开或私有</li>
<li><strong>重要</strong>：不要初始化README、.gitignore或license</li>
<li>点击"Create repository"</li>
</ol>
<h3>第二步：在本地项目目录初始化Git</h3>
<pre>$ cd /path/to/your/project
$ git init</pre>
<h3>第三步：添加文件并提交</h3>
<pre>$ git add .
$ git commit -m "Initial commit"</pre>
<h3>第四步：关联远程仓库</h3>
<pre>$ git remote add origin git@github.com:yourusername/repository-name.git</pre>
<p>其中origin是远程仓库的别名，可以自定义其他名称。</p>
<h3>第五步：推送代码到远程仓库</h3>
<pre>$ git push -u origin master</pre>
<p>如果是新版本Git，默认分支可能是main而非master：</p>
<pre>$ git push -u origin main</pre>
<p>参数说明：</p>
<ul>
<li>-u：建立本地分支与远程分支的关联</li>
<li>origin：远程仓库别名</li>
<li>master/main：要推送到的远程分支名</li>
</ul>
<h2>克隆远程仓库到本地</h2>
<p>如果您需要将远程仓库的代码下载到本地：</p>
<pre>$ git clone git@github.com:username/repository-name.git
$ cd repository-name</pre>
<p>这样会自动完成远程仓库的关联，无需手动执行git remote add。</p>
<h2>关联多个远程仓库</h2>
<p>有时我们需要同时关联多个远程仓库（如同时推送到GitHub和GitLab）：</p>
<pre>$ git remote add github git@github.com:username/repo.git
$ git remote add gitlab git@gitlab.com:username/repo.git
$ git push github master
$ git push gitlab master</pre>
<h2>查看和管理远程仓库</h2>
<h3>查看已关联的远程仓库</h3>
<pre>$ git remote -v</pre>
<h3>修改远程仓库地址</h3>
<pre>$ git remote set-url origin new_git_url</pre>
<h3>删除远程仓库关联</h3>
<pre>$ git remote remove origin</pre>
<h2>常见问题及解决方案</h2>
<table class="layui-table">
<thead>
<tr>
<th>问题</th>
<th>解决方案</th>
</tr>
</thead>
<tbody>
<tr>
<td>fatal: remote origin already exists</td>
<td>先执行 git remote remove origin 再重新添加</td>
</tr>
<tr>
<td>Permission denied (publickey)</td>
<td>检查SSH密钥配置是否正确</td>
</tr>
<tr>
<td>error: failed to push some refs</td>
<td>可能需要先执行 git pull 同步远程更改</td>
</tr>
<tr>
<td>Updates were rejected because the tip of your current branch is behind</td>
<td>使用 git push -f 强制推送（谨慎使用）或先 git pull</td>
</tr>
</tbody>
</table>
<h2>最佳实践</h2>
<ul>
<li>推送前先拉取远程更新：git pull</li>
<li>编写有意义的提交信息</li>
<li>定期推送代码到远程仓库</li>
<li>使用分支进行功能开发</li>
<li>保护主分支，避免直接推送</li>
</ul>
<h2>总结</h2>
<p>通过以上步骤，您可以轻松地将本地Git仓库与远程仓库进行关联。这不仅能保障代码安全，还能促进团队协作。掌握这些操作是每个开发者必备的技能。</p>]]></description>
    <pubDate>Wed, 10 Dec 2025 14:53:42 +0800</pubDate>
    <dc:creator>管理员</dc:creator>
    <guid>https://em.ihehe.me/?blog=2</guid>
</item>
<item>
    <title>Linux centos系统git生成ssl公钥</title>
    <link>https://em.ihehe.me/?blog=1</link>
    <description><![CDATA[<h2>什么是Git SSH密钥？</h2>
<p>SSH密钥是一种安全的身份验证方式，用于访问远程Git仓库（如GitHub、GitLab等）。相比用户名密码认证，SSH密钥更加安全且方便。</p>
<h2>为什么需要生成SSH密钥？</h2>
<ul>
<li>提高安全性：避免每次输入用户名密码</li>
<li>提升效率：无需重复身份验证</li>
<li>防止中间人攻击：通过加密连接保护代码传输</li>
</ul>
<h2>在CentOS下生成SSH密钥步骤</h2>
<h3>第一步：检查是否已存在SSH密钥</h3>
<pre><code>$ ls -al ~/.ssh</code></pre>
<p>如果看到类似 id_rsa 和 id_rsa.pub 的文件，则表示已有SSH密钥对。</p>
<h3>第二步：生成新的SSH密钥</h3>
<pre><code>$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"</code></pre>
<p>参数说明：</p>
<ul>
<li>-t rsa：指定密钥类型为RSA</li>
<li>-b 4096：指定密钥长度为4096位（更安全）</li>
<li>-C：添加注释，通常为你的邮箱地址</li>
</ul>
<h3>第三步：设置密钥保存位置和密码</h3>
<pre><code>Enter file in which to save the key (/home/username/.ssh/id_rsa): [直接按回车使用默认路径]
Enter passphrase (empty for no passphrase): [输入密码或留空]
Enter same passphrase again: [再次确认密码]</code></pre>
<p>建议设置密码以增强安全性，即使私钥被窃取也需要密码才能使用。</p>
<h3>第四步：启动SSH代理并添加密钥</h3>
<pre>$ eval "$(ssh-agent -s)"
$ ssh-add ~/.ssh/id_rsa</pre>
<h3>第五步：获取公钥内容</h3>
<pre>$ cat ~/.ssh/id_rsa.pub</pre>
<p>复制输出的内容，这就是你的SSH公钥，用于添加到GitHub、GitLab等平台。</p>
<h2>将SSH密钥添加到GitHub</h2>
<ol>
<li>登录GitHub账户</li>
<li>点击右上角头像，选择"Settings"</li>
<li>在左侧菜单中选择"SSH and GPG keys"</li>
<li>点击"New SSH key"按钮</li>
<li>填写Title（例如："My CentOS Workstation"）</li>
<li>将之前复制的公钥粘贴到"Key"字段</li>
<li>点击"Add SSH key"</li>
</ol>
<h2>测试SSH连接</h2>
<pre>$ ssh -T git@github.com</pre>
<p>如果看到类似以下信息，说明配置成功：</p>
<pre>Hi username! You've successfully authenticated, but GitHub does not provide shell access.</pre>
<h2>常见问题及解决方案</h2>
<table class="layui-table">
<thead>
<tr>
<th>问题</th>
<th>解决方案</th>
</tr>
</thead>
<tbody>
<tr>
<td>Permission denied (publickey)</td>
<td>确保正确启动了ssh-agent并添加了密钥</td>
</tr>
<tr>
<td>密钥权限不正确</td>
<td>运行 chmod 700 ~/.ssh 和 chmod 600 ~/.ssh/*</td>
</tr>
<tr>
<td>提示密钥格式错误</td>
<td>重新生成密钥，确保没有意外字符</td>
</tr>
</tbody>
</table>
<h2>总结</h2>
<p>通过以上步骤，你已经成功在CentOS系统下为Git生成了SSH密钥。这不仅提高了工作效率，也增强了代码仓库的安全性。建议定期更换SSH密钥以保持最佳安全性。</p>]]></description>
    <pubDate>Wed, 10 Dec 2025 14:53:29 +0800</pubDate>
    <dc:creator>管理员</dc:creator>
    <guid>https://em.ihehe.me/?blog=1</guid>
</item></channel>
</rss>