初学者如何学习Git

版本控制系统Git的学习历程

作者:叶钱峰
时间:2015/5/22
在几个比较有名的版本管理工具中, Git 是现在公认的功能最完善的,也是使用最广泛的。
本人也是初学Git,下面就让我谈谈在学习Git的过程中有哪些心得体会,也是想和大家交流交流。

首先当然是 git 的安装了
本人用的是基于 UbuntuLinux mint 系统,安装 git 非常简单,只需在终端执行命令:

  • sudo apt-get install git

就可以安装最新版的 git 了。
其他的比如 Windows 也非常简单,去 Git官网 下载相应的安装包进行就可以了。


初学者学习Git主要是能熟练使用以下几个命令

git clone
git init
git add
git commit
git remote
git pull
git push

下面就介绍几个命令该怎么使用

一、git clone

用法:

  • git clone <URL>

URL为你的版本仓库的网址,或者是别人的开源项目的仓库网址,例如要克隆我的 github 仓库的 Demo 项目,你就需要在一个你选定的目录下执行下面的命令

  • git clone git@github.com:yeqf911/Demo.git

这样 Demo 项目就会被克隆到你指定的目录下了

二、git init

此命令的作用是初始化一个本地仓库,如果你想使用 Git 管理你的某个项目,那么在你的项目的目录下执行该命令,此时该目录下会产生一个 .git 的隐藏目录,说明该项目已经被初始化为一个 git 项目了。之后你还可以进行一些设置,例如:
设置你的姓名和邮箱:

  • git config --glogal user.name xiaoming
  • git config --global user.email xiaomiang@gmail.com

(注:此处用--global表示是该用户的全局配置,此配置信息储存在用户家目录下 的.gitconfig文件里面。如果你不用global关键字,则设置的信息就只针对该项目而言,其配置信息会保存在 /project/.git/config 文件里。)

设置你的默认编辑器(此处我设置为vim)

  • git config --global core.editor vim

稍后你还可以用下面的命令来查询你的设置信息

  • git config --list

三、git add And git commit

为什么将这两个命令放在一起说呢?原因是这两个命令关系很密切。在你初始化一个本地仓库后,git 会有三个区域,分别是工作暂存区版本库


工作区:顾名思义,这是你编辑文件和写代码的地方,在这里你可以修改任意的文件,执行添加和删除操作。工作区是你在电脑上实际能看得见的目录。


暂存区:理解暂存区对刚接触 git 的人并不是很容易,我当时也是看了很多技术博客才懂。为了加深理解,我们不妨先创建一个git项目,并且创建一个文本文件

  • mkdir testGit
  • cd testGit
  • git init
  • echo "love" >> test.txt

这时候我们运行git status命令查看一下:

On branch master
Initial commit

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)

可以看到 text.txt 文件的状态是 Untrack files(未跟踪的),说明该文件目前还未被 git 跟踪,对于 git 来说,它甚至不存在!这时候就要讲到我们的git add命令了(实际上提示信息也提示我们使用git add <file>...),运行:

  • git add test.txt

之后再次运行git status查看一下文件状态:

On branch master
Initial commit

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

    new file:   test.txt

可以看到现在 test.txt 的状态变成了 Changes to be committed ,并且文件名前面有一个 new file 的标识。这说明 test.txt 文件已经开始被 git 跟踪了,并且是一个 new file .
现在试试修改一下这个文件:

  • echo "more love" >> test.txt

再次git status看看:

On branch master
Initial commit

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

    new file:   test.txt

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.txt

诶?是不是很奇怪?竟然出现了两个 test.txt 文件!其实原因就在于 工作区暂存区 的区别了。
事实上,当你第一次使用 git add test.txt 后, git 就在暂存区保存了 test.txt 的一个快照(关于快照这里就不作解释了,如果想了解,还请读者自行谷歌),也就是 Changes to be committed 下面的那个 new file: test.txt
而在这之下的 Changes not staged for commit 下的 modified: test.txt 则是保存在你的工作区里的。也就是说:你刚才所做的修改目前只是在你的工作区,并没有影响到之前已经 add 到暂存区里的文件,如果想把刚才的修改也存到暂存区,你就去要再次执行:

  • git add test.txt

这次我们再执行git status看看:

On branch master
Initial commit

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

    new file:   test.txt

是不是又变成一个了~,到这里可能有同学又会产生疑问:为什么我 add 了两次了,还是显示 new file 呢?原因在于你还没有把文件提交到版本库中去。


