【Git温故而知新】

242 阅读5分钟

1、Git简介

1.1、什么是Git?

Git是分布式文件版本管理系统。

什么是本地文件版本管理?

我们要写一篇重要文章,每写一段时间我们就会备份一个副本,以便于内容追溯以及丢失,这就是本文件管理。

什么中心化版本管理?

多人协同开发一个项目时,大家都把代码提交到一个集中的代码仓库管理。提交更新都必须连接代码仓库。如果无法连接远程代码仓库,就无法继续提交。

什么分布式文件版本管理?

分布式代码管理就是除了中心仓库外、每个人本地还有一套完整的代码副本,即使无法连接网络也可以先把代码提交到本地仓库,待有网络时再提交到远程仓库。

1.2、四种存储区域

git1-2.png

  1. 工作区:就是平常我们编写修改代码的地方。
  2. 暂存区:保存了下次将要提交的文件列表信息。
  3. 本地仓库:本地用来保存项目的元数据和对象数据库的地方。
  4. 远程仓库:远程用来保存项目的元数据和对象数据库的地方。

1.3、五种状态

  1. 未追踪:新加入工作区的文件,没有做过任何git操作,
  2. 已暂存:表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。
  3. 已修改:表示修改了文件,但还没保存到数据库中。
  4. 已提交:表示数据已经安全地保存在本地数据库中
  5. 远程提交:已提交到远程仓库

1.4、四种存储对象

git1-4.png

Git 是一个内容寻址文件系统,核心部分是一个简单的键值对数据库。你可以向 Git 仓库中插入任意类型的内容,它会返回一个唯一的键,通过该键可以在任意时刻再次取回该内容。

  1. blob对象:文件的存储对象
  2. tree对象:目录存储对象,可以包含blob对象,也可以包含tree对象。
  3. commit对象: commit对象针对一次提交的快照、指向一个tree对象,并且除了初次提交外每个commit对象还包含一个父的commit对象。
  4. tag对象:指向一个commit对象。

2、Git常用命令

2.1、初始化本地仓库

该命令将创建一个名为 .git 的子目录,这个子目录含你初始化的 Git 仓库中所有的必须文件。

$ git init 

2.2、克隆远程仓库

把远程仓库代码克隆到本地。

$ git clone https://gitee.com/xiaoming/gittest.git

2.3、日志查看

查看提交日志 ,--pretty=oneline 参数是让日志单行显示

$ git log --pretty=oneline
b4969e9d355277ebf30f9ebef7696e52589c0080 (HEAD -> master, origin/master) Merge branch 'master' of https://gitee.com/chendongkun/gittest
fddbcc8cb2d35eddc6bb7023f7e503703606198e third commit
6f29ad3600936fddcf8e5c8cf92cc937b23b4af0 (tag: v1.1, test) second commit
5ef8b77182aa2bc4ce17e4ef4b8654d4bd525d3f (tag: v1.0) first commit
5171da8397ee01cae3637064bb343b6ccf776285 Initial commit

2.4、状态查看

初次状态查询没有需要提交的内容。

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

2.5 、暂存区操作

新建一个文件new.txt,内容为 “小明同学新建文件”。

$ echo '小明同学新建文件' > newfile.txt

查看文件状态、未跟踪文件中有一个newfile .txt文件

$ git status
On branch master
Your branch is up to date with 'origin/master'.

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        newfile.txt

使用git add . 添加文件到暂存区

$ git add .

查看文件状态,已经在暂存区了

$ git status
On branch master
Your branch is up to date with 'origin/master'.

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        new file:   newfile.txt

可以用git restore --staged 撤回暂存区修改

git restore --staged  newfile.txt

查看文件状态,暂存区的状态已经取消

$ git status
On branch master
Your branch is up to date with 'origin/master'.

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        newfile.txt

2.6、文件提交

已经在暂存区的文件,直接git commit 提交到本地仓库

$ git commit -m "小明同学新建文件"
[master ee97b45] m小明同学新建文件
 1 file changed, 1 insertion(+)
 create mode 100644 newfile.txt

查看日志,可以看到已经保存到本地仓库。

$ git log --oneline
ee97b45 (HEAD -> master) m小明同学新建文件
b4969e9 (origin/master, origin/HEAD) Merge branch 'master' of https://gitee.com/chendongkun/gittest
......

2.7、提交回退

发现修改有问题回退到某个版本提交前。

