一、简介
1.版本控制系统
cvs、svn: 集中式,需要中央服务器支持
git: 分布式,中央服务器辅助交换,不必须。(作者:linus)
所有的版本控制系统只能跟踪文本文件的改动,比如TXT文件,网页,所有程序代码等等,图片,视频无法跟踪其文件变化。
强烈建议所有文本使用标准的UTF-8编码,所有语言使用一种编码,没有冲突,又被所有平台支持。
注意:千万不要使用window自带的记事本编辑任何文件,原因自行百度。
2.安装
download from https://git-scm.com/downloads
全局配置
git config --global user.name "Your Name"
git config --global user.email "email@example.com"
二、创建仓库
使用git合作开发项目,首先得新建一个git的公共仓库即远程仓库。
1.初始化一个空的git仓库
mkdir test
cd test
git init //初始化
tips:
显示Initialized empty Git repository in D:/test/.git/即初始化成功。
add多个文件时,可以多次add,也可以git add file1.txt file2.txt
,这样更为方便。
当前目录多了一个.git的,此目录是用来跟踪版本管理库的,注意不要动此文件夹。
2.向仓库提交文件
echo "our first git repository">>file //新建一个供提交的文件
git add file //将文件信息添加到git仓库的索引库中
git commit -m "the first file to commit" //提交到仓库中
tips:
显示[master (root-commit) 0c72641] the first file to commit
7 1 files changed, 1 insertions(+), 0 deletions(-)
8 create mode 100644 file
-m
后为输入的是本次提交的说明,最好用意义。
3.一些常用命令
git status
命令可以让我们时刻掌握仓库当前的状态。现在我们来修改之前提交的test文件,之后运行git status
,查看结果:
D:\test>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")
git diff
命令可以帮助查看文件距上次修改了什么内容,运行git diff test.txt
,查看结果:
D:\testGit>git diff file
diff --git a/file b/file
index 1928b89..1207063 100644
--- a/file
+++ b/file
@@ -1 +1,5 @@
-"our first git repository" //删除的内容
+jfhsfiiisnjchdskgsssssssssssssss //增加的内容
git log
查看提交日志(作者、修改时间、修改内容)。如果嫌显示的日志太多,可以加上参数--pretty oneline
。
git reset --hard HEAD^^
回退到上一次commit的版本,需要注意是 HEAD后面有两个^
号,如果要回退到上上一个版本则要使用四个 ^
号,这里本人亲测,可能版本不同对应的个数不同,仅供参考!当然如果回到上一个版本有想回到当前版本,同样使用git reset --hard commitId
这里commitId为当前版本的id,可以通过git reflog
命令查看之前每次提交生成的id。
4.工作区和暂存区的概念
为了便于大家理解,这里引入一张图:
打开本地仓库的根目录即为工作区,而前面提到的.git文件夹为git的版本,版本库最重要的就是称为stage的暂存区,还有git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。由此不难理解为什么可以通过HEAD指针实现版本之间来回穿梭!
理解上面版本库和工作区的概念,就可以理解下面一些指令,
- 如果想要查看工作区和版本库里面最新版本的区别,可以使用
git diff HEAD
-
git checkout
命令是将版本库里的最新版本替换工作区的版本,无论工作区是修改还是删除,都可以一键还原。 -
git rm test.txt
命令+git commit
是从版本库里删除test.txt文件。
5.远程仓库
以上已经学了git的基本操作,学会这些远远不够,下面介绍git真正强大的地方。实际工作情况往往是这样,一台电脑充当服务器的角色,其他人都从这个服务器仓库里克隆一份到自己的电脑,并且各自把各自的提交推送到服务器仓库里,也从服务器仓库中拉取别人的提交。
添加远程仓库
- 创建SSH Key。在用户的主目录下查看有没有.ssh目录,如果有打开查看是否有id_rsa和id_rsa.pub这两个文件,没有则需要创建SSH Key:
ssh-key -t rsa -C 'youremail@example.com'
输入自己的邮箱一路enter,可自己设置密码,如果一切顺利可以在.ssh目录下找到id_rsa和id_rsa.pub两个文件 - 登录github,打开"Account settings","SSH Keys"页面,将id_rsa.pub文件内容添加到页面中,填上任意标题,点击添加即可。
- 在github上创建一个仓库test,此时仓库还是空的,现在我们在本地仓库目录运行如下命令:
git remote add origin git@github.com:huangzhongren/tes.git
huangzhongren
是对应github的账户名,添加后,远程库的名字就是origin
。 - 推送内容,执行下面命令:
git push -u origin master
把本地库内容推送到远程,用git push
命令,实际上是把当前分支master推送到远程。
由于远程库是空的,我们第一次推送master分支时,加上-u参数,git不但会把本地的master分支内容推送到远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
从远程库克隆
准备好远程仓库后执行:
git clone git@github.com:huangzhongren/test.git
这样可以克隆一个本地库,然后可以修改本地仓库。
6.分支管理
- 查看分支:git branch(本地分支)
- 查看所有分支: git branch -a
- 查看远程分支: git branch -r
- 创建分支:git branch <name>
- 切换分支:git checkout <name>
- 创建+切换分支:git checkout -b <name>
- 合并某分支到当前分支:git merge <name>
- 删除分支:git branch -d <name>
通常我们在合作开发时,往往不是在主分支master上直接操作,master分支一般都是用来发布的稳定的分支,干活都在dev分支上,到最后版本发布时在进行合并!当然你也可以创建其他的分支,例如bug修改分支,feature功能添加分支,也可以创建自己隐藏的分支。
在测试提出bug修改需求时,而你又不想把手中没有完成时开发提交,这时你就可以使用git stash
命令将当前的‘工作现场’隐藏起来,然后切换到需要修改bug的分支例如master分株,创建并切换到一个bug分支issue1,修改之后提交,在切换到master分支,使用git merge -no-ff -m 'merge bug fix' issue1
合并bug,此时master的分支就被修改了,如果想回到之前的工作现场,使用git stash pop
命令恢复之前的工作现场。