GIT是一个开源的分布式版本控制系统,用于敏捷高效地处理任何项目。它是Linux Torvalds为了帮助管理Linux内核而开发的一个开放源码的版本控制软件。Git与常用的版本控制工具SVN,CVS,Subversion等不同,它采用了分布式版本库的方式,不必服务器端软件支持。
一、GIT配置
1、用户信息
$ git config --global user.name "your_username"
$ git config --global user.email email_address
2、查看配置信息
$ git config --list
$ git config user.name
二、GIT工作流程
- 克隆git资源作为工作目录
- 在克隆的资源上添加或修改文件
- 如果其他人修改了,你可以更新资源
- 在提交前查看修改
- 提交修改
- 在修改完成后,如果发现错误,可以撤回提交,再次修改之后并提交
三、GIT工作区、暂存区和版本库
- 工作区:就是在电脑里能看到的目录
- 暂存区:英文叫stage或index。一般存放在.git目录下的index文件中,所以暂存区有时也叫作索引(index)
- 版本库:工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库
它们的关系图下图:
图中左侧为工作区,右侧为版本库。在版本库中标记为“index”的区域是暂存区(stage,index),标记为“master”的是master分支所代表的的目录树。
图中我们可以看出此时“HEAD”实际是指向master分支的一个“游标”。所以图示的命令中出现HEAD的地方可以用master来替换。
图中的objects标识的区域为Git的对象库,位于“.git/objects”目录下,里面包含了创建的各种对象及内容。
当对工作区修改(或新增)的文件执行git add命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。
当执行提交操作git commit时,暂存区的目录树写到版本库(对象库)中,master分支会做相应的更新。即master指向的目录树就是提交时暂存区的目录树。
当执行git reset HEAD命令时,暂存区的目录树会被重写,被master分支指向的目录树所替换,但是工作区不受影响。
当执行git rm --cached
当执行git checkout .或git checkout --
当执行git checkout HEAD .或git checkout HEAD
四、Git新建仓库
1、git init
Git使用git init命令来初始化一个Git仓库,Git的很多命令都需要在Git的仓库中运行,所以git init是使用Git的第一个命令。
在执行此命令后,会生成一个.git目录,该目录包含了资源的所有元数据,其他的项目目录保持不变。
2、使用方法
初始化当前目录成为一个Git仓库
$ git init
也可以初始化一个指定的目录
$ git init newrepo
如果当前目录下有几个文件想要纳入版本控制,需要先用git add命令告诉Git开始对这些文件进行跟踪,然后提交:
$ git add *.c
$ git add README
$ git commit -m 'commit message'
#### 3、git clone
可以使用**git clone**从现有Git仓库中拷贝项目
```shell
$ git clone <repo>
$ git clone <repo> <directory>
五、Git基本操作
1、获取与创建项目命令
1)git init
2)git clone
2、基本快照
1)git add
注意这里,未git add之前,使用git status命令查看到的文件状态为??,使用git add之后,文件状态为A。此后,若工作区中的文件再被修改,此时使用git status命令查看到的文件状态为AM,此时需要再次对该文件执行git add
2)git status
用来查看在上次git add之后是否有修改。-s参数可以获得简短的结果输出。
3)git diff
执行git diff来查看执行git status的结果的详细信息。
git diff命令显示已写入缓存与已修改但尚未写入缓存的改动的区别。git diff有两个主要的应用场景。
- 尚未缓存的改动:git diff
- 查看已缓存的改动:git diff --cached
- 查看已缓存的与未缓存的所有改动:git diff HEAD
- 显示摘要而非整个diff:git diff --stat
4)git commit
使用git add命令将想要快照的内容写入缓存区,而执行git commit将缓存区的内容添加到仓库中。
Git为你的每一个提交都记录你的名字与电子邮箱地址,所以在一开始的时候需要配置用户名和邮箱地址。
执行git commit之后,再执行git status会显示如下结果:
$ git status
# On branch master
nothing to commit (working directory clean)
还要注意一点,在使用git commit命令时,最好使用-m参数来填写提交信息。如果你没有在此刻填写提交信息,Git会默认打开vim。
如果你觉得git add提交缓存的流程太过繁琐,Git也允许你用-a选项跳过这一步。命令格式如下:
$ git commit -a
5)git reset HEAD
用于取消已缓存的内容。
6)git rm
要从Git中移除某个文件,就必须要从已跟踪文件清单中移除,然后提交。可以使用以下命令完成此项工作
$ git rm <file>
如果删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项-f
如果把文件从暂存区移除,但仍然希望保留在当前工作目录中,换句话说,仅是从跟踪清单中删除,使用--cached选项即可。
可以使用-r递归删除,即如果后面跟的是一个目录作为参数,则会递归删除整个目录中的所有子目录和文件
进入某个目录中,执行下面的语句,会删除该目录下的所有文件和子目录。
$ git rm -r *
7)git mv
用于移动或重命名一个文件、目录、软连接。
六、Git分支管理
几乎每一种版本控制系统都以某种形式支持分支。使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作。
创建分支命令:
$ git branch branchname
切换分支命令
$ git checkout branchname
当你切换分支的时候,Git会用该分支的最后提交的快照替换你的工作目录的内容,所以多个分支不需要多个目录。
合并分支命令:
$ git merge
可以多次合并到统一分支,也可以选择在合并之后直接删除被并入的分支。
1、Git分支管理
1)列出分支
列出分支的基本命令:
$ git branch
没有参数时,git branch会列出在本地的所有分支。
$ git branch
* master
此例的意思就是,有一个叫做master的分支,并且该分支是当前分支。当我们执行git init的时候,默认情况下Git就会创建master分支。如果要手动创建一个分支,执行git branch branchname即可。
当以此方式在上次提交更新之后创建了新分支,如果后来又有更新提交,然后又切换到了新分支中,Git将还原工作目录到创建新分支时的样子。
我们也可以使用git checkout -b branchname命令来创建新分支并立即切换到该分支下,从而在该分支中操作。
使用分支可以将工作切分开来,从而让我们能够在不同开发环境中做实,并来回切换。
2)删除分支
删除分支命令:
$ git branch -d branchname
3)分支合并
一旦某分支有了独立内容,你终究会希望将它合并回到你的主分支。你可以使用以下命令将任何分支并合并到当前分支中去:
$ git merge branchname
4)合并冲突
需要注意的是。在合并的时候不仅仅会出现文件的添加和移除等操作,经常会有同时存在但在分支中被修改的情况。
当将分支合并到master分支出现合并冲突时,我们需要手动去修改它。
在Git中,我们可以用git add告诉Git文件冲突已经解决。
七、Git查看提交历史
在使用Git提交了若干更新之后,又或者克隆了某个项目,想回顾下提交历史,我们可以使用git log命令查看。
我们可以用--online选项来查看历史记录的简洁版本。
$ git log --online
我们还可以用--graph选项,查看历史中什么时候出现了分时、合并。
我们还可以用--reverse来逆向显示所有日志。
如果只想查找指定用户的提交日志可以使用命令git log --author=username
如果你要指定日期,可以执行几个选项:--since和before,以及--until和after。例如:查看Git项目中三周前且在四月十八日之后的所有提交,并使用--no-merges选项以隐藏合并提交:
$ git log --online --before={3.weeks.ago} --after={2020-04-18} --no-merges
八、Git标签
如果你达到一个重要的阶段,并希望永远记住那个特别的提交快照,你可以使用git tag给它打上标签。
git tag -a 1.0
-a选项意为“创建一个带注解的标签”。如果不用这个选项,就不会记录这标签是什么时候打的,谁打的,也不会让你添加个标签的注解。当你执行git tag -a命令时,Git会打开你的编辑器,让你写一句标签注解,就像给提交写注解一样。
打上标签之后,当我们执行git log --decorate时就可以看到我们的标签了。
如果我们忘了给某个提交打标签,又将它发布了,我们可以给它追加标签。
如果我们要查看所有标签可以用如下命令:
$ git tag
指定标签信息命令:
$ git tag -a <tagname> -m "tag message"
PGP签名标签命令:
$ git tag -s <tagname> -m "tag message"
九、Git远程仓库(Github)
1、添加远程仓库
要添加一个新的远程仓库,可以指定一个简单的名字,以便将来引用,命令格式如下:
$ git remote add [alias] [url]
查看当前的远程库:
$ git remote
$ git remote -v #可以看到每个别名的实际链接地址
2、提取远程仓库
Git由两个命令来提取远程仓库的更新
$ git fetch alias #从远程仓库下载更新的分支与数据
$ git merge alias/branch #把下载下来的alias/branch合并到当前分支
3、推送到远程仓库
推送新分支与数据到远程仓库:
$ git push [alias] [branch]
以上命令将[branch]分支推送成为[alias]远程仓库上的[branch]分支
4、删除远程仓库
$ git remote rm [alias]
十、Gitee
使用方法和Github基本一致。
一个本地仓库可以同时关联多个远程仓库。例如,一个本地仓库可以既关联Github中的一个仓库,又关联Gitee中的一个仓库。示意图如下:
本文是我在菜鸟教程学习Git时的摘录,想要学习使用Git的朋友可以花一个下午到这里去学习一下。