一、最最最基础操作

# 初始化仓库
git init # 添加文件到暂存区
git add readme.md # 提交
git commit -m 'wrote a readme file'

二、简单的时空穿梭

1. 文件修改后,查看状态

修改 readme.md 文件,查看状态

git status 命令告知,已经对文件修改但仍未提交暂存区,下一步运用 git diff readme.md 对文件状态进行比较,比较结果显示新的文件比旧的文件新增两行

git add readme.md 后,提示文件已提交暂存区,下一步需要 commit

提交后再次查看 status

2. 查看过去

再次修改并提交,用 git log 命令查看版本

对于 git log 命令,可以添加参数从而更加清晰展示

git log --oneline --graph

此外也可以在 git gui 中更加清晰查看版本变动

3. 回到过去

git 中,运用 Head 代表当前版本,用 Head^ 代表上一个版本,用 Head^^ 代表上上个版本,如果回退过多,如要回退上一百个版本,则可使用 Head-100

回退版本后查看,发现只剩下了两个版本

此时发现已找不到第三个版本的 commit id,如果此时恰好也没有其他历史记录获取 commit id,可以通过命令 git reflog 获取完整的记录

找到 commit id 后再次回到第三个版本

三、工作区、暂存区与版本库

1. git diff 差异比较

# 1. 比较工作区与暂存区
# 当工作区有改动,暂存区为空,比较工作区与最后一次commit的共同文件
# 当工作区有改动,暂存区不为空,比较工作区与暂存区的共同文件
git diff # 2. 比较工作区与HEAD
git diff HEAD --filename # 3. 比较暂存区与HEAD
# 比较的是所有不同文件的增删改
git diff --cached
git diff --staged # 4. 比较两个不同版本
git diff 211ba2 2948ac2 --filename

2. 撤销工作区的修改

如果需要撤销工作区的修改,将工作区文件还原成暂存区的状态,运用 git checkout -- file 命令,可以还原修改文件到与暂存区相同的状态。

如果不但修改了工作区,并且已进行 add 到暂存区的操作,则可运用 git reset HEAD <file> 将暂存区修改撤销掉

还原后则撤销了该文件的 add,此时可再用 git checkout -- file 命令,还原工作区该文件的更改。

3. 删除文件

# 删除工作区的文件
rm filename # 删除工作区与暂存区的文件,可以运用-r进行递归删除
git rm filename # 只将文件存暂存区删除
git rm --cached filename

三、git 分支管理

通过创建新分支,可以在团队开发中在自己的分支中进行开发,而不影响其他的分支,在开发完成后可以将自己的分支一次性合并到原有的分支上,不会影响团队其他人的工作。

1. 分支创建

# 创建并切换分支到“dev”
git checkout -b dev
# 相当于如下两条命令的合并
git branch dev # 创建分支
git checkout dev # 切换分支 # 查看目前所处分支
git branch # switch命令也可以创建新的分支
git switch -c dev

操作创建 dev 分支,并切换;在 dev 分支对 readme 文件进行操作,新增一行并提交;重新切换回 master 分支,发现 readme 文件并无刚刚更新的内容

运用 git merge 命令,将刚刚在 dev 的更改合并到 master

再次查看 readme 文件,发现更新已合并。

2. 冲突

如果同时对 master 分支和 dev 分支新增一行并提交,在合并时会产生冲突,无法 automerge:

解决冲突详见"5. 冲突处理"

3. 删除分支

在完成某一部分的开发后,如果此分支之后不会再使用,则可对该分支进行删除。此时,如果已完成 merge 操作的分支可以直接删除,如果分支没有完成 merge 操作,则会进行提示:

4. 切换分支的正确姿势

切换分支可以使用 git checkout <branch>,而 git checkout 这一命令同样也可用于恢复工作树。

