Git记录的是什么
SVN记录的是每一次版本改动的内容
Git则是将每个版本独立保存
三棵树:
工作区域 Working Directory
平时存放项目的地方
暂存区域 Stage(Index)
临时存放改动(文件-列表信息)
Git仓库 Repository(HEAD)
存放所有版本数据(HEAD指向最新版本数据)
Git工作流程
1.在工作目录中添加、修改文件
2.讲需要进行版本管理的文件放入暂存区域
3.将暂存区域的文件提交到Git仓库
操作:
#git config --global user.name "emm"
#git config --global user.email "3108775859@qq.com"
#git config --list
#git init
Initialized empty Git repository in D:/Git/.git/
**提交**
**添加到暂存区域**
#git add readme.md
#git add 文件名
**暂存区域的文件提交到Git仓库**
#git commit -m "add a readme file"
#git commit -m "说明"
[master (root-commit) b0c07bc] add a readme file
1 file changed, 1 insertion(+)
create mode 100644 readme.md
查看状态:
#git status
On branch master
nothing to commit, working tree clean
创建LiCENSE之后
#git status
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
LICENSE
nothing added to commit but untracked files present (use "git add" to track)
**未跟踪文件**
#git add LICENSE
#git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: LICENSE
**将暂存区域恢复到之前的状态**
#git reset HEAD
#git status
**文件恢复状态**
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
LICENSE
nothing added to commit but untracked files present (use "git add" to track)
#git commit -m "add a LICENSE file"
[master 3a7a1f1] add a readme file
1 file changed, 6 insertions(+)
create mode 100644 LICENSE
**还原暂存区域的文件**
#git checkout --文件名
**如果文件添加到暂存区还没有提交的情况下再次修改了,那么需要在添加(add)一次再提交(commit)才能提交最新的版本**
查看历史提交记录
#git log
**SHA-1校检和**
commit 307d9cbebfb7b75b5404287129950333c1acf31f (HEAD -> master)
Author: emm <3108775859@qq.com>
Date: Wed Jun 19 22:00:47 2019 +0800
edit LICENSE
commit 3a7a1f1b9e5af7596fc7458f982658c3f07b939c
Author: emm <3108775859@qq.com>
Date: Wed Jun 19 21:59:14 2019 +0800
add a readme file
commit 45923c289434b731c8c954bb0a5983c9a62931f8
Author: emm <3108775859@qq.com>
Date: Wed Jun 19 21:44:12 2019 +0800
add a readme file
commit b0c07bc2a8901d20a11aed2113fada013222d9a3
Author: emm <3108775859@qq.com>
Date: Wed Jun 19 21:33:37 2019 +0800
add a readme file
add把工作目录中的文件添加到暂存区
commit则是把暂存区里的文件添加到Git仓库
reset把Git指向的版本恢复到暂存区
checkout把暂存区的文件恢复到工作目录
快照回滚
**波浪线表示HEAD的上一个快照**
#git reset HEAD~
#git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: LICENSE
no changes added to commit (use "git add" and/or "git commit -a")
reset命令的选项
#git reset --mixed HEAD~
**——移动HEAD的指向,将其指向上一个快照**
**——将HEAD移动后指向的快照回滚到暂存区域**
#git reset --soft HEAD~
**——移动HEAD的指向,将其指向上一次快照(撤销)**
** --hard 影响三棵树**
#git reset --hard HEAD~
**-移动HEAD的指向,将其指向上一个快照**
**-将HEAD移动后指向的快照回滚到暂存区域**
**-将暂存区域的文件还原到工作目录**
#会将工作目录的最新的文件覆盖掉
命令回滚快照三部曲
1.移动HEAD的指向(--soft)
2.将快照回滚到暂存区域([--mixed],默认)
3.将暂存区域还原到工作目录(--hard)
回滚到指定版本(可前可后)
#git reset 版本快照ID号
回滚个别文件
git reset 版本快照 文件名/路径
查看历史所有 commit ID
#git reflog
3a7a1f1 (HEAD -> master) HEAD@{0}: reset: moving to HEAD~
307d9cb HEAD@{1}: commit: edit LICENSE
3a7a1f1 (HEAD -> master) HEAD@{2}: commit: add a readme file
45923c2 HEAD@{3}: reset: moving to HEAD
45923c2 HEAD@{4}: commit: add a readme file
b0c07bc HEAD@{5}: commit (initial): add a readme file
比较暂存区域与工作目录
#git diff
**分别存放到两个文件夹**
diff --git a/LICENSE b/LICENSE
**类型和权限**
index bfe3cb4..dfe81cb 100644
**---代表旧文件(暂存区)**
**+++代表新文件(工作目录)**
--- a/LICENSE
+++ b/LICENSE
** -表示旧文件 +表示新文件 开始的行号 开始的行数 连续的行数**
@@ -1,4 +1,4 @@
** +新文件 **
-Copyright (C) 2019 emm
+Copyright (C) 2019 emm
比较两个历史快照
#git diff 快照ID1 快照ID2
比较当前工作目录和Git仓库中的快照
#git diff 快照ID
比较最新提交的快照和当前工作目录的快照
#git diff HEAD
比较暂存区域和Git仓库快照
#git diff --cached [快照ID]
修改最后一次提交
在实际开发中,可能会遇到以下两种情景:
——情景1:
版本刚一提交(commit)到仓库,突然想起漏掉两个文件还没有添加(add)。
——情景2:
版本刚一提交(commit)到仓库,突然想起版本说明写的不够全面
执行带 --amend 选项的 commit 提交命令。Git就会“更正”最近的一次提交。
比如:更正了一个readme,但是不想为了一个readme创建新的版本
#git commit --amend
vim操作
#git commit --amend -m "说明"
不会进入vim操作
删除文件
该删除命令只删除工作目录和暂存区域的文件,也就是取消跟踪,在下次提交时不会纳入版本管理。
#git rm 文件名
#Git reset--soft HEAD
强制删除
#git rm -f 文件名
删除暂存区域文件,保留工作区域
#git rm --cached 文件名
重命名文件
修改文件名
#git mv 旧文件名 新文件名
Git分支
Git采用一种看似异端的形式来处理版本迭代的。
通常的版本控制系统采用增量文件系统的方式来管理版本迭代(新的快照存放的是旧版本修改后的那部分内容)
Git将每个版本都独立存储
创建分支
#git branch 分支名字
--decorate 让log显示指向提交的所有引用 #git log --decorate
切换分支
#git checkout 分支名
--oneline参数 只显示快照的id和说明(一行显示一个快照)
#git log --decorate --oneline
--graph 图像化显示
--all 所有分支全部显示
#git log --decorate --oneline --graph --all
实际开发中的分支
Hotfix
修补程序出现的bug
Master
用来发布
Release
内部发布版(测试完之后发布)
Develop
开发版(开发完之后编译成程序(就是Release))
Feature
相关的功能
分支的合并
比如,HEAD在master分支,想把feature分支合并到master
#git merge feature
发生冲突:
两个分支出现同名的文件,但是文件内容却不同
这个时候
#git status
会发现有东西需要修改
GitI在所有有冲突的文件打上标记
以等号(=)为界
合并之后再次提交一次
#git commit -m "说明文本"
创建并切换到分支
#git checkout -b 分支名
-b 创建并切换到分支
Fast-forward
只需要把 HEAD 指向更改
删除分支
#git branch -d 分支名
或者
#git branch --delete 分支名
分支的操作是修改指针的指向位置
Git的分支是用指针实现的
匿名分支
#git checkout HEAD~
这一段话的意思是,使用了checkout命令,但是没有指定分支名,所以git会创建一个叫做匿名分支(没有名字的分支)的东西,当你切换到别的分支的时候,在这个匿名分支中,所做的所有操作、提交都会被丢弃掉,所以可以使用匿名分支来做一些实验
checkout命令
checkout命令有两种功能:
1.从历史快照(或者暂存区域)中拷贝文件到工作目录
当给定某个文件名时,Git会从指定的提交中拷贝文件到暂存区域和工作目录。
比如执行
#git chekout HEAD README.md
命令会将上一个快照这能过的README.md文件复制到工作目录和暂存区域中
如果命令中没有指定具体的快照ID,则姜葱暂存区域恢复指定文件到工作目录
#git checkout README.md
如果恰好有一个分支叫做README.md,那么需要写成
#git checkout --README.md
2.切换分支
Git的分支其实就是添加一个指向快照的指针,其次我们还知道切换分支除了
1.修改HEAD指针的指向
还会
2.改变暂存区域和工作目录的内容
checkout命令和reset命令的区别
恢复文件
checkout命令和reset命令都可以用于恢复指定快照的指定文件,并且它们都不会改变HEAD指针的指向
它们的区别是reset命令只讲指定文件恢复到暂存区域(--mixed)
checkout命令是同时覆盖暂存区域和工作目录
注意:
也许你试图使用 #git reset --hard HEAD~ README.md命令让reset同时覆盖目录,但是Git会告诉你这是徒劳的 (此时reset不允许--soft或者--hard选项)
恢复快照
reset命令
是用来“回到过去”的,根据选项的不同,reset命令将移动HEAD指针(--soft)->覆盖暂存区域(--mixed,默认)->覆盖工作目录(--hard)
chechout命令
虽说是用于切换分支,但是事实上也是通过移动HEAD指针和覆盖暂存区域、工作目录来实现的
他们的区别:
第一个区别是:
对与reset --hard命令来说,checkout命令更安全,因为checkout命令在切换分支前会检查一下当前的工作状态, 如果不是“clean”的话,Git不会允许你这样做,而reset --hard命令则是直接覆盖所有数据。
第二个区别是:
更新HEAD指向的方式。 reset命令会移动HEAD所在分支的指向 checkout命令只会移动HEAD自身来指向另一个分支