$ git revert ee97b45
Removing newfile.txt
[master 087350f] Revert "m小明同学新建文件"
 1 file changed, 1 deletion(-)
 delete mode 100644 newfile.txt

查看日志,增加了一次回退的提交

$ git log --oneline
087350f (HEAD -> master) Revert "m小明同学新建文件"
ee97b45 m小明同学新建文件
b4969e9 (origin/master, origin/HEAD) Merge branch 'master' of https://gitee.com/chendongkun/gittest
......

查看本地已经没有newfile.txt文件,回退到提交之前的状态

$ ls newfile.txt
ls: cannot access 'newfile.txt': No such file or directory

2.8、创建分支

查看本地分支只有一个master分支。

$ git branch
* master

创建一个hoxfix分支 ,并切换为当前分支。

$ git checkout -b hotfix
Switched to a new branch 'hotfix'

查看分支状态,多了一个hotfix分支,“*”号表示当前所在分支。

$ git branch
* hotfix
  master

在hotfix分支新建一个文件hotfix.txt,输入内容“hotfix分支内容”,添加暂存,提交本地库。

$ echo "hotfix分支内容" > hotfix.txt | git add . | git commit -m "hotfix提交" 
warning: LF will be replaced by CRLF in hotfix.txt.
The file will have its original line endings in your working directory

查看日志,看到hotfix的一次提交。

$ git log --oneline
8fea289 (HEAD -> hotfix) hotfix提交
087350f (master) Revert "m小明同学新建文件"
ee97b45 m小明同学新建文件
b4969e9 (origin/master, origin/HEAD) Merge branch 'master' of https://gitee.com/chendongkun/gittest
......

2.9、分支合并

切换到master分支。

$ git checkout master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 2 commits.
  (use "git push" to publish your local commits)

把hotfix分支的内容合并到master分支

$ git merge hotfix
Updating 087350f..8fea289
Fast-forward
 hotfix.txt | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 hotfix.txt

查看日志,看到hotfix内容已经合并到master分支

$ git log --oneline
8fea289 (HEAD -> master, hotfix) hotfix提交
087350f Revert "m小明同学新建文件"
ee97b45 m小明同学新建文件
b4969e9 (origin/master, origin/HEAD) Merge branch 'master' of https://gitee.com/chendongkun/gittest
......

2.10、提交远程仓库

$ git push
Enumerating objects: 8, done.
Counting objects: 100% (8/8), done.
Delta compression using up to 4 threads
Compressing objects: 100% (5/5), done.
Writing objects: 100% (7/7), 806 bytes | 403.00 KiB/s, done.
Total 7 (delta 2), reused 0 (delta 0), pack-reused 0
remote: Powered by GITEE.COM [GNK-6.2]
To https://gitee.com/chendongkun/gittest.git
   b4969e9..8fea289  master -> master

2.11、拉取远程代码

远程他人增加了remote.txt,拉取远程仓库的代码。

$ git pull
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), 999 bytes | 90.00 KiB/s, done.
From https://gitee.com/chendongkun/gittest
   8fea289..4e1630e  master     -> origin/master
Updating 8fea289..4e1630e
Fast-forward
 remote.txt | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 remote.txt

2.12 解决冲突

本地、远程再次都修改remote.txt,并且提交都提交。再次拉取提示拉取失败,文件合并失败。

$ git pull
Auto-merging remote.txt
CONFLICT (content): Merge conflict in remote.txt
Automatic merge failed; fix conflicts and then commit the result.

查看文件内容、发现冲突的内容。

$ cat remote.txt
<<<<<<< HEAD
本地修改内容
=======
remote远程内容1
>>>>>>> 4df8c3945ee9500b80877ecb787ff72a3d44f22a

手动把文件修改成想要的内容,再次提交、推送到远程仓库,冲突解决。

$ git  commit -am "解决冲突"
[master d5fe09f] 解决冲突
$ git push
Enumerating objects: 10, done.
Counting objects: 100% (10/10), done.
Delta compression using up to 4 threads
Compressing objects: 100% (4/4), done.
Writing objects: 100% (6/6), 593 bytes | 593.00 KiB/s, done.
Total 6 (delta 2), reused 0 (delta 0), pack-reused 0
remote: Powered by GITEE.COM [GNK-6.2]
To https://gitee.com/chendongkun/gittest.git
   4df8c39..d5fe09f  master -> master