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

Ada*_*vis 854 git version-control

好的,在看到PJ Hyett的这篇文章之后,我决定跳到最后并与Git一起去.

所以我需要的是初学者对Git 的实用指南."初学者"被定义为知道如何处理编译器的人,在某种程度上理解Makefile是什么,并触及源代码控制而不理解它.

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

所以:

安装/设置

使用代码

标记,分支,发布,基线

其他

其他Git初学者的参考资料

深入研究Git

我会不时地查看这些条目并"整理"它们以便它们具有一致的外观/感觉并且很容易扫描列表 - 随意按照简单的"标题 - 简要说明 - 说明列表 - 陷阱和额外信息"模板.我还将链接到上面的项目符号列表中的条目,以便以后轻松找到它们.

dbr*_*dbr 118

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

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

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

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

例如,

cd ~/code/project001/
git init
Run Code Online (Sandbox Code Playgroud)

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

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

git init project002

(This is equivalent to: mkdir project002 && cd project002 && git init)
Run Code Online (Sandbox Code Playgroud)

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

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

$ ls .git
HEAD         config       hooks/       objects/
branches/    description  info/        refs/
Run Code Online (Sandbox Code Playgroud)

如果出于某种原因你希望"去git"一个存储库(你希望停止使用git来跟踪该项目).只需删除.git存储库基础级别的目录即可.

cd ~/code/project001/
rm -rf .git/
Run Code Online (Sandbox Code Playgroud)

警告:这将破坏所有修订历史记录,所有标记,git所做的一切.它不会触及"当前"文件(您当前可以看到的文件),但以前的更改,删除的文件等将无法恢复!

  • Git将其对象设为只读,因此您需要`rm -rf .git`来删除git的数据库. (3认同)

dyl*_*nfm 110

git的GUI


Git GUI

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

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

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

它不是最漂亮的应用程序,但它适用于几乎所有平台(基于Tcl/Tk)

截图 | 一个截屏视频


GitK

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

与git-gui很好地融合在一起.


Gitnub

Mac OS X应用程序.主要是相当于git log,但与github有一些集成(如"网络视图").

看起来很漂亮,适合Mac OS X.您可以搜索存储库.Gitnub最大的批评是它以线性方式显示历史(一次只显示一个分支) - 它不会显示分支和合并,这对于git来说很重要,尽管这是一个有计划的改进.

下载链接,更改日志和截图 | git存储库


GitX

打算成为"OS X的gitk克隆".

它可以可视化非线性分支历史,执行提交,查看和搜索提交,还有一些其他很好的功能,如能够"快速查看"任何修订版本中的任何文件(按文件列表视图中的空格),导出任何文件(通过拖放).

它远远更好地融入比OS X git-gui/ gitk和速度快且稳定,即使非常大仓库.

最初的git repository pieter最近没有更新(写作时间超过一年).在brotherbard/gitx上有一个更积极维护的分支- 它添加了"侧边栏,提取,拉动,推送,添加远程,合并,樱桃挑选,rebase,克隆,克隆到"

下载 | 截图 | git存储库 | 兄弟叉 | laullon叉


SmartGit

从主页:

SmartGit是分布式版本控制系统Git的前端,可在Windows,Mac OS X和Linux上运行.SmartGit适用于喜欢通过命令行客户端使用图形用户界面的开发人员,使用Git(今天功能最强大的DVCS)提高效率.

您可以从他们的网站下载.

下载


TortoiseGit

适用于Windows用户的TortoiseSVN Git版本.

它将TortoiseSVN移植到TortoiseGit最新版本1.2.1.0此版本可以完成常规任务,例如提交,显示日志,差异两个版本,创建分支和标记,创建补丁等等.有关详细信息,请参见ReleaseNotes.欢迎贡献这个项目.

下载


QGit

QGit是一个基于Qt/C++构建的git GUI查看器.

使用qgit,您将能够浏览修订历史记录,查看修补程序内容和更改的文件,以图形方式跟踪不同的开发分支.

下载


gitg

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

特征

  • 浏览修订历史记录
  • 处理大型存储库(加载linux存储库,17000+次修订,不到1秒).
  • 提交更改.
  • 舞台/舞台上的个人帅哥.
  • 还原更改.
  • 显示修订版中更改的颜色差异.
  • 浏览给定修订版本的树.
  • 导出给定修订版本树的部分.
  • 提供诸如'git log'之类的命令可以理解的任何refspec来构建历史记录.
  • 在历史记录视图中显示和切换分支.

下载:发布源代码


Gitbox

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

日常操作很简单:使用复选框进行舞台和非舞台更改.单击即可提交,拉取,合并和推送.双击更改以使用FileMerge.app显示差异.

下载


Gity

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

下载来源


合并

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

下载


武士刀

Steve Dekorte为OSX提供的Git GUI.

一目了然,看看哪些远程分支有拉动变化,本地仓库有变化推动.支持添加,提交,推送,拉取,标记和重置的git操作,以及项目hieracy的视觉差异和可视化浏览,突出显示本地更改和添加.

1个存储库免费,25美元以上.

下载


Sprout(以前的GitMac)

着重于让Git易于使用.具有本机Cocoa(类似mac)UI,快速存储库浏览,克隆,推/拉,分支/合并,可视差异,远程分支,轻松访问终端等.

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

下载 | 网站


适用于Mac OSX的功能丰富的Git GUI.30天免费试用,单用户许可证价格为59美元.

下载 | 网站


例如:It

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

EGit项目是在Git的JGit Java实现之上实现Eclipse工具.

下载 | 网站


Git扩展

适用于Windows的开源 - 在单个软件包中安装使用Git所需的一切,易于使用.

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

下载

非常感谢dbr详细介绍了git gui的东西.


SourceTree

SourceTree是Git,Mercurial和SVN 的免费 Mac客户端.由BitBucket背后的人Atlassian构建,它似乎与任何VC系统同样有效,它允许您掌握用于所有项目的单个工具,但它们是版本控制的.功能丰富,免费.

适用于新手和高级用户的专家就绪和功能丰富:

查看传出和传入的更改集.分支之间的樱桃挑选.补丁处理,rebase,藏匿/搁置等等.

下载 | 网站


  • 也许你应该将TortoiseGit http://code.google.com/p/tortoisegit添加到你的列表中,对于Windows gitters ...... (3认同)
  • 你有一些很好的答案(特别是gitcasts和推/拉答案),但我可以建议将它分成单独的答案吗?这个问题要求你"不要试图将一堆信息塞进一个答案"! (2认同)
  • [塔](http://www.git-tower.com/)("Mac最强大的Git客户端")是Git的一个漂亮的新客户端. (2认同)

Pat*_*otz 59

好吧,尽管你要求我们不"简单地"链接到其他资源,但是当已经存在一个真正相当不错的社区成长(和不断增长的)资源时,这是非常愚蠢的:Git社区书.说真的,一个问题中的这20多个问题将是简洁和一致的.Git社区手册以HTML和PDF格式提供,可以通过清晰,格式良好和同行评审的答案回答您的许多问题,并且格式允许您直接跳到手头的问题.

唉,如果我的帖子真的让你心烦意乱,那么我会删除它.只是这样说.

  • 如果你没有使用git,因为它是DVCS,为什么还要使用git呢?这个问题很愚蠢,并且会转移可用于其他事情的资源以满足可疑目标. (2认同)

Bri*_*aro 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
[...]
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

git add .gitignore 
Run Code Online (Sandbox Code Playgroud)

当你完成时提交.

2)仅忽略您的存储库副本:

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

例如:我的工作副本是〜/ src/project1所以我要编辑〜/ src/project1/.git/info/exclude

你完成了!

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

系统的全局忽略模式可以放在一个名为您希望的文件中.

我个人叫做〜/ .gitglobalignore

然后我可以通过使用以下行编辑〜/ .gitconfig文件让git知道这个文件:

core.excludesfile = ~/.gitglobalignore
Run Code Online (Sandbox Code Playgroud)

你完成了!

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


dbr*_*dbr 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'
Run Code Online (Sandbox Code Playgroud)

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

$ git tag -a thetagname # and enter a message, or use -m 'My tag annotation'
$ git tag -l
thetagname
Run Code Online (Sandbox Code Playgroud)

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

$ git tag -d thetagname 
Deleted tag 'thetagname'
$ git tag
[no output]
Run Code Online (Sandbox Code Playgroud)

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

git tag [tag name] [revision SHA1 hash]
Run Code Online (Sandbox Code Playgroud)

例如:

git tag 1.1.1 81b15a68c6c3e71f72e766931df4e6499990385b
Run Code Online (Sandbox Code Playgroud)

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

git tag mytagwithmsg -a -m 'This is a tag, with message'
Run Code Online (Sandbox Code Playgroud)

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

$ git tag -l -n1
mytagwithmsg    This is a tag, with message
Run Code Online (Sandbox Code Playgroud)

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


ash*_*ods 46

使用GIT的工作流示例.

Git非常灵活,能够很好地适应任何工作流程,但是不强制执行特定的工作流程可能会产生负面影响,使得很难理解除了线性"备份"工作流程之外你可以使用git做什么,以及如何有用的分支可以例如.

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

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

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

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

工作简单

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

在这个过程中,您会发现一个可怕的安全漏洞,必须立即修复.你可以有一个名为hotfixes的分支,它可以使更改比正常的"develop"分支更快地恢复生产.

在这里,您可以看到此功能/修补程序/开发/生产工作流程的外观(在博客文章中有详细解释,我再说一遍,博客文章详细解释了整个过程,并且比我做得更好) .

Git工作流程示例


Ada*_*vis 39

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

Git并不难

2008年11月23日

当我们告诉人们为什么他们应该使用Git而不是Subversion时,首先要说的是,"Git比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.两种情况下只有一个命令.


dbr*_*dbr 33

如何安装Git

在Windows上:

安装msysgit

有几个下载:

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

这也安装了一个Cygwin bash shell,所以你可以使用git更好的shell(比cmd.exe),还包括git-gui(可通过git gui命令或Start > All Programs > Git菜单访问)

Mac OS X.

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

通过包管理器

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

apt-get install git-core
Run Code Online (Sandbox Code Playgroud)

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

sudo port install git-core+bash_completion+doc
Run Code Online (Sandbox Code Playgroud)

......或者说:

fink install git
Run Code Online (Sandbox Code Playgroud)

......或自制语:

brew install git
Run Code Online (Sandbox Code Playgroud)

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

yum install git
Run Code Online (Sandbox Code Playgroud)

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

来自源(Mac OS X/Linux/BSD /等)

在Mac OS X中,如果安装了Developer Tools,则可以非常轻松地从源代码编译Git.下载最新版本的Git的作为.tar.bz.tar.gzhttp://git-scm.com/,并提取它(在Finder中双击)

在Linux/BSD /等.它应该是一样的.例如,在Debian(和Ubuntu)中,您需要通过安装build-essentialapt.

然后在终端中,cd你解压缩文件(运行cd ~/Downloads/git*/应该工作),然后运行..

./configure && make && sudo make install
Run Code Online (Sandbox Code Playgroud)

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

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

如果您要将它安装在不同的地方(因此Git的文件不与其他工具混合使用),请使用--prefixconfigure命令:

./configure --prefix=/usr/local/gitpath
make
sudo make install
Run Code Online (Sandbox Code Playgroud)

这会将git二进制文件安装到/usr/local/bin/gitpath/bin/git- 所以你不必每次都输入,你应该$PATH通过在你的下面添加以下行来添加~/.profile:

export PATH="${PATH}:/usr/local/bin/gitpath/bin/"
Run Code Online (Sandbox Code Playgroud)

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

脚本x-git-update-to-latest-version自动化了很多这样的:

这个脚本更新我的git repo的本地克隆(localy at ~/work/track/git),然后配置,安装(at /usr/local/git- git describe)并更新/usr/local/git符号链接.

这样,我可以/usr/local/git/bin在我PATH和我总是使用最新版本.

此脚本的最新版本还会安装手册页.你需要调整你MANPATH/usr/local/git/share/man目录.

  • 在Fedora上:`yum install git`.对于GUI运行`yum install git-gui`. (5认同)
  • 在Mac上,`sudo port install git-core + bash_completion + doc` (2认同)

Dea*_*her 32

Git重置

假设你做了一个拉,将它合并到你的代码中,并决定你不喜欢它.使用git-log或tig,找到你想要回到的地方的哈希值(可能是你在拉/合并之前的最后一次提交)复制哈希,然后执行:

# Revert to a previous commit by hash:
git-reset --hard <hash>
Run Code Online (Sandbox Code Playgroud)

您可以使用HEAD ^作为先前提交的快捷方式,而不是哈希.

