git笔记

基于Spring Boot搭建的Web项目,用maven作为项目管理工具。通过docker容器部署,对外提供服务。


本文作为初学者学习git的笔记,文中通过一个简单的例子说明如何通过git管理一个项目,仅涉及一些简单的命令。

一些基本的概念

  • git是一个基于文件内容的版本管理系统。
  • git有三个区域,分别是工作目录、暂存区、提交区。工作目录是用户编辑文件所在的区域,也是很直观可以看到的区域;暂存区相当于缓存,介于工作目录和提交区之间。提交区是用户将编辑好的代码发布保存的区域,也是git跟踪状态的区域。这三个区域的内容可以相互转换。
  • git管理的项目文件有已跟踪和未跟踪两种状态。已跟踪就是进入git管理范围的文件,未跟踪的文件不进入git管理系统。

一个简单的例子

初始化

  • 首先新建一个空的目录,作为这个例子文件的所在目录。
  • 在新建的这个目录下,通过 git init 命令创建一个空的仓库,此时该目录会出现一个 .git目录,该目录下是git管理项目所需的文件。
    ![初始化][初始化.png]

新建文件

新建一个文件,就用readme.md,文件内容如下。

1
This is git test.

这时可以通过 git status 命令查看当前git的状态。
![gitstatus][gitstatus.pnd]
git提示有一个新的文件没有被跟踪,也就是刚才新建的 readme.md

跟踪文件

通过命令 git add . 将文件加入跟踪的范围。这里的 . 表示当前目录下的所有文件,如果要指定特定的文件,可以写出文件名,如这里也可以写成 git add readme.md 。添加以后再看状态,就没有之前的未跟踪的提示了。
![gitadd][gitadd.png]
但是又出现新的提示,意思是对文件内容的改动提交到了暂存区,但是没有提交到提交区。可以通过 git commit -m ‘init commit’ 将这次改动提交到提交区。这里 -m 后面的内容相当于注释,解释这次提交的内容,便于日后查看日志的时候能有所提示。
![initcommit][initcommit.png]

改动文件

我们对文件进行改动,看看会有什么变化。在readme.md中在加入一行

1
2
This is git test.
Hello world!

查看状态,提示文件有修改,但是没有提交。用命令 git commit -a -m ‘add a line’ ,这次加了 -a 参数,该参数的作用是直接将工作目录的修改提交到提交区,不再经过提交区。
![addaline][addaline.png]

创建分支

git能够让多人进行协作,共同开发一个项目。通过创建分支,能够让不同的开发者在不同的开发线上进行开发,然后再将各自的代码合并到一起。通过命令 git branch dev 创建一个新的分支dev,通过 git branch -v 可以查看分支的状态。
![branchdev][branchdev.png]
master是主分支,也是初始化时自动创建的分支。*表示当前所处的分支,当我们处在这个分支时,所有对文件的操作都只是影响这个分支,不会影响其他的分支。

分支切换

在master分支上,再添加一行,如下

1
2
3
This is  git test.
Hello world!
On master.

通过和之前一样的操作提交到提交区。
然后通过命令 git checkout dev,切换到dev分支,这时候看到的文件会是这样:

1
2
This is  git test.
Hello world!

因为在master分支的改动不会影响其他分支,所以dev分支还是刚才的状态。在dev分支上,将文件改动如下

1
2
3
This is  git test.
Hello world!
On dev.

提交之后,如果再切换回master,又会回到master的文件状态。

合并分支

切换到master分支,通过命令 git merge dev 将dev分支合并到master分支。由于两个分支都对同一个文件进行了修改,会出现冲突。
![merger][merger.png]
这时候文件内容是这样:

1
2
3
4
5
6
7
This is a git test.
Hello world!
<<<<<<< HEAD
On master.
=======
On dev.
>>>>>>> dev

需要我们自己解决冲突后才能提交。将文件改成如下:

1
2
3
This is a git test.
Hello world!
Merge.

然后再通过提交命令提交,就没有问题了。通过命令 git log –graph –pretty=oneline –abbrev-commit 显示合并的路径,其中log后面几个参数是为了显示的更加友好。
![conflictresolv][conflictresolv]

加标签

其实加标签在之前的操作中也能进行,这里单独进行说明。
我们能看到在之前的每次提交中,都有一个hash值,这个hash值就相当于这次提交的唯一标识。由于hash值太长了,通常只用前几位就能和别的区分开。
可以为每一次提交加上一个标签,也即加上一个更有意义的名字,而不是一串hash。如下为我们的第二次提交添加一个标签。
![tag][tag.png]
添加标签以后,就可以用标签来代替hash,对某次提交进行操作。

远程操作

git能够让多人进行协作,可以建立一个中心的仓库,参与者将开发好的代码都推送到这个仓库,进行统一管理。
用户可以自己建立远程仓库,也可以用一些网络上提供的远程仓库(如github)。
在进行远程操作之前,需要对远程库进行配置。以github为例,首先在github上新建一个空的仓库,拿到仓库地址,用 git remote add origin url 命令进行配置,我们在操作的时候不希望经常处理很长的 url,所以为他起了一个别名 origin
![remote][remote.png]
然后将这个仓库推送到远程。推送的时候需要输入github的账号和密码。之后github上就能看到和本地一样的仓库了。
![push][push.png]
由于目前处于master分支,所以我们推送的时候同样推送给远程的master。

关于远程

远程仓库可以理解为一个分支(origin/master),这样操作就相当于在两个分支之间进行同步。
当我们要推送本地的文件到远程时,由于可能别的开发者改动过文件,导致冲突,所以推送之前需要将远程的仓库拉取到本地(通过fetch\pull\clone等子命令),然后将其与本地的分支合并后,再推送出去。

学习资料