mydal

怕光阴流逝 让一切都作废

0%

git学习笔记

​ 之前或多或少接触过git,但用了就忘,还经常出错,这篇就作为一篇git学习笔记,内容很水,主要是为了加深理解和记忆。

11.jpg

git学习

git是目前世界上最先进的分布式版本控制系统

git命令

创建版本库

​ 版本库可以理解为一个目录,这个目录里面的所有文件都会被git管理,每个文件的修改,删除 git都可以跟踪,便于查询历史,或在需要的时候进行历史还原.

执行:创建空目录,通过git init将目录变为git仓库

1.png

执行成功 git仓库建好了 在当前目录下会生成一个.git的目录,这个目录是用来跟踪管理版本库的,一般情况下不要修改里面的文件,改乱了,git仓库就垮掉了。 如果你没有看到.git目录,那是因为这个目录默认是隐藏的,用ls -ah命令就可以看见。

把文件添加到版本库

​ 所有的版本控制系统其实只能跟踪文本的改动,像TXT文件,程序代码等。版本控制系统可以清楚的告诉你每次的改动,修改内容,删除,添加等。 但是像图片,视频这些二进制文件,版本控制系统虽然也能管理,但是没法跟踪文件的变化,只能把二进制文件的每次改动串起来,每次只能知道像图片只是从100kb改成了120kb,具体改了什么,版本控制系统不知道。

​ Microsoft的Word格式是二进制格式,因此,版本控制系统是没法跟踪Word文件的改动的。

文件编写

编写一个readme.txt文件 内容随意 文件必须在learngit这个目录或者其子目录下,只有放在git仓库下,git才能进行控制

1
2
"git"
vi readme.txt

1.png

编写完成之后,按esc键,然后:wq退出并保存

将一个文件添加到git仓库只需要两步

第一步

使用命令

1
git add readme.txt

执行成功,没有任何显示,没有消息就是最好的消息,说明添加成功了

第二步

使用命令

1
2
3
4
$ git commit -m "wrote a readme file"                                           
[master (root-commit) 251dffd] wrote a readme file
1 file changed, 2 insertions(+)
create mode 100644 readme.txt

命令说明: -m 后面输入的是本次提交的说明 要输入有意义的说明,方便查找和阅读

git commit 命令执行成功 ,会有反馈, 1 file changed 表示 1个文件被改动,2 insertions(+) 插入了两行内容

注意:commit可以一次提交很多文件,所以我们可以多次add

不同的文件 如:

1.png

时光机穿梭

再次修改readme.txt文件

1
vi readme.txt

1.png

git status 查看结果

1
2
3
4
5
6
7
$ git status                                                                    
On branch master
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git checkout -- ..." to discard changes in working directory)
modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")

git status 命令可以让我们时刻掌握仓库当前的状态, 上面命令的输出信息告诉我们,readme.txt被修改了,但是还没有提交修改

git diff 查看修改的内容

1
2
3
4
5
6
7
8
9
$ git diff readme.txt                                                           
diff --git a/readme.txt b/readme.txt
index b0354bd..5367626 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,2 @@
-Git is a version control system.
+Git is a distributed version control system.
Git is a free software.

修改完成之后,再次进行提交

第一步:

1
git add readme.txt

第二步:

在执行git commit 之前 我们可以执行git status查看当前仓库的状态

1
2
3
4
5
$ git status                                                                    
On branch master
Changes to be committed:
(use "git reset HEAD ..." to unstage)
modified: readme.txt

可以看到 git status命令告诉我们,将要被提交的修改包括 readme.txt

第三步:git commit

1
2
3
$ git commit -m "add distributed"                                               
[master db2285b] add distributed
1 file changed, 1 insertion(+), 1 deletion(-)

再次 git status 查看仓库的当前状态

1
2
3
$ git status                                                                    
On branch master
nothing to commit, working tree clean

git告诉我们当前没有需要提交的修改,而且,工作目录是干净

版本回退

再次修改readme.txt文件

1
vi readme.txt
1
2
Git is a distributed version control system.                                    
Git is a free software distributed under the GPL.

再次提交

1
2
3
4
$ git add readme.txt                                                                                        
$ git commit -m "append GPL"
[master cd03a82] append GPL
1 file changed, 1 insertion(+), 1 deletion(-)

这样对文件不停修改,然后不断的提交到版本库里,可以形成多个版本,以便我们查找和更新。

git log

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ git log                                                                       
commit cd03a8211f969905634826a1337b992b16d87235 (HEAD -> master)
Author: mydal <2049837924@qq.com>
Date: Mon Dec 23 09:49:15 2019 +0800
append GPL
commit db2285b3da237cb3ee8fab85050abfc19f3af654
Author: mydal <2049837924@qq.com>
Date: Mon Dec 23 09:15:28 2019 +0800
add distributed
commit 36e9e51137dfb5d5186739373cf806a42205f969
Author: mydal <2049837924@qq.com>
Date: Mon Dec 23 08:47:12 2019 +0800
add 2 files.
commit 251dffd1ad6d376f715c6994edc7a79308328269
Author: mydal <2049837924@qq.com>
Date: Mon Dec 23 08:39:23 2019 +0800
wrote a readme file

git log命令显示从最近到最远的提交日志。

可以加上参数 --pretty=oneline 简洁输出信息

1
2
3
4
5
$ git log --pretty=oneline                                                      
cd03a8211f969905634826a1337b992b16d87235 (HEAD -> master) append GPL
db2285b3da237cb3ee8fab85050abfc19f3af654 add distributed
36e9e51137dfb5d5186739373cf806a42205f969 add 2 files.
251dffd1ad6d376f715c6994edc7a79308328269 wrote a readme file

cd03a821.... 这种一大串的是commit id (版本号) 版本号不会重复

回退

HEAD 表示当前版本 HEAD^ 表示上一个版本 HEAD^^表示上上个版本。

不过 如果往上几十上百个版本的情况 写100个^ 有点太蠢了 ,可以写成 HEAD~100

git reset

1
2
$ git reset --hard HEAD^                                                        
HEAD is now at db2285b add distributed

版本回退成功,查看一下文件内容

1
2
3
$ cat readme.txt                                                                
Git is a distributed version control system.
Git is a free software.

内容被还原

git log 查看一下版本库的状态

1
2
3
4
5
6
7
8
9
10
11
12
$ git log                                                                       
commit db2285b3da237cb3ee8fab85050abfc19f3af654 (HEAD -> master)
Author: mydal <2049837924@qq.com>
Date: Mon Dec 23 09:15:28 2019 +0800
add distributed
commit 36e9e51137dfb5d5186739373cf806a42205f969
Author: mydal <2049837924@qq.com>
Date: Mon Dec 23 08:47:12 2019 +0800
add 2 files.
commit 251dffd1ad6d376f715c6994edc7a79308328269
Author: mydal <2049837924@qq.com>
Date: Mon Dec 23 08:39:23 2019 +0800

最新版本 append GPL已经看不到了

我们想要找回这个版本 只需要找到append GPLcommit id 顺着命令行往上找…

指定回到这个版本 版本号写前几位即可,也不能只写一两位,这样git可能会找到多个,从而无法确定是哪一个

1
2
$ git reset --hard cd03a8                                                       
HEAD is now at cd03a82 append GPL

再次查看readme.txt文件的内容

1
2
3
$ cat readme.txt                                                                
Git is a distributed version control system.
Git is a free software distributed under the GPL.

又回到了最新版本 `

特殊情况:比如,我们现在回到到了某个版本,关掉了电脑,第二天像恢复到最新版本,但是找不到新版本的commit id 咋办呢?

git提供了一个命令git reflog 用来记录我们的每一次命令

1
2
3
4
5
6
7
$ git reflog                                                                    
cd03a82 (HEAD -> master) HEAD@{0}: reset: moving to cd03a8
db2285b HEAD@{1}: reset: moving to HEAD^
cd03a82 (HEAD -> master) HEAD@{2}: commit: append GPL
db2285b HEAD@{3}: commit: add distributed
36e9e51 HEAD@{4}: commit: add 2 files.
251dffd HEAD@{5}: commit (initial): wrote a readme file

可以看到commit id

工作区和暂存区

工作区:我们能在电脑里看到的目录,比如当前使用的 learngit的文件夹 就是一个git工作区

版本库: 工作区中有一个隐藏目录.gitGit的版本库

Git版本库中存了很多东西,其中最为重要的是 称为stage(index)的暂存区,

还有Git为我们自动创建的第一个分支 master,以及指向master的指针 HEAD

11.png

文件添加到版本库 两步执行

git add 把文件从工作区添加到暂存区

git commit 提交更改, 把暂存区的内容提交到当前分支

需要提交的文件修改先添加到暂存区,然后一次性提交到分支中

例子

readme.txt进行修改,添加一条内容

111.png

新增一个LICENSE文本文件

先用git status查看一下状态

1
2
3
4
5
6
7
8
9
10
11
`$ git status                                                                    
On branch master
Changes not staged for commit:
(use "git add/rm ..." to update what will be committed)
(use "git checkout -- ..." to discard changes in working directory)
deleted: LICENSE.txt
modified: readme.txt
Untracked files:
(use "git add ..." to include in what will be committed)
LICENSE
no changes added to commit (use "git add" and/or "git commit -a") `

Git清楚的表明了,readme.txt被修改了,而LICENSE还从来没有被添加过,状态为Untracked

使用两次git add,把readme.txtLICENSE添加 ,然后,git status查看一下

1
2
3
4
5
6
7
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)

new file: LICENSE
modified: readme.txt

两个文件都被添加到了暂存区

111.png

执行 git commit 就可以一次性把暂存区的所有修改提交到分支

1
2
3
4
`$ git commit -m 'git new '                                                      
[master 0694ef3] git new
3 files changed, 3 insertions(+), 1 deletion(-)
create mode 100644 LICENSE

