Git 简史
Linux 内核项目组当时使用分布式版本控制系统 BitKeeper 来管理和维护代码。但是,后来开发 BitKeeper 的商业公司同 Linux 内核开源社区的合作关系结束,他们收回了 Linux 内核社区免费使用 BitKeeper 的权力。 Linux 开源社区(特别是 Linux 的缔造者 Linus Torvalds)基于使用 BitKeeper 时的经验教训,开发出自己的版本系统,而且对新的版本控制系统做了很多改进。
Git 与其他版本管理系统的主要区别
Git 在保存和对待各种信息的时候与其它版本控制系统有很大差异,尽管操作起来的命令形式非常相近,理解这些差异将有助于防止你使用中的困惑。下面我们主要说一个关于 Git 与其他版本管理系统的主要差别:对待数据的方式。Git 采用的是直接记录快照的方式,而非差异比较。我后面会详细介绍这两种方式的差别。大部分版本控制系统(CVS、Subversion、Perforce、Bazaar 等等)都是以文件变更列表的方式存储信息,这类系统将它们保存的信息看作是一组基本文件和每个文件随时间逐步累积的差异。
Git的核心思想-版本控制
什么是版本控制
版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。 除了项目源代码,你可以对任何类型的文件进行版本控制。
为什么要版本控制
有了它你就可以将某个文件回溯到之前的状态,甚至将整个项目都回退到过去某个时间点的状态,你可以比较文件的变化细节,查出最后是谁修改了哪个地方,从而找出导致怪异问题出现的原因,又是谁在何时报告了某个功能缺陷等等。
Git的小技巧
如果操作不当,像重命名目录结构这样简单而微不足道的任务可能会成为您脖子上的一大痛。Git 的 OSX 发行版中有一个众所周知的错误,当用户尝试使用 Mac 的默认磁盘格式重命名文件或目录时,会导致问题。
一种小解决方案是为文件(或目录)使用中间名称,然后将其重命名为大小写更改的格式。但它并非万无一失,往往会导致版本不匹配。另一种(可能更好)摆脱这种混乱的方法是使用磁盘工具,创建一个新卷,然后将您的 Git 存储库移动到此卷。希望您不会再面对那个讨厌的 Git 错误。
从当前提交中删除文件或目录非常简单。只需使用 rm 命令:
git rm
或(仅从 Git 存储库中删除它,而不是从本地文件系统中删除它):
git rm --cached
其次
git commit -m "remove filename"
但是为了从历史记录中完全删除该文件,您需要执行以下命令:
git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch file_path" HEAD
这里要记住的一点是,完成整个过程可能需要一段时间(以小时为单位)。所以,要有耐心。
3.回滚提交
回滚到项目的早期版本的能力可以说是使用像 Git 这样的版本控制系统最有用的部分。同样有两种方法可以做到这一点。首先,使用提交哈希,其次,直接使用 reset 命令。
git log --oneline
它应该生成一个由哈希和相应的提交消息组成的 2 元组列表。您可以使用以下命令测试任何早期版本:
git checkout
恢复上次提交同样简单:
git revert
2.现在是第二个选项。假设你想从上到下重组一些早期版本,所以 git 修改不会有太大帮助。使用重置命令将当前 HEAD 倒退到首选版本:
git reset --soft HEAD~1
请注意 –soft 选项。它告诉未完成的修订应该单独保留。如果您也想删除未完成的修订,请改用 –hard 标志。另外,请注意 HEAD1 选项。它告诉您有兴趣恢复到当前提交的直接祖先版本。您可以使用“”和“^”字符有效地表示版本图中的任何节点。
提交图
提交图提供了整个活动历史记录的直观且易于解释的视图。许多不同的工具和软件都提供此功能(例如,GitHub 和 GitLab 默认带有此功能)。
您可以使用 git log –graph 命令将提交图与提交消息一起打印。您可能还对 –pretty、–缩写提交和 –date 标志感兴趣,以使其更好。
您的 git 配置文件
首次尝试提交存储库时,系统通常会提示你填写用户名和邮件 ID。好吧,这些都保存在你的~/.gitconfig文件中。但是等等,还有更多。此文件用于存储所有存储库的全局配置,例如用户名、别名、某些命令的默认行为等。
仓库的配置文件
注意到前面的部分中如何说明它是您的配置文件而不是您的存储库的吗?是的,这正是区别所在。特定于存储库的配置文件(可在 .git 目录中找到)列出了特定于父存储库的所有本地设置。这些设置将覆盖 ~/.gitconfig 文件中指定的全局设置。
有什么变化?
想知道过去几天发生了什么变化吗?使用更改命令的内容来获取项目已看到的编辑和添加的要点。执行以下命令以查看过去 4 周内对文件“gitk”所做的更改。
git whatchanged --since="4 weeks ago" -- gitk
8.好别名
通过使用别名,您可以大大减少体力劳动。长期以来,别名一直是 bash 用户的流行工具。例如,以下命令将为命令 rev-parse –show-toplevel 创建一个速记别名 rev。
git config --global alias.rev "rev-parse --show-toplevel"
并找出事情变得疯狂的第一个提交。