目录

1、安装篇

2、初始化,创建版本库

3、最最基本的命令

4、工作区与暂存区概念

5、git让你不再犯错

    5.1、版本回退

    5.2、管理修改

    5.3、撤销修改

    5.4、删除文件

6、远程仓库的使用

    6.1、添加远程仓库到本地

    6.2、从远程仓库克隆

未完、等续……

1、安装篇

1.1、windows下的安装

 前往这里下载windows下的git版本

 前往这里下载windows下的git版本http://msysgit.github.io/,安装非常简单,除了修改一下安装路径外,其他的全部默认安装即可。安装好后开始菜单中会有“Git Gui”和“Giit Bash”,还有在右键菜单中除了前边的两个选项外还多出了“Git Init Here”。“Git Gui”表示Git的图形窗口,“Giit Bash”表示Git的命令行窗口,“Git Init Here”表示把一个目录初始化成一个Git库。

    安装好后,点击开始-->所有程序-->git-->Git Bash,如果能跳出下这的窗口,那就证明git安装成功了,如下图:

wKiom1UJIyTwtK6XAAFRt4KiK2A454.jpg

1.2、Linux下安装Git

    以Centos来说明,先在命令行下执行一下“git”命令,你会看到此发行版本下一般都会默认安装好Git,下边的服务器我选择了几个开发库组手工安装也包含了Git这个工具。

wKioL1UJJJjQ_Ss4AAHkdemjz7M587.jpg

如果Linux下没有安装Git工具,那就使用yum命令安装即可,当然也要使用源码的方式来安装

[root@jason ~]# yum -y install git

因Git是一个分布式的版本控制系统,所以安装好Git后,用户还得自报家门,如下:

[zhaochj@jason ~]$ git config --global user.name "zhaochj"
[zhaochj@jason ~]$ git config --global user.email "419775240@qq.com"
# 这个“--global”这个选项表示此计算机上的所有仓库都是使用这个配置了。

2、初始化,创建版本库

[zhaochj@jason ~]$ mkdir mygitrepo
[zhaochj@jason ~]$ cd mygitrepo/
[zhaochj@jason mygitrepo]$ pwd
/home/zhaochj/mygitrepo
[zhaochj@jason mygitrepo]$ git init  #初始化
Initialized empty Git repository in /home/zhaochj/mygitrepo/.git/
[zhaochj@jason mygitrepo]$ ls .git/
branches  config  description  HEAD  hooks  info  objects  refs

版本库创建好后,当前目录会多出一个隐藏的git目录,此目录就是用来追踪管理版本库,一定不要去修改此目录下的文件。

在这个仓库中增加一个文件进来试试:

[zhaochj@jason mygitrepo]$ cp /etc/fstab ./
[zhaochj@jason mygitrepo]$ git status
# On branch master
#
# Initial commit
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#	fstab   
nothing added to commit but untracked files present (use "git add" to track)
# git status的输出信息告诉我们在master分支上fstab这个文件没有被git追踪到。
[zhaochj@jason mygitrepo]$ git add fstab  #把文件添加到仓库
[zhaochj@jason mygitrepo]$ ls .git/
branches  config  description  HEAD  hooks  index  info  objects  refs

把一个文件添加到仓库后,git这个隐藏目录下会多出一个“index”文件,这个文件就是后边所讲的暂存区的概念。

3、最最基本的命令

先来了解几个git中最最基本的操作命令:

[zhaochj@jason mygitrepo]$ git status #显示git追踪文件的状态信息
[zhaochj@jason mygitrepo]$ git add 文件名称   #把文件添加到仓库,这里其实就是把文件从工作区扔到了暂存区
[zhaochj@jason mygitrepo]$ git commit --message="提交的说明信息"   #把文件提交到了版本库,其实就是把文件从暂存区提交到了当前分支,“--message=”可简写成“-m”
[zhaochj@jason mygitrepo]$ git log --pretty=oneline  #显示用户的提交日志
[zhaochj@jason mygitrepo]$ git reflog  #显示用户所用的操作日志
[zhaochj@jason mygitrepo]$ git diff HEAD -- 文件名  #比较工作区文件与版本库中最新版本的区别

4、工作区与暂存区概念

工作区:就是用户所在的目录,我这里就是“/home/zhaochj/mygitrepo”,用户在工作区是对文件进行修改操作。

暂存区:在工作区中有一个隐藏的git目录,这个目录不算是工作区,这是git的版本库,其中有一个index的文件,被称为暂存区;还一个master分支和一个HEAD指针文件。

    往版本库目录上添加文件就是把文件增加到了工作区,比如上边的“cp /etc/fstab ./”,再用“git add fstab”命令则把fstab文件从工作区添加到了存储区中,如果再用“git commit -m “提交信息"”那刚是把fstab文件从暂存区提交到了当前的分支中。

    一定要建立起工作区和暂存区的的概念,只有理解了这两个区域的含义才能明白git中许多命令操作操作背后git都做了什么动作,用户在使用利用git这个工具时多数也就是在这两个区域中移动。当“[zhaochj@jason mygitrepo]$ git add fstab“时,git是这样的:

wKiom1UJJLvxZ_o4AADocNK1Qlk051.jpg

当“[zhaochj@jason mygitrepo]$ git commit --message "cp /etc/fstab"”时,git是这样的:

wKioL1UJJhHj4sXjAADpfSGXkiw347.jpg

5、git让你不再犯错

5.1、版本回退

 目前工作区是有了fstab文件,并已提交到了版本库中。现在我往fstab文件的最后新增加了一行“/dev/sdb1               /mnt/test               ext4    defaults        0 0”

[zhaochj@jason mygitrepo]$ vim fstab
#
# /etc/fstab
# Created by anaconda on Thu Feb 26 18:48:59 2015
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=0ab66e1a-f92d-4803-ab61-3d08f9664818 /                       ext4    defaults        1 1
UUID=5ccd037f-5010-459c-8d39-cca30bf21a54 /boot                   ext4    defaults        1 2
UUID=a1457d82-f8c7-497a-a34a-7b7e983c112f /opt                    ext4    defaults        1 2
UUID=ca82d253-8968-4122-b85d-4d0db84d1bab swap                    swap    defaults        0 0
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
/dev/sdb1               /mnt/test               ext4    defaults        0 0
[zhaochj@jason mygitrepo]$ git add fstab  #提交到暂存区
[zhaochj@jason mygitrepo]$ git commit --message "add /dev/sdb1"  #提交到版本库
[master a7f78cc] add /dev/sdb1
 1 files changed, 1 insertions(+), 0 deletions(-)

再增加一行后提交:

[zhaochj@jason mygitrepo]$ echo "/dev/sdb2         /mnt/test1    ext4   default    0 0" >> fstab
[zhaochj@jason mygitrepo]$ git add fstab
[zhaochj@jason mygitrepo]$ git commit --message='add /dev/sdb2'
[master d3564b9] add /dev/sdb2
 1 files changed, 1 insertions(+), 0 deletions(-)

这样我们就有了三个版本了,用“git log --pretty=one”可查看提交日志信息:

[zhaochj@jason mygitrepo]$ git log --pretty=one
d3564b9b671ef86ab257755d77fe363e597dad36 add /dev/sdb2
a7f78ccb62f310fbf6739c0e5231e1df16049689 add /dev/sdb1
7fa34d934689a27465719d021f42533ed23aa677 cp /etc/fstab

在版本回退之前我们要知道当前版本,在git中用HEAD来表示当前版本,当前版本的上一个版本用“HEAD^”表示,如果是想回退到前n个版本处呢,那就用“HEAD~n”。现在开始版本回退操作,当前版本是“add /dev/sdb2”,现在我要回退到它的上一个版本“add /dev/sdb1”,如下操作:

[zhaochj@jason mygitrepo]$ git reset --hard HEAD^
HEAD is now at a7f78cc add /dev/sdb1

这们版本就回退到了“add /dev/sdb1”处,如果你后悔这个操作,又想恢复到“add /dev/sdb2”这个版本,那通过版本ID的方式来切换,用“git reflog”这个命令可以查看到用户做的操作,如下:

[zhaochj@jason mygitrepo]$ git reflog
a7f78cc HEAD@{0}: HEAD^: updating HEAD
d3564b9 HEAD@{1}: commit: add /dev/sdb2
a7f78cc HEAD@{2}: commit: add /dev/sdb1
7fa34d9 HEAD@{3}: commit (initial): cp /etc/fstab

这样可获取到各个版本的ID,如下操作可回退到“add /dev/sdb2”:

[zhaochj@jason mygitrepo]$ git reset --hard d3564b9
HEAD is now at d3564b9 add /dev/sdb2
[zhaochj@jason mygitrepo]$ git log --pretty=oneline
d3564b9b671ef86ab257755d77fe363e597dad36 add /dev/sdb2
a7f78ccb62f310fbf6739c0e5231e1df16049689 add /dev/sdb1
7fa34d934689a27465719d021f42533ed23aa677 cp /etc/fstab

5.2、管理修改

    git对版本的跟踪是针对的修改,可不是针对的文件,我们重新建立一个测试文件来说明其中的道理。

[zhaochj@jason mygitrepo]$ vim gitlearing
git tracks changes.
[zhaochj@jason mygitrepo]$ git add gitlearing
[zhaochj@jason mygitrepo]$ vim gitlearing  #再对文件进行修改
git trachks changes of files.
[zhaochj@jason mygitrepo]$ git commit --message 'git track changes'  #提交到版本库
[zhaochj@jason mygitrepo]$ git status
# On branch master
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#	modified:   gitlearing
#
no changes added to commit (use "git add" and/or "git commit -a")

查看状态时可发现,在工作区有修改没有被提交。这是因为第二次修改文件时没有“git add gitlearing”操作,第二次的修改没有被加入到暂存区,所以在执行“git commit”时只是把第一次提交到暂存区的修改提交到了版本库,而第二次的修改只是保留在了工作区里,所以git的状态报告会如此。

那我们怎样来查看当前工作区里的文件与当前版本库中最新版本文件的区别呢?使用以下命令即可:

[zhaochj@jason mygitrepo]$ git diff HEAD -- gitlearing
diff --git a/gitlearing b/gitlearing
index 8d73f8c..23f0ddb 100644
--- a/gitlearing
+++ b/gitlearing
@@ -1 +1 @@
-git tracks changes.               #表示当前工作区里没有此行
+git tracks changes of files.了  #表示当前工作里多了此行

所以,要想把修改更新到版本库时,那一定要先把修改提交到暂存区,再更新到版本库。如下操作即可:

[zhaochj@jason mygitrepo]$ git add gitlearing
[zhaochj@jason mygitrepo]$ git commit --message 'git tracks changes'
[master 17bd370] git tracks changes
 1 files changed, 1 insertions(+), 1 deletions(-)

5.3、撤销修改

分以下几种情况

第一:在工作区中发现输入错误,那就在工作区中进行修改即可,如果修改的东西太多,你都不确定哪些修改过,那就回到与版本库中的一样就行;

第二:工作区中进行了修改,又提交到了暂存区,再对工作区中的文件进行了修改,撤销修改就回到与暂存区中的状态。

例子:

[zhaochj@jason mygitrepo]$ git status
# On branch master
nothing to commit (working directory clean)
[zhaochj@jason mygitrepo]$ cat gitlearing
git tracks changes of files.
[zhaochj@jason mygitrepo]$ echo "i do not like her." >> gitlearing
[zhaochj@jason mygitrepo]$ git add gitlearing
[zhaochj@jason mygitrepo]$ echo "i am so sorry." >> gitlearing
[zhaochj@jason mygitrepo]$ git status
# On branch master
# Changes to be committed:    #表示有修改已提交到了暂存区了
#   (use "git reset HEAD <file>..." to unstage)
#
#	modified:   gitlearing
#
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)  #有这个提示表示工作区有了修改没有提交到暂存区
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#	modified:   gitlearing
#

如果这时我们想回退到起先的版本,应该这样来操作:

a)、先放弃已放到暂存区的修改

[zhaochj@jason mygitrepo]$ git reset HEAD gitlearing 
[zhaochj@jason mygitrepo]$ git status
# On branch master
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#	modified:   gitlearing
#
no changes added to commit (use "git add" and/or "git commit -a")

b)、再撤销工作区的修改,即从版本库中获取到最新的版本来替换工作区的文件

[zhaochj@jason mygitrepo]$ git checkout -- gitlearing
[zhaochj@jason mygitrepo]$ cat gitlearing
git tracks changes of files.

5.4、删除文件

在使用git时有一个很重要的思想,对文件的任何操作都是修改,git都会为我们记录下来,那删除操作也不例外。还是以一个例子来说明,如下:

如果不想要gitlearing这个文件了,那直接删除

[zhaochj@jason mygitrepo]$ git status
# On branch master
nothing to commit (working directory clean)
[zhaochj@jason mygitrepo]$ cat gitlearing
git tracks changes of files.
[zhaochj@jason mygitrepo]$ rm -rf gitlearing
[zhaochj@jason mygitrepo]$ git status
# On branch master
# Changed but not updated:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#	deleted:    gitlearing
#
no changes added to commit (use "git add" and/or "git commit -a")

这样删除了文件可没完,版本库可不知道这个文件你已经删除了,所以还得做下边的事情:

[zhaochj@jason mygitrepo]$ git rm gitlearing
[zhaochj@jason mygitrepo]$ git commit --message 'remove gitlearing'

在在版本库中删除文件可不是真正的删除文件,如果你手一抖,删错了文件呢?版本库中还有这相文件,可以恢复的。

