目录
1、记述一行提交信息: git commit -m "提交描述"
git log --pretty=short 只显示提交信息的第一行
git log -p 目录/文件 显示特定的目录/文件的改动
git init 初始化仓库
初始化之后,会在当前目录生成一个.git的隐藏文件夹,这个 .git 目录里存储着管理当前目录内容所需的仓库数据
这个目录的内容称为“附属于该仓库的工作树”
git status 查看仓库的状态
![](https://i-blog.csdnimg.cn/blog_migrate/b28c45c576ee1999cfeec70fa7b570ad.png)
当前正处于 master 分支下,nothing to commit说明仓库没有任何更改,没有可提交的内容
创建 README.md文件,然后再输入命令git status
可以看到在 Untracked files(还没有加入缓冲区) 中显示了 README.md 文件
git add 向暂存区中添加文件
运行 git add README.md后,输入命令git status查看状态
README.md 文件显示在 Changes to be committed(加入缓冲区) 中了
git各个区域和文件状态
- 工作区间: 即我们创建的工程文件, 在编辑器可直观显示;
- 缓存区: 只能通过git GUI或git shell 窗口显示,提交代码、解决冲突的中转站;
- 本地仓库: 只能在git shell 窗口显示,连接本地代码跟远程代码的枢纽,不能联网时本地代码可先提交至该处;
- 远程仓库: 即保存我们代码的服务器,本文以公共版本控制系统:github为例,登录github账号后可直观显示;
对于任何一个文件,在 Git 内都只有三种状态:
1、已修改(modified) Git 的工作目录
2、已暂存(staged) 暂存区域
3、已提交(committed) 本地仓库
git commit 保存仓库的历史记录
1、记述一行提交信息: git commit -m "提交描述"
2、记述详细提交信息 git commit
在README.md中添加 ### hello
通过git status查看状态
git commit回车结果如下:
Changes to be committed可以看到本次提交中包含的文件
在编辑器中记述提交信息的格式如下。
● 第一行:用一行文字简述提交的更改内容
● 第二行:空行
● 第三行以后:记述更改的原因和详细内容
编辑完成,wq保存退出即可
如果想终止提交,请将提交信息留空并直接关闭编辑器,随后提交就会被中止。
git log 查看提交日志
git log --pretty=short 只显示提交信息的第一行
git log 目录/文件 只显示指定目录、文件的日志
git log -p 显示文件的改动
git log -p 目录/文件 显示特定的目录/文件的改动
git diff 查看更改前后的差别
git diff 查看工作树和暂存区的差别
把### hello改为### hello world
“+”号标出的是新添加的行,被删除的行则用“-”号标出
git diff HEAD 查看工作树和最新提交的差别
在执行 git commit命令之前先执行git diff HEAD命令,查看本次提交与上次提交之间有什么差别,等确认完毕后再进行提交。这里的 HEAD 是指向当前分支中最新一次提交的指针。保险起见,我们用git log查看一下提交日志,确认提交是否成功。
分支的操作
为了便于说明,重新建一个文件夹git-tutorial,git init初始化后,建一个README.md文件,并依次用命令git add README.md、git commit -m "first commit"提交
git branch——显示分支一览表
master 分支左侧标有“*”(星号),表示这是我们当前所在的分支
git checkout -b——创建、切换分支
执行git checkout -b feature-A命令,创建名为 feature-A 的分支
git checkout -b feature-A等于下面2条命令
git branch feature-A # 创建feature-A分支
git checkout feature-A # 切换到feature-A分支
这时候查看,已经切换到feature-A分支下
切换回上一个分支 git checkout -
在feature-A分支下,添加 - feature-A,如图,
用下面命令行提交(如果不提交,更改的文件内容不会记录在feature-A分支,切回master分支后,相当于feature-A什么东西也没有修改)
git add README.md
git commit -m "Add feature-A"
插入2个概念:
- 特性分支:集中实现单一特性(主题),除此之外不进行任何作业的分支。
- 主干分支:主干分支是刚才我们讲解的特性分支的原点,同时也是合并的终点。通常人们会用 master 分支作为主干分支。
主干分支和特性分支都可以有多个。一般来说,一个特性分支对应一个功能,一个主干分支对应一个软件版本
git merge——合并分支
首先 git checkout master 切换到 master 分支
为了在历史记录中明确记录下本次分支合并,我们需要创建合并提交。因此,在合并时加上 --no-ff参数
git merge --no-ff feature-A
默认信息中已经包含了是从 feature-A 分支合并过来的相关内容,所以可不必做任何更改。将编辑器中显示的内容保存,关闭编辑器,然后就会看到下面的结果。
git log --graph——以图表形式查看分支
git reset——回溯历史版本
git rest --hard 哈希值 恢复到某个时间点的状态
git checkout -b fix-B 创建 fix-B 分支,并在README.md添加一行- fix-B
运行下面命令提交
git add README.md
git commit -m "Fix B"
现在状态如图:
目标如图:
git log命令只能查看以当前状态为终点的历史日志。所以这里要使用 git reflog命令,查看当前仓库的操作日志。
圈出来部分表示feature-A 特性分支合并后的状态,对应哈希值为 39d1ac0
切换回master分支:git checkout master,回溯历史版本:git reset --hard 39d1ac0 此时状态如图
合并fix-B分支:git merge --no-ff fix-B
解决冲突
打开README.md文件
=======上面是当前 HEAD 的内容,下面要合并的 fix-B 分支中的内容
本次修正让 feature-A 与 fix-B 的内容并存于文件之中。但是在实际的软件开发中,往往需要删除其中之一,所以各位在处理冲突时,务必要仔细分析冲突部分的内容后再行修改。修改如下
执行git add README.md和git commit -m "Fix conflict"完成代码提交
git commit --amend——修改提交信息
如果想把上面的提交信息 Fix conflict 更改为 Merge branch 'fix-B' ,输入git commit --amend
进入如下界面
把图中的Fix conflict改为Merge branch 'fix-B',再用git log --graph查看,发现提交信息已经修改。
git rebase -i——压缩历史
创建分支feature-C,并且切换到feature-C下,再README.md添加feature-C,但是由于写快了,写成了feature-D
但是已经提交了,提交信息为 Add feature-C
修改错误后如下
然后用命令 git commit -am "Fix typo"提交 ,但是下图圈出来2个地方希望合并
git rebase -i HEAD~2选定当前分支中包含HEAD(最新提交)在内的两个最新历史记录为对象
将 288745f 左侧的 pick 部分删除,改写为 fixup 。保存文件
结果
然后git checkout master,git merge --no-ff feature-C合并分支到master
里面很多内容摘自《GitHub入门与实践》
git官方中文文档:https://git-scm.com/book/zh/v2
码云git大全:https://gitee.com/all-about-git