啊哈!学习Git的时刻

Git是一个快速、灵活但具有挑战性的分布式版本控制系统。跳入前:

连同辅导的备忘单,以下是帮助git点击的见解。

有一个中转区!

Git有一个集结区。Git有一个临时区域!!!

尤扎,这有没有把我搞糊涂了。有一个repo(“对象数据库”)和一个临时区域(称为“索引”)。签入有两个步骤:

  • git添加foo.txt
    • 将foo.txt添加到索引中。它还没有签入!
  • git commit-m“消息”
    • 将暂存文件放入回购中;他们现在被跟踪了
    • 你可以“git添加--更新“暂存所有已跟踪、修改的文件

为什么选择舞台?Git很灵活:如果a、b和c被更改,您可以单独或一起提交它们。

但现在有两种结局:

  • git签出foo.txt
    • 撤消本地更改(如svn revert)
  • git重置HEAD foo.txt
    • 从临时区域中删除(本地副本仍被修改)。

添加并提交、添加并提交——Git有节奏。

分支是“另存为…”

分支类似于目录中的“另存为…”。最棒的是:

  • 轻松将更改与原始更改合并(更改已跟踪且从未应用过两次)
  • 没有浪费空间(普通文件只存储一次)

为什么要分支?考虑一下常规文件的“另存为…”实用程序:您可以在保持原始文件安全的同时修改多种可能性。Git为目录启用了这一功能,并具有合并功能。(实际上,svn就像一个共享驱动器,您只能恢复到一个备份)。

想象一下虚拟目录

我将分支视为.git文件夹中的“虚拟目录”。在物理目录(c:\project或~/project)中,可以通过签出遍历虚拟目录。

  • 切换到主分支
    • 切换到主分支(“cd master”)
  • git分支开发
    • 从现有分支创建新分支(“cp*dev”)
    • 您仍然需要使用“git checkout dev”来“cd”
  • git合并开发
    • (在master中时)从dev中拉入更改(“cp-dev/*.”)
  • git分支
    • 列出所有分支(“ls”)

我的内部对话是“更改到开发目录(签出)…进行更改…保存更改(添加/提交)…更改到主目录…从开发复制更改(合并)”。

物理目录是草稿行。虚拟目录受git命令的影响:

  • rm文件夹.txt
    • 从沙盒中删除foo.txt(如果再次签出分支,则会恢复)
  • git rm foo.txt文件
    • 从当前虚拟目录中删除foo.txt
    • 明白了:你需要做出改变!

了解当前分支机构

就像查看当前目录一样,在提示符中输入当前分支!

git分支高亮显示

在my.bash_profile中:

解析git_branch(){git分支2>/dev/null|sed-e'/^[^*]/d'-e's/*(.*)/(1)/'}导出PS1=“[33[00m]u@h[33[01;34m]W[33[31m]$(parse_git_branch)[33[0m]$[33[000m]”

可视化分支结构

Git将分支机构留给您。Nvie.com有一个大分行战略:

  • 有一条主线。心理上它在最右边。
  • 创建分支(master->dev)和子分支(dev->featureX)。离主人越远,越疯狂。
  • 仅与邻居合并(master->dev->feature X或featureX->dev->master)

通过选择前面的分支布局来保持理智。我有一个跟踪svn项目的master,还有我自己代码的dev。总的来说,master是干净的,所以我可以随时进行分支以进行一次性修复。

了解本地与远程

Git具有本地和远程命令;看到这两件事,我很困惑(“你什么时候结账,什么时候拉?”)。在本地工作,根据需要远程同步。

本地数据

  • 初始化
    • 创建本地回购
    • 使用git添加/提交/分支在本地工作

远程数据

  • git远程添加名称repo路径
    • 从现有回购跟踪远程回购(通常为“来源”)
    • 远程分支是“origin/master”、“origin/dev”等。
  • 查看所有的分支
    • 列出所有分支(远程和本地)
  • git克隆到repo的路径
    • 创建一个从远程复制的新本地git回购
    • 本地主机跟踪远程主机
  • 吉特拉力
    • 合并来自跟踪的远程分支的更改(如果在dev中,则从源站/dev拉入)
  • git推送
    • 将更改发送到跟踪的远程分支(如果在dev中,则推送到origin/dev)

为什么选择本地和远程?Subversion具有集中签入功能,因此您可以避免提交未完成的工作。使用git,本地提交非常频繁,只有在准备就绪时才进行推送。

GUID很好

Git通过散列处理信息(GUID(GUID))它的内容。如果两个分支相同,则它们具有相同的GUID(反之亦然)。

为什么这么酷?我们可以独立创建分支,合并它们,并有一个通用的GUID。无需中央编号。通常,我们只比较前几个数字:“你在a93上吗?”。

提示和技巧

对于您的.gitconfig:

[别名]ci=提交st=状态co=校验oneline=log--pretty=onelinebr=分支机构la=log--pretty=“格式:%ad%h(%an):%s”--日期=short

有一些用于git的GUI工具,但我更喜欢通过命令行学习。Git是一个固执己见的软件(我喜欢),类比帮助我理解它的世界观。

本系列其他帖子

  1. 版本控制可视化指南
  2. 分布式版本控制简介(图解)
  3. 啊哈!学习Git的时刻

加入45万月刊读者

喜欢这篇文章吗?还有很多东西可以帮助你建立对数学的持久、直观的理解。加入奖金内容和最新更新的时事通讯。