# Revert to previous commit:
git-reset --hard HEAD^
Run Code Online (Sandbox Code Playgroud)

  • 只是一个普通的老`git reset`应该取消意外的'git add` (6认同)
  • 这是大多数其他集中式版本控制系统中的模拟. (4认同)

Asg*_*sen 31

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

这里描述了如何设置普通存储库- 但是如何设置一个团队存储库,每个人都可以从中拉出和推送?

使用共享NFS文件系统

假设您的团队已经拥有可以使用的共享组成员身份.

mkdir /your/share/folder/project.git
cd /your/share/folder/project.git
newgrp yourteamgroup # if necessary
git init --bare --shared
Run Code Online (Sandbox Code Playgroud)

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

cd your/local/workspace/project
git remote add origin /your/share/folder/project.git
git push origin master
Run Code Online (Sandbox Code Playgroud)

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

cd your/local/workspace
git clone /your/share/folder/project.git
Run Code Online (Sandbox Code Playgroud)

使用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
Run Code Online (Sandbox Code Playgroud)

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

克隆现在看起来像这样:

cd your/local/workspace
git clone user@server:/path/to/project.git
Run Code Online (Sandbox Code Playgroud)


Pet*_*rns 28

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

  • 这个命令刚刚做了什么?
  • 我在哪个分支?
  • 我要承诺什么改变,我忘了什么?
  • 上次我在这个项目上工作(几天,几周,或者几个月前),我是否处于中间状态?

不像,说svn status,git status跑近了,瞬间即使在大项目.我经常发现它在学习git经常使用它时让人放心,以确保我所发生的事情的心智模型是准确的.现在我大多只是用它来提醒自己自从我上次提交以来我已经改变了什么.

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


Ada*_*vis 27

提交更改

编辑完文件后,需要将更改提交给git.执行此命令时,它将询问提交消息 - 这只是一个简单的文本,告诉每个人你已经改变了什么.

$ git commit source/main.c
Run Code Online (Sandbox Code Playgroud)

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

$ git commit -a # the -a flag pulls in all modified files
Run Code Online (Sandbox Code Playgroud)

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

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

$ git push <remote> <branch> # push new commits to the <branch> on the <remote> repository
Run Code Online (Sandbox Code Playgroud)

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


Mar*_*ier 27

你怎么分支?

调用git存储库中的默认分支master.

要创建新的分支使用

git branch <branch-name>
Run Code Online (Sandbox Code Playgroud)

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

git branch
Run Code Online (Sandbox Code Playgroud)

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

git checkout <branch-name>
Run Code Online (Sandbox Code Playgroud)

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

git checkout -b <branch-name>
Run Code Online (Sandbox Code Playgroud)

要删除分支,请使用

git branch -d <branch-name>
Run Code Online (Sandbox Code Playgroud)

要使用当前分支的更改创建分支,请执行

git stash
git stash branch <branch-name>
Run Code Online (Sandbox Code Playgroud)

  • 你应该提一下git checkout -b <branch-name>的快捷方式,它创建一个分支并一步切换到它.它可能是初学者甚至高级git用户最常见的用例. (11认同)

Jer*_*all 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
Run Code Online (Sandbox Code Playgroud)

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


ald*_*dux 20

临Git的免费书绝对是我最喜欢的,特别适合初学者.


And*_*ew 18

Git Magic是你所需要的.品质保证,退款保证!

  • 叹了口气,我要钱了.Buggy软件(msysGit)带有不完整的教程(GitMagic)==工作时间,几乎不免费 (14认同)

Mar*_*ier 16

你如何合并分支机构?

如果要合并分支(例如,masterto release),请确保当前分支是您要合并到的目标分支(使用git branchgit status查看当前分支).

然后用

git merge master
Run Code Online (Sandbox Code Playgroud)

(master您要与当前分支合并的分支的名称).

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

git diff
Run Code Online (Sandbox Code Playgroud)

要查看您必须解决的待处理冲突.

  • 有一个git mergetool,用你最喜欢的工具做一个三向差异(gvimdiff,kdiff3或更多) (2认同)

Jor*_*dan 16

我也发现Git Internals非常有用.它由Scott Chacon(Pro Git的作者和Git Community Book的维护者)撰写.我喜欢Git Internals的是它首先关注概念然后关注命令,并且它是~100个小页面,它很容易消化.


Pie*_*tte 13