[zhaochj@jason mygitrepo]$ git reflog  #先查看一下提交版本历史
1664af4 HEAD@{0}: commit: remove gitlearing
17bd370 HEAD@{1}: commit: git tracks changes
03d5739 HEAD@{2}: commit: git track changes
d3564b9 HEAD@{3}: d3564b9: updating HEAD
a7f78cc HEAD@{4}: HEAD^: updating HEAD
d3564b9 HEAD@{5}: commit: add /dev/sdb2
a7f78cc HEAD@{6}: commit: add /dev/sdb1
7fa34d9 HEAD@{7}: commit (initial): cp /etc/fstab

[zhaochj@jason mygitrepo]$ git reset --hard 17bd370  #恢复到之前更新到版本库的版本,如果指向”remove gitlearing“的ID,那文件是恢复不了的,因为这个ID记录的是已删除文件的状态,此时,那文件已经被删除了。
[zhaochj@jason mygitrepo]$ cat gitlearing
git tracks changes of files.

6、远程仓库的使用

以github为例来说明怎么使用远程仓库,没有github的帐号,那就去注册一个吧”https://github.com/“。

本地与远程的github的连接采用ssh的方式,所要做如下的操作:

a)、生成私钥和公钥文件

[zhaochj@jason ~]$ ssh-keygen -t rsa -C '419775240@qq.com'  #生成公钥和私钥
Generating public/private rsa key pair.
Enter file in which to save the key (/home/zhaochj/.ssh/id_rsa):
Created directory '/home/zhaochj/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/zhaochj/.ssh/id_rsa.
Your public key has been saved in /home/zhaochj/.ssh/id_rsa.pub.
The key fingerprint is:
c9:a2:f1:5a:46:2b:8f:74:5c:0d:d7:d0:45:63:8a:f3 419775240@qq.com
The key's randomart p_w_picpath is:
+--[ RSA 2048]----+
|          .. o=  |
|           +.o . |
|        . + o    |
|       . = o     |
|    . o S . E    |
|     * +         |
|    + B          |
|   . O           |
|    o .          |
+-----------------+

b)、在github网站设置,点击”设置“按键

wKioL1UJKO6jbLpbAABij1ax4Ko561.jpg

打开”ssh keys“设置界面,点击”add ssh key“,填上一个"Tile",再把上边得到的".ssh/id_rsa.pub"的内容粘贴进来

wKiom1UJJ-3CrMDqAASQZ-mkD9E700.jpg最后点击”Add key“就完成了操作。


6.1、添加远程仓库到本地

    目前我在本地有了一个名为”mygitrepo“的仓库,那可以在github也建立一个仓库,并把两者联系起来,让两者能同步,github上的仓库可以作为备份。首先在github上建立一个名为”learning“的仓库,如下图:

wKiom1UJKE_CT61dAANzHmygocg091.jpg

建好后,learning是一个空的仓库,如下图:

wKiom1UJKH_hsC4MAARbYJ7_9e0438.jpg

那怎么把本地仓库与github上的仓库进行关联,并把本地仓库推送到github呢,根据上图中的提示作如下操作:

[zhaochj@jason mygitrepo]$ git remote add origin git@github.com:zhaochj/learning.git   #这里的”zhaochj“是自己的github登陆名哟
[zhaochj@jason mygitrepo]$ git push -u origin master #把本地仓库推送到origin远程仓库的master分支,第一次推送要加上”-u“

推送完成后就如下图所示要看到版本库中的文件了:

wKioL1UJKfLj-uhZAANvcp8YQnY438.jpg

通过第一次与远程仓库同步后,再对本地仓库中的文件进行修改后,并且已更新到本地版本库中的文件,用如下命令就可直接同步到远程的github上:

[zhaochj@jason mygitrepo]$ git push origin master  #不用”-u“参数

6.2、从远程仓库克隆

如果发起一个新兴的项目,那可以先在github上建立一个仓库,开发人员把这个仓库克隆到本地就可以开工了。

先在github上新建一个仓库,如下:

wKiom1UJKQvTKVjRAAPlG8zut1c227.jpg

建好后会在gitnewrepo仓库上生成一个readme.md文件,如下图:

wKioL1UJKmbxvaptAAOvyLol2qg438.jpg

接着把远程仓库克隆到本地:

[zhaochj@jason ~]$ git clone git@github.com:zhaochj/gitnewrepo.git
Initialized empty Git repository in /home/zhaochj/gitnewrepo/.git/
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (3/3), done.
[zhaochj@jason ~]$ ls
gitnewrepo  mygitrepo
[zhaochj@jason ~]$ cd gitnewrepo/
[zhaochj@jason gitnewrepo]$ ls
README.md

未完,等续……