git 那些事儿 —— 基于 Learn Git Branching
发布时间:2022-08-09 10:38:18 所属栏目:Linux 来源:互联网
导读:前言 推荐一个 git 图形化教学网站:Learn Git Branching,这个网站有一个沙盒可以直接在上面模拟 git 的各种操作,操作效果使用图形的方式展示,非常直观。本文可以看作是它的文字版,将其中各级关卡所要学习的概念和命令提取出来,方便查阅。文中的一些示
前言 推荐一个 git 图形化教学网站:Learn Git Branching,这个网站有一个沙盒可以直接在上面模拟 git 的各种操作,操作效果使用图形的方式展示,非常直观。本文可以看作是它的文字版,将其中各级关卡所要学习的概念和命令提取出来,方便查阅。文中的一些示例,如果没有显而易见的输出,就需要读者在沙盒中亲自输入来查看效果。 回到顶部 git 日常操作 git 命令虽多,但也遵循 80/20 法则,经常用到的也就下面几个: git clone project-name git checkout branch-name git branch git pull origin master git add file-name git rm file-name git mv file-name git status git log git commit -m comment-string git push origin master git merge branch-name 会了这些命令,一些日常的操作就基本没问题了,那 git 还有什么可学的呢?有的,提交错了需要回滚怎么操作?多个 commit 如何合并成一条提交?如何定位分支上的一个提交(以便对比、回退、拉取新分支)?在一个分支上处理多个任务如何切换?如何调整一条分支上多个 commit 的顺序?如何将一台机器上的修改打成补丁在另一台机器上提交?本地删除一个分支如何同步到远程?……下面随着教程我们来一探究竟。 回到顶部 本地分支操作 分支是 git 最重要的概念之一,用好分支是用好 git 的基础。git 的分支非常轻量级,不会造成存储或内存上的开销,所以应该 “早建分支、多用分支”!只要记住使用分支其实就相当于在说:“我想基于这个提交以及它所有的父提交进行新的工作” 就好啦。 新建并切换分支 git branch bugFix git checkout bugFix <==> git checkout -b bugFix 以上两个等价,都是在当前提交上创建分支并切换到新分支上准备工作。 合并分支 - merge git checkout -b bugFix git commit -m 'a' git checkout master git commit -m 'b' git merge bugFix 在 git 中合并两个分支时会产生一个特殊的提交记录,它有两个父节点。翻译成自然语言相当于:“我要把这两个父节点本身及它们所有的祖先都包含进来。” git checkout bugFix git merge master 因为 master 继承自 bugFix,Git 什么都不用做,只是简单地把 bugFix 移动到 master 所指向的那个提交记录。 合并分支 - rebase git checkout -b bugFix git commit -m 'a' git checkout master git commit -m 'b' git checkout bugFix git rebase master <===> git rebase master bugFix rebase 实际上就是取出一系列的提交记录,“复制”它们,然后在另外一个地方逐个的放下去,相比 merge 的优势是可以创造更线性的提交历史,代码库的提交历史将会变得异常清晰。rebase 第二个参数是要移动的源分支,如果不提供默认为 HEAD。如果当前分支不在源分支上,使用第二个参数可以节省一次 checkout 动作。 git checkout master git rebase bugFix <===> git rebase bugFix master 同理,由于 bugFix 继承自 master,所以 git 只是简单的把 master 分支的引用向前移动了一下而已 在提交树上移动 HEAD 是一个对当前检出记录的符号引用 —— 也就是指向你正在其基础上进行工作的提交记录,大多数修改提交树的 git 命令都是从改变 HEAD 的指向开始的。 分离的 HEAD HEAD 通常情况下是指向分支名的 (如 bugFix),分离的 HEAD 就是让其指向了某个具体的提交记录而不是分支名。 git commit -m 'c' git checkout 'c' 相对引用 git 中 commit 以 hash 值作为名字,基于 sha-1 的哈希值长达 40 位,虽然 git 对哈希的处理很智能 —— 你只需要提供能够唯一标识提交记录的前几个字符即可,但是使用哈希值仍然很不直观。 通用 git 中的相对引用可以从 HEAD 或分支名等易于记忆的地方开始计算,主要有两种形式: ^ - 指定位置的上一个提交 ~N - 指定位置的前 N 个提交,未提供 N 时等价于 ^ 示例: git checkout master^ git checkout bugFix^^ git checkout HEAD^ git checkout HEAD^ git checkout HEAD^ <===> git checkout HEAD~3 选择父提交 操作符 ^ 与 ~ 符一样,后面也可以跟一个数字。但不是用来指定向上返回几代,而是指定合并提交记录的某个父提交。一个合并提交有两个父提交,所以遇到这样的节点时该选择哪条路径就不是很清晰了。git 默认选择合并提交的“第一个”父提交,在操作符 ^ 后跟一个数字可以改变这一默认行为。 (编辑:阜新站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |