一:Git是什么?
Git是目前世界上最先进的分布式版本控制系统。
工作原理 / 流程:
二:SVN与Git的最主要的区别?
SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器哪里得到最新的版本,然后干活,干完后,需要把自己做完的活推送到中央服务器。集中式版本控制系统是必须联网才能工作,如果在局域网还可以,带宽够大,速度够快,如果在互联网下,如果网速慢的话,就纳闷了。
Git是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在自己的电脑上。既然每个人的电脑都有一个完整的版本库,那多个人如何协作呢?比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
三、在windows上如何安装Git?
Git-2.17.0-64-bit.exe是 windows版的Git,如下:
安装步骤:
安装成功后,进入目标目录,然后鼠标右击,就可以看到Git相关菜单
本地库初始化
注意:
.git 目录中存放的是本地库相关的子目录和文件,不要删除,也不要胡乱修改。
git的命令和unix的名称相似
设置签名
如果想要将本地的项目提交的远程仓库的话,必须要设置签名。签名的作用就是用来标识用户,以区分不同的开发人员。
设置签名有两种方式,一种是为单个仓库单独设置,这种方式只针对单个仓库有效;另一种是全局配置,采用这种方式配置后,所有仓库都有效。如果对两种方式都进行了配置,那么会优先使用单个仓库配置方式的配置信息。配置格式如下:
单个仓库
git config user.name 用户名
git config user.email 邮箱
全局配置
git config --global user.name 用户名
git config --global user.email 邮箱
或者
该种方式配置信息会保存在系统盘的系统用户目录下的.gitconfig文件中,保存格式同上面一样。
一般情况下都是配置成全局有效即可,简单,不用为每个仓库都设置签名。当需要为某个仓库配置不同的信息时,只需要单独再为这个仓库按照方式一配置一下即可。
四、基本操作
状态查看
git status 查看工作区、暂存区状态
添加
git add [file name] 将工作区的“新建/修改”添加到暂存区
提交
git commit -m "注释" [file name] 将暂存区的内容提交到本地库
查看历史记录
git reflog
HEAD@{移动到当前版本需要多少步}
移动到哪个版本
git reset --hard [[局部索引值]
基于索引值操作[推荐]
git reset --hard [局部索引值]
git reset --hard a6ace91
使用^符号:只能后退
git reset --hard HEAD^ ;注:一个^表示后退一步,n 个表示后退 n 步
使用~符号:只能后退
git reset --hard HEAD~n
注:表示后退 n 步
移动到第一个版本
reset 命令的三个参数对比
--soft 参数
仅仅在本地库移动 HEAD 指针
--mixed 参数
在本地库移动 HEAD 指针,重置暂存区
--hard 参数
在本地库移动 HEAD 指针,重置暂存区、工作区
删除文件并找回
前提:删除前,文件存在时的状态提交到了本地库。
操作:git reset --hard [指针位置]
删除操作已经提交到本地库:指针位置指向历史记录
删除操作尚未提交到本地库:指针位置使用 HEAD
撤销文件
一:撤销修改:
命令 git checkout --readme.txt 意思就是,把readme.txt文件在工作区做的修改全部撤销
命令git reset --hard [指针位置] 可以撤销,暂存区和本地库的文件
王东@DESKTOP-46G41C7 MINGW64 /e/gittest
$ git init #git初始化
Initialized empty Git repository in E:/gittest/.git/
王东@DESKTOP-46G41C7 MINGW64 /e/gittest (master)
$ vim readme.txt #创建一个readme.txt文本,并添加内容为aaaaaa
王东@DESKTOP-46G41C7 MINGW64 /e/gittest (master)
$ cat readme.txt #查看readme.txt文本内容
aaaaaaaa
王东@DESKTOP-46G41C7 MINGW64 /e/gittest (master)
$ git status #查看git状态
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
readme.txt
nothing added to commit but untracked files present (use "git add" to track)
王东@DESKTOP-46G41C7 MINGW64 /e/gittest (master)
$ git add readme.txt #将readme.txt文本添加到暂存区
warning: LF will be replaced by CRLF in readme.txt.
The file will have its original line endings in your working directory.
王东@DESKTOP-46G41C7 MINGW64 /e/gittest (master)
$ git status #查看git状态
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: readme.txt
王东@DESKTOP-46G41C7 MINGW64 /e/gittest (master)
$ git commit -m "create new file,content is aaaaa" readme.txt #提交readme.txt文件到本地库
warning: LF will be replaced by CRLF in readme.txt.
The file will have its original line endings in your working directory.
[master (root-commit) 5cc2be2] create new file,content is aaaaa
1 file changed, 1 insertion(+)
create mode 100644 readme.txt
王东@DESKTOP-46G41C7 MINGW64 /e/gittest (master)
$ git status #查看git状态
On branch master
nothing to commit, working tree clean
王东@DESKTOP-46G41C7 MINGW64 /e/gittest (master)
$ vim readme.txt #添加bbbbbb,cccccc内容到readme.txt文件
王东@DESKTOP-46G41C7 MINGW64 /e/gittest (master)
$ cat readme.txt #查看readme.txt文件内容
aaaaaaaa
bbbbbbbb
cccccccc
王东@DESKTOP-46G41C7 MINGW64 /e/gittest (master)
$ git status #查看git状态
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
王东@DESKTOP-46G41C7 MINGW64 /e/gittest (master)
$ git commit -m "content add bbbbbbb,cccccccc" readme.txt #将readme.txt文件提交到本地库
warning: LF will be replaced by CRLF in readme.txt.
The file will have its original line endings in your working directory.
warning: LF will be replaced by CRLF in readme.txt.
The file will have its original line endings in your working directory.
[master 6499fbb] content add bbbbbbb,cccccccc
1 file changed, 2 insertions(+)
王东@DESKTOP-46G41C7 MINGW64 /e/gittest (master)
$ git status #git状态
On branch master
nothing to commit, working tree clean
王东@DESKTOP-46G41C7 MINGW64 /e/gittest (master)
$ vim readme.txt #添加ddddd字符串到readme.txt文件
王东@DESKTOP-46G41C7 MINGW64 /e/gittest (master)
$ cat readme.txt
aaaaaaaa
bbbbbbbb
cccccccc
dddddddd
王东@DESKTOP-46G41C7 MINGW64 /e/gittest (master)
$ git status #查看git状态
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
王东@DESKTOP-46G41C7 MINGW64 /e/gittest (master)
$ git checkout -- readme.txt #撤销工作区readme.txt修改的内容,暂存区和本地库撤销不了
王东@DESKTOP-46G41C7 MINGW64 /e/gittest (master)
$ cat readme.txt #发现工作区添加的ddddddd内容以及被删除
aaaaaaaa
bbbbbbbb
cccccccc
王东@DESKTOP-46G41C7 MINGW64 /e/gittest (master)
$ vim readme.txt #添加eeeee,fffff内容到readme.txt文件
王东@DESKTOP-46G41C7 MINGW64 /e/gittest (master)
$ cat readme.txt #查看readme.txt文件内容
aaaaaaaa
bbbbbbbb
cccccccc
eeeeeeee
ffffffff
王东@DESKTOP-46G41C7 MINGW64 /e/gittest (master)
$ git status #git状态
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
王东@DESKTOP-46G41C7 MINGW64 /e/gittest (master)
$ git add readme.txt #将readme.txt文件添加到暂存区
王东@DESKTOP-46G41C7 MINGW64 /e/gittest (master)
$ git commit -m "content add eeeeee,ffffff" readme.txt #将readme.txt文件添加到本地库
[master 240c7f4] content add eeeeee,ffffff
1 file changed, 2 insertions(+)
王东@DESKTOP-46G41C7 MINGW64 /e/gittest (master)
$ git checkout -- readme.txt #撤销readme.txt文件的操作
王东@DESKTOP-46G41C7 MINGW64 /e/gittest (master)
$ cat readme.txt #查看readme.txt文件内容,发现内容没有被撤销,证明checkout命令,无法撤销本地库的文件
aaaaaaaa
bbbbbbbb
cccccccc
eeeeeeee
ffffffff
王东@DESKTOP-46G41C7 MINGW64 /e/gittest (master)
$ vim readme.txt #将readme.txt文件添加gggggg字符串
王东@DESKTOP-46G41C7 MINGW64 /e/gittest (master)
$ cat readme.txt
aaaaaaaa
bbbbbbbb
cccccccc
eeeeeeee
ffffffff
gggggggg
王东@DESKTOP-46G41C7 MINGW64 /e/gittest (master)
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
王东@DESKTOP-46G41C7 MINGW64 /e/gittest (master)
$ git add readme.txt #将readme.txt文件添加到暂存区
王东@DESKTOP-46G41C7 MINGW64 /e/gittest (master)
$ git checkout -- readme.txt #撤销暂存区readme.txt文件内容
王东@DESKTOP-46G41C7 MINGW64 /e/gittest (master)
$ cat readme.txt #查看readme.txt文件内容,发现内容没有被撤销,证明checkout命令没有办法撤销暂存区文件内容
aaaaaaaa
bbbbbbbb
cccccccc
eeeeeeee
ffffffff
gggggggg
#####本地库文件回复########
王东@DESKTOP-46G41C7 MINGW64 /e/gittest (master)
$ git reflog #查看本地库历史文件提交日志
240c7f4 (HEAD -> master) HEAD@{0}: commit: content add eeeeee,ffffff
6499fbb HEAD@{1}: commit: content add bbbbbbb,cccccccc
5cc2be2 HEAD@{2}: commit (initial): create new file,content is aaaaa
王东@DESKTOP-46G41C7 MINGW64 /e/gittest (master)
$ git reset --hard 240c7f4 #利用reset --hard命令撤销本地库文件内容
HEAD is now at 240c7f4 content add eeeeee,ffffff
王东@DESKTOP-46G41C7 MINGW64 /e/gittest (master)
$ cat readme.txt #发现ggggg字符串被撤销
aaaaaaaa
bbbbbbbb
cccccccc
eeeeeeee
ffffffff
比较文件差异
操作: git diff [文件名]
将工作区中的文件和暂存区进行比较
git diff [本地库中历史版本] [文件名]
将工作区中的文件和本地库历史记录比较
不带文件名比较多个文件
删除
一般情况下,可以直接在文件目录中把文件删了,或者使用如上rm命令:rm aaa.txt ,如果我想彻底从版本库中删掉了此文件的话,可以再执行commit命令 提交掉,请看如下操作: