版本控制的核心是“版本”,Git 是版本控制软件,对应的核心概念就是 提交 。提交一次就是一个版本,而每一次的提交,不管是快照还是(未修改的文件)链接,覆盖的范围都是整个项目。
一次提交操作,具体分两个步骤:
这里延伸出 Git 的基础概念。
被 Git 管理的文件,有三种状态:
分别对应三个区域:
工作区是 在磁盘上可以直接看见的、可以用编辑器直接修改文件 的目录。当文件被修改了,Git 就会把这个文件标记为 已修改。
暂存区实际上只是一个文件,里面存储了从工作区添加的被标记为 已修改 的文件的快照。当文件被添加进暂存区时,Git 就会将这个文件标记为 已暂存。
Git 仓库是 Git 中最重要的部分,存放了每个从暂存区提交的文件快照。当文件从暂存区提交到 Git 仓库时,Git 就会将这个文件标记为 已提交。(Git 的还原操作,实际上就是将保存在仓库中的快照提取出来覆盖到工作区)
了解 Git 的基础概念之后,就不难理解为什么一次提交操作有两个步骤了:首先将修改添加到暂存区,然后再提交进 Git 仓库。
现在可以来说说 添加(Add) 了。
最常用的添加命令,也是人人都会用的,可能就是 git add .
了。在 Git 2.0 以上,git add .
默认等于 git add --all
。这个命令会将当前工作区的所有更改添加进暂存区,这里的“更改”有三种情况:新增文件、修改文件、删除文件。
熟悉 Linux 的小伙伴都知道,.
表示当前目录。相对的,Git 也可以单独添加某个文件或目录,命令是:git add <文件名>
,并且可以使用 *
通配符,比如:git add abc*
。
如果还想要更精细的控制,可以使用交互模式:git add --interactive
。交互模式可以具体控制到某个文件内的代码片段,甚至可以极端到逐行提交。
这种操作在实际开发中也是比较常见的。举个栗子:在一个类中添加了一个新的方法,同时修复了另一个方法中的错误,这时候就可以分开提交。分开提交的目的在于,可以使提交的历史纪录更加清晰,同时能让其他人更早修复错误。还可以排除一些不该提交的修改,比如 为调试而做的实验性修改,或尚未完成的修改。
在以前,fork 是一个贬义词,指的是某个人使开源项目向不同的方向发展,或者创建一个竞争项目,使得原项目的贡献者分裂。
在 GitHub,fork 指的是在你自己空间中创建的项目副本,这个副本允许你以一种更开放的方式对其进行修改。
——《Pro Git》
无论是对开源项目做贡献,还是在自己团队的项目中进行多人协作开发,了解如何正确的 派生(Fork) 并且创建 拉取请求(Pull Request,简称 PR) 都是必不可少的。
一个较为标准的流程为:
现在我们来看看具体的流程有哪些。
无论是著名的 Github,还是 Gitlab,项目主页面都是非常相似的。在项目主页面的右上角,找到 Fork 按钮点击一下,即可在你自己的空间中创建一个项目副本。这即是 派生。
假设用户名是 user
,项目名为 project
。我们接下来将这个项目 克隆(clone) 到本地:
1 | $ git clone git@github.com:user/project.git |
如果你只是想在短期内为项目贡献,这是非必须的步骤。
但如果你打算长期为项目作出贡献,或者你自己就是开发团队的一员,则此步必不可少。
要保持项目为最新的状态,需要先添加一个上游仓库:
1 | # 添加一个名为 upstream 的上游仓库地址 |
现在我们已经添加了一个上游仓库的地址,接下来我们从上游仓库中 抓取(fetch) 最新的内容并 合并(merge) 进本地仓库:
1 | # 从上游仓库抓取最新内容 |
如果没有意外,现在本地仓库已经是最新的内容了。
如果团队中的每个人都在同一个分支上开发,那这个分支将会变得非常混乱。针对某个特性进行修改或修复错误将会变得非常困难,特别是代码审查和错误排查也将变得难以进行。
所以在开发中合理利用 分支(branch) 是非常重要的事情。
首先,检出(checkout) 将要创建新分支的分支,这里自然就是 master 分支:
1 | # 检出 master 分支 |
然后基于当前分支创建一个新分支:
1 | # 创建一个名为 newfeature 的新分支 |
很明显,branch
命令用于创建分支,但是并不会帮我们切换到新分支上面。如果想要切换到新分支,一样是用 checkout
命令。
但是大部分情况下,我们想要的都是:创建并切换到新分支,这有个快捷的方式:
1 | # 创建一个名为 newfeature 的新分支并切换到这个分支上 |
对于分支的命名,也应遵守一些规范,比如:
当我们完成改进,也在新分支提交了一些 commit,接下来就是将改进的代码上传到远程自己的仓库里,然后创建一个 拉取请求 了。
但是在上传之前,为了让原仓库的所有者更方便的审核并测试代码,我们需要对分支进行一些操作。
在我们工作的同时,原仓库也在更新。所以这时候我们应该先更新到最新的代码,保证我们在本地做的工作不会和原仓库发生冲突。
1 | # 从上游仓库抓取最新内容,并将上游仓库的更新合并进本地 master 分支 |
在更新原仓库的内容之后,就是清理我们的 commit。在实际开发中,我们经常会提交一些相似的、细碎的 commit,所以我们在上传代码之前应该先清理一下。
1 | $ git checkout |
现在可以上传我们的改进了。
上传代码之后,我们就可以去自己的仓库页面点击 New pull request 按钮,即可发起一个 拉取请求。
发起之后,就可以等待原仓库的所有者对这个请求进行合并、拒绝或是发表评论了。
本文只是描述如何用较为标准的方式参与一个开源项目。其中使用到的一些东西,比如 **变基(rebase)**,内容太多,讲起来可能会偏离本文的主题,所以并没有过多的说明,未来可能会单独拿出来讲。
最后祝大家没有机会使用到 hotfix 分支😀。
]]>颜文字
(kaomoji)了。使用隐藏的快捷键选择你喜欢的颜文字,在任何应用中输入他们——无需从网站上进行复制粘贴。如果你不熟悉颜文字(kaomoji),它们在日本很流行。不像 emoji 是图像,颜文字更像是传统的、基于文本的表情符号。你可以在不向左倾斜的情况下理解它们,比如 :-) 是一个表情符号,^_^ 是一个颜文字。
这个功能是 Win10 表情符号选择器的一部分。想要打开它,请在任意应用中按 **Win+.**(句号,实测不管中英文状态都可以打开),单击列表顶部的 ;-)
图标来显示颜文字库。
如果没有看见 ;-)
图标,则表示你还没在这台电脑上安装更新。( ´・・)ノ(._.`)
使用列表底部的图标浏览不同类别的颜文字,使用鼠标滚轮或拖动右侧的滚动条来浏览列表。
你也可以完全使用键盘来导航这个界面。Win+. 打开,按两次 Tab 选择顶部图标,按键盘上的右箭头 → 选择颜文字的图标,回车激活,按 Tab 将焦点移动到颜文字库,用方向键选择,最后用回车插入一个颜文字。也可以再次按 Tab 选择底栏,然后使用方向键和回车选择一种类型的颜文字。
现在,你可以在任何应用中快速的插入颜文字了。
( •_•)>⌐■-■
(⌐■_■)
LJason 译
]]>cache:
,Google 缓存过的页面副本将立即打开。Nick Douglas 在 Lifehacker 上写了一篇关于这个的文章,这让我大吃一惊。如果将 Google 设置为默认的搜索引擎,这可以在任何浏览器中使用。有些网站会阻止 Google 进行缓存,除此之外这个方法很有效。
当某些网站关闭时,甚至在某些页面被删掉以后,缓存页面依旧有用。当你打开一个曾经存在过的网页,但是现在遇到 404 错误时,可以试试这个方法,可能会成功的出现曾经的页面。
LJason 译
原文:Quickly Load the Cached Version of Any Website With This URL Trick
]]>这个组合快捷键将重启 Win10 和 Win8 上的图形子系统。在 Win7 上没有重启显卡驱动程序的快捷键。
要重启显卡驱动程序,请按 Win+Ctrl+Shift+B。
屏幕会瞬间变黑,听到“嘟”的一声,然后所有内容重新出现,就像按下快捷键之前。所有的应用程序都会保持打开的状态,不会失去任何工作。
我们甚至在玩游戏的时候尝试了这个快捷键,当按下快捷键后,游戏保持正常运行。这是因为 Windows 只是重启了图形子系统,你的所有应用程序都保持独立,并将继续正常运行。
这个快捷键是 Windows 10 系统的一部分,因此它将重启 NVIDIA、AMD 和 Intel 的显卡驱动程序。无论你的电脑有什么图形硬件,它都可以生效。
这不能保证修复系统卡死,但是这个快捷键可以解决由显卡驱动程序引起的冻屏。这个快捷键可以修复在玩游戏时发生的冻屏,也可以在正常使用中发生的冻屏中恢复。Win10 使用图形硬件来加速绘制桌面,甚至现代的浏览器也使用图形硬件来加速网页渲染速度。
如果你在全屏的游戏中看到黑屏或者无响应,可以试试重启图形显卡驱动,然后再尝试 Ctrl+Alt+Delete。你也可以尝试 Ctrl+Shift+Esc 直接打开任务管理器,或者按 Alt+Tab 或 Win+Tab 切换应用。
如果你的计算机没有响应上述所说的所有快捷键,那即使重启显卡驱动程序后也需要硬关机。所谓“硬关机”,即按住电脑的电源键约 10 秒,直到电脑关机,等待几秒钟后重新按下电源键开机。以这种方式关闭电脑并不好,但如果你的电脑卡死了,那这是你唯一能做的了。
当然,如果你的系统直接蓝屏了,那这个快捷键也于事无补。当蓝屏时,说明系统已经彻底崩溃,唯一能做的就只有重启电脑了。
LJason 译
原文:Secret Windows Hotkey Restarts Your Graphics Card Drivers
]]>一般情况下,多人协作需要至少一台机当做服务器,无论是在本机、局域网或互联网上都可以。Git 服务器一般是由管理员搭建的。我们现在将会在局域网内的一台机器上搭建一个 Git 仓库。
非管理员可以跳过本节,无需设置服务器,直接进行多人协作。
先登陆上要设置仓库的机器,然后添加一个 git 用户,供其他用户访问:
1 | $ sudo adduser git |
为了不用每次都输入密码,以及更高的安全性,可以将要访问的用户的 ssh pub key 放到 /home/git/.ssh/authorized_keys,一个人一行。
想要查看现有的 key,在本地机器(不是服务器)执行 ls -al ~/.ssh
。然后将 authorized_keys 文件或者 .pub 结尾的文件中的内容添加进服务器的 /home/git/.ssh/authorized_keys 中。
如果还没有 pub key,可以新创建一个:
1 | // 替换邮箱 |
创建好之后,就是把 pub key 推送到服务器了。在本地执行:
1 | // 替换服务器地址 |
或者将这个 id_rsa.pub 文件发给管理员添加。
为了安全性,可以限制 git 用户登录 shell。在服务器上,编辑 /etc/passwd
,找到:
1 | git:x:1001:1001:,,,:/home/git:/bin/bash |
改为:
1 | git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell |
在禁用 git 用户登录后,上面的 key 将无法推送,可以在搜集完 key 后再禁用。
在服务器上,进入放仓库的目录:/home/git
,然后初始化一个仓库:
1 | // 自行更换仓库名 |
到这里,一个简单的 Git 仓库就已经设置完成了。
接下来就是激动人心的多人协作了。
现在可以将仓库克隆下来,开始多人协作:
1 | // 自行更改服务器地址以及仓库名 |
这样就克隆了一个空的仓库,然后可以在里面开始工作了。
或者,如果你在本地已有了一个仓库,想要链接这个远程仓库,可以设置:
1 | // 自行更改服务器地址以及仓库名 |
git remote add
命令可以将服务器地址添加到当前的仓库里,便于将现在的仓库推送到服务器,origin
表示远程服务器。
-u origin master
是指定操作时默认的远程分支。
这样本地仓库就链接上远程仓库,并且将所有版本记录都上传上去了。
现在将通过一个不太难的例子来演示多人协作。
有两个人,小明和小红。一起共同开发一个小程序,服务器已经设置好了。
小明将这个仓库克隆下来:
1 | $ git clone git@192.168.2.103:random.git |
将会提示这是一个空仓库,所以小明创建了一个 random.c 文件并开始了编码。
1 |
|
编译一下看看能不能正常运行:
1 | $ gcc -std=c99 random.c |
很好,现在将 random.c 添加到仓库:
1 | $ git add random.c |
然后看看操作的状态是否正确:
1 | $ git status |
有个 a.out 文件,这是一个可执行文件。作为编译生成的文件是不应该存储在版本库中的,所以小明创建一个名为 .gitignore 的文件:
1 | # 可执行文件 |
再将 .gitignore 添加进版本控制里面:
1 | $ git add .gitignore |
再次查看状态,已经没有 a.out 文件了:
1 | $ git status |
接下来就是提交更改了:
1 | git commit -m "最初版" |
将更改提交到仓库后,小明打算上传到服务器上供小红继续开发:
1 | git push |
现在轮到小红克隆这个版本库了:
1 | $ git clone git@192.168.2.103:random.git |
小红想要先看看提交日志,所以她使用了 log
命令:
1 | $ git log |
经过一番检查和调试,小红发现这个随机数生成器从不初始化,每次生成的都是一样的数字。小红进行了一点修改:
1 |
|
进过一番调试,每次生成的都不一样了,可以进行提交了。看看需要什么操作:
1 | $ git status |
git 已经知道 random.c 被修改了。小红想要通过 diff
命令查看更详细的内容:
1 | $ git diff |
现在可以添加、提交并且推送到服务器了:
1 | git add random.c |
小明打算重构一下,所以决定将所有源码文件移动到 src/
目录下:
1 | $ mkdir src |
然后小明决定为项目创建一个 Makefile 和 README 文件:
1 | $ cat Makefile |
然后将这两个文件添加并提交:
1 | $ git add Makefile README |
然后小明决定将 random.c 文件重命名为 rand.c:
1 | git mv src/random.c src/rand.c |
同时,Makefile 也需要更改:
1 | $ git diff |
提交完以后,小明准备推送这些更改到服务器:
1 | $ git push |
推送失败,这是因为小红已经先推送了一个版本。小明需要先将小红推送的内容拉取下来(需要添加提交信息):
1 | $ git pull |
pull
命令是获取服务器上最新的版本,并且会自动与本地的版本合并,并且提交合并。
1 | $ git show |
show
命令是显示当前的提交。看上去像是合并成功了,并且没有任何问题。
小红和小明决定发布这个项目,所以小明创建了一个标签,以便可以更好的访问、引用发布的版本。
1 | $ git tag -a -m "random v0.1" v0.1 |
现在,这个标签仅在小明的本地库中,接下来就是把所有更改全都推送到服务器上:
1 | $ git push origin tag v0.1 |
小红更新仓库以获取 v0.1
标签,并从最新的版本库继续:
1 | $ git pull |
小红现在决定将一个伪随机数生成器的初始化提取到一个单独的方法中,这样初始化和生成随机数都被封装起来,让未来的修改更加容易。添加 init_rand()
:
1 | $ git diff |
与此同时,小明发现 rand()
函数的文档说此方法是一个弱伪随机生成器。所以他决定添加注释:
1 | $ git diff |
这时候,小红也准备推送了,但是被拒绝:
1 | $ git push |
小明已经推送了一个版本,小红必须先 pull
拉取到最新的版本再合并,才可以继续推送:
1 | $ git pull |
这次合并失败了,Git 无法自动合并两人的更改。提示有冲突,所以小红决定在编辑器中打开 src/rand.c 文件来检查:
1 | <<<<<<< HEAD |
Git 同时将小红的代码(*<<<<<<<* 和 *=======* 之间)和小明的代码(*=======* 和 *>>>>>>>* 之间)都包含了。只有两个代码块分开时自动合并才会成功,因为没有分开,所以这次合并失败了。小红的 init_rand()
函数可以在小明的注释之前,所以小红这样更改:
1 | $ git diff |
这样应该就解决完问题了,然后再添加并提交:
1 | $ git add src/rand.c |
push
已经没有任何问题了。
API 是 应用程序接口
(Application Programming Interface)的首字母缩写。
API 就像餐馆里的菜单一样,菜单提供了你在餐馆可以点的菜以及每道菜的描述。当你点了菜以后,餐厅的厨房会做好你点的菜,并把菜端上来。你不知道餐厅是如何制作食物的,而你也并不需要知道。
同样的,API 列出了开发人员可以使用的一系列操作,并说明了这些操作。比如:开发人员并不一定需要知道操作系统是如何进行 “另存为” 操作的,只需要知道如何调用 “另存为” 就行了。
这并不是一个完美的比喻,因为开发人员可能必须向 API 提供他们自己的数据才能获得结果。所以这或许更像是一个高级餐厅,你可以向餐厅提供你自己的配料来制作食物。
大致就是这样,API 允许开发人员利用平台的实现来完成基本工作,从而节省时间。这有助于减少开发人员需要创建的代码量,还有助于在同一平台为应用程序创建更高的一致性。API 还可以控制对硬件和软件资源的访问。
假设你想为 Android 开发应用程序,Google 的 Android 系统提供了大量的 API,就像其他操作系统一样,让你的开发变得更加轻松。
比如:如果你想要嵌入 Web 浏览器以显示一个或多个网页,并不需要为你的应用程序从头开始编写自己的 Web 浏览器。你可以使用 WebView API 在应用程序中嵌入 webkit 对象。
如果你想从相机捕捉照片或视频,则无需编写自己的相机界面,你可以使用相机 API 将 Android 内置的相机嵌入到你的应用程序中。如果不存在这个 API,开发人员将不得不创建自己的相机软件并解析摄像头的输入。但是 Android 系统的开发人员已经完成了这些艰苦的工作,因此开发人员可以使用相机 API 嵌入相机,然后开始构建应用程序。而且,当 Google 改进相机 API 时,所有依赖它的应用程序都会自动利用这一改进。
这适用于每个平台。你想在 Windows 上创建一个对话框?有这个 API ;想在 Android 上支持指纹验证?这也有 API,因此你不必为每个不同的 Android 设备制造商测试指纹传感器。开发人员不必一遍又一遍的重复造轮子。
API 也用于控制对硬件设备和软件功能的访问,应用程序不一样具有使用许可。这就是为什么 API 经常在安全性方面发挥重要作用。
比如,如果你曾今访问过某个网站并在浏览器中看到该网站要求查看你的确切位置的消息,这是该网站正在尝试在你的浏览器中使用地理定位 API。Web 浏览器公开这样的 API,以便 Web 开发人员轻松访问你的位置——他们可以询问 “你在哪?”,浏览器便通过访问 GPS 或附近的 Wi-Fi 网络来查找你的物理位置。
但是,浏览器也会通过 API 公开这些信息,因为可以控制对其的访问。当网站想要访问你的确切位置时,唯一的方法就是通过位置 API 来获取。而且,当一个网站试图使用它时,你——用户——可以选择允许或拒绝这个请求。访问 GPS 传感器等硬件资源唯一的方法便是通过 API,因此浏览器可以控制对硬件的访问并限制应用程序可以执行的操作。
在 iOS 和 Android 等现代移动操作系统中也使用相同的原理,可以通过控制其中的应用程序对 API 的访问来实施权限管理。比如,如果开发人员尝试通过相机 API 访问相机,则可以拒绝权限请求,该应用则无法访问设备的相机。
使用权限的文件系统(如在 Windows、Mac 和 Linux 上执行的权限)具有由文件系统 API 执行的权限。典型的应用程序不能直接访问原始物理硬盘。相反,应用程序必须通过 API 访问文件。
API 也被用于各种途径。比如:经常可以看到嵌入 Google 地图的网站,该网站就是使用 Google 地图 API 实现的。Google 向 Web 开发者公开这样的 API,然后他们可以使用这些 API 在他们网站上实现复杂的对象。如果这样的 API 不存在,开发者可能必须创建他们自己的地图并提供他们自己的地图数据,以便在网站上放置一些交互式地图。
而且,因为这是一个 API,Google 可以控制第三方网站对 Google 地图的访问,确保他们以一致的方式使用它,而不是试图混乱地嵌入显示 Google 地图网站的框架中。
这适用于许多不同的在线服务。有 API 用于请求 Google 翻译,或者在网站上嵌入来自 Twitter 或 Facebook 的评论和推文。
开放授权 还定义了许多 API,允许你使用其他服务登录网站。比如:使用你的 Facebook、Google 或 Twitter 账户登录到新网站,而无需为该网站创建新的用户账户。API 是定义开发人员如何与服务进行通讯的标准协议,以及开发人员期望收到的输出类型。
如果你已经了解了这点,你就会对 API 的内容有更好的了解。最后,除非你是开发人员,否则你并不需要知道 API 是什么。但是,如果你看到软件平台或服务为各种硬件或服务添加了新的 API,开发人员应该会更容易应用这些功能。
LJason 译
]]>我们通过一个简单的例子来学习。
首先在命令行里 cd 进入需要进行版本控制的目录,为了演示,我将新建一个目录,然后进入目录。
输入 git init 进行初始化。
这样就成功的初始化了一个 Git 仓库。
所谓仓库(repository),其实就是一个目录,里面的文件就像一个个物品,当文件更新时,新版本就摆出来,然后把旧版本收起来放在一个专门的地方。
这个地方就是上图中的 .git 目录。Linux 默认是不显示隐藏文件及目录的(在 Linux 中,文件或目录的名字前面加个 . 就是隐藏了),可以执行 ls -a
查看。.git 目录里面保存着文件所有的历史记录。如果把它删了,所有文件的历史记录都将消失,平时没事不要去动它。
我们来看看这个仓库的状态,执行 git status
。
git status
是查看当前仓库状态的命令,可以看见现在还没有任何文件在里面,所以显示无文件要提交。
现在我们在仓库里面创建一个文本文件。我创建了一个 first.txt 文件,内容是 第一版内容
。
再次执行 git status
:
可以看见有 未跟踪的文件。现在执行 git add first.txt
,将 first.txt 文件添加到仓库。
不是说把文件放在仓库(目录)里面就算添加了,而是需要 git add
。这个操作就相当于登记,只有在仓库里面登记了,这个被登记的文件才真正属于这个仓库。
现在我们再次执行 git status
:
可以看见新文件需要提交变更。
如果想提交某个文件夹,直接 git add 目录名
;如果想提交当前目录下的所有文件,可以 git add .
。
提交变更可以使用 git commit
命令,但最好附上一段说明信息,比如:
附上说明信息是一个很好的习惯,当需要还原前面版本的时候可以很容易知道需要还原到哪个版本。
提交完之后,再次修改文件,比如修改成 第二版内容
。
git status
可以看见 first.txt 是修改状态。让我们再次添加修改:git add first.txt
,可以看见红字变绿了,接下来第二次提交。
现在发现第二版写错了,想回到上一版重新写。
可以先看看我们提交了哪些版本:git log
。
git log
是显示仓库的历史记录。上图我们可以看见有一长串的 ID、作者、日期 和提交的 信息。
既然我们需要回到上一版,也就是第一版,就需要用到第一版的 ID。
ID 有 40 位,其实并不用全部打上去,只需要开头 5 位即可。
我们需要用到检出命令:git checkout
。
可以看见只需要第一版开头的 5 位 ID 就可以执行检出了。现在文件的内容变成了 第一版内容
。
如果想要返回最新的那版,可以运行 git checkout master
。
有时候我们不想一些文件加入版本控制,比如在 Windows 系统上生成的临时文件、编译生成的中间文件、日志文件等,这时候就可以使用 .gitignore。
创建一个名为 .gitignore 的文件,里面可以添加比如:
# 忽略日志文件
*.log
# 忽略目录
build/
# 排除目录下特定的文件
test/*.o
.gitignore 文件本身需要添加进版本控制里面。
如果不想自己手动写,GitHub 有各种语言的忽略列表。
拓展阅读:
Git - 重置揭密
sudo apt-get install git
我个人更喜欢从源码安装软件,因为上面无脑装的软件版本可能会比较老旧,从源码安装可以安装到最新版的软件。
如果以前安装过 Git,可以通过 git clone https://github.com/git/git.git
获取最新的源码。
如果没安装过,可以在 https://github.com/git/git/releases 下载到源码的压缩包(tar.gz)。
解压压缩包: tar zxvf git-*.tar.gz
。
安装依赖:
1 | sudo apt-get -y install libcurl4-gnutls-dev libexpat1-dev gettext libz-dev libssl-dev autoconf asciidoc xmlto docbook2x |
然后就开始编译安装了:
1 | cd git-* |
在上面的命令中,**-j4** 表示用 4 个线程编译,如果你的 CPU 是 四核八线程,建议使用 -j8。
首先配置用户名和邮箱:
1 | git config --global user.name "your name" |
如果你所在的环境需要通过代理来联网,可以这样设置:
1 | # http |
按照情况设置即可,取消代理是:
1 | git config --global --unset http.proxy |
以前,我做开发的时候,每做完一个功能或者一个阶段,就会备份一次。当时间长了,就会变成这样:
浪费空间不说,当想要回到某个版本的时候,就得一个一个打开看看,特别费时费力。
所以我就到处找方法解决这个难题,皇天不负苦心人,终于还是被我找到了解决方法,那就是 版本控制。
你可以把一个版本控制系统(缩写 VCS)理解为一个“数据库”,在需要的时候,它可以帮你完整地保存一个项目的快照。当你需要查看一个之前的快照(称之为“版本”)时,版本控制系统可以显示出当前版本与上一个版本之间的所有改动的细节。
这种是只在本地计算机上存储所有文件。
随着需求不断提高,本地版本控制系统的缺点越来越明显:无法多人开发。因为文件都存储在某一个人的计算机中,他人无法访问。
集中式版本控制系统应运而生。
当人们想编辑一个或多个文件时,只有最后一个文件被检索。这种设置不仅可以为需要这些文件的人提供文件访问权限,而且还可以提供他人的工作信息。
由于文件存储在一个单独的位置,每个人都需要共享这些文件,因此对文件所做的任何更改都会自动的与他人共享。
当然,集中式版本控制系统也有缺点:当服务器故障时,所有人都将无法工作。
现在面临着一个尴尬的局面:
如果将两个系统合并在一起呢?分布式版本控制系统诞生了。
分布式版本控制系统具有本地版本控制系统的优点:
同时也有集中式版本控制系统的优点:
分布式版本控制系统被设计成可用两种方式工作。它在本地存储每台机器上的文件和每个历史,并且在需要时将用户在本地所做的更改同步回服务器。这样便可以与他人共享这些更改以达到团队协作的目的。
现在我们了解了版本控制系统有哪些类型,现在有很多版本控制系统,该如何选择呢?
Git 是一个相对比较新的软件,因此避免了许多其他版本控制系统的缺陷。
相较于其他版本控制系统,即使处理数百万个文件,使用 Git 执行的操作也只需几秒钟即可完成。其中的一个主要原因是 Git 处理文件的方式不同。
从概念上讲,大多数版本控制系统(CVS,Subversion等等)将数据视为一组文件,随着版本的增多而对其中的每一个进行更改。
相比之下,Git 则为文件快照,即整个文件的内容,而不是每个文件的版本之间的差异。每创建一个版本,都会创建一整个快照,但这并不会存储重复的文件:如果文件没有更改,则只保存文件的链接。这大大加快了 Git 处理的速度。
与其他版本控制系统相比,Git 尽可能的减少存储空间的浪费,同时又极大提高了处理的速度。
]]>首先把系统升级到最新:
1 | sudo apt -y update |
如果你用的是最新的官方 Raspbian 系统,那直接安装即可,其他版本及其他系统,参阅 To install Weaved to your ARM Debian system ,现在执行:
1 | sudo apt -y install weavedconnectd |
安装完执行 sudo weavedinstaller 来启动交互式安装程序。初始化之后将会看见:
如果没有账号,选择 2 ,输入邮箱之后会给你的邮箱发送一个验证码,然后选择 3 输入验证码,然后输入两次密码即可创建一个新账户。
如果已经有账号了,选择 1 输入邮箱,然后输入密码即可。第一次登录会让你输入一个设备名:
完了以后就进入主菜单了:
这里选择 1,然后进入协议选择菜单:
这里选择要连接的服务,1 - 3 都是常用的服务,4 是自定义服务。这里选择 1,
选完会提示你是否要使用 SSH 服务的默认端口(默认为 22)。如果没更改 SSH 的端口,选 Y 即可,自行选择。
给服务一个名字即可。最后又回到主菜单,在主菜单上面有已经安装的服务:
如果还想添加可以继续添加,添加完了选 4 退出即可。在树莓派上已经配置完了,现在看看怎么使用。
在 https://www.remot3.it/app/index.html 登录刚刚注册的账号,在左侧点击 Manage Devices ,即可看见刚刚配置的树莓派。点击设备名,再点击下面的服务名,提示 Press Confirm to connect 'Pi-SSH'
,点击 Confirm。
可以使用域名和端口进行登录,也可以直接使用下方的命令在终端里登录。
如果是 Web 服务,将会直接打开网页。
打开 https://dataplicity.com/ ,输入邮箱点击 Start ,把下方出现的一行命令复制粘贴进树莓派里面执行。执行期间可以上你的邮箱去验证账户。树莓派执行完回到页面点击 Done 。然后就连上树莓派了。。。 _(:зゝ∠)_
]]>lsusb
,然后插上 USB 再执行一遍,确定第二次多出来的设备就是新插上的 Android 设备。然后运行:
1 | cd /etc/udev/rules.d |
在里面写上刚刚的设备 ID :
1 | SUBSYSTEM=="usb", ATTRS{idVendor}=="18d1",ATTRS{idProduct}=="4ee7",MODE="0666" |
然后运行:
1 | sudo systemctl restart udev.service |
重新插拔即可看见新设备了,在 Android Studio 里面也可以看见了。
]]>3D 对象
文件夹添加到了 此电脑 里,甚至出现在了文件资源管理器的侧栏中。微软显然正在努力推广 Paint 3D 和 Windows 10 的其他新功能,但如果你不喜欢它,可以隐藏该文件夹,只需要修改注册表。 这不会在你的电脑上删除该文件夹,3D 对象
文件夹仍然在 C:\Users\NAME\3D Objects
,其中 NAME 是你的 Windows 账户名称。这仅仅是把它从文件资源管理器的侧栏中删除了它。
你也可以从 此电脑 中删除其他文件夹,但我们认为其他文件夹非常有用。只是 3D 对象
文件夹可能对大多数人都没有用。
3D 对象
你必须编辑注册表才能执行此操作。这是我们正式的警告:注册表编辑器是一个强大的工具,滥用它可能会使你的系统不稳定甚至无法使用! 这篇文章是非常简单的教程,只要你严格按照步骤做就应该不会有任何问题。也就是说,如果以前从未使用过它,请考虑在使用前阅读有关注册表编辑器的相关知识。在开始编辑之前,请备份好你的注册表(和系统)。
通过单击开始,键入 “regedit” 并按回车键打开注册表编辑器。给予权限以更改电脑。
首先,转到以下路径,可以复制路径粘贴到地址栏或者手动导航:
1 | 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace |
在左边窗口中的 NameSpace 下找到 {0DB7E03F-FC29-4DC6-9020-FF41B59E513A} 子项,右键删除即可。
然后,转到以下路径,可以复制路径粘贴到地址栏或者手动导航:
1 | 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace |
如果你的电脑上没有 WOW6432Node 键,则使用的是 32 位的系统,以下内容不用做。如果有这个键,则使用的是 64 位的系统,可以继续看下去。
再次在左边窗口中的 NameSpace 下找到 {0DB7E03F-FC29-4DC6-9020-FF41B59E513A} 子项,右键删除。
你现在已经把 3D 对象
从此电脑和文件管理器侧边栏删除了。不必重启电脑,但是如果 3D 对象
没有消失,则请重启电脑。
如果想要还原,只需要在相同的位置创建 {0DB7E03F-FC29-4DC6-9020-FF41B59E513A} 子项即可。
如果你不想自己编辑注册表,可以下载注册表脚本一键删除。我们创建了删除该文件夹并恢复的脚本,有 64 位和 32 位的版本。
只需下载对应的脚本并双击导入即可。
LJason 译
]]>1 | docker run -d --restart always --name zeronet -e "ENABLE_TOR=true" -v ~/Documents/ZeroNet/data:/root/data -p 15441:15441 -p 43110:43110 nofish/zeronet |
下载并解压 ZeroNet:
1 | cd <YouPath> |
安装依赖:
1 | sudo apt-get -y update && sudo apt-get -y upgrade && sudo apt-get -y dist-upgrade && sudo apt-get -y autoremove |
安装Tor:
1 | sudo sh -c 'echo "deb http://deb.torproject.org/torproject.org $(lsb_release -cs) main" >> /etc/apt/sources.list.d/tor.list' |
编辑 /etc/tor/torrc,在57行左右去掉“ControlPort 9051”和“CookieAuthentication 1”的注释。然后重启 Tor:
1 | /etc/init.d/tor restart |
如果在本机运行,直接运行:
1 | python zeronet.py |
然后打开 http://127.0.0.1:43110 。
如果是在服务器搭建,运行:
1 | python zeronet.py --ui_ip 0.0.0.0 |
然后打开 http://ip:43110
下载 ZeroNet-win-dist.zip 解压,运行 ZeroNet.exe。
推荐些站点:
]]>同样的,需要在 官网 下载在线安装包 vs_community.exe 。
然后在命令行里面运行:
1 | D:\vs_community.exe --layout "E:\VS2017" --lang zh-CN |
这样即可下载中文全部功能的离线包,--layout
是路径,--lang
是语言。如果不需要全部功能或者只需要某个特定功能(或者多语言),只需要使用 --add
命令即可,比如:
1 | D:\vs_community.exe --layout "E:\VS2017" --add Microsoft.VisualStudio.Workload.ManagedDesktop --add Microsoft.VisualStudio.Workload.NetWeb --lang zh-CN de-DE ja-JP |
具体命令行参数可以去 使用命令行参数安装 Visual Studio 2017 查看,这里给出各个工作组的代码:
Microsoft.VisualStudio.Workload.CoreEditor
Visual Studio 核心编辑器(Visual Studio Community 2017 内置)
Visual Studio 核心 shell 体验,包括语法感知代码编辑,源代码控制和工作项管理。
Microsoft.VisualStudio.Workload.Azure
Azure 开发
用于开发云应用程序和创建资源的 Azure SDK、工具和项目。
Microsoft.VisualStudio.Workload.Data
数据存储和处理
使用 SQL Server、Azure Data Lake、Hadoop 或 Azure ML 连接、开发和测试数据解决方案。
Microsoft.VisualStudio.Workload.DataScience
数据科学与分析应用
用于创建数据科学应用程序的语言和工具,包括 Python、R和F#。
Microsoft.VisualStudio.Workload.ManagedDesktop
.NET桌面开发
使用 .NET Framework 构建 WPF,Windows Forms 和控制台应用程序。
Microsoft.VisualStudio.Workload.ManagedGame
Unity 游戏开发
使用 Unity 创建 2D 和 3D 游戏,这是一个强大的跨平台开发环境。
Microsoft.VisualStudio.Workload.NativeCrossPlat
用 C++ 开发 Linux
创建和调试在 Linux 环境中运行的应用程序。
Microsoft.VisualStudio.Workload.NativeDesktop
用 C++ 开发桌面程序
使用 Visual C++ 工具集、ATL和可选功能(如 MFC 和 C++ / CLI)构建经典的基于 Windows 的应用程序。
Microsoft.VisualStudio.Workload.NativeGame
用 C++ 开发游戏
使用 C++ 的全部功能构建由 DirectX、Unreal 或 Cocos2d 驱动的专业游戏。
Microsoft.VisualStudio.Workload.NativeMobile
用 C++ 进行移动开发
使用 C++ 构建 iOS、Android 或 Windows 的跨平台应用程序。
Microsoft.VisualStudio.Workload.NetCoreTools
.NET Core 跨平台开发
使用 .NET Core、ASP.NET Core、HTML、JavaScript 和 CSS 构建跨平台应用程序。
Microsoft.VisualStudio.Workload.NetCrossPlat
使用 .NET 进行移动开发
使用 Xamarin 构建适用于 iOS、Android 或 Windows 的跨平台应用程序。
Microsoft.VisualStudio.Workload.NetWeb
ASP.NET 和 Web 开发
使用 ASP.NET、ASP.NET Core、HTML、JavaScript 和 CSS 构建 Web 应用程序。
Microsoft.VisualStudio.Workload.Node
Node.js 开发
使用 Node.js 构建可扩展的网络应用程序,即异步事件驱动的 JavaScript Runtime。
Microsoft.VisualStudio.Workload.Office
Office / SharePoint 开发
使用 C#、VB 和 JavaScript 创建 Office 和 SharePoint 加载项、SharePoint 解决方案和 VSTO 加载项。
Microsoft.VisualStudio.Workload.Python
Python 开发
Python 的编辑、调试、交互式开发和源代码控制。
Microsoft.VisualStudio.Workload.Universal
通用 Windows 平台开发
使用 C#、VB、JavaScript 或可选的 C++ 创建通用 Windows 平台的应用程序。
Microsoft.VisualStudio.Workload.VisualStudioExtension
Visual Studio 扩展开发
为 Visual Studio 创建附加组件和扩展,包括新命令、代码分析器和工具窗口。
Microsoft.VisualStudio.Workload.WebCrossPlat
使用 JavaScript 进行移动开发
使用 Apache Cordova 的工具构建 Android、iOS 和 UWP 应用程序。
无关联组件
这些是不在任何工作组中的组件,但可以选择为单独组件。
Component.Android.Emulator
适用于 Android 的 Visual Studio 模拟器Component.GitHub.VisualStudio
GitHub 扩展Microsoft.Component.Blend.SDK.WPF
Blend for Visual Studio SDK for .NETMicrosoft.Component.HelpViewer
Help ViewerMicrosoft.Net.Component.3.5.DeveloperTools
.NET Framework 3.5 开发工具Microsoft.VisualStudio.Component.DependencyValidation.Community
Dependency ValidationMicrosoft.VisualStudio.Component.LinqToSql
LINQ to SQL toolsMicrosoft.VisualStudio.Component.Phone.Emulator
Windows 10 Mobile 模拟器(周年纪念版)Microsoft.VisualStudio.Component.TestTools.Core
Testing tools core featuresMicrosoft.VisualStudio.Component.TypeScript.2.0
TypeScript 2.0 SDKMicrosoft.VisualStudio.Component.TypeScript.2.1
TypeScript 2.1 SDK具体各个工作组包含的组件可以查看 Visual Studio Community 2017 工作负载和组件 ID。
当我写完才发现原来是有中文版页面的 (╯‵□′)╯︵┻━┻ ,算了不改了。
等下载完就该安装了,继续在命令行里执行:
1 | E:\VS2017\vs_community.exe --add Microsoft.VisualStudio.Workload.ManagedDesktop --add Microsoft.VisualStudio.Workload.NetWeb --includeOptional |
这里要注意exe的路径是上面 --layout
路径里面的,中间的参数和上面创建离线包时的一样,后面加上 --includeOptional
即可。安装过程中也可以通过图形界面手动选择安装的选项。
第一步还是安装 gcc:
1 | apt-get install gcc g++ |
安装 node,上一篇有讲,这里就不说了。
我写了个自动更新 node 的脚本,如果要用这个脚本还得先安装 jq:
1 | apt-get install -y libonig-dev |
接下来把脚本保存为 AutoUpdateNode.sh
:
1 |
|
给脚本添加可执行权限:
1 | chmod +x /mnt/storage/home/script/AutoUpdateNode.sh |
添加定时更新,执行:
1 | crontab -e |
添加一行:
1 | 0 6 * * * /mnt/storage/home/script/AutoUpdateNode.sh |
1 | npm install -g hexo-cli |
新建一个博客:
1 | hexo init myBlog |
这样就新建好一个博客了,可以在 source
的 _posts
文件夹里面添加文章,用 markdown 写。
等添加完就可以生成静态网页了:
1 | hexo g |
有时候会出现一些奇奇怪怪的问题,就在生成静态页面之前删除之前的缓存即可:
1 | hexo cl |
写完博客玩魂2啦٩(๑>◡<๑)۶
]]>Windows 10 的周年更新为开发人员提供了一个巨大的新功能:一个完整的、基于 Ubuntu 的 Bash Shell,可以直接在 Windows 上运行 Linux 软件。这是微软通过添加新的 “Windows Subsystem for Linux”(Windows 的 Linux 子系统,下文简称 WSL) 实现的。
这不是虚拟机、容器或为 Windows 编译的 Linux 软件(像 Cygwin)。恰恰相反,Windows 10 获得了一个 Linux 子系统,它基于早已被微软遗弃的在 Windows 上运行 Android 应用的 Astoria 项目。
这可以认为和 Wine 相反。Wine 允许直接在 Linux 系统上运行 Windows 应用,WSL 可以在 Windows 上运行 Linux 应用。
微软已经和 Canonical 公司合作,致力于打造一个完整的、基于 Ubuntu 的、运行在这个子系统顶层的 Bash Shell。从技术层面上讲这完全不是 Linux。Linux 是底层操作系统内核,这在这里是不适用的。但是它运行的 Bash Shell 和二进制文件与 Ubuntu 上运行的完全相同。纯粹的自由软件主义者认为,一般的 Linux 操作系统应该被称为 “GNU/Linux”,因为它真的是有很多 GNU 软件在 Linux 内核上运行。你得到的 Bash Shell 只是 GNU 工具和其他软件而已。
但是这里有一些限制:无法运行服务器软件、不能运行带图形界面的软件,它只适用于想在 Windows 上运行 Linux 命令的程序猿。这些应用程序可以访问 Windows 文件系统,但不能使用 Bash 命令来自动化正常的 Windows 程序,或从标准的 Windows 命令来启动 Bash 命令。仅仅是可以访问相同的 Windows 文件系统,仅此而已。不是每个命令行程序都可以正常工作,因为 WSL 仍处在测试阶段。
在这之前,请确保已经安装 Windows 10 周年版或者更新。这里只适用于 64位的 Windows 系统,如果您仍使用32位的系统,那是时候用64位的 Windows 10 系统了。
当确定使用的是正确的 Win10 版本后,打开 “应用”,然后转到 “更新和安全” > “针对开发人员”,在这里选择 “开发人员模式”。
接下来打卡控制面板,单击 “程序”,然后单击 “程序和功能” 下的 “打开或关闭 Windows 功能”。在列表中勾选 “适用于 Linux 的 Windows 子系统(Beta)”,然后单击 “确定”。
完成后系统会提示您重启计算机,单击 “立即重新启动”,Windows 10 将会安装新功能。
重启计算机之后,单击开始按钮(或按 Win 键),输入 “bash” 后回车。
当您第一次运行 bash.exe 文件时,系统将提示您接受服务条款,然后该命令将从 Windows 应用商店下载 “Bash on Ubuntu on Windows” 程序。之后系统会要求您创建用于在 Bash 环境中使用的用户账户和密码(注:不是 Windows 系统的账号密码)。
如果您想要自动化安装 Bash,可以在命令提示符窗口运行以下命令。这将自动同意所有提示,并且将默认用户设置为 “root”,不使用密码:
1 | lxrun /install /y |
你现在有一个完整的基于 Ubuntu 的 Bash shell 了。由于它和 Ubuntu 使用的是相同的二进制文件,所以您可以使用 Ubuntu 的 “apt-get” 命令从 Ubuntu 的软件源安装软件。您可以运行 Linux 所有的命令,虽然不是每个命令都可以正常运行——特别是最初的测试版本。
要打开 Bash shell,只需要在你的开始菜单搜索 “bash” 或 “Ubuntu”。你会看到一个 “Bash on Ubuntu on Windows” 的程序(注:由于旧版中文的 Win10 系统会将英文的符号 “.” 换成 “。”,所以原本的快捷方式就失效了。可以去 “C:\Users\用户名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs” 中手动将 “Windows 中的 Bash on Ubuntu。lnk” 重命名 “Windows 中的 Bash on Ubuntu.lnk” ,回车即可看见白色的未知图标变成了 Ubuntu,创意者更新则没有此问题)。您可以将此快捷方式固定到您的开始菜单、任务栏或者桌面,以方便访问。
如果你有在 Linux、Mac OS 或其他平台使用 Bash shell 的经验,你就会用的得心应手。你不需要使用 “sudo” 了,因为你已经是 root 用户了。在 UNIX 平台上,“root” 用户具有绝对的系统访问权限,就像 Windows 上的 “Administrator” 用户一样。在 Bash shell 环境中您的 Windows 文件系统位于 /mnt/c 中。
它和 Linux 终端的用法一样,如果你熟悉标准 Windows 的 DOS 命令,这里有一下相似的基本命令:
有个很重要的需要记住,WSL 不像 Windows ,Bash Shell 和 它的 Linux 环境是区分大小写的。换句话说,大写字母开头的 “File.txt” 和 小写开头的 “file.txt” 是两个不同的文件。
更多相关说明请参阅我们的 Linux 命令初级指南 和其他类似介绍 Bash Shell、Ubuntu 命令和 Linux 终端的资料。
你需要使用 apt-get 命令来安装和更新 Ubuntu 环境,并确保在这些命令前加上 “sudo”,这个命令可以使它以 root 用户的身份运行——就像 Windows 的 Administrator。这里有一些需要知道的:
下载并安装应用程序后,可以在提示符处键入其名称,然后按 Enter 运行。检查特定应用程序的文档以获取更多详细信息。
如果想在 Win10 上获得更爽的 Ubuntu 体验,还可以安装 Ubuntu 字体并在终端中启用它们。
从 Ubuntu 的网站 上下载 Ubuntu 系列字体。打开下载的 zip 文件,找到 UbuntuMono-R.ttf 文件,这个是 Ubuntu 等宽字体,终端中使用的唯一一种字体,也是唯一需要安装的字体。
双击 UbuntuMono-R.ttf 文件,您将看到该字体的预览,单击 “安装” 将其安装在系统上。
要使 Ubuntu 等宽字体成为控制台中的一个选项,您需要向Windows注册表添加一个设置:
Win + R 打开注册表编辑器,键入 regedit,然后按回车,导航到以下项:
1 | HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console\TrueTypeFont |
右键单击右窗格并选择新建 > 字符串值,命名为 000。
双击刚刚创建的 000 字符串,并输入 Ubuntu Mono 作为其值数据。
记住,安装在 Bash shell 中的软件仅限于 Bash shell。您无法从命令提示符,PowerShell 或 Windows 中的其他位置访问它。Bash shell 中的软件也不能与 Windows 程序直接交互或启动,尽管 Bash 环境和 Windows 可以访问您计算机上相同的文件。
但是,您可以创建 Bash shell 脚本(.sh脚本)并使用 Bash shell 运行它们。
LJason 译
原文:How to Install and Use the Linux Bash Shell on Windows 10
]]> 1. 将下载的 IntelliJ IDEA 压缩文件解压到你希望安装的位置,下面会把这个位置称为 {installation home}
。
2. 在命令行中 cd 到 {installation home}/bin
,执行以下命令来启动程序:
1 | ./idea.sh |
这将在 ~/.IntelliJIdeaXXXX.X
文件夹中初始化配置文件。
3. [可选] 将 {installation home}/bin
添加到 PATH
环境变量,以便可以从任意目录启动 IntelliJ IDEA。
4. [可选] 要调整 JVN 堆大小的值,请创建 ~/.IntelliJIdeaXXXX.X/idea.vmoptions
(如果使用 64位 JDK,则创建 idea64.vmoptions
),并且设置 -Xms
和 -Xmx
参数。具体可以参考 {installation home}/bin
目录中的 vmoptions
文件作为模板。
config
和 system
目录的位置 默认情况下,IntelliJ IDEA 会将所有设置存储到 ~/.IntelliJIdeaXXXX.X/config
目录下,并使用 ~/.IntelliJIdeaXXXX.X/system
作为数据缓存。如果要更改这些设置:
1. 在命令行 cd 到 ~/.IntelliJIdeaXXXX.X/
。
2. 创建 idea.properties
文件并在编辑器中打开。根据需要设置 idea.system.path
或者 idea.config.path
的变量,例如:
1 | idea.system.path=~/custom/system |
3. 请注意,建议将数据缓存(system
目录)存储在至少有 1GB 可用空间的磁盘上。
作为编程语言的入门第一课,自然缺不了 Hello World 了。
新建一个工程,默认是新建一个 .cpp
文件。可以新建文件,也可以直接重命名为 .c
。写上:
1 |
|
这是最简单的一个C语言程序,将会在屏幕上打印一行:
1 | Hello World |
接下来就来说说这个最简单的C语言的结构。
程序第一行的 stdio.h 是关于标准输入输出的头文件,C语言为文件输入输出提供了许多标准库函数,正是这些库函数构成了C标准库头文件 stdio.h 的主体,一般的C程序都离不开这个头文件。#include
语句表示包含头文件,有两种写法。分别是使用双引号 " "
和使用尖括号 < >
。这两者是有区别的,主要是使用时头文件的搜索顺序不同。
使用双引号 " "
时头文件的搜索顺序:
使用尖括号 < >
时头文件的搜索顺序:
一般情况下,当我们需要包含系统自带的C标准库头文件时,两个都可以使用;但是当我们需要包含用户自己写的头文件的时候,就必须使用双引号 " "
了。所以,如果能够区分系统和用户的头文件,就各自用;当不能够区分时,用双引号 " "
也肯定不会错。
注意: #include
是将已存在文件的内容嵌入到当前文件中。
main 表示主函数,所有的C程序都是由一个或多个函数构成,其中必须且只能有一个主函数 main。程序从主函数开始执行,相当于程序的入口,当执行到调用函数的语句时,程序将控制转移到调用函数中执行,执行结束后再返回主函数中继续运行,直至程序执行结束。
在函数后面的花括号 { }
里面的内容就是函数体,在上面的例子中,printf("Hello World");
就是函数体。
printf 函数是一个由系统定义的标准函数,可在程序中直接调用。printf 函数的功能是把要输出的内容(上面是Hello world!)打印出来。
为了美观,C语言一般都是一个语句一行,语句最后必须跟一个分号 ;
,表示该语句的结束。分号称为终结符,单独一个分号也可构成一个语句,这就是空语句。如果不加分号,现代的IDE会马上提示错误无法编译。
行注释
在符号 //
后的那一行不会被编译。
块注释
被块注释符号 / * 任意内容 * /
中间的部分不会被编译。
程序中表示对程序的说明(注释),可以方便程序的阅读。注释不参与程序的编译和运行,它可以加在程序的任何位置,注释文字可以是任意字符,如汉字、拼音、英文等。