<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Git &#8211; 李辉 / Grey Li</title>
	<atom:link href="https://greyli.com/tag/git/feed/" rel="self" type="application/rss+xml" />
	<link>https://greyli.com</link>
	<description>一个编程和写作爱好者的在线记事本</description>
	<lastBuildDate>Thu, 06 Nov 2025 11:36:11 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.9.26</generator>

<image>
	<url>https://greyli.com/wp-content/uploads/2025/03/avatar-500-compressed-144x144.jpg</url>
	<title>Git &#8211; 李辉 / Grey Li</title>
	<link>https://greyli.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>《Flask 入门教程》第 1 章：准备工作</title>
		<link>https://greyli.com/flask-tutorial-chapter-1/</link>
		<comments>https://greyli.com/flask-tutorial-chapter-1/#respond</comments>
		<pubDate>Tue, 04 Dec 2018 06:42:23 +0000</pubDate>
		<dc:creator><![CDATA[李辉]]></dc:creator>
				<category><![CDATA[计算机与编程]]></category>
		<category><![CDATA[Flask]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[Pipenv]]></category>

		<guid isPermaLink="false">http://greyli.com/?p=1989</guid>
		<description><![CDATA[在通过这本书学习 Flask 开发前，我假设你了解了 Python 和 HTML 的基础知识。你的 Pytho [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>
	在通过这本书学习 Flask 开发前，我假设你了解了 Python 和 HTML 的基础知识。你的 Python 版本可以是 2.7，也可以是 3.3 及以上版本。电脑的操作系统可以是 Windows，也可以是 macOS 或 Linux。
</p>
<h2>
	安装编辑器和浏览器<br />
</h2>
<p>
	对于编辑器来说，每个人都有不同的偏好，你可以自由选择。可以选择功能丰富的IDE（集成开发环境），比如&nbsp;<a href="https://www.jetbrains.com/pycharm/" rel="nofollow">PyCharm</a>；也可以选择相对轻量的编辑器，比如&nbsp;<a href="https://atom.io/" rel="nofollow">Atom</a>&nbsp;或&nbsp;<a href="https://www.sublimetext.com/" rel="nofollow">Sublime Text</a>。浏览器建议使用&nbsp;<a href="https://www.mozilla.org/en-US/firefox/new/" rel="nofollow">Firefox</a>&nbsp;或&nbsp;<a href="https://www.google.com/chrome/" rel="nofollow">Chrome</a>。
</p>
<h2>
	使用命令行<br />
</h2>
<p>
	在本书中，你需要使用命令行窗口来执行许多操作。你可以使用 Windows 下的 cmd.exe，或是 macOS 和 Linux 下的终端（Terminal）。下面我们执行一个最简单的&nbsp;<code>whoami</code>&nbsp;命令（即 Who Am I？）：
</p>
<pre>
$ whoami
greyli</pre>
<p>
	这个命令会打印出当前计算机用户的名称。其他常用的命令还有&nbsp;<code>cd</code>&nbsp;命令，用来切换目录（<strong>c</strong>hange&nbsp;<strong>d</strong>irectory）；<code>mkdir</code>&nbsp;命令，用来创建目录（<strong>m</strong>a<strong>k</strong>e&nbsp;<strong>dir</strong>ectory）。在不同的操作系统上，执行某个操作的命令可能会有所不同，在必要的地方，书里会进行提示。
</p>
<p>
	我们先来为我们的程序创建一个文件夹：
</p>
<pre>
$ mkdir watchlist
$ cd watchlist</pre>
<p>
	除非特别说明，从现在开始，本书假设你的工作目录将是在项目的根目录，即 watchlist/ 目录。
</p>
<p>
	为了确保你已经正确安装了 Python，可以执行下面的命令测试是否有报错：
</p>
<pre>
$ python --version
Python 2.7.11</pre>
<p>
	对于 Windows 用户，请使用&nbsp;<a href="http://cmder.net/" rel="nofollow">cmder</a>（一个基于&nbsp;<a href="https://conemu.github.io/" rel="nofollow">ConEmu</a>&nbsp;实现的终端模拟器） 来代替系统自带的 cmd.exe，或是使用安装 Git for Windows 后（下一节）附带的 Git Bash。cmder 集成了 Git Bash，支持一些在 Linux 或 macOS 下才能使用的命令（程序），比如 ls、cat、nano、ssh 等，这些命令我们在后面会用到。
</p>
<h2>
	使用 Git<br />
</h2>
<p>
	<a href="https://git-scm.com/" rel="nofollow">Git</a>&nbsp;是一个流行的版本控制工具，我们可以用它来记录程序源码和文件的变动情况，或是在编程时进行多人协作，你可以把它看做一个优雅的代码变动备份工具。
</p>
<p>
	如果你还不熟悉 Git 也没关系，可以先按照书中的命令去做，有时间再去了解原理。现在要做的第一件事就是在你的电脑上<a href="https://git-scm.com/book/zh/v1/%E8%B5%B7%E6%AD%A5-%E5%AE%89%E8%A3%85-Git" rel="nofollow">安装 Git</a>&nbsp;（可以执行&nbsp;<code>git --help</code>&nbsp;命令检查是否已经安装，没有提示&ldquo;命令未找到（Command not found）&rdquo;则表示已安装）。
</p>
<p>
	安装后可以在命令行先使用使用下面的命令查看版本，没有报错则表示已正确安装：
</p>
<pre>
$ git --version
git version 2.17.1</pre>
<p>
	为了让 Git 知道你是谁，以便在提交代码到版本仓库的时候进行记录，使用下面的命令设置你的信息：
</p>
<pre>
$ git config --global user.name &quot;Grey Li&quot;  # 替换成你的名字
$ git config --global user.email &quot;withlihui@gmail.com&quot;  # 替换成你的邮箱地址</pre>
<p>
	现在为我们的项目文件夹创建一个 Git 仓库，这会在我们的项目根目录创建一个 .git 文件夹：
</p>
<pre>
$ git init
Initialized empty Git repository in ~/watchlist/.git/</pre>
<p>
	Git 默认会追踪项目文件夹（或者说代码仓库）里所有文件的变化，但是有些无关紧要的文件不需要记录变化，我们在项目根目录创建一个 .gitignore 文件，在文件中写入忽略文件的规则。因为文件内容比较简单，我们直接在命令使用 nano 来创建：
</p>
<pre>
$ nano .gitignore</pre>
<p>
	在 nano 编辑界面写入常见的可忽略文件规则
</p>
<pre>
*.pyc
*~
__pycache__
.DS_Store</pre>
<p>
	使用 Control + O 和 Enter 键保存，然后按下 Control + X 键退出。在后续章节，对于简单的文件，都会使用 nano 创建，这部分操作你也可以使用编辑器来完成。
</p>
<h2>
	将程序托管到 GitHub（可选）<br />
</h2>
<p>
	这一步是可选的，将程序托管到 GitHub、GitLab 或是 BitBucket 等平台上，可以更方便的备份、协作和部署。这些托管平台作为 Git 服务器，你可以为本地仓库创建远程仓库。
</p>
<p>
	首先要注册一个 GitHub 账户，点击访问<a href="https://github.com/join">注册页面</a>，根据指示完成注册流程。登录备用。
</p>
<h3>
	设置 SSH 密钥<br />
</h3>
<p>
	一般情况下，当推送本地改动到远程仓库时，需要输入用户名和密码。因为传输通常是通过 SSH 加密，所以可以通过设置 SSH 密钥来省去验证账号的步骤。
</p>
<p>
	首先使用下面的命令检查是否已经创建了 SSH 密钥：
</p>
<pre>
$ cat ~/.ssh/id_rsa.pub</pre>
<p>
	如果显示&ldquo;No such file or directory&rdquo;，就使用下面的命令生成 SSH 密钥对，否则复制输出的值备用：
</p>
<pre>
$ ssh-keygen</pre>
<p>
	一路按下 Enter 采用默认值，最后会在用户根目录创建一个 .ssh 文件夹，其中包含两个文件，id_rsa 和 id_rsa.pub，前者是私钥，不能泄露出去，后者是公钥，用于认证身份，就是我们要保存到 GitHub 上的密钥值。再次使用前面提到的命令获得文件内容：
</p>
<pre>
$ cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3Nza...省略 N 个字符...3aph book@greyli</pre>
<p>
	选中并复制输出的内容，访问 GitHub 的&nbsp;<a href="https://github.com/settings/keys">SSH 设置页面</a>（导航栏头像 &#8211; Settings &#8211; SSH and GPG keys），点击 New SSH key 按钮，将复制的内容粘贴到 Key 输入框里，再填一个标题，比如&ldquo;My PC&rdquo;，最后点击&ldquo;Add SSH key&rdquo;按钮保存。
</p>
<h3>
	创建远程仓库<br />
</h3>
<p>
	访问<a href="https://github.com/new">新建仓库页面</a>（导航栏&ldquo;+&rdquo; &#8211; New repository），在&ldquo;Repository name&rdquo;处填写仓库名称，这里填&ldquo;watchlist&rdquo;即可，接着选择仓库类型（公开或私有）等选项，最后点击&ldquo;Create repository&rdquo;按钮创建仓库。
</p>
<p>
	因为我们已经提前创建了本地仓库，所以需要指定仓库的远程仓库地址（如果还没有创建，则可以直接将远程仓库克隆到本地）：
</p>
<pre>
$ git remote add origin git@github.com:greyli/watchlist.git  # 注意更换地址中的用户名</pre>
<p>
	这会为本地仓库关联一个名为&ldquo;origin&rdquo;的远程仓库，<strong>注意将仓库地址中的&ldquo;greyli&rdquo;换成你的 GitHub 用户名</strong>。
</p>
<h2>
	创建虚拟环境<br />
</h2>
<p>
	虚拟环境是独立于 Python 全局环境的 Python 解释器环境，使用它的好处如下：
</p>
<ul>
<li>
		保持全局环境的干净
	</li>
<li>
		指定不同的依赖版本
	</li>
<li>
		方便记录和管理依赖
	</li>
</ul>
<p>
	我们将使用 Pipenv 来创建和管理虚拟环境、以及在虚拟环境中安装和卸载依赖包。它集成了 pip 和 virtualenv，可以替代这两个工具的惯常用法。另外，它还集成了 Pipfile，它是新的依赖记录标准，使用 Pipfile 文件记录项目依赖，使用 Pipfile.lock 文件记录固定版本的依赖列表。这两个文件替代了手动通过 requirements.txt 文件记录依赖的方式。我们首先使用 pip 安装 Pipenv，Windows 系统使用下面的命令：
</p>
<pre>
$ pip install pipenv</pre>
<p>
	Linux 和 macOS 使用下面的命令：
</p>
<pre>
$ sudo -H pip install pipenv</pre>
<p>
	使用 Pipenv 创建虚拟环境非常简单，使用&nbsp;<code>pipenv install</code>&nbsp;命令即可为当前项目创建一个虚拟环境：
</p>
<pre>
$ pipenv install</pre>
<p>
	这个命令执行的过程包含下面的行为：
</p>
<ul>
<li>
		为当前目录创建一个 Python 解释器环境，按照 pip、setuptool、virtualenv 等工具库。
	</li>
<li>
		如果当前目录有 Pipfile 文件或 requirements.txt 文件，那么从中读取依赖列表并安装。
	</li>
<li>
		如果没有发现 Pipfile 文件，就自动创建。
	</li>
</ul>
<p>
	创建虚拟环境后，我们可以使用&nbsp;<code>pipenv shell</code>&nbsp;命令来激活虚拟环境，如下所示：
</p>
<pre>
$ pipenv shell</pre>
<h2>
	安装 Flask<br />
</h2>
<p>
	无论是否已经激活虚拟环境，你都可以使用下面的命令来安装 Flask：
</p>
<pre>
$ pipenv install flask</pre>
<p>
	这会把 Flask 以及相关的一些依赖包安装到对应的虚拟环境，同时 Pipenv 会自动更新依赖文件中。
</p>
<h2>
	本章小结<br />
</h2>
<p>
	当你进行到这里，就意味这我们已经做好学习和开发Flask程序的全部准备了。使用&nbsp;<code>git status</code>&nbsp;命令可以查看当前仓库的文件变动状态：
</p>
<pre>
$ git status</pre>
<p>
	下面让我们将文件改动提交进 Git 仓库，并推送到在 GitHub 上创建的远程仓库：
</p>
<pre>
$ git add .
$ git commit -m &quot;I&#39;m ready!&quot;
$ git push -u origin master # 如果你没有把仓库托管到 GitHub，则跳过这条命令，后面章节亦同</pre>
<p>
	这里最后一行命令添加了&nbsp;<code>-u</code>&nbsp;参数，会将推送的目标仓库和分支设为默认值，后续的推送直接使用&nbsp;<code>git push</code>&nbsp;命令即可。在 GitHub 上，你可以通过&nbsp;<a href="https://github.com/greyli/watchlist">https://github.com/你的用户名/watchlist</a>&nbsp;查看你的仓库内容。
</p>
<p>
	<strong>提示</strong> 你可以在 GitHub 上查看本书示例程序的对应 commit：<a href="https://github.com/greyli/watchlist/commit/1b6fe4ae117c2b964f247d8b12d79753ea69406f" spellcheck="false">1b6fe4a</a>。
</p>
<h2>
	进阶提示<br />
</h2>
<ul>
<li>
		阅读 MDN 的&nbsp;<a href="https://developer.mozilla.org/zh-CN/docs/learn" rel="nofollow">《Web 入门教程》</a>（了解 HTML、CSS、JavaScript）。
	</li>
<li>
		阅读短教程<a href="http://rogerdudler.github.io/git-guide/index.zh.html" rel="nofollow">《Git 简明指南》</a>。
	</li>
<li>
		阅读文章<a href="https://zhuanlan.zhihu.com/p/37581807" rel="nofollow">《Pipenv：新一代Python项目环境与依赖管理工具》</a>或&nbsp;<a href="https://pipenv.readthedocs.io/en/latest/" rel="nofollow">Pipenv 官方文档</a>。
	</li>
<li>
		如果你打算开源你的程序，在项目根目录中添加一个 README.md （自述文件）和 LICENSE （授权声明）是很有必要的。详情可以访问&nbsp;<a href="https://opensource.guide/" rel="nofollow">Open Source Guides</a>&nbsp;了解。
	</li>
<li>
		在安装 Pipenv 时，你也可以使用&nbsp;<code>--user</code>&nbsp;选项进行用户安装（即&nbsp;<code>pip install --user pipenv</code>）。用户安装可以避免破坏全局的包，而且可以避免对不可信的包使用 sudo pip 导致的潜在安全问题。详情见&nbsp;<a href="https://docs.pipenv.org/install/#installing-pipenv" rel="nofollow">Pipenv 文档安装章节</a>。
	</li>
<li>
		本书主页 &amp; 相关资源索引：<a data-editable="true" data-offset-key="eh3t9-1-0" href="http://helloflask.com/tutorial" target="_blank">http://helloflask.com/tutorial</a>。
	</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>https://greyli.com/flask-tutorial-chapter-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>为Git仓库里的.idea文件夹正名</title>
		<link>https://greyli.com/idea-folder-in-git-repository/</link>
		<comments>https://greyli.com/idea-folder-in-git-repository/#respond</comments>
		<pubDate>Thu, 21 Jun 2018 11:19:04 +0000</pubDate>
		<dc:creator><![CDATA[李辉]]></dc:creator>
				<category><![CDATA[计算机与编程]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[JetBrains]]></category>

		<guid isPermaLink="false">http://greyli.com/?p=1476</guid>
		<description><![CDATA[在网络上，我曾多次看到人们对于Git仓库中的.idea文件夹的偏见。最近的一次是在某个博客中技术专家对于志愿者 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>在网络上，我曾多次看到人们对于Git仓库中的.idea文件夹的偏见。最近的一次是在某个博客中技术专家对于志愿者提交的项目的点评，其中在“项目规范”中有一条加分项为“没有 .idea 这种不该上传的文件夹”；另一次是在知乎评价某程序员的问题下某个回答的评论中，有人发现该程序员的GitHub仓库里有.idea目录，就居高临下的将其作为理由讽刺该程序员，潜台词即“项目里有.idea = 水平低下”。想当然的，我没看到的类似情况会更多，而这些观点又会影响很多不熟悉具体事实的人，我想我应该尽一份力来改变这个错误的观点继续蔓延。</p>
<p><em>提示 尽管本文的标题使用了Git，本文的内容同样适用于其他VCS（Version Control System，版本控制系统）。</em></p>
<h2>什么是.idea文件夹</h2>
<p>当你使用JetBrains出品的IDE（Integrated Development Enviroment，集成开发环境）时，比如PyCharm、WebStorm或IntelliJ IDEA等，它们会在创建项目后在项目根目录创建一个.idea文件夹，其中保存了项目特定的配置文件。</p>
<p>至于为什么命名为.idea，则是因为IntelliJ IDEA是JetBrains最早推出的IDE（JetBrains一开始叫IntelliJ），因此使用IDEA作为配置文件夹的名称。按照这个SO回答里<a href="https://stackoverflow.com/a/24180322/5511849">最高票答案</a>的猜测，或许IntelliJ IDEA这个名字的含义是这样组成的：</p>
<ul>
<li>Intelli ===&gt; Intelligent</li>
<li>J ===&gt; Java</li>
<li>Idea ===&gt;IDE that is Advanced or Idea just means idea( I have a good idea &#8230;like this ) &#8230;</li>
</ul>
<h2>是否应该把.idea提交进Git仓库</h2>
<p>这个问题没有唯一的答案，在Stack Overflow有很多类似的讨论。总的来说，开发者可以自由选择是否把IDE相关的配置文件（即.idea目录下的文件）提交到Git仓库中：</p>
<ul>
<li>如果你想让其他使用相同IDE的用户可以更方便（规范）的对项目进行开发，那么就把它提交到Git仓库中。</li>
<li>如果你觉得Git仓库不应该包含和项目本身无关的文件，那么也可以不将它提交到Git仓库中。</li>
</ul>
<h2>正确的提交方法</h2>
<p>当然，<strong>将.idea目录整个提交到Git仓库的行为并不可取</strong>。因为.idea目录下的文件中有包含隐私的内容，比如你的文件操作变动、用户词典、系统环境变量、数据库密码等等，这些文件对项目其他潜在的参与者没有用处，而且会泄露你的隐私。</p>
<p>按照<a href="https://intellij-support.jetbrains.com/hc/en-us/articles/206544839">JetBrains官方的建议</a>，在使用VCS时我们应该遵循下面的原则：</p>
<p>分享下面的文件：</p>
<ul>
<li>除了workspace.xml、usage.statistics.xml和tasks.xml以外.idea目录下的所有文件</li>
<li>所有可以被在不同模块目录下定位到的.iml模块文件（适用于IntelliJ IDEA）</li>
</ul>
<p><strong>谨慎</strong>分享下面的文件<strong>：</strong></p>
<ul>
<li>Android artifacts that produce a signed build，因为它们包含keystore密码（前半句不理解，暂时保留原文）</li>
<li>在IntelliJ IDEA 13 和之前的版本中的dataSources.ids和datasources.xml文件，它们包含数据库密码</li>
</ul>
<p><strong>避免</strong>分享下面的文件：</p>
<ul>
<li>对于使用Gradle或Maven的项目，避免分享.iml和.idea/modules.xml文件，因为它们会在导入时生成</li>
<li>gradle.xml文件</li>
<li>用户字典（dictionaries文件夹）</li>
<li>.idea/libraries目录下的XML文件，因为它们会从Gradle或Maven项目中生成</li>
</ul>
<p>另外，对于旧的项目格式（.ipr/.iml/.iws files）来说：</p>
<ul>
<li>分享项目.ipr文件和所有的.iml模块文件，不要分享.iws文件，因为它存储用户特定设置。</li>
</ul>
<p>对于Git，你可以参考<a href="https://github.com/github/gitignore/blob/master/Global/JetBrains.gitignore">GitHub提供的JetBrains适用的.gitignore模板</a>。</p>
<p><a href="https://zhuanlan.zhihu.com/p/29907260" target="_blank">我的新书</a>中包含<a href="https://zhuanlan.zhihu.com/p/38342129">多个Flask项目</a>，这些项目中的.gitignore文件则是通过<a href="https://www.gitignore.io/">gitignore.io</a>来生成的。你可以在gitignore.io主页的输入框中输入你使用的操作系统、编程语言和IDE，它会快速为你来生成一份适用这些语言和平台的.gitignore规则，比如<a href="https://www.gitignore.io/api/python%2Cpycharm">这个</a>是输入Python+PyCharm生成的模板。你可以在这个模板的基础上添加自定义规则。</p>
<h2>总结</h2>
<p>如果你不想在Git仓库中提交IDE相关的配置文件，那么你可以忽略.idea文件夹；相反，你也可以有选择的把.idea目录下的文件提交进Git仓库。也就是说，<strong>项目Git仓库中是否包含.idea文件夹与程序员的开发水平并没有直接关系。</strong></p>
]]></content:encoded>
			<wfw:commentRss>https://greyli.com/idea-folder-in-git-repository/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
