git入门与实践
git中的文件主要会处于三种状态,它们分别是:
- Committed: 文件或数据已经安全的存放在了git本地数据库中
- Modified: 文件或数据已经修改但是尚未commit到数据库
- Staged: 文件或数据已被标记要放入到下一次commit中
这样的机制致使git的镜像会由三个部分组成(假设有一个git目录叫git-repo):
- Git directory: 存放项目中所有元数据以及对象的地方(git-repo/.git/)
- Working directory: 在这里是从git项目数据库中checkout出的一个单独的(默认情况下是最新的)项目版本,用于对指定项目版本中的文件进行修改和编辑(git-repo/)
- Staging area: 一般是存放在Git directory中的一个简单的文件,里面存放着下一次需要commit的文件的信息(在git-repo/.git/中)
安装git
在快速了解了git的概念与历史后,我们就要开始学习使用它了,自然而然的,第一步我们需要将git安装到我们的系统中去。 众所周知,不同的Linux发行版本有着不同的包管理模式,在大多数Linux发行版本的软件源中,都会有现成的git包已经打好以提供yum,aptitude之类的工具直接解决依赖问题下载与安装。 当然,你也可以手动下载最新的git源代码包,自行编译,不过需要注意一点的是,确保你已经解决了为手动编译git而需要解决的软件依赖问题:
使用yum工具先行解决包依赖问题(适用于RHEL,CentOS,Fedora等): # yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel 使用aptitude工具先行解决包依赖问题(适用于Debian,ubuntu等): # aptitude install curl-devel expat-devel gettext-devel openssl-devel zlib-devel
完成这些依赖的安装后,到这里下载最新的git源代码包,然后开始安装:
$ tar -zxf git-xxx.tar.gz # xxx代表版本号 $ cd git-xxx/ $ make prefix=/usr/local all $ sudo make prefix=/usr/local install
一旦git的安装完成了,今后你可以使用git本身来获取git最新的updates:
$ git clone git://git.kernel.org/pub/scm/git/git.git
git同样能够在Mac OS X与Windows上使用,具体的操作请参考de.google.com/p/git-osx-installer/">这里和de.google.com/p/msysgit/">这里。
其他Linux发行版本(例如archlinux,gentoo等),可参照各发行版本的官方手册与说明使用各自的包管理工具安装。
配置git
完成git的安装后,不要急着使用,首先你需要对git进行一些小小的配置,它在git的应用(一般是项目开发中)是必要的。git提供了config工具(你也可以手动)来配置以下三份git配置文件:
- /etc/gitconfig: git的系统全局配置文件,该配置文件中的配置选项对操作系统上所有使用git的用户产生影响,使用git config –system可以针对此文件进行配置
- ~/.gitconfig: git的用户全局配置文件,该配置文件的配置选项对当前用户产生影响,并且会覆盖掉系统全局配置文件中已经存在的配置选项,使用git config –global可以针对此文件进行配置
- .git/config: 该文件存在每个git镜像下,其配置文件的配置选项仅对该git镜像产生影响,它会覆盖掉用户全局配置文件中已经存在的配置选项
了解了配置git的文件位置与机制后,我们首先就来尝试配置一下git的用户信息:
$ git config --global user.name "Thomas" $ git config --global user.email ghosthomas@gmail.com
这时,你就会发现在~/.gitconfig文件中,多出了与用户信息相关的配置(2条赋值语句) 在git的配置文件中,你可以针对用户名、邮件地址、编辑器、diff工具等进行配置,具体的配置参数与方法使用命令
$ git help config
即可获得。
开始git
初始化/获取 git镜像
要开始使用git,首先要做的就是创建或者获取一个git镜像,创建一个文件夹,将其初始化为git镜像:
$ pwd /home/thomas/workspace/tmp $ mkdir git-repo $ cd git-repo/ $ git init Initialized empty Git repository in /home/thomas/workspace/tmp/git-repo/.git/
在这里可以看到,我建立了一个名为git-repo的文件夹,并且将它初始化成为git镜像目录,初始化的命令为git init,?完成初始化后,会在目录下创建一个名为.git的子目录,对了,这就是前面提到的Git directory。 你也可以通过git clone命令来获取一个已存在的git镜像:
$ git clone git://github.com/schacon/grit.git
默认情况下,clone命令执行后会根据服务器上git镜像的目录名创建目录并进行git镜像的clone,你也可以在上述命令后加上自己希望看到的目录名(比如repo123)来将远程的git镜像clone到该目录下:
$ git clone git://github.com/schacon/grit.git repo123
有了git镜像后,我们就可以开始学习git的基本使用技巧了!
Modify -> Stage -> Commit -> Track
恭喜,现在你已经有一个git镜像来学习、实验或使用了。让我从实际应用出发,一步步为你介绍和解释git的基本应用。
在git的世界里,有两类文件,分别是未追踪(untracked)和已追踪(tracked),已追踪的文件是指已经放入了最新的git镜像(snapshot)里,已追踪的文件又分为三个状态,分别是:
- Unmodified: 文件没有做过任何修改
- Modified: 文件已被修改更新
- Staged: 文件已经修改更新,准备commit的状态
而未追踪的文件指的就是在git的工作目录下,所有尚未被提交放入git镜像目录中的文件。
在学会提交文件至git镜像前,先介绍一个非常重要的工具,git status,它会告诉你目前git镜像的状态,在使用git的过程中,你将会始终依赖这个工具帮助你更出色的完成工作!
$ git status # On branch master # # Initial commit # nothing to commit (create/copy files and use "git add" to track)
可以看出,git status给出了相当详细的信息,第一行中首先给出的是git的分支(branch)状态信息,branch会在将来的文章中进一步为大家介绍,它是git的王牌特性之一。接着,git会告诉你现在还没有东西提交到镜像中,需要先使用命令git add来对文件进行追踪。
所以,假设我们先在git的工作目录中使用C语言写一个helloworld的小程序,保存,我们得到一个文件: helloworld.c,然后,我们希望将这个文件被git镜像追踪(track)到,那么我们需要:
$ git add helloworld.c
这样,我们就将helloworld.c加入到了git镜像中去进行版本控制,再次使用git status来查看目前的镜像状态:
$ git status # On branch master # # Initial commit # # Changes to be committed: # (use "git rm --cached ..." to unstage) # # new file: helloworld.c #
注意这里它提到了changes to be committed,意思是该文件已经处于staged状态,接下去你可以根据自己的需要将其提交(commit),或者如果你觉得这是一个误操作,该文件不应当被提交,你可以通过git rm –cached命令来取消它的staged状态(你会发现status信息中作出了精确的提示)。
现在,我们通过命令git commit将helloworld.c提交:
$ git commit
这时,会出现一个带有status信息的文本给你编辑(使用什么编辑器取决于你对git的配置),在以”#”开头的注释行下输入一些文本,用于注释此次提交,方便于其他代码协作者的维护与理解!
你也可以通过命令参数-m来直接输入注释内容,加快提交速度:
$ git commit -m "comment here"
至此,你的文件helloworld.c已经处于tracked状态!整个过程就是小标题中所说的从修改(创建)文件到最终提交的过程。
接下来,我们将会探讨一些更为有趣的git使用技巧!
git应用进阶
在前一小节中,笔者举出的只是helloworld式的git基础应用,到这里大家应该有一个可用的git镜像以及一个已经被git追踪管理的文件了吧,是不是很方便和快捷呢?这个小节中我会带领大家了解更多git的工具与使用技巧。
修改已提交文件
现在,我们有一个helloworld.c在镜像中进行版本控制了,我们发现这个文件有一个小错误,oh,有一个循环的条件写错了,赶紧修改一下这个不大不小的bug,针对文件完成修改更新后,我们可以通过git status看到:
# On branch master # Changed but not updated: # (use "git add ..." to update what will be committed) # (use "git checkout -- ..." to discard changes in working directory) # # modified: helloworld.c # no changes added to commit (use "git add" and/or "git commit -a")
git status告诉我们,helloworld.c被修改过了,如果你想要提交,需要再次git add该文件,或者,你可以直接使用git commit -a跳过add的步骤,直接提交(尚未track的文件必须先git add才能进行提交)。
在提示中,还有提到说,如果你想撤销对helloworld.c的修改,就可以使用git checkout命令来实现,这里的情况会是:
$ git checkout -- helloworld.c
如果你这么做了,你就会发现,你的helloworld.c又回到了之前没有被修改过的时候的状态。
git中的diff
在Unix/Unix-like系统中,几乎都会有一个小巧的对比文件不同的工具叫做diff,在git中也有这么一个工具,来详细比较你修改后准备提交的文件与修改前的状态的不同之处,恩,也许你猜到了,这个命令就是git diff。
现在我们尝试着再次修改一下helloworld.c,然后运行git diff:
$ git diff diff --git a/helloworld.c b/helloworld.c index befc634..a86316b 100644 --- a/helloworld.c +++ b/helloworld.c @@ -1,3 +1,4 @@ +/* new comment line */ #include int main(void) {
通过git的diff工具,我们很容易发现,这次我在程序中新加入了一行注释代码。
添加新文件
恩,有了一个像样的代码文件后,我需要为我的代码写些说明文档,同时我也需要对这样一篇文档进行维护,那么,就建立一个README.txt文件,并且将它track到git镜像中去,看到这里读者们可以先自行尝试一下:
$ echo README > README.txt $ ls helloworld.c README.txt $ git status # On branch master # Untracked files: # (use "git add ..." to include in what will be committed) # # README.txt nothing added to commit but untracked files present (use "git add" to track)
至此,就有一个新的文件已经随时待命准备提交了,你可以清楚的看到git status非常聪明的将README.txt归类为了untracked files里,现在我们将它加入git镜像:
$ git add README.txt $ git status # On branch master # Changes to be committed: # (use "git reset HEAD ..." to unstage) # # new file: README.txt #
你可以像之前那样将README文件commit,但是这次我们将会展示的是如何unstage一个文件,在git status信息中,它告诉用户使用git reset HEAD命令来unstage一个文件,我们尝试一下:
$ git reset HEAD README.txt $ git status # On branch master # Untracked files: # (use "git add ..." to include in what will be committed) # # README.txt nothing added to commit but untracked files present (use "git add" to track)
看,README.txt又回到了untracked状态!
重命名git中的文件
假设现在我们需要修改README.txt的文件名,千万要记得我们的文件在git的镜像中进行版本控制管理,所以,不要鲁莽的直接使用unix命令mv或者rm来对git镜像中的文件进行普通的文件操作,当然,如果你真的一不留神那么做了,也不要紧。
git中,使用git mv工具来对文件进行重命名:
$ git mv README.txt tutorial.txt $ git status # On branch master # Changes to be committed: # (use "git reset HEAD ..." to unstage) # # renamed: README.txt -> tutorial.txt # $ git commit -a -m "renamed a file" [master 55ce30d] renamed a file 1 files changed, 0 insertions(+), 0 deletions(-) rename README.txt => tutorial.txt (100%)
可以看到,在提交变更后,README.txt在文件系统以及git镜像中都被成功地重命名为了tutorial.txt。同样的,你可以unstage来撤销对该文件的重命名,the choice is yours!
删除git中的文件
如果我们不再需要tutorial.txt这个文件,我们可以将其从git镜像中删除,git中删除文件的命令是git rm:
$ git rm tutorial.txt rm 'tutorial.txt' $ git status # On branch master # Changes to be committed: # (use "git reset HEAD ..." to unstage) # # deleted: tutorial.txt # $ git commit -a -m " deleted a file" [master 7d81981] deleted a file 1 files changed, 0 insertions(+), 1 deletions(-) delete mode 100644 tutorial.txt
正如之前所提到的,这些操作都是可以恢复的,因为git是版本控制系统,所以自然而然的就会有一套版本历史管理机制。
查看commit历史
工具git log提供了查看git镜像的commit历史:
$ git log commit 7d819818530ce89322019ba5000723c973eb0420 Author: ghosTM55 Date: Sun Mar 14 15:26:22 2010 +0800 deleted a file commit 55ce30d88fb5c81d20bdf86e2034053613fed632 Author: ghosTM55 Date: Sun Mar 14 15:11:39 2010 +0800 renamed a file commit 2ed9f1f9bd1a7561cd7e57dcdbd7f2cda54668fb Author: ghosTM55 Date: Sun Mar 14 14:58:11 2010 +0800 a little change commit dde0bab46a9d9f29c50d2996a9efe20253be9f15 Author: ghosTM55 Date: Sun Mar 14 14:28:48 2010 +0800 新文件来了,旧文件改了 commit c06c4e5ebc3a5281a3400c31c20e95ebd43f1547 Author: ghosTM55 Date: Sun Mar 14 13:36:02 2010 +0800 第一次提交
可以看到,git详细记录了每次commit的信息(checksum值、提交者信息、提交时间)。
相关推荐
Git入门到实践 高清 有目录
"猴子都能懂的Git入门-整站"是一个专门为初学者设计的Git学习资源,旨在用简单易懂的方式讲解Git的基础知识,并逐步引导进阶到高级应用。 入门篇主要涵盖以下内容: 1. Git安装:讲解如何在Windows、Mac OS X和...
"猴子都能懂的GIT入门"这个主题,旨在让初学者,甚至是对技术不太熟悉的人都能轻松理解Git的基本概念和操作。Git的核心价值在于它能够跟踪代码的历史版本,允许团队成员在不影响主分支的情况下各自开发,然后通过...
例如,`git branch`用于管理分支,`git merge`用于合并分支,`git log`查看提交历史,`git reset`回退到某个版本,以及`git push`和`git pull`用于与远程仓库交互。理解并熟练掌握这些命令,将使你在Git的世界中...
### Git教程从入门到精通——知识点详解 #### 一、Git简介 - **Git是什么**:Git是一款目前世界上最先进的分布式版本控制系统。它被设计用于高效处理从小型到大型项目的版本控制,尤其适合软件开发项目。 - **Git...
总结,Git入门与精通不仅涉及基本概念和命令,还包括对版本控制的理解,远程仓库的协作,以及各种工作流的实践。通过深入学习和不断练习,无论是个人项目还是团队协作,Git都能成为你强大的工具。
本文档旨在为git入门学者提供全面的基础知识和实用技巧,帮助安卓手机开发者更好地理解和应用git。 1. **Git基础概念** - **版本控制**:Git的核心功能是管理文件的不同版本,它记录每一次修改,便于回溯和协作。 ...
总的来说,这份文档提供了一个全面的Git入门指南,涵盖了从安装到实际操作的所有基本步骤,对于初学者来说是一份非常实用的学习资源。配合提供的视频教程,学习者可以更直观地理解Git的工作原理和实践操作。
本篇文章将为初学者提供一个简明的Git入门教程,涵盖了Git与SVN的区别、Git分支与流程、以及一些基础命令的使用。 ### Git与SVN的区别 首先,我们需要了解Git与另一款常用的集中式版本控制系统SVN的主要差异。SVN...
"Github入门与实践+精通Git"这个主题涵盖了从初识Git到深入理解GitHub的全过程,旨在帮助用户掌握这一强大的工具。 首先,Git是Linux创始人Linus Torvalds为Linux内核开发而创建的,它提供了一个安全的环境,可以...
《Python数据挖掘入门与实践》是一本面向初学者的指南,旨在帮助读者掌握使用Python进行数据挖掘的基础知识和技能。本书结合理论与实践,通过实际案例解析,让读者能够逐步理解并应用Python在数据预处理、数据探索、...
Git是一种分布式版本控制系统,与传统的集中式版本控制系统(如CVS、SVN)不同,每个开发者的本地机器上都有一个完整的仓库,可以进行提交和分支等操作,无需依赖中央服务器。这使得Git在离线环境或网络不稳定时...
【Git入门教程1】 Git是一种分布式版本控制系统,相较于CVS和SVN,它拥有许多显著的优势,这使得酷讯公司选择了Git作为其软件版本管理工具。Git的主要特点包括: 1. **简易初始化**:使用`git init`和`git commit ...
这个“git入门学习实验笔记”涵盖了在Linux环境中开始使用Git的基本步骤和概念。以下是一些关键知识点的详细解释: 1. **安装Git**: 在Linux系统中,可以通过包管理器(如apt-get for Ubuntu/Debian或yum for ...
这份《Git Hub 入门与实践》的PDF教程,将帮助初学者快速掌握 Git 和 Git Hub 的基本操作,并深入理解其在实际项目中的应用。 1. **Git基础概念** - **Git**:Git 是一个分布式版本控制系统,由 Linux 之父 Linus ...
总结来说,这个Git入门教程涵盖了基础的Git操作,包括分支管理、提交更改、查看状态、合并分支和与远程仓库交互。通过实践这些命令,你可以更好地掌握Git,并享受到它带来的代码管理和协同工作的便利。记得经常使用`...
### Git 最全笔记整理——Git 入门必备 #### 一、Git 是什么? Git 是一种分布式版本控制系统,主要用于跟踪计算机文件的更改,并协调多个用户之间的协作。它最初由 Linus Torvalds 在 2005 年为了更好地管理 ...
本资料包"git入门知识及常用命令分享.zip"旨在帮助初学者快速掌握Git的基本操作和常用命令,以便更好地进行代码管理和协作。 一、Git基础概念 1. 仓库(Repository):存储项目所有版本信息的地方,可以本地创建或...