Git是什么?
Git是目前世界上最先进的分布式版本控制系统(没有之一)。
1、Git简介
Git是分布式版本控制系统,集中式和分布式版本控制系统有什么区别呢?
集中式版本控制系统
分布式版本控制系统
2、Git安装
系统: centos
检查linux系统是不是安装了git
[root@cqs /]# git
The program 'git' is currently not installed. You can install it by typing.#说明没安装git
如果你碰巧用Debian或Ubuntu Linux,通过一条sudo apt-get install git就可以直接完成Git的安装,非常简单。老一点的Debian或Ubuntu Linux,要把命令改为sudo apt-get install git-core,而centos所用的指令时yum install git -y
[root@cqs /]# yum install git -y
[root@cqs /]# git version
git version 1.7.1
[root@cqs /]# git
usage: git [--version] [--exec-path[=GIT_EXEC_PATH]] [--html-path]
[-p|--paginate|--no-pager] [--no-replace-objects]
[--bare] [--git-dir=GIT_DIR] [--work-tree=GIT_WORK_TREE]
[--help] COMMAND [ARGS]
See 'git help COMMAND' for more information on a specific command.
安装完成后,还需要最后一步设置,在命令行输入:
[root@cqs /] git config --global user.name "Your Name"
[root@cqs /]git config --global user.email "email@example.com"
因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址。
3、创建版本库
对apache所在的htdocs文件夹下的项目进行管理
[root@cqs /]# cd /usr/local/httpd-2.4.18/htdocs/
[root@cqs htdocs]# mkdir learngit
[root@cqs htdocs]# cd learngit/
[root@cqs learngit]# pwd
/usr/local/httpd-2.4.18/htdocs/learngit
#git init命令把这个目录变成Git可以管理的仓库
[root@cqs learngit]# git init
Initialized empty Git repository in /usr/local/httpd-2.4.18/htdocs/learngit/.git/
瞬间Git就把仓库建好了,而且告诉你是一个空的仓库(empty Git repository),细心的读者可以发现当前目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。
由于是隐藏目录,所以要使用ls -ah命令才看的到对应的隐藏目录。
[root@cqs learngit]# ls -ah
. .. .git
[root@cqs learngit]# cd .git/
[root@cqs .git]# ls
branches config description HEAD hooks info objects refs
[root@cqs .git]# cat config
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
4、把文件添加到版本库
新建一个文件
[root@cqs learngit]# vim readme.txt
Git is a version control system.
Git is free software.
按wq进行保存
[root@cqs learngit]# cat readme.txt
Git is a version control system.
Git is free software.
把readme.txt文件上传到git仓库,git add命令把文件添加到仓库,git commit命令提交到仓库,可加上-m参数说明提交内容
[root@cqs learngit]# git add readme.txt
[root@cqs learngit]# git commit -m "wrote a readme file"
[master (root-commit) 3f18887] wrote a readme file
Committer: root <root@cqs.(none)>
Your name and email address were configured automatically based
on your username and hostname.
1 files changed, 2 insertions(+), 0 deletions(-)
create mode 100644 readme.txt
为什么Git添加文件需要add,commit一共两步呢?因为commit可以一次提交很多文件,所以你可以多次add不同的文件
5、时光穿梭机
(1)git status和git diff指令
对readme.txt内容进行修改
[root@cqs learngit]# vim readme.txt
Git is a version control system.
Git is free software.
Please try again123.
运行git status命令看看结果
[root@cqs learngit]# 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: readme.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
git status命令可以让我们时刻掌握仓库当前的状态,上面的命令告诉我们,readme.txt被修改过了,但还没有准备提交的修改。
git diff顾名思义就是查看difference,显示的格式正是Unix通用的diff格式,可以从上面的命令输出看到,我们在第一行添加了一个“distributed”单词。
[root@cqs learngit]# git diff readme.txt
diff --git a/readme.txt b/readme.txt
index 5411f74..697eba6 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,3 +1,3 @@
Git is a version control system.
Git is free software.
-Please try again.
+Please try again123.
我们看到了readme.txt修改的内容,接下来上传文件
[root@cqs learngit]# git add readme.txt
[root@cqs learngit]# git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: readme.txt
#
提交文件到仓库,
[root@cqs learngit]# git commit -m "add distributed"
[master c55f398] add distributed
1 files changed, 1 insertions(+), 1 deletions(-)
[root@cqs learngit]# git status
# On branch master
nothing to commit (working directory clean)
如果git status告诉你有文件被修改过,用git diff可以查看修改内容。
(2)git log指令、git reset指令和git reflog指令
git log命令显示从最近到最远的提交日志,我们可以看到3次提交,最近的一次是append GPL,上一次是add distributed,最早的一次是wrote a readme file。 如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline参数:
[root@cqs learngit]# git log
commit c55f398c0f8e8afcbdf1140182f81682161d3887
Author: Your Name <you@example.com>
Date: Wed Nov 16 07:11:22 2016 +0800
add distributed
commit d9c83081fccf7762cf4b2ad46ace80ef22762ed7
Author: Your Name <you@example.com>
Date: Wed Nov 16 06:54:16 2016 +0800
rewrite readme file
commit 3f1888785bae054c3eaaf758e2c573c175572360
Author: root <root@cqs.(none)>
Date: Wed Nov 16 06:45:24 2016 +0800
wrote a readme file
[root@cqs learngit]# git log --pretty=oneline
c55f398c0f8e8afcbdf1140182f81682161d3887 add distributed
d9c83081fccf7762cf4b2ad46ace80ef22762ed7 rewrite readme file
3f1888785bae054c3eaaf758e2c573c175572360 wrote a readme file
Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。
eg.回退到上一个版本
[root@cqs learngit]# git reset --hard HEAD^
HEAD is now at d9c8308 rewrite readme file
[root@cqs learngit]# git log --pretty=oneline
d9c83081fccf7762cf4b2ad46ace80ef22762ed7 rewrite readme file
3f1888785bae054c3eaaf758e2c573c175572360 wrote a readme file
查看回退的log档,最前面表示commit id,用commit id我们可以回退到指定的版本
[root@cqs learngit]# git reflog
d9c8308 HEAD@{0}: HEAD^: updating HEAD
c55f398 HEAD@{1}: commit: add distributed
d9c8308 HEAD@{2}: commit: rewrite readme file
3f18887 HEAD@{3}: commit (initial): wrote a readme file
我们现在想回退到add distributed版本的话,使用的指令是git reset --hard
[root@cqs learngit]# git reset --hard c55f398
HEAD is now at c55f398 add distributed
[root@cqs learngit]# cat readme.txt
Git is a version control system.
Git is free software.
Please try again123.
[root@cqs learngit]# git reflog
c55f398 HEAD@{0}: c55f398: updating HEAD
d9c8308 HEAD@{1}: HEAD^: updating HEAD
c55f398 HEAD@{2}: commit: add distributed
d9c8308 HEAD@{3}: commit: rewrite readme file
3f18887 HEAD@{4}: commit (initial): wrote a readme file
接下来用git diff HEAD -- readme.txt命令可以查看工作区和版本库里面最新版本的区别,我们对readme.txt进行修改。
[root@cqs learngit]# git diff HEAD -- readme.txt
diff --git a/readme.txt b/readme.txt
index 697eba6..6eeca5d 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,3 +1,4 @@
+insert into a(hh) values('ddd');
Git is a version control system.
Git is free software.
Please try again123.
(3)git checkout指令和git rm指令
命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:
一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit或git add时的状态。
[root@cqs learngit]# git checkout -- readme.txt
[root@cqs learngit]# cat readme.txt
Git is a version control system.
Git is free software.
Please try again123.
在Git中,删除也是一个修改操作,我们实战一下,先添加一个新文件test.txt到Git并且提交
[root@cqs learngit]# vim test.txt
sss
按wq保存退出,上传,提交该文件
[root@cqs learngit]# git add test.txt
[root@cqs learngit]# git commit -m "add test.txt"
[master 1668b84] add test.txt
1 files changed, 1 insertions(+), 0 deletions(-)
create mode 100644 test.txt
[root@cqs learngit]# git log --pretty=oneline
1668b84b932dc53ec347c86fa9befac91b7dfef7 add test.txt
c55f398c0f8e8afcbdf1140182f81682161d3887 add distributed
d9c83081fccf7762cf4b2ad46ace80ef22762ed7 rewrite readme file
3f1888785bae054c3eaaf758e2c573c175572360 wrote a readme file
接下来使用git rm进行该文件的删除
[root@cqs learngit]# git rm test.txt
rm 'test.txt'
[root@cqs learngit]# git commit -m "remove test.txt"
[master 2e0ef21] remove test.txt
1 files changed, 0 insertions(+), 1 deletions(-)
delete mode 100644 test.txt
git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”
附
Git基本常用命令如下:
mkdir: XX (创建一个空目录 XX指目录名)
pwd: 显示当前目录的路径。
git init 把当前的目录变成可以管理的git仓库,生成隐藏.git文件。
git add XX 把xx文件添加到暂存区去。
git commit –m “XX” 提交文件 –m 后面的是注释。
git status 查看仓库状态
git diff XX 查看XX文件修改了那些内容
git log 查看历史记录
git reset –hard HEAD^ 或者 git reset –hard HEAD~ 回退到上一个版本(如果想回退到100个版本,使用git reset –hard HEAD~100 )
cat XX 查看XX文件内容
git reflog 查看历史记录的版本号id
git checkout — XX 把XX文件在工作区的修改全部撤销。
git rm XX 删除XX文件
git remote add origin https://github.com/tugenhua0707/testgit 关联一个远程库
git push –u(第一次要用-u 以后不需要) origin master 把当前master分支推送到远程库
git clone https://github.com/tugenhua0707/testgit 从远程库中克隆
git checkout –b dev 创建dev分支 并切换到dev分支上
git branch 查看当前所有的分支
git checkout master 切换回master分支
git merge dev 在当前的分支上合并dev分支
git branch –d dev 删除dev分支
git branch name 创建分支
git stash 把当前的工作隐藏起来 等以后恢复现场后继续工作
git stash list 查看所有被隐藏的文件列表
git stash apply 恢复被隐藏的文件,但是内容不删除
git stash drop 删除文件
git stash pop 恢复文件的同时 也删除文件
git remote 查看远程库的信息
git remote –v 查看远程库的详细信息
git push origin master Git会把master分支推送到远程库对应的远程分支上