1. git简介以及安装
什么是git?
Git 是一个分布式版本控制系统
安装
- 下载包后默认安装即可 官网地址
- 安装完成后,鼠标右击出现 Git Bash,输入个人信息
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
注意git config命令的--global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。
2. git命令行具体操作
命令行目录:F:\study_git
1. 创建版本库
什么是版本库?版本库又名仓库,英文名repository,你可以简单的理解一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改,删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻还可以将文件”还原”
通过命令 git init 把这个目录变成git可以管理的仓库,如下:
season@DESKTOP-39IOB32 MINGW64 /f/study_git
$ git init
Initialized empty Git repository in F:/study_git/.git/
执行命令后会在文件夹中多出名为 .git (不要删除修改该文件!)
2.把文件添加到版本库中
版本控制系统,只能跟踪文本文件的改动,比如txt文件,网页,所有程序的代码等,版本控制系统可以告诉你每次的改动,但是图片,视频这些二进制文件,虽能也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是知道图片从1kb变成2kb,但是到底改了啥,版本控制也不知道。
创建readme.txt 并在第一行输入1111111111
第一步:使用命令 git add readme.txt添加到暂存区里面去。没有任何提示,说明已经添加成功了。
第二步:用命令 git commit告诉Git,把文件提交到仓库。
season@DESKTOP-39IOB32 MINGW64 /f/study_git (master)
$ git add readme.txt
season@DESKTOP-39IOB32 MINGW64 /f/study_git (master)
$ git commit -m 'readme.txt提交'
[master (root-commit) 0b0c94a] readme.txt提交
1 file changed, 1 insertion(+)
create mode 100644 readme.txt
现在我们已经提交了一个readme.txt文件了
我们下面可以通过命令git status来查看是否还有文件未提交,如下是没有任何文件未提交:
season@DESKTOP-39IOB32 MINGW64 /f/study_git (master)
$ git status
On branch master
nothing to commit, working tree clean
readme.txt 第2行输入2222222222
season@DESKTOP-39IOB32 MINGW64 /f/study_git (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 状态是指:文件已修改, 仅仅是修改, 并没有进行其他的操作.. 这个文件也有两个去处, 通过git add可进入暂存区Index状态, 使用git checkout 则丢弃修改过,返回到unmodify状态, 这个git checkout即从库中取出文件, 覆盖当前修改
modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
上面的命令告诉我们 readme.txt文件已被修改,但是未被提交的修改。
想查看readme.txt文件到底改了什么内容.可使用git diff readme.txt,如下:
# 比较当前文件和暂存区文件差异
season@DESKTOP-39IOB32 MINGW64 /f/study_git (master)
$ git diff readme.txt
#进行比较的是,a版本的readme.txt(即变动前)和b版本的readme.txt(即变动后)。
diff --git a/readme.txt b/readme.txt
#index区域的aa75558对象,与工作目录区域的a2b3d06对象进行比较,
# 最后的六位数字 100644 是对象的模式(普通文件,644权限)。
index aa75558..a2b3d06 100644
#"---"表示变动前的文件
--- a/readme.txt
#"+++"表示变动后的文件
+++ b/readme.txt
#变动的位置用两个@作为起首和结束
#前面的" -1":减号表示变动前(即a版本的readme.txt),"1"表示第1行;连续1行.合在一起,就表示第一个文件从第1行开始的连续1行
#后面的"+1,2":表示变动后文件(b版本的readme.txt)从第1行开始的连续2行。
#简单理解为a版本的1行与b版本的1-2行有差异,下面才是具体的差异信息
@@ -1 +1,2 @@
#-部分表示减少的部分 -红色
-1111111111
\ No newline at end of file #\ No newline at end of file 最后一行没有换行
#+部分表示增加的部分 -绿色
+1111111111^M
+2222222222
\ No newline at end of file
之后我们提交修改(git add)和提交文件(git commit)
season@DESKTOP-39IOB32 MINGW64 /f/study_git (master)
$ git add readme.txt
season@DESKTOP-39IOB32 MINGW64 /f/study_git (master)
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: readme.txt
season@DESKTOP-39IOB32 MINGW64 /f/study_git (master)
$ git commit -m "文件增加22222222内容"
[master 9b7b4c2] 文件增加22222222内容
1 file changed, 2 insertions(+), 1 deletion(-)
season@DESKTOP-39IOB32 MINGW64 /f/study_git (master)
$ git status
On branch master
nothing to commit, working tree clean
3. 版本回退
继续修改readme.txt文件
readme.txt 第3行输入3333333333
继续提交修改(git add)和提交文件(git commit)
season@DESKTOP-39IOB32 MINGW64 /f/study_git (master)
$ git add readme.txt
season@DESKTOP-39IOB32 MINGW64 /f/study_git (master)
$ git commit -m "文件增加333333333内容"
[master d93833d] 文件增加333333333内容
1 file changed, 2 insertions(+), 1 deletion(-)
使用git log查看历史:
$ git log
commit d93833d7ca4e1e66d6a00cef169b6e2aedc8cc6c (HEAD -> master)
Author: 董诗笑 <1208082622@qq.com>
Date: Wed Jul 31 14:45:54 2019 +0800
文件增加333333333内容
commit 9b7b4c2bb8f8c670d7dab638a2c274574e4ca5d5
Author: 董诗笑 <1208082622@qq.com>
Date: Wed Jul 31 14:42:15 2019 +0800
文件增加22222222内容
commit 0b0c94ae38aed838c7612c64cb7fbc7eba5c7a3d
Author: 董诗笑 <1208082622@qq.com>
Date: Wed Jul 31 11:42:06 2019 +0800
readme.txt提交
git log命令显示从最近到最远的显示日志,我们可以看到最近三次提交,最近的一次是,增加内容为333333.上一次是添加内容222222,第一次默认是 111111.如果嫌上面显示的信息太多的话,我们可以使用命令 git log --oneline 演示如下:
$ git log --oneline
d93833d (HEAD -> master) 文件增加333333333内容
9b7b4c2 文件增加22222222内容
0b0c94a readme.txt提交
回退到某个版本
season@DESKTOP-39IOB32 MINGW64 /f/study_git (master)
#回退到你想要的版本 9b7b4c2=>指版本号缩写
$ git reset --hard 9b7b4c2
HEAD is now at 9b7b4c2 文件增加22222222内容
#再次查看历史,发现我们的3333333没有了
season@DESKTOP-39IOB32 MINGW64 /f/study_git (master)
#可以看到readme.txt文件中只有前面两行数据,第三行的3333333没了
$ cat readme.txt
1111111111
2222222222
season@DESKTOP-39IOB32 MINGW64 /f/study_git (master)
#git reflog 可以查看所有分支的所有操作记录(包括已经被删除的 commit 记录和 reset 的操作)
$ git reflog
9b7b4c2 (HEAD -> master) HEAD@{0}: reset: moving to 9b7b4c2
d93833d HEAD@{1}: commit: 文件增加333333333内容
9b7b4c2 (HEAD -> master) HEAD@{2}: commit: 文件增加22222222内容
0b0c94a HEAD@{3}: commit (initial): readme.txt提交
season@DESKTOP-39IOB32 MINGW64 /f/study_git (master)
#恢复到3333333版本
$ git reset --hard d93833d
HEAD is now at d93833d 文件增加333333333内容
season@DESKTOP-39IOB32 MINGW64 /f/study_git (master)
#第三行的3333333又恢复了
$ cat readme.txt
1111111111
2222222222
3333333333
4.深入理解
四个工作区
- Workspace: 工作区,就是你在电脑上看到的目录,比如目录下study_git里的文件(.git隐藏目录版本库除外)。或者以后需要再新建的目录文件等等都属于工作区范畴。
- Index / Stage: 暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息
- Repository: 仓库区(或版本库)就是study_git下的.git文件夹,这里面有你提交到所有版本的数据,其中版本库里面存了很多东西,其中最重要的就是stage/Index(暂存区)。其中HEAD指向最新放入仓库的版本,还有Git为我们自动创建了第一个分支master,以及指向master的一个指针HEAD。
- Remote: 远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换
工作流程
git的工作流程一般是这样的:
- 在工作目录中添加、修改文件;
- 将需要进行版本管理的文件放入暂存区域;
- 将暂存区域的文件提交到git仓库。
因此,git管理的文件有三种状态:已修改(modified),已暂存(staged),已提交(committed)
文件的四种状态
版本控制就是对文件的版本控制,要对文件进行修改、提交等操作,首先要知道文件当前在什么状态,不然可能会提交了现在还不想提交的文件,或者要提交的文件没提交上。
- Untracked: 未跟踪, 此文件在文件夹中, 但并没有加入到git库, 不参与版本控制. 通过git add 状态变为Staged.
- Unmodify: 文件已经入库, 未修改, 即版本库中的文件快照内容与文件夹中完全一致. 这种类型的文件有两种去处, 如果它被修改, 而变为Modified. 如果使用git rm移出版本库, 则成为Untracked文件
- Modified: 文件已修改, 仅仅是修改, 并没有进行其他的操作. 这个文件也有两个去处, 通过git add可进入暂存staged状态, 使用git checkout 则丢弃修改过, 返回到unmodify状态, 这个git checkout即从库中取出文件, 覆盖当前修改
-
Staged: 暂存状态. 执行git commit则将修改同步到库中, 这时库中的文件和本地文件又变为一致, 文件为Unmodify状态. 执行git reset HEAD filename取消暂存, 文件状态为Modified
下面图解释了四种状态的转变:
新建文件--->Untracked
使用add命令将新建的文件加入到暂存区--->Staged
使用commit命令将暂存区的文件提交到本地仓库--->Unmodified
如果对Unmodified状态的文件进行修改---> modified
如果对Unmodified状态的文件进行remove操作--->Untracked
我们前面说过使用Git提交文件到版本库有两步:
第一步:是使用 git add 把文件添加进去,实际上就是把文件添加到暂存区。
第二步:使用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支上。
readme.txt 继续添加一行44444444,接着在目录下新建一个文件为test.txt 内容为test
$ 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: 文件已修改, 仅仅是修改, 并没有进行其他的操作.
#这个文件也有两个去处, 通过git add可进入暂存staged状态, 使用git checkout 则丢弃修改过, 返回到unmodify状态, 这个git checkout即从库中取出文件, 覆盖当前修改
modified: readme.txt
#Untracked: 未跟踪, 此文件在文件夹中, 但并没有加入到git库, 不参与版本控制. 通过git add 状态变为Staged.
Untracked files:
(use "git add <file>..." to include in what will be committed)
test.txt
no changes added to commit (use "git add" and/or "git commit -a")
先使用git add 命令把2个文件都添加到暂存区中,再使用git status来查看下状态,如下:
season@DESKTOP-39IOB32 MINGW64 /f/study_git (master)
#多个文件可以使用 git add .
$ git add .
season@DESKTOP-39IOB32 MINGW64 /f/study_git (master)
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: readme.txt
new file: test.txt
使用git commit一次性提交到分支上,如下:
season@DESKTOP-39IOB32 MINGW64 /f/study_git (master)
$ git commit -m '提交所有文件,包括新建的test.txt'
[master 88b90d1] 提交所有文件,包括新建的test.txt
2 files changed, 3 insertions(+), 1 deletion(-)
create mode 100644 test.txt
season@DESKTOP-39IOB32 MINGW64 /f/study_git (master)
$ git status
On branch master
nothing to commit, working tree clean
5.git撤销修改和删除文件
- 撤销修改
现在在readme.txt文件里面增加一行 内容为555555555555,在未提交之前,发现添加5555555555内容有误,所以我得马上恢复以前的版本,现在可以有如下几种方法可以做修改:
第一:如果知道要删掉那些内容的话,直接手动更改去掉那些需要的文件,然后add添加到暂存区,最后commit。
第二:可以按以前的方法直接恢复到上一个或者指定的版本。使用 git reset --hard 版本号
这里说的是不使用以上两种方法,使用git checkout来操作
先看下git 状态
$ 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")
其中git告诉你可以使用“git checkout--<file>…”放弃工作目录中的更改,用法如下:
season@DESKTOP-39IOB32 MINGW64 /f/study_git (master)
#把readme.txt文件在工作区做的修改全部撤销
$ git checkout -- readme.txt
#此处内容5555555已经没有了
season@DESKTOP-39IOB32 MINGW64 /f/study_git (master)
$ cat readme.txt
1111111111
2222222222
3333333333
4444444444
命令 git checkout --readme.txt 意思就是,把readme.txt文件在工作区做的修改全部撤销,这里有2种情况,如下:
- readme.txt自动修改后,还没有放到暂存区,使用 撤销修改就回到和版本库一模一样的状态。
- 另外一种是readme.txt已经放入暂存区了,接着又作了修改,撤销修改就回到添加暂存区后的状态。
对于第二种情况,假如现在我对readme.txt添加一行 内容为6666666666,我git add 增加到暂存区后,接着添加内容7777777777,我想通过撤销命令让其回到暂存区后的状态。如下所示:
readme.txt 添加6666666666
#添加一条内容为6666666666
$ cat readme.txt
1111111111
2222222222
3333333333
4444444444
6666666666
season@DESKTOP-39IOB32 MINGW64 /f/study_git (master)
# 添加到暂存区
$ git add readme.txt
season@DESKTOP-39IOB32 MINGW64 /f/study_git (master)
#接着添加内容7777777777,但是没有执行git add 添加到暂存区
$ cat readme.txt
1111111111
2222222222
3333333333
4444444444
6666666666
7777777777
season@DESKTOP-39IOB32 MINGW64 /f/study_git (master)
# 直接使用撤销命令,把未添加到暂存区的内容撤销掉
$ git checkout -- readme.txt
season@DESKTOP-39IOB32 MINGW64 /f/study_git (master)
# 最新文件 7777777777已经撤销掉不存在了
$ cat readme.txt
1111111111
2222222222
3333333333
4444444444
6666666666
注意:命令git checkout -- readme.txt 中的 -- 很重要,如果没有 -- 的话,那么命令变成创建分支了。
- 删除文件
版本库study_git目录添加一个文件b.txt,然后提交。如下:
#添加b.txt 到暂存区
$ git add b.txt
season@DESKTOP-39IOB32 MINGW64 /f/study_git (master)
#提交b.txt
$ git commit -m '添加b.txt文件'
[master 910471f] 添加b.txt文件
2 files changed, 3 insertions(+), 1 deletion(-)
create mode 100644 b.txt
season@DESKTOP-39IOB32 MINGW64 /f/study_git (master)
#删除b.txt
$ rm b.txt
season@DESKTOP-39IOB32 MINGW64 /f/study_git (master)
$ git status
On branch master
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
#此时b.txt已经删除了,此时有两个选择
#1.直接commit
#2.从版本库中恢复
deleted: b.txt
no changes added to commit (use "git add" and/or "git commit -a")
如果想彻底从版本库中删掉了此文件的话,可以再执行commit命令.执行后如果在执行 git checkout -- b.txt 会报error: pathspec 'b.txt' did not match any file(s) known to git 错误
season@DESKTOP-39IOB32 MINGW64 /f/study_git (master)
$ git commit -a -m '删除b.txt'
[master 1349371] 删除b.txt
1 file changed, 1 deletion(-)
delete mode 100644 b.txt
没有commit之前,如果想恢复此文件可以使用 git checkout -- b.txt
3.git小乌龟具体操作
2.8版本
64位官方下载
64位汉化包官方下载
因为图形化界面的操作比较简单,省去了很多步骤.不详细演示每个示例.
4. 如何使用远程仓库?
在了解之前,先注册码云(码云)账号,由于你的本地Git仓库和码云仓库之间的传输是通过SSH加密的,所以需要一点设置:
- 创建SSH Key。在用户主目录下(例如:C:\Users\season.ssh),看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果有的话,直接跳过此如下命令,如果没有的话,打开命令行,输入如下命令:
ssh-keygen -t rsa –C “youremail@example.com”
-
第二步:登录码云,打开” 设置”中的SSH 公钥页面,添加公钥,填上任意title,在Key文本框里黏贴id_rsa.pub文件的内容。如下图:
远程仓库
远程仓库可以作为备份,又可以其他人通过该仓库来协作。
若本地已开发的项目要推送到一个新创建的远程仓库,可以使用:
git remote add origin git@gitee.com:dongshixiao/study_git.git
来创建关联名称为origin的远程仓库,之后就可以正常地用git push和git pull推送了!
git remote -v #查看已关联远程仓库信息
git remote add #添加远程仓库 可以添加多个
git remote rm #删除某个(如origin)
#如果关联多个 可以用关联名称来指定具体推送到哪个远程仓库
#如我又添加 git remote add php git@gitee.com:dongshixiao/study_php.git
git push origin master #推送到码云study_git仓库
git push php master #推送到码云的study_php仓库
参考附录: