重学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 目录 设置 再谈设置 创建项目 检查状态 做更改 暂存更改 暂存与提交 提交更改 更改而非文件 历史 别名 获得旧版本 给版本打标签 ...
随机推荐
- Python 模块feedparser安装使用
RSS(简易信息聚合) 简易信息聚合(也叫聚合内容)是一种RSS基于XML标准,在互联网上被广泛采用的内容包装和投递协议.RSS(Really Simple Syndication)是一种描述和同步网 ...
- hdu 2830 Matrix Swapping II(额,,排序?)
题意: N*M的矩阵,每个格中不是0就是1. 可以任意交换某两列.最后得到一个新矩阵. 问可以得到的最大的子矩形面积是多少(这个子矩形必须全是1). 思路: 先统计,a[i][j]记录从第i行第j列格 ...
- 第07课 OpenGL 光照和键盘(2)
下一段代码绘制贴图立方体.我只对新增的代码进行注解.如果您对没有注解的代码有疑问,回头看看第六课. int DrawGLScene(GLvoid) // 从这里开始进行所有的绘制 { glClear( ...
- Jenkins MultiJob
前提:项目有十几个服务每次发版/更新服务需要一个个去编译 目的:希望能够建立一个任务一次构建可以批量编译很多服务,并且需要输入一个参数指定编译的分支 需要插件: MultiJob 安装插件 1.在Je ...
- 【Go语言学习笔记】hello world
书接上回,上回说到了为什么要学习Go语言,今天我们来实际写一下,感受一下Go语言的精美之处. 环境搭建 安装和设置 Windows: Go安装包下载网址:https://golang.org/dl/ ...
- 端口扫描工具 nmap 使用手册
0x00 主机发现 -sL 仅仅是显示,扫描的IP数目,不会进行任何扫描 -sn ping扫描,即主机发现 -Pn 不检测主机存活 -PS/PA/PU/PY[portlist] TCP SYN Pin ...
- dotNET开发之MVC中Controller返回值类型ActionResult方法总结
1.返回ViewResult视图结果,将视图呈现给网页 2. 返回PartialViewResult部分视图结果,主要用于返回部分视图内容 3. 返回ContentResult用户定义的内容类型 4. ...
- 『学了就忘』Linux软件包管理 — 48、给源码包打补丁
目录 1.补丁的生成 2.补丁的打入 在以前的软件源码包,需要打补丁的时候比较多.现在的源码包很少进行打补丁了,因为根据需求安装不同的版本即可,比较商业化了.(也就是知道如何给源码包打补丁就可以了,了 ...
- ErrorProvider与CheckedListBox
http://www.cnblogs.com/myshell/archive/2010/09/24/1834184.html 最近因为做WinForm的项目,遇到这个问题,当时以为CheckedLis ...
- [luogu7736]路径交点
对于两条路径,注意到每一个交点都会改变两者的上下关系,因此两条路径交点的奇偶性,仅取决于两者的起点和终点是否改变了上下关系(改变即为奇数) 类似地,对于整个路径方案,令$p_{i}$为以第一层的$i$ ...