Git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。
任何一台机器都可以有一个本地版本的控制系统,其实就是一个硬盘上的文件,我们称之为仓库(repository)。但如果是多人协作的话,我们需要一个线上版本库,例如可以将线上仓库放到Github进行管理。
1、安装
首先根据自己的系统下载对应的软件版本,然后安装git客户端,安装完成之后,在桌面上右击可以看到git的功能菜单。
2、创建仓库
在桌面创建一个文件夹studyGit,然后在桌面上右击,选择Git base Here,可以打开git操作窗口
$ cd studyGit
切换到我们自己创建的git仓库目录
$ git init
将这个目录初始化为git目录,完成后,我们在进入这个文件夹,可以看到一个.git目录
3、提交版本 回退版本
提交版本
我们在studyGit里创建一个文件helloGit.txt,输入内容如下
I am learning Git!
现在可以提交,不过在这之前我们需要添加这个文件到git仓库中。添加到仓库(git add "文件名"),添加所有工作区文件到仓库(git add -A)
$ git add helloGit.txt
添加成功后,没有任何结果,但是可以用git status查看状态,这个新文件已经被添加进去了,同理当我们从仓库中需要删除文件时,也只需要用git rm "文件名"删除,这个删除是删除仓库中的文件,这个文件不在进行版本管理,在你的工作区还是存在的。
$ git status
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: helloGit.txt
提交版本(git commit -m "提交信息"),这条版本记录生成了一个版本id(92076e3)
$ git commit -m "添加helloGit"
[master (root-commit) 92076e3] 添加helloGit
1 file changed, 1 insertion(+)
create mode 100644 helloGit.txt
这样,一条版本就提交成功了,查看一下日志(git log)
$ git log
commit 92076e3603f097bcc86f2ad65827299246e86fb9 (HEAD -> master)
Author: Administrator <1351698648@qq.com>
Date: Thu Dec 6 17:04:14 2018 +0800
添加helloGit
回退版本
在helloGit.txt文本换行添加如下内容
Git is a version control software!
再次提交,在提交前也需要用git add记录每次更新
$ git add helloGit.txt
$ git commit -m "修改helloGit"
[master 0ab2c54] 修改helloGit
1 file changed, 2 insertions(+), 1 deletion(-)
这时我发现刚刚提交的版本有问题,需要回滚到上一个版本(git reset --hard HEAD),HEAD代表当前分支的当前版本。
$ git reset --hard HEAD
HEAD is now at 92076e3 添加helloGit
回到上上一个版本快捷命令是( git reset --hard HEAD^)
也可以查看版本的id,直接用id回滚,一般是跨了几个版本的回退
$ git log
commit 0ab2c54596e7dc4f7e715f80e6155566adfdb3a5 (HEAD -> master)
Author: Administrator <1351698648@qq.com>
Date: Thu Dec 6 17:24:42 2018 +0800
修改helloGit
commit 92076e3603f097bcc86f2ad65827299246e86fb9
Author: Administrator <1351698648@qq.com>
Date: Thu Dec 6 17:04:14 2018 +0800
添加helloGit
Administrator@PC201701131550 MINGW64 ~/Desktop/studyGit (master)
$ git reset --hard "0ab2c54596e7dc4f7e715f80e6155566adfdb3a5"
HEAD is now at 0ab2c54 修改helloGit
$ git reset --hard "92076e3603f097bcc86f2ad65827299246e86fb9"
HEAD is now at 92076e3 添加helloGit
撤销回滚
现在版本已经回退到了第一个版本(添加helloGit),这时查看git log,第二条版本记录已经看不到了,如果我又想恢复第二个版本记录(修改helloGit)可以吗?当然可以了,git中的命令十分强大。
git reflog
92076e3 (HEAD -> master) HEAD@{0}: reset: moving to 92076e3603f097bcc86f2ad65827299246e86fb9
0ab2c54 HEAD@{1}: reset: moving to 0ab2c54596e7dc4f7e715f80e6155566adfdb3a5
0ab2c54 HEAD@{2}: commit: 修改helloGit
92076e3 (HEAD -> master) HEAD@{3}: reset: moving to 92076e3603f097bcc86f2ad65827299246e86fb9
92076e3 (HEAD -> master) HEAD@{4}: reset: moving to HEAD
92076e3 (HEAD -> master) HEAD@{5}: commit (initial): 添加helloGit
git reflog可以查看版本中的所有操作记录,上图中我们已经可以看到第二条版本记录的id(修改helloGit)是 "0ab2c54 ",用这个id在进行一次reset就可以了。
$ git reset --hard 0ab2c54
HEAD is now at 0ab2c54 修改helloGit
可以看到,第二条记录又回来了。
4、分支创建 合并 删除
分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会对别人带来困扰。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。
现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。
分支创建
$ git branch
* master
首先,使用git branch命令查看当前分支,git中默认的主分支是master,当前分支前面会标一个*
号。
创建一个second分支,并且切换到该分支
$ git branch second
$ git branch
* master
second
$ git checkout second
Switched to branch 'second'
再次查看git branch,我们就能看到当前分支已经切换到second了,在helloGit.txt中插入以下内容。
I am learing how to use branch!
提交这次记录。
$ git add helloGit.txt
$ git commit -m"学习使用分支"
[second db24185] 学习使用分支
1 file changed, 1 insertion(+)
现在helloGit中的内容是
I am learning Git!
Git is a version control software!
I am learing how to use branch!
分支合并
完成second分支上的工作,现在我们切换到master主分支。
$ git checkout master
查看文本内容:
I am learning Git!
Git is a version control software!
刚才添加的内容不见了!因为那个提交是在second
分支上,而master
分支此刻的提交点并没有变:
现在我们把second的工作成果合并到master上。
$ git merge second
Updating 0ab2c54..db24185
Fast-forward
helloGit.txt | 1 +
1 file changed, 1 insertion(+)
查看文本内容
I am learning Git!
Git is a version control software!
I am learing how to use branch!
可以卡到,现在second分支上的内容已经全部同步到master上了。现在可以删除second分支。
$ git branch -d second
Deleted branch second (was db24185).
$ git branch
* master
这样分支不仅又重新回到了主分支上,而且内容也是最新的。
5、远程仓库(GitHub)
假设一个情景:
你在本地创建了一个Git仓库,用于保存工作时候的代码,周末放假的时候想起来有段代码有问题,不赶紧修改的话,周一的时候会被BOSS骂,那你可能想着在家修改它,因为工作量不是很大。
那么我们可以创建一个远程仓库,将公司的Git仓库同步到远程仓库,然后在家更新这个仓库,修改完代码,再将修改后的代码同步到远程仓库上,周一到公司直接更新远程仓库的代码就行了
这样,GitHub上的仓库既可以作为备份,又可以异地工作,真是一举两得。
创建远程仓库
首先,登陆GitHub,然后,在右上角找到“Create a new repo”按钮,创建一个新的仓库:
在Repository name填入learnGit
,点击“Create repository”按钮,就成功地创建了一个新的Git仓库:
现在,在GitHub上的这个learnGit
仓库还是空的,现在,我们我们将远程仓库和本地仓库相关联,在本地的learnGit
仓库下运行命令:
$ git remote add origin https://github.com/{username}/learnGit.git
请千万注意,把上面的name
替换成你自己的GitHub账户名。
添加后,远程库的名字就是origin
,这是Git默认的叫法,也可以改成别的,但是origin
这个名字一看就知道是远程库。
下一步,就可以把本地库的所有内容推送到远程库上:
$ git push -u origin master
Counting objects: 20, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (15/15), done.
Writing objects: 100% (20/20), 1.64 KiB | 560.00 KiB/s, done.
Total 20 (delta 5), reused 0 (delta 0)
remote: Resolving deltas: 100% (5/5), done.
To github.com:name/learnGit.git
* [new branch] master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.
把本地库的内容推送到远程,用git push
命令,实际上是把当前分支master
推送到远程。
由于远程库是空的,我们第一次推送master
分支时,加上了-u
参数,Git不但会把本地的master
分支内容推送的远程新的master
分支,还会把本地的master
分支和远程的master
分支关联起来,在以后的推送或者拉取时就可以简化命令。