您如何看待文件修订的历史记录?

git log -- filename
Run Code Online (Sandbox Code Playgroud)


inn*_*naM 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
Run Code Online (Sandbox Code Playgroud)


Eri*_*fer 11

理解Git如何工作的真正好文章是Git Parable.非常推荐!


kre*_*ret 10

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

比较命令是git diff.

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

$ git diff <commit1> <commit2> <file_name>
Run Code Online (Sandbox Code Playgroud)

这使commit1与commit2区别开来; 如果你改变顺序,那么文件会反过来,这可能不是你所期望的......

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

$ git diff --staged <file_name>
Run Code Online (Sandbox Code Playgroud)

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

$ git diff <file_name>
Run Code Online (Sandbox Code Playgroud)


Pio*_*cki 9

为什么还有另一个方法?网上有很好的,比如git指南,非常适合开始.它有很好的链接,包括可以贡献的git书(托管在git hub上),这对于这个集体任务是完美的.

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

矿山,我才发现最近,被git stash解释在这里,这使您可以保存当前的工作,去到另一个分支

编辑:作为上一篇文章,如果你真的更喜欢stackoverlow格式与帖子作为维基我将删除这个答案


Dea*_*her 9

控制台UI - Tig

安装:

apt-get install tig
Run Code Online (Sandbox Code Playgroud)

用法

在git repo中输入'tig',查看交互式日志,在任何日志上点击'enter'以查看有关它的更多信息.h寻求帮助,其中列出了基本功能.

琐事

"Tig"是"Git"倒退.


has*_*sen 8

我开始使用官方的Git教程.我认为这对于初学者来说已经足够实用了(按照你的定义,我当时是,现在仍然是初学者!我几乎没有掌握makefile,我只使用了Apache Subversion等等).


inn*_*naM 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
Run Code Online (Sandbox Code Playgroud)

  • 为什么name_of_branch:name_of_branch? (11认同)

Fel*_*ino 8

如何删除远程存储库上的分支?

:在分支名称之前使用远程执行推送

git push origin :mybranchname
Run Code Online (Sandbox Code Playgroud)

origin您的遥控器mybranchname的名称和要删除的分支的名称

http://help.github.com/remotes/


dyl*_*nfm 7

推拉变化

以简化的方式,只做git pushgit pull.合并更改,如果存在冲突,git会通知您,您可以手动解决.

当您第一次推送到远程存储库时,您需要执行a git push origin master(master作为主分支).从那以后你就做了git push.

用标签推送标签git push --tags.


Dea*_*her 7

签出代码

首先转到空目录,使用"git init"将其作为存储库,然后将远程仓库克隆到您自己的存储库中.

git clone user@host.com:/dir/to/repo
Run Code Online (Sandbox Code Playgroud)

无论你最初克隆的地方是"git pull"默认拉出的地方.

  • 我认为clone会执行init步骤,因为您无需先运行init.git init主要用于创建第一个存储库,或者用于具有多个远程设置的特殊配置,而这些远程设置与标准克隆不同. (7认同)

non*_*one 5

WRT很好的GUI /前端,您可能还想查看qgit,它是Git的跨平台(Linux/Win32)存储库查看器,也可以用作最常见的Git操作的高级前端,实际上它可以是通过所谓的"自定义操作"轻松增强,以便用户可以提供自定义操作.


小智 5

在Windows上使用Msysgit在 Stack Overflow post Setup Git Server中严格添加Tim答案中的链接.

它完美地告诉我如何使用msysgit在Windows上设置Git ,这是一篇非常详细的文章.


Fel*_*ino 5

什么是变基?

Rebase解释摘自GIT的实用指南 - Travis Swicegood

第三章

16.通过重新定位重写历史

重新提交是Git中的一个概念,在传统的版本控制世界中没有对应的概念.使用git rebase,您可以通过各种方式重写存储库的历史记录.它是Git中最强大的命令之一,这使它成为最危险的命令之一.

rebase进行一系列提交(通常是一个分支)并在另一个提交(通常是另一个分支中的最后一次提交)之上重放它们.父提交会更改,以便重新计算所有提交ID.对于拥有代码的其他开发人员而言,这可能会导致问题,因为ID不匹配.

使用git rebase有一个简单的经验法则:在本地提交中尽可能多地使用它.一旦您与其他开发人员共享更改,通常不值得麻烦.