Git是最广泛使用的分布式版本控制系统之一,被世界各地的开发者描述为第一大的VCS服务。它只能从终端运行,但有几个前端可供下载。
它是一个免费且开源的版本控制系统应用程序,可以以最大的效率和速度处理大型和小型项目。该程序可以很容易地描述为小,快速和分布式。
命令行选项
该程序带有一些命令,可以从任何人都可以轻松记住。所有的操作都是在本地执行的,并且已经被设计为在Linux内核上工作。
包含的命令包括添加,平分,分支,签出,克隆,提交,差异,提取,grep,初始化,日志,合并,mv,拉,push,rebase,reset,rm,显示,状态和标记。您可以通过从终端窗口运行git --help命令轻松了解每个命令的功能。
功能一目了然
使用Git时,用户将能够添加文件,签出分支或路径,克隆存储库,创建空的Git仓库,加入多个开发历史记录,显示工作树状态,记录更改,以及创建,列出或删除分支。此外,该应用程序允许用户查看提交和工作树之间的变化,匹配模式的打印行,查看提交日志,下载引用和对象,重命名或移动文件,符号链接和目录,更新远程引用和删除来自工作树的文件。
存在各种图形前端
即使它只是一个命令行软件,也可以使用各种图形用户界面(GUI),包括git-cola,SmartGit,GitEye,giggle和gitg。该项目超越了SCM(软件配置管理)实用程序,如CVS,Subversion,ClearCase和Perforce,具有便宜的本地分支,多个工作流程以及便捷的中转区域。
底线
总结一下,Git是一个免费的版本控制系统,具有闪电般的性能,易于学习,占用空间小。使用Git,您可以执行无摩擦的上下文切换,基于角色的代码行,基于特征的工作流程以及一次性实验。
p>在一定的条件下,一个帮助函数读取单个整行到strbuf错误地在EOF触发OOM错误,已经被修复。
除了“cc:#cruft”,“cc:a@dd.re.ss#cruft”之外,被教导为“git send-email”作为一种有效的方式告诉它,它还需要发送一个副本到拖车部分。
不像“git commit-tree”文件“,”git commit-tree -F file“没有逐字传递文件的内容,而是在最后完成了一个不完整的行,如果存在的话。后者已被更新以匹配前者的行为。
除了“cc:#cruft”,“cc:a@dd.re.ss#cruft”之外,被教导为“git send-email”作为一种有效的方式告诉它,它还需要发送一个副本到拖车部分。
不像“git commit-tree”文件“,”git commit-tree -F file“没有逐字传递文件的内容,而是在最后完成了一个不完整的行,如果存在的话。后者已被更新以匹配前者的行为。
2.15.0版本中的新内容:
在一定的条件下,一个帮助函数读取单个整行到strbuf错误地在EOF触发了OOM错误,已经被修复。除了“cc:#cruft”,“cc:a@dd.re.ss#cruft”之外,被教导为“git send-email”作为一种有效的方式告诉它,它还需要发送一个副本到拖车部分。
不像“git commit-tree”文件“,”git commit-tree -F file“没有逐字传递文件的内容,而是在最后完成了一个不完整的行,如果存在的话。后者已被更新以匹配前者的行为。
在版本2.14.1中新增功能:
- 此版本将“修复” SSH://..."来自Git v2.7.6的网址
- Git不知道索引中的内容应该是用“git add -N”添加的路径,所以“git grep --cached”不应该显示命中(或者显示缺少命中,以-L )在这样的路径中,但是这个逻辑不适用于“git grep”,即在工作树文件中搜索。但是我们错误地这样做了,而这个问题已经得到纠正。
- 当操作中止时,“git rebase -i --autostash”没有恢复自动装入的更改。
- 在没有任何消息体的情况下,“git commit --amend --allow-empty-message -S”可能错误地标识了提交对象头部的结尾。
- 更多标记更新来排版预期由最终用户以固定宽度字体输入的字符串。
- 很长一段时间,我们进行了一个代码内的评论,表示只有在Windows上使用fprintf / fput时,我们的彩色输出才能正常工作,而过去几年已经不再是这种情况了。
- 当设置为1时,“gc.autoPackLimit”应该不会在仅有一个包时触发重新打包,但是代码计数不佳并且不正确。
- “git am”的一个部分有一个古怪的助手功能,叫“他的”外面的东西,而不是叫我们有“我们的”,这不是性别中立的,也不符合系统的其他部分外面的东西通常被称为“他们的”,而不是“我们的”
- 测试框架学习了一个新的帮助器test_match_signal来检查退出代码是否被预期的信号所杀死。
- “git blame -M”错过了在文件中移动的单行。
- 修复最近引入的并行子模块操作中涉及的代码路径,这些代码路径放弃了读取太早,并且在试图在角落情况下写入时浪费CPU。
- “git grep -i”被教会在非ascii语言环境中正确折叠大小写。
- 无条件使用“mktemp”的测试发现,该命令不一定能在任何地方使用。
- “git blame file”允许检查“file”的未提交,未加入内容中的行的沿袭,但是当“file”没有出现在当前提交中时,拒绝它。当通过重命名现有文件而创建“文件”时(但没有提交更改),这个限制是不必要的。
- 当同一目录中有其他路径在“文件”之后排序时,“git add -N dir / file&& git write-tree”
- “git fetch http:// user:pass @ host / repo ...”清理了userinfo部分,但“git push”没有。
- 导致“git diff --ignore-space-at-eol”行为异常的老旧bug已经修复。
- “git notes merge”有一个代码来查看路径是否存在(如果存在则失败),然后打开写入路径(当不存在时)。将其替换为使用O_EXCL打开。
- “git pack-objects”和“git index-pack”大部分是在关于packfile中的对象偏移的时候用off_t来操作的,但是有一些地方使用“unsigned long”来保存这个值,到意外的截断。
- 最近更新到“git守护进程”尝试启用套接字级KEEPALIVE,但是当它通过inetd产生时,标准输入文件描述符可能不一定连接到套接字。从setsockopt()中抑制ENOTSOCK错误。
- 最近的FreeBSD停止在/ usr / bin / perl提供perl;在不太古老的FreeBSD发行版中,将默认的内置路径切换到/ usr / local / bin / perl。
- “git status”学会在冲突合并期间建议“merge --abort”,就像在已经发生冲突的rebase期间已经暗示“rebase - abort”一样。
- .c / .h来源在我们的.gitattributes文件中被标记为“git diff -W”,朋友会更好地工作。
- 现有的autoconf生成的测试需要与pthread库链接,没有检查pthread库中的所有函数;最近的FreeBSD在libc中有一些功能,但是没有其他的功能,我们错误地认为在libc的时候连接是不够的。
- 在Travis CI测试中允许http守护进程测试。
- parse_options_concat()API函数的用户需要预先分配额外的插槽,并在需要动态地决定支持的选项集时用OPT_END()填充它们,这使得代码容易出错且难以阅读。这已通过调整API来分配并返回“结构选项”数组的新副本
- 在“git rm”中使用strbuf来构建要删除的文件名有点不理想,已经修复。
- “git commit --help”说“--no-verify”只是跳过预先提交的钩子,并没有说它也跳过了commit-msg钩子。
- “git persistent-https”助手(在contrib /)中的构建过程已经更新,因此可以使用更新版本的Go来构建。
- 在“git diff $ treeA $ treeB”中使用了一个优化方法,在已知与正在比较的blob相同的情况下借用工作树中已经签出的副本,期望这样的open / mmap一个文件比从对象存储中读取文件要快,它涉及到膨胀和应用增量。然而,即使签出的副本需要经过convert-to-git转换(包括clean filter),这也会受到影响,这会使整个优化过程失败。当需要转换时,优化已被禁用。
- “git -c grep.patternType =扩展日志--basic-regexp”被误用是因为访问grep机器的内部API设计不好。
- 由于lstat(2)仿真返回的值缺少inum,所以Windows端口在t4130中失败了一些测试。
- 标签/标签中为“gitweb”输出提交的标签中的字符现在可以正确地转义以获得正确的HTML输出。
- 当被问到一个目录的mtime时,FreeBSD可以说谎,这使得未跟踪的缓存代码回退到慢速路径,这反过来又导致t7063的测试失败,因为它想要验证快速路径的行为。
- 静默编译器警告netmalloc(在compat /)库中。
- hashmap的API文档不清楚,如果hashmap_entry可以安全地丢弃没有任何其他考虑。声明这样做是安全的。
- 最近不再重写“git am”,开始将内部调用提交到提交机制中,意外退化,因为无论应用多少补丁需要多少秒,结果提交的结果提交者时间戳都一样。
- 在子目录中启动的“git difftool ...”无法解释相对于已修复的目录的路径。
使用提交对象的内容并找到其主题行的帮助函数不会忽略前导空白行,正如其他代码路径通常所做的那样。使其忽略前导空行来匹配。
2.9.1版本中新增功能:
- 当运行“git daemon”而未指定 - [init-]超时时,来自静默地脱机的客户端的连接可能会长时间滞留,浪费资源。套接字级KEEPALIVE已经启用,允许操作系统注意到这种失败的连接。
- `git log`系列中的命令在自定义格式字符串中使用%C(auto)。无条件地打开颜色,当输出没有连接到tty时忽略--no-color或--color = auto;这被纠正,使格式真正的行为“自动”
- “git rev-list --count”的行走长度受限于“-n”选项,并不适用于优化计数以查看位图索引。
- “git show -W”(扩展hunks以覆盖整个函数,由匹配“funcname”模式的行分隔)用于显示整个文件,当更改在文件末尾添加了一个完整的函数时已被修复。
- 文档集已更新,因此文字命令,配置变量和环境变量始终以固定宽度字体排版,在联机帮助页中以粗体显示。
- 现在记录在2.3天内添加的“git svn propset”子命令。
- 文件试图坚持拼写“GPG”;当提到具体的程序名时,使用“gpg”。
- 在查看表示分支创建事件(又名“未出生”)的条目时,“git reflog”停止,这使得看起来好像reflog被截断。
- git-prompt scriptlet(在contrib /中)对那些使用“set -u”(已经修复)的用户不友好。
- 使用alloca(3)在堆栈上放置大量数据的代码路径已经更新,以避免这样做。
- “git update-index --add --chmod = + x file”可能可以用作逃生舱口,但对于那些需要定期使用的人来说并不是一件友善的事情。可以使用“git add --chmod = + x file”。
- 为gnome-keyring(在contrib /)中构建改进
- “git status”用来表示“工作目录”,意思是“正在工作的目录树”。
- 有关FreeBSD shell不正常的评论已经通过版本号(9.x和之前的版本已经被破解,新的版本都可以)澄清。
- “git cherry-pick A”在未出生的分支上工作,但“git cherry-pick A..B”没有。
- “git add -i / -p”学会了遵守diff.compactionHeuristic实验旋钮,以便用户可以像“git diff”输出一样工作。
- “log --graph --format =”了解到“%> |(N)”指定了相对于终端左边缘的宽度,而不是相对于绘制祖先右侧文本的区域 - 章节。它现在也接受负N,这意味着列限制是相对于右边界。
- 持有引用的内存块的所有权规则在“git fetch”中被提取出来,是已经被清理干净的。
- 当bisection找到罪魁祸首时,“git bisect”会内部调用“git diff-tree”,但是这个调用并没有初始化数据结构以正确传递到diff-tree API。
- 我们使用GPG签名的各种数据格式(以及如何验证它们)已经记录在案。
- 修复v2.9中的意外回归,通过强制子模块也被浅层克隆,从而中断了“clone --depth”向子模块递归,而子模块上游的许多服务器实例没有准备好。 / LI>
- 修正“:$ {VAR = default}”习惯用法中不必要的浪费,以设置默认值,而不用双引号括起来。
- 一些特定于平台的代码具有非ANSI严格的C函数声明,它们没有任何参数,并且已经被更正。
- 用于显示本地时区偏移量的内部代码不准备处理2100年以后的时间戳,并给调用者一个伪造的偏移值。使用一个更温和的+0000来代替,让“git日志”在这种情况下,而不是中止。
- 在我们的测试套件中,readlink(1)的四个调用之一被重写了,这样测试可以在没有命令的系统上运行(其他的在valgrind测试框架和t9802中)。
- 在详细模式下运行时导致“git p4”的错误报告由于分支前缀而被省略的路径被错误地修复;该命令对于_inside _。 的路径说了“忽略前缀之外的文件”
- 顶层文档“git help git”仍然指向现在已经停用的Google代码库中的文档集。将其更新为指向https://git.github.io/htmldocs/git.html。
t / perf在GNU扩展中需要/ usr / bin / time;它的调用在达尔文更新为“gtime”。
2.9.0版中的新功能:
GIT 2.8.1(2016年4月5日)
2.8.1版中的新功能:
- “make rpmbuild”目标被破坏,因为它的输入git.spec.in没有被更新以匹配它描述的最近被重命名的文件。这已被修复。
在2.7.3版本中新增功能:
- 在写入我们的内部异步过程中处理错误已经变得更加健壮,这减少了我们测试中的片面性。
- “git show”HEAD:Foo [BAR] Baz'“没有将参数解释为rev,即树对象中由通配符指定的对象。
- 从子目录运行时,工作树功能中使用的“git rev-parse --git-common-dir”出现故障。
- 当命令在C中被重写时,交互式“git am -i”命令的“v(iew)”子命令在2.6.0时间框架中被中断。
- “git merge-tree”用来错误地处理“双方增加”与自己冲突的“创建一个具有双方共同部分的假祖先文件,并进行三方合并”的逻辑;这已经被更新为在系统的其他部分使用通常的“与一个空的blob作为假共同祖先文件的三路合并”方法。
- fill_textconv()API的内存所有权规则有点棘手,已经被证明更好一些。
- 当没有设置push.default配置时,文档没有明确说明“简单”模式现在是“git push”的默认模式。
- 辅助函数“git submodule”从v2.7.0开始使用,列出与给其子命令(例如“submodule add”)的pathspec参数匹配的模块。
- 在每个存储库配置文件中设置值时,git config section.var value失败,当它在任何存储库之外运行时,却没有正确说出原因。 使用包idx文件中存储的偏移量来读取包数据的代码已经被更仔细地检查了idx中数据的有效性。
传统上,尝试对工作树中的内容起作用的命令的测试在其文件名中用“worktree”命名,但是最近增加了“git worktree”子命令,其测试命名也相似,变得难以分辨。传统的测试已经重新命名为使用“工作树”来试图区分它们。
许多代码路径忘记检查来自git_config_set()的返回值;该函数被设置为die(),以确保在设置配置变量失败时不会继续。
当他们的输入包含任意的二进制数据时,最近版本的GNU grep是挑剔的,我们的一些测试使用这些数据。重写测试来避开这个问题。
在2.7.2版本中,
新增功能:
- 低级合并机制被教导使用CRLF行终止时,将冲突标记插入本身CRLF行终止的合并内容。
- “git worktree”有一个破解的代码,试图自动修复最终用户在不告诉Git的情况下将工作树移动到不同地方的可能不一致(原始存储库需要将后台指针保存到其工作区,但是“mv”由不熟悉这一事实的最终用户运行显然不会调整它们),这实际上在触发时使事情变得更糟。
- “git push --force-with-lease”已被教导报告是否需要强制(或快速转发)的推送。
- 在我们的测试脚本中使用的模拟的“是”命令已经被调整,不会花费太多的时间来产生不使用的不必要的输出,以帮助那些在Windows上测试的地方,直到它填满管道缓冲区缺少SIGPIPE。
- “git mergetool”的vimdiff后端已经被调整,按照顺序排列和编号缓冲区,以符合大多数从左到右阅读的人的期望,然后从上到下分配缓冲区1 2 3 4“精神上”到本地基地远程合并窗口根据该命令。
- “git clean”的文档已更正;它提到.git / modules / *通过提供两个“-f”来删除,这是从来没有的。
- 索引中关于“add -N”的路径目前尚未完全显示在索引中,但是一些命令的行为就好像已经是有害的。
- 还包含小文档和测试更新。
2.6.4版中的新功能:
- “configure”脚本没有正确地测试-lpthread,这使一些连接器变得困难。
- 添加支持通过socks proxy与http / https通话。
- Windows的可移植性修复程序,可能会使用非POSIX路径重写$ SHELL变量。
- 我们现在一直允许所有钩子忽略它们的标准输入,而不是让git抱怨SIGPIPE。
- 在contrib脚本中修复shell引用。
- 测试v2.6.1中的主题的可移植性修复。
- 允许在某些http配置变量中进行波浪扩展。
- 给出一个有用的特例“diff / show --word-diff-regex =。”作为文档中的示例。
- 修复filter-branch中的一个角落案例。
- 让git-p4在独立的头上工作。
- 在不带“--verbose”的情况下对“check-ignore”进行文档说明。
- 当用户在P4Submit.applyCommit()中取消提交时,就像清理工作树一样,如果“p4 submit”失败,清理混乱。
- 存储库中没有对应的.pack文件的剩余.idx文件会影响性能; “git gc”学会修剪它们。 为“dir-diff”特性准备临时目录的工作树端的代码忘记了不需要将符号链接复制(或者符号链接)到临时区域,因为代码已经是特殊情况并且被覆盖他们。此外,尝试计算符号链接目标的对象名称是错误的,甚至可能不存在或可能是目录。
- 没有办法从命令行中击败已配置的rebase.autostash变量,因为缺少“git rebase --no-autostash”。
- 允许“git interpret-trailers”在Git仓库之外运行。
- 为shell提示生成正确的“脏”标记,即使我们处于孤儿或未出生的分支上。
- 在“git status”中完成了一些字符串匹配的修正。
- 苹果公司SHA1_Update()的通用加密实现一次不超过4GB,现在我们有一个编译时的解决方法。
2.5.3版本中的新增功能:
- 当包含少量子目录的路径被涉及时,实验性的未追踪高速缓存功能是有问题的。
- 脚本化的“git am”的最新版本在“git am --skip”代码路径中有一个性能回归,它不再存在于“master”前面的内置版本中。修复在2.5.x维护轨道和更旧版本中出现的最后脚本版本的回归。
在2.4.6版本中新增功能:
- “git fetch --depth =”和“git clone --depth =”甚至对不支持该功能的上传数据包发出浅转移请求。
- “git fsck”用于忽略记录在reflog中的丢失或无效对象。
- tcsh完成写入bash scriptlet,但是对于noclobber设置的用户将会失败。
- 最近的Mac OS X更新打破逻辑检测机器在pre-auto-gc脚本示例中的交流电源。
- “git format-patch --ignore-if-upstream A..B”不喜欢将标签作为边界提交。
- 还包含typofixes,文档更新和普通代码
- 清理工作。
2.4.2版本中新增功能:
- “git rev-list --objects $ old --not --all”来查看从$ old到达的所有东西是否已经连接到现有的参考文件是非常低效的。
- v2.2中引入的“hash-object --literally”没有准备好采用一个非常长的对象类型名称。
- 当无事可做时,“git rebase - quiet”并不太安静。
- “log --decorate =”参数值的填写不正确。
- “filter-branch”已损坏的提交日志消息以一些不完整的行结束,其中一些“sed”实现将这种行结合在一起。通过避免使用“sed”来解决它。
- “git daemon”无法在NO_IPV6配置(源于2.4中的回退)下从源代码构建。
- “git stash pop / apply”忘了确保不仅干净的工作树,而且索引是干净的。后者是非常重要的,因为存储应用程序可能会发生冲突,并且该索引将用于解决冲突。
- 当调用几乎永恒的子程序和钩子时,我们已经预先设置了$ GIT_EXEC_PATH和路径“git”(通常是“/ usr / bin”)到$ PATH,但是后者试图支持的原始用例是半-bogus(即,将git安装到/ opt / foo / git并运行它,而不需要在$ PATH上有/ opt / foo),更重要的是,它变得越来越不重要,因为Git越来越成为主流(即用户愿意拥有它在他们的$ PATH)。停止将“git”安装到用户的$ PATH的路径,因为这将干扰人们依赖的命令搜索顺序(例如,他们可能不喜欢与/ usr / bin中的Git无关的程序版本,并且希望通过在/ usr / local / bin中使用不同的目录来覆盖它们,并且在$ PATH的前面有后面的目录)。
- 还包含typofixes,文档更新和简单的代码清理。
评论没有发现