Git是一个开源的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理。而GitHub则是一个面向开源及私有软件项目的托管平台,或者说它是一个在线的项目版本管理系统,它为基于git的版本控制和项目托管提供了全面的支持。Git和GitHub可以紧密配合实现高效便捷的版本控制。

要利用git进行项目管理和版本控制,第一步就是在本地建立一个版本仓库(repository),也就是说我们需要在本机上指定一个文件夹(例如我们创建一个名为git_projects的文件夹来用作repository),而未来需要被管理的项目将被放在该文件夹下,git工具也将针对该文件下的文件进行版本管理。

本文接下来的例子是基于Ubuntu 16.04开展的。首先,进入到刚刚创建的目录下。为了对repository中的项目进行管理,我们需要建立管理员身份,此后版本提交等操作都将以该身份来开展。方法如下图所示,先配置用户名和邮件名,然后double check配置的结果,显示一切正常。

git是一个项目一个仓库还是一个仓库多个项目_暂存区

然后为了将已经创建好的文件夹指定为版本仓库文件夹,需要对其进行初始化。具体方法就是使用git init(注意务必保证你已经进入到该目录下),如下图所示。此时,你可能会发现git_projects文件夹似乎并无异样。但实际上,系统已经在其下创建了一个名为.git的子文件夹,该文件夹内部存储了必要的配置信息。但是这个文件夹通常是隐藏文件夹,如果你有兴趣可以(在Ubuntu中)按下键盘上的【Ctrl+H】来显示它。

git是一个项目一个仓库还是一个仓库多个项目_暂存区_02


Git中第一个要掌握的基本命令就是git status,它用于显示工作目录和暂存区的状态。使用此命令能看到哪些修改被暂存了,哪些没有。git status不显示已经commit到项目历史中去的信息。例如在上图中,在刚刚创建好repository时,使用该命令,可以看到nothing to commit。然后向git_projects文件夹下添加一个文件(例如名为test.c),再使用命令git status,从上图中可以看到这个新文件是untracked(而且文件名是红色),这表示这个文件尚未被git跟踪到,或者说git尚未意识到它的存在。

此时,我们需要用到的另外一个重要命令就是git add,该命令将文件内容添加到索引(将修改添加到暂存区)。也就是将要提交的文件的信息添加到索引库中。如下图所示,在使用了该命令之后,你会发现git已经意识到存在一个名为test.c的新文件了。但请注意,此时test.c文件仅仅是位于暂存区中,对其所作的任何更改并未被真正添加到repository。为此,需要使用git commit命令,它负责将更改记录(提交)到存储库。将索引的当前内容与描述更改的用户和日志消息一起存储在新的提交中。参数“-m”表示message,也就是说其后紧跟着的字符串是对该次修改的所进行的一个描述。从下图中可以看出,执行commit命令后再查看日志,系统显示该次修改已经被记录,例如提交修改的作者,修改的时间,以及修改的内容等。



git是一个项目一个仓库还是一个仓库多个项目_git_03


对于刚刚创建的test.c文件,我们在实际项目中会对其进行修改。因为该文件已经被纳入git版本管理的跟踪范围,一旦修改它,再使用git status进行查看时,你会发现git已经意识到它被修改了(文件名再次变成了红色)。但是本次修改并未被提交。另外还可以使用git diff来查看修改的内容。git diff 命令用于显示提交和工作树等之间的更改。此命令比较的是工作目录中当前文件和暂存区域快照之间的差异,也就是修改之后还没有暂存起来的变化内容。如下图所示,我们修改是把原来的"hello world!\n"变成了"hello world!!!\n",注意这里的减号表示删除,加号表示增加。


git是一个项目一个仓库还是一个仓库多个项目_Git_04

同样,为了将新的更改添加到暂存区,我们需要使用add。在上图中,我们使用了命令git add .,其中的 . 表示将“所有的修改”添加到暂存区。在使用add之后,还需要使用commit来提交更改。


到目前为止,上面的所有工作都是在本地进行的。更进一步,我们希望将本地项目上传到GitHub以便进行在线的项目管理。这也是多人合作进行项目开发所必须的。假设你已经创建好了一个GitHub账号,而且你的GitHub上已经有了一个名为mytest的在线repository。下面我们要做的就是设法把本地的repository同在线的repository链接到一起。


