一、创建版本库
第一步先创建一个空的目录 mkdir www 。
[root@caiji home]# cd www
[root@caiji www]# pwd
/home/www
第二步,通过git init
命令把这个目录变成Git可以管理的仓库:
[root@caiji www]# git init
Initialized empty Git repository in /home/www/.git/
如果没有看到.git 目录,那么 .git目录默认是隐藏的,可以用 ls -ah 查看
[root@caiji www]# ls -ah
. .. .git
现在编写一个 index.php 文件,内容如下:
<?php
phpinfo();
?>
把一个文件放到Git仓库只需要两步。
第一步,用命令git add
告诉Git,把文件添加到仓库:
[root@caiji www]# git add index.php
执行上面的命令,没有任何显示,这就对了,Unix的哲学是“没有消息就是好消息”,说明添加成功。
第二步,用命令git commit
告诉Git,把文件提交到仓库:
[root@caiji www]# git commit -m "add phpinfo"
[master (root-commit) 9f44988] add phpinfo
1 file changed, 3 insertions(+)
create mode 100644 index.php
git commit
命令, -m
后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。
嫌麻烦不想输入-m "xxx"
行不行?确实有办法可以这么干,但是强烈不建议你这么干,因为输入说明对自己对别人阅读都很重要。实在不想输入说明的童鞋请自行Google,我不告诉你这个参数。
git commit
命令执行成功后会告诉你,1个文件被改动(我们新添加的readme.txt文件),插入了两行内容(readme.txt有两行内容)。
为什么Git添加文件需要add
,commit
一共两步呢?因为commit
可以一次提交很多文件,所以你可以多次add
不同的文件,比如:
$ git add file1.txt
$ git add file2.txt file3.txt
$ git commit -m "add 3 files."
二、时光机穿梭
前面已经成功添加了文件index.php,现在修改index.php 内容如下:
<?php
echo "1234";
phpinfo();
?>
运行git status
命令看看结果:
[root@caiji www]# 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: index.php
#
no changes added to commit (use "git add" and/or "git commit -a")
git status
命令可以让我们时刻掌握仓库当前的状态,上面的命令告诉我们,index.php被修改过了,但还没有准备提交的修改。
虽然Git告诉我们index.php被修改了,但如果能看看具体修改了什么内容,自然是很好的。比如你休假两周回来,第一天上班时,已经记不清上次怎么修改的index.php,所以,需要用git diff
这个命令看看:
[root@caiji www]# git diff index.php
diff --git a/index.php b/index.php
index cf60860..cc8b2a3 100644
--- a/index.php
+++ b/index.php
@@ -1,3 +1,4 @@
<?php
+echo "1234";
phpinfo();
?>
知道对index.php文件做了什么修改, 提交修改和提交新文件是一样的两步,第一步是git add
:
[root@caiji www]# git add index.php
同样没有任何输出。在执行第二步git commit
之前,我们再运行git status
看看当前仓库的状态:
[root@caiji www]# git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: index.php
#
git status
告诉我们,将要被提交的修改包括index.php,下一步,就可以放心地提交了:
[root@caiji www]# git commit -m "add echo"
[master c695a71] add echo
1 file changed, 1 insertion(+)
提交后,我们再用git status
命令看看仓库的当前状态:
[root@caiji www]# git status
# On branch master
nothing to commit, working directory clean
1.版本回退
在Git中,我们用git log
命令查看:
[root@caiji www]# git log
commit c695a7133a454fa879b74e2830756fecb1eb62f5
Author: wqy <1491617068@qq.com>
Date: Wed May 17 11:04:10 2017 +0800
add echo
commit 9f44988f04e5b594c99e3f012f183174ab04d541
Author: wqy <1491617068@qq.com>
Date: Wed May 17 10:21:05 2017 +0800
add phpinfo
git log
命令显示从最近到最远的提交日志 , 如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline
参数:
[root@caiji www]# git log --pretty=oneline
c695a7133a454fa879b74e2830756fecb1eb62f5 add echo
9f44988f04e5b594c99e3f012f183174ab04d541 add phpinfo
把当前版本“add echo”回退到 上一个版本 “add phpinfo” 使用git reset
命令:
[root@caiji www]# git reset --hard HEAD^
HEAD is now at 9f44988 add phpinfo
index.php 文件回退到版本 “add phpinfo”
[root@caiji www]# cat index.php
<?php
phpinfo();
?>
用git log
再看看现在版本库的状态:
[root@caiji www]# git log
commit 9f44988f04e5b594c99e3f012f183174ab04d541
Author: wqy <1491617068@qq.com>
Date: Wed May 17 10:21:05 2017 +0800
add phpinfo
如果由于操作失误 想回到 “add echo”版本, 只要上面的命令行窗口还没有被关掉,找到那个“add echo ” commit id
是 c695a713........ , 于是就可以指定回到未来的某个版本:
[root@caiji www]# git reset --hard c695
HEAD is now at c695a71 add echo
版本号没必要写全,前几位就可以了,Git会自动去找。当然也不能只写前一两位,因为Git可能会找到多个版本号,就无法确定是哪一个了。
再看一下 index.php文件内容 :
[root@caiji www]# cat index.php
<?php
echo "1234";
phpinfo();
?>
在Git中,总是有后悔药可以吃的。当你用$ git reset --hard HEAD^
回退到add phpinfo
版本时,再想恢复到add echo
,就必须找到add echo
的commit id。Git提供了一个命令git reflog
用来记录你的每一次命令:
[root@caiji www]# git reflog
c695a71 HEAD@{0}: reset: moving to c695
9f44988 HEAD@{1}: reset: moving to HEAD^
c695a71 HEAD@{2}: commit: add echo
9f44988 HEAD@{3}: commit (initial): add phpinfo
终于舒了口气,第三行显示add echo
的commit id是 c695a71,现在,你又可以乘坐时光机回到未来了。
三、远程仓库
1.添加远程仓库
要关联一个远程库,使用命令 git remote add origin git@github.com:wangqiyincode/webapp.git;
关联后,使用命令git push -u origin master
第一次推送master分支的所有内容;
此后,每次本地提交后,只要有必要,就可以使用命令git push origin master
推送最新修改;
2. 从远程库克隆
要克隆一个仓库,首先必须知道仓库的地址,然后使用git clone
命令克隆。
git clone git@github.com:wangqiyincode/webapp.git
四、分制管理
1.创建与合并分支
查看分支:git branch
创建分支:git branch <name>
git branch dev
切换分支:git checkout <name>
git checkout dev
创建+切换分支:git checkout -b <name>
git checkout -b dev
合并某分支到当前分支:git merge <name>
git merge dev
删除分支:git branch -d <name>
git branch -d dev
2.分支管理策略
git merge <name>
git merge dev (合并 dev 分支)
git merge --no-ff -m "merge with no-ff" <name>
git merge --no-ff -m 'merge with no-ff' dev ( 合并dev
分支,注意--no-ff
参数,表示禁用Fast forward
, 本次合并要创建一个新的commit,所以加上-m
参数,把commit描述写进去。 )
合并后,用git log
查看分支历史:
$ git log --graph --pretty=oneline --abbrev-commit
* 0a53d6f merge with no-ff
|\
| * ab1f3b9 add php
|/
* 6821d5f add info
|\
| * 4972925 add info
* | b11c151 &&&&s
|/
* e473e89 branch test