提交之后,不对工作区做任何修改, 工作区就是干净的

1
2
3
$ git status
On branch master
nothing to commit, working tree clean

版本库再次发生变化

111.png

管理修改

git跟踪并管理的是修改,而非文件

实践出真知:

首先,对readme.txt做一个修改 加一行内容

1
2
3
4
5
6
`$ cat readme.txt                                                                
Git is a distributed version control system.
Git is a free software distributed under the GPL.
Git has a mutable index called stage.
Git has a nbnb nbn nb.
Git new connect. //新加的内容

git add 添加 `

1
2
3
4
5
6
$ git add readme.txt                                                                       
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD ..." to unstage)
modified: readme.txt

再次修改readme.txt

1
2
3
4
5
6
7
$ cat readme.txt                                                                
Git is a distributed version control system.
Git is a free software distributed under the GPL.
Git has a mutable index called stage.
Git has a nbnb nbn nb.
Git new connect.
Git new new connect //再次添加

直接提交 git commit

1
2
3
`$ git commit -m "git new new connect"                                           
[master cf3406c] git new new connect
1 file changed, 2 insertions(+), 1 deletion(-)

查看状态 git status `

1
2
3
4
5
6
7
8
$ git status                                                                    
On branch master
Changes not staged for commit:
(use "git add/rm ..." to update what will be committed)
(use "git checkout -- ..." to discard changes in working directory)
deleted: LICENSE
modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a") `

可以看到 第二次修改没有被提交

因为:第一次修改->git add ->第二次修改 -> git commit

第一次的修改放入到了暂存区,第二次的修改没有放入到暂存区,所以,使用

git commit 只提交了暂存区的修改,因此,第一次修改被提交,第二次的修改不会被提交

使用 git diff HEAD -- readme.txt 查看工作区和版本库里面的区别

1
2
3
4
5
6
7
8
9
10
`$ git diff HEAD -- readme.txt                                                   
diff --git a/readme.txt b/readme.txt
index e1b5b50..6558bb3 100644
--- a/readme.txt
+++ b/readme.txt
@@ -3,3 +3,4 @@ Git is a free software distributed under the GPL.
Git has a mutable index called stage.
Git has a nbnb nbn nb.
Git new connect.
+Git new new connect

想要提交第二次修改,可以继续git add 然后 git commit 也可以不急着提交修改,确定之后,执行git addgit commit

1
2
3
4
5
6
7
8
9
10
11
12
13
$ git add readme.txt                                                            `