下图是我们已经创建好的一个在线repository,你可以看到它的https链接,以及branch(此处的branch是master)。要参与任何一个 Git 项目的协作,必须要了解该如何管理远程仓库。远程仓库是指托管在网络上的项目仓库,可能会有好多个,其中有些你只能读,另外有些可以写。同他人协作开发某个项目时,需要管理这些远程仓库,以便推送或拉取数据,分享各自的工作进展。管理远程仓库的工作,包括添加远程库,移除废弃的远程库,管理各式远程库分支,定义是否跟踪这些分支等等。

git是一个项目一个仓库还是一个仓库多个项目_暂存区_05

管理远程仓库需要使用命令git remote。如下图所示,当我们已经知道在线repository的https链接时,可以使用如下命令,来进行add。这句话其中的 origin 的远程库, git 默认使用这个名字来标识你所克隆的原始仓库。我们已经知道add的作用只是把文件的状态变为tracked,也就是令git知道它的存在(或者说是将其置于暂存区)。在结合remote时,我们指定的目标是在远程的,所以文件的修改并未被推到远程,而事实上这里所谓的暂存区也位于本地。

git是一个项目一个仓库还是一个仓库多个项目_推送_06

只有当你使用push命令时,它才会被推到远程主机。push 命令用于将本地分支的更新,推送到远程主机。如下图所示,其中的-u选项表示指定一个默认主机,这样后面就可以不加任何参数使用,origin 是默认的远程仓库(在上面的命令中我们已经指明了主机地址),master给出了我们要推送的目标branch。注意到在使用https链接时,每次都需要认证用户身份,你需要输入你的GitHub账号以及密码。

git是一个项目一个仓库还是一个仓库多个项目_推送_07

完成上面的步骤之后,你就会发现文件已经被成功推送到GitHub上了。但是上面的操作始终有一个问题,就是每次执行与远程主机的连接都要输入密码,这个有点麻烦。有没有其他更简单的方法?有的,可以使用SSH连接。在之前获得https链接的地方,你同样可以获得一个SSH链接,如下图所示:

git是一个项目一个仓库还是一个仓库多个项目_Git_08

要想使用SSH链接,你需要为本机生成一个key。方法如下所示,即使用语句ssh-keygen -t rsa -b 4096 -C "你的邮件地址",中间需要按几次回车,例如:When you're prompted to "Enter a file in which to save the key," press Enter. This accepts the default file location。然后你还需要Add your SSH private key to the ssh-agent. If you created your key with a different name, or if you are adding an existing key that has a different name, replace id_rsa in the command with the name of your private key file.

git是一个项目一个仓库还是一个仓库多个项目_git_09

经过上面的步骤,已经得到了Key,它就存储在上面你指定的路径下文件中,你可以使用一个文件编辑器打开它,然后把里面的内容复制到剪贴板待用。接下来,In the upper-right corner of any page, click your profile photo, then click Settings,如下图所示。

git是一个项目一个仓库还是一个仓库多个项目_GitHub_10

接下来,in the user settings sidebar, click SSH and GPG keys. Click New SSH key or Add SSH key,如下图所示。In the "Title" field, add a descriptive label for the new key. For example, if you're using a personal Mac, you might call this key "Personal MacBook Air". Paste your key into the "Key" field. Click Add SSH key. If prompted, confirm your GitHub password.

git是一个项目一个仓库还是一个仓库多个项目_GitHub_11


完成上述配置过程之后,你就可以使用SSH方式连接到GitHub了。我们来尝试一下。通常,如果网上已经存在有一个repository,为了防止线上的repository和本地的repository冲突,我们在向上推送之前,最好做pull动作。git pull命令用于从另一个存储库或本地分支获取并集成(整合)。git pull命令的作用是:取回远程主机某个分支的更新,再与本地的指定分支合并。如下图所示,其中的地址是前面示例图片中显示的SSH链接地址。下面我们就可以做之前已经做过的事情了,先add,再commit。


git是一个项目一个仓库还是一个仓库多个项目_Git_12

注意,因为现在是与远程repository交互,所以即使commit之后,GitHub上的文件也还没有被更新。你需要使用push来将本地的更新推送到GitHub上的远程repository。例如,在下图中你可以看到,我们修改了test.c文件,并向git_projects文件夹中增加了一个名为test2.ll的文件。类似地,先add再commit。最后,在push到GitHub上的远程repository,注意因为这次使用的是SSH方式连接,所以已经不再需要输入用户名和密码了。

git是一个项目一个仓库还是一个仓库多个项目_Git_13