Git不仅仅是实际项目开发中进行代码管理的神器,也是你在天码营学习需要掌握的工具。
Git是一种代码版本控制工具。我们在实际项目中和天码营的学习过程中都会产生大量的项目代码,Git可以帮助我们记录项目中每一个文件的每一次改动记录,如果我们误删了重要的信息或者需要找回很久以前的某一段内容,能够很容易的得到以前某一个时刻的内容。同时Git还能够支持代码的协作,Git能够将多个人的工作成果进行自动合并。
所以接下来,我们来学习Git的一些基本技巧吧。
在Windows上安装Git需要使用git for windows项目提供的安装包,可以到GitHub的页面上下载exe安装文件并运行:
完成安装之后,就可以使用Windows Command Line来运行git了。但是我们更加推荐使用Unix风格的shell来运行Git,在Unix风格的shell中,可以使用更多复杂的命令而且不必考虑Windows下空格、路径分隔符等问题。git for windows还提供了一个图形界面的 Git 项目管理工具。
如果要在Linux上安装预编译好的Git二进制安装包,可以直接用系统提供的包管理工具。在Fedora上用yum安装:
$ yum install git-core
在Ubuntu这类Debian体系的操作系统上,可以使用apt-get安装:
$ apt-get install git
Mac在安装了命令行工具(Command Line Tools)后系统会自带Git。当然也可以通过MacPorts和HomeBrew等包管理工具来安装:
brew install git
::: protipMac下强烈推荐使用HomeBrew来管理各类开发软件:::
如果没有安装Brew,可以直接下载git OSX版进行安装。
Git安装成功后,可以在命令行下输入git --version,如果出现Git的版本号信息则说明Git安装成功。比如在Mac下会有以下输出:
➜ ~ git --version
git version 2.5.4 (Apple Git-61)
开始使用Git的第一件事情是设置你的名字和Email地址。因为Git在记录每一次文件变化时都会使用这些信息,在与他人协作时个人信息也是非常重要的。可以通过命令行进行配置:
$ git config --global user.name "John Smith"
$ git config --global user.email "[email protected]"
其中user.name和user.email后的两个字符串内容,应该替换为你自己的个人信息。--global表示这个配置是一个系统全局配置,也就是说在当前系统中任何地方使用Git都会采用刚才你输入的名字和Email地址。
这里你可以将user.name和user.email设置为你在天码营网站的用户名和注册邮件。
一个团队的实际开发中,通常需要一台24小时在线的服务器,每一个开发者都从这个“中央服务器”上克隆仓库到本地,并将各自的提交推送到“中央服务器”的仓库中。
Git本身提供服务器支持,但是现在我们暂时还不需要了解如何搭建Git服务器,因为如果大家报名天码营的在线实战训练营,我们已经给你准备好了一个你独有的Git远程仓库。我们只需专注于通过各种Git命令来与这个仓库进行交互。
你可以在课程页面左侧找到Git仓库的地址:
点击右侧的按钮可以拷贝该地址,假设为http://{your_user_name}@http://git.tianmaying.com/sample-codes/full-stack-java-web-development.git打开命令行,进入到你本地希望存放代码的目录,将仓库克隆到本地:
git clone http://{your_user_name}@git.tianmaying.com/sample-codes/full-stack-java-web-development.git
也可以在后面再增加一个目录参数,如:
git clone http://{your_user_name}@git.tianmaying.com/sample-codes/full-stack-java-web-development.git tianmaying_repo
这表示将远程仓库中的内容放到本地的timaying_repo目录下。
如果不指定,则会根据仓库地址中的路径名字生成一个目录。比如天码营《Java Web实战训练》这个课程的仓库地址,对应的目录就是full-stack-java-web-development。
执行完之后你就可以看到一个初始的代码仓库了,里面还没有什么内容,当你学完课程之后,这里将会装满你的代码,让你满载而归!
现在你可以看到一个.git文件夹,项目中所有文件的变化历史,都会存储在这个文件夹中,里面的细节我们先不用了解。
在接下来的操作中,我们可以经常性地查看Git仓库的状态,可以执行git status命令进行查看。
比如,此时仓库的状态应该是这样:
➜ full-stack-java-web-development git:(master) git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean
up-to-date表示仓库的状态是最新状态,而且nothing to commit,本地还没有任何可提交的修改。
接下来,让我们来增加一个文件test.txt,里面输入的内容为
这是一个测试文件
此时执行git status可以查看仓库状态:
➜ full-stack-java-web-development git:(master) ✗ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Untracked files:
(use "git add ..." to include in what will be committed)
test.txt
nothing added to commit but untracked files present (use "git add" to track)
上述信息表明,test.txt文件是一个Untracked files,尚未进入到Git仓库中。对于新增的文件需要执行git add操作,才能让Git对其进行跟踪和管理。
➜ full-stack-java-web-development git:(master) ✗ git add test.txt
➜ full-stack-java-web-development git:(master) ✗ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD ..." to unstage)
new file: test.txt
通过git add test.txt就将该文件纳入到Git暂存区了,这在Git叫做stage,即test.txt文件暂存起来了。
git add命令可以重复对某一个文件使用。例如我们现在再次对test.txt文件进行修改,如果想将这次修改的内容也提交到Git仓库,那么必须再次使用git add test.txt来暂存最新的修改。
使用git add可以暂存多个文件:
有时有多个文件,我们可以使用通配符,git add *表示暂存所有文件的修改。
有时我们希望将某个目录内的所有内容修改一起暂存,可以直接使用git add <目录名>,Git会递归搜索改目录下的所有文件修改。比如如果我们需要添加整个项目目录到Git版本控制,可以在项目根目录下使用git add .命令。这里.表示当前目录。
当修改已经完成,你决定将暂存的修改进行提交时,就可以执行git commit命令。
执行该命令,会显示一个编辑器并显示如下信息:
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# Your branch is up-to-date with 'origin/master'.
#
# Changes to be committed:
# new file: test.txt
#
在Git中每一次提交都必须带有提交的说明信息,否则会提交失败。说明信息就是对这一次提交的注释说明,为每一次提交添加完整而有意义的说明是一个非常良好的习惯,这有助于我们今后在Git版本控制库中方便的查看并且找到某一次改动的记录。
当然,如果提交的注释信息比较简单时,我们也可以采用git commit -m
➜ full-stack-java-web-development git:(master) ✗ git commit -m"add test.txt"
[master 495c46c] add test.txt
1 file changed, 1 insertion(+)
create mode 100644 test.txt
一次git commit命令的执行就会形成代码的一个版本,这个版本有一个SHA-1校验码作为它的标识符,一共40位,上面输出中[master 495c46c] add test.txt中的495c46c就是这个标识符的前7位。
git log命令可以用来显示仓库历史提交信息——即每一次git commit的信息。通过git log命令,可以查看项目历史,同时命令的各种参数也能够支持对历史提交灵活的过滤、搜索和查询。
之前我们用到的git status可以用来查看工作目录(Working Direcory)、暂存区和版本控制库状态,而git log则是用来查看版本控制库的历史:
当你已经向版本控制库中提交了代码后,可以通过git log命令来查看之前的提交历史。提交历史看起来是这个样子:
$ git log
commit 495c46cff817ec66f44342007202690a93763949
Author: Scott Chacon
Date: Mon Mar 17 21:52:11 2016 -0700
add test.txt
commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon
Date: Sat Mar 15 16:40:33 2016 -0700
first commit
git log命令在不添加任何参数的默认情况下的显示如上,最近的提交会显示在最前面,如果一个屏幕无法现实完整的提交历史,那么可以通过空格或j向下翻页,q可以退出查看历史的窗口。
可以看到,每一次提交都包含了一个SHA-1校验码作为提交的标识符、提交者的名字和Email(也就是git config --global user.name
当然每一次提交包含的信息远远不止这些,如果需查看不同的输出形式或者更多的信息,可以参考以下参数列表:
以上这些参数大部分可以组合使用,大家可以尝试在自己的仓库中练习使用它们。
到目前为止,我们所有的Git相关操作都是在本地仓库进行的。如果我们希望能够和别人通过Git仓库进行协作,那就需要将仓库同步到一台“中央服务器”上。
在天码营中,你则需要和老师通过Git仓库进行协作,因为老师需要看到你的代码并给你指导。
我们提到过天码营已经提供了这样的“中央服务器”,你接下来为了让老师也看到你代码的修改,你就需要将代码修改推送到这台“中央服务器”给你提供的远程仓库了。
我们之前使用git clone命令除了在本地新建了一个Git仓库以外,其实Git还自动添加了一个remote仓库,名字为origin(Git默认设置),地址为git clone的url参数。
执行git push origin
➜ full-stack-java-web-development git:(master) git push origin master
Counting objects: 3, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 333 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: Updating references: 100% (1/1)
To http://[email protected]/tmy/full-stack-java-web-development.git
71dcc75..66fc794 master -> master
推送成功后,你可以通过天码营网站的代码浏览器就能看到自己本地修改的代码了。
在课程页面左侧点击箭头所指的按钮即可浏览仓库代码:
你可以看到,你新建的test.txt文件已经可以看到了
在开发的过程中,远程仓库也有可能发生变化,例如其他开发者将自己的工作同步到的远程仓库,或者在天码营的学习过程中,可能老师会修改你的代码。这时我们就需要把这些工作同步到自己本地的仓库里。
git pull命令就可以帮助我们完成这件事情。
➜ full-stack-java-web-development git:(master) git pull origin master
From http://git.tianmaying.com/tiange/full-stack-java-web-development
* branch master -> FETCH_HEAD
Already up-to-date.
这里已经没有其它人提交而且推送过修改,因此显示为Already up-to-date.。在天码营的学习场景中,老师可以会修改代码,你通过代码下拉操作就能将老师的修改同步到你本地仓库了。
如果我们打算开始一个新的功能的开发,可以在当前分支的基础上创建一个新的分支。
git branch new-feature
我们创建了新分支new-feature,如果需要开始在新分支上工作,我们必须首先切换到新分支上,即将当前分支设置为new-feature。
git checkout new-feature
上面这两条命令,可以通过一条命令完成:
git checkout -b new-feature
这样不仅创建了新的分支,而且进行了切换。
接下来我们可以在新的分支上进行代码内容的修改和提交。比如我们再次增加一个文件test2.txt,往该文件中添加一些内容。
➜ full-stack-java-web-development git:(new-feature) ✗ git add test2.txt
➜ full-stack-java-web-development git:(new-feature) ✗ git commit -m"add test2.txt"
[master 393dc1b] add test2.txt
1 file changed, 1 insertion(+)
create mode 100644 test2.txt
为了将该分支也推送到远程服务,可以执行下面的命令:
➜ full-stack-java-web-development git:(new-feature) git push origin new-feature
Counting objects: 3, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 269 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1)
remote: Updating references: 100% (1/1)
To http://[email protected]/tiange/full-stack-java-web-development.git
* [new branch] new-feature -> new-feature
这样新分支中的代码修改就同步到远程仓库了,打开天码营的代码浏览器可以看到。
对于我们的学习过程来说,每一次作业都是在已有的代码基础上增加一个新的feature,所以每一次都通过一个新的分支来提交作业代码。
你如果希望切换回其它分支,只需要记住分支的名称即可。比如要切换回master分支,执行git checkout master即可。
在实际开发中,如果
以上介绍的git命令,是你通过天码营学习必须掌握的。
下面这些命令在你做作业的过程中可能也会用到,可以了解一下。
如果你希望查看目前暂存中的修改,可以使用下面的命令:
git diff --staged
如果你修改并且暂存了一个文件,希望取消暂存,则可以使用git reset命令
git reset test2.txt
如果想完全放弃一个文件的修改,比如放弃test2.txt的修改,回到最近一次提交的状态,则可以执行如下命令:
git checkout test2.txt
如果希望从代码仓库中删除某个文件,比如删除test2.txt,则可以执行如下命令:
git rm test2.txt
参考阅读
git - the simple guide
这是一个10分钟就能看完的教程
Code School - Try Git
这是Github提供的一个交互Git教程,通过20多个步骤你可以了解基本的Git操作