重学Git(一)
一、最最最基础操作
# 初始化仓库
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 的用法****总结
检出指定文件
从暂存区检出某一文件;如果暂存区为空,这该文件回滚到最近一次提交状态,该命令常用于对某一文件修改的撤销(上文提到);如果添加 commit id 则回从某一次特定提交中检出某一文件。git checkout [commit id] [--] <paths>
创建并切换分支
如上文提到用法,如果-b 更改为-B,则会强制创建并覆盖分区git checkout -b <new_branch_name>
新建一个无 log 历史的分区
如果当前分支经多次提交,log 历史过长,则可创建一个无 log 历史的新分支,但分支内容齐全git checkout --orphan <new_branch_name>
切换分支时将修改内容打包合并
在切换分支时可以利用该命令,将修改内容打包合并,同步到切换的分支git checkout --merge <branch_name>
- 容易造成冲突
- 造成修改内容丢失
分支差异比较
比较两个分支之间的差异,并提供交互界面进行操作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.分离HEAD.HEAD 总是指向当前分支上最近一次提交记录. 所谓分离HEAD,就是让HEAD直接指向某一条具体的提交记录,而不是默认的通过分支名指向当前分支的最近一条提交记录. 2.相对引用^. ...
- 【重学Git】基础命令篇
1.git commit :在提交树中增加一个提交节点,注意:分支是指向提交节点的. 2.git branch newImage : 表示创建一个名为newImage的分支. 3.git checko ...
- 【重学Git】整理提交记录
有时候我们在本分支做了一个很小的更改提交,其他分支想直接拿到这个更改提交,有没有一种不像merge或rebase这么正式的做法呢?也就是说:我仅仅是想获取其中一个小改变而已.cherry-pick就是 ...
- 看日记学git摘要~灰常用心的教程
看日记学git linux 命令行 cd ls / ls -a clear mkdir rmdir echo "hi, good day" > hi.txt touch he ...
- 重学js之JavaScript 面向对象的程序设计(创建对象)
注意: 本文章为 <重学js之JavaScript高级程序设计>系列第五章[JavaScript引用类型]. 关于<重学js之JavaScript高级程序设计>是重新回顾js基 ...
- 重学hadoop技术
最近因为做了些和hadoop相关的项目(虽然主要是运维),但是这段经历让我对hadoop的实际运用有了更加深入的理解. 相比以前自学hadoop,因为没有实战场景以及良好的大数据学习氛围,现在回顾下的 ...
- Java集合类简单总结(重学)
java集合类简介(重学) 一.Collection(集合).Map接口两者应该是平行关系吧. 1.Map介绍 Map是以键值(key-value)对来存放的,2个值.通过key来找到value(例: ...
- 重学OpenGL(一)----工具篇
最近想开发一个小工具,需要用到3D,果断上OpenGL,借这个过程把OpenGL重学一遍. 工欲善其事,必先利其器,先把工具都搞好. [开发语言] 果断C+OpenGL,不解释. [开发环境] Min ...
- 沉浸式学 Git
沉浸式学 Git cover — contents — about 目录 设置 再谈设置 创建项目 检查状态 做更改 暂存更改 暂存与提交 提交更改 更改而非文件 历史 别名 获得旧版本 给版本打标签 ...
随机推荐
- js计算精确度丢失问题解决
(function () { var calc = { /* 函数,加法函数,用来得到精确的加法结果 说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显.这个函数返回较为精 ...
- MyBatis源码分析(七):动态代理(Mybatis核心机制)
一.动态代理 动态代理是一种比较高级的代理模式,它的典型应用就是Spring AOP. 在传统的动态代理模式中,客户端通过ProxySubject调用RealSubject类的request( )方法 ...
- Myod 选做
一.题目要求 1.复习c文件处理内容 2.编写myod.c 用myod XXX实现Linux下od -tc -tx XXX的功能 3.main与其他分开,制作静态库和动态库 4.编写Makefile ...
- longest-consecutive-sequence leetcode C++
Given an unsorted array of integers, find the length of the longest consecutive elements sequence. F ...
- Spring一套全通4—持久层整合
百知教育 - Spring系列课程 - 持久层整合 第一章.持久层整合 1.Spring框架为什么要与持久层技术进行整合 1. JavaEE开发需要持久层进行数据库的访问操作. 2. JDBC Hib ...
- Spring Cloud 生产环境性能优化
先思考几个问题: 什么是百万并发连接? 什么是吞吐量? 操作系统能否支持百万连接? 操作系统维持百万连接需要多少内存? 应用程序维持百万连接需要多少内存? 百万连接的吞吐量是否超过了网络限制? 百万的 ...
- Python基础入门(1)- Python环境搭建与基础语法
Python编程环境搭建 Python环境搭建 官网下载:https://www.python.org/ python --version PyCharm下载安装 安装 官网下载:https://ww ...
- 远程连接linux | Xshell和Xftp下载安装
为什么需要远程登录linux 公司开发时候, 具体的情况是这样的: Linux 一般作为服务器使用,而服务器一般放在机房,你不可能在机房操作你的 Linux 服务器.这时我们就需要远程登录到Linux ...
- Part 27 Remove # from URL AngularJS
There are 4 simple steps to remove # from URLs in Angular. Step 1 : Enable html5mode routing. To do ...
- [gym102798F]Skeleton Dynamization
考虑对于第$i$层$x$与第$i+1$层所对应的点$y$,点$p$在前$i$层中当且仅当$p$到$x$比$p$到$y$距离小 由此,考虑枚举第一层的一个点以及对应到第二层的边,通过bfs就可以确定第一 ...