Git学习分享

回复 收藏
一、常用的代码控制系统

集中式:CVS、SVN、ClearCase、VSS
分布式:Git、BitKeeper、Mercurial、Bazaar

二、集中式版本控制系统和分布式版本控制系统1.集中式版本控制系统:版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。中央服务器就好比是一个图书馆,你要改一本书,必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆。必须联网才能工作,每次都需要下载很多文件
1.png


http://file:///C:/Users/szk/AppData/Local/YNote/data/qqC911E522586952C3F413B8CDDA09F207/1b9e03aed0e247edbc2ceadd80e16c53/clipboard.png
2.分布式版本控制系统:分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
http://file:///C:/Users/szk/AppData/Local/YNote/data/qqC911E522586952C3F413B8CDDA09F207/e05920485c314519a2d875478d1d7d88/clipboard.png
2.png


三、安装Git
1.linux:
yum install git 或sudo apt-get install git

2.Mac OS X:
a.安装homebrew,然后通过homebrew安装Git
b.从AppStore安装Xcode,Xcode集成了Git,不过默认没有安装,你需要运行Xcode,选择菜单“Xcode”->“Preferences”,在弹出窗口中找到“Downloads”,选择“Command Line Tools”,点“Install”就可以完成安装

3.windows
msysgit是Windows版的Git,从https://git-for-windows.github.io下载
http://pan.baidu.com/s/1skFLrMt#path=%252Fpub%252Fgit (国内镜像)


四、配置Git
1.自报家门
[root@Web_server ~]# git config --global user.name "Shenzhengkai"
[root@Web_server ~]# git config --global user.email "szk5043@foxmail.com"
#因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址。


2.创建版本库
版本库可以理解为根目录,这个目录里面的所有文件都可以被Git管理起来
[root@Web_server ~]# mkdir /learngit
[root@Web_server ~]# cd /learngit/
[root@Web_server learngit]# pwd
/learngit
#创建一个空目录,如果你使用Windows系统,为了避免遇到各种莫名其妙的问题,请确保目录名(包括父目录)不包含中文
[root@Web_server learngit]# git init
Initialized empty Git repository in /learngit/.git/
[root@Web_server learngit]# ls -ah
.  ..  .git
#版本库创建好了,当前目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的,千万不能手动修改此目录里面的文件


3.文件添加到版本库
所有的版本控制系统,其实只能跟踪文本文件的改动,比如TXT文件,网页,所有的程序代码等等,Git也不例外。版本控制系统可以告诉你每次的改动,比如在第5行加了一个单词“Linux”,在第8行删了一个单词“Windows”。而图片、视频这些二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是只知道图片从100KB改成了120KB,但到底改了啥,版本控制系统不知道,也没法知道。
不幸的是,Microsoft的Word格式是二进制格式,因此,版本控制系统是没法跟踪Word文件的改动的;千万不要使用Windows自带的记事本编辑任何文本文件。原因是Microsoft开发记事本的团队使用了一个非常弱智的行为来保存UTF-8编码的文件,他们自作聪明地在每个文件开头添加了0xefbbbf(十六进制)的字符,你会遇到很多不可思议的问题


[root@Web_server learngit]# cat readme.txt
Git is a version control system.
Git is free software.
#一定要放到learngit目录下(子目录也行),因为这是一个Git仓库,放到其他地方Git再厉害也找不到这个文件


[root@Web_server learngit]# git add readme.txt
#第一步,告诉Git,把文件添加到仓库
[root@Web_server learngit]# git commit -m "wrote a readme file"
[master (root-commit) f034454] wrote a readme file
1 files changed, 2 insertions(+), 0 deletions(-)
create mode 100644 readme.txt
#第二步,告诉Git,把文件提交到仓库


简单解释一下git commit命令,-m后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。

嫌麻烦不想输入-m "xxx"行不行?确实有办法可以这么干,但是强烈不建议你这么干,因为输入说明对自己对别人阅读都很重要。实在不想输入说明的童鞋请自行Google,我不告诉你这个参数。

git commit命令执行成功后会告诉你,1个文件被改动(我们新添加的readme.txt文件),插入了两行内容(readme.txt有两行内容)。


4.小结
初始化一个Git仓库,使用git init
添加文件到Git仓库,分两步

  • 第一步,使用命令git add ,注意可反复多次使用,添加多个文件
  • 第二步,使用命令git commit,完成修改的注释

待续。。。。。。。。


2016-05-20 16:01 举报
已邀请:
0

清茶一杯

赞同来自:

哆来A梦的时光穿梭机
修改readme.txt文件如下,提交到Git版本库[root@Web_server learngit]# cat  readme.txt
Git is a distributed version control system.
Git is free software distributed under the GPL.