版本库:你可以根据名字把它理解为保存你的项目在开发过程中的各个版本的地方。你的每一次提交,版本库里都会保存本次提交时的版本,提交的命令就是git commit了。之所以 test.txt 文件 add 了两次还是 new file,就是因为虽然该文件已经被 git 跟踪了,但你还没有把它提交到版本库,对于 git 来说它就是新的文件。我们来执行:

  • git commit

再次git status看看,你会发现这时终端会跳转到一个编辑器页面,这是要求你添加提交信息,你可以在这里写版本号或者其他提交信息,写完保存退出就好了。也可以使用:

  • git commit -m "添加了一个新文件"

这样就不用进入编辑器了。执行完会有下面的提示信息:

[master (root-commit) 7e8cd63] 添加了一个新文件
 1 file changed, 2 insertions(+)
 create mode 100644 test.txt

再次git status就变成:

On branch master
nothing to commit, working directory clean

再次修改文件 test.txt

  • echo "love again" >> test.txt

然后git status

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.txt

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

可以看到 test.txt 的状态变为 Changes not staged for commit 意思是文件被修改了但是还没有存到暂存区。这时再运行

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

    modified:   test.txt

现在就不是 new file 了,add之后别忘了提交哦:

  • git commit -m "修改了test.txt文件"

每个版本都会有一个哈希值来区别开来,你可以用git reflog命令来查看这些信息,如:

7f79dfe HEAD@{0}: commit: 修改了test.txt文件
7e8cd63 HEAD@{1}: commit (initial): 添加了一个新文件

你也可以用命令git reset --hard 哈希值来回退到项目任意一次提交的版本中去。如:

git reset --hard 7e8cd63
#    HEAD is now at 7e8cd63 添加了一个新文件

四、git remote

用法:

  • git remote add origin <URL>

URL是你的远程仓库的地址,意思是为你的本地仓库添加一个远程仓库与之关联。比如你在 Git@OSC 上新建一个项目名为testGit,然后把你的本地仓库与之关联起来,就像这样:

  • git remote add origin git@git.oschina.net:yeqf/testGit.git

origin 是你的远程仓库在本地的别名,以代替长长的网址,名字可以随便起,一般用 origin 。你可以添加多个远程仓库与本地仓库关联,只要名字区分开来就行了。还可以用:

  • git remote remove <别名>

来删除一个远程仓库,即取消其与本地仓库的关联。
如果你是第一次使用 Git 远程仓库,你会遇到 SSH Keys 的问题,有关于 SSH Keys 的问题请看这里如何生成SSH密钥
添加了远程仓库之后可以用:

  • git remote -v

来查看远程仓库信息。再之后你就可以把本地仓库上传到远程仓库了。


五、git push And git pull

将自己的本地仓库上传到远程仓库的命令是:

  • git push -u origin master:master

命令的解释是:

  • git push -u <远程仓库名> <本地分支>:<远程分支>

第一次上传加了参数-u,目的是将当前本地分支与远程分支关联起来,以后再上传就可以省略它。如果你不加:master,默认就是上传到远程仓库的主分支上,也就是 master 分支上,你也可以上传到远程仓库的其他分支上,如果分支不存在则创建之。

有一点需要注意,那就是 push 之前要先执行:

  • git pull origin master:master

命令的解释是:

  • git pull <远程仓库名> <远程分支>:<本地分支>

这是将远程仓库的master分支内容同步到本地仓库的master分支。这样做的目的是避免冲突的产生,想想:如果这是你跟别人合作的项目,别人再你上传之前也上传了他的本地仓库,这样远程仓库的内容就会比你的本地仓库新,如果这样的话直接 push 的话 git 是会提示你这样做是不可以的,如果你一定上传,也可以用 -f参数,就像:

  • git push origin master -f

这样的话就会让你的本地仓库覆盖掉远程仓库,包括别人修改的内容也一并覆盖掉了,显然这样做是及其危险的,不建议大家使用这种方式。


到这里 git 的简单使用就介绍完了,初学者可以先掌握这些命令,基本上就能购应付日常的工作了,当然 git 还有很多更加高级的特性以及操作,本人也在继续探索当中,希望能跟大家共同学习。
还有就是第一次写博客,有写的不到位或者有错的地方还请大家及时指出 : )
posted @ 2015-05-22 14:54  Telemaketers  阅读(321)  评论(0)    收藏  举报