一、Git 的安装
下载地址:https://git-scm.com/
一直点击下一步
二、Git 的基本命令
1、准备工作
- 访问 GitHub:https://github.com
- 注册或登录您的账号
- 点击右上角的「New Repository」来新建远程仓库
- 进入仓库设置页面填写信息:其中 ① 是你的仓库名,这个仓库名同样会被 GitHub 设置为你的仓 库的根目录的名称;② 是为 .gitignore 设置项目类型, .gitignore 是 Git 仓库中的一个特 殊的文本文件,它里面记录了你不希望提交到仓库的目录和文件的名称或类型,例如你的 /build 目录;把 ① 和 ② 填好之后,就可以点 ③ 来完成远程仓库的创建了
创建完的远程仓库大概长这样:
点击右边的「Clone or download」,然后把仓库的 clone 地址复制到剪贴板:
2、把远程仓库取到本地
鼠标右键,打开 Git Bash Here
进入希望放置项目的目录中,输入下面命令:
git clone 复制的地址
Git 就会把你的远程仓库 clone 到本地。在这个过程中,你可能会需要输入你的 GitHub 用户名和密码。
输入正确的用户名和密码以后,你会看到你的当前目录下多了一个新的子目录,它的名字和刚才新建 的 GitHub 仓库名一致:
进入这个目录,你会发现这里除了你刚才添加的 LICENSE 和 .gitignore 文件外,还有一个叫做 .git 的隐藏目录。
这个 .git 目录,就是你的本地仓库(Local Repository),你的所有版本信息都会存在这里。
而 .git 所在的这个根目录,称为 Git 的工作目录(Working Directory),它保存了你当前从仓库中签 出(checkout)的内容。现在你在项目的目录下输入:
git log
在这里你只能看到一个提交,这个提交是 GitHub 帮你做的,它的内容是创建你的初始 .gitignore 和 LICENSE 这两个文件。
图中第一行中的 commit 右边的那一大串字符(7046e84fd676ff98bba71e14f561d54d6b028f90),是 这个 commit 的 SHA-1 校验和(如果不知道什么是 SHA-1,你可以暂时把它简单理解为这个 commit 的 ID);后面括号里的内容(HEAD -> master ...)稍后再讲;第一行的下面,依次是这个 commit 的作者、提交日期和提交信息,其中提交信息记录了这个提交做了什么,是提交者填写的 (当然,这条提交信息是 GitHub 帮你写的)。
简单看一下这些信息,然后按 q 键退出吧,往下继续。
3、自己创建本地仓库
首先创建项目的目录,进入目录执行下面命令即可创建本地仓库。
git init
4、提交代码
把远程仓库取到本地之后,你就可以开始尝试提交代码了。不过为了方便,你不必真的写代码,你可以在工作目录下创建一个文本文件,例如 test.txt 。
Git 的提交是用的 commit 指令。不过……你现在还不能直接提交。你现在输入:
git status
status 是用来查看工作目录当前状态的指令:
这段文字表述了很多项信息:
- 你在 master branch
- 当前 branch 没有落后于 origin/master
- 你有 untracked files (未追踪的文件),文件名是 shopping list.txt 。
- 你可以使用 git add 来开始追踪文件。
其中前两条你可以暂时先不理,branch 的东西我在后面会讲。
关于后两条,简单说一下: 从上面的信息可以看出,test.txt 这个文件目前属于 "untracked" 状态,它的意思是 Git 仓库对它没有进行任何记录,你在提交的时候不会把它提交上去,查看提交历史也不会看到它。
总之,对于 Git 仓库来说,它是不存在的。
上面的文件还是处于工作区,git add 文件名 后才进入 暂存区。
而你现在想提交这个文件,所以首先,你需要用 add 指令来让 Git 开始跟踪它:
git add test.txt
输入这行代码,Git Bash Here 不会给你反馈信息。但这时你再执行一次 git status ,你会发现显示内容变了:
可以看到,test.txt 的文字变成了绿色,它的前面多了「new file:」的标记,而它的描述也从 "Untracked files" 变成了 "Changes to be commited"。这些都说明一点: shopping list.txt 这个文件的状态从 "untracked"(未跟踪)变成了 "staged"(已暂存),意思是这个文件 中被改动的部分(也就是这整个文件啦)被记录进了 staging area(暂存区)。
解释一下 "stage" 这个词,这个词对我们中国人可能有一些理解难度。按我们英语课本上的内 容来看,stage 是一个名词,它的意思是「舞台」。可是不论从词性还是词义,「舞台」都不 太能解释 "stage" 或 "staging area" 的意思。实质上,Git 中的 stage 取自这个词的另一个意 思:组织和准备某个事件。而 "staging area" 的意思也并不是「舞台区域」,而是「用来汇集 物品或材料以备使用的区域」的意思。 所以 stage 这个词在 Git 里,是「集中收集改动以待提交」的意思;而 staging area ,就是 一个「汇集待提交的文件改动的地方」。简称「暂存」和「暂存区」。至于 staged 表示「已 暂存」,就不用再解释了吧? git add shopping\ list.txt shell Git 原理详解及实用指南。
所谓的 staging area,是 .git 目录下一个叫做 index 的文件(嗯,它的文件名并不叫 stage )。你通过 add 指令暂存的内容,都会被写进这个文件里。 现在文件已经放进了暂存区,就可以提交了。提交的方式是用 commit 指令:
git commit
然后你会进入这样一个界面,这个界面是用来填写提交信息(commit message)的。根据操作系统以及设置的不同,这个界面的编辑器可能是 nano 或者 vi 或者别的什么,总之如果你不会用它,那么 建议你尽快上网搜搜它的用法,因为 Git 的操作会经常用到它。在这里我只简单说一下它的最基本用法:
- 在初始状态下,你是在命令模式,不能编辑这个文件,你需要按一下 "i"(小写)来切换到插入模 式,然后就可以输入你的提交信息了:
在输入完成后别按回车,而是要按 ESC 键返回到命令模式,然后连续输入两个大写的 "Z"(用 Shift 键或 Capslock 键都可以),就保存并退出了。
这样,一次提交就完成了。如上图这样,从界面中你可以看到这次提交的简单信息。这时如果你再执 行一次刚才执行过的 git log (还记得这个指令是什么意思吗?它会列出你的提交历史):
可以看到,你的这条提交被列在了最上面,现在你的提交历史中有两条记录了。这说明,你已经成功 做了一次提交到本地仓库,它已经被保存在了 .git 这个目录里的某个地方了。
5、再次提交
修改 test.txt 里面的部分内容:
赶紧把它提交上去。提交之前先看看文件状态是个好习惯:
Git 原理详解及实用指南 可以看到, test.txt 又变红了,不过这次它左边的文字不是 "New file:" 而是 "modified:",而且上方显示它的状态也不是 "Untracked" 而是 "not staged for commit",意思很明 确:Git 已经认识这个文件了,它不是个新文件,但它有了一些改动。所以虽然状态的显示有点不同, 但处理方式还是一样的:
git add test.txt
这时再 status 一下,就会看到 text.txt 已经 staged ("to be commited") 了:
git status
commit 前,项目在暂存区,commit 后,项目在本地仓库。
好,最后一步, commit :
git commit -m "the first commit"
这时再看看 log ,你已经有三条 commit 了:
6、把提交推送到中央仓库
到现在为止,已经写了两条提交,但它们都还在本地仓库。为了把代码分享出去,你还需要把这些提交上传到中央仓库。如果你现在再看一下 status :
git status
你会看到,Git 提示你的当前 branch 已经领先于( "ahead of" )'origin/master' 两个提交了。就像 上面我说的,branch 这个概念我到后面再讲, origin/master 的中的 origin 是远端仓库的名称, 是你在用 clone 指令初始化本地仓库时 Git 自动帮你起的默认名称; master 是 origin 上的分支 名称。不过对于现在来说,可以暂时把 origin/master 简单理解为「中央仓库」。也就是说,这句 话是告诉你,你的本地仓库已经领先中央仓库两个提交了。这两个提交很明显就是指的刚才那两个关 于 test.txt 的提交。
而这句话的下面也说明了,你可以使用 git push 来把你的本地提交发布(即上传到中央仓库)。所 以很简单,照做吧:
git push
由于这是联网操作,所以在这个过程 GitHub 会再次向你索要账户和密码。填入正确的账户和密码, push 操作就完成了。这时你再去你的 GitHub 仓库页面看一下:
你会发现 test.txt 文件已经在上面了,并且 commits 的数量从一个变成了 3 个。这说明你已经成功把本地仓库的提交推送到了服务器。
如果觉得一遍遍地输入密码很烦,可以按照这个页面 提供的方案来把密码保存起来。 另外还有一个更简单但安全性低一些的方案。执行这行代码:
git config credential.helper store
在这之后你只需要再输入一次密码, Git 就会把你的密码保存下来,这之后就再也不用输入了。说它「安全性低」,是因为这条指令会让 Git 把你的密码以明文形式保存在你的电脑上。 具体这两种保存密码的方案选择哪个,看你自己了。
7、小结
在这一节里,描述了 Git 的最基本的工作模型:
- 从 GitHub 把中央仓库 clone 到本地(使用命令: git clone )
- 把写完的代码提交(先用 git add 文件名 把文件添加到暂存区,再用 git commit 提交)。在这个过程中,可以使用 git status 来随时查看工作目录的状态。每个文件有 "changed / unstaged"(已修改), "staged"(已修改并暂存), "commited"(已提交) 三种状态,以及一种特殊状态 "untracked"(未跟踪)
- 提交一次或多次之后,把本地提交 push 到中央仓库( git push )
下一节将会讲一下在团队开发中会遇到的问题,从而以这种工作模型为基础,延伸到团队开发的基本 工作模型。
但在这之前,强烈建议你先按照这节的内容照做一遍,并尝试理解这一节中所说的工作模型。不然的 话,可能会出现「小册看完了,却还是不知道怎么做」的情况。
# 提交注释写错了, 或者漏了需要提交的文件的时候使用该命令
git commit --amend -m [message]
git branch # 默认列出所有本地分支 # -r 列出所有远程分支 # -a 列出所有分支 # -v 查看最近提交 # -vv 查看与远程追踪关系
git log # --stat 显示变更的文件 # -S [keyword] 根据关键字进行搜索
git push [shortname] [branch]
# --force 强行提交