David发表在天码营

Git简介

Git不仅仅是实际项目开发中进行代码管理的神器,也是你在天码营学习需要掌握的工具。

Git是一种代码版本控制工具。我们在实际项目中和天码营的学习过程中都会产生大量的项目代码,Git可以帮助我们记录项目中每一个文件的每一次改动记录,如果我们误删了重要的信息或者需要找回很久以前的某一段内容,能够很容易的得到以前某一个时刻的内容。同时Git还能够支持代码的协作,Git能够将多个人的工作成果进行自动合并。

所以接下来,我们来学习Git的一些基本技巧吧。

安装Git

Windows系统下的安装

在Windows上安装Git需要使用git for windows项目提供的安装包,可以到GitHub的页面上下载exe安装文件并运行:

完成安装之后,就可以使用Windows Command Line来运行git了。但是我们更加推荐使用Unix风格的shell来运行Git,在Unix风格的shell中,可以使用更多复杂的命令而且不必考虑Windows下空格、路径分隔符等问题。git for windows还提供了一个图形界面的 Git 项目管理工具。

Linux系统下的安装

如果要在Linux上安装预编译好的Git二进制安装包,可以直接用系统提供的包管理工具。在Fedora上用yum安装:

$ yum install git-core

在Ubuntu这类Debian体系的操作系统上,可以使用apt-get安装:

$ apt-get install git

OSX系统下的安装

Mac在安装了命令行工具(Command Line Tools)后系统会自带Git。当然也可以通过MacPortsHomeBrew等包管理工具来安装:

brew install git

::: protipMac下强烈推荐使用HomeBrew来管理各类开发软件:::

如果没有安装Brew,可以直接下载git OSX版进行安装。

确认Git安装

Git安装成功后,可以在命令行下输入git --version,如果出现Git的版本号信息则说明Git安装成功。比如在Mac下会有以下输出:

➜  ~  git --version
git version 2.5.4 (Apple Git-61)

Git配置

开始使用Git的第一件事情是设置你的名字和Email地址。因为Git在记录每一次文件变化时都会使用这些信息,在与他人协作时个人信息也是非常重要的。可以通过命令行进行配置:

$ git config --global user.name "John Smith"
$ git config --global user.email "johnsmith@gmail.com"

其中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 <file>..." 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 <file>..." 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 <message>来快速提交:

➜  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 <schacon@gee-mail.com>
Date: Mon Mar 17 21:52:11 2016 -0700 add test.txt commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <schacon@gee-mail.com>
Date: Sat Mar 15 16:40:33 2016 -0700 first commit

git log命令在不添加任何参数的默认情况下的显示如上,最近的提交会显示在最前面,如果一个屏幕无法现实完整的提交历史,那么可以通过空格或j向下翻页,q可以退出查看历史的窗口。

可以看到,每一次提交都包含了一个SHA-1校验码作为提交的标识符、提交者的名字和Email(也就是git config --global user.name <name>中设置的值)、提交日期以及提交注释信息。

当然每一次提交包含的信息远远不止这些,如果需查看不同的输出形式或者更多的信息,可以参考以下参数列表:

  • git log -p: 显示每一次提交和它之前提交的Diff
  • git log --stat: 显示每一次提交和它相关联的文件的统计信息以及状态
  • git log --name-only:显示每一次提交和他关联的文件列表(仅仅包含文件名)
  • git log <since>..<until>: 仅仅显示<since>和<until>之间的提交列表,<since>和<until>可以是提交的SHA-校验码、分支名、HEAD等等
  • git log --author="<pattern>": 显示Author为特定值的提交列表,<pattern>可以是字符串,也可以是一个正则表达式
  • git log <file>:查看某一个文件相关联的提交历史信息

以上这些参数大部分可以组合使用,大家可以尝试在自己的仓库中练习使用它们。

代码推送

到目前为止,我们所有的Git相关操作都是在本地仓库进行的。如果我们希望能够和别人通过Git仓库进行协作,那就需要将仓库同步到一台“中央服务器”上。

在天码营中,你则需要和老师通过Git仓库进行协作,因为老师需要看到你的代码并给你指导。

我们提到过天码营已经提供了这样的“中央服务器”,你接下来为了让老师也看到你代码的修改,你就需要将代码修改推送到这台“中央服务器”给你提供的远程仓库了。

我们之前使用git clone命令除了在本地新建了一个Git仓库以外,其实Git还自动添加了一个remote仓库,名字为origin(Git默认设置),地址为git clone的url参数。

执行git push origin <branch_name>就可以将本地代码推送到远程仓库了。

➜  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://david@git.tianmaying.com/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://tiange@git.tianmaying.com/tiange/full-stack-java-web-development.git
* [new branch] new-feature -> new-feature

这样新分支中的代码修改就同步到远程仓库了,打开天码营的代码浏览器可以看到。

对于我们的学习过程来说,每一次作业都是在已有的代码基础上增加一个新的feature,所以每一次都通过一个新的分支来提交作业代码。

你如果希望切换回其它分支,只需要记住分支的名称即可。比如要切换回master分支,执行git checkout master即可。

在实际开发中,如果

其它命令

以上介绍的git命令,是你通过天码营学习必须掌握的。

下面这些命令在你做作业的过程中可能也会用到,可以了解一下。

查看diff

如果你希望查看目前暂存中的修改,可以使用下面的命令:

git diff --staged

取消暂存

如果你修改并且暂存了一个文件,希望取消暂存,则可以使用git reset命令

git reset test2.txt

还原文件

如果想完全放弃一个文件的修改,比如放弃test2.txt的修改,回到最近一次提交的状态,则可以执行如下命令:

git checkout test2.txt

删除文件

如果希望从代码仓库中删除某个文件,比如删除test2.txt,则可以执行如下命令:

git rm test2.txt
  1. git add和git commit在本地提交Hello World项目的代码
  2. 将该分支推送到天码营远程仓库

参考阅读

更多文章请访问天码营网站

转自:http://blog.csdn.net/autfish/article/details/52513465

Git入门基本操作的更多相关文章

  1. git 入门宝典

    本篇教程是按照我自己的组织方式,然后从多篇教程中拼凑出来的,嘎嘎~,真佩服自己的技术! 原本想叫 git 宝典的,结果一查git的命令大全,还有那么多的git命令与功能没有接触到,所以...还是谦虚一 ...

  2. Docker 入门(Mac环境)-part 1 入门基本操作

    part-1 入门基本操作 Docker 安装 去官网下载对应的版本,然后点击安装就可以了: 如果环境是Linux,可以参照之前写的get started教程 查看docker版本 docker -- ...

  3. Git GUI基本操作

    一.Git GUI基本操作 1.版本库初始化 gitpractise文件夹就变成了Git可以管理的仓库,目录下多了一个.git文件夹,此目录是Git用于管理版本库的,不要擅自改动里面的文件,这样会破坏 ...

  4. git入门三(远程、标签)

    git 入门三 (远程.标签)     分布式版本控制管理系统本地仓库和中心服务器仓库数据是本地的镜像仓库,中心服务器数据仓库的是为了多用户数据合并和获取同步的中心,多人协作需要管理这些远程仓库,以便 ...

  5. git入门网站

    http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 git入门教程:对商业的.开源的. ...

  6. git入门及上传项目到github

    Git入门:       如果你完全没有接触过Git,你现在只需要理解通过Git的语法(敲入一些命令)就可以将代码上传到远程的仓库或者下载到本地的仓库(服务器),我们此时应该有两个仓库,就是两个放代码 ...

  7. Git入门仅这篇就够了

    版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请表明出处:http://www.cnblogs.com/cavalier-/p/5978937.html 前言 大家好,我是Cavalier ...

  8. git入门学习(二):新建分支/上传代码/删除分支

    一.git新建分支,上传代码到新的不同分支  我要实现的效果,即是多个内容的平行分支:这样做的主要目的是方便统一管理属于同一个内容的不同的项目,互不干扰.如图所示: 前提是我的github上已经有we ...

  9. git入门学习(一):github for windows上传本地项目到github

    Git是目前最先进的分布式版本控制系统,作为一个程序员,我们需要掌握其用法.Github发布了Github for Windows 则大大降低了学习成本和使用难度,他甚至比SVN都简单. 一.首先在g ...

随机推荐

  1. php把时间戳转换成英文格式

    <?php echo "时间格式1:".date("Y-m-d H:i:s ")."<br>";// 2010-06-12 ...

  2. PHP截断函数mb_substr()

    提示:mb_substr在于php中是默认不被支持的我们需要在在windows目录下找到php.ini打开编辑,搜索mbstring.dll,找到;extension=php_mbstring.dll ...

  3. java导出word文件

    java导出word文件 test5.ftl文件生存方法, 第一步:用word新建test5.doc,填写完整模板,将需导出数据用${}代替 第二步:将test5.doc另存为test5.xml 第三 ...

  4. CMD命令进入文件夹

    cmd 进入E文件夹 E: 查看文件夹目录  dir 进入某个文件夹 cd 目录

  5. js表单计算金额问题

    <table width="600" border="1" align="center" style="text-align ...

  6. sftp,get命令使用*通配符的方式获取批量的文件

    需求描述: 今天在使用sftp进行get文件的时候,有很多文件名类似的文件,以为还是需要一个一个get 后来发现get也可以使用通配符的方式进行匹配获取多个文件,在此记录下 操作过程: 1.通过sft ...

  7. 超全面的JavaWeb笔记day11<JSP&Session&Cookie&HttpSession>

    1.JSP 2.回话跟踪技术 3.Cookie 4.HttpSession JSP入门 1 JSP概述 1.1 什么是JSP JSP(Java Server Pages)是JavaWeb服务器端的动态 ...

  8. Android Studio 引入 so 文件

    1.在build.gradle中添加配置 task nativeLibsToJar(type: Zip, description: "create a jar archive of the  ...

  9. 关于js中定时器的返回值问题

    在js中,我们常常会用到定时器来处理各种各样的问题,当我们需要清除定时器的时候,我们常常会定义一个值来接受定时器的返回值,然后再把定义好的这个值写到清除定时器的括弧后面,如: var times = ...

  10. Linux命令学习之xargs命令

    xargs命令是给其他命令传递参数的一个过滤器,也是组合多个命令的一个工具.它擅长将标准输入数据转换成命令行参数,xargs能够处理管道或者stdin并将其转换成特定命令的命令参数.xargs也可以将 ...