Git 本地仓库初始化 基础指令 add commit reset diff
Git本地结构
Workspace: 工作区,我们写代码的地方,即能看到的目录文件
Index / Stage: 暂存区,用于临时存放代码变更,将要提交的内容但还没有提交,一般存放在 .git 目录下的 index 文件
Repository: 仓库区,就是安全存放代码的地方,存放着所有的历史版本。其中HEAD指向最新放入仓库的版本,即隐藏目录 .git。
Remote: 远程仓库,托管代码的服务器,例如GitHub,Gitee
基础命令
git命令与linux相同,均为Linus开发的开源软件
SKPrimin@LAPTOP-VUQ1RT3J MINGW64 /d/JAVA_FILE/GitResp
$ git --version #查看git版本
git version 2.32.0.windows.2
$ clear #清屏
设置签名
设置用户名和邮箱
SKPrimin@LAPTOP-VUQ1RT3J MINGW64 /d/JAVA_FILE/GitResp
$ git config --global user.name "skprimin"
SKPrimin@LAPTOP-VUQ1RT3J MINGW64 /d/JAVA_FILE/GitResp
$ git config --global user.email "skprimin@163.com"
初始化本地仓库
创建文件夹GitResp
Git 进入该目录,初始化命令git init
,会自动生成.git
文件夹,内容不能删除,不能胡乱修改
SKPrimin@LAPTOP-VUQ1RT3J MINGW64 /d/JAVA_FILE/GitResp
$ git init
Initialized empty Git repository in D:/JAVA_FILE/GitResp/.git/
SKPrimin@LAPTOP-VUQ1RT3J MINGW64 /d/JAVA_FILE/GitResp (master)
$ ls -la
total 8
drwxr-xr-x 1 SKPrimin 197121 0 Jul 30 11:55 ./
drwxr-xr-x 1 SKPrimin 197121 0 Jul 30 11:48 ../
drwxr-xr-x 1 SKPrimin 197121 0 Jul 30 11:55 .git/
SKPrimin@LAPTOP-VUQ1RT3J MINGW64 /d/JAVA_FILE/GitResp (master)
$ cd .git/
SKPrimin@LAPTOP-VUQ1RT3J MINGW64 /d/JAVA_FILE/GitResp/.git (GIT_DIR!)
$ ls
HEAD config description / info/ objects/ refs/
添加与提交及状态查看
-
添加文件
add
,将文件提交到暂存区 -
提交文件
commit
,将暂存区的文件提交到本地库,也可以加上文件名指定文件,- m "注释内容"
可添加注释- Note:不在本地仓库的内容不受Git管理,即使放进也需手动提交到到仓库区方能受git管理
-
status
查看命令
若本地仓所有内容均受git管理
SKPrimin@LAPTOP-VUQ1RT3J MINGW64 /d/JAVA_FILE/GitResp (master)
$ git status
On branch master # 在主分支
nothing to commit, working tree clean # 无可提交内容,工作树干净
有新文件后
SKPrimin@LAPTOP-VUQ1RT3J MINGW64 /d/JAVA_FILE/GitResp (master)
$ git status
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
gt02.txt # 红色字体
nothing added to commit but untracked files present (use "git add" to track)
# 没有添加任何提交但存在未跟踪的文件(使用“git add”来跟踪)
使用git add
将文件添加到暂存区
SKPrimin@LAPTOP-VUQ1RT3J MINGW64 /d/JAVA_FILE/GitResp (master)
$ git add gt02.txt
SKPrimin@LAPTOP-VUQ1RT3J MINGW64 /d/JAVA_FILE/GitResp (master)
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: gt02.txt # 绿色字体
使用git commit
提交至仓库区
SKPrimin@LAPTOP-VUQ1RT3J MINGW64 /d/JAVA_FILE/GitResp (master)
$ git commit -m "这是gt02测试文件" "gt02.txt"
[master 1f909fa] 这是gt02测试文件
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 gt02.txt
对文件进行修改后再查看状态
SKPrimin@LAPTOP-VUQ1RT3J MINGW64 /d/JAVA_FILE/GitResp (master)
$ git status
On branch master
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: gt02.txt # 红色
no changes added to commit (use "git add" and/or "git commit -a")
将修改后的文件重新提交
SKPrimin@LAPTOP-VUQ1RT3J MINGW64 /d/JAVA_FILE/GitResp (master)
$ git add gt02.txt
SKPrimin@LAPTOP-VUQ1RT3J MINGW64 /d/JAVA_FILE/GitResp (master)
$ git commit -m "修改了内容,add something" "gt02.txt"
[master 28f40e1] 修改了内容,add something
1 file changed, 1 insertion(+)
查看历史记录
git log
SKPrimin@LAPTOP-VUQ1RT3J MINGW64 /d/JAVA_FILE/GitResp (master)
$ git log
commit 28f40e1fd47efd3b92a6bb16b6d0fc8bcd8abc2b (HEAD -> master) #历史记录索引
Author: skprimin <skprimin@163.com>
Date: Sat Jul 31 13:17:09 2021 +0800
修改了内容,add something
commit 1f909fa3494ae0be4e39e4f67d96d63194855967
Author: skprimin <skprimin@163.com>
Date: Sat Jul 31 12:46:43 2021 +0800
这是gt02测试文件
当历史记录过多时会分屏,上一页B,下一页space 空格,未到尾页显:
,到尾页显示END
,退出Q
git log --pretty=oneline
SKPrimin@LAPTOP-VUQ1RT3J MINGW64 /d/JAVA_FILE/GitResp (master)
$ git log --pretty=oneline
28f40e1fd47efd3b92a6bb16b6d0fc8bcd8abc2b (HEAD -> master) 修改了内容,add something
1f909fa3494ae0be4e39e4f67d96d63194855967 这是gt02测试文件
1db7f13f218db0969fe4cf53230f22bce60c1dbf First file GitTest01
git log --oneline
SKPrimin@LAPTOP-VUQ1RT3J MINGW64 /d/JAVA_FILE/GitResp (master)
$ git log --oneline
28f40e1 (HEAD -> master) 修改了内容,add something
1f909fa 这是gt02测试文件
1db7f13 First file GitTest01
git reflog
HEAD@{number
}:指针回到该历史版本需要的步数number
次
SKPrimin@LAPTOP-VUQ1RT3J MINGW64 /d/JAVA_FILE/GitResp (master)
$ git reflog
28f40e1 (HEAD -> master) HEAD@{0}: commit: 修改了内容,add something
1f909fa HEAD@{1}: commit: 这是gt02测试文件
1db7f13 HEAD@{2}: commit (initial): First file GitTest01
reset
git reset --hard 索引
仓库区指针移动同时,重置暂存区、工作区
首先git reflog
查看历史记录
SKPrimin@LAPTOP-VUQ1RT3J MINGW64 /d/JAVA_FILE/GitResp (master)
$ git reflog
aa7459a (HEAD -> master) HEAD@{0}: commit: 第三次添加了内容
7ba1bc9 HEAD@{1}: commit: 第二次添加了内容
28f40e1 HEAD@{2}: commit: 修改了内容,add something
1f909fa HEAD@{3}: commit: 这是gt02测试文件
1db7f13 HEAD@{4}: commit (initial): First file GitTest01
接着git reset --hard 7ba1bc9
,回退到第二次修改时状态,此时HEAD指针也已回退到
SKPrimin@LAPTOP-VUQ1RT3J MINGW64 /d/JAVA_FILE/GitResp (master)
$ git reset --hard 7ba1bc9
HEAD is now at 7ba1bc9 第二次添加了内容
SKPrimin@LAPTOP-VUQ1RT3J MINGW64 /d/JAVA_FILE/GitResp (master)
$ git reflog
7ba1bc9 (HEAD -> master) HEAD@{0}: reset: moving to 7ba1bc9
aa7459a HEAD@{1}: commit: 第三次添加了内容
7ba1bc9 (HEAD -> master) HEAD@{2}: commit: 第二次添加了内容
28f40e1 HEAD@{3}: commit: 修改了内容,add something
1f909fa HEAD@{4}: commit: 这是gt02测试文件
1db7f13 HEAD@{5}: commit (initial): First file GitTest01
打开文件发现内容已回退到第二次修改时
git reset --mixed 索引
仓库区指针移动同时,重置暂存区,工作区你不变
git reset --soft 索引
仓库区指针移动,暂存区、工作区不变
reset
参数:
区 位 参 数 {区位 \over 参数} 参数区位 | 仓库区 | 暂存区 | 本地库 |
---|---|---|---|
–hard | 改变 | 改变 | 改变 |
–mixed | 改变 | 改变 | Not |
–soft | 改变 | Not | Not |
文件删除
新建测试文件tsc.txt
并提交到仓录区
-
rm tsc.txt
删除工作区文件SKPrimin@LAPTOP-VUQ1RT3J MINGW64 /d/JAVA_FILE/GitResp (master) $ rm tsc.txt SKPrimin@LAPTOP-VUQ1RT3J MINGW64 /d/JAVA_FILE/GitResp (master) $ git status On branch master Changes not staged for commit: (use "git add/rm <file>..." to update what will be committed) (use "git restore <file>..." to discard changes in working directory) deleted: tsc.txt # 红色 no changes added to commit (use "git add" and/or "git commit -a")
-
同步删除暂存区文件
SKPrimin@LAPTOP-VUQ1RT3J MINGW64 /d/JAVA_FILE/GitResp (master) $ git add tsc.txt SKPrimin@LAPTOP-VUQ1RT3J MINGW64 /d/JAVA_FILE/GitResp (master) $ git status On branch master Changes to be committed: (use "git restore --staged <file>..." to unstage) deleted: tsc.txt # 绿色
-
同步删除仓库区文件
SKPrimin@LAPTOP-VUQ1RT3J MINGW64 /d/JAVA_FILE/GitResp (master) $ git commit -m "删除tsc.txt文件" tsc.txt [master ffc7261] 删除tsc.txt文件 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 tsc.txt
查看记录
SKPrimin@LAPTOP-VUQ1RT3J MINGW64 /d/JAVA_FILE/GitResp (master)
$ git reflog
ffc7261 (HEAD -> master) HEAD@{0}: commit: 删除tsc.txt文件
f5fdb2a HEAD@{1}: commit: 添加tsc.txt
Note:这里的删除仅仅是移动了HEAD指针,恢复文件也只需reset
指令
文件恢复
-
恢复上文删除的tsc.txt文件
git reset --hard f5fdb2a
SKPrimin@LAPTOP-VUQ1RT3J MINGW64 /d/JAVA_FILE/GitResp (master) $ git reset --hard f5fdb2a HEAD is now at f5fdb2a 添加tsc.txt
-
恢复暂存区文件命令相同
git reset --hard f5fdb2a
SKPrimin@LAPTOP-VUQ1RT3J MINGW64 /d/JAVA_FILE/GitResp (master) $ rm tsc.txt SKPrimin@LAPTOP-VUQ1RT3J MINGW64 /d/JAVA_FILE/GitResp (master) $ git add tsc.txt
此时后悔,恢复暂存区
SKPrimin@LAPTOP-VUQ1RT3J MINGW64 /d/JAVA_FILE/GitResp (master) $ git status On branch master Changes to be committed: (use "git restore --staged <file>..." to unstage) deleted: tsc.txt # 绿色 SKPrimin@LAPTOP-VUQ1RT3J MINGW64 /d/JAVA_FILE/GitResp (master) $ git reflog f5fdb2a (HEAD -> master) HEAD@{0}: reset: moving to f5fdb2a ffc7261 HEAD@{1}: commit: 删除tsc.txt文件 f5fdb2a (HEAD -> master) HEAD@{2}: commit: 添加tsc.txt SKPrimin@LAPTOP-VUQ1RT3J MINGW64 /d/JAVA_FILE/GitResp (master) $ git reset --hard f5fdb2a HEAD is now at f5fdb2a 添加tsc.txt SKPrimin@LAPTOP-VUQ1RT3J MINGW64 /d/JAVA_FILE/GitResp (master) $ git reflog f5fdb2a (HEAD -> master) HEAD@{0}: reset: moving to f5fdb2a f5fdb2a (HEAD -> master) HEAD@{1}: reset: moving to f5fdb2a ffc7261 HEAD@{2}: commit: 删除tsc.txt文件 f5fdb2a (HEAD -> master) HEAD@{3}: commit: 添加tsc.txt
- 由于此时的索引仍为该文件,故可直接使用
git reset --hard HEAD
SKPrimin@LAPTOP-VUQ1RT3J MINGW64 /d/JAVA_FILE/GitResp (master) $ git reset --hard HEAD HEAD is now at f5fdb2a 添加tsc.txt
- 由于此时的索引仍为该文件,故可直接使用
diff内容比对
git diff [filename]
git diff
比较工作区中和暂存区中所有文件的差异git diff [filename]
比较工作区和暂存区filename
文件的差异
首先创建gt03.txt
文件并送入仓库区,随后向gt03.txt
文件中添加内容
SKPrimin@LAPTOP-VUQ1RT3J MINGW64 /d/JAVA_FILE/GitResp (master)
$ git diff gt03.txt
diff --git a/gt03.txt b/gt03.txt
index e69de29..5e40c08 100644
--- a/gt03.txt
+++ b/gt03.txt
@@ -0,0 +1 @@
+asdf
\ No newline at end of file
修改内容
SKPrimin@LAPTOP-VUQ1RT3J MINGW64 /d/JAVA_FILE/GitResp (master)
$ git diff gt03.txt
diff --git a/gt03.txt b/gt03.txt
index 5e40c08..140717d 100644
--- a/gt03.txt
+++ b/gt03.txt
@@ -1 +1 @@
-asdf # 减少行
\ No newline at end of file
+asdfabc # 增加行
\ No newline at end of file
可以看出git是以一行为基础管理文件内容的,这也恰好符合我们代码格式
git diff [HEAD] [filename]
比较暂存区与仓库区内容
SKPrimin@LAPTOP-VUQ1RT3J MINGW64 /d/JAVA_FILE/GitResp (master)
$ git diff HEAD gt03.txt
diff --git a/gt03.txt b/gt03.txt
index 5e40c08..1afeafa 100644
--- a/gt03.txt
+++ b/gt03.txt
@@ -1 +1,2 @@
-asdf
\ No newline at end of file
+asdfabc
+123
\ No newline at end of file
与仓库区某一个历史版本比较
SKPrimin@LAPTOP-VUQ1RT3J MINGW64 /d/JAVA_FILE/GitResp (master)
$ git reflog
2155791 (HEAD -> master) HEAD@{0}: commit: gt03第一次修改+asdf
8673993 HEAD@{1}: commit: 这是gt03diff测试文件
SKPrimin@LAPTOP-VUQ1RT3J MINGW64 /d/JAVA_FILE/GitResp (master)
$ git diff 8673993 gt03.txt
diff --git a/gt03.txt b/gt03.txt
index e69de29..1afeafa 100644
--- a/gt03.txt
+++ b/gt03.txt
@@ -0,0 +1,2 @@
+asdfabc
+123
\ No newline at end of file