GIT 涉及到的几个工作区
工作区、暂存区、版本库
入门:
一、 git和svn的主要区别
git是一个分布式的版本控制工具,而svn是一个集中式版本控制工具。
二、 git工具安装
首先下载git:https://git-scm.com/download/
安装完成后,右键菜单和开始菜单中会出现git相关选项。
三、 git使用
1、 进入git命令行
进入待创建版本库的目录后,在右键菜单中选择“Git Bash”,弹出Git命令窗口(也可以在任意路径打开git命令窗口,使用cd命令进入版本库目录):
2、 初始化用户名和邮箱
“git config --global user.name “用户名” ”命令配置用户名。
“git config --global user.email “邮箱地址” ”命令配置邮箱。
3、 初始化版本库
输入“git init”将当前文件夹初始化为版本库目录,
这时可以看到文件夹中有一个名为“.git”的文件夹,千万不要删除这个文件夹。
4、 提交文件到缓存区
添加文件HelloGit.java到该目录下
然后使用“git add HelloGit.java”命令,将该文件添加到版本库缓存区。
使用“git commit -m “” ”命令提交缓存区的内容。-m后的引号内添加文字说明。
5、 对比修改内容
此时如果对HelloGit.java内容进行更改
使用“git diff 文件名”可以看到更改的内容:
也可以使用git status查看状态
修改文件后,需要再次使用“git add 文件名”将文件添加到缓存区,添加后重新查看状态
使用commit命令提交缓存区更改内容。
6、 查看历史版本
使用git log命令可以查看历史版本列表
7、 回退历史版本
使用git reflog命令可查看版本号
使用 “git reset --hard 版本号”来回退至该版本。
8、 删除文件
在工作目录创建文件,添加到缓存区并提交。
使用命令“rm 文件名”删除该文件,并查看状态。
注:删除后需要使用commit命令提交。
9、 撤销修改
对HelloGit.java文件内容进行修改,查看状态或查看修改内容,
使用“cat 文件名”命令查看文件内容
使用“git checkout -- 文件名”回复至版本库缓存区当前内容,再次查看文件内容,可以发现修改的内容已经被撤销。
注:撤销只能撤销更改后未提交到缓存区的内容。如果已经提交到缓存区或者commit,可以使用版本回复功能。
一、Git这个版本控制系统非常的强大,这里介绍git的基本用法:
git init -- 初始化(进入项目的目录执行)
git config --list -- 查看git 的配置信息
git config --global user.name “用户名” ”命令配置用户名。
git config --global user.email “邮箱地址” ”命令配置邮箱。
git status 查看状态
git commit -m “提交的注释” 提交, 将暂存区的所有文件提交到本地仓库
git commit a.txt 添加,将文件直接由工作区提交到版本仓库,不经过 暂存区
git log 查看提交日志的历史
git log -1 查看最近一次提交的日志
git log -2 最近两次
git log --oneline 以一行显示
git push origin master 将提交到本地仓库的代码推送到远程仓库
git pull origin master 从远程仓库跟新代码到本地
git clone url 从远处仓库克隆一个到本地
git diff 比较工作区与缓存区之间的差别(含有文件内容详细的差异)
git diff --stat 比较工作区与缓存区之间的差别(列出有差异的文件)
git diff --cached 或者 git diff --staged 比较缓存区与版本之间的差别
git diff HEAD 比较工作区与本地仓库之间区别
git checkout 取出历史版本
git checkout file 单独检出某个文件 checkout 的是暂存区的文件(若没有提交到暂存区,暂存区的文件和本地版本仓库的一致)
git reset --hard HEAD 恢复到最新的状态
二、实际应用的一些比较操作:
1.比较工作空间与暂存区的差异
git diff
2.比较工作空间与本地仓库的差异
git diff HEAD
3.比较暂存区与本地仓库的差异
git diff --staged / git diff --cached
远程仓库地址设置相关:
①.增加远程仓库
git remote add <name> <url>
② 删除远程仓库
git remote remove <name>
③更新远程仓库
git remote set-url origin <newurl>
三、常见的一些回退操作
1.添加到暂存区的文件想退回到工作区
git reset HEAD fileNAme
2.添加到暂存区的所有文件想退回到工作区
git reset HEAD
3.将已经提交的代码回退 revert
① git log --找到提交的commitID
②git revert commitID --将这个批次提交的所有的文件执行回退,即对应提交的逆操作,增加的删除,删除的增加,会产生一条提交的记录恢复上次的提交
回退相关的提交操作包含计较的记录(实质上是指针指向了前一个版本):
Git log和reflog
1.log
log命令可以显示所有提交过的版本信息。显示信息如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
如果觉得信息显示太繁琐 可以加上参数 --pretty=oneline[只会留下commit id (版本号 (用SHA1字串表示))和 提交版本时的描述信息] 显示效果如下:
1 2 3 4 |
|
2.reflog
如果在回退以后又想再次回到之前的版本,git reflog 可以查看所有分支的所有操作记录(包括commit和reset的操作),包括已经被删除的commit记录,git log则不能察看已经删除了的commit记录
1 2 3 4 5 6 7 8 9 10 |
|
3.
① 通过执行 git reflog 找到需要恢复的版本号
② 通过 执行 git reset --hard commitid 完成恢复操作
场景:
使用git reflog命令可查看版本号
使用 “git reset --hard 版本号”来回退至该版本。
三、Git忽略规则和.gitignore规则不生效的解决办法
Git忽略规则:
在git中如果想忽略掉某个文件,不让这个文件提交到版本库中,可以使用修改根目录中 .gitignore 文件的方法(如果没有这个文件,则需自己手工建立此文件)。这个文件每一行保存了一个匹配的规则例如:
# 此为注释 – 将被 Git 忽略
*.sample # 忽略所有 .sample 结尾的文件
!lib.sample # 但 lib.sample 除外
/TODO # 只忽略根目录下的TODO目录,不作用于子目录下的TODO
build/ # 忽略所有build目录下的文件 包括子目录下的build, 例如 /build /lib/build
doc/*.txt # 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt
doc/**/*.pdf # 忽略doc下以及子目录下的.pdf
*.a # 所有 .a 后缀的文件都忽略
!lib.a # 不忽略lib.a, 尽管上面忽略了所有的 .a 文件
.gitignore规则不生效的解决办法
把某些目录或文件加入忽略规则,按照上述方法定义后发现并未生效,原因是.gitignore只能忽略那些原来没有被追踪的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。那么解决方法就是先把本地缓存删除(改变成未被追踪状态),然后再提交:
git rm -r --cached .
git add .
git commit -m 'update .gitignore'
四、GIT 删除本地仓库文件的操作方式
具体操作
拉取远程的Repo到本地(如果已经在本地,可以略过)
$ git clone xxxxxx
在本地仓库删除文件
$ git rm 我的文件
在本地仓库删除文件夹
$ git rm -r 我的文件夹/
此处-r表示递归所有子目录,如果你要删除的,是空的文件夹,此处可以不用带上-r。
提交代码
$ git commit -m"我的修改"
推送到远程仓库(比如GitHub)
$ git push origin xxxxxx
0 基础
我们知道Git有三大区(工作区、暂存区、版本库)以及几个状态(untracked、unstaged、uncommited),下面只是简述下Git的大概工作流程,详细的可以参见本博客的其他有关Git的文章【链接】。
(1)打开你的项目文件夹,除了隐藏的.git文件夹,其他项目文件位于的地方便是工作区,工作区的文件需要添加到Git的暂存区(git add),随后再提交到Git的版本库(git commit)。
(2)首次新建的文件都是untracked状态(未跟踪),此时需要git add到暂存区,Git便会在暂存区中生成一个该文件的索引,文件此时处于uncommited状态,需要git commit生成版本库。添加到了版本库之后,再对文件进行修改,那么文件的状态会变为unstaged状态。
简单的认识了Git的工作流程,接下来便可以看看如何删除错误添加到暂存区或版本库里的文件了!
1 删除错误添加到暂存区的文件
有时你在工作区新建了文件TestFile,并且已经将它添加到了暂存区,git会告知,现有有一个文件未提交到版本库,如下图:
1.1 仅仅删除暂存区里的文件
此时你想撤销错误添加到暂存区里的文件,可以输入以下命令:
-
git rm --cache 文件名
上面的命令仅仅删除暂存区的文件而已,不会影响工作区的文件,如上图,TestFile.txt仍然存在,此时输入下面命令,git会告知有一个未跟踪的文件TestFile.txt。
-
git status
1.2 删除暂存区和工作区的文件
-
git rm -f 文件名
工作区的文件也被删除了。
2 删除错误提交的commit
有时,不仅添加到了暂存区,而且commit到了版本库,这个时候就不能使用git rm了,需要使用git reset命令。
错误提交到了版本库,此时无论工作区、暂存区,还是版本库,这三者的内容都是一样的,所以在这种情况下,只是删除了工作区和暂存区的文件,下一次用该版本库回滚那个误添加的文件还会重新生成。
这个时候,我们必须撤销版本库的修改才能解决问题!
git reset有三个选项,--hard、--mixed、--soft。
//仅仅只是撤销已提交的版本库,不会修改暂存区和工作区 git reset --soft 版本库ID
//仅仅只是撤销已提交的版本库和暂存区,不会修改工作区 git reset --mixed 版本库ID
//彻底将工作区、暂存区和版本库记录恢复到指定的版本库 git reset --hard 版本库ID
那我们到底应该用哪个选项好呢?
(1)如果你是在提交了后,对工作区的代码做了修改,并且想保留这些修改,那么可以使用git reset --mixed 版本库ID,注意这个版本库ID应该不是你刚刚提交的版本库ID,而是刚刚提交版本库的上一个版本库。如下图:
(2)如果不想保留这些修改,可以直接使用彻底的恢复命令,git reset --hard 版本库ID。
(3)为什么不使用--soft呢,因为它只是恢复了版本库,暂存区仍然存在你错误提交的文件索引,还需要进一步使用上一节的删除错误添加到暂存区的文件,详细见上文。
五、乱码的解决方案