
刚进入新公司被告知团队是用 Git 管理项目代码的而你却从来没用过 Git。纵然同事告诉你「没事先自学一下」「有问题可以问我」但你肯定不想一进公司就花太多时间在自我学习上也不想过多地打扰这些刚认识的同事。怎么办对你来说最重要的是先知道 Git 怎么用。先把最基本的掌握了至于正规团队使用 Git 有什么额外要求、Git 有什么高级用法、Git 的原理这些都可以放在这之后。万事开头难你先把 Git 最基本的使用掌握了后面的再一步一步来。先建个练习项目学习的时候最好别拿团队的正式项目练手先在 GitHub 上建一个自己的练习项目。访问 GitHub用别的平台比如 Bitbucket 什么的也行注册或登录您的账号点击右上角的「New Repository」来新建远程仓库进入仓库设置页面填写信息其中 ① 是你的仓库名这个仓库名同样会被 GitHub 设置为你的仓库的根目录的名称② 是为.gitignore设置项目类型.gitignore是 Git 仓库中的一个特殊的文本文件它里面记录了你不希望提交到仓库的目录和文件的名称或类型例如你的/build目录把 ① 和 ② 填好之后就可以点 ③ 来完成远程仓库的创建了创建完的远程仓库大概长这样点击右边的「Clone or download」然后把仓库的clone地址复制到剪贴板把远程仓库取到本地接下来就可以把远程仓库取下来了。取的方式很简单在 Terminal 或 cmd 中切换到你希望放置项目的目录中然后输入git clone 你刚复制的地址Git 就会把你的远程仓库 clone 到本地。在这个过程中你可能会需要输入你的 GitHub 用户名和密码输入正确的用户名和密码以后你会看到你的当前目录下多了一个新的子目录它的名字和刚才新建的 GitHub 仓库名一致进入这个目录你会发现这里除了你刚才添加的LICENSE和.gitignore文件外还有一个叫做.git的隐藏目录。这个.git目录就是你的本地仓库Local Repository你的所有版本信息都会存在这里。而.git所在的这个根目录称为 Git 的工作目录Working Directory它保存了你当前从仓库中签出checkout的内容。现在你在项目的目录下输入git log在这里你只能看到一个提交这个提交是 GitHub 帮你做的它的内容是创建你的初始.gitignore和LICENSE这两个文件。图中第一行中的commit右边的那一大串字符09773235…21411是这个commit的 SHA-1 校验和如果不知道什么是 SHA-1你可以暂时把它简单理解为这个commit的 ID后面括号里的内容HEAD - master ...稍后再讲第一行的下面依次是这个commit的作者、提交日期和提交信息其中提交信息记录了这个提交做了什么是提交者填写的当然这条提交信息是 GitHub 帮你写的。简单看一下这些信息然后按q键退出吧往下继续。写个提交试试把远程仓库取到本地之后你就可以开始尝试提交代码了。不过为了方便你不必真的写代码你可以在工作目录下创建一个文本文件例如shopping list.txt。Git 的提交是用的commit指令。不过……你现在还不能直接提交。你现在在 Terminal 输入git statusstatus是用来查看工作目录当前状态的指令这段文字表述了很多项信息你在masterbranch当前 branch 没有落后于origin/master你有 untracked files 未追踪的文件文件名是shopping list.txt。你可以使用git add来开始追踪文件。其中前两条你可以暂时先不理branch 的东西我在后面会讲。关于后两条简单说一下从上面的信息可以看出shopping list.txt这个文件目前属于 untracked 状态它的意思是 Git 仓库对它没有进行任何记录你在提交的时候不会把它提交上去查看提交历史也不会看到它。总之对于 Git 仓库来说它是不存在的。而你现在想提交这个文件所以首先你需要用add指令来让 Git 开始跟踪它git add shopping\ list.txt输入这行代码Terminal 不会给你反馈信息。但这时你再执行一次git status你会发现显示内容变了可以看到shopping list.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 表示「已暂存」就不用再解释了吧所谓的 staging area是.git目录下一个叫做index的文件嗯它的文件名并不叫stage。你通过add指令暂存的内容都会被写进这个文件里。现在文件已经放进了暂存区就可以提交了。提交的方式是用commit指令git commit然后你会进入这样一个界面这个界面是用来填写提交信息commit message的。根据操作系统以及设置的不同这个界面的编辑器可能是 nano 或者 vi 或者别的什么总之如果你不会用它那么建议你尽快上网搜搜它的用法因为 Git 的操作会经常用到它。在这里我只简单说一下它的最基本用法在初始状态下你是在命令模式不能编辑这个文件你需要按一下 i小写来切换到插入模式然后就可以输入你的提交信息了在输入完成后别按回车而是要按 ESC 键返回到命令模式然后连续输入两个大写的 Z用 Shift 键或 Capslock 键都可以就保存并退出了。这样一次提交就完成了。如上图这样从界面中你可以看到这次提交的简单信息。这时如果你再执行一次刚才执行过的git log还记得这个指令是什么意思吗它会列出你的提交历史git log可以看到你的这条提交被列在了最上面现在你的提交历史中有两条记录了。这说明你已经成功做了一次提交到本地仓库它已经被保存在了.git这个目录里的某个地方了。再来个提交想来想去我还是觉得把「女装」列在购物清单有点太羞耻了所以还是把它删掉吧嗯删掉以后脸不烫了赶紧把它提交上去。提交之前先看看文件状态是个好习惯git status可以看到shopping list.txt又变红了不过这次它左边的文字不是 New file: 而是 modified:而且上方显示它的状态也不是 Untracked 而是 not staged for commit意思很明确Git 已经认识这个文件了它不是个新文件但它有了一些改动。所以虽然状态的显示有点不同但处理方式还是一样的git add shopping\ list.txt这时再status一下就会看到shopping list.txt已经 staged (to be commited) 了git status好最后一步commitgit commit这时再看看log你已经有三条commits 了git log把提交推送到中央仓库到现在为止已经写了两条提交但它们都还在本地仓库。为了把代码分享出去你还需要把这些提交上传到中央仓库。如果你现在再看一下statusgit status你会看到Git 提示你的当前 branch 已经领先于 ahead of origin/master 两个提交了。就像上面我说的branch 这个概念我到后面再讲origin/master的中的origin是远端仓库的名称是你在用clone指令初始化本地仓库时 Git 自动帮你起的默认名称master是origin上的分支名称。不过对于现在来说可以暂时把origin/master简单理解为「中央仓库」。也就是说这句话是告诉你你的本地仓库已经领先中央仓库两个提交了。这两个提交很明显就是指的刚才那两个关于shopping list.txt的提交。而这句话的下面也说明了你可以使用git push来把你的本地提交发布即上传到中央仓库。所以很简单照做吧git push由于这是联网操作所以在这个过程 GitHub 会再次向你索要账户和密码。填入正确的账户和密码push操作就完成了。这时你再去你的 GitHub 仓库页面看一下你会发现shopping list.txt文件已经在上面了并且commits的数量从一个变成了 3 个。这说明你已经成功把本地仓库的提交推送到了服务器。如果觉得一遍遍地输入密码很烦可以按照这个页面 提供的方案来把密码保存起来。另外还有一个更简单但安全性低一些的方案。执行这行代码git config credential.helper store在这之后你只需要再输入一次密码 Git 就会把你的密码保存下来这之后就再也不用输入了。说它「安全性低」是因为这条指令会让 Git 把你的密码以明文形式保存在你的电脑上。具体这两种保存密码的方案选择哪个看你自己了。小结在这一节里描述了 Git 的最基本的工作模型1、从 GitHub 把中央仓库 clone 到本地使用命令git clone2、把写完的代码提交先用git add 文件名把文件添加到暂存区再用git commit提交在这个过程中可以使用git status来随时查看工作目录的状态每个文件有 changed / unstaged已修改, staged已修改并暂存, commited已提交 三种状态以及一种特殊状态 untracked未跟踪3、提交一次或多次之后把本地提交push到中央仓库git push