Git是当今最流行的版本控制工具。这几年GitHub也干掉了GoogleCode和Sourceforge,从三大代码仓库中脱颖而出,除了GitHub自身的优秀外,Git也是功不可没。
为何Git如此出众呢?这是因为Git保存的不是文件的变化或者差异,而是一系列不同时刻的文件快照,同时支持分支模型。Git处理分支的方式可谓是难以置信的轻量,创建新分支这一操作几乎能在瞬间完成,并且在不同分支之间的切换操作也是一样便捷。与许多其它版本控制系统不同,Git鼓励在工作流程中频繁地使用分支与合并,哪怕一天之内进行许多次。
这里,我简单地总结一了下Git的命令行命令
如果你打算使用 Git 来对现有的项目进行管理,你只需要进入该项目目录并输入:
该命令将创建一个名为.git的子目录,这个子目录含有你初始化的Git仓库中所有的必须文件,这些文件是Git仓库的骨干。
可以查看修改状态
也可以使用git status -s命令或git status --short命令,你将得到一种更为紧凑的格式输出。
实现对指定文件的跟踪,然后执行git commit暂存已修改文件
Git可以暂存一个已跟踪文件的修改记录,其实只不过暂存了运行git add命令时的版本,如果现在提交,提交文件的版本是你最后一次运行git add命令时的那个版本,而不是运行git commit时,在工作目录中的当前版本。所以,运行了git add之后又作了修订的文件,需要重新运行git add把最新版本重新暂存起来
要从Git中移除某个文件,就必须要从已跟踪文件清单中移除(确切地说,是从暂存区域移除),然后提交。可以用git rm命令完成此项工作,并连带从工作目录中删除指定的文件,这样以后就不会出现在未跟踪文件清单中了。
运行git mv就相当于运行了下面三条命令:
同时可以使用mv命令实现修改文件名称。不管是直接使用git mv还是使用上述三个操作,Git都会意识到这是一次改名,所以不管何种方式结果都一样。两者唯一的区别是,mv是一条命令而另一种方式需要三条命令,直接用git mv轻便得多。
git diff命令让你知道当前做的哪些更新还没有暂存,同时也可以知道有哪些更新已经暂存起来准备好了下次提交。
现在的暂存区域已经准备妥当可以提交了。在此之前,请一定要确认还有什么修改过的或新建的文件还没有git add过,否则提交的时候不会记录这些还没暂存起来的变化。
这些修改过的文件只保留在本地磁盘。所以,每次准备提交前,先用git status看下,是不是都已暂存起来了,然后再运行提交命令git commit
这种方式会启动文本编辑器以便输入本次提交的说明。会启用默认指定的软件编辑,可以按照,使用git config --global core.editor命令设定指定的编辑软件。
另外,你也可以在 commit 命令后添加 -m 选项,将提交信息与命令放在同一行
给git commit加上-a选项,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过git add步骤
在提交了若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史。完成这个任务最简单而又有效的工具是git log命令。
在任何一个阶段,都有可能想要撤消某些操作,有些撤消操作是不可逆的。
有时候我们提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了。此时,可以运行带有--amend选项的提交命令尝试重新提交
最终你只会有一个提交 - 第二次提交将代替第一次提交的结果。
已经修改了两个文件并且想要将它们作为两次独立的修改提交,但是却意外地输入了git add *暂存了它们两个。如何只取消暂存两个中的一个呢?
可以使用git reset HEAD撤销一次提交
几乎所有的版本控制系统都以某种形式支持分支。 使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线。
Git保存的不是文件的变化或者差异,而是一系列不同时刻的文件快照。而所谓的Git分支,就是指向一个快照的指针。
Git的默认分支名字是master。我们可以创建新的分支。比如,创建一个testing分支,只需要使用git branch命令:
同时有一个名为HEAD的特殊指针,指向当前分支。
使用git branch命令可以查看所有分支,当前分支(HEAD指向的分支)前面会带有*
要切换到一个已存在的分支,你需要使用 git checkout 命令。 我们现在切换到新创建的 testing 分支去:
这样 HEAD 就指向 testing 分支了。
你可以在不同分支间不断地来回切换和工作,并在时机成熟时将它们合并起来。而所有这些工作,你需要的命令只有branch、checkout 和commit。
git可以将当前分支合并回其他分支。可以使用git merge命令来达到上述目的:
rebase(变基)命令将提交到某一分支上的所有修改都移至另一分支上,就好像“重新播放”一样。
简单来说:merge操作会生成一个新的节点,之前的提交分开显示。而rebase操作不会生成新的节点,是将两个分支融合成一个线性的提交。
可以使用带-d选项的git branch命令来删除分支:
为了能在任意Git项目上协作,你需要知道如何管理自己的远程仓库。远程仓库是指托管在因特网或其他网络中的你的项目的版本库。
一个项目可以有好几个远程仓库,通常有些仓库对你只读,有些则可以读写。远程仓库需要有个名字,origin是Git给你克隆的仓库服务器的默认名字
与他人协作涉及管理远程仓库以及根据需要推送或拉取数据。管理远程仓库包括了解如何添加远程仓库、移除无效的远程仓库、管理不同的远程分支并定义它们是否被跟踪等等。
git clone命令会自动设置本地master分支跟踪克隆的远程仓库的master分支。运行git pull通常会从最初克隆的服务器上抓取数据并自动尝试合并到当前所在的分支。
如果想查看你已经配置的远程仓库服务器,可以运行git remote命令。它会列出你指定的每一个远程服务器的简写。
运行git remote add 添加一个新的远程Git仓库
从远程仓库中获得数据,可以执行
这个命令会访问远程仓库,从中拉取所有你还没有的数据。执行完成后,你将会拥有那个远程仓库中所有分支的引用,可以随时合并或查看。
只有当你有所克隆服务器的写入权限,并且之前没有人推送过时,这条命令才能生效。当你和其他人在同一时间克隆,他们先推送到上游然后你再推送到上游,你的推送就会毫无疑问地被拒绝。你必须先将他们的工作拉取下来并将其合并进你的工作后才能推送。
如果想要查看某一个远程仓库的更多信息,可以使用 git remote show [remote-name] 命令。
如果想要重命名引用的名字可以运行git remote rename去修改一个远程仓库的简写名
值得注意的是这同样也会修改你的远程分支名字
如果因为一些原因想要移除一个远程仓库,可以使用git remote rm
当你切换了本地分支,但是在push的时候,不指定分支,事实上还是在向默认的origin/master。
因此如果你希望你的分支能够被提交到远程服务器上,让其他人也能看到他。需要执行git push (remote) (branch),例如:
这样在远程服务器上便创建了origin/testing分支。
可以运行带有--delete选项的git push命令来删除一个远程分支。
通常我们在使用Git的时候,都会在master分支上保留完全稳定的代码——有可能仅仅是已经发布或即将发布的代码。
同时还有一些名为develop的平行分支,被用来做后续开发或者测试稳定性——这些分支不必保持绝对稳定,但是一旦达到稳定状态,它们就可以被合并入 master 分支了。
这样,在确保这些已完成的特性分支能够通过所有测试,并且不会引入更多 bug 之后,就可以合并入主干分支中,等待下一次的发布。
同时高水平的程序员也可以在review水平较低的程序员后,再合并代码。
这个过程我们叫Git工作流
Git可以给历史中的某一个提交打上标签,以示重要
Git使用两种主要类型的标签:轻量标签(lightweight)与附注标签(annotated)。
一个轻量标签很像一个不会改变的分支 - 它只是一个特定提交的引用。
附注标签是存储在 Git 数据库中的一个完整对象。可以包含打标签者的名字、电子邮件地址、日期时间等等
在Git中创建一个附注标签是很简单的。最简单的方式是当你在运行tag命令时指定-a选项。-m选项指定了一条将会存储在标签中的信息。
另一种给提交打标签的方式是使用轻量标签。创建轻量标签,不需要使用-a、-s或-m选项,只需要提供标签名字。
git push命令并不会传送标签到远程仓库服务器上。在创建完标签后你必须显式地推送标签到共享服务器上。可以运行
在Git中不能真的检出一个标签,因为它们并不能像分支一样来回移动。如果想要工作目录与仓库中特定的标签版本完全一样,可以使用
这实际是在特定的标签上创建一个新分支