好的,在看到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(和另一个版本)

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


当前回答

如何将其配置为忽略文件:

让git忽略您不希望跟踪的文件的功能非常有用。

要忽略一个文件或一组文件,请提供模式。git的模式语法相当简单,但功能强大。它适用于我将在下面提到的所有三个不同的文件。

空行不忽略任何文件,通常用作分隔符。以#开头的行用作注释。这个前缀是可选的,将否定模式。任何匹配的否定模式都将覆盖优先级较低的模式。支持高级表达式和通配符示例:模式:*。[oa]将忽略存储库中以.o或.a结尾的所有文件(对象和存档文件)如果一个模式有一个以斜杠结尾的目录,git将只匹配该目录及其下的路径。这将排除匹配中的常规文件和符号链接。前导斜杠将匹配该路径名中的所有文件。示例:模式/*.c将与文件foo.c匹配,但不匹配bar/b真棒.c

gitignore(5)手册页中的好例子:

$ git status
[...]
# Untracked files:
[...]
#       Documentation/foo.html
#       Documentation/gitignore.html
#       file.o
#       lib.a
#       src/internal.o
[...]
$ cat .git/info/exclude
  # ignore objects and archives, anywhere in the tree.
  *.[oa]
$ cat Documentation/.gitignore
# ignore generated html files,
*.html
# except foo.html which is maintained by hand
!foo.html
$ git status
[...]
# Untracked files:
[...]
#       Documentation/foo.html
[...]

通常有三种不同的方法可以忽略未跟踪的文件。

1) 对存储库的所有用户忽略:

将名为.gitignore的文件添加到工作副本的根目录中。

编辑.gitignore以匹配您的首选项,哪些文件应该/不应该被忽略。

git add .gitignore 

当你完成任务后再去做。

2) 仅忽略存储库副本:

在工作副本中添加/编辑文件$GIT_DIR/info/exclude,使用您的首选模式。

示例:我的工作副本是~/src/project1,因此我将编辑~/src-project1/.git/info/exclude

你完了!

3) 在所有情况下,在您的系统中忽略:

系统的全局忽略模式可以放在一个名为whatever的文件中。

我个人的名字叫做~/.giglobalignore

然后,我可以用以下行编辑~/.gitconfig文件,让git知道这个文件:

core.excludesfile = ~/.gitglobalignore

你完了!

我发现gitignore手册页是获取更多信息的最佳资源。

其他回答

提交更改

编辑文件后,需要将更改提交到git。当您执行此命令时,它将要求提交消息,这只是一个简单的文本,告诉每个人您所做的更改。

$ git commit source/main.c

将提交目录中的main.c文件/来源/

$ git commit -a # the -a flag pulls in all modified files

将提交所有更改的文件(但不提交新文件,这些文件需要使用gitadd添加到索引中)。如果你只想提交某些文件,那么你需要先用gitadd来暂存它们,然后在没有-a标志的情况下提交。

提交只会更改本地存储库,而不会更改远程存储库。如果要将提交发送到远程存储库,则需要执行推送。

$ git push <remote> <branch> # push new commits to the <branch> on the <remote> repository

对于来自CVS或SVN的人来说,这是一个变化,因为提交到中央存储库现在需要两个步骤。

如何“标记”一组特定的修订

如何“标记”、“标记”或“发布”特定文件集的特定修订集,以便以后随时可以提取该修订集?

使用git标记命令。

要简单地“标记”当前修订,只需运行。。

git tag -a thetagname
git tag -a 0.1
git tag -a 2.6.1-rc1 -m 'Released on 01/02/03'

要列出当前标记,只需运行不带参数的git标记或-l(小写l):

$ git tag -a thetagname # and enter a message, or use -m 'My tag annotation'
$ git tag -l
thetagname

要删除标记,请使用-d标志:

$ git tag -d thetagname 
Deleted tag 'thetagname'
$ git tag
[no output]

要标记特定(先前)提交,只需执行。。

git tag [tag name] [revision SHA1 hash]

例如:

git tag 1.1.1 81b15a68c6c3e71f72e766931df4e6499990385b

注意:默认情况下,git创建一个“轻量级”标记(基本上是对特定修订的引用)。“正确”的方法是使用-a标志。这将启动编辑器,请求标记消息(与请求提交消息相同,您也可以使用-m标志在命令行上提供标记消息)。使用带注释的标记创建一个具有自己的ID、日期、tagger(作者)和可选的GPG签名(使用-s标记)的对象。有关这方面的更多信息,请参阅本文

git tag mytagwithmsg -a -m 'This is a tag, with message'

要列出带有注释的标记,请使用-n1标志显示每个标记消息的1行(-n245显示每个注释的前245行,依此类推):

$ git tag -l -n1
mytagwithmsg    This is a tag, with message

有关更多信息,请参阅git标记(1)手册页

