Git实例教程

概述

本文以一个实例带你从安装Git慢慢深入,跟着做完这个小Demo,你将学会如何使用git的基本命令,熟悉Git版本管理的流程,理解什么是暂存区,深入理解暂存区和工作区的以及本地仓库的关系。

1 安装Git

参考官方教程

本文基于OSX系统:

先下载MacPorts

curl -O https://distfiles.macports.org/MacPorts/MacPorts-2.4.1.tar.bz2

解压

tar xf MacPorts-2.4.1.tar.bz2

安装

cd MacPorts-2.3.4/
./configure
make
sudo make install

打开 用户/你的用户名 文件夹下的“.bash_profile”文件,看是否有export PATH="/opt/local/bin:/opt/local/sbin:$PATH",没有就加上。修改完“.bash_profile”文件后需要在终端输入source .bash_profile命令,是修改立即生效。

安装git

POSIXLY_CORRECT=1 sudo port install git

如果提示git-core not found,就输入sudo port -d sync,如果提示port not found,就检查环境变量是否设置成功。

2 初始化

$ git config --global user.name "Jady Li"
$ git config --global user.email 1257984872@qq.com

一般够用了,其他的配置参考初次运行 Git 前的配置

3 创建本地仓库

终端进入需要创建Git仓库的目录下,

cd /Users/jady/gitdemo
git init

4 工作区和暂存区

接下来,这里我们开始学习工作区和暂存区了,这部分内容很容易混淆。为了让大家更简单地了解这部分知识,我画了一组流程图。首先,我们来看下git版本控制的文件位置构成。

可以看到四个区域:

  • 工作区 我们平时开发就在工作区里
  • 暂存区 add命令之后,工作区文件会在暂存区留一份快照,我觉得淘宝的购物车和暂存区挺像,在提交订单前可以随意修改购物车,暂存区也是,先这样理解吧。。。。
  • 本地仓库 commit命令之后,文件会提交到本地仓库,相当于购物车提交订单
  • 远程仓库 push命令之后,文件从本地仓库提交到远程仓库,相当于服务器接收到订单,额,有点勉强的比喻

首先,我们在gitdemo目录下新建一个文件 test.text,内容为:

我刚创建

执行

git status

查看文件状态

$ git status test.text
On branch master

Initial commit

Untracked files:
  (use "git add <file>..." to include in what will be committed)

	test.text

nothing added to commit but untracked files present (use "git add" to track)

可以看到文件是未跟踪的状态。
现在的目录结构是这样的:

接着,执行

git add test.text

这个操作会将文件快照添加到暂存区,注意,是快照,不是备份,虽然暂存区这里快照和备份好像看不出什么区别。这个区别主要体现commit操作, commit之后,暂存区快照会存储在本地git仓库中,如果之前版本的文件在此次commit没有发生改动,那么git存的就是之前版本文件的链接。
查看文件状态

$ git status test.text
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

	new file:   test.text

此时的文件结构是:

然后我们修改工作区中的文件内容为

我被修改了

此时的文件结构是

查看文件状态

$ git status test.text
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

	new file:   test.text

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   test.text

我们看到有两个文件,一个是new file: test.text,这就是暂存区的文件,一个是modified: test.text,就是工作区的文件。

现在我们执行

git commit -m "我刚创建"

现在的文件结构是:

暂存区的文件被提交到本地仓库了。
查看文件状态

$ git status test.text
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   test.text

no changes added to commit (use "git add" and/or "git commit -a")

可以看到test.text处于已修改的状态,这是工作区中的文件,执行

git add .

可以将工作区中所有已跟踪的文件提交到暂存区,然后再执行

git commit -m "我被修改了"

文件就提交到本地仓库了,此时的文件结构是

现在继续修改文件内容

我第二次被修改了

此时的文件结构

突然我发现修改错了,我想取消修改,于是执行

git checkout -- test.text

此时的文件结构

然后可以看到工作区的文件内容被暂存区的文件内容覆盖了。
当我不想让git管理test.text文件了,可以执行

git rm --cached test.text 

执行

$ git status test.text
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	deleted:    test.text