git checkout 的用法****总结

  1. 检出指定文件

    从暂存区检出某一文件;如果暂存区为空,这该文件回滚到最近一次提交状态,该命令常用于对某一文件修改的撤销(上文提到);如果添加 commit id 则回从某一次特定提交中检出某一文件。

    git checkout [commit id] [--] <paths>
  2. 创建并切换分支

    如上文提到用法,如果-b 更改为-B,则会强制创建并覆盖分区

    git checkout -b <new_branch_name>
  3. 新建一个无 log 历史的分区

    如果当前分支经多次提交,log 历史过长,则可创建一个无 log 历史的新分支,但分支内容齐全

    git checkout --orphan <new_branch_name>
  4. 切换分支时将修改内容打包合并

    在切换分支时可以利用该命令,将修改内容打包合并,同步到切换的分支

    git checkout --merge <branch_name>
    • 容易造成冲突
    • 造成修改内容丢失
  5. 分支差异比较

    比较两个分支之间的差异,并提供交互界面进行操作

    git checkout -p <branch_name>

因此,更加推荐使用 git switch 命令切换分支,避免命令混淆。

5. 冲突处理

如果分支某一个文件内容存在冲突,在合并分支时无法直接合并,这时可以用编辑器打开合并冲突产生的文件,根据提示增删需要的内容,再次 add-commit 提交,处理冲突

运用 git log 命令查看分支合并情况

6. 强制禁用 Fast Forward

禁用 Fast Forward 模式进行分支合并,会在合并时新增一个 commit

8. 紧急任务下 stash 当前工作区

如果在开发过程中,需要处理紧急任务,当前分支只进行了一半,还没有办法提交,此时可以运用 git stash 命令,将当前工作区暂存。当完成紧急任务后,运用 git stash pop 命令就可还原到之前进行了一半的工作区

在实际运用中,可以如同 commit 命令一样,给 stash 添加 message,便于区分

如果想多次运用 stash,而不删除,则可用 apply 命令代替 pop

9. Bug 修复后直接运用

如果 master 分支上存在的一个 Bug 得到了修复,而 dev 分支是由 master 分支 Bug 修复前的版本创建的,为了避免重复操作,我们可以通过 git cherry-pick 命令,将一个特定的提交复制到当前分支。

如修复 Bug 的提交版本为 e2d9109,则在 testbranch 分支上运用上述命令,则复制了 Bug 修改的提交到 testbranch 分支

10. Feature 分支

在开发中,会有不断的新功能增加,这其中不乏有很多是实验性质的,为了不与主分支混淆,最好每新增一个新功能,就添加一个 feature 分支;在开发完毕后,与主分支进行合并,并删除该 feature 分支。

如果该实验功能废弃,则可使用 git branch -D <feature_branch_name> 强制删除该 feature 分支。

四、标签管理

为了更加清晰地区分每一次 commit,通常会对 commit 打标签。

默认情况下,使用 git tag <tagname> 是对头指针对应的分支打标,也可指定某个 commit id 进行打标。

使用 git tag 查看所有打过的标签:

曾经对 commit 打过的标签也会显示在 git log 中

也可使用 git tag -a <tagname> -m <tagcommit> [<commit id>] 的形式,对某一个 tag 新增说明,使用 git show <tagname> 则可看到对某一个 tag 增加的说明文字:

如果标签打错,可以进行删除操作

参考资料

廖雪峰 git 教程

重学Git(一)的更多相关文章

  1. 【重学Git】高级命令篇

    1.分离HEAD.HEAD 总是指向当前分支上最近一次提交记录. 所谓分离HEAD,就是让HEAD直接指向某一条具体的提交记录,而不是默认的通过分支名指向当前分支的最近一条提交记录. 2.相对引用^. ...

  2. 【重学Git】基础命令篇

    1.git commit :在提交树中增加一个提交节点,注意:分支是指向提交节点的. 2.git branch newImage : 表示创建一个名为newImage的分支. 3.git checko ...

  3. 【重学Git】整理提交记录

    有时候我们在本分支做了一个很小的更改提交,其他分支想直接拿到这个更改提交,有没有一种不像merge或rebase这么正式的做法呢?也就是说:我仅仅是想获取其中一个小改变而已.cherry-pick就是 ...

  4. 看日记学git摘要~灰常用心的教程

    看日记学git linux 命令行 cd ls / ls -a clear mkdir rmdir echo "hi, good day" > hi.txt touch he ...

  5. 重学js之JavaScript 面向对象的程序设计(创建对象)

    注意: 本文章为 <重学js之JavaScript高级程序设计>系列第五章[JavaScript引用类型]. 关于<重学js之JavaScript高级程序设计>是重新回顾js基 ...

  6. 重学hadoop技术

    最近因为做了些和hadoop相关的项目(虽然主要是运维),但是这段经历让我对hadoop的实际运用有了更加深入的理解. 相比以前自学hadoop,因为没有实战场景以及良好的大数据学习氛围,现在回顾下的 ...

  7. Java集合类简单总结(重学)

    java集合类简介(重学) 一.Collection(集合).Map接口两者应该是平行关系吧. 1.Map介绍 Map是以键值(key-value)对来存放的,2个值.通过key来找到value(例: ...

  8. 重学OpenGL(一)----工具篇

    最近想开发一个小工具,需要用到3D,果断上OpenGL,借这个过程把OpenGL重学一遍. 工欲善其事,必先利其器,先把工具都搞好. [开发语言] 果断C+OpenGL,不解释. [开发环境] Min ...

  9. 沉浸式学 Git

    沉浸式学 Git cover — contents — about 目录 设置 再谈设置 创建项目 检查状态 做更改 暂存更改 暂存与提交 提交更改 更改而非文件 历史 别名 获得旧版本 给版本打标签 ...

随机推荐

  1. Dubbo框架协议总结

    Dubbo支持的各种协议及相关特性及应用场景,均可在官网文档中找到. 支持的协议有dubbo.rmi.hession.http.webservice.thrift.memcached.redis.re ...

  2. IDEA免费激活至2099年教程,亲测可用

    申明,本教程 Intellij IDEA 最新版激活教程,激活码均收集与网络,请勿商用,仅供个人学习使用,如有侵权,请联系作者删除.如条件允许,建议大家购买正版. 以下是本人免费激活到 2099 年的 ...

  3. zabbix部署文档

    环境:zabbix server centos 7 1611最小化安装 172.16.103.2 zabbix client Centos 7 1611 最小化安装 172.16.103.3 1,配置 ...

  4. k8s入坑之路(8)kube-proxy详解

    kube-proxy 每台机器上都运行一个 kube-proxy 服务,它监听 API server 中 service 和 endpoint 的变化情况,并通过 iptables 等来为服务配置负载 ...

  5. OpenYurt 与 FabEdge 集成验证——云边数据面通信初试

    作者|浙江大学 SEL 实验室:晋晨.博云:耿浩涛 审核&校对:海珠 编辑&排版:雯燕 背景 在近几年的产业环境下,传统云计算能力已无法支撑起规模日趋庞大且异地分散的数据处理与计算需求 ...

  6. for和while的区别及使用

    for for的定义,()内的三段表达式,除了中间的必须产生布尔型,并未对其余两段有所限制,只要是表达式就可以了. //递增和递减 for(int i = 0;i < 100;i++) for ...

  7. 终论到底该不该写isDebugEnabled

    以前: 很多日志框架都不支持{}模板的写法(如Log4j1.X, Apache Commons Logging),于是只能通过字符串拼接来输出日志内容: log.debug("debug日志 ...

  8. 开发规范 - UML图

    依赖关系是用一套带箭头的虚线表示,他通常描述一个对象在运行期间会用到另一个对象的关系.如图为例码农只有在工作的时候才会用到 Mac 电脑,所以这种依赖关系是依赖于运行状态的.通常情况下是在程序里面通过 ...

  9. java解析Excel日期格式转换问题

    Excel上传导入,Excel里面单元格是日期的会解析出来数字,比如2020-07-11会解析为44023解决方法一: Excel单元格格式设置为文本格式.解决方法二: 使用代码处理,把解析出来的44 ...

  10. Effective C++ 总结笔记(四)

    五.实现 26.尽可能延后变量定义式的出现时间 尽可能延后变量定义式的出现,甚至应该尝试延后这份定义直到能够给他初值实参为止,这样不仅能避免构造和析构非必要对象,避免无意义的default行为,也可增 ...