<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Git备忘录 on GitFAQ中文网</title><link>http://www.gitfaq.cn/</link><description>Recent content in Git备忘录 on GitFAQ中文网</description><generator>Hugo</generator><language>zh</language><copyright>[black8](https://0x8.net/)</copyright><lastBuildDate>Mon, 26 Oct 2026 17:16:02 +0800</lastBuildDate><atom:link href="http://www.gitfaq.cn/index.xml" rel="self" type="application/rss+xml"/><item><title>什么是 Git？</title><link>http://www.gitfaq.cn/docs/git-recipes/What-is-Git/</link><pubDate>Sun, 24 Nov 2024 16:50:12 +0800</pubDate><guid>http://www.gitfaq.cn/docs/git-recipes/What-is-Git/</guid><description>&lt;h1 id="什么是-git"&gt;什么是 Git？&lt;a class="anchor" href="#%e4%bb%80%e4%b9%88%e6%98%af-git" aria-label="Link"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;blockquote class=''&gt;&#10;&lt;p&gt;✍️ &lt;a href="https://github.com/houkensjtu"&gt;houkensjtu&lt;/a&gt; | &lt;a href="https://github.com/geeeeeeeeek"&gt;童仲毅&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;©️ 本文演绎自 Atlassian 编写的 &lt;a href="https://www.atlassian.com/git/tutorials/what-is-git"&gt;&lt;em&gt;What is Git&lt;/em&gt;&lt;/a&gt;。页面上所有内容采用知识共享-署名（&lt;a href="http://creativecommons.org/licenses/by/2.5/au/deed.zh"&gt;CC BY 2.5 AU&lt;/a&gt;）许可协议。&lt;/p&gt;&#10;&lt;/blockquote&gt;&lt;p&gt;到目前为止，Git 是世界上使用最为广泛的现代化版本控制系统。Git 最初由 Linux 系统内核的作者 Linus Torvalds 在 2005 年开始开发，目前已经是一个持续维护的成熟开源项目。如今，大量软件项目依赖 Git 进行版本管理，其中既有开源软件，也有商业软件。Git 在很多操作系统和集成开发环境（IDE）上都表现良好。绝大多数软件开发者或多或少都使用过 Git。&lt;/p&gt;&#10;&lt;p&gt;Git 是分布式版本管理（DVCS）的一种。CVS 和 Subversion（SVN）等集中式的版本管理软件将完整的版本历史存放在同一个地方。而在 Git 中，每个开发者的代码仓库都包含了所有变更历史。&lt;/p&gt;&#10;&lt;p&gt;除了分布式之外，Git 在设计之初也考虑了性能、安全性和灵活性。&lt;/p&gt;&#10;&lt;h3 id="高性能"&gt;高性能&lt;a class="anchor" href="#%e9%ab%98%e6%80%a7%e8%83%bd" aria-label="Link"&gt;&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;Git 的底层性能相较于其他版本管理软件有强大的优势。提交修改、创建分支、合并分支和比较版本都针对性能进行了优化。Git 中实现的算法利用了现实中代码树的特点以及它们被修改和访问的常见模式。&lt;/p&gt;&#10;&lt;p&gt;不同于某些版本管理软件，Git 在决定文件树的储存和版本历史时，不会被文件名的变化所愚弄——Git 关注的是文件的内容本身。毕竟，代码文件经常会被重命名、拆分和重新编排。Git 仓库中的文件对象通过差分编码（delta encoding，仅保存代码修改的差分）和压缩技术储存，并且直接保存文件夹中的内容和版本控制元数据。&lt;/p&gt;&#10;&lt;p&gt;分布式架构也给 Git 带来了巨大的性能优势。&lt;/p&gt;&#10;&lt;p&gt;比如说，有一名开发成员 Alice 修改了代码，添加了一些准备在 2.0 版本中发布的功能，然后提交了这些修改及其描述。随后，她又编写并提交了另一个新功能。很自然地，这两次修改是版本历史中两份独立的工作。Alice 又切换到了 1.3 版本的分支，修复了一个只影响这个旧版本的 bug。这次修复的目的是为了让团队在 2.0 版本还没有完成之前，发布一个 1.3.1 版本来解决旧版本中的一些 bug。Alice 可以立刻回到 2.0 版本分支，继续新功能开发。这一切都不需要网络连接，非常快速可靠，甚至可以在飞机中完成。当她准备好将这些单独提交的更改发送到远程仓库时，她只需要一个“推送”（push）命令。&lt;/p&gt;&#10;&lt;h3 id="安全"&gt;安全&lt;a class="anchor" href="#%e5%ae%89%e5%85%a8" aria-label="Link"&gt;&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;Git 设计时就把托管代码的完好性作为重中之重。文件内容以及文件、目录、版本、标签和提交的关联，都通过安全的加密哈希校验算法（SHA1）保护。这可以避免代码和修改历史被不小心或者恶意改变，并且保证修改历史完全可追迹。&lt;/p&gt;</description></item><item><title>安装和使用GitFS完整示例</title><link>http://www.gitfaq.cn/docs/gitfs/install-and-use-gitfs/</link><pubDate>Tue, 11 Mar 2025 08:32:11 +0800</pubDate><guid>http://www.gitfaq.cn/docs/gitfs/install-and-use-gitfs/</guid><description>&lt;h1 id="安装和使用gitfs完整示例"&gt;安装和使用GitFS完整示例&lt;a class="anchor" href="#%e5%ae%89%e8%a3%85%e5%92%8c%e4%bd%bf%e7%94%a8gitfs%e5%ae%8c%e6%95%b4%e7%a4%ba%e4%be%8b" aria-label="Link"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;h2 id="安装gitfs"&gt;安装GitFS&lt;a class="anchor" href="#%e5%ae%89%e8%a3%85gitfs" aria-label="Link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;h3 id="ubuntu安装方法"&gt;Ubuntu安装方法&lt;a class="anchor" href="#ubuntu%e5%ae%89%e8%a3%85%e6%96%b9%e6%b3%95" aria-label="Link"&gt;&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;Ubuntu 18.04+&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo add-apt-repository ppa:presslabs/gitfs&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get update&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get install gitfs&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="macos安装方法"&gt;MacOS安装方法&lt;a class="anchor" href="#macos%e5%ae%89%e8%a3%85%e6%96%b9%e6%b3%95" aria-label="Link"&gt;&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;先决条件&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="http://brew.sh/"&gt;Homebrew&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;brew install gitfs&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="debian安装方法"&gt;Debian安装方法&lt;a class="anchor" href="#debian%e5%ae%89%e8%a3%85%e6%96%b9%e6%b3%95" aria-label="Link"&gt;&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;包含Raspbian系统&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo &lt;span style="color:#ff5c57"&gt;echo&lt;/span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;deb http://ppa.launchpad.net/presslabs/gitfs/ubuntu disco main&amp;#34;&lt;/span&gt; &amp;gt; /etc/apt/sources.list.d/gitfs.list&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo &lt;span style="color:#ff5c57"&gt;echo&lt;/span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;deb-src http://ppa.launchpad.net/presslabs/gitfs/ubuntu disco main&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; /etc/apt/sources.list.d/gitfs.list&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt update&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install gitfs&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="挂载"&gt;挂载&lt;a class="anchor" href="#%e6%8c%82%e8%bd%bd" aria-label="Link"&gt;&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;在挂载之前，您需要一个有效的 git 存储库。您可以使用本地存储库或像 GitHub 这样的 git 服务。&lt;/p&gt;&#10;&lt;p&gt;为了将存储库挂载到所需的目录，请使用如下命令：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gitfs http://your.com/repository.git /mount/directory&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="完整的-github-示例"&gt;完整的 github 示例&lt;a class="anchor" href="#%e5%ae%8c%e6%95%b4%e7%9a%84-github-%e7%a4%ba%e4%be%8b" aria-label="Link"&gt;&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;参考以下设置：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;以 &lt;code&gt;www-data&lt;/code&gt; 用户/组身份运行的 apache2&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;foo_user&lt;/code&gt; - github.com账号名&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;boo_password&lt;/code&gt; - github账号密码&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;https://github.com/foo_user/my_git_project.git&lt;/code&gt; - 远端库URL&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;挂载前先新建以下两个目录:&lt;/p&gt;</description></item><item><title>Git简易指南</title><link>http://www.gitfaq.cn/docs/git-recipes/Easy-Guide-to-Git/</link><pubDate>Sun, 24 Nov 2024 16:50:12 +0800</pubDate><guid>http://www.gitfaq.cn/docs/git-recipes/Easy-Guide-to-Git/</guid><description>&lt;h1 id="git简易指南"&gt;Git简易指南&lt;a class="anchor" href="#git%e7%ae%80%e6%98%93%e6%8c%87%e5%8d%97" aria-label="Link"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;blockquote class=''&gt;&#10;&lt;p&gt;BY 童仲毅（&lt;a href="https://gitfaq.cn/docs/git-recipes/"&gt;geeeeeeeeek@github&lt;/a&gt;）&lt;/p&gt;&#10;&lt;p&gt;除非另行注明，页面上所有内容采用知识共享-署名（&lt;a href="http://creativecommons.org/licenses/by/2.5/au/deed.zh"&gt;CC BY 2.5 AU&lt;/a&gt;）协议共享。&lt;a href="https://github.com/rogerdudler/git-guide/"&gt;git-guide&lt;/a&gt; 项目对本文亦有贡献。&lt;/p&gt;&#10;&lt;/blockquote&gt;&lt;p&gt;这节是完全面向入门者的，我假设你从零开始创建一个项目并且想用 Git 来进行版本控制，因此本文会避开分支这些相对复杂的概念。&lt;/p&gt;&#10;&lt;p&gt;在这节中，我会介绍如何在你的个人项目中使用 Git，我们会讨论 Git 最基本的操作——如何初始化你的项目，如何管理新的或者已有的文件，如何在远端仓库中储存你的代码。&lt;/p&gt;&#10;&lt;h2 id="安装-git"&gt;安装 Git&lt;a class="anchor" href="#%e5%ae%89%e8%a3%85-git" aria-label="Link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Mac 用户：Xcode Command Line Tools 自带 Git（&lt;code&gt;xcode-select --install&lt;/code&gt;）&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Linux 用户：&lt;code&gt;sudo apt-get install git&lt;/code&gt;&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Windows 用户：下载 &lt;a href="http://www.gitfaq.cn/download_git/"&gt;Git SCM&lt;/a&gt;&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;- 对于 Windows 用户，安装后如果希望在全局的 cmd 中使用 Git，需要把 git.exe 加入 PATH 环境变量中，或在 Git Bash 中使用 Git。&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="检出仓库"&gt;检出仓库&lt;a class="anchor" href="#%e6%a3%80%e5%87%ba%e4%bb%93%e5%ba%93" aria-label="Link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;执行如下命令以创建一个本地仓库的克隆版本：&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;git clone /path/to/repository&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;如果是远端服务器上的仓库，你的命令会是这个样子：&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;git clone username@host:/path/to/repository&lt;/code&gt; （通过 SSH）&lt;/p&gt;&#10;&lt;p&gt;或者：&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;git clone https:/path/to/repository.git&lt;/code&gt; （通过 https）&lt;/p&gt;&#10;&lt;p&gt;比如说 &lt;code&gt;git clone https://github.com/geeeeeeeeek/git-recipes.git&lt;/code&gt; 可以将 git 教程 clone 到你指定的目录。&lt;/p&gt;</description></item><item><title>GitFS参数说明</title><link>http://www.gitfaq.cn/docs/gitfs/gitfs_arguments/</link><pubDate>Tue, 11 Mar 2025 08:37:11 +0800</pubDate><guid>http://www.gitfaq.cn/docs/gitfs/gitfs_arguments/</guid><description>&lt;h1 id="gitfs参数说明"&gt;GitFS参数说明&lt;a class="anchor" href="#gitfs%e5%8f%82%e6%95%b0%e8%af%b4%e6%98%8e" aria-label="Link"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;h2 id="使用选项"&gt;使用选项&lt;a class="anchor" href="#%e4%bd%bf%e7%94%a8%e9%80%89%e9%a1%b9" aria-label="Link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;为了挂载 gitfs 时使用自定义&lt;strong&gt;选项&lt;/strong&gt;，你需要在挂载命令后面添加相应&lt;strong&gt;参数&lt;/strong&gt;，如下所示：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gitfs git@github.com:user/repo.git /mypath -o &lt;span style="color:#ff5c57"&gt;repo_path&lt;/span&gt;&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;/tmp/path,branch&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;dev,foreground&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;true,fetch_timeout&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;0.1,merge_timeout&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;0.1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="所有可用选项"&gt;所有可用选项&lt;a class="anchor" href="#%e6%89%80%e6%9c%89%e5%8f%af%e7%94%a8%e9%80%89%e9%a1%b9" aria-label="Link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;strong&gt;名称&lt;/strong&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;strong&gt;默认&lt;/strong&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;strong&gt;描述&lt;/strong&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;remote_url&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;远端地址，支持http和ssh访问方式:&lt;ul&gt;&lt;li&gt;&lt;code&gt;https://username:password@hostname.com/repo.git&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;username@hostname.com:repo.git&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;branch&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;master&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;分支名称&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;repo_path&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;/var/lib/gitfs/repo_path&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;克隆存储库的位置&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;max_size&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;10MB&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;单个文件允许的最大大小（以 MB 为单位）。如果设置为 0，则不限制。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;user&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;root&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;挂载文件系统的用户&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;group&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;root&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;挂载文件系统的组&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;commiter_name&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;user&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;提交显示的名称&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;commiter_email&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;user@FQDN&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;提交显示的电子邮件&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;merge_timeout&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;5 sec&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;空闲和提交(推送)的间隔&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;fetch_timeout&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;30 sec&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;获取操作间隔&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;min_idle_times&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;10&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;idle循环直到 gitfs 进入空闲模式&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;idle_fetch_timeout&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;30 min&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;空闲和获取的间隔&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;log&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;syslog&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;日志文件的路径。特殊名称 &amp;lsquo;syslog&amp;rsquo; 将记录到系统记录器中&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;log_level&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;warning&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;日志记录级别。&amp;rsquo;error&amp;rsquo;， &amp;lsquo;warning&amp;rsquo;， &amp;lsquo;info&amp;rsquo;， &amp;lsquo;debug&amp;rsquo;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;debug&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;将日志级别设置为 &amp;lsquo;debug&amp;rsquo; 并启用 FUSE 的调试的开关&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;foreground&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;指定 FUSE 是否在前台工作的开关&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;allow_other&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;该开关将覆盖限制对挂载文件系统的用户进行文件访问的安全措施。因此，所有用户（包括 root）都可以访问这些文件。默认情况下，此选项只允许 root 使用，但可以使用上一节中描述的配置选项删除此限制&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;allow_root&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;类似于 allow_other但 File Access 的开关仅限于挂载文件系统和 root 的用户。此选项和allow_other互斥&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;username&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;HTTP 基本身份验证的用户名&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;password&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;HTTP 基本身份验证的密码&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;key&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;$HOME/.ssh/id_rsa&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;SSH 私钥的路径。&lt;strong&gt;注意&lt;/strong&gt;：公钥是通过将 .pub 附加到此路径来构建的，并且文件 &lt;strong&gt;必须&lt;/strong&gt; 存在。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;blockquote class=''&gt;&#10;&lt;p&gt;AI生成&lt;/p&gt;</description></item><item><title>Git创建代码仓库</title><link>http://www.gitfaq.cn/docs/git-recipes/Git-creates-a-code-repository/</link><pubDate>Sun, 24 Nov 2024 16:50:12 +0800</pubDate><guid>http://www.gitfaq.cn/docs/git-recipes/Git-creates-a-code-repository/</guid><description>&lt;h1 id="git创建代码仓库"&gt;Git创建代码仓库&lt;a class="anchor" href="#git%e5%88%9b%e5%bb%ba%e4%bb%a3%e7%a0%81%e4%bb%93%e5%ba%93" aria-label="Link"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;blockquote class=''&gt;&#10;&lt;p&gt;BY 童仲毅(&lt;a href="https://gitfaq.cn/docs/git-recipes/"&gt;geeeeeeeeek@github&lt;/a&gt;)&lt;/p&gt;&#10;&lt;p&gt;这是一篇在&lt;a href="https://www.atlassian.com/git/tutorials/setting-up-a-repository"&gt;原文(BY atlassian)&lt;/a&gt;基础上演绎的译文。除非另行注明，页面上所有内容采用知识共享-署名(&lt;a href="http://creativecommons.org/licenses/by/2.5/au/deed.zh"&gt;CC BY 2.5 AU&lt;/a&gt;)协议共享。&lt;/p&gt;&#10;&lt;/blockquote&gt;&lt;p&gt;这一章简要地带你了解一些最重要的 Git 命令。在这节中，我会向你介绍开始一个新的版本控制项目需要的所有工具，后面的几节包含了你每天都会用到的Git操作。&lt;/p&gt;&#10;&lt;p&gt;在这节之后，你应该能够创建一个新的 Git 仓库，缓存你的项目以免丢失，以及查看你项目的历史。&lt;/p&gt;&#10;&lt;h2 id="git-init"&gt;git init&lt;a class="anchor" href="#git-init" aria-label="Link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;git init&lt;/code&gt; 命令创建一个新的 Git 仓库。它用来将已存在但还没有版本控制的项目转换成一个 Git 仓库，或者创建一个空的新仓库。大多数Git命令在未初始化的仓库中都是无法使用的，所以这就是你运行新项目的第一个命令了。&lt;/p&gt;&#10;&lt;p&gt;运行 &lt;code&gt;git init&lt;/code&gt; 命令会在你项目的根目录下创建一个新的 &lt;code&gt;.git&lt;/code&gt; 目录，其中包含了你项目必需的所有元数据。除了 &lt;code&gt;.git&lt;/code&gt; 目录之外，已经存在的项目不会被改变（就像 SVN 一样，Git 不强制每个子目录中都有一个 &lt;code&gt;.git&lt;/code&gt; 目录）。&lt;/p&gt;&#10;&lt;h3 id="git-init用法"&gt;&lt;code&gt;git init&lt;/code&gt;用法&lt;a class="anchor" href="#git-init%e7%94%a8%e6%b3%95" aria-label="Link"&gt;&lt;/a&gt;&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git init&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;将当前的目录转换成一个 Git 仓库。它在当前的目录下增加了一个 &lt;code&gt;.git&lt;/code&gt; 目录，于是就可以开始记录项目版本了。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git init &amp;lt;directory&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在指定目录创建一个空的 Git 仓库。运行这个命令会创建一个名为 &lt;code&gt;directory&lt;/code&gt;，只包含 &lt;code&gt;.git&lt;/code&gt; 子目录的空目录。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git init --bare &amp;lt;directory&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;初始化一个裸的 Git 仓库，但是忽略工作目录。共享的仓库应该总是用 &lt;code&gt;--bare&lt;/code&gt; 标记创建（见下面的讨论）。一般来说，用 &lt;code&gt;—bare&lt;/code&gt; 标记初始化的仓库以 &lt;code&gt;.git&lt;/code&gt; 结尾。比如，一个叫&lt;code&gt;my-project&lt;/code&gt;的仓库，它的空版本应该保存在 &lt;code&gt;my-project.git&lt;/code&gt; 目录下。&lt;/p&gt;&#10;&lt;h3 id="讨论"&gt;讨论&lt;a class="anchor" href="#%e8%ae%a8%e8%ae%ba" aria-label="Link"&gt;&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;和 SVN 相比，&lt;code&gt;git init&lt;/code&gt; 命令是一个创建新的版本控制项目非常简单的途径。Git 不需要你创建仓库，导入文件，检查正在修改的拷贝。你只需要 &lt;code&gt;cd&lt;/code&gt; 到你的项目目录下，运行 &lt;code&gt;git init&lt;/code&gt;，你就有了一个功能强大的 Git 仓库。&lt;/p&gt;</description></item><item><title>Git保存更改</title><link>http://www.gitfaq.cn/docs/git-recipes/Git-saves-the-changes/</link><pubDate>Sun, 24 Nov 2024 16:50:12 +0800</pubDate><guid>http://www.gitfaq.cn/docs/git-recipes/Git-saves-the-changes/</guid><description>&lt;h1 id="git保存更改"&gt;Git保存更改&lt;a class="anchor" href="#git%e4%bf%9d%e5%ad%98%e6%9b%b4%e6%94%b9" aria-label="Link"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;&lt;img src="http://www.gitfaq.cn/imgs/hero.svg" alt="Saving changes" /&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;&lt;strong&gt;git add / git commit / git diff / git stash / .gitignore&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;&#10;&lt;blockquote class=''&gt;&#10;&lt;p&gt;✍️ &lt;a href="https://github.com/geeeeeeeeek"&gt;童仲毅&lt;/a&gt; | ⏳ 2018 年 10 月 26 日（部分章节未更新）&lt;/p&gt;&#10;&lt;p&gt;©️ 本文演绎自 Atlassian 编写的 &lt;a href="https://www.atlassian.com/git/tutorials/saving-changes"&gt;&lt;em&gt;Saving Changes&lt;/em&gt;&lt;/a&gt;。页面上所有内容采用知识共享-署名（&lt;a href="http://creativecommons.org/licenses/by/2.5/au/deed.zh"&gt;CC BY 2.5 AU&lt;/a&gt;）许可协议。&lt;/p&gt;&#10;&lt;/blockquote&gt;&lt;p&gt;“保存”这个概念在 Git 等版本控制系统和 Word 等文本编辑应用中不太一样。传统软件里的“保存”在 Git 里被叫做“提交”（commit）。 我们常说的的保存可以理解成在文件系统中覆盖一个已有的文件或者创建一个新的文件。而在 Git 中，提交这个操作作用于若干个文件和目录。&lt;/p&gt;&#10;&lt;p&gt;在 Git 和 SVN 里保存更改也不一样。SVN 提交或检入（check-in）将会推送到远端的中央服务器。也就是说 SVN 的提交需要联网才能完全“保存”项目更改。Git 提交可以在本地完成，然后再使用&lt;code&gt;git push -u origin master&lt;/code&gt;命令推送到远端服务器。这两种方法的区别体现了两种架构设计的本质区别。Git 是一个分布式的应用，而 SVN 是一个中心化的应用。分布式应用一般来说更可靠，因为它们不存在中央服务器这样的单点故障。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;git add&lt;/code&gt;、&lt;code&gt;git status&lt;/code&gt;和&lt;code&gt;git commit&lt;/code&gt;这三个命令通常一起使用，将 Git 项目当前的状态保存成一份快照。&lt;/p&gt;&#10;&lt;p&gt;Git 还有另一个保存机制：“储藏”（stash）。储藏是一个临时的储存区域，保存还没准备好提交的更改。储藏操作作用于工作目录，三个文件树中的第一棵。它有很多用法，访问 git stash 页面了解更多。&lt;/p&gt;</description></item><item><title>Git检查仓库状态</title><link>http://www.gitfaq.cn/docs/git-recipes/Git-checks-the-status-of-the-repository/</link><pubDate>Tue, 11 Mar 2025 10:10:12 +0800</pubDate><guid>http://www.gitfaq.cn/docs/git-recipes/Git-checks-the-status-of-the-repository/</guid><description>&lt;h1 id="git检查仓库状态"&gt;Git检查仓库状态&lt;a class="anchor" href="#git%e6%a3%80%e6%9f%a5%e4%bb%93%e5%ba%93%e7%8a%b6%e6%80%81" aria-label="Link"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;blockquote class=''&gt;&#10;&lt;p&gt;BY 童仲毅（&lt;a href="https://gitfaq.cn/docs/git-recipes/"&gt;geeeeeeeeek@github&lt;/a&gt;）&lt;/p&gt;&#10;&lt;p&gt;这是一篇在&lt;a href="https://www.atlassian.com/git/tutorials/inspecting-a-repository/git-log"&gt;原文（BY atlassian）&lt;/a&gt;基础上演绎的译文。除非另行注明，页面上所有内容采用知识共享-署名（&lt;a href="http://creativecommons.org/licenses/by/2.5/au/deed.zh"&gt;CC BY 2.5 AU&lt;/a&gt;）协议共享。&lt;/p&gt;&#10;&lt;/blockquote&gt;&lt;h2 id="git-status"&gt;git status&lt;a class="anchor" href="#git-status" aria-label="Link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;git status&lt;/code&gt; 命令显示工作目录和缓存区的状态。你可以看到哪些更改被缓存了，哪些还没有，以及哪些还未被 Git 追踪。status 的输出 &lt;em&gt;不会&lt;/em&gt; 告诉你任何已提交到项目历史的信息。如果你想看的话，应该使用 &lt;code&gt;git log&lt;/code&gt; 命令。&lt;/p&gt;&#10;&lt;h3 id="git-status用法"&gt;&lt;code&gt;git status&lt;/code&gt;用法&lt;a class="anchor" href="#git-status%e7%94%a8%e6%b3%95" aria-label="Link"&gt;&lt;/a&gt;&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git status&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;列出已缓存、未缓存、未追踪的文件。&lt;/p&gt;&#10;&lt;h3 id="讨论"&gt;讨论&lt;a class="anchor" href="#%e8%ae%a8%e8%ae%ba" aria-label="Link"&gt;&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;&lt;code&gt;git status&lt;/code&gt; 是一个相对简单的命令。 它告诉你 &lt;code&gt;git add&lt;/code&gt; 和 &lt;code&gt;git commit&lt;/code&gt; 的进展。status 信息还包括了添加缓存和移除缓存的相关指令。样例输出显示了三类主要的 &lt;code&gt;git status&lt;/code&gt; 输出：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#78787e"&gt;# On branch master&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#78787e"&gt;# Changes to be committed:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#78787e"&gt;# (use &amp;#34;git reset HEAD &amp;lt;file&amp;gt;...&amp;#34; to unstage)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#78787e"&gt;#&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#78787e"&gt;#modified: hello.py&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#78787e"&gt;#&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#78787e"&gt;# Changes not staged for commit:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#78787e"&gt;# (use &amp;#34;git add &amp;lt;file&amp;gt;...&amp;#34; to update what will be committed)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#78787e"&gt;# (use &amp;#34;git checkout -- &amp;lt;file&amp;gt;...&amp;#34; to discard changes in working directory)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#78787e"&gt;#&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#78787e"&gt;#modified: main.py&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#78787e"&gt;#&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#78787e"&gt;# Untracked files:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#78787e"&gt;# (use &amp;#34;git add &amp;lt;file&amp;gt;...&amp;#34; to include in what will be committed)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#78787e"&gt;#&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#78787e"&gt;#hello.pyc&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="忽略文件"&gt;忽略文件&lt;a class="anchor" href="#%e5%bf%bd%e7%95%a5%e6%96%87%e4%bb%b6" aria-label="Link"&gt;&lt;/a&gt;&lt;/h4&gt;&#10;&lt;p&gt;未追踪的文件通常有两类。它们要么是项目新增但还未提交的文件，要么是像 &lt;code&gt;.pyc&lt;/code&gt;、&lt;code&gt;.obj&lt;/code&gt;、&lt;code&gt;.exe&lt;/code&gt; 等编译后的二进制文件。显然前者应该出现在 &lt;code&gt;git status&lt;/code&gt; 的输出中，而后者会让我们困惑究竟发生了什么。&lt;/p&gt;</description></item><item><title>Git检出之前的提交</title><link>http://www.gitfaq.cn/docs/git-recipes/Git-checks-out-the-previous-commit/</link><pubDate>Sun, 24 Nov 2024 16:50:12 +0800</pubDate><guid>http://www.gitfaq.cn/docs/git-recipes/Git-checks-out-the-previous-commit/</guid><description>&lt;h1 id="git检出之前的提交"&gt;Git检出之前的提交&lt;a class="anchor" href="#git%e6%a3%80%e5%87%ba%e4%b9%8b%e5%89%8d%e7%9a%84%e6%8f%90%e4%ba%a4" aria-label="Link"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;blockquote class=''&gt;&#10;&lt;p&gt;BY 童仲毅（&lt;a href="https://gitfaq.cn/docs/git-recipes/"&gt;geeeeeeeeek@github&lt;/a&gt;）&lt;/p&gt;&#10;&lt;p&gt;这是一篇在&lt;a href="https://www.atlassian.com/git/tutorials/viewing-old-commits"&gt;原文（BY atlassian）&lt;/a&gt;基础上演绎的译文。除非另行注明，页面上所有内容采用知识共享-署名（&lt;a href="http://creativecommons.org/licenses/by/2.5/au/deed.zh"&gt;CC BY 2.5 AU&lt;/a&gt;）协议共享。&lt;/p&gt;&#10;&lt;/blockquote&gt;&lt;h2 id="git-checkout"&gt;git checkout&lt;a class="anchor" href="#git-checkout" aria-label="Link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;git checkout&lt;/code&gt; 这个命令有三个不同的作用：检出文件、检出提交和检出分支。在这一章中，我们只关心前两种用法。&lt;/p&gt;&#10;&lt;p&gt;检出提交会使工作目录和这个提交完全匹配。你可以用它来查看项目之前的状态，而不改变当前的状态。检出文件使你能够查看某个特定文件的旧版本，而工作目录中剩下的文件不变。&lt;/p&gt;&#10;&lt;h3 id="git-checkout用法"&gt;&lt;code&gt;git checkout&lt;/code&gt;用法&lt;a class="anchor" href="#git-checkout%e7%94%a8%e6%b3%95" aria-label="Link"&gt;&lt;/a&gt;&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git checkout master&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;回到 master 分支。分支会在下一节中讲到，而现在，你只需要将它视为回到项目「当前」状态的一种方式。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git checkout &amp;lt;commit&amp;gt; &amp;lt;file&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;查看文件之前的版本。它将工作目录中的 &lt;code&gt;&amp;lt;file&amp;gt;&lt;/code&gt; 文件变成 &lt;code&gt;&amp;lt;commit&amp;gt;&lt;/code&gt; 中那个文件的拷贝，并将它加入缓存区。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git checkout &amp;lt;commit&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;更新工作目录中的所有文件，使得和某个特定提交中的文件一致。你可以将提交的哈希字串，或是标签作为 &lt;code&gt;&amp;lt;commit&amp;gt;&lt;/code&gt; 参数。这会使你处在分离 HEAD 的状态。&lt;/p&gt;&#10;&lt;h3 id="讨论"&gt;讨论&lt;a class="anchor" href="#%e8%ae%a8%e8%ae%ba" aria-label="Link"&gt;&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;版本控制系统背后的思想就是「安全」地储存项目的拷贝，这样你永远不用担心什么时候不可复原地破坏了你的代码库。当你建立了项目历史之后，&lt;code&gt;git checkout&lt;/code&gt; 是一种便捷的方式，来将保存的快照「加载」到你的开发机器上去。&lt;/p&gt;&#10;&lt;p&gt;检出之前的提交是一个只读操作。在查看旧版本的时候绝不会损坏你的仓库。你项目「当前」的状态在&#9;&lt;code&gt;master&lt;/code&gt; 上不会变化。在开发的正常阶段，&lt;code&gt;HEAD&lt;/code&gt; 一般指向 master 或是其他的本地分支，但当你检出之前提交的时候，&lt;code&gt;HEAD&lt;/code&gt; 就不再指向一个分支了——它直接指向一个提交。这被称为「分离 &lt;code&gt;HEAD&lt;/code&gt;」状态 ，可以用下图可视化：&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://www.atlassian.com/git/images/tutorials/getting-started/viewing-old-commits/01.svg" alt="Git Tutorial: Checking out a previous commit" /&gt;&lt;/p&gt;&#10;&lt;p&gt;在另一方面，检出旧文件不影响你仓库的当前状态。你可以在新的快照中像其他文件一样重新提交旧版本。所以，在效果上，&lt;code&gt;git checkout&lt;/code&gt; 的这个用法可以用来将单个文件回滚到旧版本 。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://www.atlassian.com/git/images/tutorials/getting-started/viewing-old-commits/02.svg" alt="Git Training: Checking out a previous version of a file" /&gt;&lt;/p&gt;</description></item><item><title>Git回滚错误的修改</title><link>http://www.gitfaq.cn/docs/git-recipes/Git-rollsback-the-wrong-modifications/</link><pubDate>Sun, 24 Nov 2024 16:50:12 +0800</pubDate><guid>http://www.gitfaq.cn/docs/git-recipes/Git-rollsback-the-wrong-modifications/</guid><description>&lt;h1 id="git回滚错误的修改"&gt;Git回滚错误的修改&lt;a class="anchor" href="#git%e5%9b%9e%e6%bb%9a%e9%94%99%e8%af%af%e7%9a%84%e4%bf%ae%e6%94%b9" aria-label="Link"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;blockquote class=''&gt;&#10;&lt;p&gt;BY 童仲毅（&lt;a href="https://gitfaq.cn/docs/git-recipes/"&gt;geeeeeeeeek@github&lt;/a&gt;）&lt;/p&gt;&#10;&lt;p&gt;这是一篇在&lt;a href="https://www.atlassian.com/git/tutorials/undoing-changes"&gt;原文（BY atlassian）&lt;/a&gt;基础上演绎的译文。除非另行注明，页面上所有内容采用知识共享-署名（&lt;a href="http://creativecommons.org/licenses/by/2.5/au/deed.zh"&gt;CC BY 2.5 AU&lt;/a&gt;）协议共享。&lt;/p&gt;&#10;&lt;/blockquote&gt;&lt;p&gt;这章教程提供了和项目旧版本打交道所需要的所有技巧。首先，你会知道如何浏览旧的提交，然后了解回滚项目历史中的公有提交和回滚本地机器上的私有更改之间的区别。&lt;/p&gt;&#10;&lt;h2 id="git-checkout"&gt;git checkout&lt;a class="anchor" href="#git-checkout" aria-label="Link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;见上一章&lt;a href="http://www.gitfaq.cn/docs/git-recipes/Git-checks-out-the-previous-commit/#git-checkout#git-checkout"&gt;「2.5 检出之前的提交」&lt;/a&gt;。&lt;/p&gt;&#10;&lt;h2 id="git-revert"&gt;git revert&lt;a class="anchor" href="#git-revert" aria-label="Link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;git revert&lt;/code&gt; 命令用来撤销一个已经提交的快照。但是，它是通过搞清楚如何撤销这个提交引入的更改，然后在最后加上一个撤销了更改的 &lt;em&gt;新&lt;/em&gt; 提交，而不是从项目历史中移除这个提交。这避免了Git丢失项目历史，这一点对于你的版本历史和协作的可靠性来说是很重要的。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="http://www.gitfaq.cn/imgs/454f9ca5b0320.svg" alt="Git Tutorial: git revert" /&gt;&lt;/p&gt;&#10;&lt;h3 id="git-revert用法"&gt;&lt;code&gt;git revert&lt;/code&gt;用法&lt;a class="anchor" href="#git-revert%e7%94%a8%e6%b3%95" aria-label="Link"&gt;&lt;/a&gt;&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git revert &amp;lt;commit&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;生成一个撤消了 &lt;code&gt;&amp;lt;commit&amp;gt;&lt;/code&gt; 引入的修改的新提交，然后应用到当前分支。&lt;/p&gt;&#10;&lt;h3 id="讨论"&gt;讨论&lt;a class="anchor" href="#%e8%ae%a8%e8%ae%ba" aria-label="Link"&gt;&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;撤销（revert）应该用在你想要在项目历史中移除一整个提交的时候。比如说，你在追踪一个 bug，然后你发现它是由一个提交造成的，这时候撤销就很有用。与其说自己去修复它，然后提交一个新的快照，不如用 &lt;code&gt;git revert&lt;/code&gt;，它帮你做了所有的事情。&lt;/p&gt;&#10;&lt;h4 id="撤销revert和重设reset对比"&gt;撤销（revert）和重设（reset）对比&lt;a class="anchor" href="#%e6%92%a4%e9%94%80revert%e5%92%8c%e9%87%8d%e8%ae%bereset%e5%af%b9%e6%af%94" aria-label="Link"&gt;&lt;/a&gt;&lt;/h4&gt;&#10;&lt;p&gt;理解这一点很重要。&lt;code&gt;git revert&lt;/code&gt; 回滚了「单独一个提交」，它没有移除后面的提交，然后回到项目之前的状态。在 Git 中，后者实际上被称为 &lt;code&gt;reset&lt;/code&gt;，而不是 &lt;code&gt;revert&lt;/code&gt;。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="http://www.gitfaq.cn/imgs/9e48dec8fd2f.svg" alt="Git Tutorial: Revert vs Reset" /&gt;&lt;/p&gt;&#10;&lt;p&gt;撤销和重设相比有两个重要的优点。首先，它不会改变项目历史，对那些已经发布到共享仓库的提交来说这是一个安全的操作。至于为什么改变共享的历史是危险的，请参阅 &lt;code&gt;git reset&lt;/code&gt; 一节。&lt;/p&gt;&#10;&lt;p&gt;其次，&lt;code&gt;git revert&lt;/code&gt; 可以针对历史中任何一个提交，而 &lt;code&gt;git reset&lt;/code&gt; 只能从当前提交向前回溯。比如，你想用 &lt;code&gt;git reset&lt;/code&gt; 重设一个旧的提交，你不得不移除那个提交后的所有提交，再移除那个提交，然后重新提交后面的所有提交。不用说，这并不是一个优雅的回滚方案。&lt;/p&gt;</description></item><item><title>Git创建Pull Request</title><link>http://www.gitfaq.cn/docs/git-recipes/Git-creates-a-pull-request/</link><pubDate>Tue, 11 Mar 2025 08:50:12 +0800</pubDate><guid>http://www.gitfaq.cn/docs/git-recipes/Git-creates-a-pull-request/</guid><description>&lt;h1 id="git创建pullrequest"&gt;Git创建Pull Request&lt;a class="anchor" href="#git%e5%88%9b%e5%bb%bapullrequest" aria-label="Link"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;blockquote class=''&gt;&#10;&lt;p&gt;BY 童仲毅（&lt;a href="https://gitfaq.cn/docs/git-recipes/"&gt;geeeeeeeeek@github&lt;/a&gt;）&lt;/p&gt;&#10;&lt;p&gt;这是一篇在&lt;a href="https://www.atlassian.com/git/tutorials/making-a-pull-request"&gt;原文（BY atlassian）&lt;/a&gt;基础上演绎的译文。除非另行注明，页面上所有内容采用知识共享-署名（&lt;a href="http://creativecommons.org/licenses/by/2.5/au/deed.zh"&gt;CC BY 2.5 AU&lt;/a&gt;）协议共享。&lt;/p&gt;&#10;&lt;p&gt;原文以 Bitbucket 为例，考虑到&lt;a href="https://gitfaq.cn/docs/git-recipes/"&gt;git-recipes&lt;/a&gt;主要面向 GitHub 用户，因此例子替换成了 GitHub。Pull Request 在 GitLab 等平台上也有，用法和本教程基本一致。&lt;/p&gt;&#10;&lt;/blockquote&gt;&lt;p&gt;Pull Request 是开发者使用 GitHub 进行协作的利器。这个功能为用户提供了友好的页面，让提议的更改在并入官方项目之前，可以得到充分的讨论。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="http://www.gitfaq.cn/imgs/8ece897e-c516-11e5-91c0-f7a44434478f.png" alt="qq20160127-0" /&gt;&lt;/p&gt;&#10;&lt;p&gt;最简单地来说，Pull Request 是一种机制，让开发者告诉项目成员一个功能已经完成。一旦 feature 分支开发完毕，开发者使用 GitHub 账号提交一个 Pull Request。它告诉所有参与者，他们需要审查代码，并将代码并入 &lt;code&gt;master&lt;/code&gt; 分支。&lt;/p&gt;&#10;&lt;p&gt;但是，Pull Request 不只是一个通知，还是一个专注于某个提议功能的讨论版。 如果更改导致了任何问题，团队成员可以在 Pull Request 下发布反馈，甚至推送后续提交来修改这个 Pull Request。所有的活动都在这个 Pull Request里之间追踪。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="http://www.gitfaq.cn/imgs/3a787656c6102.svg" alt="Git Workflows: Activity inside a Pull Request" /&gt;&lt;/p&gt;&#10;&lt;p&gt;和其他协作模型相比，这种共享提交的解决方案形成了更加线性的工作流。SVN 和 Git 都能通过一个简单的脚本发送通知邮件；但是，如果要讨论更改，开发者不得不在邮件里回复。这会变得愈发杂乱无章，尤其是后续提交出现时。Pull Request 将所有这些功能放入了一个友好的网页，在每个 GitHub 仓库上方都能找到。&lt;/p&gt;&#10;&lt;h3 id="剖析一个-pull-request"&gt;剖析一个 Pull Request&lt;a class="anchor" href="#%e5%89%96%e6%9e%90%e4%b8%80%e4%b8%aa-pull-request" aria-label="Link"&gt;&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;当你提交一个 Pull Request 的时候，你做的事情是 &lt;em&gt;请求（request）&lt;/em&gt; 另一个开发者（比如项目维护者）来 &lt;em&gt;拉取（pull）&lt;/em&gt; 你仓库中的一个分支到他们的仓库。也就是说你需要提供 4 个信息来完成一个 Pull Request：源仓库、源分支、目标仓库、目标分支。&lt;/p&gt;</description></item><item><title>Git使用分支</title><link>http://www.gitfaq.cn/docs/git-recipes/Git-uses-branches/</link><pubDate>Tue, 11 Mar 2025 11:40:12 +0800</pubDate><guid>http://www.gitfaq.cn/docs/git-recipes/Git-uses-branches/</guid><description>&lt;h1 id="git使用分支"&gt;Git使用分支&lt;a class="anchor" href="#git%e4%bd%bf%e7%94%a8%e5%88%86%e6%94%af" aria-label="Link"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;blockquote class=''&gt;&#10;&lt;p&gt;BY 童仲毅（&lt;a href="https://gitfaq.cn/docs/git-recipes/"&gt;geeeeeeeeek@github&lt;/a&gt;）&lt;/p&gt;&#10;&lt;p&gt;这是一篇在&lt;a href="https://www.atlassian.com/git/tutorials/using-branches"&gt;原文（BY atlassian）&lt;/a&gt;基础上演绎的译文。除非另行注明，页面上所有内容采用知识共享-署名（&lt;a href="http://creativecommons.org/licenses/by/2.5/au/deed.zh"&gt;CC BY 2.5 AU&lt;/a&gt;）协议共享。&lt;/p&gt;&#10;&lt;/blockquote&gt;&lt;p&gt;这份教程是 Git 分支的综合介绍。首先，我们简单讲解如何创建分支，就像请求一份新的项目历史一样。然后，我们会看到 git checkout 是如何切换分支的。最后，学习一下 git merge 是如何整合独立分支的历史。&lt;/p&gt;&#10;&lt;p&gt;我们已经知道，Git 分支和 SVN 分支不同。SVN 分支只被用来记录偶尔大规模的开发效果，而 Git 分支是你日常工作流中不可缺失的一部分。&lt;/p&gt;&#10;&lt;h2 id="git-branch"&gt;git branch&lt;a class="anchor" href="#git-branch" aria-label="Link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;分支代表了一条独立的开发流水线。分支是我们在第二篇中讨论过的「编辑/缓存/提交」流程的抽象。你可以把它看作请求全新「工作目录、缓存区、项目历史」的一种方式。新的提交被存放在当前分支的历史中，导致了项目历史被 fork 了一份。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;git branch&lt;/code&gt; 命令允许你创建、列出、重命名和删除分支。它不允许你切换分支或是将被 fork 的历史放回去。因此，&lt;code&gt;git branch&lt;/code&gt; 和 &lt;code&gt;git checkout&lt;/code&gt;、&lt;code&gt;git merge&lt;/code&gt; 这两个命令通常紧密地结合在一起使用。&lt;/p&gt;&#10;&lt;h3 id="git-branch用法"&gt;&lt;code&gt;git branch&lt;/code&gt;用法&lt;a class="anchor" href="#git-branch%e7%94%a8%e6%b3%95" aria-label="Link"&gt;&lt;/a&gt;&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git branch&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;列出仓库中所有分支。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git branch &amp;lt;branch&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;创建一个名为 &lt;code&gt;&amp;lt;branch&amp;gt;&lt;/code&gt; 的分支。&lt;em&gt;不会&lt;/em&gt; 自动切换到那个分支去。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git branch -d &amp;lt;branch&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;删除指定分支。这是一个安全的操作，Git 会阻止你删除包含未合并更改的分支。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git branch -D &amp;lt;branch&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;强制删除指定分支，即使包含未合并更改。如果你希望永远删除某条开发线的所有提交，你应该用这个命令。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git branch -m &amp;lt;branch&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;将当前分支命名为 &lt;code&gt;&amp;lt;branch&amp;gt;&lt;/code&gt;。&lt;/p&gt;&#10;&lt;h3 id="讨论"&gt;讨论&lt;a class="anchor" href="#%e8%ae%a8%e8%ae%ba" aria-label="Link"&gt;&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;在 Git 中，分支是你日常开发流程中的一部分。当你想要添加一个新的功能或是修复一个 bug 时——不管 bug 是大是小——你都应该新建一个分支来封装你的修改。这确保了不稳定的代码永远不会被提交到主代码库中，它同时给了你机会，在并入主分支前清理你 feature 分支的历史。&lt;/p&gt;</description></item><item><title>Git常见工作流比较</title><link>http://www.gitfaq.cn/docs/git-recipes/Comparison-of-common-Git-workflows/</link><pubDate>Tue, 11 Mar 2025 14:41:12 +0800</pubDate><guid>http://www.gitfaq.cn/docs/git-recipes/Comparison-of-common-Git-workflows/</guid><description>&lt;h1 id="git常见工作流比较"&gt;Git常见工作流比较&lt;a class="anchor" href="#git%e5%b8%b8%e8%a7%81%e5%b7%a5%e4%bd%9c%e6%b5%81%e6%af%94%e8%be%83" aria-label="Link"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;blockquote class=''&gt;&#10;&lt;p&gt;BY 童仲毅（&lt;a href="https://gitfaq.cn/docs/git-recipes/"&gt;geeeeeeeeek@github&lt;/a&gt;）&lt;/p&gt;&#10;&lt;p&gt;这是一篇在&lt;a href="https://www.atlassian.com/git/tutorials/comparing-workflows"&gt;原文（BY atlassian）&lt;/a&gt;基础上演绎的译文。除非另行注明，页面上所有内容采用知识共享-署名（&lt;a href="http://creativecommons.org/licenses/by/2.5/au/deed.zh"&gt;CC BY 2.5 AU&lt;/a&gt;）协议共享。&lt;/p&gt;&#10;&lt;/blockquote&gt;&lt;p&gt;多种多样的工作流使得在项目中实施 Git 时变得难以选择。这份教程提供了一个出发点，调查企业团队最常见的 Git 工作流。&lt;/p&gt;&#10;&lt;p&gt;阅读的时候，请记住工作流应该是一种规范而不是金科玉律。我们希望向你展示所有工作流，让你融会贯通，因地制宜。&lt;/p&gt;&#10;&lt;p&gt;这份教程讨论了下面四种工作流：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="http://www.gitfaq.cn/docs/git-recipes/Comparison-of-common-Git-workflows/#%E4%B8%AD%E5%BF%83%E5%8C%96%E7%9A%84%E5%B7%A5%E4%BD%9C%E6%B5%81#%e4%b8%ad%e5%bf%83%e5%8c%96%e7%9a%84%e5%b7%a5%e4%bd%9c%e6%b5%81"&gt;中心化的工作流&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="http://www.gitfaq.cn/docs/git-recipes/Comparison-of-common-Git-workflows/#%E5%8A%9F%E8%83%BD%E5%88%86%E6%94%AF%E7%9A%84%E5%B7%A5%E4%BD%9C%E6%B5%81#%e5%8a%9f%e8%83%bd%e5%88%86%e6%94%af%e7%9a%84%e5%b7%a5%e4%bd%9c%e6%b5%81"&gt;基于功能分支的工作流&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="http://www.gitfaq.cn/docs/git-recipes/Comparison-of-common-Git-workflows/#gitflow%E5%B7%A5%E4%BD%9C%E6%B5%81#gitflow%e5%b7%a5%e4%bd%9c%e6%b5%81"&gt;Gitflow工作流&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="http://www.gitfaq.cn/docs/git-recipes/Comparison-of-common-Git-workflows/#fork%E5%B7%A5%E4%BD%9C%E6%B5%81#fork%e5%b7%a5%e4%bd%9c%e6%b5%81"&gt;Fork工作流&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="中心化的工作流"&gt;中心化的工作流&lt;a class="anchor" href="#%e4%b8%ad%e5%bf%83%e5%8c%96%e7%9a%84%e5%b7%a5%e4%bd%9c%e6%b5%81" aria-label="Link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;&lt;img src="http://www.gitfaq.cn/imgs/Workflow.svg" alt="Git Workflows: SVN-style Workflow" /&gt;&lt;/p&gt;&#10;&lt;p&gt;过渡到分布式分版本控制系统看起来是个令人恐惧的任务，但你不必为了利用 Git 的优点而改变你现有的工作流。你的团队仍然可以用以前SVN的方式开发项目。&lt;/p&gt;&#10;&lt;p&gt;然而，使用 Git 来驱动你的开发工作流显示出了一些SVN没有的优点。首先，它让每个开发者都有了自己 &lt;em&gt;本地&lt;/em&gt; 的完整项目副本。隔离的环境使得每个开发者的工作独立于项目的其它修改——他们可以在自己的本地仓库中添加提交，完全无视上游的开发，直到需要的时候。&lt;/p&gt;&#10;&lt;p&gt;第二，它让你接触到了 Git 鲁棒的分支和合并模型。和 SVN 不同，Git 分支被设计为一种故障安全的机制，用来在仓库之间整合代码和共享更改。&lt;/p&gt;&#10;&lt;h2 id="如何工作"&gt;如何工作&lt;a class="anchor" href="#%e5%a6%82%e4%bd%95%e5%b7%a5%e4%bd%9c" aria-label="Link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;和 Subversion 一样，中心化的工作流将中央仓库作为项目中所有修改的唯一入口。和 &lt;code&gt;trunk&lt;/code&gt; 不同，默认的开发分支叫做&lt;code&gt;master&lt;/code&gt;，所有更改都被提交到这个分支。这种工作流不需要 &lt;code&gt;master&lt;/code&gt; 之外的其它分支。&lt;/p&gt;&#10;&lt;p&gt;开发者将中央仓库克隆到本地后开始工作。在他们的本地项目副本中，他们可以像SVN一样修改文件和提交更改；不过，这些新的提交被保存在 &lt;em&gt;本地&lt;/em&gt; ——它们和中央仓库完全隔离。这使得开发者可以将和上游的同步推迟到他们方便的时候。&lt;/p&gt;&#10;&lt;p&gt;为了向官方项目发布修改，开发者将他们的本地 &lt;code&gt;master&lt;/code&gt; 分支「推送」到中央仓库。这一步等同于 &lt;code&gt;svn commit&lt;/code&gt;，除了Git添加的是所有不在中央 &lt;code&gt;master&lt;/code&gt; 分支上的本地提交。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="http://www.gitfaq.cn/imgs/33340383ce0702.svg" alt="Central and local repositories" /&gt;&lt;/p&gt;&#10;&lt;h3 id="管理冲突"&gt;管理冲突&lt;a class="anchor" href="#%e7%ae%a1%e7%90%86%e5%86%b2%e7%aa%81" aria-label="Link"&gt;&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;中央仓库代表官方项目，因此它的提交历史应该被视作神圣不可更改的。如果开发者的本地提交和中央仓库分叉了，Git 会拒绝将他们的修改推送上去，因为这会覆盖官方提交。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="http://www.gitfaq.cn/imgs/a2e93374e53e0320.svg" alt="Managing Conflicts" /&gt;&lt;/p&gt;</description></item><item><title>Git图解</title><link>http://www.gitfaq.cn/docs/git-recipes/Git-diagram/</link><pubDate>Sun, 24 Nov 2024 16:50:12 +0800</pubDate><guid>http://www.gitfaq.cn/docs/git-recipes/Git-diagram/</guid><description>&lt;h1 id="git图解"&gt;Git图解&lt;a class="anchor" href="#git%e5%9b%be%e8%a7%a3" aria-label="Link"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;blockquote class=''&gt;&#10;&lt;p&gt;BY 童仲毅（&lt;a href="https://gitfaq.cn/docs/git-recipes/"&gt;geeeeeeeeek@github&lt;/a&gt;）&lt;/p&gt;&#10;&lt;p&gt;这是一篇在&lt;a href="http://marklodato.github.io/visual-git-guide/index-zh-cn.html"&gt;原文&lt;/a&gt;基础上演绎的文章。原作者 &lt;a href="lodatom@gmail.com"&gt;Mark Lodato&lt;/a&gt;，译者 &lt;a href="ellrywych@gmail.com"&gt;wych&lt;/a&gt;。原文采用&lt;a href="https://creativecommons.org/licenses/by-nc-sa/3.0/us/"&gt;创用 CC 姓名标示-非商业性-相同方式分享 3.0 美国授权条款&lt;/a&gt;授权。&lt;/p&gt;&#10;&lt;/blockquote&gt;&lt;p&gt;此页图解 git 中的最常用命令。如果你稍微理解 git 的工作原理，这篇文章能够让你理解的更透彻。&lt;/p&gt;&#10;&lt;h2 id="基本用法"&gt;基本用法&lt;a class="anchor" href="#%e5%9f%ba%e6%9c%ac%e7%94%a8%e6%b3%95" aria-label="Link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;&lt;img src="http://www.gitfaq.cn/imgs/git-basic-usage.svg" alt="enter image description here" /&gt;&lt;/p&gt;&#10;&lt;p&gt;上面的四条命令在工作目录、stage 缓存(也叫做索引)和 commit 历史之间复制文件。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;git add files&lt;/code&gt; 把工作目录中的文件加入 stage 缓存&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;git commit&lt;/code&gt; 把 stage 缓存生成一次 commit，并加入 commit 历史&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;git reset -- files&lt;/code&gt; 撤销最后一次 &lt;code&gt;git add files&lt;/code&gt;，你也可以用 &lt;code&gt;git reset&lt;/code&gt; 撤销所有 stage 缓存文件&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;git checkout -- files&lt;/code&gt; 把文件从 stage 缓存复制到工作目录，用来丢弃本地修改&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;你可以用 &lt;code&gt;git reset -p&lt;/code&gt;、&lt;code&gt;git checkout -p&lt;/code&gt; 或 &lt;code&gt;git add -p&lt;/code&gt; 进入交互模式，也可以跳过 stage 缓存直接从 commit历史取出文件或者直接提交代码。&lt;/p&gt;</description></item><item><title>Git代码合并选Merge还是Rebase</title><link>http://www.gitfaq.cn/docs/git-recipes/Merge-Git-code-Merge-or-Rebase/</link><pubDate>Sun, 24 Nov 2024 16:50:12 +0800</pubDate><guid>http://www.gitfaq.cn/docs/git-recipes/Merge-Git-code-Merge-or-Rebase/</guid><description>&lt;h1 id="git代码合并选merge还是rebase"&gt;Git代码合并选Merge还是Rebase&lt;a class="anchor" href="#git%e4%bb%a3%e7%a0%81%e5%90%88%e5%b9%b6%e9%80%89merge%e8%bf%98%e6%98%afrebase" aria-label="Link"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;blockquote class=''&gt;&#10;&lt;p&gt;BY 童仲毅（&lt;a href="https://gitfaq.cn/docs/git-recipes/"&gt;geeeeeeeeek@github&lt;/a&gt;）&lt;/p&gt;&#10;&lt;p&gt;这是一篇在&lt;a href="https://www.atlassian.com/git/tutorials/merging-vs-rebasing"&gt;原文（BY atlassian）&lt;/a&gt;基础上演绎的译文。除非另行注明，页面上所有内容采用知识共享-署名（&lt;a href="http://creativecommons.org/licenses/by/2.5/au/deed.zh"&gt;CC BY 2.5 AU&lt;/a&gt;）协议共享。&lt;/p&gt;&#10;&lt;/blockquote&gt;&lt;p&gt;&lt;code&gt;git rebase&lt;/code&gt; 这个命令经常被人认为是一种 Git 巫术，初学者应该避而远之。但如果使用得当的话，它能给你的团队开发省去太多烦恼。在这篇文章中，我们会比较 &lt;code&gt;git rebase&lt;/code&gt; 和类似的 &lt;code&gt;git merge&lt;/code&gt; 命令，找到 Git 工作流中 rebase 的所有用法。&lt;/p&gt;&#10;&lt;h2 id="概述"&gt;概述&lt;a class="anchor" href="#%e6%a6%82%e8%bf%b0" aria-label="Link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;你要知道的第一件事是，&lt;code&gt;git rebase&lt;/code&gt; 和&lt;code&gt;git merge&lt;/code&gt; 做的事其实是一样的。它们都被设计来将一个分支的更改并入另一个分支，只不过方式有些不同。&lt;/p&gt;&#10;&lt;p&gt;想象一下，你刚创建了一个专门的分支开发新功能，然后团队中另一个成员在 master 分支上添加了新的提交。这就会造成提交历史被 fork 一份，用 Git 来协作的开发者应该都很清楚。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="http://www.gitfaq.cn/imgs/c4d86bc7cb0b.svg" alt="enter image description here" /&gt;&lt;/p&gt;&#10;&lt;p&gt;现在，如果 master 中新的提交和你的工作是相关的。为了将新的提交并入你的分支，你有两个选择：merge 或 rebase。&lt;/p&gt;&#10;&lt;h3 id="merge"&gt;Merge&lt;a class="anchor" href="#merge" aria-label="Link"&gt;&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;将 master 分支合并到 feature 分支最简单的办法就是用下面这些命令：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git checkout feature&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git merge master&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;或者，你也可以把它们压缩在一行里。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git merge master feature&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;feature 分支中新的合并提交（merge commit）将两个分支的历史连在了一起。你会得到下面这样的分支结构：&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="http://www.gitfaq.cn/imgs/e1e1baa9405502.svg" alt="enter image description here" /&gt;&lt;/p&gt;</description></item><item><title>Git代码回滚选Reset、Checkout还是Revert</title><link>http://www.gitfaq.cn/docs/git-recipes/Git-code-rollback-Reset-Checkout-or-Revert/</link><pubDate>Sun, 24 Nov 2024 16:50:12 +0800</pubDate><guid>http://www.gitfaq.cn/docs/git-recipes/Git-code-rollback-Reset-Checkout-or-Revert/</guid><description>&lt;h1 id="git代码回滚选resetcheckout还是revert"&gt;Git代码回滚选Reset、Checkout还是Revert&lt;a class="anchor" href="#git%e4%bb%a3%e7%a0%81%e5%9b%9e%e6%bb%9a%e9%80%89resetcheckout%e8%bf%98%e6%98%afrevert" aria-label="Link"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;blockquote class=''&gt;&#10;&lt;p&gt;BY 童仲毅（&lt;a href="https://gitfaq.cn/docs/git-recipes/"&gt;geeeeeeeeek@github&lt;/a&gt;）&lt;/p&gt;&#10;&lt;p&gt;这是一篇在&lt;a href="https://www.atlassian.com/git/tutorials/resetting-checking-out-and-reverting"&gt;原文（BY atlassian）&lt;/a&gt;基础上演绎的译文。除非另行注明，页面上所有内容采用知识共享-署名（&lt;a href="http://creativecommons.org/licenses/by/2.5/au/deed.zh"&gt;CC BY 2.5 AU&lt;/a&gt;）协议共享。&lt;/p&gt;&#10;&lt;/blockquote&gt;&lt;p&gt;&lt;code&gt;git reset&lt;/code&gt;、&lt;code&gt;git checkout&lt;/code&gt; 和 &lt;code&gt;git revert&lt;/code&gt; 是你的 Git 工具箱中最有用的一些命令。它们都用来撤销代码仓库中的某些更改，而前两个命令不仅可以作用于提交，还可以作用于特定文件。&lt;/p&gt;&#10;&lt;p&gt;因为它们非常相似，所以我们经常会搞混，不知道什么场景下该用哪个命令。在这篇文章中，我们会比较 &lt;code&gt;git reset&lt;/code&gt;、&lt;code&gt;git checkout&lt;/code&gt; 和 &lt;code&gt;git revert&lt;/code&gt; 最常见的用法。希望你在看完后能游刃有余地使用这些命令来管理你的仓库。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="http://www.gitfaq.cn/imgs/faf2aec53cc3.svg" alt="Git repo的主要组成" /&gt;&lt;/p&gt;&#10;&lt;p&gt;Git 仓库有三个主要组成——工作目录，缓存区和提交历史。这张图有助于理解每个命令到底产生了哪些影响。当你阅读的时候，牢记这张图。&lt;/p&gt;&#10;&lt;h2 id="提交层面的操作"&gt;提交层面的操作&lt;a class="anchor" href="#%e6%8f%90%e4%ba%a4%e5%b1%82%e9%9d%a2%e7%9a%84%e6%93%8d%e4%bd%9c" aria-label="Link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;你传给 &lt;code&gt;git reset&lt;/code&gt; 和 &lt;code&gt;git checkout&lt;/code&gt; 的参数决定了它们的作用域。如果你没有包含文件路径，这些操作对所有提交生效。我们这一节要探讨的就是提交层面的操作。注意，&lt;code&gt;git revert&lt;/code&gt; 没有文件层面的操作。&lt;/p&gt;&#10;&lt;h3 id="reset"&gt;Reset&lt;a class="anchor" href="#reset" aria-label="Link"&gt;&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;在提交层面上，reset 将一个分支的末端指向另一个提交。这可以用来移除当前分支的一些提交。比如，下面这两条命令让 hotfix 分支向后回退了两个提交。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git checkout hotfix&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git reset HEAD~2&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;hotfix 分支末端的两个提交现在变成了悬挂提交。也就是说，下次 Git 执行垃圾回收的时候，这两个提交会被删除。换句话说，如果你想扔掉这两个提交，你可以这么做。reset 操作如下图所示：&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="http://www.gitfaq.cn/imgs/02-updated.png" alt="把hotfix分支reset到HEAD~2" /&gt;&lt;/p&gt;&#10;&lt;p&gt;如果你的更改还没有共享给别人，&lt;code&gt;git reset&lt;/code&gt; 是撤销这些更改的简单方法。当你开发一个功能的时候发现「糟糕，我做了什么？我应该重新来过！」时，reset 就像是 go-to 命令一样。&lt;/p&gt;&#10;&lt;p&gt;除了在当前分支上操作，你还可以通过传入这些标记来修改你的缓存区或工作目录：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&amp;ndash;soft – 缓存区和工作目录都不会被改变&lt;/li&gt;&#10;&lt;li&gt;&amp;ndash;mixed – 默认选项。缓存区和你指定的提交同步，但工作目录不受影响&lt;/li&gt;&#10;&lt;li&gt;&amp;ndash;hard – 缓存区和工作目录都同步到你指定的提交&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;把这些标记想成定义 &lt;code&gt;git reset&lt;/code&gt; 操作的作用域就容易理解多了。&lt;/p&gt;</description></item><item><title>Git log高级用法</title><link>http://www.gitfaq.cn/docs/git-recipes/Advanced-usage-of-Git-log/</link><pubDate>Sun, 24 Nov 2024 16:50:12 +0800</pubDate><guid>http://www.gitfaq.cn/docs/git-recipes/Advanced-usage-of-Git-log/</guid><description>&lt;h1 id="git-log高级用法"&gt;Git log高级用法&lt;a class="anchor" href="#git-log%e9%ab%98%e7%ba%a7%e7%94%a8%e6%b3%95" aria-label="Link"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;blockquote class=''&gt;&#10;&lt;p&gt;BY 童仲毅（&lt;a href="https://gitfaq.cn/docs/git-recipes/"&gt;geeeeeeeeek@github&lt;/a&gt;）&lt;/p&gt;&#10;&lt;p&gt;这是一篇在&lt;a href="https://www.atlassian.com/git/tutorials/git-log"&gt;原文（BY atlassian）&lt;/a&gt;基础上演绎的译文。除非另行注明，页面上所有内容采用知识共享-署名（&lt;a href="http://creativecommons.org/licenses/by/2.5/au/deed.zh"&gt;CC BY 2.5 AU&lt;/a&gt;）协议共享。&lt;/p&gt;&#10;&lt;/blockquote&gt;&lt;p&gt;每一个版本控制系统的出现都是为了让你记录代码的变化。你可以看到项目的历史记录——谁贡献了什么、bug 是什么时候引入的，还可以撤回有问题的更改。但是，首先你得知道如何使用它。这也就是为什么会有 &lt;code&gt;git log&lt;/code&gt; 这个命令。&lt;/p&gt;&#10;&lt;p&gt;到现在为止，你应该已经知道如何用 &lt;code&gt;git log&lt;/code&gt; 命令来显示最基本的提交信息。但除此之外，你还可以传入各种不同的参数来获得不一样的输出。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;git log&lt;/code&gt; 有两个高级用法：一是自定义提交的输出格式，二是过滤输出哪些提交。这两个用法合二为一，你就可以找到你项目中你需要的任何信息。&lt;/p&gt;&#10;&lt;h2 id="格式化-log-输出"&gt;格式化 Log 输出&lt;a class="anchor" href="#%e6%a0%bc%e5%bc%8f%e5%8c%96-log-%e8%be%93%e5%87%ba" aria-label="Link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;首先，这篇文章会展示几种 &lt;code&gt;git log&lt;/code&gt; 格式化输出的例子。大多数例子只是通过标记向 &lt;code&gt;git log&lt;/code&gt; 请求或多或少的信息。&lt;/p&gt;&#10;&lt;p&gt;如果你不喜欢默认的 &lt;code&gt;git log&lt;/code&gt; 格式，你可以用 &lt;code&gt;git config&lt;/code&gt; 的别名功能来给你想要的格式创建一个快捷方式。&lt;/p&gt;&#10;&lt;h3 id="oneline"&gt;Oneline&lt;a class="anchor" href="#oneline" aria-label="Link"&gt;&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;&lt;code&gt;--oneline&lt;/code&gt; 标记把每一个提交压缩到了一行中。它默认只显示提交ID和提交信息的第一行。&lt;code&gt;git log --oneline&lt;/code&gt; 的输出一般是这样的：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0e25143 Merge branch &lt;span style="color:#5af78e"&gt;&amp;#39;feature&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ad8621a Fix a bug in the feature&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;16b36c6 Add a new feature&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;23ad9ad Add the initial code base&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;它对于获得项目的总体情况很有帮助。&lt;/p&gt;&#10;&lt;h3 id="decorate"&gt;Decorate&lt;a class="anchor" href="#decorate" aria-label="Link"&gt;&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;很多时候，知道每个提交关联的分支或者标签很有用。&lt;code&gt;--decorate&lt;/code&gt; 标记让 &lt;code&gt;git log&lt;/code&gt; 显示指向这个提交的所有引用（比如说分支、标签等）。&lt;/p&gt;</description></item><item><title>Git 钩子：自定义你的工作流</title><link>http://www.gitfaq.cn/docs/git-recipes/Git-hooks-Customize-your-workflow/</link><pubDate>Sun, 24 Nov 2024 16:50:12 +0800</pubDate><guid>http://www.gitfaq.cn/docs/git-recipes/Git-hooks-Customize-your-workflow/</guid><description>&lt;h1 id="git-钩子自定义你的工作流"&gt;Git 钩子：自定义你的工作流&lt;a class="anchor" href="#git-%e9%92%a9%e5%ad%90%e8%87%aa%e5%ae%9a%e4%b9%89%e4%bd%a0%e7%9a%84%e5%b7%a5%e4%bd%9c%e6%b5%81" aria-label="Link"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;blockquote class=''&gt;&#10;&lt;p&gt;BY 童仲毅（&lt;a href="https://gitfaq.cn/docs/git-recipes/"&gt;geeeeeeeeek@github&lt;/a&gt;）&lt;/p&gt;&#10;&lt;p&gt;这是一篇在&lt;a href="https://www.atlassian.com/git/tutorials/git-hooks"&gt;原文（BY atlassian）&lt;/a&gt;基础上演绎的译文。除非另行注明，页面上所有内容采用知识共享-署名（&lt;a href="http://creativecommons.org/licenses/by/2.5/au/deed.zh"&gt;CC BY 2.5 AU&lt;/a&gt;）协议共享。&lt;/p&gt;&#10;&lt;/blockquote&gt;&lt;p&gt;Git 钩子是在 Git 仓库中特定事件发生时自动运行的脚本。它可以让你自定义 Git 内部的行为，在开发周期中的关键点触发自定义的行为。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="http://www.gitfaq.cn/imgs/git-hook.svg" alt="git hook" /&gt;&lt;/p&gt;&#10;&lt;p&gt;Git 钩子最常见的使用场景包括推行提交规范，根据仓库状态改变项目环境，和接入持续集成工作流。但是，因为脚本可以完全定制，你可以用 Git 钩子来自动化或者优化你开发工作流中任意部分。&lt;/p&gt;&#10;&lt;p&gt;在这篇文章中，我们会先简要介绍 Git 钩子是如何工作的。然后，我们会审视一些本地和远端仓库使用最流行的钩子。&lt;/p&gt;&#10;&lt;h2 id="git钩子概述"&gt;Git钩子概述&lt;a class="anchor" href="#git%e9%92%a9%e5%ad%90%e6%a6%82%e8%bf%b0" aria-label="Link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;Git 钩子是仓库中特定事件发生时 Git 自动运行的普通脚本。因此，Git 钩子安装和配置也非常容易。&lt;/p&gt;&#10;&lt;p&gt;钩子在本地或服务端仓库都可以部署，且只会在仓库中事件发生时被执行。在文章后面我们会具体地研究各种钩子。接下来所讲的配置对本地和服务端钩子都起作用。&lt;/p&gt;&#10;&lt;h3 id="安装钩子"&gt;安装钩子&lt;a class="anchor" href="#%e5%ae%89%e8%a3%85%e9%92%a9%e5%ad%90" aria-label="Link"&gt;&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;钩子存在于每个 Git 仓库的 &lt;code&gt;.git/hooks&lt;/code&gt; 目录中。当你初始化仓库时，Git 自动生成这个目录和一些示例脚本。当你观察 &lt;code&gt;.git/hooks&lt;/code&gt; 时，你会看到下面这些文件：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;applypatch-msg.sample pre-push.sample&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;commit-msg.sample pre-rebase.sample&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;post-update.sample prepare-commit-msg.sample&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pre-applypatch.sample update.sample&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pre-commit.sample&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这里已经包含了大部分可用的钩子了，但是 &lt;code&gt;.sample&lt;/code&gt; 拓展名防止它们默认被执行。为了安装一个钩子，你只需要去掉 &lt;code&gt;.sample&lt;/code&gt; 拓展名。或者你要写一个新的脚本，你只需添加一个文件名和上述匹配的新文件，去掉 &lt;code&gt;.sample&lt;/code&gt; 拓展名。&lt;/p&gt;&#10;&lt;p&gt;比如说，试试安装一个 &lt;code&gt;prepare-commit-msg&lt;/code&gt; 钩子。去掉脚本的 &lt;code&gt;.sample&lt;/code&gt; 拓展名，在文件中加上下面这两行：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#78787e"&gt;#!/bin/sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff5c57"&gt;echo&lt;/span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;# Please include a useful commit message!&amp;#34;&lt;/span&gt; &amp;gt; &lt;span style="color:#ff5c57"&gt;$1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;钩子需要能被执行，所以如果你创建了一个新的脚本文件，你需要修改它的文件权限。比如说，为了确保 &lt;code&gt;prepare-commit-msg&lt;/code&gt; 可执行，运行下面这个命令：&lt;/p&gt;</description></item><item><title>Git提交引用和引用日志</title><link>http://www.gitfaq.cn/docs/git-recipes/Git-commit-references-and-reference-logs/</link><pubDate>Sun, 24 Nov 2024 16:50:12 +0800</pubDate><guid>http://www.gitfaq.cn/docs/git-recipes/Git-commit-references-and-reference-logs/</guid><description>&lt;h1 id="git提交引用和引用日志"&gt;Git提交引用和引用日志&lt;a class="anchor" href="#git%e6%8f%90%e4%ba%a4%e5%bc%95%e7%94%a8%e5%92%8c%e5%bc%95%e7%94%a8%e6%97%a5%e5%bf%97" aria-label="Link"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;blockquote class=''&gt;&#10;&lt;p&gt;BY 童仲毅（&lt;a href="https://gitfaq.cn/docs/git-recipes/"&gt;geeeeeeeeek@github&lt;/a&gt;）&lt;/p&gt;&#10;&lt;p&gt;这是一篇在&lt;a href="https://www.atlassian.com/git/tutorials/refs-and-the-reflog"&gt;原文（BY atlassian）&lt;/a&gt;基础上演绎的译文。除非另行注明，页面上所有内容采用知识共享-署名（&lt;a href="http://creativecommons.org/licenses/by/2.5/au/deed.zh"&gt;CC BY 2.5 AU&lt;/a&gt;）协议共享。&lt;/p&gt;&#10;&lt;/blockquote&gt;&lt;p&gt;提交是 Git 的精髓所在，你无时不刻不在创建和缓存提交、查看以前的提交，或者用各种Git命令在仓库间转移你的提交。大多数的命令都对同一个提交操作，而有些会接受提交的引用作为参数。比如，你可以给 &lt;code&gt;git checkout&lt;/code&gt; 传入一个引用来查看以前的提交，或者传入一个分支名来切换到对应的分支。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="http://www.gitfaq.cn/imgs/git-to-commit.svg" alt="引用一次提交的各种方式" /&gt;&lt;/p&gt;&#10;&lt;p&gt;知道提交的各种引用方式之后，Git 的命令就会变得更加强大。在这章中，我们研究提交的各种引用方式，来一窥 &lt;code&gt;git checkout&lt;/code&gt;、&lt;code&gt;git branch&lt;/code&gt;、&lt;code&gt;git push&lt;/code&gt; 等命令的工作原理。&lt;/p&gt;&#10;&lt;p&gt;我们还会学到如何使用 Git 的引用日志查看似乎已被删除的提交。&lt;/p&gt;&#10;&lt;h2 id="哈希字串"&gt;哈希字串&lt;a class="anchor" href="#%e5%93%88%e5%b8%8c%e5%ad%97%e4%b8%b2" aria-label="Link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;引用一个提交最直接的方式是通过 SHA-1 的哈希字串，这是每个提交唯一的 ID。你可以在 &lt;code&gt;git log&lt;/code&gt; 的输出中找到提交的哈希字串。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;commit 0c708fdec272bc4446c6cabea4f0022c2b616eba&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Author: Mary Johnson &amp;lt;mary@example.com&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Date: Wed Jul &lt;span style="color:#ff9f43"&gt;9&lt;/span&gt; 16:37:42 &lt;span style="color:#ff9f43"&gt;2014&lt;/span&gt; -0500&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 一些提交信息&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在 Git 命令中传递时，你只需要提供足以确定那个提交的哈希子串即可。比如，你可以这样用 &lt;code&gt;git show&lt;/code&gt; 的命令显示上面的提交：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git show 0c708f&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;有时，我们需要把分支、标签或者其他间接的引用转变成对应提交的哈希。&lt;code&gt;git rev-parse&lt;/code&gt; 命令正是你需要的。下面这个命令返回 master 分支提交的哈希字串：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git rev-parse master&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;当你写的自定义脚本中需要将提交引用作为参数时，这个命令非常有用。你可以让 &lt;code&gt;git rev-parse&lt;/code&gt; 帮你处理转换，而不用手动做这件事。&lt;/p&gt;&#10;&lt;h2 id="引用"&gt;引用&lt;a class="anchor" href="#%e5%bc%95%e7%94%a8" aria-label="Link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;ref 是提交的间接引用。你可以把它当做哈希字串的别名，但对用户更友好。这就是 Git 内部表示分支和标签的机制。&lt;/p&gt;</description></item><item><title>Git for Windows v2.56.0.windows.4发布</title><link>http://www.gitfaq.cn/posts/git_for_windows_release_v2.56.0.windows.4/</link><pubDate>Sun, 25 Oct 2026 19:34:12 +0800</pubDate><guid>http://www.gitfaq.cn/posts/git_for_windows_release_v2.56.0.windows.4/</guid><description>&lt;h1 id="git-for-windows-v2560windows4发布"&gt;Git for Windows v2.56.0.windows.4发布&lt;a class="anchor" href="#git-for-windows-v2560windows4%e5%8f%91%e5%b8%83" aria-label="Link"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;p&gt;&lt;img src="https://r2.0x8.net/imgs/ScreenShot_2026-10-26_153746_381.png" alt="Git for Windows v2.56.0.windows.4" title="Git for Windows v2.56.0.windows.4"/&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;自 Git for Windows v2.56.0(3)（2026年10月22日）以来的变更&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;这是又一个紧急安全漏洞修复版本，针对的是&lt;a href="https://www.cve.org/CVERecord?id=CVE-2026-111497"&gt;CVE-2026-111497&lt;/a&gt;。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;问题修复&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;32 位 MinGit 中包含的可执行文件存在代码签名损坏的问题，现&lt;a href="https://github.com/git-for-windows/MINGW-packages/pull/231"&gt;已修复&lt;/a&gt;。&lt;/li&gt;&#10;&lt;li&gt;将&lt;a href="https://github.com/git-for-windows/git/issues/6514"&gt;内置的brotli组件&lt;/a&gt;升级至 v1.2.1，以解决&lt;a href="https://www.cve.org/CVERecord?id=CVE-2026-111497"&gt;CVE-2026-111497&lt;/a&gt;。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="下载git-for-windows"&gt;下载Git for Windows&lt;a class="anchor" href="#%e4%b8%8b%e8%bd%bdgit-for-windows" aria-label="Link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://url98.ctfile.com/f/18418398-17569908262498-fc03ff?p=3705"&gt;Git-2.56.0.4-64-bit.exe&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://url98.ctfile.com/f/18418398-17569908262519-73f37e?p=3705"&gt;Git-2.56.0.4-arm64.exe&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;blockquote class=''&gt;&#10;&lt;p&gt;AI生成&lt;/p&gt;&#10;&lt;/blockquote&gt;</description></item><item><title>下载Git</title><link>http://www.gitfaq.cn/download_git/</link><pubDate>Thu, 03 Sep 2026 10:42:11 +0800</pubDate><guid>http://www.gitfaq.cn/download_git/</guid><description>&lt;h1 id="git-for-windows下载"&gt;Git for Windows下载&lt;a class="anchor" href="#git-for-windows%e4%b8%8b%e8%bd%bd" aria-label="Link"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;h2 id="git-for-windows-v2560windows4"&gt;Git for Windows v2.56.0.windows.4&lt;a class="anchor" href="#git-for-windows-v2560windows4" aria-label="Link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://url98.ctfile.com/f/18418398-17569908262498-fc03ff?p=3705"&gt;Git-2.56.0.4-64-bit.exe&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://url98.ctfile.com/f/18418398-17569908262519-73f37e?p=3705"&gt;Git-2.56.0.4-arm64.exe&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="git-for-windows-v2560windows3"&gt;Git for Windows v2.56.0.windows.3&lt;a class="anchor" href="#git-for-windows-v2560windows3" aria-label="Link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://url98.ctfile.com/f/18418398-17569907587761-554a77?p=3705"&gt;Git-2.56.0.3-64-bit.exe&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://url98.ctfile.com/f/18418398-17569907587747-a1b21a?p=3705"&gt;Git-2.56.0.3-arm64.exe&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="git-for-windows-v2560windows"&gt;Git for Windows v2.56.0.windows&lt;a class="anchor" href="#git-for-windows-v2560windows" aria-label="Link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://url98.ctfile.com/f/18418398-17569900208023-887dc5?p=3705"&gt;Git-2.56.0-64-bit.exe&lt;/a&gt; (访问密码: 3705)&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://url98.ctfile.com/f/18418398-17569900208039-2be46c?p=3705"&gt;Git-2.56.0-arm64.exe&lt;/a&gt; (访问密码: 3705)&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="git-for-windows-v2550windows2"&gt;Git for Windows v2.55.0.windows.2&lt;a class="anchor" href="#git-for-windows-v2550windows2" aria-label="Link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://url98.ctfile.com/f/18418398-17569837106758-9fe93e?p=3705"&gt;Git-2.55.0.2-64-bit.exe&lt;/a&gt; (访问密码: 3705)&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://url98.ctfile.com/f/18418398-17569837106746-f10160?p=3705"&gt;Git-2.55.0.2-arm64.exe&lt;/a&gt; (访问密码: 3705)&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://url98.ctfile.com/f/18418398-17569837106736-c19719?p=3705"&gt;Git-2.55.0.2-64-bit.7z&lt;/a&gt; (访问密码: 3705)&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://url98.ctfile.com/f/18418398-17569837106727-940629?p=3705"&gt;Git-2.55.0.2-arm64.7z&lt;/a&gt; (访问密码: 3705)&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="git-for-windows-v2540windows1"&gt;Git for Windows v2.54.0.windows.1&lt;a class="anchor" href="#git-for-windows-v2540windows1" aria-label="Link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://url98.ctfile.com#/f/18418398-17569766264396-71a70f?p=3705"&gt;Git-2.54.0-64-bit.exe.7z&lt;/a&gt; (访问密码: 3705)&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://url98.ctfile.com#/f/18418398-17569766264426-6f3aa9?p=3705"&gt;Git-2.54.0-arm64.exe.7z&lt;/a&gt; (访问密码: 3705)&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://url98.ctfile.com#/f/18418398-17569766264461-3858bf?p=3705"&gt;PortableGit-2.54.0-64-bit.7z.exe.7z&lt;/a&gt; (访问密码: 3705)&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://url98.ctfile.com#/f/18418398-17569766264474-90922c?p=3705"&gt;PortableGit-2.54.0-arm64.7z.exe.7z&lt;/a&gt; (访问密码: 3705)&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="git-for-windows-25303"&gt;Git for Windows 2.53.0(3)&lt;a class="anchor" href="#git-for-windows-25303" aria-label="Link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://url98.ctfile.com#/f/18418398-17569766263647-80673a?p=3705"&gt;Git-2.53.0.3-64-bit.7z&lt;/a&gt; (访问密码: 3705)&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://url98.ctfile.com#/f/18418398-17569766263626-88ff4e?p=3705"&gt;Git-2.53.0.3-arm64.7z&lt;/a&gt; (访问密码: 3705)&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://url98.ctfile.com#/f/18418398-17569766263662-a743db?p=3705"&gt;PortableGit-2.53.0.3-64-bit.7z.7z&lt;/a&gt; (访问密码: 3705)&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://url98.ctfile.com#/f/18418398-17569766263683-2969e4?p=3705"&gt;PortableGit-2.53.0.3-arm64.7z.7z&lt;/a&gt; (访问密码: 3705)&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="git-25302"&gt;git 2.53.0.2&lt;a class="anchor" href="#git-25302" aria-label="Link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://url98.ctfile.com#/f/18418398-8781700359-7d2cc5?p=3705"&gt;Git-2.53.0.2-64-bit.exe&lt;/a&gt; (访问密码: 3705)&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://url98.ctfile.com#/f/18418398-8781700356-6e68fe?p=3705"&gt;Git-2.53.0.2-arm64.exe&lt;/a&gt; (访问密码: 3705)&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://url98.ctfile.com#/f/18418398-8781700349-fd2b0e?p=3705"&gt;PortableGit-2.53.0.2-64-bit.7z.exe&lt;/a&gt; (访问密码: 3705)&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://url98.ctfile.com#/f/18418398-8781700328-3d5e57?p=3705"&gt;PortableGit-2.53.0.2-arm64.7z.exe&lt;/a&gt; (访问密码: 3705)&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="git-2530"&gt;git 2.53.0&lt;a class="anchor" href="#git-2530" aria-label="Link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://url98.ctfile.com#/f/18418398-8666102102-7583ca?p=3705"&gt;Git-2.53.0-64-bit.exe&lt;/a&gt; (访问密码: 3705)&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://url98.ctfile.com#/f/18418398-8666102141-a1e36b?p=3705"&gt;Git-2.53.0-arm64.exe&lt;/a&gt; (访问密码: 3705)&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://url98.ctfile.com#/f/18418398-8666102061-0106ea?p=3705"&gt;PortableGit-2.53.0-arm64.7z.exe&lt;/a&gt; (访问密码: 3705)&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="git-2520"&gt;git 2.52.0&lt;a class="anchor" href="#git-2520" aria-label="Link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://url98.ctfile.com#/f/18418398-8487013509-de9cdb?p=3705"&gt;Git-2.52.0-64-bit.exe&lt;/a&gt; (访问密码: 3705)&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://url98.ctfile.com#/f/18418398-8487013503-da78e3?p=3705"&gt;PortableGit-2.52.0-64-bit.7z.exe&lt;/a&gt; (访问密码: 3705)&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="git-2512"&gt;git 2.51.2&lt;a class="anchor" href="#git-2512" aria-label="Link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://url98.ctfile.com#/f/18418398-8462642070-516316?p=3705"&gt;Git-2.51.2-64-bit.exe&lt;/a&gt; (访问密码: 3705)&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="git-2510"&gt;git 2.51.0&lt;a class="anchor" href="#git-2510" aria-label="Link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://url98.ctfile.com#/f/18418398-8418638170-812d22?p=3705"&gt;Git-2.51.0-64-bit.exe&lt;/a&gt; (访问密码: 3705)&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://url98.ctfile.com#/f/18418398-8418638167-1fe872?p=3705"&gt;Git-2.51.0-arm64.exe&lt;/a&gt; (访问密码: 3705)&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="git-2501"&gt;git 2.50.1&lt;a class="anchor" href="#git-2501" aria-label="Link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://url98.ctfile.com#/f/18418398-1524825718-70ec70?p=3705"&gt;Git-2.50.1-64-bit.exe&lt;/a&gt; (访问密码: 3705)&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://url98.ctfile.com#/f/18418398-1524825706-baaf4e?p=3705"&gt;Git-2.50.1-32-bit.exe&lt;/a&gt; (访问密码: 3705)&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="git-2490"&gt;git 2.49.0&lt;a class="anchor" href="#git-2490" aria-label="Link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://url98.ctfile.com#/f/18418398-1503528784-0aaaf9?p=3705"&gt;Git-2.49.0-64-bit.exe&lt;/a&gt; (访问密码: 3705)&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="git-2481"&gt;git 2.48.1&lt;a class="anchor" href="#git-2481" aria-label="Link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://url98.ctfile.com#/f/18418398-1464382843-c8436e?p=3705"&gt;Git-2.48.1-64-bit.exe&lt;/a&gt; (访问密码: 3705)&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://url98.ctfile.com#/f/18418398-1464383032-a8b849?p=3705"&gt;Git-2.48.1-32-bit.exe&lt;/a&gt; (访问密码: 3705)&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="git-2471"&gt;git 2.47.1&lt;a class="anchor" href="#git-2471" aria-label="Link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://url98.ctfile.com/f/18418398-1432481129-30967d?p=3705"&gt;Git-2.47.1-64-bit.exe&lt;/a&gt; (访问密码: 3705)&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://url98.ctfile.com/f/18418398-1432481096-3da625?p=3705"&gt;Git-2.47.1-32-bit.exe&lt;/a&gt; (访问密码: 3705)&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="git-2402"&gt;git 24.0.2&lt;a class="anchor" href="#git-2402" aria-label="Link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://url98.ctfile.com/f/18418398-1429268911-7a6859?p=3705"&gt;Git-2.47.0.2-32-bit.exe&lt;/a&gt; (访问密码: 3705)&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://url98.ctfile.com/f/18418398-1429268911-7a6859?p=3705"&gt;Git-2.47.0.2-32-bit.exe&lt;/a&gt; (访问密码: 3705)&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;em&gt;&lt;a href="https://github.com/git-for-windows/git"&gt;https://github.com/git-for-windows/git&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Git常见问题20250507</title><link>http://www.gitfaq.cn/posts/Git_faq_20250507/</link><pubDate>Wed, 07 May 2025 06:43:12 +0800</pubDate><guid>http://www.gitfaq.cn/posts/Git_faq_20250507/</guid><description>&lt;h2 id="git配置"&gt;git配置&lt;a class="anchor" href="#git%e9%85%8d%e7%bd%ae" aria-label="Link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;h3 id="我应该在-username-中放什么"&gt;我应该在 user.name 中放什么？&lt;a class="anchor" href="#%e6%88%91%e5%ba%94%e8%af%a5%e5%9c%a8-username-%e4%b8%ad%e6%94%be%e4%bb%80%e4%b9%88" aria-label="Link"&gt;&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;您应该填写您的个​​人姓名，通常是使用名字和姓氏的形式。例如， Git 的当前维护者使用 &amp;ldquo;Junio C Hamano&amp;rdquo; 。这将是您所做的每个提交中存储的姓名部分。&lt;/p&gt;&#10;&lt;p&gt;此配置对远程服务的身份验证没有任何影响；有关详细信息，请参阅 git-config[1] 中的 credential.username 。&lt;/p&gt;&#10;&lt;h3 id="httppostbuffer-到底起什么作用"&gt;http.postBuffer 到底起什么作用？&lt;a class="anchor" href="#httppostbuffer-%e5%88%b0%e5%ba%95%e8%b5%b7%e4%bb%80%e4%b9%88%e4%bd%9c%e7%94%a8" aria-label="Link"&gt;&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;此选项可更改 Git 通过 HTTP 或 HTTPS 将数据推送到远程时使用的缓冲区大小。如果数据大于此大小，处理 Git 的 HTTP 支持的 libcurl 将使用分块传输编码，因为事先不知道推送的数据的大小。&lt;/p&gt;&#10;&lt;p&gt;将此值保留为默认大小是可以的，除非您知道远程服务器或中间的代理不支持 HTTP/1.1（引入了分块传输编码）或已知分块数据会中断。这通常（错误地）被建议作为一般推送问题的解决方案，但由于几乎每个服务器和代理都至少支持 HTTP/1.1，因此提高此值通常无法解决大多数推送问题。无法正确支持 HTTP/1.1 和分块传输编码的服务器或代理在当今的互联网上不会那么有用，因为它会中断大量流量。&lt;/p&gt;&#10;&lt;p&gt;请注意，增加此值将增加 Git 通过 HTTP 或 HTTPS 执行的每个相关推送所使用的内存，因为无论是否全部使用，都会分配整个缓冲区。因此，最好将其保留为默认值，除非您确定需要不同的值。&lt;/p&gt;&#10;&lt;h3 id="git如何配置不同的编辑器"&gt;git如何配置不同的编辑器？&lt;a class="anchor" href="#git%e5%a6%82%e4%bd%95%e9%85%8d%e7%bd%ae%e4%b8%8d%e5%90%8c%e7%9a%84%e7%bc%96%e8%be%91%e5%99%a8" aria-label="Link"&gt;&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;如果您没有为 Git 专门指定编辑器，它将默认使用您通过 VISUAL 或 EDITOR 环境变量配置的编辑器，如果两者都未指定，则使用系统默认编辑器（通常为 vi ）。由于有些人发现 vi 难以使用或更喜欢其他编辑器，因此可能需要更改使用的编辑器。&lt;/p&gt;&#10;&lt;p&gt;如果要为大多数需要编辑器的程序配置通用编辑器，可以编辑 shell 配置（例如 ~/.bashrc 或 ~/.zshenv ），使其包含一行，将 EDITOR 或 VISUAL 环境变量设置为适当的值。例如，如果您更喜欢编辑器 nano ，则可以编写以下内容：&lt;/p&gt;</description></item><item><title>Git重写项目历史</title><link>http://www.gitfaq.cn/docs/git-recipes/Git-rewrites-project-history/</link><pubDate>Tue, 11 Mar 2025 10:31:12 +0800</pubDate><guid>http://www.gitfaq.cn/docs/git-recipes/Git-rewrites-project-history/</guid><description>&lt;h1 id="git重写项目历史"&gt;Git重写项目历史&lt;a class="anchor" href="#git%e9%87%8d%e5%86%99%e9%a1%b9%e7%9b%ae%e5%8e%86%e5%8f%b2" aria-label="Link"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;blockquote class=''&gt;&#10;&lt;p&gt;BY 童仲毅（&lt;a href="https://gitfaq.cn/docs/git-recipes/"&gt;geeeeeeeeek@github&lt;/a&gt;）&lt;/p&gt;&#10;&lt;p&gt;这是一篇在&lt;a href="https://www.atlassian.com/git/tutorials/rewriting-history"&gt;原文（BY atlassian）&lt;/a&gt;基础上演绎的译文。除非另行注明，页面上所有内容采用知识共享-署名（&lt;a href="http://creativecommons.org/licenses/by/2.5/au/deed.zh"&gt;CC BY 2.5 AU&lt;/a&gt;）协议共享。&lt;/p&gt;&#10;&lt;/blockquote&gt;&lt;h2 id="概述"&gt;概述&lt;a class="anchor" href="#%e6%a6%82%e8%bf%b0" aria-label="Link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;Git 的主要职责是保证你不会丢失提交的修改。但是，它同样被设计成让你完全掌控开发工作流。这包括了让你自定义你的项目历史，而这也创造了丢失提交的可能性。Git 提供了可以重写项目历史的命令，但也警告你这些命令可能会让你丢失内容。&lt;/p&gt;&#10;&lt;p&gt;这份教程讨论了重写提交快照的一些常见原因，并告诉你如何避免不好的影响。&lt;/p&gt;&#10;&lt;h2 id="git-commit-amend"&gt;git commit &amp;ndash;amend&lt;a class="anchor" href="#git-commit-amend" aria-label="Link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;git commit --amend&lt;/code&gt; 命令是修复最新提交的便捷方式。它允许你将缓存的修改和之前的提交合并到一起，而不是提交一个全新的快照。它还可以用来简单地编辑上一次提交的信息而不改变快照。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="http://www.gitfaq.cn/imgs/cea9ad4f205f01.svg" alt="Git Tutorial: git commit &amp;ndash;amend" /&gt;&lt;/p&gt;&#10;&lt;p&gt;但是，amend 不只是修改了最新的提交——它进行了一次替换。对于 Git 来说，这看上去像一个全新的提交，即上图中用星号表示的那一个。在公共仓库工作时一定要牢记这一点。&lt;/p&gt;&#10;&lt;h3 id="git-commit---amend用法"&gt;&lt;code&gt;git commit --amend&lt;/code&gt;用法&lt;a class="anchor" href="#git-commit---amend%e7%94%a8%e6%b3%95" aria-label="Link"&gt;&lt;/a&gt;&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git commit --amend&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;合并缓存的修改和上一次的提交，用新的快照替换上一个提交。缓存区没有文件时运行这个命令可以用来编辑上次提交的提交信息，而不会更改快照。&lt;/p&gt;&#10;&lt;h3 id="讨论"&gt;讨论&lt;a class="anchor" href="#%e8%ae%a8%e8%ae%ba" aria-label="Link"&gt;&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;仓促的提交在你日常开发过程中时常会发生。很容易就忘记了缓存一个文件或者弄错了提交信息的格式。&lt;code&gt;--amend&lt;/code&gt; 标记是修复这些小意外的便捷方式。&lt;/p&gt;&#10;&lt;h4 id="不要修复公共提交"&gt;不要修复公共提交&lt;a class="anchor" href="#%e4%b8%8d%e8%a6%81%e4%bf%ae%e5%a4%8d%e5%85%ac%e5%85%b1%e6%8f%90%e4%ba%a4" aria-label="Link"&gt;&lt;/a&gt;&lt;/h4&gt;&#10;&lt;p&gt;在&lt;a href="http://www.gitfaq.cn/docs/git-recipes/Git-rollsback-the-wrong-modifications/#git-reset#git-reset"&gt;&lt;code&gt;git reset&lt;/code&gt;&lt;/a&gt;这节中，我们说过永远不要重设和其他开发者共享的提交。对于修复也是一样：永远不要修复一个已经推送到公共仓库中的提交。&lt;/p&gt;&#10;&lt;p&gt;修复过的提交事实上是全新的提交，之前的提交会被移除出项目历史。这和重设公共快照的后果是一样的。如果你修复了其他开发者在之后继续开发的一个提交，看上去他们的工作基础从项目历史中消失了一样。对于在这上面的开发者来说这是很困惑的，而且很难恢复。&lt;/p&gt;&#10;&lt;h3 id="例子"&gt;例子&lt;a class="anchor" href="#%e4%be%8b%e5%ad%90" aria-label="Link"&gt;&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;下面这个🌰展示了 Git 开发工作流中的一个常见情形。我们编辑了一些希望在同一个快照中提交的文件，但我们忘记添加了其中的一个。修复错误只需要缓存那个文件并且用 &lt;code&gt;--amend&lt;/code&gt; 标记提交：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#78787e"&gt;# 编辑 hello.py 和 main.py&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git add hello.py&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git commit&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#78787e"&gt;# 意识到你忘记添加 main.py 的更改&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git add main.py&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git commit --amend --no-edit&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;编辑器会弹出上一次提交的信息，加入 &lt;code&gt;--no-edit&lt;/code&gt; 标记会修复提交但不修改提交信息。需要的话你可以修改，不然的话就像往常一样保存并关闭文件。完整的提交会替换之前不完整的提交，看上去就像我们在同一个快照中提交了 &lt;code&gt;hello.py&lt;/code&gt; 和 &lt;code&gt;main.py&lt;/code&gt;。&lt;/p&gt;</description></item><item><title>Git保持同步</title><link>http://www.gitfaq.cn/docs/git-recipes/Git-stays-in-sync/</link><pubDate>Tue, 11 Mar 2025 09:50:12 +0800</pubDate><guid>http://www.gitfaq.cn/docs/git-recipes/Git-stays-in-sync/</guid><description>&lt;h1 id="git保持同步"&gt;Git保持同步&lt;a class="anchor" href="#git%e4%bf%9d%e6%8c%81%e5%90%8c%e6%ad%a5" aria-label="Link"&gt;&lt;/a&gt;&lt;/h1&gt;&#10;&lt;blockquote class=''&gt;&#10;&lt;p&gt;BY 童仲毅（&lt;a href="https://gitfaq.cn/docs/git-recipes/"&gt;geeeeeeeeek@github&lt;/a&gt;）&lt;/p&gt;&#10;&lt;p&gt;这是一篇在&lt;a href="https://www.atlassian.com/git/tutorials/syncing"&gt;原文（BY atlassian）&lt;/a&gt;基础上演绎的译文。除非另行注明，页面上所有内容采用知识共享-署名（&lt;a href="http://creativecommons.org/licenses/by/2.5/au/deed.zh"&gt;CC BY 2.5 AU&lt;/a&gt;）协议共享。&lt;/p&gt;&#10;&lt;/blockquote&gt;&lt;p&gt;SVN 使用唯一的中央仓库作为开发者之间沟通的桥梁，在开发者的工作拷贝和中央仓库之间传递变更集合（changeset），协作得以发生。这和Git的协作模型有所不同，Git 给予每个开发者一份自己的仓库拷贝，拥有自己完整的本地历史和分支结构。用户通常共享一系列的提交而不是单个变更集合。Git 允许你在仓库间共享整个分支，而不是从工作副本提交一个差异集合到中央仓库。&lt;/p&gt;&#10;&lt;p&gt;下面的命令让你管理仓库之间的连接，将分支「推送」到其他仓库来发布本地历史，或是将分支「拉取」到本地仓库来查看其它开发者的贡献。&lt;/p&gt;&#10;&lt;h2 id="git-remote"&gt;git remote&lt;a class="anchor" href="#git-remote" aria-label="Link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;git remote&lt;/code&gt; 命令允许你创建、查看和删除和其它仓库之间的连接。远程连接更像是书签，而不是直接跳转到其他仓库的链接。它用方便记住的别名引用不那么方便记住的 URL，而不是提供其他仓库的实时连接。&lt;/p&gt;&#10;&lt;p&gt;例如，下图显示了你的仓库和中央仓库以及另一个开发者仓库之间的远程连接。你可以向 Git 命令传递 origin 和 john 的别名来引用这些仓库，替代完整的 URL。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="http://www.gitfaq.cn/imgs/1d3fcd6603801.svg" alt="Git Tutorial: git remote" /&gt;&lt;/p&gt;&#10;&lt;h3 id="git-remote用法"&gt;&lt;code&gt;git remote&lt;/code&gt;用法&lt;a class="anchor" href="#git-remote%e7%94%a8%e6%b3%95" aria-label="Link"&gt;&lt;/a&gt;&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git remote&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;列出你和其他仓库之间的远程连接。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git remote -v&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;和上个命令相同，但同时显示每个连接的 URL。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git remote add &amp;lt;name&amp;gt; &amp;lt;url&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;创建一个新的远程仓库连接。在添加之后，你可以将 &lt;code&gt;&amp;lt;name&amp;gt;&lt;/code&gt; 作为 &lt;code&gt;&amp;lt;url&amp;gt;&lt;/code&gt; 便捷的别名在其他 Git 命令中使用。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git remote rm &amp;lt;name&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;移除名为&lt;name&gt;的远程仓库的连接。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git remote rename &amp;lt;old-name&amp;gt; &amp;lt;new-name&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;将远程连接从 &lt;code&gt;&amp;lt;old-name&amp;gt;&lt;/code&gt; 重命名为 &lt;code&gt;&amp;lt;new-name&amp;gt;&lt;/code&gt;。&lt;/p&gt;&#10;&lt;h3 id="讨论"&gt;讨论&lt;a class="anchor" href="#%e8%ae%a8%e8%ae%ba" aria-label="Link"&gt;&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;Git 被设计为给每个开发者提供完全隔离的开发环境。也就是说信息并不是自动地在仓库之间传递。开发者需要手动将上游提交拉取到本地，或手动将本地提交推送到中央仓库中去。&lt;code&gt;git remote&lt;/code&gt; 命令正是将 URL 传递给这些「共享」命令的快捷方式。&lt;/p&gt;</description></item><item><title>GitHub发布Release详尽指南</title><link>http://www.gitfaq.cn/posts/A-detailed-guide-to-GitHub-releases/</link><pubDate>Wed, 01 Jan 2025 15:00:12 +0800</pubDate><guid>http://www.gitfaq.cn/posts/A-detailed-guide-to-GitHub-releases/</guid><description>&lt;p&gt;在开发过程中，发布 Release 是一个重要的环节，能够有效地管理软件的版本和交付。本文将详细介绍如何在 GitHub 上发布 Release，包括操作步骤、注意事项及常见问题解答。&lt;/p&gt;&#10;&lt;h2 id="什么是github-release"&gt;什么是GitHub Release&lt;a class="anchor" href="#%e4%bb%80%e4%b9%88%e6%98%afgithub-release" aria-label="Link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;p&gt;GitHub Release 是 GitHub 提供的一项功能，用于管理项目的发布版本。每一个 Release 都可以附带二进制文件、源代码压缩包以及变更日志，方便用户下载和使用。通过 Release，开发者能够清晰地展示项目的进展，并为用户提供稳定的版本。&lt;/p&gt;&#10;&lt;h2 id="为什么要在-github-上发布-release"&gt;为什么要在 GitHub 上发布 Release&lt;a class="anchor" href="#%e4%b8%ba%e4%bb%80%e4%b9%88%e8%a6%81%e5%9c%a8-github-%e4%b8%8a%e5%8f%91%e5%b8%83-release" aria-label="Link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;版本管理：使用 Release 可以帮助开发者对项目进行有效的版本管理。&lt;/li&gt;&#10;&lt;li&gt;便于用户下载：用户可以轻松找到适合自己的版本进行下载。&lt;/li&gt;&#10;&lt;li&gt;信息透明：Release 说明可以让用户了解到版本更新的内容与改动。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="如何在-github-上发布-release"&gt;如何在 GitHub 上发布 Release&lt;a class="anchor" href="#%e5%a6%82%e4%bd%95%e5%9c%a8-github-%e4%b8%8a%e5%8f%91%e5%b8%83-release" aria-label="Link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;h3 id="第一步准备工作"&gt;第一步：准备工作&lt;a class="anchor" href="#%e7%ac%ac%e4%b8%80%e6%ad%a5%e5%87%86%e5%a4%87%e5%b7%a5%e4%bd%9c" aria-label="Link"&gt;&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;在发布 Release 之前，需要确保你的项目已经完成了相应的功能开发和测试。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;确保代码稳定：确认你的代码已经经过充分测试，能够正常运行。&lt;/li&gt;&#10;&lt;li&gt;更新文档：确保项目的文档（如 README 文件）是最新的，并且描述了新版本的主要特性。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="第二步创建-tag"&gt;第二步：创建 Tag&lt;a class="anchor" href="#%e7%ac%ac%e4%ba%8c%e6%ad%a5%e5%88%9b%e5%bb%ba-tag" aria-label="Link"&gt;&lt;/a&gt;&lt;/h3&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;登录到你的 GitHub 账号，进入需要发布 Release 的项目页面。&lt;/li&gt;&#10;&lt;li&gt;点击页面上方的 “Code” 选项卡。&lt;/li&gt;&#10;&lt;li&gt;在页面右侧，找到 “Releases” 链接，点击进入。&lt;/li&gt;&#10;&lt;li&gt;点击 “Draft a new release” 按钮。&lt;/li&gt;&#10;&lt;li&gt;在 “Tag version” 输入框中输入新的 Tag 名称（例如 v1.0.0）。&lt;/li&gt;&#10;&lt;li&gt;选择相应的基础分支（通常是 main 或 master）。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="第三步填写-release-信息"&gt;第三步：填写 Release 信息&lt;a class="anchor" href="#%e7%ac%ac%e4%b8%89%e6%ad%a5%e5%a1%ab%e5%86%99-release-%e4%bf%a1%e6%81%af" aria-label="Link"&gt;&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;在创建 Release 页面中，需要填写一些关键信息：&lt;/p&gt;</description></item><item><title>Git实用命令详解</title><link>http://www.gitfaq.cn/posts/Git_Utility_Commands_Explained_in_Detail/</link><pubDate>Thu, 19 Sep 2024 09:34:12 +0800</pubDate><guid>http://www.gitfaq.cn/posts/Git_Utility_Commands_Explained_in_Detail/</guid><description>&lt;ol&gt;&#10;&lt;li&gt;将本地项目推送到远程仓库&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git init（初始化）&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git remote -v &lt;span style="color:#ff6ac1"&gt;(&lt;/span&gt;查看已经关联的地址&lt;span style="color:#ff6ac1"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git add . （添加本地仓库）&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git commit -m &lt;span style="color:#5af78e"&gt;&amp;#34;第一次提交&amp;#34;&lt;/span&gt;（提交说明）&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git remote add origin xxx（关联远程仓库）&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git pull --rebase origin master（同步本地与远程仓库）&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git push -u origin master（提交远程仓库）-f：强制推送至远程&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="2"&gt;&#10;&lt;li&gt;Git回退到某个历史版本&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;找到要回退的版本号(右击项目&amp;ndash;&amp;gt; Git &amp;ndash;&amp;gt; Show History &amp;ndash;&amp;gt;选中要回退的版本&amp;ndash;&amp;gt;Copy Revision Number)&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git reset --hard 139dcfaa558e3276b30b6b2e5cbbb9c00bbdca96 &lt;span style="color:#ff6ac1"&gt;(&lt;/span&gt;后面为版本号&lt;span style="color:#ff6ac1"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="3"&gt;&#10;&lt;li&gt;把修改推到远程服务器&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git push -f -u origin master 或者 git push -f 强制同步远程仓库。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="3"&gt;&#10;&lt;li&gt;修改项目关联远程地址方法&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;&lt;strong&gt;修改命令&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git remote set-url origin &amp;lt;url&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;手动修改&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;项目.git文件夹下，编辑config配置文件中url&lt;/p&gt;&#10;&lt;ol start="4"&gt;&#10;&lt;li&gt;Git 修改分支的名称&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;需要将分支br_rename_old修改为br_rename_new，执行如下步骤：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;执行命令&lt;code&gt;git checkout br_rename_old&lt;/code&gt;切换到br_rename_old分支，如果已经在这个分支下，可以不执行此步骤&lt;/li&gt;&#10;&lt;li&gt;执行命令&lt;code&gt;git pull origin br_rename_old&lt;/code&gt;将代码更新到和远程仓库一致&lt;/li&gt;&#10;&lt;li&gt;执行命令&lt;code&gt;git branch -m br_rename_old br_rename_new&lt;/code&gt;将本地仓库的br_rename_old的名称修改为br_rename_new&lt;/li&gt;&#10;&lt;li&gt;执行命令&lt;code&gt;git push --set-upstream origin br_rename_new&lt;/code&gt;将本地分支push到远程仓库&lt;/li&gt;&#10;&lt;li&gt;执行命令&lt;code&gt;git push origin --delete br_rename_old&lt;/code&gt;将远程分支br_rename_old删除&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;ol start="5"&gt;&#10;&lt;li&gt;Git 删除分支&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;我现在在dev20181018分支上，想删除dev20181018分支&lt;/p&gt;</description></item><item><title>修改Git远程URL</title><link>http://www.gitfaq.cn/posts/change_git_remote_url/</link><pubDate>Wed, 14 Aug 2024 09:34:12 +0800</pubDate><guid>http://www.gitfaq.cn/posts/change_git_remote_url/</guid><description>&lt;p&gt;查看当前远端地址&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ git remote -v&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;origin ssh://ov@git.zjq.xyz:29/ex.git &lt;span style="color:#ff6ac1"&gt;(&lt;/span&gt;fetch&lt;span style="color:#ff6ac1"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;origin ssh://ov@git.zjq.xyz:29/ex.git &lt;span style="color:#ff6ac1"&gt;(&lt;/span&gt;push&lt;span style="color:#ff6ac1"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;修改新的远端地址&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git remote set-url origin ssh://vo@git.jidan.org:29/ex.git&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;验证修改结果&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ git remote -v&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;origin ssh://vo@git.jidan.org:29/ex.git &lt;span style="color:#ff6ac1"&gt;(&lt;/span&gt;fetch&lt;span style="color:#ff6ac1"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;origin ssh://vo@git.jidan.org:29/ex.git &lt;span style="color:#ff6ac1"&gt;(&lt;/span&gt;push&lt;span style="color:#ff6ac1"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;下来就可以Push最新修改&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;On branch master&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Your branch is ahead of &lt;span style="color:#5af78e"&gt;&amp;#39;origin/master&amp;#39;&lt;/span&gt; by &lt;span style="color:#ff9f43"&gt;1&lt;/span&gt; commit.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff6ac1"&gt;(&lt;/span&gt;use &lt;span style="color:#5af78e"&gt;&amp;#34;git push&amp;#34;&lt;/span&gt; to publish your &lt;span style="color:#ff5c57"&gt;local&lt;/span&gt; commits&lt;span style="color:#ff6ac1"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;nothing to commit, working tree clean&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;The authenticity of host &lt;span style="color:#5af78e"&gt;&amp;#39;[git.jidan.org]:29 ([8.8.8.8]:29)&amp;#39;&lt;/span&gt; can&lt;span style="color:#5af78e"&gt;&amp;#39;t be established.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#5af78e"&gt;ED25519 key fingerprint is SHA256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#5af78e"&gt;This host key is known by the following other names/addresses:&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#5af78e"&gt; ~/.ssh/known_hosts:6: [git.zjq.xyz]:29&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#5af78e"&gt;Are you sure you want to continue connecting (yes/no/[fingerprint])? yes&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#5af78e"&gt;Warning: Permanently added &amp;#39;&lt;/span&gt;&lt;span style="color:#ff6ac1"&gt;[&lt;/span&gt;git.jidan.org&lt;span style="color:#ff6ac1"&gt;]&lt;/span&gt;:29&lt;span style="color:#ff5c57"&gt;&amp;#39;&lt;/span&gt; &lt;span style="color:#ff6ac1"&gt;(&lt;/span&gt;ED25519&lt;span style="color:#ff6ac1"&gt;)&lt;/span&gt; to the list of known hosts.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Enumerating objects: 39, &lt;span style="color:#ff6ac1"&gt;done&lt;/span&gt;.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Counting objects: 100% &lt;span style="color:#ff6ac1"&gt;(&lt;/span&gt;39/39&lt;span style="color:#ff6ac1"&gt;)&lt;/span&gt;, &lt;span style="color:#ff6ac1"&gt;done&lt;/span&gt;.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Delta compression using up to &lt;span style="color:#ff9f43"&gt;4&lt;/span&gt; threads&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Compressing objects: 100% &lt;span style="color:#ff6ac1"&gt;(&lt;/span&gt;23/23&lt;span style="color:#ff6ac1"&gt;)&lt;/span&gt;, &lt;span style="color:#ff6ac1"&gt;done&lt;/span&gt;.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Writing objects: 100% &lt;span style="color:#ff6ac1"&gt;(&lt;/span&gt;23/23&lt;span style="color:#ff6ac1"&gt;)&lt;/span&gt;, 10.86 MiB | 3.13 MiB/s, &lt;span style="color:#ff6ac1"&gt;done&lt;/span&gt;.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Total &lt;span style="color:#ff9f43"&gt;23&lt;/span&gt; &lt;span style="color:#ff6ac1"&gt;(&lt;/span&gt;delta 4&lt;span style="color:#ff6ac1"&gt;)&lt;/span&gt;, reused &lt;span style="color:#ff9f43"&gt;0&lt;/span&gt; &lt;span style="color:#ff6ac1"&gt;(&lt;/span&gt;delta 0&lt;span style="color:#ff6ac1"&gt;)&lt;/span&gt;, pack-reused &lt;span style="color:#ff9f43"&gt;0&lt;/span&gt; &lt;span style="color:#ff6ac1"&gt;(&lt;/span&gt;from 0&lt;span style="color:#ff6ac1"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;To ssh://git.jidan.org:29/ex.git&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 17ae34c..b8ae5da master -&amp;gt; master&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Push Done!&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class=''&gt;&#10;&lt;p&gt;AI生成&lt;/p&gt;</description></item><item><title>如何最简便的搭建Git服务?</title><link>http://www.gitfaq.cn/posts/Simplified_solution_to_build_Git_services/</link><pubDate>Thu, 25 Jul 2024 17:18:12 +0800</pubDate><guid>http://www.gitfaq.cn/posts/Simplified_solution_to_build_Git_services/</guid><description>&lt;p&gt;假设你有个绑定域名为&lt;code&gt;git.gitfaq.cn&lt;/code&gt;的服务器，并且可以通过SSH登录,计划将所有仓库(repository)放到&lt;code&gt;/data/git&lt;/code&gt;目录中。&lt;/p&gt;&#10;&lt;h3 id="建立仓库repository"&gt;建立仓库(repository)&lt;a class="anchor" href="#%e5%bb%ba%e7%ab%8b%e4%bb%93%e5%ba%93repository" aria-label="Link"&gt;&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;本地新建仓库(repository)&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mkdir repo.git&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git init&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;将仓库(repository)上传到服务器中。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;scp -r repo.git user@git.gitfaq.cn:/data/git&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;成功后，即可通过&lt;code&gt;user@git.gitfaq.cn:/data/git/repo.git&lt;/code&gt;来访问远端仓库。&lt;/p&gt;&#10;&lt;h3 id="访问仓库repository"&gt;访问仓库(repository)&lt;a class="anchor" href="#%e8%ae%bf%e9%97%ae%e4%bb%93%e5%ba%93repository" aria-label="Link"&gt;&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;建立好仓库后，拥有SSH权限的user就可以对&lt;code&gt;user@git.gitfaq.cn:/data/git/repo.git&lt;/code&gt;拥有操作权限。&lt;/p&gt;&#10;&lt;p&gt;还可以通过&lt;code&gt;git init --shared&lt;/code&gt;设置仓库目录的组权限为可写，此命令不会影响任何提交、引用等内容。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ssh user@git.gitfaq.cn&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff5c57"&gt;cd&lt;/span&gt; /data/git/repo.git&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git init --bare --shared&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果需要多个用户都对仓库有读写权限，又不能给每个用户在服务器上建立账户，那么提供 SSH 连接就是唯一的选择。 假设用来共享仓库的服务器已经安装了 SSH 服务，而且你通过它访问服务器。&lt;/p&gt;&#10;&lt;p&gt;以下几个方法可以使你给团队每个成员提供访问权:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;给每个人创建账号，为每个人运行一次 &lt;code&gt;adduser&lt;/code&gt;（或者 &lt;code&gt;useradd&lt;/code&gt;）并且设置密码。&lt;/li&gt;&#10;&lt;li&gt;在主机上建立一个 &lt;code&gt;git&lt;/code&gt; 公用账户，每个需要权限的人发一个 &lt;strong&gt;SSH 公钥&lt;/strong&gt;， 然后将其加入 &lt;code&gt;git&lt;/code&gt; 账户的 &lt;code&gt;~/.ssh/authorized_keys&lt;/code&gt; 文件。 这样一来，所有人都将通过 &lt;code&gt;git&lt;/code&gt;账户访问主机。&lt;/li&gt;&#10;&lt;li&gt;让 SSH 服务器通过某个 LDAP 服务，或者其他已经设定好的集中授权机制，来进行授权。 只要每个用户可以获得主机的 shell 访问权限，任何 SSH 授权机制你都可视为是有效的。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;blockquote class=''&gt;&#10;&lt;p&gt;AI生成&lt;/p&gt;&#10;&lt;/blockquote&gt;</description></item><item><title>初次使用 Git 的一些配置</title><link>http://www.gitfaq.cn/posts/Some_configurations_for_the_first_time_using_Git/</link><pubDate>Thu, 25 Jul 2024 16:46:12 +0800</pubDate><guid>http://www.gitfaq.cn/posts/Some_configurations_for_the_first_time_using_Git/</guid><description>&lt;p&gt;安装完Git，你会想要做几件事来定制你的 Git 环境。 每台计算机上只需要配置一次，程序升级时会保留配置信息。 你可以在任何时候再次通过运行命令来修改它们。&lt;/p&gt;&#10;&lt;h3 id="git配置管理"&gt;git配置管理&lt;a class="anchor" href="#git%e9%85%8d%e7%bd%ae%e7%ae%a1%e7%90%86" aria-label="Link"&gt;&lt;/a&gt;&lt;/h3&gt;&#10;&lt;p&gt;Git 自带一个 &lt;code&gt;git config&lt;/code&gt; 的工具来帮助设置控制 Git 外观和行为的配置变量。 这些变量存储在三个不同的位置：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;code&gt;/etc/gitconfig&lt;/code&gt; 文件: 包含系统上所有用户及他们仓库的通用配置。 如果在执行 &lt;code&gt;git config&lt;/code&gt; 时带上 &lt;code&gt;--system&lt;/code&gt; 选项，那么它就会读写该文件中的配置变量。 （需要管理员或超级用户权限）&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;code&gt;~/.gitconfig&lt;/code&gt; 或 &lt;code&gt;~/.config/git/config&lt;/code&gt; 文件：只针对当前用户。 你可以传递 &lt;code&gt;--global&lt;/code&gt; 选项让 Git 读写此文件，这会对你系统上 所有 的仓库生效。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;当前使用仓库的 Git 目录中的 &lt;code&gt;config&lt;/code&gt; 文件（即 &lt;code&gt;.git/config&lt;/code&gt;）：针对当前仓库。 你可以传递 &lt;code&gt;--local&lt;/code&gt; 选项让 Git 强制读写此文件，虽然默认情况下用的就是它。 （需要进入某个 Git 仓库中才能让该选项生效。）&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;每一个级别会覆盖上一级别的配置，所以 &lt;code&gt;.git/config&lt;/code&gt; 的配置变量会覆盖 &lt;code&gt;/etc/gitconfig&lt;/code&gt; 中的配置变量。&lt;/p&gt;&#10;&lt;p&gt;在 Windows 系统中，Git 会查找 &lt;code&gt;$HOME&lt;/code&gt; 目录下（一般情况下是 &lt;strong&gt;C:\Users$USER&lt;/strong&gt; ）的 &lt;code&gt;.gitconfig&lt;/code&gt; 文件。 Git 同样也会寻找 &lt;code&gt;/etc/gitconfig&lt;/code&gt; 文件，但只限于 MSys 的根目录下，即安装 Git 时所选的目标位置。 如果你在 Windows 上使用 Git 2.x 以后的版本，那么还有一个系统级的配置文件，Windows XP 上在 &lt;code&gt;C:\Documents and Settings\All Users\Application Data\Git\config&lt;/code&gt; ，Windows Vista 及其以后的版本在 &lt;code&gt;C:\ProgramData\Git\config&lt;/code&gt; 。此文件只能以管理员权限通过 &lt;code&gt;git config -f &amp;lt;file&amp;gt;&lt;/code&gt; 来修改。&lt;/p&gt;</description></item><item><title>zsh中使用git的一些配置建议</title><link>http://www.gitfaq.cn/posts/Some_configuration_suggestions_for_using_git_in_zsh/</link><pubDate>Thu, 25 Jul 2024 11:40:12 +0800</pubDate><guid>http://www.gitfaq.cn/posts/Some_configuration_suggestions_for_using_git_in_zsh/</guid><description>&lt;p&gt;Zsh 为 Git 提供了一个 Tab 补全库。 想要使用它，只需在你的 .zshrc 中执行 autoload -Uz compinit &amp;amp;&amp;amp; compinit 即可。 相对于 Bash，Zsh 的接口更加强大：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ git che&amp;lt;Tab&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;check-attr -- 显示 gitattributes 信息&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;check-ref-format -- 检查引用名称是否符合规范&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;checkout -- 从工作区中检出分支或路径&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;checkout-index -- 从暂存区拷贝文件至工作目录&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cherry -- 查找没有被合并至上游的提交&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cherry-pick -- 从一些已存在的提交中应用更改&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;有歧义的 Tab 补全不仅会被列出，它们还会有帮助性的描述，你可以通过不断敲击 Tab 以图形方式浏览补全列表。 该功能可用于 Git 命令、它们的参数和在仓库中内容的名称（例如 refs 和 remotes），还有文件名和其他所有 Zsh 知道如何去补全的项目。&lt;/p&gt;&#10;&lt;p&gt;Zsh 提供了一个从版本控制系统中获取信息的框架，叫做 vcs_info 。 把如下代码添加至你的 ~/.zshrc 文件中，就可以在右侧显示分支名称：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;autoload -Uz vcs_info&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;precmd_vcs_info&lt;span style="color:#ff6ac1"&gt;()&lt;/span&gt; &lt;span style="color:#ff6ac1"&gt;{&lt;/span&gt; vcs_info &lt;span style="color:#ff6ac1"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff5c57"&gt;precmd_functions&lt;/span&gt;&lt;span style="color:#ff6ac1"&gt;+=(&lt;/span&gt; precmd_vcs_info &lt;span style="color:#ff6ac1"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;setopt prompt_subst&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff5c57"&gt;RPROMPT&lt;/span&gt;&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;&lt;span style="color:#5af78e"&gt;\$&lt;/span&gt;vcs_info_msg_0_&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#78787e"&gt;# PROMPT=\$vcs_info_msg_0_&amp;#39;%# &amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;zstyle &lt;span style="color:#5af78e"&gt;&amp;#39;:vcs_info:git:*&amp;#39;&lt;/span&gt; formats &lt;span style="color:#5af78e"&gt;&amp;#39;%b&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;当你的命令行位于一个 Git 仓库目录时，在任何时候，都可以在命令行窗口右侧显示当前分支。 （当然也可以在左侧显示，只需把上面 PROMPT 的注释去掉即可。） 它看起来像这样：&lt;/p&gt;</description></item><item><title>为什么windows下文本文件被检测为二进制文件？</title><link>http://www.gitfaq.cn/posts/Why_are_text_files_detected_as_binary_files_in_Windows/</link><pubDate>Thu, 25 Jul 2024 10:23:12 +0800</pubDate><guid>http://www.gitfaq.cn/posts/Why_are_text_files_detected_as_binary_files_in_Windows/</guid><description>&lt;p&gt;当您将文本文件存储为 UTF-8 时，Git 效果最佳。Windows 上的许多程序都支持 UTF-8，但有些程序不支持，并且仅使用小端 UTF-16 格式，Git 将其检测为二进制文件。如果您无法在程序中使用 UTF-8，则可以指定一个工作树编码，指示应使用哪个编码签出您的文件，同时仍将这些文件作为 UTF-8 存储在存储库中。这允许像 &lt;a href="http://www.gitfaq.cn/tags/git-diff"&gt;git-diff&lt;/a&gt;这样的工具按预期工作，同时仍允许您的工具工作。&lt;/p&gt;&#10;&lt;p&gt;为此，您可以使用具有 &lt;code&gt;working-tree-encoding&lt;/code&gt; 属性的 &lt;a href="http://www.gitfaq.cn/tags/gitattributes/"&gt;gitattributes&lt;/a&gt; 模式。例如，以下模式将所有 C 文件设置为使用 UTF-16LE-BOM，这是 Windows 上常见的编码&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;*.c&#9;working-tree-encoding&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;UTF-16LE-BOM&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;您需要运行 &lt;code&gt;git add --renormalize&lt;/code&gt; 以使其生效。请注意，如果您在跨平台使用的项目上进行这些更改，您可能希望在按用户配置的文件中或在 &lt;code&gt;$GIT_DIR/info/attributes&lt;/code&gt; 中进行更改，因为在存储库中的 &lt;code&gt;.gitattributes&lt;/code&gt; 文件中进行更改将适用于存储库的所有用户。&lt;/p&gt;&#10;&lt;p&gt;另请参阅以下条目以获取有关规范换行符的信息，并参阅 &lt;a href="http://www.gitfaq.cn/tags/gitattributes/"&gt;gitattributes&lt;/a&gt;以获取有关属性文件的更多信息。&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;via &lt;a href="https://gitfaq.org/1/01/how-do-i-add-only-a-portion-of-a-file/"&gt;https://gitfaq.org/1/01/how-do-i-add-only-a-portion-of-a-file/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&#10;&lt;blockquote class=''&gt;&#10;&lt;p&gt;AI生成&lt;/p&gt;&#10;&lt;/blockquote&gt;</description></item><item><title>为什么我有一个总是被修改的文件?</title><link>http://www.gitfaq.cn/posts/Why_do_I_have_a_file_that_is_always_modified/</link><pubDate>Thu, 25 Jul 2024 10:04:12 +0800</pubDate><guid>http://www.gitfaq.cn/posts/Why_do_I_have_a_file_that_is_always_modified/</guid><description>&lt;p&gt;在内部，Git 始终将文件名存储为字节序列，并且不执行任何编码或大小写转换。但是，Windows 和 macOS 默认情况下都对文件名执行大小写转换。因此，最终可能会出现多个文件或目录，其名称仅在大小写上有所不同。Git 可以很好地处理这种情况，但文件系统只能存储其中一个文件，因此当 Git 读取另一个文件以查看其内容时，它看起来已被修改。&lt;/p&gt;&#10;&lt;p&gt;最好删除其中一个文件，以便您只有一个文件。您可以使用以下命令（假设在其他干净的工作树上存在两个文件 &lt;code&gt;AFile.txt&lt;/code&gt; 和 &lt;code&gt;afile.txt&lt;/code&gt;）执行此操作&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ git rm --cached AFile.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ git commit -m &lt;span style="color:#5af78e"&gt;&amp;#39;Remove files conflicting in case&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ git checkout .&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这样可以避免接触磁盘，但会删除附加文件。你的项目可能更喜欢采用命名约定，例如全小写名称，以避免此问题再次发生；可以使用&lt;code&gt;pre-receive&lt;/code&gt;钩子或作为持续集成 (CI) 系统的一部分来检查此类约定。&lt;/p&gt;&#10;&lt;p&gt;如果你的系统正在使用污点或清理过滤器，但之前已提交文件而未运行污点或清理过滤器，则任何平台上都可能出现永久修改的文件。要解决此问题，请在其他干净的工作树上运行以下内容&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ git add --renormalize .&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;via &lt;a href="https://git.js.cn/docs/gitfaq"&gt;https://git.js.cn/docs/gitfaq&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&#10;&lt;blockquote class=''&gt;&#10;&lt;p&gt;AI生成&lt;/p&gt;&#10;&lt;/blockquote&gt;</description></item><item><title>Git 中存储文件的推荐方法是什么?</title><link>http://www.gitfaq.cn/posts/recommended_way_to_store_files_in_Git/</link><pubDate>Thu, 25 Jul 2024 09:51:12 +0800</pubDate><guid>http://www.gitfaq.cn/posts/recommended_way_to_store_files_in_Git/</guid><description>&lt;p&gt;虽然 Git 可以存储和处理任何类型的任何文件，但有些设置比其他设置效果更好。一般来说，我们建议将文本文件存储在 UTF-8 中，不带字节顺序标记 (BOM)，并带有 LF（Unix 样式）结尾。我们还建议在提交消息中使用 UTF-8（同样，不带 BOM）。这些设置在各个平台上以及与&lt;code&gt;git diff&lt;/code&gt;和&lt;code&gt;git merge&lt;/code&gt;等工具配合使用时效果最佳。&lt;/p&gt;&#10;&lt;p&gt;此外，如果你可以在基于文本或非基于文本的存储格式之间进行选择，我们建议将文件存储在文本格式中，并在必要时将它们转换为其他格式。例如，每行一个记录的基于文本的 SQL 转储将比实际数据库文件更适合于差异和合并。类似地，基于文本的格式（如 Markdown 和 AsciiDoc）将比二进制格式（如 Microsoft Word 和 PDF）效果更好。&lt;/p&gt;&#10;&lt;p&gt;类似地，通常不建议在存储库中存储二进制依赖项（例如共享库或 JAR 文件）或构建产品。最好将依赖项和构建产品存储在工件或包服务器上，只将引用、URL 和哈希存储在存储库中。&lt;/p&gt;&#10;&lt;p&gt;我们还建议设置一个&lt;a href="http://www.gitfaq.cn/tags/gitattributes/"&gt;gitattributes&lt;/a&gt;文件来明确标记哪些文件是文本文件，哪些是二进制文件。如果你希望 Git 猜测，你可以设置属性&lt;code&gt;text=auto&lt;/code&gt;。例如，以下内容可能适用于某些项目&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#78787e"&gt;# By default, guess.&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;*&#9;&lt;span style="color:#ff5c57"&gt;text&lt;/span&gt;&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;auto&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#78787e"&gt;# Mark all C files as text.&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;*.c&#9;text&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#78787e"&gt;# Mark all JPEG files as binary.&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;*.jpg&#9;binary&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这些设置帮助工具为输出（例如补丁）选择正确的格式，并导致文件以适合该平台的行尾签出。&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;via &lt;a href="https://git.js.cn/docs/gitfaq"&gt;https://git.js.cn/docs/gitfaq&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&#10;&lt;blockquote class=''&gt;&#10;&lt;p&gt;AI生成&lt;/p&gt;&#10;&lt;/blockquote&gt;</description></item><item><title>Windows下如何安装Git?</title><link>http://www.gitfaq.cn/posts/windows_install_git/</link><pubDate>Thu, 25 Jul 2024 09:34:12 +0800</pubDate><guid>http://www.gitfaq.cn/posts/windows_install_git/</guid><description>&lt;p&gt;Windows下安装Git需要在&lt;a href="https://git-scm.com/download"&gt;https://git-scm.com/download&lt;/a&gt;下载&lt;strong&gt;git for windows&lt;/strong&gt;安装包&lt;/p&gt;&#10;&lt;p&gt;进入以上页面后，找到如下处，点击&lt;strong&gt;Download for Windows&lt;/strong&gt;开始下载&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="http://www.gitfaq.cn/imgs/20240725093629.png" alt="Download for Windows" /&gt;&lt;/p&gt;&#10;&lt;p&gt;随后进入开始下载页面，但是从github源地址下载，国内访问异常的话可以 &lt;a href="https://url98.ctfile.com/f/18418398-1429268911-7a6859?p=3705"&gt;点击这里&lt;/a&gt; 通过国内线路下载。&lt;/p&gt;&#10;&lt;h2 id="git-scm历史版本"&gt;git scm历史版本&lt;a class="anchor" href="#git-scm%e5%8e%86%e5%8f%b2%e7%89%88%e6%9c%ac" aria-label="Link"&gt;&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://url98.ctfile.com/f/18418398-1429268911-7a6859?p=3705"&gt;Git-2.47.0.2-32-bit.exe&lt;/a&gt; (访问密码: 3705)&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://url98.ctfile.com/f/18418398-1429268911-7a6859?p=3705"&gt;Git-2.47.0.2-32-bit.exe&lt;/a&gt; (访问密码: 3705)&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;安装完成后，在任意目录右键，点击&lt;code&gt;Open Git Bash here&lt;/code&gt;打开terminal，输入&lt;code&gt;git version&lt;/code&gt;查看当前git版本&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;alair@e64 MINGW64 /d/dt2&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ git version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git version 2.45.2.windows.1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class=''&gt;&#10;&lt;p&gt;AI生成&lt;/p&gt;&#10;&lt;/blockquote&gt;</description></item><item><title>Git中fetch和pull有什么不同之处？</title><link>http://www.gitfaq.cn/posts/difference-between-fetch-and-pull/</link><pubDate>Wed, 24 Jul 2024 17:20:12 +0800</pubDate><guid>http://www.gitfaq.cn/posts/difference-between-fetch-and-pull/</guid><description>&lt;p&gt;&lt;code&gt;git pull [remote] [branch] &lt;/code&gt;等同于如下操作&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#78787e"&gt;## 从远程仓库获取最新修改&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git fetch &lt;span style="color:#ff6ac1"&gt;[&lt;/span&gt;remote&lt;span style="color:#ff6ac1"&gt;]&lt;/span&gt; &lt;span style="color:#ff6ac1"&gt;[&lt;/span&gt;branch&lt;span style="color:#ff6ac1"&gt;]&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#78787e"&gt;## 合并最新修改&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git merge &lt;span style="color:#ff6ac1"&gt;[&lt;/span&gt;remote&lt;span style="color:#ff6ac1"&gt;][&lt;/span&gt;/branch&lt;span style="color:#ff6ac1"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;git pull --rebase [remote] [branch]&lt;/code&gt;等同于如下操作&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#78787e"&gt;## 从远程仓库获取最新修改&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git fetch &lt;span style="color:#ff6ac1"&gt;[&lt;/span&gt;remote&lt;span style="color:#ff6ac1"&gt;]&lt;/span&gt; &lt;span style="color:#ff6ac1"&gt;[&lt;/span&gt;branch&lt;span style="color:#ff6ac1"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git rebase &lt;span style="color:#ff6ac1"&gt;[&lt;/span&gt;remote&lt;span style="color:#ff6ac1"&gt;][&lt;/span&gt;/branch&lt;span style="color:#ff6ac1"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;via &lt;a href="https://gitfaq.org/1/01/what-is-the-difference-between-fetch-and-pull/"&gt;https://gitfaq.org/1/01/what-is-the-difference-between-fetch-and-pull/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&#10;&lt;blockquote class=''&gt;&#10;&lt;p&gt;AI生成&lt;/p&gt;&#10;&lt;/blockquote&gt;</description></item><item><title>如何仅添加文件的部分内容？</title><link>http://www.gitfaq.cn/posts/add_only_a_portion_of_a_file/</link><pubDate>Wed, 24 Jul 2024 16:50:12 +0800</pubDate><guid>http://www.gitfaq.cn/posts/add_only_a_portion_of_a_file/</guid><description>&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git add --patch &amp;lt;file&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;使用该命令会打开一个交互式界面，将每处不同的地区按照区块(hunk)的方式逐一显示，并提示你如何处理，从而达到仅添加部分内容的目的。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git add --patch package.json&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;diff --git a/package.json b/package.json&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;index 7a558a3..e03ce3f &lt;span style="color:#ff9f43"&gt;100644&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--- a/package.json&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+++ b/package.json&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@@ -2,7 +2,6 @@&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style="color:#5af78e"&gt;&amp;#34;package&amp;#34;&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;version&amp;#34;&lt;/span&gt;: &lt;span style="color:#5af78e"&gt;&amp;#34;0.4.3&amp;#34;&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;description&amp;#34;&lt;/span&gt;: &lt;span style="color:#5af78e"&gt;&amp;#34;this is an example package&amp;#34;&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- &lt;span style="color:#5af78e"&gt;&amp;#34;keywords&amp;#34;&lt;/span&gt;: &lt;span style="color:#ff6ac1"&gt;[&lt;/span&gt;&lt;span style="color:#5af78e"&gt;&amp;#34;key&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;middleware&amp;#34;&lt;/span&gt;, &lt;span style="color:#5af78e"&gt;&amp;#34;connect&amp;#34;&lt;/span&gt;&lt;span style="color:#ff6ac1"&gt;]&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;repository&amp;#34;&lt;/span&gt;: &lt;span style="color:#5af78e"&gt;&amp;#34;git://github.com/foo/bar.git&amp;#34;&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;author&amp;#34;&lt;/span&gt;: &lt;span style="color:#5af78e"&gt;&amp;#34;jxt &amp;lt;info@gitfaq.cn&amp;gt; (http://gitfaq.cn)&amp;#34;&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#5af78e"&gt;&amp;#34;repository&amp;#34;&lt;/span&gt;: &lt;span style="color:#5af78e"&gt;&amp;#34;git://github.com/foo/bar&amp;#34;&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Stage this hunk &lt;span style="color:#ff6ac1"&gt;[&lt;/span&gt;y,n,q,a,d,/,j,J,g,e,?&lt;span style="color:#ff6ac1"&gt;]&lt;/span&gt;? y&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;Stage this hunk [y,n,q,a,d,/,j,J,g,e,?]? &lt;/code&gt; 提示如何处理当前区块(hunk)，输入&lt;code&gt;?&lt;/code&gt;可查看帮助信息&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;y - stage this hunk 暂存此区块&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;n - do not stage this hunk 不暂存此区块&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;q - quit; do not stage this hunk or any of the remaining ones 退出；不暂存包括此块在内的剩余的区块&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;a - stage this hunk and all later hunks in the file 暂存此块与此文件后面所有的区块&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;d - do not stage this hunk or any of the later hunks in the file 不暂存此块与此文件后面所有的区块&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;g - select a hunk to go to 选择并跳转至一个区块&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/ - search for a hunk matching the given regex 搜索与给定正则表达示匹配的区块&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;j - leave this hunk undecided, see next undecided hunk 暂不决定，转至下一个未决定的区块&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;J - leave this hunk undecided, see next hunk 暂不决定，转至下一个区块&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;k - leave this hunk undecided, see previous undecided hunk 暂不决定，转至上一个未决定的区块&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;K - leave this hunk undecided, see previous hunk 暂不决定，转至上一个区块&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;s - split the current hunk into smaller hunks 将当前的区块分割成多个较小的区块&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;e - manually edit the current hunk 手动编辑当前的区块&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;? - print help 输出帮助&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;via &lt;a href="https://gitfaq.org/1/01/how-do-i-add-only-a-portion-of-a-file/"&gt;https://gitfaq.org/1/01/how-do-i-add-only-a-portion-of-a-file/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Git如何设置代理?</title><link>http://www.gitfaq.cn/posts/Git_proxy_config/</link><pubDate>Wed, 24 Jul 2024 16:43:12 +0800</pubDate><guid>http://www.gitfaq.cn/posts/Git_proxy_config/</guid><description>&lt;p&gt;GIT配置代理如下设置，&lt;code&gt;socks5&lt;/code&gt;为代理协议，可配置http/https/socks5等。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; git config --global http.proxy socks5://127.0.0.1:20170 &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class=''&gt;&#10;&lt;p&gt;AI生成&lt;/p&gt;&#10;&lt;/blockquote&gt;</description></item><item><title>git writing objects 卡死怎么办?</title><link>http://www.gitfaq.cn/posts/git_writing_objects_is_stuck/</link><pubDate>Wed, 24 Jul 2024 16:30:12 +0800</pubDate><guid>http://www.gitfaq.cn/posts/git_writing_objects_is_stuck/</guid><description>&lt;p&gt;git writing objects时常卡死，可以试着将远端地址改为ssh方式再重新push&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git remote set-url origin git@gitlab.com:username/repo.git&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class=''&gt;&#10;&lt;p&gt;AI生成&lt;/p&gt;&#10;&lt;/blockquote&gt;</description></item><item><title>如何归档备份Git内容?</title><link>http://www.gitfaq.cn/posts/Git_archive_backup/</link><pubDate>Wed, 24 Jul 2024 15:53:12 +0800</pubDate><guid>http://www.gitfaq.cn/posts/Git_archive_backup/</guid><description>&lt;p&gt;想将当前版本的内容归档并备份，可以使用&lt;code&gt;git archive&lt;/code&gt;命令来实现&lt;/p&gt;&#10;&lt;p&gt;归档当前master，然后压缩成zip文件。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git archive --format&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;zip --output&lt;span style="color:#ff6ac1"&gt;=&lt;/span&gt;repobak_&lt;span style="color:#ff6ac1"&gt;$(&lt;/span&gt;date +%Y-%m-%d&lt;span style="color:#ff6ac1"&gt;)&lt;/span&gt;.zip master&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote class=''&gt;&#10;&lt;p&gt;AI生成&lt;/p&gt;&#10;&lt;/blockquote&gt;</description></item></channel></rss>