前几天天遇到个烦心事,想把作业提交push到github,结果弄来弄去没弄懂,作业和其他本地全被clean掉了,回收站都没找着,贼烦。根本原因都是之前学习git的使用一知半解,只求现用,现在几乎忘了。现在看着官方文档捋一遍。
Git是什么?
它是一个版本控制系统,GIt使用‘快照’概念进行更新版本,比如当一个项目下某个文件改变时,为了效率,新版本项目只会保留变化的文件,未改变的文件就用链接指向之前版本存储的文件。这个概念很重要,非常有助于理解之后的使用!
对于数据的操作状态有三种:
- 已修改,表示修改了文件,但没有提交到数据库
- 已暂存,在执行add操作后的状态,表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。
- 已提交,在执行commit操作后的状态,表示数据已经安全地保存在本地数据库中。
三大区域:
工作区、暂存区域以及 Git 仓库.
- 工作区:即我们平时修改的地方
- 暂存区:保存了即将提交的修改信息,一般在 Git 仓库目录中,包括索引和数据(可以理解为创建了快照)
- 仓库:保存提交后的项目(可以理解为永久保存快照)
Git的安装过程我就不写了,网上随便找找都有。
直接看安装完后的配置吧:
配置
安装完美后我们这样第一步都会设置我们自己的用户名和邮件地址:
$ git config --global user.name "Elizabeth"
$ git config --global user.email "[email protected]"
然后我们就可以用
$ git config --global user.name
$ git config --global user.email
查看全局的用户名和邮件地址了。
git config命令是用来设置GIt的配置变量的,
不同用户和不同仓库都可以设置不同配置
这些变量存储在三个不同的位置:
/etc/gitconfig
,~/.config/git/config
,.git/config
分别对应所有用户全局配置,当前用户配置,和当前仓库配置,级别从左到右越高,也就是会覆盖前者配置。
配置仓库用户:
$ git config user.name "Elizabai"
$ git config user.email "[email protected]"
查看仓库用户
git config user.name
查看全局/仓库配置
$ git config --global --list
$ git config --list
获取Git仓库
两种方式:
- 把本地目录转换为Git仓库
- 克隆远程仓库
1、第一种:
进到需要进行版本控制的目录下,执行命令:
$ git init
出现.git目录:
这里只需知道这是仓库的的骨干
然后添加文件到仓库:
$ git add test1.txt
$ git commit -m 'initial project version'
2、第二种
$ git clone https://github.com/libgit2/libgit2 mylibgit
创建一个名为目录mylibgit,然后初始化一个.git文件后从远程仓库克隆。
各种状态
我们创建一个文件
test2.txt 内容为ABC
这时候使用git status
查看当前状态:
96916@DESKTOP-D7SKL2J MINGW64 ~/Desktop/GitReview (master)
$ git status
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
test2.txt
nothing added to commit but untracked files present (use "git add" to track)
96916@DESKTOP-D7SKL2J MINGW64 ~/Desktop/GitReview (master)
表示了我们现在在master分支,还列出了未跟踪文件,和建议。
那我们git add 文件/目录
添加到暂存区:
$ git add test2.txt
再看下状态
96916@DESKTOP-D7SKL2J MINGW64 ~/Desktop/GitReview (master)
$ git status
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: test2.txt
96916@DESKTOP-D7SKL2J MINGW64 ~/Desktop/GitReview (master)
列出已添加到暂存区的文件
我们可以用 git rm --cached 文件/目录
来移除暂存区
如果你使用 git rm 文件/目录
那git会把暂存区连带工作目录的该文件删除。
添加到暂存区
git add
后Git就会跟踪这个文件的变化,我们来修改以下test2.txt的内容,加个D
看下状态:
96916@DESKTOP-D7SKL2J MINGW64 ~/Desktop/GitReview (master)
$ git status
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: test2.txt
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: test2.txt
96916@DESKTOP-D7SKL2J MINGW64 ~/Desktop/GitReview (master)
两个新提示:
第一个告诉我们可以使用 git add < file >来更新暂存区,
第二个告诉我们可以使用 git restore < file >来回到我们修改之前的内容
我们使用第一个将会回到我们修改之前的状态,也就是文件内容只有ABC了。
查看
我们可以用git diff
来对比暂存区和仓库内容:
96916@DESKTOP-D7SKL2J MINGW64 ~/Desktop/GitReview (master)
$ git diff
diff --git a/test2.txt b/test2.txt
index 48b83b8..a6bddc4 100644
--- a/test2.txt
+++ b/test2.txt
@@ -1 +1 @@
-ABC
\ No newline at end of file
+ABCD
\ No newline at end of file
96916@DESKTOP-D7SKL2J MINGW64 ~/Desktop/GitReview (master)
看到了新文件可旧文件差别只有个D,而且两个文件末尾都没有换行
另外若要查看已暂存的将要添加到下次提交里的内容,可以用 git diff --staged
或git diff --cached
命令。 这两条条命令将比对已暂存文件与最后一次提交的文件差异
提交更新
我们把修改后的test2.txt用git commit
提交到本地仓库:
96916@DESKTOP-D7SKL2J MINGW64 ~/Desktop/GitReview (master)
$ git commit -m "第一次提交"
[master (root-commit) f40e8b9] 第一次提交
1 file changed, 1 insertion(+)
create mode 100644 test2.txt
96916@DESKTOP-D7SKL2J MINGW64 ~/Desktop/GitReview (master)
看一下状态:
96916@DESKTOP-D7SKL2J MINGW64 ~/Desktop/GitReview (master)
$ git status
On branch master
nothing to commit, working tree clean
96916@DESKTOP-D7SKL2J MINGW64 ~/Desktop/GitReview (master)
如果我们嫌上面暂存区的使用麻烦,Git还提供了快捷方式git commot -a
来提交我们更改过的文件和暂存区的文件,这样即使我们懒得git add
也可以直接提交了。
查看提交历史
接着上节test2.txt我分别添加E和F后分两次提交
再仓库下我们可以使用git log
来查看提交历史:
96916@DESKTOP-D7SKL2J MINGW64 ~/Desktop/GitReview (master)
$ git log
commit 3868bcdb2f716c560177d1242875e84245f94ad7 (HEAD -> master)
Author: Elizabeth <Elizabeth@example.com>
Date: Wed Apr 8 17:09:58 2020 +0800
第三次提交
commit 0f06de25f32c9f390e5b83fb2eee055bcc05891c
Author: Elizabeth <Elizabeth@example.com>
Date: Wed Apr 8 17:09:32 2020 +0800
第二次提交
commit f40e8b946f2f5c39b26629cab15508f275ab0033
Author: Elizabeth <Elizabeth@example.com>
Date: Wed Apr 8 16:51:21 2020 +0800
第一次提交
96916@DESKTOP-D7SKL2J MINGW64 ~/Desktop/GitReview (master)
$ git log -p
commit 3868bcdb2f716c560177d1242875e84245f94ad7 (HEAD -> master)
Author: Elizabeth <Elizabeth@example.com>
Date: Wed Apr 8 17:09:58 2020 +0800
第三次提交
diff --git a/test2.txt b/test2.txt
index 402476b..1c5f8ba 100644
--- a/test2.txt
+++ b/test2.txt
@@ -1 +1 @@
-ABCDE
\ No newline at end of file
+ABCDEF
\ No newline at end of file
commit 0f06de25f32c9f390e5b83fb2eee055bcc05891c
Author: Elizabeth <Elizabeth@example.com>
Date: Wed Apr 8 17:09:32 2020 +0800
第二次提交
diff --git a/test2.txt b/test2.txt
index a6bddc4..402476b 100644
--- a/test2.txt
+++ b/test2.txt
@@ -1 +1 @@
-ABCD
\ No newline at end of file
+ABCDE
\ No newline at end of file
commit f40e8b946f2f5c39b26629cab15508f275ab0033
Author: Elizabeth <Elizabeth@example.com>
Date: Wed Apr 8 16:51:21 2020 +0800
第一次提交
diff --git a/test2.txt b/test2.txt
new file mode 100644
index 0000000..a6bddc4
--- /dev/null
+++ b/test2.txt
@@ -0,0 +1 @@
+ABCD
\ No newline at end of file
END
(按q退出)列举了每次提交的信息以及对比前一次的差异,常常的十六进制为版本号。
撤销操作
重新提交:git commit --amend
取消多个文件暂存操作后取消某个文件的暂存 git reset HEAD <file>...
撤销文件提交:git checkout -- <file>...
,但这个有点危险的,你可以理解这个命令是:它将会拿出仓库那个最新版本来覆盖掉该文件!拿出后仓库最新版本的该文件也没了
这两个撤销操作都有风险,原因就在于我们期间对工作区文件的修改。
远程仓库配置使用
1、添加url:git remote add url名字 url
2、查看已有url git remote -v
96916@DESKTOP-D7SKL2J MINGW64 ~/Desktop/GitReview (master)
$ git remote add Url1 https://github.com/xxxx/xxxx.git
96916@DESKTOP-D7SKL2J MINGW64 ~/Desktop/GitReview (master)
$ git remote -v
Url1 https://github.com/xxxx/xxxx.git (fetch)
Url1 https://github.com/xxxx/xxxx.git (push)
96916@DESKTOP-D7SKL2J MINGW64 ~/Desktop/GitReview (master)
拉取
$ git fetch <remote>
拉取我们还没有的数据,需要自己手动合并
推送
$ git push <remote> <branch>
打标签
创建标签:
为当前版本打标签v1, -m指定标签信息:
git tag -a v1 -m "my version 1.4"
连同标签将当前版本推到服务器:
$ git push Url1 v1
删除本地仓库标签
git tag -d <tagname>
删除远程仓库标签
$ git push Url1 :refs/tags/v1.4-lw
切换版本
查看版本号
回退到上一版本:
git reset --hard HEAD^
上上版本:
git reset --hard HEAD^
回退到之前前几个版本:
git reset --hard HEAD~3
回退到指定版本
git reset --hard 91010df
回退之后查看所以迭代版本
git reflog