如何安装Git

在Windows上:

安装msysgit

有几个下载:

Git:除非您特别需要以下其他选项之一,否则请使用此选项。PortableGit:如果您想在PC上运行Git而不在PC上安装(例如从USB驱动器运行Git),请使用此选项msysGit:如果你想开发Git本身,可以使用这个。如果您只想将Git用于源代码,但不想编辑Git的源代码,则不需要这样做。

这还安装了一个Cygwin bash shell,因此您可以在更好的shell中使用git(而不是cmd.exe),还包括gitgui(可以通过gitgui命令或“开始”>“所有程序”>“git”菜单访问)

Mac OS X

使用gitosx安装程序,也可以从源代码安装

通过包管理器

使用本地包管理器安装git。例如,在Debian(或Ubuntu)上:

apt-get install git-core

或者在Mac OS X上,通过MacPorts:

sudo port install git-core+bash_completion+doc

…或fink:

fink install git

…或Homebrew:

brew install git

在基于Red Hat的发行版上,如Fedora:

yum install git

在Cygwin中,Git包可以在“devel”部分找到

源代码(Mac OS X/Linux/BSD/等)

在Mac OS X中,如果您安装了开发工具,您可以非常容易地从源代码编译Git。以.tar.bz或.tar.gz格式从以下位置下载最新版本的Git:http://git-scm.com/,并提取它(在Finder中双击)

在Linux/BSD/等上。应该是一样的。例如,在Debian(和Ubuntu)中,您需要通过apt安装构建基本包。

然后在终端中,cd到您提取文件的位置(运行cd~/Downloads/git*/应该有效),然后运行。。

./configure && make && sudo make install

这将在默认位置安装Git(/usr/local-因此Git将位于/usr/local/bin/Git中)

它将提示您输入密码(用于sudo),这样它就可以写入/usr/local/目录,而该目录只能由“root”用户访问,因此需要sudo!

如果您希望将其安装在单独的位置(这样Git的文件不会与其他工具混合),请在configure命令中使用--prefix:

./configure --prefix=/usr/local/gitpath
make
sudo make install

这会将git二进制文件安装到/usr/local/bin/gitpath/bin/git中,因此您不必每次都键入该文件,您应该通过在~/.profile中添加以下行将其添加到$PATH中:

export PATH="${PATH}:/usr/local/bin/gitpath/bin/"

如果您没有sudo访问权限,可以使用--prefix=/Users/myusername/bin并安装到主目录中。记得将~/bin/添加到$PATH

脚本x-git-update-to-latest-version自动完成了很多工作:

此脚本更新git repo的本地克隆(localy at ~/work/track/git),然后配置、安装(位于/usr/local/git git-descripte)并更新/usr/local/gt符号链接。这样,我的PATH中就可以有/usr/local/git/bin,而且我总是使用最新版本。此脚本的最新版本还安装了手册页。您需要调整MANPATH以包含/usr/local/git/share/man目录。

为什么还有另一种方法?网上有很多很好的指南,比如git指南,一开始就很完美。它有很好的链接,包括可以投稿的git book(托管在git hub上),非常适合这个集体任务。

在stackoverflow上,我真的更希望看到你最喜欢的技巧!

我最近才发现的是git stash,这里解释了它,它可以让你保存当前的工作并转到另一个分支机构

编辑:如前一篇文章所述,如果你真的更喜欢stackoverlow格式的帖子,我会删除这个答案

GIT工作流示例。

Git非常灵活,可以很好地适应任何工作流,但不强制执行特定的工作流可能会产生负面影响,使您很难理解除了线性“备份”工作流之外,您可以使用Git做什么,以及分支有多有用。

这篇博文很好地解释了一个非常简单但有效的工作流程,使用git很容易设置。

从博客文章中引用:我们认为origin/master是HEAD源代码始终反映生产就绪状态的主要分支:

工作流已经变得非常流行,可以制作一个实现此工作流的项目:gitflow

很好地说明了一个简单的工作流程,您可以在开发过程中进行所有更改,并且只有在代码处于生产状态时才将其推送给master:

现在让我们假设您想开发一个新功能,或者重构一个模块。您可以创建一个新的分支,我们可以称之为“功能”分支,这需要一些时间,可能会破坏一些代码。一旦您的特性“足够稳定”,并希望将其“更接近”生产,您就将特性分支合并到开发中。当所有的bug在合并后都被清理出来,并且你的代码通过了所有的测试,你就可以将你的更改推到master中。

在所有这些过程中,您会发现一个可怕的安全漏洞,必须立即修复。您可以有一个名为修补程序的分支,它使更改比正常的“开发”分支更快地返回到生产中。

在这里,您可以看到这个特性/修补程序/开发/生产工作流的样子(在博客文章中有很好的解释,我重复一遍,博客文章比我更详细、更好地解释了整个过程)。