1、Git简介
1.1、什么是Git?
Git是分布式文件版本管理系统。
什么是本地文件版本管理?
我们要写一篇重要文章,每写一段时间我们就会备份一个副本,以便于内容追溯以及丢失,这就是本文件管理。
什么中心化版本管理?
多人协同开发一个项目时,大家都把代码提交到一个集中的代码仓库管理。提交更新都必须连接代码仓库。如果无法连接远程代码仓库,就无法继续提交。
什么分布式文件版本管理?
分布式代码管理就是除了中心仓库外、每个人本地还有一套完整的代码副本,即使无法连接网络也可以先把代码提交到本地仓库,待有网络时再提交到远程仓库。
1.2、四种存储区域
- 工作区:就是平常我们编写修改代码的地方。
- 暂存区:保存了下次将要提交的文件列表信息。
- 本地仓库:本地用来保存项目的元数据和对象数据库的地方。
- 远程仓库:远程用来保存项目的元数据和对象数据库的地方。
1.3、五种状态
- 未追踪:新加入工作区的文件,没有做过任何git操作,
- 已暂存:表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。
- 已修改:表示修改了文件,但还没保存到数据库中。
- 已提交:表示数据已经安全地保存在本地数据库中
- 远程提交:已提交到远程仓库
1.4、四种存储对象
Git 是一个内容寻址文件系统,核心部分是一个简单的键值对数据库。你可以向 Git 仓库中插入任意类型的内容,它会返回一个唯一的键,通过该键可以在任意时刻再次取回该内容。
- blob对象:文件的存储对象
- tree对象:目录存储对象,可以包含blob对象,也可以包含tree对象。
- commit对象: commit对象针对一次提交的快照、指向一个tree对象,并且除了初次提交外每个commit对象还包含一个父的commit对象。
- 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