<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Git - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ freeCodeCamp 是一个免费学习编程的开发者社区，涵盖 Python、HTML、CSS、React、Vue、BootStrap、JSON 教程等，还有活跃的技术论坛和丰富的社区活动，在你学习编程和找工作时为你提供建议和帮助。 ]]>
        </description>
        <link>https://www.freecodecamp.org/chinese/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Git - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/chinese/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Thu, 14 May 2026 19:59:01 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/chinese/news/tag/git/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Git 拉取远程分支 ]]>
                </title>
                <description>
                    <![CDATA[ Git 是一种流行的版本控制系统，数百万开发人员使用它来管理自己的代码库。Git [https://kinsta.com/knowledgebase/install-git/]最强大的功能之一是通过远程仓库协同工作的能力。 在一个项目中与多人合作时，你必须能够从远程仓库中获取变更并将其与本地仓库合并。本文将教你如何在 Git 中获取远程分支。 什么是远程分支？ 在了解如何获取远程分支之前，让我们先定义一下远程分支。 远程分支是指存在于 GitHub [https://kinsta.com/knowledgebase/git-vs-github/]、GitLab 或 Bitbucket 等远程仓库中的分支。 克隆一个仓库时，Git 会自动创建一个指向原始仓库的 “remote”分支。然后，你就可以用这个远程分支来获取项目中其他协作者所做的修改。 如何在 Git 中获取远程分支 当你克隆一个仓库时，你可以访问它的所有远程分支。你可以使用git branch命令和-r选项来验证这一点： git branch -r 你可以使用git checkout命令签出到这些分支中的任何一 ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/git-pull-remote-branch-how-to-fetch-remote-branches-in-git/</link>
                <guid isPermaLink="false">661367403fc36503d53aca02</guid>
                
                    <category>
                        <![CDATA[ Git ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Chengjun.L ]]>
                </dc:creator>
                <pubDate>Wed, 28 Aug 2024 10:29:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2024/04/roman-synkevych-wX2L8L-fGeA-unsplash--1-.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>原文：</strong> <a href="https://www.freecodecamp.org/news/git-pull-remote-branch-how-to-fetch-remote-branches-in-git/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Git Pull Remote Branch – How To Fetch Remote Branches in Git</a>
      </p><p>Git 是一种流行的版本控制系统，数百万开发人员使用它来管理自己的代码库。<a href="https://kinsta.com/knowledgebase/install-git/">Git</a>最强大的功能之一是通过远程仓库协同工作的能力。</p><p>在一个项目中与多人合作时，你必须能够从远程仓库中获取变更并将其与本地仓库合并。本文将教你如何在 Git 中获取远程分支。</p><h2 id="-"><strong>什么是远程分支？</strong></h2><p>在了解如何获取远程分支之前，让我们先定义一下远程分支。</p><p>远程分支是指存在于 <a href="https://kinsta.com/knowledgebase/git-vs-github/">GitHub</a>、GitLab 或 Bitbucket 等远程仓库中的分支。</p><p>克隆一个仓库时，Git 会自动创建一个指向原始仓库的 “remote”分支。然后，你就可以用这个远程分支来获取项目中其他协作者所做的修改。</p><h2 id="-git-"><strong>如何在 Git 中获取远程分支</strong></h2><p>当你克隆一个仓库时，你可以访问它的所有远程分支。你可以使用<code>git branch</code>命令和<code>-r</code>选项来验证这一点：</p><pre><code class="language-bash">git branch -r
</code></pre><figure class="kg-card kg-image-card"><img src="https://paper-attachments.dropboxusercontent.com/s_4A23CAD3B56D51AD7DA85730E428F7A2E6F6289B6BB197975176BE233B3F0EA9_1682869187912_image.png" class="kg-image" alt="s_4A23CAD3B56D51AD7DA85730E428F7A2E6F6289B6BB197975176BE233B3F0EA9_1682869187912_image" width="2074" height="188" loading="lazy"></figure><p>你可以使用<code>git checkout</code>命令签出到这些分支中的任何一个。</p><p>当你与一群人一起工作时，其中一个贡献者会远程创建一个新的分支。你可能需要将这个远程分支拉取到你的项目中。你可以使用<code>git fetch</code>命令来完成这项工作。</p><p><code>git fetch</code>命令会转向你的远程项目，并从该远程项目中拉取你还没有的所有数据。接着，你就可以获得该远程分支的所有引用，随时可以合并或检查这些引用。</p><pre><code class="language-bash">git fetch
</code></pre><p>你可以写上远程仓库库名称，默认为<code>origin</code>：</p><pre><code class="language-bash">git fetch origin
</code></pre><p>需要注意的是，当你使用<code>git fetch</code>命令时，它只会将远程仓库中的更改下载到本地仓库，而不会自动与你的工作合并，也不会修改你当前的工作。你需要在准备就绪后手动合并更改。</p><p>要访问获取的内容，需要使用<code>git checkout</code>命令。这样就能确保在将提交整合到本地仓库之前，对提交进行审核。</p><p>如果想获取远程分支并将其与自己的工作合并或修改当前工作，可以使用<code>git pull</code>命令。为此，请使用以下命令：</p><pre><code class="language-bash">git pull --all
</code></pre><p>然后就可以运行<code>git branch -r</code>来验证远程仓库是否已被添加。</p><h2 id="--1"><strong>总结</strong></h2><p>在 Git 中获取远程分支是开发环境中协作的一个重要方面。</p><p>按照本文概述的步骤，你就能获取其他协作者在远程分支上所做的改动，并将它们与本地仓库合并。这样，你就能在 Git 仓库的不同分支上工作，并与其他开发人员有效协作。</p><p>开启学习之旅，<a href="https://joelolawanle.com/contents">浏览 200 多篇关于 web 开发的专业文章</a>。查看<a href="https://joelolawanle.com/posts">我的博客</a>，获取更多精彩内容。</p><p>祝你编码愉快！</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Git Rebase 手册 ]]>
                </title>
                <description>
                    <![CDATA[ 开发人员的工具箱中最强大的工具之一是git rebase。但它因复杂和被误解而臭名昭著。 事实上，如果你了解它的实际作用，git rebase是一个非常优雅和直接的工具，可以实现 Git 中许多不同的事情。 在之前的文章中，你了解了 什么是 Git diff [https://www.freecodecamp.org/news/git-diff-and-patch/]、什么是 merge [https://www.freecodecamp.org/news/the-definitive-guide-to-git-merge/]以及 Git 如何解决合并冲突(merge conflicts) [https://www.freecodecamp.org/news/the-definitive-guide-to-git-merge/] 。在这篇文章中，你将了解什么是 Git rebase，为什么它与 merge 不同，以及如何放心地进行 rebase 💪🏻 开始前的说明  1. 我还制作了一个涵盖本文内容的视频。如果你想在阅读的同时观看视频，可以在这里 [https://youtu ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/git-rebase-handbook/</link>
                <guid isPermaLink="false">65df05784985d903ee575ea1</guid>
                
                    <category>
                        <![CDATA[ Git ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ luojiyin ]]>
                </dc:creator>
                <pubDate>Wed, 28 Feb 2024 10:19:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2024/02/The-Git-Rebase-Handbook-Book-Cover--1-.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>原文：</strong> <a href="https://www.freecodecamp.org/news/git-rebase-handbook/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">The Git Rebase Handbook – A Definitive Guide to Rebasing</a>
      </p><!--kg-card-begin: markdown--><p>开发人员的工具箱中最强大的工具之一是<code>git rebase</code>。但它因复杂和被误解而臭名昭著。</p>
<p>事实上，如果你了解它的实际作用，<code>git rebase</code>是一个非常优雅和直接的工具，可以实现 Git 中许多不同的事情。</p>
<p>在之前的文章中，你了解了 <a href="https://www.freecodecamp.org/news/git-diff-and-patch/">什么是 Git diff</a>、<a href="https://www.freecodecamp.org/news/the-definitive-guide-to-git-merge/">什么是 merge</a>以及 <a href="https://www.freecodecamp.org/news/the-definitive-guide-to-git-merge/">Git 如何解决合并冲突(merge conflicts)</a>。在这篇文章中，你将了解什么是 Git rebase，为什么它与 merge 不同，以及如何放心地进行 rebase 💪🏻</p>
<h2 id="">开始前的说明</h2>
<ol>
<li>我还制作了一个涵盖本文内容的视频。如果你想在阅读的同时观看视频，可以在<a href="https://youtu.be/3VFsitGUB3s">这里</a>查看。</li>
<li>如果你想玩玩我用的软件库，自己试试这些命令，<a href="https://github.com/Omerr/rebase_playground">这里</a>是软件库。</li>
<li>我正在写一本关于 Git 的书！你有兴趣阅读初始版本并提供反馈吗？请给我发<a href="https://chinese.freecodecamp.org/news/git-rebase-handbook/gitting.things@gmail.com">邮件</a></li>
</ol>
<p>好了，你准备好了吗？</p>
<h1 id="gitmerge">简要回顾 Git Merge🤔</h1>
<p>从底层来讲，<code>git rebase</code>和<code>git merge</code>是非常、非常不同的事情。那为什么人们一直在比较它们呢？</p>
<p>原因是它们的用法。使用 Git 时，我们通常在不同的分支工作，并对这些分支进行修改。</p>
<p>在<a href="https://www.freecodecamp.org/news/the-definitive-guide-to-git-merge/#howgits3waymergealgorithmworks">以前的教程</a>中，我举了一个例子，John 和 paul（披头士乐队）正在共同创作一首新歌。他们从<code>main</code>分支开始，然后各自发散，修改歌词并提交他们的修改。</p>
<p>然后，两人想整合他们的改动，这是使用 Git 工作时经常发生的事情。</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/image-197.png" alt="image-197" width="600" height="400" loading="lazy"></p>
<p>分歧（diverged）的历史 - <code>paul_branch</code> 和 <code>john_branch</code> 与 <code>main</code>分歧（来源：<a href="https://youtu.be/3VFsitGUB3s">Brief</a>）</p>
<p>在 Git 中，有两种主要的方式来整合不同分支的变化，或者说，不同的提交和提交历史。它们是 merge 和 rebase。</p>
<p><a href="https://www.freecodecamp.org/news/the-definitive-guide-to-git-merge/">在之前的教程中</a>，我们对 <code>git merge</code> 有了相当的了解。我们看到，在执行合并时，我们会创建一个 <strong>合并提交（merge Commit）</strong>,这个提交的内容是两个分支的组合，它也有两个父分支，每个分支一个。</p>
<p>所以，假设你在分支<code>john_branch</code>上（假设是上图中描述的历史），你运行<code>git merge paul_branch</code>。你会得到这样的状态--在<code>john_branch</code>上，有一个新的提交，有两个父分支。第一个是合并前<code>HEAD</code>指向的<code>john_branch</code>分支上的提交，本例中是 <code>Commit 6</code>。第二个是 <code>paul_branch</code> 所指向的提交 <code>Commit 9</code>。</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/image-196.png" alt="image-196" width="600" height="400" loading="lazy"></p>
<p>运行<code>git merge paul_branch</code>的结果：一个新的合并提交（Merge Commit），有两个父分支（Source：<a href="https://youtu.be/3VFsitGUB3s">Brief</a>）</p>
<p>再看一下历史图：你创建了一个 <strong>分歧的（diverged）</strong> 历史。你实际上可以看到它在哪里分叉（branched），在哪里又合并了（merged）。</p>
<p>所以当使用<code>git merge</code>时，你并没有重写历史--而是在现有的历史中增加一个提交。具体来说，是在现有的历史中增加一个提交，创造一个分歧（diverged）的历史。</p>
<h1 id="gitrebasegitmerge"><code>git rebase</code> 和 <code>git merge</code> 有什么区别🤔</h1>
<p>当使用<code>git rebase</code>时，会发生不同的情况。🥁</p>
<p>让我们从大的方面开始：如果你在<code>paul_branch</code>上，并使用<code>git rebase john_branch</code>，Git 会去找 John 的分支和 Paul 的分支的共同祖先。然后把 Paul 分支的提交中引入的补丁，应用到 John 分支。</p>
<p>所以在这里，你用<code>rebase</code>把在一个分支，Paul 的分支上提交的修改，在另一个分支<code>john_branch</code>上重演（replay）。</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/image-198.png" alt="image-198" width="600" height="400" loading="lazy"></p>
<p>运行<code>git rebase john_branch</code>的结果：<code>paul_branch</code>上的提交被 <code>重演（replay）</code> 到 <code>john_branch</code>之上（来源：<a href="https://youtu.be/3VFsitGUB3s">Brief</a>）</p>
<p>等等，那是什么意思？🤔</p>
<p>我们现在将一点一点地进行分析，以确保你完全理解在底层发生的事情 😎</p>
<h1 id="cherrypickrebase">以 <code>cherry-pick</code> 作为 Rebase 的基础</h1>
<p>使用 git rebase 可以理解为执行 <code>git cherry-pick</code>，<code>git cherry-pick</code> 是一个命令，它接受一个提交，计算出该提交引入的补丁（patch），即计算出父提交和该提交之间的差异，并且通过 <code>cherry-pick</code> 将这个差异<code>重演（replay）</code>出来。</p>
<p>让我们手动来做这个。</p>
<p>如果我们通过执行<code>git diff main &lt;SHA_OF_Commit_5&gt;</code>来看看 <code>Commit 5</code> 引入的差异:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/image-199.png" alt="image-199" width="600" height="400" loading="lazy"></p>
<p>运行 <code>git diff</code> 来观察 <code>Commit 5</code> 引入的补丁（Source：<a href="https://youtu.be/3VFsitGUB3s">Brief</a>）</p>
<p>如果你想玩玩我用的版本库，自己试试这些命令，<a href="https://github.com/Omerr/rebase_playground">这里</a>是版本库。</p>
<p>你可以看到，在这个提交中，John 开始创作一首名为 <code>Lucy in the Sky with Diamonds</code> 的歌曲：</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/image-200.png" alt="image-200" width="600" height="400" loading="lazy"></p>
<p><code>git diff</code>的输出结果,<code>Commit 5</code> 引入的补丁(patch) (来源: <a href="https://youtu.be/3VFsitGUB3s">Brief</a>)</p>
<p>提醒一下，你也可以使用<code>git show</code>命令来获得同样的输出：</p>
<pre><code class="language-shell">git show &lt;SHA_OF_Commit_5&gt;
</code></pre>
<p>现在，如果你<code>cherry-pick</code>这个提交，你将在活动分支(active branch)上专门引入这个改动。先切换到 "main":</p>
<p><code>git checkout main</code> (or <code>git switch main</code>)</p>
<p>并创建另一个分支，只是为了明确:</p>
<p><code>git checkout -b my_branch</code> (or <code>git switch -c my_branch</code>)</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/image-201.png" alt="image-201" width="600" height="400" loading="lazy"></p>
<p>从 <code>main</code> 分支创建出 <code>my_branch</code> 分支 (源自: <a href="https://youtu.be/3VFsitGUB3s">Brief</a>)</p>
<p><code>cherry-pick</code>这个提交(Commit):</p>
<pre><code class="language-shell">git cherry-pick &lt;SHA_OF_Commit_5&gt;
</code></pre>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/image-202.png" alt="image-202" width="600" height="400" loading="lazy"></p>
<p>使用 <code>cherry-pick</code> 将 <code>Commit 5</code> 中引入的修改应用到 <code>main</code>上（来源：<a href="https://youtu.be/3VFsitGUB3s">Brief</a>）<br>
考虑一下日志（<code>git lol</code>的输出）：</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/image-205.png" alt="image-205" width="600" height="400" loading="lazy"></p>
<p><code>git lol</code>的输出（源自：<a href="https://youtu.be/3VFsitGUB3s">Brief</a>）</p>
<p>(<code>git lol</code>是我加在 Git 上的一个别名，用来以图形的方式直观地查看历史。你可以找到它<a href="https://gist.github.com/Omerr/8134a61b56ca82dd90e546e7ef04eb77">这里</a>)。</p>
<p>你似乎是复制了 <code>Commit 5</code>。请记住，尽管它有相同的提交信息，并引入了相同的修改，甚至在这种情况下指向与原始 <code>Commit 5</code>相同的树对象,它仍然是一个不同的提交对象，因为它是以不同的时间戳创建的。</p>
<p>看一下这些变化，使用<code>git show HEAD</code>:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/image-204.png" alt="image-204" width="600" height="400" loading="lazy"></p>
<p><code>git show HEAD</code>的输出结果（Source：<a href="https://youtu.be/3VFsitGUB3s">Brief</a>）</p>
<p>它们与 <code>Commit 5</code> 的相同。</p>
<p>当然，如果你看一下这个文件（比如，用<code>nano lucy_in_the_sky_with_diamonds.md</code>），它的状态和最初的 <code>Commit 5</code> 之后的状态是一样的。</p>
<p>酷! 😎</p>
<p>好了，现在你可以删除新的分支，这样它就不会每次都出现在你的历史记录上:</p>
<pre><code class="language-shell">git checkout main
git branch -D my_branch
</code></pre>
<h2 id="cherrypickgitrebase">在 <code>cherry-pick</code> 之外– 如何使用 <code>git rebase</code></h2>
<p>你可以把 <code>git rebase</code> 看成是一个接一个地执行多个 <code>cherry-pick</code> 的方法，也就是 <code>重放(replay)</code>多个提交。这不是<code>rebase</code>唯一能做的事情，但它是我们解释的一个很好的起点。<br>
是时候玩玩<code>git rebase</code>了！ 👏🏻👏🏻</p>
<p>之前，你把 <code>paul_branch</code> 合并到了 <code>john_branch</code>。如果把<code>paul_branch</code> <em>rebased</em> <code>john_branch</code>，会发生什么呢？你会得到一个非常不同的历史(history)。</p>
<p>从本质上说，就好像我们把在<code>paul_branch</code>上的提交中引入的变更，在<code>john_branch</code>上重放(replay)一样。结果就是一个 <strong>线性</strong> 历史。[译者注：<code>git log --graph</code> 输出历史的是直线的，没有分叉]</p>
<p>为了理解这个过程，我将提供一个高层视图，然后深入到每一步。将一个分支重定向(rebasing)到另一个分支之上的过程如下:</p>
<ol>
<li>找到共同的祖先(ancestor)。</li>
<li>确定要 <code>重放(replayed)</code>的提交。</li>
<li>对于每个提交<code>X</code>，计算<code>diff(parent(X), X)</code>，并存储为<code>patch(X)</code>。</li>
<li>移动 <code>HEAD</code> 到新的基(base).</li>
<li>在目标分支上按顺序应用生成的补丁。每次都用新的状态创建一个新的提交对象。</li>
</ol>
<p>在新提交中使用与现有提交相同的变更集的过程也被称为 <strong>重放(replaying)</strong>，我们已经使用过这个术语。</p>
<h1 id="rebase">是时候亲手操作 Rebase 了🙌🏻</h1>
<p>从 Paul 的分支开始：</p>
<pre><code class="language-shell">git checkout paul_branch
</code></pre>
<p>这是提交历史：</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/image-206.png" alt="image-206" width="600" height="400" loading="lazy"></p>
<p>执行<code>git rebase</code>前的提交历史（Source: <a href="https://youtu.be/3VFsitGUB3s">Brief</a>）</p>
<p>现在，进入激动人心的部分：</p>
<pre><code class="language-shell">git rebase john_branch
</code></pre>
<p>查看历史:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/image-207.png" alt="image-207" width="600" height="400" loading="lazy"></p>
<p>rebase 后的历史（Source: <a href="https://youtu.be/3VFsitGUB3s">Brief</a>）</p>
<p>( <code>gg</code> 是我的 <a href="https://youtu.be/3VFsitGUB3s">视频</a> 中介绍的一个外部工具的别名). [译者注: <a href="https://github.com/mlange-42/git-graph">git-graph</a>]</p>
<p>因此，使用 <code>git merge</code> 你增加了历史(history)，而使用 <code>git rebase</code>, 你改写了历史。你创建了新的提交对象。此外，结果是一个线性的历史图,而不是一个发散图。</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/image-209.png" alt="image-209" width="600" height="400" loading="lazy"></p>
<p>rebase 后的历史（来源：<a href="https://youtu.be/3VFsitGUB3s">Brief</a>）</p>
<p>本质上，我们 <code>复制</code> 了 <code>paul_branch</code> 上 <code>Commit 4</code> 之后的提交，并将它们 <code>粘贴</code>到了 <code>john_branch</code> 上。</p>
<p>这个命令被称为 <code>rebase</code>，因为它改变了运行它的分支的基点提交(base Commit)。也就是说，在运行<code>git rebase</code>之前，<code>paul_branch</code>的基点提交是 <code>Commit 4</code>,因为这是分支 <code>诞生(born)</code> 的地方（从<code>main</code>开始）。使用 <code>rebase</code> 时，你要求 Git 给它另一个基点，也就是假装它是从 <code>Commit 6</code> 诞生的。</p>
<p>为此，Git 将原来的 <code>Commit 7</code> 的改动 <code>重放(replayed)</code>到 <code>Commit 6</code> 上，然后创建了一个新的提交对象。这个对象与原来的 <code>Commit 7</code> 有三点不同:</p>
<ol>
<li>时间戳不同。</li>
<li>它有不同的父提交, <code>Commit 6</code> 而不是 <code>Commit 4</code>。</li>
<li>它指向的<a href="https://www.freecodecamp.org/news/git-internals-objects-branches-create-repo/">tree object</a> 是不同的,因为修改被引入到了 <code>Commit 6</code> 指向的树，而不是 <code>Commit 4</code> 指向的树。</li>
</ol>
<p>注意这里的最后一个提交，<code>Commit 9</code>。它所代表的快照 (也就是它所指向的 <a href="https://www.freecodecamp.org/news/git-internals-objects-branches-create-repo/">tree</a>) 与合并两个分支后得到的树完全相同。Git 仓库中文件的状态与使用 <code>git merge</code> 时一样。不同的只是历史，当然还有提交对象。</p>
<p>现在，您可以简单地使用:</p>
<pre><code class="language-shell">git checkout main
git merge paul_branch
</code></pre>
<p>Hm…… 如果运行最后这条命令，会发生什么？🤔 在查看了 <code>main</code> 之后，再次查看提交历史:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/image-210.png" alt="image-210" width="600" height="400" loading="lazy"></p>
<p>rebase 后，再切换到 <code>main</code> 分支的历史 (Source: <a href="https://youtu.be/3VFsitGUB3s">Brief</a>)</p>
<p>合并 <code>paul_branch</code> 到 <code>main</code> 会发生什么?</p>
<p>事实上，Git 可以简单地执行快进合并(fast-forward merge)，因为历史是完全线性的（如果你需要关于快进合并的提醒，请查看 <a href="https://www.freecodecamp.org/news/the-definitive-guide-to-git-merge/#timetogethandson">this post</a> ）。因此，<code>main</code> 和 <code>paul_branch</code> 现在指向同一个提交:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/image-211.png" alt="image-211" width="600" height="400" loading="lazy"></p>
<p>快进合并(fast-forward merge)的结果 (Source: <a href="https://youtu.be/3VFsitGUB3s">Brief</a>)</p>
<h1 id="advancedrebasingingit">Advanced Rebasing in Git💪🏻</h1>
<p>既然你已经了解了 rebase 的基础知识，现在就该考虑更高级的情况了，在这些情况下，<code>rebase</code> 命令的附加选项和参数就会派上用场。</p>
<p>在前面的例子中，当你只说了 <code>rebase</code>（没有附加选项），Git 就会重放(replayed) 从共同祖先到当前分支顶端的所有提交。</p>
<p>但是，rebase 是一个超级强大的命令，它能够...，改写历史。如果你想修改历史，把它变成你自己的，它就会派上用场。</p>
<p>让 <code>main</code> 再次指向 <code>Commit 4</code>，撤销上次的合并:</p>
<pre><code class="language-shell">git reset -–hard &lt;ORIGINAL_Commit 4&gt;
</code></pre>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/image-238.png" alt="image-238" width="600" height="400" loading="lazy"></p>
<p><code>撤销(undoing)</code> 上次合并操作 (Source: <a href="https://youtu.be/3VFsitGUB3s">Brief</a>)</p>
<p>通过 rebase 进行撤销:</p>
<pre><code class="language-shell">git checkout paul_branch
git reset -–hard &lt;ORIGINAL_Commit 9&gt;
</code></pre>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/image-239.png" alt="image-239" width="600" height="400" loading="lazy"></p>
<p><code>撤销</code> rebase 操作 (Source: <a href="https://youtu.be/3VFsitGUB3s">Brief</a>)</p>
<p>请注意，您的历史记录与以前完全相同:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/image-240.png" alt="image-240" width="600" height="400" loading="lazy"></p>
<p>在 <code>撤销</code> rebase 操作后可视化历史记录 (Source: <a href="https://youtu.be/3VFsitGUB3s">Brief</a>)</p>
<p>需要再次说明的是，<code>Commit 9</code> 并不是在当前 <code>HEAD</code> 无法访问时就消失了。相反，它仍然保存在对象数据库中。当你使用 <code>git reset</code> 将 <code>HEAD</code> 改为指向该提交(Commit 9)时，你就能检索到它以及它的父提交，因为它们也存储在数据库中。很酷吧？😎</p>
<p>好了，快速查看 Paul 介绍的更改:</p>
<pre><code class="language-shell">git show HEAD
</code></pre>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/image-241.png" alt="image-241" width="600" height="400" loading="lazy"></p>
<p><code>git show HEAD</code> 显示了 <code>Commit 9</code> 引入的补丁 (Source: <a href="https://youtu.be/3VFsitGUB3s">Brief</a>)</p>
<p>在提交图(Commit graph) 中继续向后退:</p>
<pre><code class="language-shell">git show HEAD~
</code></pre>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/image-242.png" alt="image-242" width="600" height="400" loading="lazy"></p>
<p><code>git show HEAD~</code>（与 <code>git show HEAD~1</code>相同）显示 <code>Commit 8</code> 引入的补丁  (Source: <a href="https://youtu.be/3VFsitGUB3s">Brief</a>)</p>
<p>更进一步:</p>
<pre><code class="language-shell">git show HEAD~2
</code></pre>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/image-243.png" alt="image-243" width="600" height="400" loading="lazy"></p>
<p><code>git show HEAD~2</code> 显示 <code>Commit 7</code> 引入的补丁 (Source: <a href="https://youtu.be/3VFsitGUB3s">Brief</a>)</p>
<p>所以，这些改动很好，但也许 Paul 并不想要这样的历史记录。相反，他想让 <code>Commit 7</code> 和 <code>Commit 8</code> 中的改动看起来像是一次提交。</p>
<p>为此，你可以使用 <strong>interactive(交互式)</strong> rebase。为此，我们在 <code>rebase</code> 命令中添加 <code>-i</code>（或 <code>--interactive</code>）选项:</p>
<pre><code class="language-shell">git rebase -i &lt;SHA_OF_Commit_4&gt;
</code></pre>
<p>或者，由于 <code>main</code> 指向 <code>Commit 4</code>，我们只需运行:</p>
<pre><code class="language-shell">git rebase -i main
</code></pre>
<p>通过运行这条命令，你会告诉 Git 使用一个新的基(base) <code>Commit 4</code>。这样，Git 就会回溯到所有在 <code>Commit 4</code>之后提交的、从当前的 <code>HEAD</code> 可以到达的提交，并重放(replay) 这些提交。</p>
<p>对于每一个被重放的提交，Git 都会询问我们想对它做什么:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/image-250.png" alt="image-250" width="600" height="400" loading="lazy"></p>
<p><code>git rebase -i main</code> 会提示您选择对每次提交的处理方式 (Source: <a href="https://youtu.be/3VFsitGUB3s">Brief</a>)</p>
<p>在这种情况下，将提交视为补丁是很有用的。也就是说，<code>Commit 7</code> 就是 <code>Commit 7</code> 在其父版本之上引入的补丁"。</p>
<p>一种选项是使用 <code>pick</code>。这是默认行为，它告诉 Git 重放该提交中引入的改动。在这种情况下，如果保持原样, <code>pick</code> 所有提交,就会得到相同的历史记录，Git 甚至不会创建新的提交对象。</p>
<p>另一个选项是 <code>squash</code>。一个 <em>squashed</em> 提交的内容会被 <code>折叠(folded)</code> 到它之前的提交内容中。因此，在我们的例子中，Paul 想把 <code>Commit 8</code> 压缩成 <code>Commit 7</code>:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/image-251.png" alt="image-251" width="600" height="400" loading="lazy"></p>
<p><code>Commit 8</code> 压缩成 <code>Commit 7</code> (Source: <a href="https://youtu.be/3VFsitGUB3s">Brief</a>)</p>
<p>如你所见，<code>git rebase -i</code> 提供了更多选项，但我们不会在这篇文章中一一介绍。如果允许 <code>rebase</code> 运行，系统会提示你为新创建的提交（即引入了 <code>Commit 7</code>和 <code>Commit 8</code>改动的提交）选择提交信息：</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/image-252.png" alt="image-252" width="600" height="400" loading="lazy"></p>
<p>提供提交信息: <code>Commits 7+8</code> (Source: <a href="https://youtu.be/3VFsitGUB3s">Brief</a>)</p>
<p>再看历史:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/image-253.png" alt="image-253" width="600" height="400" loading="lazy"></p>
<p>运行 interactive rebase 后的历史 (Source: <a href="https://youtu.be/3VFsitGUB3s">Brief</a>)</p>
<p>正如我们想要的那样!我们在<code>paul_branch</code>分支上有 <code>Commit 9</code> (当然,它是一个不同的对象,与原来的 <code>Commit 9</code> 不同)。它指向 <code>Commit 7+8</code>,这是一个单独的提交,引入了原来 <code>Commit 7</code>和 <code>Commit 8</code> 的所有变更。这个提交的父提交是 <code>Commit 4</code>,也就是<code>main</code>分支当前所指向的提交。你现在在<code>john_branch</code>分支上。</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/image-254.png" alt="image-254" width="600" height="400" loading="lazy"></p>
<p>interactive rebase  后可视化的历史 (Source: <a href="https://youtu.be/3VFsitGUB3s">Brief</a>)</p>
<p>哇哦，是不是很酷？ 😎</p>
<p><code>git rebase</code> 允许你无限制地控制任何分支的形态。你可以用它来重新排序提交，或删除错误的改动，或回溯修改改动。或者，你也可以把分支的基础移到另一个提交上，任何你想要的提交。</p>
<h2 id="howtousetheontoswitchofgitrebase">How to Use the <code>--onto</code> Switch of <code>git rebase</code></h2>
<p>让我们再看一个例子。再次进入 <code>main</code>:</p>
<pre><code class="language-shell">git checkout main
</code></pre>
<p>然后删除 <code>paul_branch</code> 和 <code>john_branch</code> 分支 ，这样在提交图中就看不到它们了:</p>
<pre><code class="language-shell">git branch -D paul_branch
git branch -D john_branch
</code></pre>
<p>现在从 <code>main</code> 分支基础上开一个新的分支:</p>
<pre><code class="language-shell">git checkout -b new_branch
</code></pre>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/image-255.png" alt="image-255" width="600" height="400" loading="lazy"></p>
<p>从 <code>main</code> 分支上创建一个新分支(new_branch) (Source: <a href="https://youtu.be/3VFsitGUB3s">Brief</a>)</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/image-256.png" alt="image-256" width="600" height="400" loading="lazy"></p>
<p>一个干净的历史记录, 从 <code>main</code> 分支上创建的 <code>new_branch</code> 分支。 (Source: <a href="https://youtu.be/3VFsitGUB3s">Brief</a>)</p>
<p>现在，在此处添加一些更改并提交:</p>
<pre><code class="language-shell">nano code.py
</code></pre>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/image-257.png" alt="image-257" width="600" height="400" loading="lazy"></p>
<p><code>new_branch</code> 分支上添加 <code>code.py</code> 文件（Source: <a href="https://youtu.be/3VFsitGUB3s">Brief</a>）</p>
<pre><code class="language-shell">git add code.py
git Commit -m "Commit 10"
</code></pre>
<p>切回 <code>main</code> 分支:</p>
<pre><code class="language-shell">git checkout main
</code></pre>
<p>并引入另一个变化:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/image-258.png" alt="image-258" width="600" height="400" loading="lazy"></p>
<p>在文件开头添加了文档字符串 (Source: <a href="https://youtu.be/3VFsitGUB3s">Brief</a>)</p>
<p>是时候提交这些更改:</p>
<pre><code class="language-shell">git add code.py
git Commit -m "Commit 11"
</code></pre>
<p>另一个变化:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/image-259.png" alt="image-259" width="600" height="400" loading="lazy"></p>
<p>添加 <code>@Author</code> 的描述 (Source: <a href="https://youtu.be/3VFsitGUB3s">Brief</a>)</p>
<p>提交变化:</p>
<pre><code class="language-shell">git add code.py
git Commit -m "Commit 12"
</code></pre>
<p>哦，等等，现在我意识到，我是想让你把 <code>Commit 11</code> 中引入的更改作为 <code>new_branch</code> 的一部分。唉。你能怎么办呢？ 🤔</p>
<p>回顾 git 提交历史:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/image-260.png" alt="image-260" width="600" height="400" loading="lazy"></p>
<p><code>Commit 12</code> 后的历史 (Source: <a href="https://youtu.be/3VFsitGUB3s">Brief</a>)</p>
<p>我希望 <code>Commit 10</code> 不只出现在 <code>main</code> 分支上，而是同时出现在 <code>main</code> 分支和 <code>new_branch</code> 上。从视觉上看，我希望把它移到图的下面:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/image-261.png" alt="image-261" width="600" height="400" loading="lazy"></p>
<p>如图所示, 我想让你 <code>push</code> "Commit 10" (Source: <a href="https://youtu.be/3VFsitGUB3s">Brief</a>)</p>
<p>你能看清楚我意图? 😇</p>
<p>我们清楚, <code>rebase</code> 允许我们重新使用 <code>new_branch</code> 分支引入变更,也就是 <code>Commit 10</code> 引入的变更,就像这些变更最初是在 <code>Commit 11</code>上进行的,而不是在 <code>Commit 4</code> 上进行的。</p>
<p>要实现这个目标,你可以使用 <code>git rebase</code> 的其他参数。你可以告诉 Git,你想要取 <code>main</code> 分支和 <code>new_branch</code> 分支的共同祖先 <code>Commit 4</code> 之后引入的所有历史变更,并将这部分历史变更的新的基础设置为 <code>Commit 11</code>。要实现这个目的,可以使用:</p>
<pre><code class="language-shell">git rebase -–onto &lt;SHA_OF_Commit_11&gt; main new_branch
</code></pre>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/image-262.png" alt="image-262" width="600" height="400" loading="lazy"></p>
<p>重置前后的历史记录, <code>Commit 10</code> 已经被推送(pushed) (Source: <a href="https://youtu.be/3VFsitGUB3s">Brief</a>)</p>
<p>看看我们美丽的历史! 😍</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/image-263.png" alt="image-263" width="600" height="400" loading="lazy"></p>
<p>重置前后的历史记录, `Commit 10 已经被推送(pushed) (Source: <a href="https://youtu.be/3VFsitGUB3s">Brief</a>)</p>
<p>让我们再看一个例子。</p>
<p>假设我开始在一个分支上工作，却犯了错误，从 <code>feature_branch_1</code> 而不是从 <code>main</code> 开始。<br>
因此，要模拟这种情况，请创建 <code>feature_branch_1</code>:</p>
<pre><code class="language-shell">git checkout main
git checkout -b feature_branch_1
</code></pre>
<p>删除 <code>new_branch</code> 后，图表中就看不到它了:</p>
<pre><code class="language-shell">git branch -D new_branch
</code></pre>
<p>创建一个简单的 Python 文件 <code>1.py</code>:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/image-264.png" alt="image-264" width="600" height="400" loading="lazy"></p>
<p>新文件 <code>1.py</code>,里面有 <code>print('Hello world!')</code> (Source: <a href="https://youtu.be/3VFsitGUB3s">Brief</a>)</p>
<p>提交此文件:</p>
<pre><code class="language-shell">git add 1.py
git Commit -m  "Commit 13"
</code></pre>
<p>现在(错误地)从 <code>feature_branch_1</code>开出新分支:</p>
<pre><code class="language-shell">git checkout -b feature_branch_2
</code></pre>
<p>创建新文件 <code>2.py</code>:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/image-265.png" alt="image-265" width="600" height="400" loading="lazy"></p>
<p>创建的 <code>2.py</code> (Source: <a href="https://youtu.be/3VFsitGUB3s">Brief</a>)</p>
<p>提交该文件:</p>
<pre><code class="language-shell">git add 2.py
git Commit -m  "Commit 14"
</code></pre>
<p>再添加一些代码到文件 <code>2.py</code>:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/image-266.png" alt="image-266" width="600" height="400" loading="lazy"></p>
<p>修改 <code>2.py</code> (Source: <a href="https://youtu.be/3VFsitGUB3s">Brief</a>)</p>
<p>提交该变化:</p>
<pre><code class="language-shell">git add 2.py
git Commit -m  "Commit 15"
</code></pre>
<p>到目前为止，您应该有这样的历史记录:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/image-267.png" alt="image-267" width="600" height="400" loading="lazy"></p>
<p>引入 <code>Commit 15</code> 的历史 (Source: <a href="https://youtu.be/3VFsitGUB3s">Brief</a>)</p>
<p>切回 <code>feature_branch_1</code> 分支，编辑文件 <code>1.py</code>:</p>
<pre><code class="language-shell">git checkout feature_branch_1
</code></pre>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/image-268.png" alt="image-268" width="600" height="400" loading="lazy"></p>
<p>修改 <code>1.py</code> (Source: <a href="https://youtu.be/3VFsitGUB3s">Brief</a>)</p>
<p>提交修改:</p>
<pre><code class="language-shell">git add 1.py
git Commit -m  "Commit 16"
</code></pre>
<p>你的历史记录应该是这样的:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/image-270.png" alt="image-270" width="600" height="400" loading="lazy"></p>
<p>引入 <code>Commit 16</code> 后的历史 (Source: <a href="https://youtu.be/3VFsitGUB3s">Brief</a>)</p>
<p>说现在你意识到了，你犯了一个错误。你实际上想让 <code>feature_branch_2</code> 从 <code>main</code> 分支中分出，而不是从 <code>feature_branch_1</code> 中分出。</p>
<p>怎样才能做到这一点呢？🤔</p>
<p>试着根据历史图和你所学到的关于 <code>rebase</code> 命令的 <code>--onto</code> 参数来思考一下。</p>
<p>你想把 <code>feature_branch_2</code> 上第一个提交的父分支，也就是 <code>commit 14</code>，替换到 <code>main</code> 分支的顶部，这里是 <code>commit 12</code>，而不是 <code>feature_branch_1</code> 的起点，这里是 <code>commit 13</code>。因此，你将再次创建一个 <em>新的基点</em>，这次是在<code>feature_branch_2</code>上的第一个 Commit。</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/image-271.png" alt="image-271" width="600" height="400" loading="lazy"></p>
<p>你想要在 <code>Commit 14</code> 和 <code>Commit 15</code> 之间进行移动（来源：<a href="https://youtu.be/3VFsitGUB3s">Brief</a>）</p>
<p>你打算怎么做呢？</p>
<p>第一，切到 <code>feature_branch_2</code> 分支：</p>
<pre><code class="language-shell">git checkout feature_branch_2
</code></pre>
<p>然后你可以执行:</p>
<pre><code class="language-shell">git rebase -–onto main &lt;SHA_OF_Commit_13&gt;
</code></pre>
<p>因此，您的 <code>feature_branch_2</code> 是基于 <code>main</code> 分支而不是 <code>feature_branch_1</code> 分支：</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/image-272.png" alt="image-272" width="600" height="400" loading="lazy"></p>
<p>执行变基(rebase)后的提交历史（来源：<a href="https://youtu.be/3VFsitGUB3s">Brief</a>）</p>
<p>该命令的语法是:</p>
<pre><code class="language-shell">git rebase --onto &lt;new_parent&gt; &lt;old_parent&gt;
</code></pre>
<h2 id="">如何在一个单独的分支上执行变基</h2>
<p>在查看单个分支的历史时，您也可以使用 git rebase。</p>
<p>让我们看看你是否能在这里帮助我。</p>
<p>假设我是从 <code>feature_branch_2</code> 开始工作的，具体来说是编辑了文件 <code>code.py</code>。我首先将所有字符串的引号从单引号改为双引号：</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/image-273.png" alt="image-273" width="600" height="400" loading="lazy"></p>
<p>在 <code>code.py</code> 中将 <code>'</code> 改为 <code>"</code>（来源：<a href="https://youtu.be/3VFsitGUB3s">Brief</a>）</p>
<p>然后，我将其进行了暂存（staged）并提交（Committed）：</p>
<pre><code class="language-shell">git add code.py
git Commit -m "Commit 17"
</code></pre>
<p>然后我决定在文件开头添加一个新函数:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/image-274.png" alt="image-274" width="600" height="400" loading="lazy"></p>
<p>添加函数 <code>another_feature</code> (Source: <a href="https://youtu.be/3VFsitGUB3s">Brief</a>)</p>
<p>然后，我将其进行了暂存（staged）并提交（Committed）:</p>
<pre><code class="language-shell">git add code.py
git Commit -m "Commit 18"
</code></pre>
<p>现在我意识到我实际上忘记了将 <code>main</code> 用双引号包裹起来（你可能已经注意到了），所以我也做了这个改动:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/image-275.png" alt="image-275" width="600" height="400" loading="lazy"></p>
<p>将 <code>'__main__'</code> 改成 <code>"__main__"</code>  (Source: <a href="https://youtu.be/3VFsitGUB3s">Brief</a>)</p>
<p>当然, 我将其进行了暂存（staged）并提交（Committed）:</p>
<pre><code class="language-shell">git add code.py
git Commit -m "Commit 19"
</code></pre>
<p>现在，让我们来看看历史:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/image-276.png" alt="image-276" width="600" height="400" loading="lazy"></p>
<p>引入 <code>Commit 19</code> 之后的提交记录 (Source: <a href="https://youtu.be/3VFsitGUB3s">Brief</a>)</p>
<p>这样看起来不太好，对吧？我的意思是，<code>Commit 17</code> 和 <code>Commit 19</code>（将<code>'</code>改为<code>"</code>）是相关的，但它们被无关的 <code>Commit 18</code>（我在那里添加了一个新函数）分隔开了。我们能做些什么？🤔 你能帮我吗？</p>
<p>直觉上，我想在这里修改历史:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/image-277.png" alt="image-277" width="600" height="400" loading="lazy"></p>
<p>这些是我想要修改的提交 (Source: <a href="https://youtu.be/3VFsitGUB3s">Brief</a>)</p>
<p>那么，你会怎么做呢？</p>
<p>你说得对！👏🏻</p>
<p>我可以在 <code>commit 15</code>的基础上，将历史记录从 <code>commit 17</code> 变基(rebase)为 <code>commit 19</code>。要做到这一点:</p>
<pre><code class="language-shell">git rebase --interactive --onto &lt;SHA_OF_Commit_15&gt; &lt;SHA_OF_Commit_15&gt;
</code></pre>
<p>请注意，我指定了 <code>Commit 15</code> 作为提交范围的起点，不包括本次提交。而且我不需要明确指定 <code>HEAD</code> 作为最后一个参数。</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/image-279.png" alt="image-279" width="600" height="400" loading="lazy"></p>
<p>在单个分支上使用 <code>rebase --onto</code> (Source: <a href="https://youtu.be/3VFsitGUB3s">Brief</a>)</p>
<p>按照您的建议运行 <code>rebase</code> 命令后（谢谢！😇），我看到了下面的显示：</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/image-280.png" alt="image-280" width="600" height="400" loading="lazy"></p>
<p>交互式变基 (Source: <a href="https://youtu.be/3VFsitGUB3s">Brief</a>)</p>
<p>那我该怎么办呢？我想把 <code>Commit 19</code> 放在 <code>Commit 18</code> 之前，这样它就紧跟在 <code>Commit 17</code>之后。我还可以进一步将它们合并在一起，就像这样：</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/image-281.png" alt="image-281" width="600" height="400" loading="lazy"></p>
<p>交互式 rebase - 调整提交顺序并合并 (Source: <a href="https://youtu.be/3VFsitGUB3s">Brief</a>)</p>
<p>现在当我被提示输入提交信息时，我可以提供信息 <code>Commit 17+19</code>:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/image-282.png" alt="image-282" width="600" height="400" loading="lazy"></p>
<p>输入 Commit 信息 (Source: <a href="https://youtu.be/3VFsitGUB3s">Brief</a>)</p>
<p>现在，让我们来看看我们美丽的提交历史吧:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/image-283.png" alt="image-283" width="600" height="400" loading="lazy"></p>
<p>由此产生的提交历史 (Source: <a href="https://youtu.be/3VFsitGUB3s">Brief</a>)</p>
<p>再次感谢！ 🙌🏻</p>
<h1 id="">更多变基用户案例 + 更多实践</h1>
<p>现在，我希望你已经对 变基(rebase) 的语法感到得心应手了。要真正理解它，最好的办法是理解各种案例，并自己想办法解决它们。</p>
<p>对于接下来的用例，我强烈建议你在我介绍完每个用例后就停止阅读，然后尝试自己解决。</p>
<h2 id="commits">如何排除 Commits</h2>
<p>假设您在另一个软件仓库中有这样的历史记录:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/image-284.png" alt="image-284" width="600" height="400" loading="lazy"></p>
<p>别的 Commit 提交历史 (Source: <a href="https://youtu.be/3VFsitGUB3s">Brief</a>)</p>
<p>在使用之前，先将 <code>tag</code> 存储为 <code>original_Commit_f</code>，以便稍后再查看:</p>
<pre><code class="language-shell">git tag original_Commit_f
</code></pre>
<p>现在，你实际上并不希望包含 <code>Commit C</code>和 <code>Commit D</code> 中的更改。你可以像之前一样使用交互式 rebase，删除它们的改动。或者，也可以再次使用 <code>git rebase--onto</code>。如何使用 <code>--onto</code>来 <code>移除(remove)</code> 这两个提交(commit)呢？</p>
<p>你可以在 <code>commit B</code>的基础上重建 <code>HEAD</code>，原来的父提交是 <code>commit D</code>，现在应该是 <code>commit B</code>,看提交历史记录：</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/image-284.png" alt="image-284" width="600" height="400" loading="lazy"></p>
<p>再次回顾提交历史 (Source: <a href="https://youtu.be/3VFsitGUB3s">Brief</a>)</p>
<p>rebase 使 <code>Commit B</code> 成为 <code>Commit E</code> 的 <em>基(base)</em>，意味着 <code>移动(moving)</code> <code>Commit E</code>和 <code>Commit F</code>，并赋予它们另一个 <em>基(base)</em> -- <code>Commit B</code>。你能自己想出这个命令吗？</p>
<pre><code class="language-shell">git rebase --onto &lt;SHA_OF_Commit_B&gt; &lt;SHA_OF_Commit_D&gt; HEAD
</code></pre>
<p>请注意，使用上述语法不会移动 <code>main</code> 指向新的 Commit，因此结果是一个 <code>分离的(detached)</code> <code>HEAD</code>。如果你使用 <code>gg</code> 或其他显示分支历史的工具，这可能会让你感到困惑：</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/image-285.png" alt="image-285" width="600" height="400" loading="lazy"></p>
<p>用 <code>--onto</code> 变基(rebase) 会导致一个分离(detached)的 <code>HEAD</code> （来源：<a href="https://youtu.be/3VFsitGUB3s">Brief</a>)</p>
<p>但如果使用 <code>git log</code>（或我的别名 <code>git lol</code>），就能看到想要的历史记录：</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/image-286.png" alt="image-286" width="600" height="400" loading="lazy"></p>
<p>由此形成的提交历史 (Source: <a href="https://youtu.be/3VFsitGUB3s">Brief</a>)</p>
<p>我不知道你怎么想，但这些事情让我非常开心。 😊😇</p>
<p>顺便说一下，你可以省略前面命令中的 <code>HEAD</code>，因为这是第三个参数的默认值。因此，只需使用:</p>
<pre><code class="language-shell">git rebase --onto &lt;SHA_OF_Commit_B&gt; &lt;SHA_OF_Commit_D&gt;
</code></pre>
<p>会有同样的效果。最后一个参数实际上是告诉 Git 当前提交序列的终点在哪里。所以有三个参数的 <code>git rebase --onto</code> 的语法是</p>
<pre><code class="language-shell">git rebase --onto &lt;new_parent&gt; &lt;old_parent&gt; &lt;until&gt;
</code></pre>
<h2 id="">如何在不同分支间移动提交</h2>
<p>因此，让我们回到之前的提交历史:</p>
<pre><code class="language-shell">git checkout original_Commit_f
</code></pre>
<p>现在我只想让 <code>commit E</code>位于基于 <code>commit B</code> 的分支上。也就是说，我想建立一个新的分支，从 <code>commit B</code>分支出去，其中只有 <code>commit E</code>。</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/image-287.png" alt="image-287" width="600" height="400" loading="lazy"></p>
<p>考虑到 <code>commit E</code> 的当前历史 (Source: <a href="https://youtu.be/3VFsitGUB3s">Brief</a>)</p>
<p>那么，这意味着什么呢？请看上图。我应该变基(rebase)哪个提交（或哪些提交），哪个提交是新的基础(base)？</p>
<p>我知道在这里我可以让你来 😉</p>
<p>我想要的是取出 <code>commit E</code>，只有这个提交，并将其基础更改为 <code>commit B</code>。换句话说，将<code>commit E</code>引入的更改 <code>重放(replay)</code> 到 <code>commit B</code>上。</p>
<p>你能将这个逻辑应用到 <code>git rebase</code> 的语法中吗？</p>
<p>这里是语法（这次我用 <code>&lt;Commit_B&gt;</code> 代替 <code>&lt;SHA_OF_Commit_B&gt;</code>，为了简洁起见）：</p>
<pre><code class="language-shell">git rebase –-onto &lt;Commit_B&gt; &lt;Commit_D&gt; &lt;Commit_E&gt;
</code></pre>
<p>现在的提交历史是这样的:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/image-288.png" alt="image-288" width="600" height="400" loading="lazy"></p>
<p>变基后的提交历史 (Source: <a href="https://youtu.be/3VFsitGUB3s">Brief</a>)</p>
<p>棒极了！</p>
<h1 id="">关于冲突的说明</h1>
<p>请注意，进行变基时可能会遇到与合并时一样的冲突。可能会出现冲突，因为在变基时，您试图将补丁(patches)应用在不同的基础上，也许这些补丁(patches)并不适用。</p>
<p>例如，再次考虑之前的代码库，特别是考虑由 <code>main</code> 指向的 <code>commit 12</code> 引入的更改：</p>
<pre><code class="language-shell">git show main
</code></pre>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/image-289.png" alt="image-289" width="600" height="400" loading="lazy"></p>
<p>在 <code>Commit 12</code> 中引入的补丁 (Source: <a href="https://youtu.be/3VFsitGUB3s">Brief</a>)</p>
<p>我在<a href="https://www.freecodecamp.org/news/git-diff-and-patch/">上一篇文章</a>中已经详细介绍了 <code>git diff</code> 的格式，但为了快速提醒大家，这个 Commit 会指示 Git 在两行上下文之后添加一行：</p>
<pre><code>```shell
This is a sample file
</code></pre>
<p>而在这三行上下文之前:</p>
<pre><code>```
def new_feature():
  print('new feature')
</code></pre>
<p>假设您正试图将 <code>commit 12</code> 重定向到另一个提交上。如果由于某种原因，这些上下文行并不存在于您要重置的 Commit 上的补丁中，那么就会产生冲突。要进一步了解冲突以及如何解决冲突，请参阅 <a href="https://www.freecodecamp.org/news/the-definitive-guide-to-git-merge/">本指南</a>。</p>
<h1 id="">放眼全局</h1>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/image-290.png" alt="image-290" width="600" height="400" loading="lazy"></p>
<p>比较变基(rebase)和合并(merge)（来源：<a href="https://youtu.be/3VFsitGUB3s">Brief</a>）</p>
<p>在本指南的开始，我提到了 <code>git merge</code> 和 <code>git rebase</code> 之间的相似性：它们都用于整合不同历史中引入的更改。</p>
<p>但是，正如你现在所知，它们在操作方式上有很大的不同。合并导致了一个分叉的历史，而变基导致了一个线性的历史。在两种情况下都可能出现冲突。表格中还有一列需要特别关注。</p>
<p>现在你知道了什么是 <code>Git 变基（rebase）</code>，以及如何使用交互式变基或 <code>rebase --onto</code>，希望你理解，<code>git rebase</code> 是一个超级强大的工具。然而，与合并相比，它有一个巨大的缺点。</p>
<p>Git 变基改变了提交历史。</p>
<p>这意味着你<strong>不应该</strong>对存在于你本地代码库之外的并且其他人可能以此为基础进行提交的提交进行变基。</p>
<p>换句话说，如果问题涉及的只有你在本地创建的提交，那就继续使用变基，尽情操作。</p>
<p>但是，如果这些提交已经被推送，这可能会导致一个巨大的问题，因为其他人可能依赖这些提交，而后来你覆盖了它们，然后你和他们将拥有存储库的不同版本。</p>
<p>这与我们所见的不修改历史的 <code>merge</code> 不同。</p>
<p>例如，考虑最后一个情况，我们进行了变基，导致了这样的提交历史:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/06/image-288.png" alt="image-288" width="600" height="400" loading="lazy"></p>
<p>变基后的提交历史（来源：<a href="https://youtu.be/3VFsitGUB3s">Brief</a>）</p>
<p>现在，假设我已经将这个分支推送到远程仓库。在我推送了这个分支之后，另一个开发人员拉取了它，并从 <code>commit C</code>创建了一个新分支。另一个开发人员不知道与此同时，我正在本地对我的分支进行变基，并且稍后会再次推送它。</p>
<p>这导致了一个不一致：另一个开发人员从一个在我的代码库副本上不再可用的提交中进行工作。</p>
<p>我不会在本指南中详细阐述这到底会导致什么，因为我的主要观点是你绝对应该避免这种情况。如果你对实际会发生什么感兴趣，我会在下面留下一个有用资源的链接。现在，让我们总结一下我们所讨论的内容。</p>
<h1 id="">回顾</h1>
<p>在本教程中，你将学习到 <code>git rebase</code> 这个在 Git 中重写历史的超级强大工具。你考虑了一些<code>git rebase</code>可能有用的用例，以及如何使用一个、两个或三个参数，使用或不使用<code>--onto</code>开关。</p>
<p>我希望我能让你相信，<code>git rebase</code> 不仅功能强大，而且一旦掌握了要领，使用起来也很简单。它是一个 <code>复制粘贴（copy-paste）</code> 提交（或者更准确地说，是补丁）的工具。它是一个非常有用的工具。</p>
<h1 id="">其他参考资料</h1>
<ul>
<li><a href="https://www.youtube.com/playlist?list=PL9lx0DXCC4BNUby5H58y6s2TQVLadV8v7">Git Internals YouTube 播放列表 - Brief</a>（我的 YouTube 频道）</li>
<li><a href="https://www.freecodecamp.org/news/git-internals-objects-branches-create-repo/">Omer 上一篇关于 Git 内部结构的文章</a></li>
<li><a href="https://medium.com/@Omer_Rosenbaum/git-undo-how-to-rewrite-git-history-with-confidence-d4452e2969c2">Omer 的 Git UNDO 教程--用 Git 重写历史</a></li>
<li><a href="https://git-scm.com/book/en/v2/Git-Branching-Rebasing">关于变基的 Git 文档</a></li>
<li><a href="https://jwiegley.github.io/git-from-the-bottom-up/1-Repository/7-branching-and-the-power-of-rebase.html">分支和 rebase 的强大功能</a></li>
<li><a href="https://jwiegley.github.io/git-from-the-bottom-up/1-Repository/8-interactive-rebasing.html">交互式变基</a></li>
<li><a href="https://womanonrails.com/git-rebase-onto">Git rebase--onto</a></li>
</ul>
<h1 id=""><strong>关于作者</strong></h1>
<p><a href="https://www.linkedin.com/in/omer-rosenbaum-034a08b9/">Omer Rosenbaum</a> 是 <a href="https://swimm.io/">Swimm</a> 的首席技术官。他是<a href="https://youtube.com/@BriefVid">Brief YouTube 频道</a> 的作者。他也是一位网络安全培训专家，创立了 Checkpoint Security Academy。他是 <a href="https://data.cyber.org.il/networks/networks.pdf">《计算机网络》（希伯来语版）</a> 的作者。你可以在 <a href="https://twitter.com/Omer_Ros">Twitter</a> 上找到他。</p>
<!--kg-card-end: markdown--> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Git Revert 或 Git Reset 重置文件或提交 ]]>
                </title>
                <description>
                    <![CDATA[ 当与团队一起做一个项目或你自己做一个项目时，通过版本控制来跟踪代码库的变化是很重要的。 Git 为你提供了不同的命令来跟踪文件变化。这些命令将使你能够与其他开发人员协作、访问文件历史、管理代码，等等。 在这篇文章中，你将学习如何恢复和重置一个文件或提交到之前的提交。 我们将使用一些简单的 HTML 代码来演示如何使用 Git 恢复和重置到之前的提交。 让我们开始吧！ 如何重置一个文件或提交 在本节中，你将学习如何使用以下命令来恢复/重置一个文件或提交：  * git revert  * git reset 如何使用 git revert 命令恢复文件或提交 下面是 git revert 命令的语法： git revert [commit ID] 下面是我们将使用的代码： <!DOCTYPE html> <html lang="en">   <head>     <title>Document</title>   </head>   ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/git-revert-how-to-reset-a-file-or-commit/</link>
                <guid isPermaLink="false">6405e8fcf2e3690630c995ae</guid>
                
                    <category>
                        <![CDATA[ Git ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Chengjun.L ]]>
                </dc:creator>
                <pubDate>Wed, 01 Nov 2023 13:22:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2023/03/roman-synkevych-wX2L8L-fGeA-unsplash--1-.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>原文：</strong> <a href="https://www.freecodecamp.org/news/git-revert-how-to-reset-a-file-or-commit/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Git Revert – How to Reset a File or Commit</a>
      </p><p>当与团队一起做一个项目或你自己做一个项目时，通过版本控制来跟踪代码库的变化是很重要的。</p><p>Git 为你提供了不同的命令来跟踪文件变化。这些命令将使你能够与其他开发人员协作、访问文件历史、管理代码，等等。</p><p>在这篇文章中，你将学习如何恢复和重置一个文件或提交到之前的提交。</p><p>我们将使用一些简单的 HTML 代码来演示如何使用 Git 恢复和重置到之前的提交。</p><p>让我们开始吧！</p><h2 id="-">如何重置一个文件或提交</h2><p>在本节中，你将学习如何使用以下命令来恢复/重置一个文件或提交：</p><ul><li><code>git revert</code></li><li><code>git reset</code></li></ul><p>如何使用 git revert 命令恢复文件或提交</p><p>下面是 <code>git revert</code> 命令的语法：</p><pre><code class="language-txt">git revert [commit ID]</code></pre><p>下面是我们将使用的代码：</p><pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
  &lt;head&gt;
    &lt;title&gt;Document&lt;/title&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;h1&gt;Hello World!&lt;/h1&gt;
  &lt;/body&gt;
&lt;/html&gt;
</code></pre><p>让我们假设上面的文件是每个在项目上工作的开发人员的代码库的当前状态。</p><p>我们将对该文件做一些修改，然后添加、提交和推送这些修改，即：</p><pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
  &lt;head&gt;
    &lt;title&gt;Document&lt;/title&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;h1&gt;Hello World!&lt;/h1&gt;

    &lt;ul&gt;
        &lt;li&gt;Red&lt;/li&gt;
        &lt;li&gt;Yellow&lt;/li&gt;
        &lt;li&gt;Orange&lt;/li&gt;
    &lt;/ul&gt;
    
  &lt;/body&gt;
&lt;/html&gt;
</code></pre><p>我们已经在代码中添加了一个颜色列表。让我们用下面的命令推送这些变化：</p><pre><code class="language-bash">git add .
git commit -m "added colors to the HTML file"
git push -u origin main</code></pre><p>现在，新的变化已经为在特定代码分支上工作的所有人更新了。</p><p>但如果添加的颜色是应该在未来为用户发布的功能的一部分呢？你提前发布了这个功能，就犯了一个错误。</p><p>要恢复到之前的提交，你需要那个特定提交的 ID。要得到提交 ID，请执行下面的命令：</p><pre><code class="language-bash">git log</code></pre><p>该命令会显示每个提交的 ID、作者和日期。它应该是这样的：</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2023/02/git-log.PNG" class="kg-image" alt="git-log" width="600" height="400" loading="lazy"><figcaption>git log</figcaption></figure><p>在我们的例子中，提交 ID 是 785dd5a6dd0f1ebd9e06045df787d8d28fd38285。</p><p>所以，要重置文件，就用 <code>git revert [commit ID]</code>，即：</p><pre><code class="language-bash">git revert 785dd5a6dd0f1ebd9e06045df787d8d28fd38285</code></pre><p>上面的命令将重置某个特定提交之前对文件所做的所有修改。下面是现在的 HTML 文件：</p><pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
  &lt;head&gt;
    &lt;title&gt;Document&lt;/title&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;h1&gt;Hello World!&lt;/h1&gt;
  &lt;/body&gt;
&lt;/html&gt;</code></pre><p>现在你可以推送这个新状态了。</p><p>请注意，<code>git revert</code> 命令并不从远程仓库中删除被恢复的提交。相反，它为被恢复的改动创建一个新的提交。</p><p>这意味着你将拥有被恢复的提交的历史和包含被恢复的修改的文件的新提交。</p><h3 id="-git-reset-">如何使用 git reset 命令重置文件或提交</h3><p><code>git reset</code> 命令也可以用来恢复修改。请看下面的提交历史：</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2023/02/git-log-1.PNG" class="kg-image" alt="git-log-1" width="600" height="400" loading="lazy"></figure><p>上面的图片显示了所有的提交历史——从第一次提交到最后一节的还原提交。</p><p>如果我们用 <code>git reset [commit ID]</code> 来还原某个特定的提交，之后的其他提交都会从提交历史中被删除。</p><p>下面是一个例子：</p><pre><code class="language-bash">git reset c1e4962a9b355f023c250609cfa9303a67b3063e</code></pre><p>使用第一次提交的提交 ID，我们回到了第一次提交的状态。</p><p>运行 <code>git log</code> 命令，你会有一个这样的提交历史：</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2023/02/git-log-2.PNG" class="kg-image" alt="git-log-2" width="600" height="400" loading="lazy"></figure><p>虽然你已经成功地恢复到了第一次提交，但代码中其他提交的历史却被抹去了。这在与其他开发者合作时，会产生非常负面的影响。</p><h2 id="--1">摘要</h2><p>在这篇文章中，我们谈到了两个重要的 Git 命令，即 <code>git revert</code> 和 <code>git reset</code>，用于撤销 Git 仓库中的修改。</p><p>这两个命令都能让你回到代码库中之前的指定状态，但后果不同。</p><p><code>git revert</code> 命令会恢复到指定的提交，但会保留代码库中其他所有提交的历史，并为恢复的改动创建一个新的提交。这是一种在与他人合作时撤销修改的更有效的方式。</p><p>另外，<code>git reset</code> 命令会恢复到指定的提交，然后删除指定提交之后的所有提交。</p><p>为了安全起见，在撤销有其他开发者工作的 repo 中的修改时，请使用 <code>git revert</code>。</p><p>你可以在撤销修改后想完全删除提交的情况下使用 <code>git reset</code>。</p><p>Happy coding!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 什么是 Git 远程分支？如何从 GitHub 查看远程分支？ ]]>
                </title>
                <description>
                    <![CDATA[ Git 是一个免费的开源工具。具体来说，它是当今软件开发中最流行的版本控制系统。 Git 允许你跟踪和维护一个编程项目的不同版本。 有了 Git，开发者和技术团队可以在一个项目上进行协作和工作。 多个开发者可以同时在项目的相同或不同部分工作，而不互相干扰，提高生产力和效率。 借助 Git 提供的内置功能和工具，开发者可以同时进行协作，并在他们的环境中工作。其中一个功能就是分支（branch）。 什么是 Git 中的分支 Git 中的分支是一个独立的、安全的、与主项目相分离的开发区域。 分支允许开发人员开发和测试新的功能，修复错误，实验新的想法，并减少破坏代码库中稳定代码的风险。 本地分支与远程分支--有什么区别 在 Git 中，有两种类型的分支：本地分支（local branch）和远程分支（remote branch）。 一个本地分支只存在于你的本地机器上。 所有你引入并提交到本地仓库的修改都只存储在你的本地系统上。它们提供了一种实验、修复错误和开发新功能而不影响主代码库的方式。 要创建一个本地分支，可以使用 git branch <branch-name>  命 ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/remote-branches-in-git/</link>
                <guid isPermaLink="false">63fdffd50687e3060be26dc1</guid>
                
                    <category>
                        <![CDATA[ Git ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ luojiyin ]]>
                </dc:creator>
                <pubDate>Thu, 08 Jun 2023 01:20:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2023/02/pexels-antonio-borriello-1297611.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>原文：</strong> <a href="https://www.freecodecamp.org/news/remote-branches-in-git/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">What is a Remote Branch in Git? How to Check out Remote Branches from GitHub</a>
      </p><!--kg-card-begin: markdown--><p>Git 是一个免费的开源工具。具体来说，它是当今软件开发中最流行的版本控制系统。</p>
<p>Git 允许你跟踪和维护一个编程项目的不同版本。</p>
<p>有了 Git，开发者和技术团队可以在一个项目上进行协作和工作。</p>
<p>多个开发者可以同时在项目的相同或不同部分工作，而不互相干扰，提高生产力和效率。</p>
<p>借助 Git 提供的内置功能和工具，开发者可以同时进行协作，并在他们的环境中工作。其中一个功能就是分支（branch）。</p>
<h2 id="git">什么是 Git 中的分支</h2>
<p>Git 中的分支是一个独立的、安全的、与主项目相分离的开发区域。</p>
<p>分支允许开发人员开发和测试新的功能，修复错误，实验新的想法，并减少破坏代码库中稳定代码的风险。</p>
<h3 id="">本地分支与远程分支--有什么区别</h3>
<p>在 Git 中，有两种类型的分支：本地分支（local branch）和远程分支（remote branch）。</p>
<p>一个本地分支只存在于你的本地机器上。</p>
<p>所有你引入并提交到本地仓库的修改都只存储在你的本地系统上。它们提供了一种实验、修复错误和开发新功能而不影响主代码库的方式。</p>
<p>要创建一个本地分支，可以使用 <code>git branch &lt;branch-name&gt;</code> 命令，其中 <code>branch-name</code> 是新分支的名称。</p>
<p>例如，如果你想创建一个名为 "test "的新分支，你可以使用以下命令：</p>
<pre><code class="language-bash">git branch test
</code></pre>
<p>你可以使用<code>git checkout</code>命令切换到新的分支，并创建你想要的修改：</p>
<pre><code class="language-bash">git checkout test
</code></pre>
<p>要查看本地分支的列表，请使用<code>git branch</code>命令。</p>
<p>说了这么多，你不能在本地分支上与其他开发者协作。这时，远程分支就派上用场了。</p>
<p>远程分支是开发者在同一个项目上同时协作的方式。</p>
<p>远程分支存在于一个远程仓库中（通常称为 <code>origin</code>），托管在 <a href="https://github.com/">GitHub</a> 等平台上。</p>
<p>当你向本地分支提交了修改，你可以使用<code>git push &lt;remote&gt; &lt;local&gt;</code>语法将本地分支推送到远程仓库（<code>origin</code>）。然后，其他人就可以看到你的代码了。</p>
<pre><code class="language-bash">git push -u origin test
</code></pre>
<p>Git 会在远程仓库中创建一个本地分支的副本。这个副本被称为远程分支。</p>
<p>要查看项目中所有远程分支的列表，请使用<code>git branch -r</code>命令。</p>
<h2 id="git">如何在 Git 中签出一个远程分支</h2>
<p>你可能需要访问另一个开发者创建的分支，以进行审查或协作。</p>
<p>这个分支不在你的本地系统上,它是存储在远程仓库上的一个远程分支。</p>
<p>问题是，Git 并不自动允许你在别人的分支上工作。</p>
<p>相反，你需要创建一个本地副本，映射你要处理的远程分支，然后在本地进行修改。</p>
<p>让我们看看下面几节中你需要采取的步骤。</p>
<h3 id="">如何获取所有远程分支</h3>
<p>首先，你需要使用<code>git fetch</code>命令获取必要的分支数据，以及远程存储库的名称：</p>
<pre><code class="language-bash">git fetch origin
</code></pre>
<p>这个命令将从远程仓库下载最新的修改（包括远程分支）到你的本地机器。</p>
<p>如果你有一个不同的远程名称，用它替换<code>origin</code>。</p>
<h3 id="">如何查看可检出的分支</h3>
<p>接下来，要查看可供签出的分支列表，请使用以下命令：</p>
<pre><code class="language-bash">git branch -r
</code></pre>
<p><code>-r</code>（是 remote 的缩写）选项告诉 Git 列出远程分支。</p>
<p>该命令的输出将是一个所有可供签出的远程分支的列表。你会看到分支名称前有<code>remotes/origin</code>的前缀。</p>
<h3 id="">如何检出远程分支的情况</h3>
<p>你不能直接对你感兴趣的远程分支进行修改，你需要一个本地副本。</p>
<p>你需要检出(checkout)你感兴趣的分支，这样你就可以开始在本地进行你想做的修改。</p>
<p>要做到这一点，使用<code>git checkout</code>命令，加上<code>-b</code>（代表分支）选项。语法是这样的：</p>
<pre><code class="language-bash">git checkout -b &lt;new-local-branch-name&gt; origin/&lt;remote-branch-name&gt;
</code></pre>
<p>因此，如果你想获得远程分支<code>new-feature</code>的副本，你应该做以下事情：</p>
<pre><code class="language-bash">git checkout -b new-feature origin/new-feature
</code></pre>
<p>上面的命令在你的机器上创建了一个新的本地副本，它基于并连接到远程分支。</p>
<p>它创建了一个名为 "new-feature "的新分支，检出（checkout）该分支，并将 <code>origin/new-feature</code> 中的修改拉到新分支中。</p>
<p>现在你可以向<code>origin/new-feature</code>推送新的提交。</p>
<h3 id="">谢谢你阅读本文</h3>
<p>现在你知道如何在 Git 中检出和使用远程分支了。Happy coding!</p>
<!--kg-card-end: markdown--> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ .gitignore 文件——如何在 Git 中忽略文件和文件夹 ]]>
                </title>
                <description>
                    <![CDATA[ Git 是一个流行的版本控制系统。开发人员通过它可以在项目上进行协作。 Git 允许你跟踪你在一段时间内对项目所做的修改。除此之外，如果你想撤销某个改动，它还可以让你恢复到以前的版本。 Git 的工作方式是，你用 git add 命令在项目中添加文件，然后用 git commit 命令提交文件。 当你作为团队的一员在一个项目上工作时，有时你不想与他人分享项目的某些文件或部分。 换句话说，你不想把这些特定的文件包含或提交到项目的主版本中。这就是为什么你可能不想在 git add 命令中使用句号 .，因为这样做会提交当前 Git 目录中的每一个文件。 当你使用 git commit 命令时，每一个文件都会被添加——这也包括那些不需要或不应该提交的文件。 你可能想让 Git 忽略特定的文件，但没有 git ignore 命令来实现这一目的。 那么，如何告诉 Git 忽略和不追踪特定的文件呢？用一个 .gitignore 文件。 在这篇文章中，你将了解什么是 .gitignore 文件，如何创建它，以及如何使用它来忽略文件和文件夹。你还会看到如何忽略一个先前提交的文件。 以下 ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/gitignore-file-how-to-ignore-files-and-folders-in-git/</link>
                <guid isPermaLink="false">6448ef14f81fd9068e7a66a3</guid>
                
                    <category>
                        <![CDATA[ Git ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Chengjun.L ]]>
                </dc:creator>
                <pubDate>Wed, 26 Apr 2023 04:22:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2023/04/pexels-ken-tomita-389819.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>原文：</strong> <a href="https://www.freecodecamp.org/news/gitignore-file-how-to-ignore-files-and-folders-in-git/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">.gitignore File – How to Ignore Files and Folders in Git</a>
      </p><p>Git 是一个流行的版本控制系统。开发人员通过它可以在项目上进行协作。</p><p>Git 允许你跟踪你在一段时间内对项目所做的修改。除此之外，如果你想撤销某个改动，它还可以让你恢复到以前的版本。</p><p>Git 的工作方式是，你用 <code>git add</code> 命令在项目中添加文件，然后用 <code>git commit</code> 命令提交文件。</p><p>当你作为团队的一员在一个项目上工作时，有时你不想与他人分享项目的某些文件或部分。</p><p>换句话说，你不想把这些特定的文件包含或提交到项目的主版本中。这就是为什么你可能不想在 <code>git add</code> 命令中使用句号 <code>.</code>，因为这样做会提交当前 Git 目录中的每一个文件。</p><p>当你使用 <code>git commit</code> 命令时，每一个文件都会被添加——这也包括那些不需要或不应该提交的文件。</p><p>你可能想让 Git 忽略特定的文件，但没有 <code>git ignore</code> 命令来实现这一目的。</p><p>那么，如何告诉 Git 忽略和不追踪特定的文件呢？用一个 <code>.gitignore</code> 文件。</p><p>在这篇文章中，你将了解什么是 <code>.gitignore</code> 文件，如何创建它，以及如何使用它来忽略文件和文件夹。你还会看到如何忽略一个先前提交的文件。</p><p>以下是我们要介绍的内容：</p><ol><li>什么是 <code>.gitignore</code> 文件</li><li>如何创建一个 <code>.gitignore</code> 文件</li><li>在 <code>.gitignore</code> 文件中包含什么</li><li>如何在 Git 中忽略一个文件和文件夹</li><li>如何忽略一个先前提交的文件</li></ol><h2 id="-gitignore-gitignore-">什么是 .gitignore 文件？.gitignore 文件是用来做什么的？</h2><p>在任何当前工作的 Git 仓库中，每个文件都是这样的：</p><ul><li><strong>追踪的（tracked）</strong>- 这些是 Git 所知道的所有文件或目录。这些是新添加（用 <code>git add</code> 添加）和提交（用 <code>git commit</code> 提交）到主仓库的文件和目录。</li><li><strong>未被追踪的（untracked）</strong> - 这些是在工作目录中创建的，但还没有被暂存（或用 <code>git add</code> 命令添加）的任何新文件或目录。</li><li><strong>被忽略的（ignored）</strong> - 这些是 Git 知道的要全部排除、忽略或在 Git 仓库中不需要注意的所有文件或目录。本质上，这是一种告诉 Git 哪些未被追踪的文件应该保持不被追踪并且永远不会被提交的方法。</li></ul><p>所有被忽略的文件都会被保存在一个 <code>.gitignore</code> 文件中。</p><p><code>.gitignore</code> 文件是一个纯文本文件，包含了项目中所有指定的文件和文件夹的列表，这些文件和文件夹是 Git 应该忽略和不追踪的。</p><p>在 <code>.gitignore</code> 中，你可以通过提及特定文件或文件夹的名称或模式来告诉 Git 只忽略一个文件或一个文件夹。你也可以用同样的方法告诉 Git 忽略多个文件或文件夹。</p><h3 id="-gitignore-">如何创建一个 .gitignore 文件？</h3><p>通常，一个 <code>.gitignore</code> 文件会被放在仓库的根目录下。根目录也被称为父目录和当前工作目录。根目录包含了组成项目的所有文件和其他文件夹。</p><p>也就是说，你可以把它放在版本库的任何文件夹中。你甚至可以有多个 <code>.gitignore</code> 文件。</p><p>要在基于 Unix 的系统（如 macOS 或 Linux）上用命令行创建一个 <code>.gitignore</code> 文件，打开终端程序（如 macOS 上的 Terminal.app）。然后，用 <code>cd</code> 命令导航到包含项目的根文件夹，并输入以下命令，为你的目录创建一个 <code>.gitignore</code> 文件：</p><pre><code class="language-bash">touch .gitignore
</code></pre><p>名字前面有点（<code>.</code>）的文件默认是隐藏的。</p><p>当单独使用 <code>ls</code> 命令时，隐藏的文件是不可见的。要从命令行查看所有的文件--包括隐藏的文件--请在 <code>ls</code> 命令中使用 <code>-a</code> 标志，如图所示：</p><pre><code class="language-bash">ls -a
</code></pre><h3 id="-gitignore--1">在 .gitignore 文件中应包括什么？</h3><p>你应该考虑添加到 <code>.gitignore</code> 文件中的文件类型是任何不需要被提交的文件。</p><p>你可能出于安全原因不想提交它们，或者因为它们是你的本地文件，因此对与你在同一项目上工作的其他开发者来说是不必要的。</p><p>其中一些可能包括：</p><ul><li>操作系统文件。每个操作系统（如 macOS、Windows 和 Linux）都会生成系统特定的隐藏文件，其他开发者不需要使用这些文件，因为他们的系统也会生成这些文件。例如，在 macOS 上，Finder 会生成一个 <code>.DS_Store</code> 文件，其中包括用户对文件夹的外观和显示的偏好，如图标的大小和位置。</li><li>由代码编辑器和 IDE（IDE 代表集成开发环境）等应用程序生成的配置文件。这些文件是为你、你的配置和你的偏好设置定制的。</li><li>从你的项目中使用的编程语言或框架自动生成的文件，以及编译后的代码特定文件，如 <code>.o</code> 文件。</li><li>由软件包管理器生成的文件夹，如 npm 的 <code>node_modules</code> 文件夹。这是一个用于保存和跟踪你在本地安装的每个软件包的依赖关系的文件夹。</li><li>包含敏感数据和个人信息的文件。这类文件的一些例子是含有你的凭证（用户名和密码）的文件和含有环境变量的文件，如 <code>.env</code> 文件（<code>.env</code> 文件含有需要保持安全和隐私的 API 密钥）。</li><li>运行时文件，如 <code>.log</code> 文件。它们提供关于操作系统的使用活动和错误的信息，以及在操作系统中发生的事件的历史。</li></ul><h3 id="-git-">如何在 Git 中忽略一个文件和文件夹</h3><p>如果你想只忽略一个特定的文件，你需要提供该文件在项目根目录下的完整路径。</p><p>例如，如果你想忽略位于根目录下的 <code>text.txt</code> 文件，你可以做如下操作：</p><pre><code class="language-bash">/text.txt
</code></pre><p>而如果你想忽略一个位于根目录下的 <code>test</code> 目录中的 <code>text.txt</code> 文件，你要做的是：</p><pre><code class="language-bash">/test/text.txt
</code></pre><p>你也可以这样写上述内容：</p><pre><code class="language-bash">test/text.txt
</code></pre><p>如果你想忽略所有具有特定名称的文件，你需要写出该文件的字面名称。</p><p>例如，如果你想忽略任何 <code>text.txt</code> 文件，你可以在 <code>.gitignore</code> 中添加以下内容：</p><pre><code class="language-bash">text.txt
</code></pre><p>在这种情况下，你不需要提供特定文件的完整路径。这种模式将忽略位于项目中任何地方的具有该特定名称的所有文件。</p><p>要忽略整个目录及其所有内容，你需要包括目录的名称，并在最后加上斜线 <code>/</code>：</p><pre><code class="language-bash">test/
</code></pre><p>这个命令将忽略位于你的项目中任何地方的名为 <code>test</code> 的目录（包括目录中的其他文件和其他子目录）。</p><p>需要注意的是，如果你只写一个文件的名字或者只写目录的名字而不写斜线 <code>/</code>，那么这个模式将同时匹配任何带有这个名字的文件或目录：</p><pre><code class="language-bash"># 匹配任何名字带有 test 的文件和目录
test
</code></pre><p>如果你想忽略任何以特定单词开头的文件或目录怎么办？</p><p>例如，你想忽略所有名称以 <code>img</code> 开头的文件和目录。要做到这一点，你需要指定你想忽略的名称，后面跟着 <code>*</code> 通配符选择器，像这样：</p><pre><code class="language-bash">img*
</code></pre><p>这个命令将忽略所有名字以 <code>img</code> 开头的文件和目录。</p><p>但是，如果你想忽略任何以特定单词结尾的文件或目录呢？</p><p>如果你想忽略所有以特定文件扩展名结尾的文件，你需要使用 <code>*</code> 通配符选择器，后面跟你想忽略的文件扩展名。</p><p>例如，如果你想忽略所有以 <code>.md</code> 文件扩展名结尾的 markdown 文件，你可以在你的 <code>.gitignore</code> 文件中添加以下内容：</p><pre><code class="language-bash">*.md
</code></pre><p>这个模式将匹配位于项目中任何地方的以 <code>.md</code> 为扩展名的任何文件。</p><p>前面，你看到了如何忽略所有以特定后缀结尾的文件。当你想做一个例外，而有一个后缀的文件你不想忽略的时候，会发生什么？</p><p>假设你在你的 <code>.gitignore</code> 文件中添加了以下内容：</p><pre><code class="language-bash">.md
</code></pre><p>这个模式会忽略所有以 <code>.md</code> 结尾的文件，但你不希望 Git 忽略一个 <code>README.md</code> 文件。</p><p>要做到这一点，你需要使用带有感叹号的否定模式，即 <code>!</code>，来排除一个本来会被忽略的文件：</p><pre><code class="language-bash"># 忽略所有 .md 文件
.md

# 不忽略 README.md 文件
!README.md
</code></pre><p>在 <code>.gitignore</code> 文件中使用这两种模式，所有以 <code>.md</code> 结尾的文件都会被忽略，除了 <code>README.md</code> 文件。</p><p>需要记住的是，如果你忽略了整个目录，这个模式就不起作用。</p><p>例如，你忽略了所有的 <code>test</code> 目录：</p><pre><code class="language-bash">test/
</code></pre><p>假设在一个 <code>test</code> 文件夹内，你有一个文件，<code>example.md</code>，你不想忽略它。</p><p>你不能像这样在一个被忽略的目录内排除一个文件：</p><pre><code class="language-bash"># 忽略所有名字带有 test 的目录
test/

# 试图在一个被忽略的目录内排除一个文件是行不通的
!test/example.md
</code></pre><h3 id="-">如何忽略以前提交的文件</h3><p>当你创建一个新的仓库时，最好的做法是创建一个 <code>.gitignore</code> 文件，包含所有你想忽略的文件和不同的文件模式--在提交之前。</p><p>Git 只能忽略尚未提交到仓库的未被追踪的文件。</p><p>如果你过去已经提交了一个文件，但希望没有提交，会发生什么？</p><p>比如你不小心提交了一个存储环境变量的 <code>.env</code> 文件。</p><p>你首先需要更新 <code>.gitignore</code> 文件以包括 <code>.env</code> 文件：</p><pre><code class="language-bash"># 给 .gitignore 添加 .env 文件
echo ".env" &gt;&gt; .gitignore
</code></pre><p>现在，你需要告诉 Git 不要追踪这个文件，把它从索引中删除：</p><pre><code class="language-bash">git rm --cached .env
</code></pre><p><code>git rm</code> 命令，连同 <code>--cached</code> 选项，从版本库中删除文件，但不删除实际的文件。这意味着该文件仍然在你的本地系统和工作目录中作为一个被忽略的文件。</p><p><code>git status</code> 会显示该文件已不在版本库中，而输入 <code>ls</code> 命令会显示该文件存在于你的本地文件系统中。</p><p>如果你想从版本库和你的本地系统中删除该文件，省略 <code>--cached</code> 选项。</p><p>接下来，用 <code>git add</code> 命令将 <code>.gitignore</code> 添加到暂存区：</p><pre><code class="language-bash">git add .gitignore
</code></pre><p>最后，用 <code>git commit</code> 命令提交 <code>.gitignore</code> 文件：</p><pre><code class="language-bash">git commit -m "update ignored files"
</code></pre><h2 id="--1"><strong>总结</strong></h2><p>你现在知道了在 Git 中忽略文件和文件夹的基本知识。</p><p>希望这篇文章对你有所帮助。</p><p>想了解更多关于 Git 的信息，请查看以下免费资源：</p><ul><li><a href="https://www.youtube.com/watch?v=RGOj5yH7evk">Git 和 GitHub 入门课程</a></li><li><a href="https://www.youtube.com/watch?v=Uszj_k0DGsg">面向专业人士的 Git 教程 - 掌握 Git 版本控制的工具和概念</a></li><li><a href="https://www.youtube.com/watch?v=qsTthZi23VE">高级 Git 教程 - 交互式 Rebase、Cherry-Picking、Reflog、Submodules 以及更多</a></li></ul><p>感谢阅读，happy coding:)</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 如何在 Git 中修复错误 Error: src refspec master does not match any ]]>
                </title>
                <description>
                    <![CDATA[ 在使用 Git 时，你可能会遇到 “src refspace master does not match any” 的错误。 下面是这个错误的含义，以及如何解决它。 Git 中的 src refspec master does not match any 是什么意思 当你试图从本地仓库触发推送到主仓库时，你可能会遇到这样的错误： git push origin master 这个错误可能是由不同原因引起的。 最有可能出现这种错误的原因是，master 分支不存在。 也许你克隆了一个新的仓库，默认的分支是 main，所以当你试图推送时，没有 master 分支。 你可以用 git branch -b 命令来显示连接到本地仓库的远程分支，像这样： git branch -b # results #  origin/main #  origin/feat/authentication ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/error-src-refspec-master-does-not-match-any-how-to-fix-in-git/</link>
                <guid isPermaLink="false">63fb5ddc0687e3060be26a76</guid>
                
                    <category>
                        <![CDATA[ Git ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Chengjun.L ]]>
                </dc:creator>
                <pubDate>Tue, 21 Feb 2023 13:12:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2023/02/refspec-master-error.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>原文：</strong> <a href="https://www.freecodecamp.org/news/error-src-refspec-master-does-not-match-any-how-to-fix-in-git/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Error: src refspec master does not match any – How to Fix in Git</a>
      </p><p>在使用 Git 时，你可能会遇到 “src refspace master does not match any” 的错误。</p><p>下面是这个错误的含义，以及如何解决它。</p><h2 id="git-src-refspec-master-does-not-match-any-"><strong>Git 中的 </strong><code><strong>src refspec master does not match any</strong></code><strong> 是什么意思</strong></h2><p>当你试图从本地仓库触发推送到主仓库时，你可能会遇到这样的错误：</p><pre><code class="language-bash">git push origin master
</code></pre><p>这个错误可能是由不同原因引起的。</p><p>最有可能出现这种错误的原因是，<code>master</code> 分支不存在。</p><p>也许你克隆了一个新的仓库，默认的分支是 <code>main</code>，所以当你试图推送时，没有 <code>master</code> 分支。</p><p>你可以用 <code>git branch -b</code> 命令来显示连接到本地仓库的远程分支，像这样：</p><pre><code class="language-bash">git branch -b

# results
#  origin/main
#  origin/feat/authentication
#  origin/other branches ...
</code></pre><p>在上面的结果中，你可以看到没有 <code>master</code> 仓库（<code>origin/master</code>）。所以当你试图推送到该仓库时，你会得到 “respec error”。</p><p>这个结果也适用于任何其他不存在的分支。比方说，我做了一些修改，并推送到一个不存在的远程 <code>hello</code> 分支：</p><pre><code class="language-bash">git add .
git commit -m "new changes"
git push origin hello
</code></pre><p>该命令将产生以下错误：</p><pre><code class="language-bash">error: src refspec hello does not match any
</code></pre><h2 id="-src-refspec-master-does-not-match-any-">如何修复 “<strong>src refspec master does not match any</strong>” 错误</h2><p>现在你已经知道 <code>master</code> 分支并不存在。解决这个错误的办法是，要么建立一个本地和远程的 <code>master</code> 分支，以便推送提交，要么将提交推送到一个现有的分支——也许是 <code>main</code>。</p><p>你可以在 Git 驱动的网站（比如 GitHub）上创建一个远程 <code>master</code> 分支，也可以像这样直接在终端上创建：</p><pre><code class="language-bash">git checkout -b master

# add commit

git push origin master
</code></pre><p>这些命令将在本地创建一个 <code>master</code> 分支。而通过推送到 <code>origin master</code>，也会在远程创建 <code>master</code> 分支。</p><p>但如果你不想创建一个 <code>master</code> 分支，你可以使用现有的默认分支（可能是 <code>main</code>）来代替。</p><h2 id="-">总结</h2><p>所以，如果你在推送到主干时遇到 <code>Error: src refspec master does not match any</code>，最可能的原因是 <code>master</code> 分支不存在。</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Git 如何恢复到之前的提交 ]]>
                </title>
                <description>
                    <![CDATA[ Git [https://www.freecodecamp.org/news/git-and-github-for-beginners/]  是一个很好的版本控制工具。它还能使你与他人的协作更有效率。 在这篇文章中，你将学习如何在用 Git 跟踪项目时恢复到之前的 commit（提交）。 本文要讨论的两个命令是 git reset 和 git revert。这些命令可以帮助你撤销你的 commit，回到之前的 commit。 不过它们并不完全相同，所以我们将通过演示每个命令在项目中如何运行的来使本文更实用一些。 任何人都可以理解这个教程，因为它不是关于特定的语言——我们将利用一个文本（txt）文件。 如何使用 git reset 命令恢复到之前的 commit 在本节中，我们将创建一个新文件，并进行三次 commit。然后你会看到如何使用 commit ID 恢复到上一次 commit 或任何其他 commit。 首先，我创建了一个名为 tasks.txt 的文件。该文件中有如下内容： 1. code. 2. Practice. 3. Build.  接下来，我们要初始 ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/git-reverting-to-previous-commit-how-to-revert-to-last-commit/</link>
                <guid isPermaLink="false">63f37df1cf34b8063af88e2a</guid>
                
                    <category>
                        <![CDATA[ Git ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Chengjun.L ]]>
                </dc:creator>
                <pubDate>Mon, 13 Feb 2023 04:12:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2023/02/roman-synkevych-wX2L8L-fGeA-unsplash.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>原文：</strong> <a href="https://www.freecodecamp.org/news/git-reverting-to-previous-commit-how-to-revert-to-last-commit/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Git Reverting to Previous Commit – How to Revert to Last Commit</a>
      </p><p><a href="https://www.freecodecamp.org/news/git-and-github-for-beginners/">Git</a> 是一个很好的版本控制工具。它还能使你与他人的协作更有效率。</p><p>在这篇文章中，你将学习如何在用 Git 跟踪项目时恢复到之前的 commit（提交）。</p><p>本文要讨论的两个命令是 <code>git reset</code> 和 <code>git revert</code>。这些命令可以帮助你撤销你的 commit，回到之前的 commit。</p><p>不过它们并不完全相同，所以我们将通过演示每个命令在项目中如何运行的来使本文更实用一些。</p><p>任何人都可以理解这个教程，因为它不是关于特定的语言——我们将利用一个文本（txt）文件。</p><h2 id="-git-reset-commit">如何使用 git reset 命令恢复到之前的 commit</h2><p>在本节中，我们将创建一个新文件，并进行三次 commit。然后你会看到如何使用 commit ID 恢复到上一次 commit 或任何其他 commit。</p><p>首先，我创建了一个名为 <code>tasks.txt</code> 的文件。该文件中有如下内容：</p><pre><code class="language-txt">1. code.
2. Practice.
3. Build. </code></pre><p>接下来，我们要初始化、添加和提交这个文件：</p><pre><code class="language-bash">git init
git add tasks.txt
git commit -m "first commit"</code></pre><p>我们已经进行了第一次 commit。</p><p>我们再重复上面的过程两次，但在每次 commit 之前，我们会在文件中多加一行文字，如下：</p><pre><code class="language-txt">1. code.
2. Practice.
3. Build. 
4. Research. </code></pre><pre><code class="language-bash">git add tasks.txt
git commit -m "second commit"</code></pre><p>最后，对于第三次 commit：</p><pre><code class="language-txt">1. code.
2. Practice.
3. Build. 
4. Research. 
5. Write.</code></pre><pre><code class="language-bash">git add tasks.txt
git commit -m "third commit"</code></pre><p>现在我们有三个 commit。要恢复到之前的 commit，你必须先得到 commit ID。要做到这一点，请执行下面的命令：</p><pre><code class="language-bash">git log --oneline</code></pre><p>我们的终端中显示如下：</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2022/10/git-commit.PNG" class="kg-image" alt="git-commit" width="600" height="400" loading="lazy"><figcaption>git log --oneline</figcaption></figure><p>正如你在上面看到的，这个命令列出了你所有的 commit 以及它们的 ID。</p><p>要回到第二个 commit，你可以运行 <code>git reset</code> 命令，后面跟上 commit 的 ID，即：</p><pre><code class="language-bash">git reset 5914db0</code></pre><p>如果你一直跟到这一步，你不会注意到文件有什么不同（你会在后面看到如何撤销提交和对文件的任何修改）。</p><p>文件仍然是这个样子的：</p><pre><code class="language-txt">1. code.
2. Practice.
3. Build. 
4. Research. 
5. Write.</code></pre><p>但当我们运行 <code>git log --oneline</code> 命令时，第三次提交不会出现在提交日志中：</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2022/10/second-commit.PNG" class="kg-image" alt="second-commit" width="600" height="400" loading="lazy"><figcaption>git log --oneline</figcaption></figure><p>我们已经成功回到了之前的 commit。</p><p>如果你想撤销一个 commit，并撤销该提交之后的所有修改，你可以在 <code>git reset</code> 命令中加上 <code>--hard</code> 标志：</p><p>让我们测试一下这个方法，回到第一个 commit：</p><pre><code class="language-bash">git reset 89f6c3d --hard</code></pre><p>这就是文本文件现在的样子：</p><pre><code class="language-txt">1. code.
2. Practice.
3. Build. </code></pre><p>我们又回到了指定提交时的文件初始状态。所有在那次 commit 之后对文件所做的修改都被删除。当我们检查提交日志时，我们将只看到第一次 commit。</p><p>虽然这看起来是件很酷的事情，但在使用这条命令时，你应该小心。特别是当你和一个团队一起工作时。</p><p>如果你撤销了一个 commit，并删除了它之后的每一个文件改动，你可能会失去你和其他队友对代码所做的重要改动。这也会改变你项目的提交历史。</p><p>幸运的是，我们有办法恢复被删除的 commit 的状态。你可以在<a href="https://www.freecodecamp.org/chinese/news/how-to-recover-a-deleted-file-in-git/">这里</a>了解更多信息。</p><h2 id="-git-revert-commit-">如何使用 git revert 命令恢复到之前的 commit 内容</h2><p>我已经初始化了项目，并像上一节中那样做了三次 commit。下面是提交日志的样子：</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2022/10/commit-log.PNG" class="kg-image" alt="commit-log" width="600" height="400" loading="lazy"><figcaption>git log --oneline</figcaption></figure><p>要恢复到之前的 commit，请运行 <code>git revert</code> 命令，同时输入当前提交的 ID。</p><p>在我们的例子中，我们将使用第三个提交的 ID：</p><pre><code class="language-bash">git revert 882ad02</code></pre><p>上面的命令会撤销当前的 commit，将文件恢复到上一次 commit 的状态。当你检查 commit 日志时，你会看到这样的内容：</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2022/10/revert-log.PNG" class="kg-image" alt="revert-log" width="600" height="400" loading="lazy"><figcaption>git log --oneline</figcaption></figure><p>与 <code>git reset</code> 命令不同的是，<code>git revert</code> 命令为被还原的改动创建一个新的 commit。我们还原的那个 commit 不会被删除。</p><p>所以你可以看到，<code>git reset</code> 和 <code>git revert</code> 是不一样的。</p><p><code>git reset</code> 会撤消直到指定的 commit ID 的状态的改动。例如，恢复到第二个 commit ID 的状态将撤消改动，并将文件的状态保持为第二个 commit 的状态。</p><p><code>git revert</code> 将撤消到指定的 commit ID 之前的状态。例如，还原到第二个 commit ID 将撤销更改，并将文件的状态保留为第二个 commit 之前的 commit 的状态——第一个 commit。</p><p>上面的解释可能看起来很混乱。理解它的最好方法是自己去尝试。</p><h2 id="-git-reset-git-revert">何时使用 git reset 和 git revert</h2><p>当你在本地仓库上工作时，如果变化尚未被远程推送，你应该使用 <code>git reset</code>。这是因为在从远程仓库拉取修改后运行该命令会改变项目的 commit 历史，导致在该项目上工作的每个人发生合并冲突。</p><p>当你意识到对某一本地分支所做的修改应该在其他地方时，<code>git reset</code> 是一个不错的选择。你可以重置并移动到想要的分支，而不会丢失你的文件修改。</p><p>对于恢复推送到远程仓库的改动，<code>git revert</code> 是一个很好的选项。因为这个命令会创建一个新的提交，而不会改变其他人的提交历史。</p><h2 id="-"><strong>总结</strong></h2><p>在这篇文章中，我们谈到了在 Git 中恢复以前的提交。</p><p>我们谈到了两个主要的命令，即 <code>git reset</code> 和 <code>git revert</code> 命令，它们显示了如何撤销 Git 修改。</p><p>我们还通过实际例子看到了这两个命令是如何工作的。</p><p>Happy coding!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Git Push 命令 ]]>
                </title>
                <description>
                    <![CDATA[ git push 命令允许你将本地 Git 仓库中的本地分支的提交发送到（或推送）远程仓库。 为了能够推送到远程仓库，你必须确保你对本地仓库的所有修改都已提交。 这个命令的语法如下： git push <repo name> <branch name> 你可以在命令中传递一些不同的选项，你可以在 Git 文档 [https://git-scm.com/docs/git-push#_options_a_id_options_a]中了解更多信息，或者运行 git push --help。 推送到一个特定的远程仓库和分支 为了推送代码，你必须先克隆一个仓库到你的本地机器。 # 一旦克隆了一个 repo，你就会在默认的分支中工作（默认是`master'）。 git clone https://github.com/<git-user>/<repo-name> && cd <repo-name> # 执行更改并暂存你的文件（对每个文件重复 `git add` 命令，或者使用 `git add .` 来暂存所有文件） git add <filename> # 现在提交你的代码 git  ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/the-git-push-command-explained/</link>
                <guid isPermaLink="false">637b80fb206aea0762969b3d</guid>
                
                    <category>
                        <![CDATA[ Git ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Miya Liu ]]>
                </dc:creator>
                <pubDate>Tue, 17 Jan 2023 13:40:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2022/11/5f9c9e41740569d1a4ca3c2d.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>原文：</strong> <a href="https://www.freecodecamp.org/news/the-git-push-command-explained/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">The Git Push Command Explained</a>
      </p><p><code>git push</code> 命令允许你将本地 Git 仓库中的本地分支的提交发送到（或推送）远程仓库。</p><p>为了能够推送到远程仓库，你必须确保<strong>你对本地仓库的所有修改都已提交</strong>。</p><p>这个命令的语法如下：</p><pre><code class="language-bash">git push &lt;repo name&gt; &lt;branch name&gt;</code></pre><p>你可以在命令中传递一些不同的选项，你可以在 <a href="https://git-scm.com/docs/git-push#_options_a_id_options_a">Git 文档</a>中了解更多信息，或者运行 <code>git push --help</code>。</p><h3 id="-">推送到一个特定的远程仓库和分支</h3><p>为了推送代码，你必须先克隆一个仓库到你的本地机器。</p><pre><code class="language-bash"># 一旦克隆了一个 repo，你就会在默认的分支中工作（默认是`master'）。
git clone https://github.com/&lt;git-user&gt;/&lt;repo-name&gt; &amp;&amp; cd &lt;repo-name&gt;
# 执行更改并暂存你的文件（对每个文件重复 `git add` 命令，或者使用 `git add .` 来暂存所有文件）
git add &lt;filename&gt;
# 现在提交你的代码
git commit -m "added some changes to my repo!"
# 将 `master` 分支中的更改推送到 GitHub
git push origin master</code></pre><p>要了解更多关于分支的信息，请查看以下链接：</p><ul><li><a href="https://github.com/renington/guides/blob/master/src/pages/git/git-checkout/index.md">git checkout</a></li><li><a href="https://github.com/renington/guides/blob/master/src/pages/git/git-branch/index.md">Git 分支</a></li></ul><h3 id="--1">推送到一个特定的远程仓库和其中的所有分支</h3><p>如果你想把所有的修改推送到远程仓库及其中的所有分支，你可以使用：</p><pre><code class="language-bash">git push --all &lt;REMOTE-NAME&gt;</code></pre><p>其中：</p><ul><li><code>--all</code> 是表示你想推送所有分支到远程仓库的标志。</li><li><code>REMOTE-NAME</code> 是你想推送到的远程仓库的名称。</li></ul><h3 id="-force-">使用 force 参数推送到特定的分支</h3><p>如果你想忽略 GitHub 上对 Git 仓库所做的本地修改（大多数开发者都是为了对开发服务器进行热修复），那么你可以使用 <code>-force</code> 命令来推送，忽略这些修改。</p><pre><code class="language-bash">git push --force &lt;REMOTE-NAME&gt; &lt;BRANCH-NAME&gt;</code></pre><p>其中：</p><ul><li><code>REMOTE-NAME</code> 是远程仓库的名称，你想把修改推送到这个仓库。</li><li><code>BRANCH-NAME</code> 是你要推送的远程分支的名称。</li></ul><h3 id="-git-">推送忽略 Git 的预推送钩子</h3><p>默认情况下，<code>git push</code> 推送会触发 <code>--verify</code> 开关。这意味着 Git 会执行任何可能已经配置好的客户端预推送脚本。如果预推送脚本失败，Git 推送也会失败。(预推送钩子很适合做一些事情，比如，检查提交信息是否符合公司标准、运行单元测试等等）。偶尔你可能希望忽略这个默认行为，例如，你希望将你的修改推送到一个特性分支，让其他贡献者拉取，但你正在进行的修改会破坏单元测试。要忽略这个钩子，只需在推送命令中加入标志 <code>--no-verify</code>。</p><pre><code class="language-bash">git push --no-verify</code></pre><h3 id="--2"><strong><strong><strong>更多信息</strong></strong></strong></h3><ul><li><a href="https://git-scm.com/docs/git-push">Git 文档 - push</a></li><li><a href="https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks">Git hooks</a></li></ul> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Git diff 命令——如何比较你的代码中的变化 ]]>
                </title>
                <description>
                    <![CDATA[ 嘿，朋友们，你是否曾经在 Git 中工作时，发现自己不知道是否要暂存（stage）正确的修改？ 或者你想看看你要提交的改动与上次提交的改动相比有何不同。也许你想看看两个分支、提交或文件之间的差异。 这些都是使用版本控制系统时常见的问题和任务。幸运的是，你可以用 Git diff 命令来验证这一切。 我知道你的时间宝贵，所以我们直接开始吧。 别担心，我会用一个有趣的例子来教你每个命令。放宽心，开始阅读这篇文章吧。 git diff——通用的 diff 命令 git diff 列出了你的当前工作目录和暂存区域之间的变化。 让我们举个例子。我创建了一个 Git 仓库，它是 cat_vs_dog。这不是一个正式的仓库，但它是相当严肃的。😉 然后我创建了 cat.txt 和  dog.txt。 它们的名字就是它们的介绍了——像这样： 然后我们用 git add cat.txt dog.txt 把这个改动移到暂存区。想确认一下吗？那就用 git status  吧，它可以显示哪些修改已经准备好提交了，如下图： 然后，假设我想对狗的名字做一些改动——比如我希望叫它 “pup” 而 ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/git-diff-command/</link>
                <guid isPermaLink="false">63aecf77f490ad0743626aa5</guid>
                
                    <category>
                        <![CDATA[ Git ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Chengjun.L ]]>
                </dc:creator>
                <pubDate>Mon, 19 Dec 2022 08:22:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2022/12/git-diff.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>原文：</strong> <a href="https://www.freecodecamp.org/news/git-diff-command/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Git diff Command – How to Compare Changes in Your Code</a>
      </p><p>嘿，朋友们，你是否曾经在 Git 中工作时，发现自己不知道是否要暂存（stage）正确的修改？</p><p>或者你想看看你要提交的改动与上次提交的改动相比有何不同。也许你想看看两个分支、提交或文件之间的差异。</p><p>这些都是使用版本控制系统时常见的问题和任务。幸运的是，你可以用 Git diff 命令来验证这一切。</p><p>我知道你的时间宝贵，所以我们直接开始吧。</p><p>别担心，我会用一个有趣的例子来教你每个命令。放宽心，开始阅读这篇文章吧。</p><h2 id="git-diff-diff-"><strong><code>git diff</code>——通用的 diff 命令</strong></h2><p><code>git diff</code> 列出了<strong>你的当前工作目录和暂存区域之间的变化</strong>。</p><p>让我们举个例子。我创建了一个 Git 仓库，它是 <code>cat_vs_dog</code>。这不是一个正式的仓库，但它是相当严肃的。😉 然后我创建了 <code>cat.txt</code> 和 <code>dog.txt</code>。</p><p>它们的名字就是它们的介绍了——像这样：</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/03/kitty-1.png" class="kg-image" alt="kitty-1" width="600" height="400" loading="lazy"></figure><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/03/puppy-1.png" class="kg-image" alt="puppy-1" width="600" height="400" loading="lazy"></figure><p>然后我们用 <code>git add cat.txt dog.txt</code> 把这个改动移到暂存区。想确认一下吗？那就用 <code>git status</code> 吧，它可以显示哪些修改已经准备好提交了，如下图：</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/03/status.png" class="kg-image" alt="status" width="600" height="400" loading="lazy"></figure><p>然后，假设我想对狗的名字做一些改动——比如我希望叫它 “pup” 而不是 “puppy”。</p><p>在此之前，如果我运行 <code>git diff</code> 命令，它没有显示什么。你能猜到为什么吗？如果你不能，那也完全没问题。在这上面停顿几秒钟，我们继续看下面的内容吧。</p><p>现在，我把 “puppy” 改为 “pup”。叫它 pup 很酷。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/03/pup.png" class="kg-image" alt="pup" width="600" height="400" loading="lazy"></figure><p>在暂存它们之前，我希望看到我在当前工作目录（也就是当前工作文件夹）中的改动与暂存的改动相比较。</p><p>为了做到这一点，我运行了 <code>git diff</code> 命令。现在你可以看到它们的区别如下。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/03/diff.png" class="kg-image" alt="diff" width="600" height="400" loading="lazy"></figure><p>这有点说得通，但也有点奇怪，对吗？别怕，我将教你了解每一行 diff 的结果。</p><p>之前，我们运行了 <code>git diff</code> 命令，它没有显示什么。因为 <code>git diff</code> 显示的是你的工作目录和暂存区的变化之间的差异。但是，我们在暂存修改之后，并没有在工作目录中修改任何东西。所以，与暂存区域相比，没有什么不同。我希望这么说，你能理解。</p><h2 id="-git-diff-"><strong>一行一行地理解 </strong><code><strong>git diff</strong></code><strong> 的结果</strong></h2><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/03/1-1.png" class="kg-image" alt="1-1" width="600" height="400" loading="lazy"></figure><p><strong>第 1 行</strong>——这是同一个文件的两个版本。Git 把<strong>第一个版本</strong>命名为 <strong>A</strong>，把<strong>第二个版本</strong>命名为 <strong>B</strong>。</p><ul><li>A - 文件的旧版本</li><li>B - 文件的新版本</li></ul><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/03/2-2.png" class="kg-image" alt="2-2" width="600" height="400" loading="lazy"></figure><p><strong><strong>第 2</strong></strong> 行——关于文件的元数据，这对你的生活并不超级有用。前两个哈希值涉及到被比较的两个文件。<strong>100644</strong> 是一个内部文件模式标识符。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/03/3-1.png" class="kg-image" alt="3-1" width="600" height="400" loading="lazy"></figure><p><strong><strong>第 3</strong></strong> 行——Git 给文件的<strong> A</strong> 版分配了一个减号（-），给文件的 <strong>B</strong> 版分配了一个加号（+）。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/03/4--.png" class="kg-image" alt="4--" width="600" height="400" loading="lazy"></figure><p><strong><strong>第 4 行——</strong></strong>Git 通常显示被修改的<strong>一大块的行</strong>，而不是整个文件。</p><ul><li>以（-）符号开头的行来自 A 版本</li><li>以（+）符号开始的行来自 B 版本</li></ul><p>除了被修改的行，还包括该块前后的一些代码行，以显示上下文。</p><p><strong><strong>第 5</strong></strong> 行——每个块都以一个<strong>块头（Chunk header）</strong>开始。块头将由 @@（在开始和结束时）来标识。然后，有两组数字。你能看到 <strong>-1</strong> 和 <strong>+1</strong> 吗？</p><ul><li><strong>-1</strong> 意味着从 <strong>A 版</strong>文件中，从第 1 行开始提取一行。</li><li><strong>+1</strong> 表示从 <strong>B 版</strong>文件中，从第 1 行开始提取一行。</li></ul><p>如果这些集合是 <strong><strong>-3,4</strong></strong> <strong><strong>+3,2</strong></strong>，那么：</p><ul><li><strong><strong>-3,4</strong> </strong>表示从 <strong>A 版</strong>文件中提取了从第 3 行开始的 4 行。</li><li><strong>+3,2</strong> 表示从 <strong>B 版</strong>文件中提取了从第 3 行开始的 2 行。</li></ul><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/03/endline.png" class="kg-image" alt="endline" width="600" height="400" loading="lazy"></figure><p><strong>文件末尾没有换行</strong>——文本中说，在这些修改过的行之后没有行。这意味着，在上面的例子中，我只增加了一行，而且还修改了同一行。所以，在这之后就没有更多的行了。</p><p>这就是为什么在 diff 的结果中显示 “No newline at end of file”。希望你能明白我的意思。</p><h2 id="-">庆祝时间</h2><p>花一小会儿时间来庆祝你的努力，因为你已经有了 diff 的结果。现在，你有了一个坚实的基础，所以你可以开始微笑着学习更多的命令......</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/03/Tan-Round-Minimalist-Modern-Typography-Pretty-things-inside-Circle-Sticker--1-.png" class="kg-image" alt="Tan-Round-Minimalist-Modern-Typography-Pretty-things-inside-Circle-Sticker--1-" width="600" height="400" loading="lazy"></figure><h2 id="-git-">如何在 Git 中比较已暂存的更改</h2><p>在你提交修改之前，可以将暂存的修改与上次提交的修改进行比较。你可以通过添加一个标志 <code>--staged</code> 或 <code>--cached</code> 来做到这一点。我喜欢 <code>--staged</code>，因为它很有意义。如果你喜欢 <code>--cached</code>，那也很好。</p><p>让我通过一个例子来解释。首先，我们在 <code>cat_vs_dog</code> 仓库中提交我们暂存的修改。如果你不记得我们暂存了什么，它们是 kitty 和 puppy。</p><p>在那里，我们想做一个改变——也就是说，我们希望把 “puppy” 改成 “pup”，这不是暂存的。</p><p>好吧，首先我们用 <code>git commit -m "introduction to cat and dog</code> 来提交已暂存的修改：</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/03/stage.png" class="kg-image" alt="stage" width="600" height="400" loading="lazy"></figure><p>现在，暂存从 “puppy” 到 “pup” 的变化。然后，运行 <code>git diff --staged</code> 命令，它列出了<strong>暂存区域</strong>和你最后<strong>一次提交</strong>之间的变化。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/03/pup-1.png" class="kg-image" alt="pup-1" width="600" height="400" loading="lazy"></figure><ul><li><strong>A 版本</strong>——在 <code>dog.txt</code> 中包含行 <code>my name is puppy</code> 的最后一次提交</li><li><strong>B 版本</strong>——与上次提交不同的暂存区，比如 <code>dog.txt</code> 中的 “puppy” 改为 “pup”。</li></ul><p>从 diff 的结果来看，我们清除了我们修改和暂存的内容——A 版本中的 “my name is puppy” 和 B 版本中的 “my name is pup”。</p><p>我希望你现在能够通过看 diff 的结果来比较这些变化，并认识到我们改变了什么。diff 是一个超级强大的命令，它可以让你以很多方式来比较变化。</p><h2 id="-4-diff-">你需要知道的 4 个 Diff 比较</h2><p>你可以运行 <code>git diff HEAD</code> 命令，将已暂存和未暂存的修改与你的最后一次提交进行比较。</p><p>你也可以运行 <code>git diff &lt;branch_name1&gt; &lt;branch_name2&gt;</code> 命令来比较第一个分支的改动和第二个分支的改动。在比较分支的时候，顺序确实很重要。所以 diff 的结果会因顺序不同而改变。</p><p>最重要的提示：分支比较只考虑提交的内容，它并不考虑暂存的和未暂存的修改。</p><p>你可以运行 <code>git diff &lt;commit_hash&gt; &lt;commit_hash&gt;</code> 命令来比较两个提交之间的变化。和分支比较一样，顺序在比较提交时也很重要。</p><p>你可以运行下面的命令来比较特定文件的变化：</p><ul><li><code>git diff HEAD &lt;file_name&gt;</code></li><li><code>git diff &lt;file_name&gt;</code></li><li><code>git diff --staged &lt;file_name&gt;</code> or &nbsp;<code>git diff --cached &lt;file_name&gt;</code>,</li><li><code>git diff &lt;branch_name1&gt; &lt;branch_name2&gt; &lt;file_name&gt;</code></li><li><code>git diff &lt;commit_hash&gt; &lt;commit_hash&gt; &lt;file_name&gt;</code></li></ul><h2 id="--1"><strong>总结</strong></h2><p>我希望这篇文章能帮助你使你的下一次提交或暂存更加准确。在使用 Git 命令时，你的心态很重要。充满信心地处理它，你就能从任何错误中学习。</p><p>如果你发现本教程中有什么需要更新的地方，请随时与我联系😜.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 如何在 Git 中推送一个空的提交 ]]>
                </title>
                <description>
                    <![CDATA[ 在这篇文章中，我们将讨论如何在 Git 中推送一个不做任何修改的提交。 Git 让推送空提交的过程变得非常简单。这就像推送普通的提交一样，只不过你要加上 --allow-empty 标志。 git commit --allow-empty -m "Empty-Commit" 你现在需要将其推送到主目录。要做到这一点，你可以使用这个命令： git push origin main 你可以看到，运行上述命令后，提交的内容已经被推送到你的分支，没有任何改动。 为什么需要推送一个空的提交？ 有可能你需要在不对项目做任何修改的情况下启动构建。或者你可能无法手动启动构建，启动构建的唯一方法是使用 Git。你可以在不对项目做任何修改的情况下，通过推送一个空的提交来启动构建。 以上就是一个简单的介绍 🥳 ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/how-to-push-an-empty-commit-with-git/</link>
                <guid isPermaLink="false">635cdb9c73e419079177b612</guid>
                
                    <category>
                        <![CDATA[ Git ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Miya Liu ]]>
                </dc:creator>
                <pubDate>Tue, 25 Oct 2022 07:29:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2022/10/Push.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>原文：</strong> <a href="https://www.freecodecamp.org/news/how-to-push-an-empty-commit-with-git/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Push an Empty Commit in Git</a>
      </p><p>在这篇文章中，我们将讨论如何在 Git 中推送一个不做任何修改的提交。</p><p>Git 让推送空提交的过程变得非常简单。这就像推送普通的提交一样，只不过你要加上 <code>--allow-empty</code> 标志。</p><pre><code>git commit --allow-empty -m "Empty-Commit"</code></pre><p>你现在需要将其推送到主目录。要做到这一点，你可以使用这个命令：</p><pre><code>git push origin main</code></pre><p>你可以看到，运行上述命令后，提交的内容已经被推送到你的分支，没有任何改动。</p><h3 id="-">为什么需要推送一个空的提交？</h3><p>有可能你需要在不对项目做任何修改的情况下启动构建。或者你可能无法手动启动构建，启动构建的唯一方法是使用 Git。你可以在不对项目做任何修改的情况下，通过推送一个空的提交来启动构建。</p><p><strong>以上就是一个简单的介绍<strong> 🥳</strong></strong></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 如何重命名 Git 分支 ]]>
                </title>
                <description>
                    <![CDATA[ 如果你使用 Git 进行版本控制，很可能你出于各种原因创建了分支。 如果你发现拼写错误或者更改代码，你可能需要重命名分支。 在本文中，我将向你展示如何在不切换到另一个分支的情况下重命名你正在操作的分支。 如何在 Git 中重命名分支 要重命名当前不在操作的分支，通常运行命令 git branch -m old-name new-name。 例如，我目前在 main 分支上，我能够将 kolade-works 重命名为 kolade-codes。 继续阅读本文的下一部分，了解如何在 Git 中重命名当前分支。 如何在 Git 中重命名当前分支 你需要做的第一件事是运行 git branch，这样你就可以看到已有的分支： 接下来，确保你位于要更改名称的分支中。你可以通过运行 git checkout branch-name 来做到这一点。 在我的例子中，我想将 fix-bug 分支更改为 bug-fixes，所以我将运行 git checkout fix-bug： 你可以看到 git bash 向我显示了我现在所在的分支，即 fix bug。 要重命名分支，你需要运行命 ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/renaming-a-git-branch-how-to-rename-the-current-branch-in-git/</link>
                <guid isPermaLink="false">632988975ef0a407fd63013f</guid>
                
                    <category>
                        <![CDATA[ Git ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Chengjun.L ]]>
                </dc:creator>
                <pubDate>Tue, 20 Sep 2022 09:18:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2022/09/git-branches.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>原文：</strong> <a href="https://www.freecodecamp.org/news/renaming-a-git-branch-how-to-rename-the-current-branch-in-git/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Renaming a Git Branch – How to Rename the Current Branch in Git</a>
      </p><p>如果你使用 Git 进行版本控制，很可能你出于各种原因创建了分支。</p><p>如果你发现拼写错误或者更改代码，你可能需要重命名分支。</p><p>在本文中，我将向你展示如何在不切换到另一个分支的情况下重命名你正在操作的分支。</p><h2 id="-git-">如何在 Git 中重命名分支</h2><p>要重命名当前不在操作的分支，通常运行命令 <code>git branch -m old-name new-name</code>。</p><p>例如，我目前在 <code>main</code> 分支上，我能够将 <code>kolade-works</code> 重命名为 <code>kolade-codes</code>。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/09/ss1-1.png" class="kg-image" alt="ss1-1" width="600" height="400" loading="lazy"></figure><p>继续阅读本文的下一部分，了解如何在 Git 中重命名当前分支。</p><h2 id="-git--1">如何在 Git 中重命名当前分支</h2><p>你需要做的第一件事是运行 <code>git branch</code>，这样你就可以看到已有的分支：</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/09/ss2-1.png" class="kg-image" alt="ss2-1" width="600" height="400" loading="lazy"></figure><p>接下来，确保你位于要更改名称的分支中。你可以通过运行 <code>git checkout branch-name</code> 来做到这一点。</p><p>在我的例子中，我想将 <code>fix-bug</code> 分支更改为 <code>bug-fixes</code>，所以我将运行 <code>git checkout fix-bug</code>：</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/09/ss3-1.png" class="kg-image" alt="ss3-1" width="600" height="400" loading="lazy"></figure><p>你可以看到 <code>git bash</code> 向我显示了我现在所在的分支，即 <code>fix bug</code>。</p><p>要重命名分支，你需要运行命令 <code>git branch -m new-name</code>。</p><p>前面说我想将 <code>fix bug</code> 分支重命名为 <code>bug-fixes</code>，因此我将运行 <code>git branch -m bug-fixes</code>。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/09/ss4-1.png" class="kg-image" alt="ss4-1" width="600" height="400" loading="lazy"></figure><p><code>-m</code> 是 <code>move</code> 的缩写。</p><p>你可以看到分支的名称已成功更改为 <code>bug fixes</code>。</p><p>要确认这一点，你可以再次运行 <code>git branch</code>：</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/09/ss5-1.png" class="kg-image" alt="ss5-1" width="600" height="400" loading="lazy"></figure><h2 id="-"><strong>小结</strong></h2><p>本文向你展示了如何重命名本地 Git 分支，尤其是当它是当前分支时。即使它不是当前分支，你也已经了解了使用什么命令来更改它。</p><p>如果你也想了解如何重命名远程分支，我也写了一篇关于这个主题的<a href="https://chinese.freecodecamp.org/news/how-to-rename-a-local-or-remote-branch-in-git/">文章</a>。</p><p>感谢你阅读本文。</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Git 撤销合并——如何在 Git 中恢复之前的合并提交 ]]>
                </title>
                <description>
                    <![CDATA[ 分支是 Git 不可或缺的一部分，因为它可以让你在不修改已经投入生产的代码的情况下工作。 当你在 main 以外的分支完成工作后，你需要将它与 main 合并，以便反映你刚刚集成的功能或错误修复。 但是，如果你在合并之后发现还有一件事情忘了做怎么办？或者，如果你在没有准备好时意外合并了怎么办？ 你可以在 Git 中撤消几乎所有内容。因此，在本文中，我将向你展示如何在 Git 中撤销合并，以便你可以恢复到上次提交的内容。 如何在 Git 中撤消合并提交 你可以使用 Git 重置命令撤消合并。 首先，你需要检查提交哈希（或 id），以便你可以使用它返回上一个提交。 要检查哈希，请运行 git log 或 git reflog。git reflog 是一个更好的选择，因为它更具可读性。 当你获得要返回的提交的哈希时，运行 git reset --hard commit-before-the-merge： 运行命令时，你应该会看到代码编辑器中删除了一些内容。 如果你不确定上一次提交的哈希值，你可以运行 git reset --hard HEAD~1 以返回到合并之前的提交：  ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/git-undo-merge-how-to-revert-the-last-merge-commit-in-git/</link>
                <guid isPermaLink="false">6331242845d5bb0765549a11</guid>
                
                    <category>
                        <![CDATA[ Git ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Miya Liu ]]>
                </dc:creator>
                <pubDate>Mon, 19 Sep 2022 02:18:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2022/09/puppy-g3ddb72a98_1920.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>原文：</strong> <a href="https://www.freecodecamp.org/news/git-undo-merge-how-to-revert-the-last-merge-commit-in-git/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Git Undo Merge – How to Revert the Last Merge Commit in Git</a>
      </p><p>分支是 Git 不可或缺的一部分，因为它可以让你在不修改已经投入生产的代码的情况下工作。</p><p>当你在 <code>main</code> 以外的分支完成工作后，你需要将它与 <code>main</code> 合并，以便反映你刚刚集成的功能或错误修复。</p><p>但是，如果你在合并之后发现还有一件事情忘了做怎么办？或者，如果你在没有准备好时意外合并了怎么办？</p><p>你可以在 Git 中撤消几乎所有内容。因此，在本文中，我将向你展示如何在 Git 中撤销合并，以便你可以恢复到上次提交的内容。</p><h2 id="-git-">如何在 Git 中撤消合并提交</h2><p>你可以使用 Git 重置命令撤消合并。</p><p>首先，你需要检查提交哈希（或 id），以便你可以使用它返回上一个提交。</p><p>要检查哈希，请运行 <code>git log</code> 或 <code>git reflog</code>。<code>git reflog</code> 是一个更好的选择，因为它更具可读性。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/03/ss1-2.png" class="kg-image" alt="ss1-2" width="600" height="400" loading="lazy"></figure><p>当你获得要返回的提交的哈希时，运行 <code>git reset --hard commit-before-the-merge</code>：</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/03/ss-2-5.png" class="kg-image" alt="ss-2-5" width="600" height="400" loading="lazy"></figure><p>运行命令时，你应该会看到代码编辑器中删除了一些内容。</p><p>如果你不确定上一次提交的哈希值，你可以运行 <code>git reset --hard HEAD~1</code> 以返回到合并之前的提交：</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/03/ss-3-3.png" class="kg-image" alt="ss-3-3" width="600" height="400" loading="lazy"></figure><p>请注意，当你使用 <code>--hard</code> 标记撤消合并时，任何未提交的更改都将被还原。</p><h2 id="-git--1">在 Git 中撤消合并的更好方法</h2><p>由于上面讨论的方法将恢复未提交的更改，Git 提供了一个更安全的标记 <code>--merge</code>。</p><p>要使用 <code>--merge</code> 标记撤消合并，请运行 <code>git reflog</code> 以查看提交的哈希值，然后运行 <code>git reset --merge previous-commit</code>：</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/03/ss4-1.png" class="kg-image" alt="ss4-1" width="600" height="400" loading="lazy"></figure><p>你还可以通过运行 <code>git reset --merge HEAD~1</code> 将 HEAD 关键字与 <code>--merge</code> 标记一起使用：</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/03/ss5.png" class="kg-image" alt="ss5" width="600" height="400" loading="lazy"></figure><p><strong>注意：</strong>如果你在使用 <code>--merge</code> 标记时没有得到此命令的响应，请不要担心，它可以运行。</p><h2 id="-">小结</h2><p>在本文中，你学习了如何在 Git 中撤消合并，因此你可以撤消错误或不需要的合并，并更有效地使用 Git。</p><p>以下是使用 <code>--hard</code> 和 <code>--merge</code> 标记撤消合并时的要点：<code>--hard</code> 标记删除未提交的更改，而 <code>--merge</code> 标记保留未提交的更改。</p><p>感谢你阅读本文！</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 将 Git 本地分支推送到远程 ]]>
                </title>
                <description>
                    <![CDATA[ Git 分支允许你添加新功能而不会修改项目的实时版本。如果你在一个团队中工作，不同的开发人员可能在不同的分支上工作。 从长远来看，你必须将这些独立的分支推送到远程服务器。例如，GitHub、GitLab 等。 在本文中，我将向你展示如何将本地 Git 分支推送到远程服务器。你是否还没有推送并不重要。你甚至可能已经推送了你的 main  分支并想要推送另一个分支。我将从头开始向你展示一切。 如何将 Main 分支推送到远程 如果你想将 main 分支推送到远程，你可能是第一次推送。在尝试推送到远程之前，请确保你已执行以下命令：  * git init 用于初始化本地仓库  * git add . 添加本地仓库的所有文件  * git commit -m ‘commit message’ 保存你对这些文件所做的更改 要推送 main 仓库，你首先必须通过运行 git remote add <url> 将远程服务器添加到 Git。 要确认已添加远程，请运行 git remote -v： 要最终推送 repo，请运行 ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/git-push-local-branch-to-remote-how-to-publish-a-new-branch-in-git/</link>
                <guid isPermaLink="false">632836805ef0a407fd62fe49</guid>
                
                    <category>
                        <![CDATA[ Git ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Miya Liu ]]>
                </dc:creator>
                <pubDate>Mon, 12 Sep 2022 09:29:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2022/09/code-5290465_1920.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>原文：</strong> <a href="https://www.freecodecamp.org/news/git-push-local-branch-to-remote-how-to-publish-a-new-branch-in-git/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Git Push Local Branch to Remote – How to Publish a New Branch in Git</a>
      </p><p>Git 分支允许你添加新功能而不会修改项目的实时版本。如果你在一个团队中工作，不同的开发人员可能在不同的分支上工作。</p><p>从长远来看，你必须将这些独立的分支推送到远程服务器。例如，GitHub、GitLab 等。</p><p>在本文中，我将向你展示如何将本地 Git 分支推送到远程服务器。你是否还没有推送并不重要。你甚至可能已经推送了你的 <code>main</code> 分支并想要推送另一个分支。我将从头开始向你展示一切。</p><h2 id="-main-">如何将 Main 分支推送到远程</h2><p>如果你想将 <code>main</code> 分支推送到远程，你可能是第一次推送。在尝试推送到远程之前，请确保你已执行以下命令：</p><ul><li><code>git init</code> 用于初始化本地仓库</li><li><code>git add .</code> 添加本地仓库的所有文件</li><li><code>git commit -m ‘commit message’</code> 保存你对这些文件所做的更改</li></ul><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/09/ss1-2.png" class="kg-image" alt="ss1-2" width="600" height="400" loading="lazy"></figure><p>要推送 <code>main</code> 仓库，你首先必须通过运行 <code>git remote add &lt;url&gt;</code> 将远程服务器添加到 Git。</p><p>要确认已添加远程，请运行 <code>git remote -v</code>：</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/09/ss2-2.png" class="kg-image" alt="ss2-2" width="600" height="400" loading="lazy"></figure><p>要最终推送 repo，请运行 <code>git push -u origin &lt;branch-name&gt;</code>。<br>对我来说 <code>main</code> 是那个分支的名称，所以我运行 <code>git branch -M main</code>。</p><p>如果你尚未将 Git 配置为使用凭证助手，系统将要求你提供 GitHub 用户名和 PAT（个人访问令牌）：</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/09/ss3-2.png" class="kg-image" alt="ss3-2" width="600" height="400" loading="lazy"></figure><p>这就是你第一次推送 <code>main</code> 分支的方式。</p><h2 id="-">如何将新分支推送到远程</h2><p>如果你有另一个工作过的分支想要推送到远程，你仍将使用 <code>git push</code> 命令，但方式略有不同。</p><p>提醒一下，要创建一个新分支，请运行 <code>git branch branch-name</code>。要切换到该分支以便在那里工作，你必须运行 <code>git switch branch name</code> 或 <code>git checkout branch-name</code>。</p><p>要将分支推送到远程服务器，请运行 <code>git push –u origin</code>。就我而言，该分支的名称是 <code>bug-fixes</code>，所以，我需要运行 <code>git push -u origin bug-fixes</code>：</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/09/ss4-2.png" class="kg-image" alt="ss4-2" width="600" height="400" loading="lazy"></figure><p>要确认分支已被推送，请前往 GitHub 并单击分支下拉菜单，你应该在那里看到分支：</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/09/ss5-2.png" class="kg-image" alt="ss5-2" width="600" height="400" loading="lazy"></figure><h2 id="--1"><strong>小结</strong></h2><p>本文向你展示了如何将新分支推送到远程。除此之外，我们还研究了如何第一次推送到远程服务器。</p><p>如果你想了解有关 Git 的更多信息，请查看 <a href="https://chinese.freecodecamp.org/news/tag/git/">freeCodeCamp 专栏关于 Git 和 GitHub 的文章</a>。</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 如何在 macOS 上首次设置 Git ]]>
                </title>
                <description>
                    <![CDATA[ 也许你刚买了一台新的笔记本电脑，或者你是第一次使用 MacBook 进入科技行业，你需要第一次在 MacBook 上设置 Git，不必担心，我将为你介绍怎么做。 这篇简短的文章将帮助你了解如何在 macOS 上设置 Git，以便你可以立即恢复工作。 我假设你在阅读本文之前已经知道 Git 是什么以及它的作用。但是，如果你不知道，并且需要了解 Git 和版本控制，你可以查看这篇文章：Git 版本控制入门指南 [https://chinese.freecodecamp.org/news/what-is-git-learn-git-version-control/]。 让我们开始吧。 如何在 Mac 上安装 Git 在 Mac 计算机上安装 Git 的方法有很多，但最简单的方法是使用 Homebrew。你可以在本文档 [https://git-scm.com/download/mac]或此处 [https://git-scm.com/book/en/v2/Getting-Started-Installing-Git]找到其他方法以及如何使它们起作用。 如何使用 Homebrew 安 ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/setup-git-on-mac/</link>
                <guid isPermaLink="false">63098b4baeb66407f67d116b</guid>
                
                    <category>
                        <![CDATA[ Git ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Chengjun.L ]]>
                </dc:creator>
                <pubDate>Wed, 24 Aug 2022 03:20:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2022/08/pexels-ken-tomita-389819.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>原文：</strong> <a href="https://www.freecodecamp.org/news/setup-git-on-mac/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Set Up Git for the First Time on macOS</a>
      </p><p>也许你刚买了一台新的笔记本电脑，或者你是第一次使用 MacBook 进入科技行业，你需要第一次在 MacBook 上设置 Git，不必担心，我将为你介绍怎么做。</p><p>这篇简短的文章将帮助你了解如何在 macOS 上设置 Git，以便你可以立即恢复工作。</p><p>我假设你在阅读本文之前已经知道 Git 是什么以及它的作用。但是，如果你不知道，并且需要了解 Git 和版本控制，你可以查看这篇文章：<strong><a href="https://chinese.freecodecamp.org/news/what-is-git-learn-git-version-control/">Git 版本控制入门指南</a></strong>。</p><p>让我们开始吧。</p><h2 id="-mac-git">如何在 Mac 上安装 Git</h2><p>在 Mac 计算机上安装 Git 的方法有很多，但最简单的方法是使用 Homebrew。你可以在<a href="https://git-scm.com/download/mac">本文档</a>或<a href="https://git-scm.com/book/en/v2/Getting-Started-Installing-Git">此处</a>找到其他方法以及如何使它们起作用。</p><h3 id="-homebrew-git">如何使用 Homebrew 安装 Git</h3><p><a href="https://brew.sh/">Homebrew</a> 是一个免费的开源软件包管理系统，可简化 Apple 操作系统（macOS）上的软件安装。你可以使用它来安装将来需要的所有类型的包，而不仅仅是 Git。这使它非常有用。</p><p>你不需要安装应用程序或任何东西来安装 Homebrew。你只需要打开终端并通过运行以下命令安装 Homebrew：</p><pre><code class="language-bash">$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
</code></pre><p><strong>注意：</strong>输入命令后，它将要求你输入密码。</p><p>成功后，你可以在终端中通过以下命令继续安装 Git：</p><pre><code class="language-bash">$ brew install git
</code></pre><p>至此，你已经在 Mac 上安装了 Git。你现在可以通过在终端中运行以下命令来验证：</p><pre><code class="language-bash">$ Git --version
</code></pre><h2 id="-macos-git">如何在 macOS 中配置 Git</h2><p>到目前为止，你已经学会了如何安装 Git——但是单独安装 Git 并不仅仅让你可以从 Git 版本控制中推送、拉取和提交代码以及执行其他 Git 操作。</p><p>要使用 Git，你必须使用 <code>git config</code> 命令设置你的 Git 环境。这将使你能够访问控制 Git 如何在你的系统上工作的配置变量。</p><p>你需要的两个重要的 <code>git config</code> 变量是身份变量。这些可让你设置用户名和电子邮件。这是你在使用 GitHub、GitLab 等设置版本控制系统时使用的用户名和电子邮件。</p><pre><code class="language-bash">$ git config --global user.name "olawanlejoel"
$ git config --global user.email "mymail@gmail.com"
</code></pre><p><strong>注意：</strong>用你的姓名和电子邮件替换。你还应该知道 <code>--global</code> 选项可确保在整个系统中使用这些值。</p><p>完成此操作后，你还可以进行其他一些配置，即为 Git 控制台设置默认文本编辑器和颜色：</p><pre><code class="language-bash">$ git config --global core.editor emacs
$ git config --global color.ui true
</code></pre><p>你可以选择你经常使用的任何编辑器。我选择了EMACS。</p><p>现在 Git 已准备好供你使用。你可以使用以下命令检查你的 Git 配置以确保它们正确：</p><pre><code class="language-bash">$ git config --list
</code></pre><p>这将显示以下内容（使用你自己的信息）：</p><pre><code class="language-bash">user.name=olawanlejoel
user.email=mymail@gmail.com
color.ui=true
</code></pre><p>假设有一个错误，并且你希望更改任何配置，你可以重新运行特定于错误的配置命令。</p><p>例如，如果我的电子邮件有错误，我可以重新运行电子邮件配置来更正它：</p><pre><code class="language-bash">$ git config --global user.email "mynewmail@gmail.com"
</code></pre><p>现在，当你重新运行 <code>--list</code> 命令时，你将获得更新后的值：</p><pre><code class="language-bash">user.name=olawanlejoel
user.email=mynewmail@gmail.com
color.ui=true
</code></pre><h2 id="-"><strong>总结</strong></h2><p>在本文中，你学习了如何在 Mac 计算机上首次设置 Git。</p><p>如果你还想了解如何在 Windows 和 Linux 等其他系统上执行此操作，请查看<a href="https://www.freecodecamp.org/news/git-first-time-setup/">这篇全面的指南</a>。</p><p>另外，如果你也有兴趣学习一些基本的 Git 命令，这里有一份详细的<a href="https://www.freecodecamp.org/news/git-cheat-sheet/">备忘单</a>。</p><p>祝你编程愉快！</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 如何在 Git 中删除远程分支 ]]>
                </title>
                <description>
                    <![CDATA[ 当你使用 Git 时，你可能出于各种原因想要删除推送到 GitHub 等平台的远程分支。 在本文中，我将向你展示如何在 Git 中删除远程分支。但首先，让我们看看如何删除本地分支。 我将在本文中使用 Git bash，因为它比任何其他终端都更容易使用 Git。但是如果你使用另一个终端也没关系，命令还是一样的。 如何在 Git 中删除本地分支 运行 git branch 或 git branch -a 以查看你为项目创建的分支。 如果你运行 git branch -a ，它将使远程分支不同。这是我只在 Git bash 中看到的功能。 在这种情况下，test-branch2 是一个我还没有推送的分支，所以它是一个本地分支。 要删除本地分支，请运行 git branch -d branch-name。 如果你正确键入命令，你将收到分支已被删除的响应。 如何在 Git 中删除远程分支 如果你尝试使用与删除本地分支相同的命令来删除远程分支，你将收到一条消息，指出该分支已被删除。但是如果你运行 git branch -a，这个分支仍然会被列出来。 如果你检查 GitHub，分支 ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/git-delete-remote-branch/</link>
                <guid isPermaLink="false">63034b6360480505ded7ae1f</guid>
                
                    <category>
                        <![CDATA[ Git ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Chengjun.L ]]>
                </dc:creator>
                <pubDate>Mon, 22 Aug 2022 07:10:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2022/08/pexels-nidhi-tokas-dahiya-867677.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>原文：</strong> <a href="https://www.freecodecamp.org/news/git-delete-remote-branch/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Git Delete Remote Branch – How to Remove a Remote Branch in Git</a>
      </p><p>当你使用 Git 时，你可能出于各种原因想要删除推送到 GitHub 等平台的远程分支。</p><p>在本文中，我将向你展示如何在 Git 中删除远程分支。但首先，让我们看看如何删除本地分支。</p><p>我将在本文中使用 Git bash，因为它比任何其他终端都更容易使用 Git。但是如果你使用另一个终端也没关系，命令还是一样的。</p><h2 id="-git-">如何在 Git 中删除本地分支</h2><p>运行 <code>git branch</code> 或 <code>git branch -a</code> 以查看你为项目创建的分支。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/08/ss1-3.png" class="kg-image" alt="ss1-3" width="600" height="400" loading="lazy"></figure><p>如果你运行 <code>git branch -a</code> ，它将使远程分支不同。这是我只在 Git bash 中看到的功能。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/08/ss2-3.png" class="kg-image" alt="ss2-3" width="600" height="400" loading="lazy"></figure><p>在这种情况下，<code>test-branch2</code> 是一个我还没有推送的分支，所以它是一个本地分支。</p><p>要删除本地分支，请运行 <code>git branch -d branch-name</code>。</p><p>如果你正确键入命令，你将收到分支已被删除的响应。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/08/ss3-3.png" class="kg-image" alt="ss3-3" width="600" height="400" loading="lazy"></figure><h2 id="-git--1">如何在 Git 中删除远程分支</h2><p>如果你尝试使用与删除本地分支相同的命令来删除远程分支，你将收到一条消息，指出该分支已被删除。但是如果你运行 <code>git branch -a</code>，这个分支仍然会被列出来。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/08/ss4-4.png" class="kg-image" alt="ss4-4" width="600" height="400" loading="lazy"></figure><p>如果你检查 GitHub，分支仍然存在：</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/08/ss5-4.png" class="kg-image" alt="ss5-4" width="600" height="400" loading="lazy"></figure><p>要完全删除远程分支，你需要使用带有 <code>-d</code> 标志的 <code>git push origin</code> 命令，然后指定远程分支的名称。</p><p>因此，删除远程分支的命令的语法如下所示：<code>git push origin -d branch-name</code>。</p><p>例如，要删除 <code>test-branch1</code> 分支，我将运行 <code>git push origin –d test-branch1</code>：</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/08/ss6-3.png" class="kg-image" alt="ss6-3" width="600" height="400" loading="lazy"></figure><p>要验证远程分支是否已被删除，请再次运行 <code>git branch -a</code>。</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/08/ss7-2.png" class="kg-image" alt="ss7-2" width="600" height="400" loading="lazy"></figure><p>你可以看到远程分支 <code>test-branch1</code> 不再列出。</p><p>如果你再次检查 GitHub，就会发现已经没有这个分支了：</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/08/ss8-2.png" class="kg-image" alt="ss8-2" width="600" height="400" loading="lazy"></figure><h2 id="-"><strong>小结</strong></h2><p>请记住，要从项目中完全删除 Git 分支，你需要使用 <code>git push origin</code> 命令。</p><p>那是因为你已经推送了分支。因此，运行 <code>git branch -d</code> 命令只会在本地删除分支。</p><p>如果你在使用 Git 时遇到问题，我建议你将终端切换到 Git bash，因为它对所有内容都有语法高亮显示——这使得使用 Git 更容易。</p><p>感谢你阅读本文。</p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
