Git代码版本管理入门
文章分为两部分,其一是通过在线交互式学习网站Learn Git Branching的学习笔记,内容较晦涩。虽然可视化学习更直观,但学过一遍后发现可能有些速成且脱离开发环境。其二是通过视频学习时的简单记录,内容简单,更贴近实际开发环境。
从Learn Git Branching中学习Git
Learn Git Branching是一个学习Git的网站,它有交互式操作和直观的分支图,能帮助Git 新手快速掌握Git
网络上有不少Learn Git Brancing的教程,这篇文章只是我在使用这个网站时随手写的一点内容,非常凌乱。
若有错误,还请各位指正
使用 git commit 来提交新节点,新节点将出现在目前选中的分支指向的节点下
使用 git branch 创建新分支,分支能指向一个节点,仅此而已。“早建分支!多用分支!”。新分支将指向目前分支指向的节点。
使用 git checkout 来切换分支,目前选中的分支将是你选中的分支
使用 git switch 也可选择新分支,它是一个新命令
如果像创建一个新分支同时切换到新创建的分支,可以使用 git checkout -b 来实现
当想合并节点时,git 会创建一个新特殊的提交记录,它有两个 parent 节点。更直观的来说,就是“我要把这两个 parent 节点本身及它们所有的祖先都包含进来。”。
简单来说,就是选中 main 分支进行操作,使用 git merge bugFix 后,main 分支将指向新节点,新节点的直接 parent 节点时 bugFix 分支指向的节点 和 main 分支在操作前指向的节点。
这里不难看出,上一段的 bugFix 分支和 main 分支指向的节点是同一深度的节点。如果在上段操作后,使用 git checkout bugFix,git merge main,这时 bugFix 分支将与 main 分支指向相同的新的节点,因为这个新节点是继承自它的两个父节点。
现在所有提交记录的颜色都一样了,这表明每一个分支都包含了代码库的所有修改!大功告成!
git rebase 也能合并分支,使用 git rebase 来将目前操作的分支指向的节点作为一个类似于新生成的节点在目标分支指向的节点的上方。然后再更新分支,使用 git rebase,选中目标分支,这时 git 就简单的将目前的分支向前移动了一下,表示完成了更新。
下面是分离 HEAD,这部分操作允许轻松在树上移动分支。HEAD 总是指向当前分支上最近一次提交记录。HEAD 通常情况下是指向分支名的。
在这个网页演示中,现在暂时不支持使用命令查看 HEAD 指向。如果想看 HEAD 指向,可以通过 cat .git/HEAD 查看, 如果 HEAD 指向的是一个引用,还可以用 git symbolic-ref HEAD 查看它的指向。
相对引用非常给力,这里我介绍两个简单的用法:
使用 ^ 向上移动 1 个提交记录
使用 ~<num> 向上移动多个提交记录,如 ~3
其中,^前面的操作符可以是节点,可以是分支,也可以是 HEAD 本身,HEAD 指向的是当前操作的分支。
~这个相对引用相当于使用了多次^,例如 git checkout HEAD~4 就是将 HEAD 向下移动了 4 次(越向下,越靠近根节点)。这里可以看作是目前的操作分支的索引是 0(类似于数组索引),移动了几次就是直接将分支指向那个数字的索引。
git branch -f main HEAD~3 就是将 main 强制移动到 HEAD 向下三次。
~(用 branch 移动非 HEAD 分支,用 checkout 移动 HEAD 分支,好怪哦)~
~(没有很怪,HEAD 分支指向分支,HEAD 分支只有一个,它指向的分支是当前选中的操作分支,可是将 HEAD 分离有什么用处呢?)~
git reset 和 git revert 用来撤销变更
git reset HEAD~1。这个操作将移动当前选中的分支,并回退它。在 reset 后, C2 所做的变更还在,但是处于未加入暂存区状态。
虽然在你的本地分支中使用 git reset 很方便,但是这种“改写历史”的方法对大家一起使用的远程分支是无效的哦!
revert 之后就可以把你的更改推送到远程仓库与别人分享啦。
git revert 将生成新的节点,新节点将保存更改,也就相当于回退了节点
git reset 和 git revert 都将移动 HEAD 指向的分支,其后的参数是要移动的位置
git cherry-pick 提交号。使用 cherry-pick 用来将一些提交复制到 HEAD 上面(远离根节点的方向)。
git cherry-pick 接受参数,将其移动到 HEAD 指向的分支之下。
交互式 git rebase -i 接受参数,这个参数被当作 parent 节点,可以使用窗口调整选中分支之下的节点,选择忽略或者调整顺序,复制到 parent 节点下。同时,移动 HEAD 指向的分支移动到新复制的最上方的节点。
你随时都可以用 undo、reset 修正错误。
视频学习的小笔记
配置名字
git config --global user.name “Hugo”
配置邮箱
git config --global user.email “Hugo@itcast.cn”
没有引号内的那一项就是显示内容
使用 git init 生成 .git 目录,初始化 git 版本库
git 的工作区可抽象为 3 个,工作区,暂存区,版本库
将工作区存入暂存区
git add .
查看目前暂存区的文件
git ls-files
将暂存区文件提交到版本库
git commit -m
git 文件状态 分为未跟踪和已跟踪
使用 git commit 不会清空暂存区
查看文件状态
git status -s
第一列字母是文件在暂存区的状态,第二列字母是文件在工作区的状态
将暂存区的文件回退到工作区,工作区被覆盖
git restore
从暂存区移除文件
git rm --cached [target name]
查看 版本库内容(提交记录)
git log --oneline
git 回退版本,从版本库中回退文件到工作区和暂存区
保留工作区和暂存区内容,把版本库中的文件尽量退到工作区和暂存区
git reset --soft [version code]
回退文件,工作区和暂存区被覆盖
git reset --hard [version code]
git reset 的默认操作,覆盖暂存区,保留工作区
git reset --mixed [version code]
(–hard 比较常用)
查看版本的完整日志
git reflog --oneline
暂存区的代码会被 git add . 选中工作区的代码覆盖
git commit 是将暂存区的文件提交到版本库,与工作区无关
忽略文件
创建.gitignore 文件,在文件中写不想被跟踪的文件名或目录名,可以使用通配符,即使文件在几层目录下,也能直接忽略文件
分支
创建分支
git branch [branch name]
如果没有分支名则显示所有分支
选择想要操作的分支(即移动 head 指针)
git checkout [branch name]
分支和其所在路内容相关,新分支创建后提交,再切回老分支,新分支内容对老分支不可见
分支合并
git checkout [branch name]到主分支
git merge [branch name]次分支
git branch -d [branch name]删除分支
(切换分支前先 commit, 差点寄, git 很智能,会阻止不安全的分支切换)
//VERY USEFUL
如果原先分支有新内容提交,次分支直接合并,git 会自动提交一次,方便