Untracked files:
  (use "git add <file>..." to include in what will be committed)

	test.text

可以发现test.text文件回到了未跟踪状态,它已经脱离了git版本控制系统。

现在再来总结下,各个区的含义

  • 工作区 我们对文件的创建和修改操作都是在工作区中进行的。
  • 暂存区 暂存区是工作区和本地仓库的桥梁,在最后将文件提交到本地仓库之前,可以对文件进行随意修改,将文件从工作区添加到暂存区或者从暂存区恢复文件。
  • 本地仓库 commit命令就是将暂存区的所有文件提交到本地仓库,如果工作区的修改没有添加到暂存区,则修改不会被提交到本地仓库。

5 本地仓库

5.1 HEAD指针

在终端输入git log可以查看提交到本地仓库的历史记录

$ git log
commit a0c399145bb7b413a54593ca0f11c3e1eda2ef83
Author: Jady <1257984872@qq.com>
Date:   Wed Jul 12 21:11:31 2017 +0800

    我被修改了

commit 65b88a34150e77b3ba6122238fd1e6b4609f0e85
Author: Jady <1257984872@qq.com>
Date:   Wed Jul 12 21:11:09 2017 +0800

    我刚创建

提交次数多的话可以用git log --pretty=oneline,显示更清晰

$ git log --pretty=oneline
a0c399145bb7b413a54593ca0f11c3e1eda2ef83 我被修改了
65b88a34150e77b3ba6122238fd1e6b4609f0e85 我刚创建

可以看到我们提交了两次。回顾一下刚才的提交

第一次提交: 我刚创建
第二次提交: 我被修改了

这时也许你会问提交记录前面那一大串字符是什么,这个是版本号,也叫commit id。当我们创建一个git仓库的时候,git会自动创建一个master分支,master分支当前版本的用指针HEAD表示,上一个版本用HEAD^表示,上上个版本用HEAD^^表示,往前的版本多了,可以用HEAD~数字表示,比如HEAD~0表示当前版本,HEAD~1表示上一个版本,现在的第二次提交就是HEAD,HEAD的值就是版本号。
可以通过git rev-parse HEAD命令获取最新一次的版本号。也可以通过git rev-parse --short HEAD获取7位短版本号,这个短版本号完整的版本号是一样使用的。

将当前版本的仓库文件覆盖暂存区文件:

git reset HEAD test.text

现在处于我被修改了这个版本,我想回到上一个版本,有两种方式

**第一种:**使用git reset --hard HEAD^

$ git reset --hard HEAD^
HEAD is now at 65b88a3 我刚创建

**第二种:**首先,使用git log查看提交历史

$ git log
commit a0c399145bb7b413a54593ca0f11c3e1eda2ef83
Author: Jady <1257984872@qq.com>
Date:   Wed Jul 12 21:11:31 2017 +0800

    我被修改了

commit 65b88a34150e77b3ba6122238fd1e6b4609f0e85
Author: Jady <1257984872@qq.com>
Date:   Wed Jul 12 21:11:09 2017 +0800

    我刚创建

找到上一个版本我刚创建的版本号为65b88a34150e77b3ba6122238fd1e6b4609f0e85,执行

git reset --hard 65b88a34150e77b3ba6122238fd1e6b4609f0e85

现在回到了我刚创建的版本,好吧,我后悔了,我要回去!怎么办?
这个时候用git log只能查看历史版本哦,不能查看在我刚创建后提交的未来版本,这时我们使用git reflog来查看操作历史,

git reflog
65b88a3 HEAD@{0}: reset: moving to HEAD^
a0c3991 HEAD@{1}: reset: moving to a0c3991
65b88a3 HEAD@{2}: reset: moving to HEAD^
a0c3991 HEAD@{3}: commit: 我被修改了
65b88a3 HEAD@{4}: commit (initial): 我刚创建

找到我被修改了的版本号为a0c3991,执行

git reset --hard a0c3991

哈哈,回去啦。

5.2 分支管理

5.2.1 分支切换

使用git branch查看当前分支

$ git branch
* master

*表示当前分支。
修改下test.text文件内容为

我在master分支

执行git commit -am "修改master分支文件内容"

master分支是开发主线,这时有个功能需要在不影响主线的情况下开发,就需要新建一个分支。比如我们要开发v1版本,就可以使用git branch beta_v1新建一个分支,现在查看下分支情况:

$ git branch
  beta_v1
* master

虽然新建了一个分支,但是现在还是处于master分支下,我们先使用git checkout beta_v1切换到beta_v1分支。

$ git branch
* beta_v1
  master
5.2.2 分支合并

编辑test.text文件,修改内容为我在beta_v1分支被修改了git commit -am "修改beta_v1分支文件内容"提交,然后再使用git checkout master切换回master分支。

查看test.text文件的内容:

$ cat test.text
我在master分支

使用git merge beta_v1把分支beta_v1的内容合并过来,这时文件被自动合并了,此时的文件内容是:

$ cat test.text
我在beta_v1分支被修改了

再使用git checkout beta_v1切换到beta_v1分支,修改文件内容为我在beta_v1分支再次被修改了,此时merge master的内容git merge master

$ git merge master
自动合并 test.text
冲突(内容):合并冲突于 test.text
自动合并失败,修正冲突然后提交修正的结果。

提示自动合并失败,查看文件内容:

$ cat test.text
<<<<<<< HEAD
我在beta_v1分支再次被修改了
=======
我在master分支被修改了
>>>>>>> master

我们可以手动编辑这个文件解决冲突,修改test.text内容为冲突解决了,然后git commit -am "解决了冲突"提交。
现在的Android Studio、Intellij IDEA等IDE都有解决冲突的图形化界面,使用起来非常方便。
如果你没有用IDE,那么可以使用git mergetool --tool=编辑器名,然后使用git mergetool命令进行合并操作。使用git mergetool --tool-help查看所有支持的工具。

$ git mergetool --tool-help
'git mergetool --tool=<tool>' may be set to one of the following:
		emerge
		opendiff
		vimdiff
		vimdiff2
		vimdiff3

The following tools are valid, but not currently available:
		araxis
		bc
		bc3
		codecompare
		deltawalker
		diffmerge
		diffuse
		ecmerge
		examdiff
		gvimdiff
		gvimdiff2
		gvimdiff3
		kdiff3
		meld
		p4merge
		tkdiff
		tortoisemerge
		winmerge
		xxdiff

rebase命令也能合并内容,区别参考Git Community Book 中文版

6 远程仓库

以github为例,我创建了一个仓库test

我们如果要把项目提交到github,本地是需要配置SSH key的,当然如果你用的Android Studio之类的IDE的话,在版本控制设置里面一般能找到Github的设置, 支持密码和Token(SSH)两种验证形式,另外在GitHub桌面客户端登录也会自动配置SSH key,这里我们只讲没有IDE的情况。
首先,生成SSH key,在终端输入:

ssh-keygen -t rsa -C "你注册GitHub时的邮箱地址"

在用户目录下会生成.ssh文件夹,打开其中的id_rsa.pub,全选复制,打开GitHub,进入设置页,点击点击SSH and keys

点击New SSH key添加一个新的SSH key。

此时,在终端输入ssh -T git@github.com,提示认证成功。

终端进入刚才的gitdemo文件夹,把这个仓库放到github上去。
执行

$ git remote add origin https://github.com/Jadyli/test.git
$ git push -u origin master

如图所示:

现在test.text文件已经推送到github上了。

现在,在GitHub上修改test.text文件内容为我在GitHub上被修改了。本地怎么同步这个修改呢?可以使用pull命令把它拉取下来,执行

git pull

之后可以发现本地文件的内容变成了我在GitHub上被修改了
然后修改本地的文件内容为我在本地被修改了,然后执行

git push -u master

提交修改。

这是Git的基础操作。

  • 7
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《Git教程廖雪峰PDF》是一本非常受欢迎的学习Git版本控制工具的教程。这本教程由知名的计算机程序员廖雪峰所编写,以简洁明了的语言和实际操作示例,向读者介绍了Git的基本概念和使用方法。 这本教程Git的起源和基础开始介绍,以帮助读者了解为什么Git成为现代软件开发必备的工具。然后,教程详细介绍了Git的安装和配置,包括如何创建和克隆仓库,添加、提交和查看文件的历史记录等等。同时,教程还介绍了如何使用分支、合并、解决冲突等高级功能,以及如何与远程仓库进行交互和协作。 这本教程采用了一种循序渐进的方式,通过一步步的实例演示和练习,帮助读者逐渐掌握Git的基本操作和常用命令。并且,教程还涉及了一些高级主题,如打标签、忽略文件、子模块等,以满足读者的不同需求。 廖雪峰作为一位经验丰富的程序员,他在教程中还分享了一些他个人在使用Git过程中的一些心得和建议,这对于读者来说是非常有价值的。总体来说,《Git教程廖雪峰PDF》是一本浅显易懂、实用性强的Git入门教程,适合初学者和有一定基础的开发者阅读和学习。无论是作为参考资料还是学习教程,这本书都能够帮助读者快速掌握Git的基本使用技巧,提高版本控制和团队协作能力。 ### 回答2: 《Git教程廖雪峰PDF》是一本由知名程序员廖雪峰编写的关于Git版本控制工具的教程。这本教程以简洁明了的方式,详细介绍了Git的原理、基本操作和常见使用场景。 首先,教程Git的基本概念入手,向读者介绍了Git的核心理念:分布式版本控制,并与集中式版本控制工具进行了对比。接着,教程详细介绍了如何安装Git,并通过简单的命令行操作演示了基本的Git使用方法,如创建仓库、添加文件、提交变更等。 除了基本操作,教程还介绍了Git工作区、暂存区和版本库的概念,以及常用的分支管理策略。同时,教程还重点讲解了远程仓库的使用,包括如何与Github等网站协同工作、如何进行分支合并和冲突解决等。 此外,教程还提供了一些高级应用技巧,如如何使用Git进行代码回滚、如何管理大型项目等。同时,教程中穿插了一些案例和示例,帮助读者更好地理解和应用Git。 总的来说,《Git教程廖雪峰PDF》是一本很好的入门教程。通过该教程的学习,读者可以了解Git的基本概念和操作方法,同时也能够掌握一些高级应用技巧。该教程以简单易懂的语言和清晰明了的实例,使得读者可以较快地上手Git,并在实际项目中应用所学知识。无论是初学者还是有一定经验的开发者,都能够从《Git教程廖雪峰PDF》中获得实用的Git技巧和经验。 ### 回答3: 《Git教程廖雪峰pdf》是一本详细介绍Git版本控制系统的教程,由知名程序员、技术作者廖雪峰所著。教程总共分为五个部分,包括了Git的基本概念、安装与配置、基础操作、团队协作和Git衍生工具。 在这本教程中,廖雪峰首先介绍了Git的基本概念,包括仓库、提交、分支、合并等。通过这些概念的解释,读者可以对Git的工作原理有一个初步的了解。 然后,廖雪峰详细介绍了Git的安装与配置,包括了Windows、Mac和Linux系统的安装步骤,以及Git的基本配置和常用命令。这部分内容对于初学者来说非常实用,可以帮助他们快速入门Git。 接着,廖雪峰介绍了Git的基础操作,包括了创建仓库、提交修改、查看修改记录等。通过这些操作的演示,读者可以掌握Git的基本使用方法。 在团队协作部分,廖雪峰教授了使用远程仓库进行团队协作的方法,例如克隆远程仓库、推送修改、拉取更新等。这部分内容对于多人协作或开源项目的参与者来说尤为重要,可以帮助他们高效地进行代码管理与版本控制。 最后,廖雪峰介绍了一些基于Git的衍生工具,如GitHub、GitLab和Bitbucket等。这些工具提供了更多的协作和管理功能,能够帮助开发者更好地利用Git进行项目管理和版本控制。 总的来说,《Git教程廖雪峰pdf》是一本非常实用的Git入门教程,对于初学者或有一定经验的开发者来说都非常有帮助。通过学习这本教程,读者可以快速掌握Git的基本操作和团队协作的方法,从而更好地管理和控制代码的版本。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值