Git初学者:权威的实用指南


854

好的,在看到PJ Hyett的这篇文章之后,我决定跳到最后,选择Git

因此,我需要的是Git 的初学者实用指南。“初学者”被定义为知道如何处理其编译器,在某种程度上了解Makefile是什么,并且在不十分了解它的情况下接触了源代码控制的人。

“实践”被定义为该人员不想深入了解Git在后台执行的操作,甚至不关心(或知道)它的分发。您的答案可能暗示了这种可能性,但请尝试针对希望将“主”存储库保留在已备份且安全的“服务器”上的初学者,并将其本地存储库视为“客户端”资源。

所以:

安装/设置

使用代码

标记,分支,发布,基准

其他

其他Git初学者参考

钻研Git

我将不时浏览这些条目并对其进行“整理”,以便它们具有一致的外观/感觉,并且可以轻松地扫描列表-随意遵循简单的“标题-简要说明-指令列表-陷阱和额外信息”模板。我还将链接到上面项目符号列表中的条目,因此以后可以轻松找到它们。

Answers:


118

如何创建新的项目/存储库?

git存储库只是一个包含特殊.git目录的目录。

这与“集中式”版本控制系统(如Subversion)不同,在“集中式”版本控制系统中,“存储库”托管在远程服务器上,您checkout将其存储到“工作副本”目录中。使用git,您的工作副本就是存储库。

只需git init在包含您要跟踪的文件的目录中运行即可。

例如,

cd ~/code/project001/
git init

这将.git在当前目录中创建一个(隐藏的)文件夹。

要创建新项目,请git init使用附加参数(要创建的目录的名称)运行:

git init project002

(This is equivalent to: mkdir project002 && cd project002 && git init)

要检查当前当前路径是否在git存储库中,只需运行git status-如果它不是存储库,它将报告“严重:不是git存储库”

您还可以列出.git目录,并检查其中是否包含类似于以下内容的文件/目录:

$ ls .git
HEAD         config       hooks/       objects/
branches/    description  info/        refs/

如果出于某种原因您希望“解散”存储库(您希望停止使用git跟踪该项目)。只需.git在存储库的基础级别上删除目录。

cd ~/code/project001/
rm -rf .git/

注意:这将销毁所有修订历史记录,所有标签以及git所做的所有事情。它不会触摸“当前”文件(您当前可以看到的文件),但是以前的更改,已删除的文件等将无法恢复!


3
Git将其对象rm -rf .git设为只读,因此您将要删除git的数据库。
乔什·李

通常,在正常使用期间需要创建一个.gitignore文件,以指定在版本控制中要忽略的文件/树,因此,为了完全完成“反gitting”的最后一部分,除了删除.git之外,您还需要删除.git文件。 gitignore文件。:)
Monoman

裸仓库怎么样?它们以某种方式“集中化”,对于许多需要某种集中化的项目(例如:由许多人开发的项目),我认为它们是一件好事
peoro 2011年

运行WRT git status以确保您位于存储库中:这有一个陷阱:如果您在当前shell中设置了环境变量$ GIT_DIR,则git将忽略您的当前位置,并使用$ GIT_DIR处的存储库。我应该知道,昨天我花了一个小时。
sanmiguel

110

git的GUI


Git GUI

包含在git中- git gui从命令行运行,Windows msysgit安装程序将其添加到“开始”菜单中。

Git GUI可以完成git所需的大部分工作。包括阶段更改,配置git和存储库,推送更改,创建/签出/删除分支,合并以及许多其他功能。

我最喜欢的功能之一是右键单击菜单中的“ stage line”和“ stage hunk”快捷方式,它使您可以提交文件的特定部分。您可以通过来实现相同的目的git add -i,但我发现它更易于使用。

它不是最漂亮的应用程序,但是它几乎可以在所有平台上运行(基于Tcl / Tk)

截图 | 截屏


吉特

也包含在git中。它是一个git历史记录查看器,可让您可视化存储库的历史记录(包括分支以及创建和合并的分支)。您可以查看和搜索提交。

与git-gui配合得很好。


吉特努布

Mac OS X应用程序。主要与等效git log,但与github集成了一些功能(例如“网络视图”)。

外观漂亮,适合Mac OSX。您可以搜索存储库。Gitnub最大的批评是它以线性方式(一次是单个分支)显示历史-它没有可视化分支和合并,这对于git可能很重要,尽管这是计划中的改进。

下载链接,更改日志和屏幕截图 | git仓库


GitX

打算成为“ OS X的gitk克隆”。

它可以可视化非线性分支历史记录,执行提交,查看和搜索提交,并且还具有其他一些不错的功能,例如能够“快速查找”任何修订版中的任何文件(在文件列表视图中按空格),导出任何文件。 (通过拖放)。

它比git-gui/ 更好地集成到OS X中gitk,即使存储库非常大,它也快速稳定。

原始的git信息库最近未更新(在撰写本文时已超过一年)。在brotherbard / gitx上可以找到维护更积极的分支-它添加了“侧边栏,获取,拉取,推送,添加远程,合并,cherry-pick,变基,克隆,克隆到”

下载 | 截图 | git仓库 | 兄弟叉 | 劳伦叉


SmartGit

从首页:

SmartGit是分布式版本控制系统Git的前端,可在Windows,Mac OS X和Linux上运行。SmartGit适用于那些喜欢图形用户界面而不是命令行客户端的开发人员,以利用Git(当今功能最强大的DVCS)提高生产力。

您可以从他们的网站下载它。

下载


龟龟

Windows用户的TortoiseSVN Git版本。

它将TortoiseSVN移植到TortoiseGit最新版本1.2.1.0。此版本可以完成常规任务,例如提交,显示日志,差异两个版本,创建分支和标记,创建补丁等。请参见发布记录的细节。欢迎为这个项目做贡献。

下载


QGit

QGit是基于Qt / C ++的git GUI查看器。

使用qgit,您将能够以图形方式遵循不同的开发分支来浏览修订历史记录,查看补丁内容和更改的文件。

下载


gitg

gitg是针对gtk + / GNOME的git存储库查看器。其主要目标之一是为跨多个桌面的git前端提供更统一的用户体验。它不是在编写跨平台应用程序,而是与其他操作系统(例如OS X的GitX)的类似客户端紧密协作。

特征

  • 浏览修订历史记录。
  • 处理大型存储库(在1秒内加载linux存储库,17000多个修订版)。
  • 提交更改。
  • 舞台/不舞台个人大块头。
  • 还原更改。
  • 显示修订版本的彩色差异。
  • 浏览树中的给定修订版。
  • 导出给定修订版的树的一部分。
  • 提供诸如``git log''之类的命令可以理解的任何refspec以建立历史记录。
  • 在历史记录视图中显示并在分支之间切换。

下载:版本


彩盒

Gitbox是用于Git版本控制系统的Mac OS X图形界面。在单个窗口中,您可以看到分支,历史记录和工作目录状态。

日常操作很容易:通过复选框进行和不进行更改。只需单击即可提交,拉动,合并和推动。双击更改以显示与FileMerge.app的差异。

下载


吉蒂

Gity网站没有太多信息,但是从那里的屏幕截图来看,它似乎是功能丰富的开源OS X git gui。

下载来源


融化

Meld是视觉差异和合并工具。您可以比较两个或三个文件并在适当位置进行编辑(差异会动态更新)。您可以比较两个或三个文件夹并启动文件比较。您可以从流行的版本控制系统(例如CVS,Subversion,Bazaar-ng和Mercurial [ 和Git ])浏览和查看工作副本。

资料下载


片假名

Steve Dekorte的OSX版Git GUI。

一目了然,查看哪些远程分支有更改要拉,而本地存储库有更改要推。支持add,commit,push,pull,tag和reset的git ops,还支持视觉差异和可视化项目层次的浏览,突出显示本地更改和添加。

1个存储库免费,更多则25美元。

下载


新芽(以前是GitMac)

致力于使Git易于使用。具有本机可可(类似于Mac)的UI,快速的存储库浏览,克隆,推/拉,分支/合并,可视化差异,远程分支,易于访问终端等。

通过使最常用的Git操作直观且易于执行,Sprout(以前称为GitMac)使Git变得用户友好。与大多数Git工作流程兼容,Sprout非常适合设计师和开发人员,团队协作以及高级和新手用户。

下载 | 网站


Mac OSX的功能丰富的Git GUI。30天免费试用,单用户许可证$ 59USD。

下载 | 网站


EGit

EGit是Git版本控制系统的Eclipse Team提供程序。Git是一个分布式SCM,这意味着每个开发人员都拥有该代码每个修订版本的所有历史记录的完整副本,从而使对历史记录的查询非常快速且通用。

EGit项目正在Git的JGit Java实现之上实现Eclipse工具。

下载 | 网站


Git扩展

Windows开源-在单个软件包中安装使用Git所需的所有内容,易于使用。

Git Extensions是一个工具包,可以使在Windows上使用Git更加直观。该外壳扩展将在Windows资源管理器中集成在一起,并在文件和目录上显示一个上下文菜单。还有一个Visual Studio插件可以使用Visual Studio中的git。

下载

非常感谢dbr精心制作git gui的东西。


源树

SourceTree是Git,Mercurial和SVN 的免费 Mac客户端。它由AtBussian(BitBucket背后的人)构建,似乎可以与任何VC系统同样良好地工作,该系统可以让您掌握用于所有项目的单个工具,但是它们是受版本控制的。功能丰富且免费。

专为新手和高级用户准备的专家级功能包:

查看传出和传入变更集。分支之间的樱桃采摘。补丁处理,变基,隐藏/搁置等。

下载 | 网站



2
您有一些不错的答案(尤其是gitcasts和推/拉答案),但是我建议将其拆分为单独的答案吗?发问者要求您“不要试图将大量信息塞进一个答案中”!
dbr

3
也许您应该将TortoiseGit code.google.com/p/tortoisegit添加到您的列表中,以解决Windows问题……
kret

1
Gitymacendeavor.com/gity)是一个选项,但仍在开发中(OS X)
Dave DeLong 2010年

2
Tower(“ Mac上最强大的Git客户端”)是Git的一个漂亮的新客户端。
rubiii 2011年

59

好吧,尽管您实际上要求我们不要“简单地”链接到其他资源,但是当已经存在一个确实不错的社区增长(并且正在增长)的资源时,这是非常愚蠢的:Git社区书。认真地讲,一个问题中的20多个问题将变得简洁而一致。Git社区书籍既有HTML格式,也有PDF格式,并以清晰,格式正确且经过同行评审的答案以及可以让您直接跳到您所遇到的问题的格式来回答您的许多问题。

las,如果我的帖子真的让您不高兴,那么我将其删除。只是这样说。


2
如果您因为使用DVCS而没有使用git,那么为什么还要使用git呢?这个问题很愚蠢,并且转移了可用于其他目的的资源,以实现可疑的目标。
兰德尔·施瓦茨

56

如何配置它以忽略文件:

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

要忽略一个文件或一组文件,请提供一个模式。git的模式语法非常简单,但是功能强大。它适用于以下所有三个不同的文件。

  • 空行不会忽略任何文件,通常用作分隔符。
  • 开头的行用作注释。
  • 前缀是可选的,将否定模式。匹配的所有否定模式将覆盖优先级较低的模式。
  • 支持高级表达式和通配符
    • 例如:模式:*。[oa] 将忽略存储库中所有以.o或.a结尾的文件(对象和归档文件)
  • 如果某个模式的目录以斜杠结尾,则git只匹配该目录及其下的路径。这从匹配中排除常规文件和符号链接。
  • 前导斜杠将匹配该路径名中的所有文件。
    • 例如:模式/*.c将匹配文件foo.c,但不匹配bar / awesome.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)在您的系统上的所有情况下都忽略:

您系统的全局忽略模式可以放在一个您想要的文件中。

我的个人被称为〜/ .gitglobalignore

然后,我可以通过以下行编辑〜/ .gitconfig文件来让git知道该文件:

core.excludesfile = ~/.gitglobalignore

你完成了!

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


有人可以在此帖子中添加一个较小但重要的细节吗?这仅适用于尚未被git跟踪的文件。要“取消跟踪”文件但将其保留在文件系统中,则需要“ git rm --cached filename”。谢谢!
Nikita Rybak 2010年

我只想指出,添加core.excludesfile行对我不起作用。我不得不[git config --global core.excludesfile〜/ .gitglobalignore]使其工作。
编码区

Github上现在有一个名为gitignore的项目,该项目具有适用于多种语言和开发环境的gitignore文件:github.com/github/gitignore
Ryan Lundy

47

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

如何为一组特定的文件“标记”,“标记”或“发布”一组特定的修订版本,以便您以后可以随时将其拉出?

使用git tag命令。

要简单地“标记”当前修订,就可以运行。

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

要列出当前标签,只需git tag不带任何参数运行,或-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,日期,标签(作者)和可选的GPG签名(使用-s标签)的对象。 有关此的更多信息,请参阅这篇文章

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

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

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

有关更多信息,请参见git-tag(1)手册页


git tag 默认不会创建标签,只是轻量级引用。您必须使用-a或-s来创建一个标记对象(事物喜欢的描述将使用):rockstarprogrammer.org/post/2008/oct/16/...
达斯汀

啊,有趣。谢谢,我已经更新了答案以反映这一点
dbr

以及如何标记先前提交的修订?(对不起,它太长了,所以我略读了一下,我想念什么吗?)
hasen

hasen j:添加了要回答的信息,基本上git tag tagname revision_SHA1
dbr

1
要将标签推送到远程仓库中,请在使用git push(来自github帮助区域的信息)时添加--tags。
赫克托·拉莫斯

46

GIT的工作流程示例。

Git非常灵活,可以很好地适应任何工作流程,但是不执行特定的工作流程可能会带来负面影响,使您难以理解除了线性“备份”工作流程以外,您可以用git做些什么,例如分支的有用程度。

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

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

工作流已经变得非常流行,以至于创建了一个实现该工作流的项目:git-flow

一个简单的工作流程的很好的说明,您可以在开发中进行所有更改,并且仅在代码处于生产状态时才推动掌握:

简单的工作流程

现在,假设您要使用新功能或重构模块。您可以创建一个新分支,我们称之为“功能”分支,这将花费一些时间并可能破坏一些代码。一旦您的功能“足够稳定”并且想要将其“更紧密地”投入生产,就可以将功能分支合并到开发中。当合并后所有的错误都已解决,并且您的代码通过了所有测试之后,就可以将更改推送到主版本中。

在所有这些过程中,您会发现一个可怕的安全漏洞,必须立即修复。您可能有一个名为hotfix的分支,该分支进行的更改比正常的“ develop”分支更快速地将其推送回生产环境。

在这里,您可以说明此功能/修补程序/开发/生产工作流程的外观(在博客文章中对此进行了很好的解释,我再重复一次,该博客文章比我更详细地解释了整个过程,并且比我做得更好。 。

Git工作流程示例


我是git新手,此图对我来说更加令人困惑。
finnw 2011年

哪个,第一个或最后一个?我真的不想把帖子写得太长,但是稍后我将为这两个图添加一个简短的解释。
ashwoods,2011年

阅读全文。我也对这个图感到困惑,但是博客文章写得很好nvie.com/posts/a-successful-git-branching-model
Felipe Sabino

现在好些了吗?我只想大致概述一下,不想在这里重新发布整个博客文章:)
ashwoods,2011年

39

这是PJ Hyett的帖子的副本,因为该帖子不再可用:

Git并不难

2008年11月23日

当我们告诉人们为什么他们应该在Subversion上使用Git时,首选的代码是:“ Git比Subversion更好,但Subversion的功能还远远超过Subversion。”

“很多”由使Git真正发光的一堆东西组成,但是对于来自其他SCM(例如Subversion)的那些东西来说可能是不堪重负的。

就是说,没有什么可以阻止您使用Git的,就像您在进行过渡时使用Subversion一样。

假设您已经安装了必要的软件并在某个地方有一个远程存储库,这就是您如何获取代码并使用Subversion将更改推回的方式:

$ svn checkout svn://foo.googlecode.com/svn/trunk foo
# make your changes
$ svn commit -m "my first commit"

以及您将如何在Git中做到这一点:

$ git clone git@github.com:pjhyett/foo.git
# make your changes
$ git commit -a -m "my first commit"
$ git push

使它在Git中实现的另一条命令。这个额外的命令具有很大的含义,但是出于本文的目的,这就是我们正在讨论的一个额外的命令。

瞧,这确实不难。

更新:我也不会忘记,与Git相比,在Subversion中更新本地副本的等效分别是svn updategit pull。在两种情况下都只有一个命令。


在第一个示例中,我看到您正在签出相对路径,./foo但是虽然没有为get clone指定路径,但您在哪里签出?
JD Isaacks 2011年

33

如何安装Git

在Windows上:

安装msysgit

有几个下载:

  • Git:除非特别需要以下其他选项之一,否则请使用此选项。
  • PortableGit:如果要在PC上运行Git而不在该PC上安装(例如,从USB驱动器运行Git),请使用此选项
  • msysGit:如果您想自己开发Git,请使用它。如果你只是想使用Git的为您的源代码,但不希望编辑Git的源代码,你不需要这个。

这还会安装一个Cygwin bash shell,因此您可以git在更好的shell中使用cmd.exe而不是cmd.exe,还包括git-gui(可通过git gui命令或Start > All Programs > Git菜单访问)

Mac OS X

使用git-osx-installer,或者您也可以从源代码安装

通过包管理器

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

apt-get install git-core

或在Mac OS X上,通过MacPorts

sudo port install git-core+bash_completion+doc

…或芬克:

fink install git

…或自制软件

brew install git

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

yum install git

在Cygwin中,可以在“开发”部分下找到Git软件包

从源(Mac OS X / Linux / BSD /等)

在Mac OS X中,如果安装了开发人员工具,则可以非常轻松地从源代码编译Git。从.tar.bz.tar.gzhttp://git-scm.com/下载最新版本的Git 并将其解压缩(在Finder中双击)

在Linux / BSD / etc上。应该差不多。例如,在Debian(和Ubuntu)中,您需要通过安装build-essential软件包apt

然后在终端中,cd将文件提取到其中(运行cd ~/Downloads/git*/应该可以运行),然后运行。

