6 版本回退
6.1 日志查看
现在我已经对readme.txt文件做了多次修改了,那么我现在想查看下历史记录,如何查呢?我们现在可以使用命令 git log 演示如下所演示
git log命令显示从最近到最远的显示日志,我们可以看到最近提交
6.2 版本回退和撤销
6.2.1版本回退
现在我想使用版本回退操作,我想把当前的版本回退到上一个版本,要使用什么命令呢?可以使用如下2种命令,第一种是:git reset --hard HEAD^ 那么如果要回退到上上个版本只需把HEAD^ 改成 HEAD^^ 以此类推。那如果要回退到前100个版本的话,使用上面的方法肯定不方便,我们可以使用下面的简便命令操作:git reset --hard HEAD~100 即可
6.2.2 回退撤销
通过版本号回退,使用命令方法如下:git reset --hard 版本号
可以通过如下命令即可获取到版本号:git reflog
2 删除文件
添加并且提交了多个文件。般情况下,可以直接在文件目录中把文件删了,或者使用如上rm命令:rm b.txt ,如果我想彻底从版本库中删掉了此文件的话,可以再执行commit命令 提交掉。git rm test.txt。
我们发现删除的文件直接进入暂存区(此刻需要注意,如果使用rm删除不在暂存区,需要git add才会进入暂存区。如果进入暂存区可以退回工作区,使用下面命令 git reset HEAD test.txt
7 Git配置信息Configgi
7.1 config 概述
在git中,我们使用git config 命令用来配置git的配置文件,git配置级别主要有以下3类:
1、仓库级别 local 【优先级最高】
2、用户级别 global【优先级次之】
3、系统级别 system【优先级最低】
git 仓库级别对应的配置文件是当前仓库下的.git/config
git 用户级别对应的配置文件是用户宿主目录下的~/.gitconfig
git 系统级别对应的配置文件是git安装目录下的 /etc/gitconfig
仓库级别
git config --local -l
用户级别
git config --global -l
7.2 config 修改
演示修改用户名和邮箱:
git config --global user.name "renliang"
git config --global user.email "renliang@126.com"
7.3 gitignore文件
在项目中,我们可能一起提交多个文件
git add -A 提交所有变化
git add -u 提交被修改(modified)和被删除(deleted)文件,不包括新文件(new)
git add . 提交新文件(new)和被修改(modified)文件,不包括被删除(deleted)文件
在使用git的过程中,一般我们总会有些文件无需纳入git的管理,也不希望它们总出现在未跟踪文件列表,这些文件通常是日志文件、临时文件、编译产生的中间文件、工具自动生成的文件等等。此时我们可以创建一个名为 .gitignore 的文件,列出要忽略的文件模式,Git会根据这些模式规则来判断是否将文件添加到版本控制中。注意:在windows下可以创建文件名为.gitignore.,保存之后系统会自动重命名为 .gitignore
7.4 格式规范
(1)所有空行或者以注释符号 # 开头的行都会被 Git 忽略
(2)可以使用标准的 glob 模式匹配
(3)匹配模式最后跟斜杠(/)说明要忽略的是目录
(4)要忽略指定模式以外的文件或目录,可以在模式前加上感叹号(!)进行取反
7.5 glob 模式
所谓的 glob 模式是指 shell 所使用的简化了的正则表达式,匹配规则如下:
"*":星号匹配零个或多个任意字符
[]:匹配任何一个列在方括号中的字符,如[ab]匹配a或者匹配b
"?":问号匹配一个任意字符
[n-m]:匹配所有在这两个字符范围内的字符,如[0-9]表示匹配所有0到9的数字
匹配示例
logs/: 忽略当前路径下的logs目录,包含logs下的所有子目录和文件
/logs.txt: 忽略根目录下的logs.txt文件
*.class: 忽略所有后缀为.class的文件
!/classes/a.class:不忽略classes目录下的a.class文件
tmp/*.txt: 只忽略tmp目录下的.txt文件
**/foo: 可以忽略/foo, a/foo, a/b/foo等
8 .gitignore的使用
1. 在需要创建 .gitignore 文件的文件夹, 右键选择Git Bash 进入命令行,进入项目所在目录。
2. 输入 touch .gitignore 在文件夹就生成了一个“.gitignore”文件
3.然后用编辑器打开这个文件进行编辑就行了。
4.然后就写规则来操作要忽略的文件了。
.gitignore内容
创建两个文件
查看状态我们发现testclass.class不在工作区
提交也不会进入暂存区
9 定义全局的.gitignore
除了可以在项目中定义.gitignore文件外,还可以设置全局的.gitignore文件来管理所有Git项目的行为。
这种方式在不同的项目开发者之间是不共享的,是属于项目之上Git应用级别的行为。
可以在任意目录下创建相应的.gitignore文件,然后再使用以下命令配置Git
git config --global core.excludesfile ~/.gitignore
java开发通用模板
## .gitignore for Grails 1.2 and 1.3
# .gitignore for maven
target/
*.releaseBackup
# web application files
#/web-app/WEB-INF
# IDE support files
/.classpath
/.launch
/.project
/.settings
/*.launch
/*.tmproj
/ivy*
/eclipse
# default HSQL database files for production mode
/prodDb.*
# general HSQL database files
*Db.properties
*Db.script
# logs
/stacktrace.log
/test/reports
/logs
*.log
*.log.*
# project release file
/*.war
# plugin release file
/*.zip
/*.zip.sha1
# older plugin install locations
/plugins
/web-app/plugins
/web-app/WEB-INF/classes
# "temporary" build files
target/
out/
build/
# other
*.iws
#.gitignore for java
*.class
# Package Files #
*.jar
*.war
*.ear
## .gitignore for eclipse
*.pydevproject
.project
.metadata
bin/**
tmp/**
tmp/**/*
*.tmp
*.bak
*.swp
*~.nib
local.properties
.classpath
.settings/
.loadpath
# External tool builders
.externalToolBuilders/
# Locally stored "Eclipse launch configurations"
*.launch
# CDT-specific
.cproject
# PDT-specific
.buildpath
## .gitignore for intellij
*.iml
*.ipr
*.iws
.idea/
## .gitignore for linux
.*
!.gitignore
!.gitattributes
!.editorconfig
!.eslintrc
!.travis.yml
*~
## .gitignore for windows
# Windows image file caches
Thumbs.db
ehthumbs.db
# Folder config file
Desktop.ini
# Recycle Bin used on file shares
$RECYCLE.BIN/
## .gitignore for mac os x
.DS_Store
.AppleDouble
.LSOverride
Icon
# Thumbnails
._*
# Files that might appear on external disk
.Spotlight-V100
.Trashes
## hack for graddle wrapper
!wrapper/*.jar
!**/wrapper/*.jar
gitignore语法说明:
注释:注释使用#,换行没有实际作用,只是为方便阅读。
正则匹配(不可以用来匹配/):
星号(*):匹配零个或多个任意字符。
问号(?):匹配一个任意字符。
目录匹配:
当/在字符串起始位置时,表示从.gitignore文件所在目录开始匹配,否则下级目录也都将匹配。
当/在文件名末尾时,只匹配目录,否则同名的目录和文件都将被匹配。
取反(不忽略):之前已经被忽略了的文件,使用!后,该文件将会被重新包含到跟踪列表中(即不忽略),注意:如果该文件的父级目录被忽略了,使用!无效。
匹配字符列表:使用[],可匹配中括号里的任意一个字符,比如:ab[sd]gk,即可以匹配:absgk、abdgk。
匹配多级目录:使用两个星号**,比如:a/**/b 可以用来匹配:a/b、a/x/b、a/x/y/b等等。
10 diff命令
10.1 工作目录 vs 暂存区
git diff
意义:查看文件在工作目录与暂存区的差别。如果还没 add 进暂存区,则查看文件自身修改前后的差别。也可查看和另一分支的区别。
10.2 暂存区 vs Git仓库
git diff --cached
意义:表示查看已经 add 进暂存区但是尚未 commit 的内容同最新一次 commit 时的内容的差异。 也可以指定仓库版本:
git diff --cached
10.3 工作目录 vs Git仓库
git diff
意义:查看工作目录同Git仓库指定 commit 的内容的差异。
=HEAD 时:查看工作目录同最近一次 commit 的内容的差异。
10.4 Git仓库 vs Git仓库
git diff
意义:Git仓库任意两次 commit 之间的差别。
以上命令可以不指定 ,则对全部文件操作。以上命令涉及和 Git仓库 对比的,均可指定 commit 的版本。
11 Git分支管理
Git 的默认分支就是 master。你所作的commit会在master分支上自动移动。 在多次提交操作之后,master分支指向最后那个commit object(提交对象链)。
Git 的 “master” 分支并特殊,跟其它分支没有区别。 之所以几乎每一个仓库都有 master 分支,是因为 git init 命令默认创建它。
11.1 分支创建
通过git branch来查看和创建分支。
git branch dev
分支切换到dev
git checkout dev
创建分支与切换分支同时完成
git checkout -b dev2
在dev2分支创建一个文件A.txt并且提交。我们发现在dev2分支可以看到这个文件,当我们切换会master时候无法看到这个文件。
所在分支为dev2时
所在分支为master时
12 分支删除
1.不能删除自己所在的分支
我们可以切换到master删除一个合并后的或者没有发生变化的分支
2.如果一个分支发生了变化不能删除
13 分支合并
我们发现master分支上也添加了A.txt这个文件
如果修改的是同一个文件也可以做同样的合并,让我们切换到dev2分支修改A.txt中的内容。在A.txt中添加了一行World
我们切换会master分支的时候发现提示了A.txt的变动。通过合并发现master分支上也合并了dev2修改的内容,合并之后dev2就删除就被允许了。
14 分支的本质
master指向的是提交
HEAD是指向当前的分支,当前在哪个分支就指向哪个分支
第二张图上我们可以看到创建了dev的分支,当我们切换到dev分支的时候HEAD就会指向dev
当我们进入.git文件夹查看HEAD的内容的时候可以看到,所处分支不同内部的文件指向就不同。
master分支
我们在dev2分支里面修改A.txt文件添加一行 update by dev2后提交
我们在master分支里面修改A.txt文件同时添加一行 update by master后提交
合并时候我们发现出现冲突
<<<<<<<<<<<HEAD是当前指向的分支所修改
>>>>>>>>>>dev2是dev2分支修改
我们需要手工合并。修改后报了master的内容
我们可以通过图形来查看冲突的提交日志。
git log --graph
15 Git stash
1 当正在dev分支上开发某个项目,这时项目中出现一个bug,需要紧急修复,但是正在开发的内容只是完成一半,还不想提交,这时可以用git stash命令将修改的内容保存至堆栈区,然后顺利切换到hotfix分支进行bug修复,修复完成后,再次切回到dev分支,从堆栈中恢复刚刚保存的内容。
2 由于疏忽,本应该在dev分支开发的内容,却在master上进行了开发,需要重新切回到dev分支上进行开发,可以用git stash将内容保存至堆栈中,切回到dev分支后,再次恢复内容即可。
总的来说,git stash命令的作用就是将目前还不想提交的但是已经修改的内容进行保存至堆栈中,后续可以在某个分支上恢复出堆栈中的内容。这也就是说,stash中的内容不仅仅可以恢复到原先开发的分支,也可以恢复到其他任意指定的分支上。git stash作用的范围包括工作区和暂存区中的内容,也就是说没有提交的内容都会保存至堆栈中。
15.1 git stash
我们在master分支修改A.txt添加一行
我们发现会提示错误,git建议我们先提交或者stash修改的内容再切换
我们执行
git stash
会先把修改的内容做保存然后我们就可以切换到其他的分支
列出stash保存的所有修改
我们切换回master分支执行,我们能看到上次保存的操作
git stash list
我们同样也可以再次修改文件去做stash,这样就会产生记录
我们可以将stash过的修改恢复出来。通过pop取出最近的恢复并且删除stash中的修改
git stash pop
如果两次pop由于提一次没有做提交则会报错,所以我们应该把第一次pop的提交,在pop第二次的。