$ git commit -m 'git new new new connect'
[master e125243] git new new new connect
1 file changed, 1 insertion(+) `

$ git status
On branch master
Changes not staged for commit:
(use "git add/rm ..." to update what will be committed)
(use "git checkout -- ..." to discard changes in working directory)
deleted: LICENSE
no changes added to commit (use "git add" and/or "git commit -a")

现在 两次修改都提交到了版本库的当前分支中

撤销修改

git checkout -- file

两种情况:

文件修改后还没有执行 git add 没有添加到暂存区, 执行这条命令,就会回到和版本库一模一样的状态。

1
2
3
4
5
6
7
8
9
10
$ cat readme.txt                                                                
Git is a distributed version control system.
Git is a free software distributed under the GPL.
Git has a mutable index called stage.
Git has a nbnb nbn nb.
Git new connect.
Git new new connect.
Git nen new new connect.
Git new new new new connect.
Git nbn nbn nbn //添加数据

不执行git add 的情况:

1
2
3
4
5
6
7
8
9
10
$ git checkout readme.txt                                                                                         
$ cat readme.txt
Git is a distributed version control system.
Git is a free software distributed under the GPL.
Git has a mutable index called stage.
Git has a nbnb nbn nb.
Git new connect.
Git new new connect.
Git nen new new connect.
Git new new new new connect. //新数据已被撤回

文件执行了git add 添加到了暂存区, 然后执行修改,现在撤销修改就回到添加到暂存区后的状态。可以让这个文件回到最后一次git commitgit add 时的状态

文件提交后

1
2
3
4
5
6
7
$ git add readme.txt                                                            `                                                                                     
$ git commit -m 'new nbn'
On branch master
Changes not staged for commit:
deleted: LICENSE
Untracked files:
readme,txt

执行修改:

1
2
3
4
5
6
7
8
9
10
$ cat readme.txt                                                                
Git is a distributed version control system.
Git is a free software distributed under the GPL.
Git has a mutable index called stage.
Git has a nbnb nbn nb.
Git new connect.
Git new new connect.
Git nen new new connect.
Git new new new new connect.
Git nbn. //新增数据

撤回

1
2
3
4
5
6
7
8
9
10
11
$ git checkout -- readme.txt                                                    

$ cat readme.txt
Git is a distributed version control system.
Git is a free software distributed under the GPL.
Git has a mutable index called stage.
Git has a nbnb nbn nb.
Git new connect.
Git new new connect.
Git nen new new connect.
Git new new new new connect.

注意: git checkout -- file 命令中的 -- 非常重要,没有 -- ,就变成了切换到另一个分支的命令

git reset HEAD <file>

撤销掉暂存区的修改,重新放回工作区

1
2
3
4
5
6
7
8
9
10
11
12
`$ cat readme.txt                                                                
Git is a distributed version control system.
Git is a free software distributed under the GPL.
Git has a mutable index called stage.
Git has a nbnb nbn nb.
Git new connect.
Git new new connect.
Git nen new new connect.
Git new new new new connect.
git my nbme //新增数据

git add readme.txt //添加到暂存区
1
2
3
4
`$ git reset HEAD readme.txt                                                     
Unstaged changes after reset:
D LICENSE
M readme.txt ` `

git reset 命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们使用 HEAD 时,表示最新的版本

git status 查看一下

1
$ git status                                                                                                                                                                     On branch master                                                                                                                                                             Changes not staged for commit:                                                                                                                                                    (use "git add ..." to update what will be committed)                                                                                                                               (use "git checkout -- ..." to discard changes in working directory)                                                                                                                 modified:   readme.txt                                                                                                                                                            no changes added to commit (use "git add" and/or "git commit -a")                                                                                                                                                 `

现在暂存区干净了,工作区有修改

丢弃工作区的修改

1
2
3
4
5
$ git checkout -- readme.txt     

$ git status
On branch master
nothing to commit, working tree clean

删除文件

先创建一个 test.txt

1
2
λ cat test.txt`
`git new test`

提交到版本库

1
2
3
4
5
6
λ git add test.txt

λ git commit -m "add test.txt"
[master 9090e84] add test.txt
1 file changed, 1 insertion(+)
create mode 100644 test.txt

删除

1
λ rm test.txt

此时,删除文件之后,工作区和版本库就不一致了

git status 查看一下

1
2
3
4
5
6
7
8
λ 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)
deleted: test.txt

no changes added to commit (use "git add" and/or "git commit -a")

两种情况

第一:直接删除

git rm 删掉 git commit 提交

1
2
λ git rm test.txt
rm 'test.txt'
1
2
3
4
λ git commit -m "remove test.txt"
[master e732cb5] remove test.txt
1 file changed, 1 deletion(-)
delete mode 100644 test.txt

文件就从版本库中删除了

第二:误删的情况 因为版本库中还存在,然后执行恢复文件操作

1
λ git checkout -- test.txt

git checkout 用版本库的版本替换工作区的版本,无论工作区是修改还是删除,然后可以一键还原

分支管理

创建与合并分支