./configure && make && sudo make install

这会将Git安装到默认位置(/usr/local- git会在/usr/local/bin/git

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

如果您要将其安装在单独的位置(因此Git的文件不会与其他工具混在一起),请--prefix与configure命令一起使用:

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

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

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

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

脚本x-git-update-to-latest-version自动执行许多操作:

该脚本更新了git repo的本地克隆(本地化为~/work/track/git),然后进行配置,安装(位于/usr/local/git- git describe)并更新了/usr/local/git符号链接。

这样,我就可以拥有/usr/local/git/bin自己的东西,PATH并且始终使用最新版本。

此脚本的最新版本也将安装手册页。您需要调整MANPATH以包括/usr/local/git/share/man目录。


5
在Fedora上:yum install git。对于GUI运行yum install git-gui
Cristian Ciupitu 09年

2
在Mac上,sudo port install git-core+bash_completion+doc
单身

我下载了mac的fink,但是运行fink install git却给我错误:“失败:找不到规范'git'的软件包!”
quano

@quano应该在那里,pdb.finkproject.org/pdb/package.php/git-检查Fink是否正确更新-我认为跑步fink self-update应该有所帮助
dbr

32

Git重置

假设您提出了要求,将其合并到您的代码中,然后决定您不喜欢它。使用git-log或tig,找到要返回的哈希(可能是上拉/合并之前的最后一次提交),然后复制哈希,然后执行以下操作:

# Revert to a previous commit by hash:
git-reset --hard <hash>

您可以使用HEAD ^作为上一次提交的快捷方式,而不是使用哈希。

# Revert to previous commit:
git-reset --hard HEAD^

4
这是在大多数其他集中式版本控制系统中还原的模拟。
杰里米·沃尔

“ $ git-reset --hard HEAD ^”应该是head父级的简写形式(即上一次提交之前的前一个状态)。
Ben Page

6
只是一个普通的老人git reset应该意外git add
脱胎

31

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

这里介绍了如何设置普通存储库-但是如何设置每个人都可以从中拉出的团队存储库?

使用共享的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实际上取决于所需的安全级别。看看配置的Git通过SSH一些更多的信息。

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

按照与上述相同的方式初始化存储库后,您可以像下面这样进行初始推送:

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

看到与上面相似吗?除此之外,唯一可能发生的事情就是如果帐户具有密码,SSH会要求输入密码。如果您在没有密码的帐户上收到此提示,则SSH服务器可能已禁用PermitEmptyPasswords

现在克隆如下所示:

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

除了NFS,如何设置git服务器以通过ssh工作?-像github.com的小型实例吗?
达菲德·里斯

是否有必要在相关目录上设置组粘性位,或者git是否会处理所有这些问题?如果是后者,git如何知道Unix文件的权限使用哪个组?
Norman Ramsey 2010年

我已根据要求添加了有关SSH的部分。如果并非所有开发人员都将共享组作为其主要组,则需要使用粘性位。如果任何用户具有不同的主要组,则默认情况下,他们将创建具有该组所有权的文件。这发生在git以下,因此并不总是在git的控制范围内。
Asgeir S. Nilsen

什么git repo-config core.sharedRepository组有用吗?
systempuntoout 2010年

28

git status是您的朋友,经常使用。非常适合回答以下问题:

  • 该命令只是做什么?
  • 我在哪个分支上?
  • 我要提交哪些更改,我忘记了什么?
  • 我上次从事此项目时(几天,几周或几个月前)是否处于中间状态?

比如说svn status,与git status大型项目不同,它几乎可以立即运行。我经常在学习git经常使用它时放心,以确保我对正在发生的事情的心理模型是准确的。现在,我主要只是用它来提醒自己自上次提交以来发生了什么变化。

显然,如果合理配置了.gitignore,它会更加有用。


27

提交变更

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

$ git commit source/main.c

将在目录./source/中提交文件main.c。

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

将提交所有更改的文件(但不提交新文件,需要使用git-add将其添加到索引中)。如果只想提交某些文件,则需要先使用git-add暂存它们,然后再提交不带-a标志的文件。

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

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

对于来自CVS或SVN的用户而言,这是一个更改,因为到中央存储库的提交现在需要两个步骤。


27

您如何分支?

git存储库中的默认分支称为master

创建一个新的分支使用

git branch <branch-name>

要查看当前存储库类型中所有分支的列表

git branch

如果要切换到另一个分支,可以使用

git checkout <branch-name>

创建一个新分支并一步切换到该分支

git checkout -b <branch-name>

要删除分支,请使用

git branch -d <branch-name>

要创建一个具有当前分支更改的分支,请执行

git stash
git stash branch <branch-name>

11
您应该提到快捷方式git checkout -b <branch-name>,它会创建一个分支并一步一步切换到该分支。对于初学者甚至高级git用户来说,这可能是最常见的用例。
杰里米·沃尔

21

获取最新代码

$ git pull <remote> <branch> # fetches the code and merges it into 
                             # your working directory
$ git fetch <remote> <branch> # fetches the code but does not merge
                              # it into your working directory

$ git pull --tag <remote> <branch> # same as above but fetch tags as well
$ git fetch --tag <remote> <branch> # you get the idea

这几乎涵盖了从远程存储库获取代码的最新副本的所有情况。



18

Git Magic是您所需要的。品质保证,退款保证!


14
igh,我要我的钱还给我。具有不完整教程(GitMagic)==的工作时间的越野车软件(msysGit),这几乎是免费的
SamGoody 2009年

16

您如何合并分支?

如果您想合并一个分支(例如masterrelease),请确保您的当前分支目标分支您想合并到(使用git branchgit status看到您的当前分支)。

然后使用

git merge master

(其中master是您要与当前分支合并的分支的名称)。

如果有任何冲突,您可以使用

git diff

要查看未解决的冲突,您必须解决。


2
有git mergetool与您喜欢的工具(gvimdiff,kdiff3或其他工具)进行三向比较
Dave Vogt



12

如何跟踪远程分支

假设有一个远程存储库是您从中克隆本地存储库的,并且还假设该远程存储库上有一个名为“ some_branch”的分支,以下是在本地进行跟踪的方法:

# list remote branches
git branch -r

# start tracking one remote branch
git branch --track some_branch origin/some_branch

# change to the branch locally
git checkout some_branch

# make changes and commit them locally
....

# push your changes to the remote repository:
git push

似乎在git 1.7中,当您从远程分支创建本地分支时,会自动对其进行跟踪。我不知道此行为从哪个版本开始。
Doppelganger

实际上,您可以使用以下方式列出所有远程分支机构git remote show REMOTENAME
Felipe Sabino


10

您如何比较文件的两个修订,或者当前文件和先前的修订?

比较命令是git diff

要比较文件的2个修订版本:

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

那将commit1与commit2进行比较;如果您更改顺序,则文件会以相反的方式进行区分,这可能与您期望的不一样...

要将当前暂存文件与存储库进行比较:

$ git diff --staged <file_name>

要将当前未暂存的文件与存储库进行比较:

$ git diff <file_name>

9

为什么还要另外一个方法?网上确实有很多不错的工具,例如git指南,非常适合入门。它具有良好的链接,包括git书,一个人可以贡献力量(托管在git hub上),并且非常适合完成这项集体任务。

在stackoverflow上,我真的很希望看到您喜欢的技巧!

我最近才发现的Mine,此进行了git stash解释,它使您能够保存当前的工作并转到另一个分支

编辑:作为前一篇文章,如果您真的更喜欢将stackoverlow格式的文章作为Wiki,我将删除此答案


不,不要删除。您的答案是完全正确的-向他人指出好的资源并不是一件坏事。我也想要这里列出的最常见的操作,但这需要一些工作,而且我不希望其他人这样做。随着时间的推移,我会逐步进行学习,这将为我提供参考。
亚当·戴维斯

9

控制台用户界面-跳格

安装:

apt-get install tig

用法

在git repo内部时,键入“ tig”以查看交互式日志,在任何日志上单击“ enter”以查看有关它的更多信息。h寻求帮助,其中列出了基本功能。

琐事

“ Tig”是“ Git”。


它不应该是“控制台UI”,因为“控制台”和“图形”有点矛盾吗?
dbr

它比git-log更加图形化...但是,它的可界面性
Dean Rather

8

如何在远程存储库上创建分支?

假设您已从某个远程存储库克隆了远程存储库。

# create a new branch locally
git branch name_of_branch
git checkout name_of_branch
# edit/add/remove files    
# ... 
# Commit your changes locally
git add fileName
git commit -m Message
# push changes and new branch to remote repository:
git push origin name_of_branch:name_of_branch

11
为什么要使用name_of_branch:name_of_branch?
Seun Osewa'3

是的,为什么?据我所知,您只需要git push origin name_of_branch分支就可以在您的远程
站点中

第一个name_of_branch是本地名称,第二个是(所需的)远程分支名称,因此local_name_of_branch:remote_name_of_branch如果您希望名称不同则可以。如果您希望它们相同,则仍然必须像这样指定它:b / c git并没有假设您希望名称相同,除非您告诉了它(还有其他方法也可以这样做),但是)
约翰尼

8

我从正式的Git教程开始。我认为对于初学者来说,它已经足够实用了(按照您的定义,我曾经是,现在仍然是初学者!我几乎不掌握makefile,我只使用过Apache Subversion等)。



7

推拉变更

以简化的方式,只需执行git push和即可git pull。更改被合并,如果有冲突,git会通知您,您可以手动解决它。

首次推送到远程存储库时,您需要执行一个操作git push origin master(master是master分支)。从那时起,您只需执行git push

用推送标签git push --tags


7

签出代码

首先转到一个空目录,使用“ git init”将其设置为存储库,然后将远程存储库克隆到您自己的存储库中。

git clone user@host.com:/dir/to/repo

无论您最初从哪里克隆,默认情况下都是从“ git pull”那里克隆的。


7
我认为clone为您执行了init步骤,从而消除了先运行init的需要。git init实际上主要是用于创建第一个存储库或用于您要设置与标准克隆不同的多个远程的特殊配置。
杰里米·沃尔

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.