Git
git官网截图git [git] 是一个分布式的版本控制系统。官方网站地址:https://git-scm.com/
一. 简介
-
Linux操作系统有着众多的开发者共同参与开发。一开始该项目使用Bitkeeper来管理和维护代码,2005年的时候,Bitkeeper不再免费使用,这就迫使着Linux开源社区开发一套自己的版本控制系统。
-
自2005年诞生以来,Git日臻完善,它的速度飞快,特别适合大型项目的开发,还有着令人难以执行的非线性分支管理系统,可以应对各种复杂的项目的开发。
1.1 Git的工作模式
我们自己的计算机从版本服务器同步代码,日常开发的过程中90%以上的操作都是在本地计算机,在本地操作完成后需要推送到远程服务器。
1.2 Git的三种工作状态
- 已修改(modified)
- 已暂存(staged)
- 已提交(commited)
1.3 本地库与服务器库
二. Git的基本命令(本地仓库管理)
-
git init
: 初始化仓库(需要记) -
git status
: 查看工作空间的状态(需要记) -
git add a.txt
: 将已修改的文件纳入到暂存区。(需要记) -
git add -A
: 将所有的已修改的文件纳入到暂存区 (不用记) -
git add -h
: 查看git add 所有的参数 (需要记) -
git rm --cached [文件名]
: 将指定文件从暂存区移除,首次初始化提交的时候才会使用到(不用记) -
git commit -m '提交说明'
: 将暂存区的内容提交到本地版本库 (需要记) -
git log
: 查看提交历史信息 (需要记) -
git log -3
: 查看最近3条提交信息(需要记) -
git log --oneline
: 将提交日志信息按行显示。(不用记) -
git log --pretty=format:"%h - %an, %ar : %s"
: 按照指定的格式输出。(不用记) -
git checkout -- a.txt
: 撤销删除或者更新文件 (不用记) -
git reset HEAD [文件名]
: 将已追踪的指定文件从暂存区移除。(不用记) -
git commit --amend -m 'new msg'
: 修正提交信息。 (需要记) -
git commit -am 'msg'
: 将git add 与 git commit两条命令进行合并(需要记) -
git log --graph --oneline
: 查看日志的简单图形化信息(需要记)
三. 修改用户信息
在提交信息的时候会显示提交人的用户名和邮件,可以自定义该信息,可以在两个全局和局部进行设置:
- C:\Users\Administrator\.gitconfig 全局设置
- .git\config 局部设置,不同的项目情况下使用
设置全局的信息使用如下命令:
git config --global user.email "zou@qq.com"
git config --global user.name "miller"
设置局部信息使用如下命令:
git config --local user.email "zou@qq.com"
git config --local user.name "miller"
四. git rm与rm的区别
4.1 使用 rm 命令删除文件,如下:
4.2 使用 git rm 删除文件,如下:
4.3 说明
-
rm是操作系统级别的命令,只是将文件从工作区移除, 被删除的文件并没有纳入到暂存区;而git rm命令实际上是由两个命令(rm和git add)合成的,git rm删除了工作区的文件,并将删除的文件纳入到暂存区。
-
当使用rm命令删除文件的时候,只需要通过
git checkout a.txt
即可撤销删除;而通过git rm命令删除文件,需要通过两个命令撤销修改,这两个命令一次为git reset HEAD
和git checkout a.txt
.
五. .gitignore
在Git中,有些文件或者文件夹并不需要纳入到版本控制系统,例如maven编译后的target目录,ide的配置文件,所以Git提供了一个非常优秀的解决方案,就是.gitignore。需要在Git的版本库中创建一个名为.gitignore的文件,文件的语法如下:
settings.xml #将同级目录下的settings.xml文件忽略
/target #忽略/target目录以及所有的子目录和文件
/*/test #忽略掉/abc/test /def/test,但是不能忽略掉/a/b/test
/*/*.iml #忽略掉/abc/a.iml /def/bcd.iml,但是不能忽略掉/a/b/cde.iml
/*.java #忽略掉User.java, 但是不能忽略/com/Person.java
/debug/*.java #忽略掉/debug/A.java, 但是不能忽略掉/debug/a/C.java
*.log #忽略掉所有的以log结尾的文件
bin/ #会忽略bin目录以及所有的子目录,但如果bin是文件则不忽略
六. 分支
-
git branch
: 查看所有的分支,以及当前所处的分支 -
git branch [分支名]
: 创建分支,自定义分支名字 -
git branch [分支名] d7e347
: 创建一个分支指向d7e347这个提交。 -
git checkout [分支名]
: 切换到指定分支 -
git checkout -b [分支名]
: 创建分支,并切换到该分支 -
git branch -d [分支名]
: 删除指定分支 -
git merge [分支名]
: 将指定分支合并到当前分支。 -
gitk --all
: 图形化的方式查看git的分支信息,以及对文件提交信息。 -
git log --graph --oneline --all
: 图形化的方式展示分支信息。 -
git branch -m [原分支名] [新分支名]
: 更改分支名字.
6.1 Git提交的原理
Git每次在提交的时候,会生成一个提交对象,那么这个新生成的提交对象有一个指针,该指针会指向上一次的提交对象,如下图所示:
6.2 分支的原理
Git 的分支,其实本质上仅仅是指向提交对象的可变指针。 Git 的默认分支名字是
master
。 在多次提交操作之后,你其实已经有一个指向最后那个提交对象的master
分支。 它会在每次的提交操作中自动向前移动。Git 的master
分支并不是一个特殊分支。 它就跟其它分支完全没有区别。 之所以几乎每一个仓库都有master
分支,是因为git init
命令默认创建它,并且大多数人都懒得去改动它。
- 如下图所示,master分支执行f30ab这个提交,而HEAD指向了master,意思是当前用户所处的分支是master.
HEAD其实就是一个指针,指向的是当前用户所处的分支,可以在.git这个目录下的HEAD文件中查看到信息。
-
A. 使用
git branch testing
这个命令会创建一个testing分支,此时testing分支和master分支指向的是同一个提交,如下图所示:
-
B. 当使用
git checkout testing
这个命令,会切换到testing这个分支,此时HEAD会指向testing,如下图:
-
C. 当在testing这个分支,编辑某个文件并提交。此时testing这个分支执行的是最新的提交,而master还是指向上次一的提交,如下图:
- D. 再次切换到master这个分支,编辑某个文件并提交。此时master指向的是另外一个提交,如下图:
-
E. 此时用
git log --all --graph
看到的结果如下图所示:
6.3 分支的合并
-
在master分支执行
git merge testing
命令会出现冲突,如下图:
-
冲突的原因是因为,有master和testing这两个分支最新的提交的上一次提交指向同一个提交,这种情况可能会导致冲突,该冲突需要手动的修改文件,此时文件内容如下图:
-
修改文件的内容后,执行
git add a.txt
和git commit -m 'merge completed'
即可完成合并。
-
此时分支的形式如下:
七. 版本的回退
-
git reset --hard HEAD^
: 回到上一个版本。 -
git reset --hard HEAD^^
: 回到上两个版本。 -
git reset --hard HEAD~5
: 回到上5个版本。 -
git reset --hard f1f52
: 回到一个固定的版本, f1f52为commit_id的前几位,只要能够保证唯一性就可以。 -
查看所有的操作日志命令:
git reflog
八. 保存工作现场
当我们正在某个分支上工作的时候,而功能并没有完善,又或者代码没有编写完成,此时也不能提交。而被领导要求在其他分支上进行操作,在其他分支上也可以看到修改状态,可能造成在其他分支上误操作导致提交。这个时候就需要用到工作现场。
-
git stash
: 保存工作现场。 -
git stash list
: 查看所有的工作现场。 -
git stash pop
: 弹出工作现场,并将工作现场从stash中删除。 -
git stash apply
: stash中的内容并不会删除,需要通过 stash drop stash@{0} 删除工作现场。 -
git stash apply stash@{0}
: 直接开始运用指定的工作现场。
九. 标签与diff
9.1 标签
标签的作用是当项目发布一个里程碑的时候,给其一个做个标记,往往用来指定版本。标签的命令如下:
-
git tag v1.0
: 创建一个V1.0的标签。 -
git tag
: 查看所有的标签 -
git tag -d v1.0
: 删除v1.0这个标签 -
git tag -a [标签名] [commit id]
: 给指定的提交打标签
9.2 diff
diff命令是源于linux操作系统中的命令,用于查看两个文件中的区别,git也提供了该功能,命令如下:
-
git diff
: 查看暂存区与工作区的文件的区别 -
git diff HEAD
: 查看版本库最新一次提交的与工作区间的差异 -
git diff ba8dc34c
: 查看指定提交与工作区间的差异 -
git diff --cached
: 查看版本库与暂存区间文件的差异
其他命令
-
git checkout 79af3
: 切换到79af3这个提交点。 -
git blame a.txt
: 追踪a.txt这个文件的提交信息。
命令的区别:
-
git checkout dev
: 切换分支。 -
git checkout -- a.txt
: 丢弃掉工作目录中相对于上一次添加到暂存区的修改。
网友评论