一、认识Git
Git是一个开源的分布式版本控制系统,它可以有效的、高速地处理从很小到非常大的项目版本管理。Git是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。Git适合做分布式开发,强调个体,而且本地服务器的压力和数据量都不会太大,具有速度快、灵活、支持离线工作等优点。
Git具有以下功能特性:
1)从服务器上克隆完整的Git仓库(包括代码和版本信息)到本机;
2)在自己的机器上根据不同的开发目的,创建分支,修改代码;
3)在本机上自己创建的分支提交代码;
4)在本机上合并代码;
5)把服务器上最新的代码fetch下来,然后跟自己的主分支合并;
6)生成补丁(patch),把补丁发送给主开发者;
7)解决各开发者分支合并冲突问题;
二、Git的基本概念
仓库(Repository):我们可以把一个仓库想象成一个数据库,里面存储了项目的所有版本和元数
据(metadata),可以实现拉取或提交数据等操作;
工作目录(Working Directory):工作目录是对项目的某个版本独立提取出来的内容,如检出的某个
分支的内容。这些从Git仓库的压缩数据库中提取出来的文件,放在磁
盘上供我们使用或修改。
暂存区(Staging Area):暂存区是一个文件,保存了下一次将要提交的文件列表信息,一般在Git仓
库的目录中。有时候也被称作"索引"。
分支(Branch):使用分支可以把我们的工作从开发主线上分离开来,以免影响开发主线。Git的分支
,其实本质上仅仅是指向提交对象的可变指针。Git的默认分支名字是master。
标签(Tag):标签是用于标记特定的点或提交的历史,通常会用来标记发布版本的名称或版本号(如:publish/0.0.1),虽然标签看起来有点像分支,但打上标签的提交是固定的,不能随意的改动。
HEAD:HEAD指向的就是当前分支的最新提交。
工作区、暂存区、本地版本库、远程版本库之间几个常用的 Git 操作流程如下图所示:
三、安装Git
1)进入git官网地址下载软件包
2)创建工作目录并查看git版本
四、Git的工作流程与常用操作
1)git config:配置开发者的用户名和邮箱,每次代码提交的时候都会生成一条提交记录,其中就
会包含当前配置的用户名和邮箱;
17701@LAPTOP-0NQ9VV19 MINGW64 /d/Git
$ git init
Initialized empty Git repository in D:/Git/.git/
17701@LAPTOP-0NQ9VV19 MINGW64 /d/Git (master)
$ git config user.name Mr.jiang
17701@LAPTOP-0NQ9VV19 MINGW64 /d/Git (master)
$ git config user.email Mr.jiang@126.com
17701@LAPTOP-0NQ9VV19 MINGW64 /d/Git (master)
$ git config --list --local
core.repositoryformatversion=0
core.filemode=false
core.bare=false
core.logallrefupdates=true
core.symlinks=false
core.ignorecase=true
user.name=Mr.jiang
user.email=Mr.jiang@126.com
2)git add:添加文件变动到暂存区(add后接.表示添加所有变动的文件);
17701@LAPTOP-0NQ9VV19 MINGW64 /d/Git (master)
$ ls
test.txt
17701@LAPTOP-0NQ9VV19 MINGW64 /d/Git (master)
$ cat test.txt
ths is a git testfile
17701@LAPTOP-0NQ9VV19 MINGW64 /d/Git (master)
$ git add test.txt
3)git status:查看文件变动的状态信息;
17701@LAPTOP-0NQ9VV19 MINGW64 /d/Git (master)
$ git status
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: test.txt
4)git commit:提交文件变动到版本库中(-m参数可直接输入提交的描述信息);
17701@LAPTOP-0NQ9VV19 MINGW64 /d/Git (master)
$ git commit -m"Add File test.txt"
[master (root-commit) fa62007] Add File test.txt
1 file changed, 1 insertion(+)
create mode 100644 test.txt
5)git log:查看git的提交日志信息(-n#可查看限定的日志提交信息);
17701@LAPTOP-0NQ9VV19 MINGW64 /d/Git (master)
$ git log -n1
commit fa6200780ebf00371700d15b3318558956a85512 (HEAD -> master)
Author: Mr.jiang <Mr.jiang@126.com>
Date: Fri Sep 13 16:33:29 2019 +0800
Add File test.txt
6)git branch:创建、重命名、查看、删除项目分支;
#查看当前分支
17701@LAPTOP-0NQ9VV19 MINGW64 /d/Git (master)
$ git branch
* master
#新建一个daily/0.0.0分支
17701@LAPTOP-0NQ9VV19 MINGW64 /d/Git (master)
$ git branch daily/0.0.0
#重命名分支为daily/0.0.1
17701@LAPTOP-0NQ9VV19 MINGW64 /d/Git (master)
$ git branch -m daily/0.0.0 daily/0.0.1
#-d可删除指定分支
17701@LAPTOP-0NQ9VV19 MINGW64 /d/Git (master)
$ git branch -d daily/0.0.1
7)git checkout:切换分支,回退文件到暂存区状态;
#切换分支
17701@LAPTOP-0NQ9VV19 MINGW64 /d/Git (master)
$ git checkout daily/0.0.1
Switched to branch 'daily/0.0.1'
17701@LAPTOP-0NQ9VV19 MINGW64 /d/Git (daily/0.0.1)
$ git branch
* daily/0.0.1
master
#回退到暂存区状态
17701@LAPTOP-0NQ9VV19 MINGW64 /d/Git (daily/0.0.1)
$ cat test.txt
ths is a git testfile
17701@LAPTOP-0NQ9VV19 MINGW64 /d/Git (daily/0.0.1)
$ git add test.txt
17701@LAPTOP-0NQ9VV19 MINGW64 /d/Git (daily/0.0.1)
$ cat test.txt
ths is a git testfile
l love git
17701@LAPTOP-0NQ9VV19 MINGW64 /d/Git (daily/0.0.1)
$ git checkout test.txt
17701@LAPTOP-0NQ9VV19 MINGW64 /d/Git (daily/0.0.1)
$ cat test.txt
ths is a git testfile
17701@LAPTOP-0NQ9VV19 MINGW64 /d/Git (daily/0.0.1)
8)git reset:回退文件到提交区的状态(本地文件做了修改,回退到上次提交的状态);
#文件新增加了一行内容
17701@LAPTOP-0NQ9VV19 MINGW64 /d/Git (daily/0.0.1)
$ cat test.txt
ths is a git testfile
17701@LAPTOP-0NQ9VV19 MINGW64 /d/Git (daily/0.0.1)
#查看日志
$ git log -n1
commit fa6200780ebf00371700d15b3318558956a85512 (HEAD -> daily/0.0.1, master)
Author: Mr.jiang <Mr.jiang@126.com>
Date: Fri Sep 13 16:33:29 2019 +0800
Add File test.txt
#用reset回退到上次状态(指明部分hash码即可)
17701@LAPTOP-0NQ9VV19 MINGW64 /d/Git (daily/0.0.1)
$ git reset --hard fa6200780
HEAD is now at fa62007 Add File test.txt
#文件已回到原始状态
17701@LAPTOP-0NQ9VV19 MINGW64 /d/Git (daily/0.0.1)
$ cat test.txt
ths is a git testfile
9)git reflog:查看回退日志信息;
17701@LAPTOP-0NQ9VV19 MINGW64 /d/Git (daily/0.0.1)
$ git reflog
fa62007 (HEAD -> daily/0.0.1, master) HEAD@{0}: reset: moving to fa6200780
fa62007 (HEAD -> daily/0.0.1, master) HEAD@{1}: checkout: moving from master to daily/0.0.1
fa62007 (HEAD -> daily/0.0.1, master) HEAD@{2}: commit (initial): Add File test.txt
10)git diff:对比两次提交状态差异;
17701@LAPTOP-0NQ9VV19 MINGW64 /d/Git (daily/0.0.1)
$ git commit -am"Add test.txt"
On branch daily/0.0.1
nothing to commit, working tree clean
17701@LAPTOP-0NQ9VV19 MINGW64 /d/Git (daily/0.0.1)
$ git commit -am"Change test.txt"
[daily/0.0.1 c14f81f] Change test.txt
1 file changed, 2 insertions(+), 1 deletion(-)
17701@LAPTOP-0NQ9VV19 MINGW64 /d/Git (daily/0.0.1)
$ git log -n2
commit c14f81f74efe1f5be53f4b933bec1c1f2c3d9925 (HEAD -> daily/0.0.1)
Author: Mr.jiang <Mr.jiang@126.com>
Date: Fri Sep 13 19:24:15 2019 +0800
Change test.txt
commit fa6200780ebf00371700d15b3318558956a85512 (master)
Author: Mr.jiang <Mr.jiang@126.com>
Date: Fri Sep 13 16:33:29 2019 +0800
Add File test.txt
17701@LAPTOP-0NQ9VV19 MINGW64 /d/Git (daily/0.0.1)
$ git diff c14f81f7 fa620078
diff --git a/test.txt b/test.txt
index d75e2db..fceaaf5 100644
--- a/test.txt
+++ b/test.txt
@@ -1,2 +1 @@
-ths is a git testfile
-l love git
\ No newline at end of file
+ths is a git testfile
\ No newline at end of file
11)git reset HEAD:取消暂存区的文件;
17701@LAPTOP-0NQ9VV19 MINGW64 /d/Git (master)
$ git add test.txt
17701@LAPTOP-0NQ9VV19 MINGW64 /d/Git (master)
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: test.txt
17701@LAPTOP-0NQ9VV19 MINGW64 /d/Git (master)
$ git reset HEAD -- test.txt
Unstaged changes after reset:
M test.txt
17701@LAPTOP-0NQ9VV19 MINGW64 /d/Git (master)
$ 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")
12)git rm:删除暂存区的文件;
17701@LAPTOP-0NQ9VV19 MINGW64 /d/Git (master)
$ git rm test.txt --cached
rm 'test.txt'
17701@LAPTOP-0NQ9VV19 MINGW64 /d/Git (master)
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
deleted: test.txt
Untracked files:
(use "git add <file>..." to include in what will be committed)
test.txt
13)git remote:添加一个远端仓库;
17701@LAPTOP-0NQ9VV19 MINGW64 /d/Git (master)
$ git remote add github git@github.com:Jiangyiyang0322
17701@LAPTOP-0NQ9VV19 MINGW64 /d/Git (master)
$ git remote -v
github git@github.com:Jiangyiyang0322 (fetch)
github git@github.com:Jiangyiyang0322 (push)
14)git push:推送本地代码到远程仓库;
17701@LAPTOP-0NQ9VV19 MINGW64 /d/Git (master)
$ git push github test.txt
15).gitgnore文件:设置哪些内容不需要推送到远程服务器,这是一个配置文件;.gitignore不是Gi
t命令,而是在项目中的一个文件,通过设置.gitignore的内容告诉Git哪些文件
应该被忽略不需要推送到服务器,通过以上命令可以创建一个.gitignore文件,
并在编辑器中打开文件,每一行代表一个要忽略的文件或目录;
17701@LAPTOP-0NQ9VV19 MINGW64 /d/Git (master)
$ touch .gitignore
17701@LAPTOP-0NQ9VV19 MINGW64 /d/Git (master)
$ ll .gitignore
-rw-r--r-- 1 17701 197609 0 9月 13 20:32 .gitignore
17701@LAPTOP-0NQ9VV19 MINGW64 /d/Git (master)
$ cat .gitignore
test.txt