#然后尝试提交
[root@Web_server learngit]# git add readme.txt
[root@Web_server learngit]# git commit -m "apped GPL"
[master 395270a] apped GPL
1 files changed, 2 insertions(+), 2 deletions(-)

像这样不断对文件进行修改,然后不断提交修改到版本库里,就好比玩RPG游戏时,每通过一关就会自动把游戏状态存盘,如果某一关没过去,你还可以选择读取前一关的状态。有些时候,在打Boss之前,你会手动存盘,以便万一打Boss失败了,可以从最近的地方重新开始。Git也是一样,每当你觉得文件修改到一定程度的时候,就可以“保存一个快照”,这个快照在Git中被称为commit。一旦你把文件改乱了,或者误删了文件,还可以从最近的一个commit恢复,然后继续工作,而不是把几个月的工作成果全部丢失。

回顾一下readme.txt文件一共有几个版本被提交到Git:
版本1:wrote a readme file
Git is a version control system.
Git is free software.

版本2: append GPL
Git is a distributed version control system.
Git is free software distributed under the GPL.

当然了,在实际工作中,我们脑子里怎么可能记得一个几千行的文件每次都改了什么内容,不然要版本控制系统干什么。版本控制系统肯定有某个命令可以告诉我们历史记录,在Git中,我们用git log命令查看:

[root@Web_server learngit]# git log
commit 395270a7fc2d606ec410a5c813fd9a8d595092ee
Author: Shenzhengkai <szk5043@foxmail.com>
Date:   Fri May 20 17:02:06 2016 +0800

    apped GPL

commit f034454595daf1160d4c407cb8f4086ceba8615f
Author: Shenzhengkai <szk5043@foxmail.com>
Date:   Fri May 20 15:53:02 2016 +0800

    wrote a readme file

git log命令显示从最近到最远的提交日志,我们可以看到3次提交,最近的一次是append GPL,最早的一次是wrote a readme file。

[root@Web_server learngit]# git log --pretty=oneline
395270a7fc2d606ec410a5c813fd9a8d595092ee apped GPL
f034454595daf1160d4c407cb8f4086ceba8615f wrote a readme file

需要友情提示的是,你看到的一大串类似395270a7fc...f034454595的是commit id(版本号),和SVN不一样,Git的commit id不是1,2,3……递增的数字,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示,而且你看到的commit id和我的肯定不一样,以你自己的为准。为什么commit id需要用这么一大串数字表示呢?因为Git是分布式的版本控制系统,后面我们还要研究多人在同一个版本库里工作,如果大家都用1,2,3……作为版本号,那肯定就冲突了。

好了,现在我们启动时光穿梭机,准备把readme.txt回退到上一个版本,也就是“add distributed”的那个版本,怎么做呢?

首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交3628164...882e1e0(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。

现在,我们要把当前版本回退到上一个版本,就可以使用git reset命令:

[root@Web_server learngit]# git reset --hard HEAD^
HEAD is now at f034454 wrote a readme file
[root@Web_server learngit]# cat readme.txt
Git is a version control system.
Git is free software.

我们用git log再看看现在版本库的状态:

[root@Web_server learngit]# git log
commit f034454595daf1160d4c407cb8f4086ceba8615f
Author: Shenzhengkai <szk5043@foxmail.com>
Date:   Fri May 20 15:53:02 2016 +0800

    wrote a readme file

从21世纪坐时光穿梭机来到了19世纪,想再回去已经回不去了,肿么办?

办法其实还是有的,只要上面的命令行窗口还没有被关掉,你就可以顺着往上找啊找啊,找到那个append GPL的commit id是3628164...,于是就可以指定回到未来的某个版本:
[root@Web_server learngit]# git reset --hard 395270a7fc2d
HEAD is now at 395270a apped GPL
[root@Web_server learngit]# cat readme.txt
Git is a distributed version control system.
Git is free software distributed under the GPL.

果然,我胡汉三又回来了。

Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD指针,当你回退版本的时候,Git仅仅是把HEAD从指向append GPL:

现在,你回退到了某个版本,关掉了电脑,第二天早上就后悔了,想恢复到新版本怎么办?找不到新版本的commit id怎么办?

在Git中,总是有后悔药可以吃的。当你用$ git reset --hard HEAD^回退到add distributed版本时,再想恢复到append GPL,就必须找到append GPL的commit id。Git提供了一个命令git reflog用来记录你的每一次命令:
[root@Web_server learngit]# git reflog
395270a HEAD@{0}: 395270a7fc2d: updating HEAD
f034454 HEAD@{1}: HEAD^: updating HEAD
395270a HEAD@{2}: commit: apped GPL

小结

现在总结一下:

HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id。

穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。

要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。

0

100

赞同来自:

标记学习

回复帖子,请先登录注册

退出全屏模式 全屏模式 回复
评分
可选评分理由: