好的,在看到PJ Hyett的这篇文章后,我决定跳到最后,使用Git。

所以我需要的是Git初学者实用指南。“初学者”被定义为知道如何处理他们的编译器,在某种程度上理解Makefile是什么,并且在没有很好地理解它的情况下接触了源代码控制。

“实用”被定义为这个人不想详细了解Git在后台做什么,甚至不关心(或知道)它是分布式的。你的答案可能暗示了这些可能性,但试着瞄准那些希望在备份和安全的“服务器”上保留“主”存储库的初学者,并将他们的本地存储库仅视为“客户端”资源。

So:

安装/设置

如何安装Git如何设置Git?尝试涵盖Linux、Windows、Mac,思考“客户端/服务器”思维。在Windows上使用Msysgit安装GIT服务器如何创建新项目/存储库?如何将其配置为忽略不属于代码库的文件(.obj、.user等)?

使用代码

如何获取最新代码?如何检查代码?如何提交更改?如何查看未提交的内容或当前代码库的状态?如何销毁不需要的提交?如何比较文件的两个版本,或当前文件和以前的版本?如何查看文件修订的历史记录?如何处理二进制文件(例如,visio文档或编译器环境)?如何合并“同时”更改的文件?如何撤消(恢复或重置)提交?

标记、分支、发布、基线

如何“标记”、“标记”或“发布”特定文件集的特定修订集,以便以后随时可以提取该修订集?你如何获得特定的“释放”?你是怎么分支的?如何合并分支?如何解决冲突并完成合并?如何将一个分支的部分合并到另一个分支中?什么是重新定基?如何跟踪远程分支?如何在远程存储库上创建分支?如何删除远程存储库上的分支?Git工作流示例

另外

描述并链接到一个好的GUI、IDE插件等,使Git成为一个非命令行资源,但请列出它的局限性和优点。msysgit-跨平台,包含在Git中gitk-跨平台历史查看器,包含在Git中gitnub-Mac OS Xgitx-Mac OS X历史查看器smartgit-跨平台、商业、测试版用于Linux的tig控制台GUIqgit-用于Windows、Linux的GUIGitExtensions-Windows包,包括友好的GUI初学者还应该知道其他常见任务吗?Git Status告诉您刚才做了什么,您有什么分支,以及其他有用的信息如何将subversion存储库设置为源代码控制源代码,从而有效地工作?

其他Git初学者参考

Git指南Git手册Git魔法数字广播GitHub指南Git教程Scott Chacon的Progit-书Git-SVN速成课程Git自下而上Git就绪gitref.org网站Git可视化备忘单

深入Git

从概念上理解Git计算机科学家Git(和另一个版本)

我会不时地检查条目,并“整理”它们,使它们具有一致的外观/感觉,并且很容易扫描列表-请随意遵循简单的“标题-简要说明-说明列表-获取和额外信息”模板。我还将链接到上面项目符号列表中的条目,以便以后很容易找到它们。


当前回答

gitstatus是你的朋友,经常使用它。适合回答以下问题:

那个命令刚刚做了什么?我在哪家分行?我要做出什么样的改变,我忘了什么吗?我上一次参与这个项目时(几天、几周或几个月前)是否正在做什么?

与svn状态不同,即使在大型项目上,git状态也几乎立即运行。在学习git时,我经常发现它让我感到安心,因为它能让我经常使用它,以确保我对发生的事情的心理模型是准确的。现在,我主要是用它来提醒自己,自从上次承诺以来,我发生了什么变化。

显然,如果您的.gitignore配置得当,它会更有用。

其他回答

如何比较文件的两个版本,或当前文件和以前的版本?

比较命令是gitdiff。

要比较文件的两个版本:

$ git diff <commit1> <commit2> <file_name>

这是承诺1与承诺2的区别;如果你改变了顺序,那么文件就会反过来不同,这可能不是你所期望的。。。

要将当前暂存文件与存储库进行比较,请执行以下操作:

$ git diff --staged <file_name>

要将当前未分页文件与存储库进行比较,请执行以下操作:

$ git diff <file_name>

gitstatus是你的朋友,经常使用它。适合回答以下问题:

那个命令刚刚做了什么?我在哪家分行?我要做出什么样的改变,我忘了什么吗?我上一次参与这个项目时(几天、几周或几个月前)是否正在做什么?

与svn状态不同,即使在大型项目上,git状态也几乎立即运行。在学习git时,我经常发现它让我感到安心,因为它能让我经常使用它,以确保我对发生的事情的心理模型是准确的。现在,我主要是用它来提醒自己,自从上次承诺以来,我发生了什么变化。

显然,如果您的.gitignore配置得当,它会更有用。

还有一项我认为应该在这个列表中,可能对初学者非常有用:

不要惊慌

如果我做了一些承诺,然后做了一些可怕的事情,比如重新启动,而现在一些东西甚至所有东西都好像丢失了呢?(Rebase似乎是第一次吸引大多数人的方法,所以我专注于此。虽然git Rebase--abort有很大帮助,但有时你会发现,在交互式Rebase过程中,你把编辑搞砸了,比如,让Rebase完成,现在你想把你的旧东西拿回来。还有一些事情,比如过滤器分支…)

git的一个关键原则是它永远不会删除您提交的任何内容。(“什么,从来没有?”“不,从来没有!”。可能需要仔细挖掘才能找到以前的工作,但如果你早些时候成功地提交了一些git,那么,例如,即使是你的一系列因悲剧性的重新启动错误而被破坏的提交仍然存在,通常至少一个月(从技术上讲,直到“重新启动”到期)。

重要的是要记住,每个分支名称都标记或指向“提交ID”。这些是像7cc5272这样有趣的数字。您所做的许多事情,如向分支添加新的提交,都会使分支名称指向一个新的、不同的commit-ID。每个提交ID都有一个指向以前提交ID的链接,这实际上构成了一个充满提交的“分支”。

rebase条目谈到“重写历史”,像gitfilter branch这样的命令也会“重写历史,”但它们不是通过销毁以前的历史,而是通过添加新的历史来实现。一旦新的历史记录就位,git将“四处移动标签”,使其看起来历史已经改变。如果你在修复讨厌的bug分支上,并执行git重基并设法破坏东西,那么修复讨厌的错误标签现在指的是残骸,但原始版本仍然存在。特别是Rebase创建了一个临时(非移动,非分支)标签,拼写为ORIG_HEAD,可以让您找到它们。filter branch命令还保存所有原始名称。在某些情况下,可能没有明显的名称,但始终可以找到提交。如果有必要的话,找一个“git guru”,并解释你做了什么导致了残骸。

(命令git reflog show也可以帮助查找提交ID。)

如果您发现了您认为的部分或全部以前的工作,请尝试:

git log <commit-ID>   # ORIG_HEAD after a bad rebase, for instance
git show <commit-ID>  # or some long SHA1 value you can still see in a window

如果它看起来正确或有用,请为其命名:

git branch recover-my-stuff ORIG_HEAD

一切又回来了!事实上,现在你的糟糕的重新基础和你的原始工作都在你的git repo中“永远”(或者至少,直到你删除分支名称并让几个月过去,然后它们被垃圾收集)。您可以为任意多个恢复的提交添加任意多个名称。(分支名称实际上是免费的,除了弄乱了git分支输出之外,当然,它们还可以防止提交被垃圾收集。如果您喜欢,也可以在特定的提交ID上添加标记。)

如何设置共享团队存储库?

这里描述了如何建立一个普通的存储库——但是如何建立一种团队存储库,每个人都可以从中提取和推送到其中?

使用共享NFS文件系统

例如,假设您的团队已经拥有可以使用的共享组成员资格。

mkdir /your/share/folder/project.git
cd /your/share/folder/project.git
newgrp yourteamgroup # if necessary
git init --bare --shared

要开始使用此存储库,最简单的方法是从您已经使用过的本地存储库开始:

cd your/local/workspace/project
git remote add origin /your/share/folder/project.git
git push origin master

其他人现在可以克隆并开始工作:

cd your/local/workspace
git clone /your/share/folder/project.git

使用SSH

在目标服务器上设置用户帐户。无论您使用没有密码的帐户、有密码的帐户还是使用authorized_keys,都取决于您所需的安全级别。有关更多信息,请参阅通过SSH配置Git。

如果所有开发人员都使用相同的帐户访问此共享存储库,则不需要使用上述--shared选项。

以与上述相同的方式启动存储库后,您可以执行如下初始推送:

cd your/local/workspace/project
git remote add origin user@server:/path/to/project.git
git push origin master

看到与上面的相似之处了吗?另外,如果帐户有密码,唯一可能发生的事情就是SSH请求密码。如果您在没有密码的帐户上得到此提示,则SSH服务器可能已禁用PermitEmptyPassword。

克隆现在看起来像这样:

cd your/local/workspace
git clone user@server:/path/to/project.git

好吧,尽管你要求我们不要“简单地”链接到其他资源,但当已经存在一个社区生长(和不断增长)的非常好的资源时,这是非常愚蠢的:Git社区书。说真的,一个问题中的20多个问题绝对不会简明扼要。Git社区书有HTML和PDF两种格式,可以用清晰、格式良好、经过同行评审的答案回答您的许多问题,并且格式可以让您直接解决手头的问题。

唉,如果我的帖子真的让你不安,我会删除它。说吧。