适合新手学习的git教程分享

Git 起源
同生活中的许多伟大事件一样,Git 诞生于一个极富纷争大举创新的年代。Linux 内核开源项目有着为数众广的参与者。绝大多数的 Linux 内核维护工作都花在了提交补丁和保存归档的繁琐事务上(1991-2002年间)。到 2002 年,整个项目组开始启用分布式版本控制系统 BitKeeper 来管理和维护代码。到了 2005 年,开发 BitKeeper 的商业公司同 Linux 内核开源社区的合作关系结束,他们收回了免费使用 BitKeeper 的权力。这就迫使 Linux 开源社区(特别是 Linux 的缔造者 Linus Torvalds )不得不吸取教训,只有开发一套属于自己的版本控制系统才不至于重蹈覆辙。他们对新的系统制订了若干目标:
Git 和其他版本控制系统的主要差别在于,Git 只关心文件数据的整体是否发生变化,而大多数其他系统则只关心文件内容的具体差异。这类系统(CVS,Subversion,Perforce,Bazaar 等等)每次记录有哪些文件作了更新,以及都更新了哪些行的什么内容.
Git 并不保存这些前后变化的差异数据。实际上,Git 更像是把变化的文件作快照后,记录在一个微型的文件系统中。每次提交更新时,它会纵览一遍所有文件的指纹信息并对文件作一快照,然后保存一个指向这次快照的索引。为提高性能,若文件没有变化,Git 不会再次保存,而只对上次保存的快照作一链接.这是 Git 同其他系统的重要区别。它完全颠覆了传统版本控制的套路,并对各个环节的实现方式作了新的设计。Git 更像是个小型的文件系统

1、创建新仓库

复制代码

代码如下:

gitinit
touchtest.txt
gitadd--a
gitcommit-m"fistcommit"

初始化新仓库,在当前目录下由一个.git的目录,所有git需要的数据和资源都放在这个目录中,在当面目录下添加文件后,需要通过gitadd添加到文件追踪管理(添加到暂存区,数据存放在.git/index目录索引,数据内部保存在.git/objects中),gitcommit-m"提交说明备注"提交的信息会提交到数据仓库,数据提交到正式仓库,具体保存在.git/objects中,如以上提交会包含一个commit,tree,blob对象。

2、从现有仓库克隆

复制代码

代码如下:

gitcloneurl
<a href="mailto:gitclonegit@github.com:torvalds/linux.git">gitclonegit@github.com:torvalds/linux.git</a>

如从gitHub上克隆一份linux的源码,不仅是克隆最新版本的源码,还克隆了所有数据仓库的历史版本,每个文件的每一个版本,这个时候及时服务器github发生故障,可以用本地数据仓库重建服务器上的仓库。可以回复到从服务器克隆或最后更一次从服务器拉去的状态。在.git目录中,已经保存了所有版本记录,本地文件夹即工作目录的所有文件删除了,然后从中取出最新版本的文件拷贝。

3、检查文件更新状态
要求确定当前工作区和暂存区文件的状态,可以通过gitstatus命令。在工作区和暂存区的目录状态可以查看。
gitstatus
Onbranchmasternothingtocommit,workingdirectoryclean
当前在默认master分支,当前工作目录和暂存区没有任何跟踪的文件,也没有任何文件提交后更改,也没有新增加,未被跟踪的文件。
notepadtest.txt
notepadt.txt
修改test.txt文件,新添加一个t.txt文件,查看当前文件状态。

复制代码

代码如下:

$gitstatus
#Onbranchmaster
#Changesnotstagedforcommit:
#(use"gitadd<file>..."toupdatewhatwillbecommitted)
#(use"gitcheckout--<file>..."todiscardchangesinworkingdi
#
#modified:test.txt
#
#Untrackedfiles:
#(use"gitadd<file>..."toincludeinwhatwillbecommitted)
#
#t.txt
nochangesaddedtocommit(use"gitadd"and/or"gitcommit-a")

新增加的文件t.txt在未跟踪文件范围Untrackedfiles范围,需要通过gitadd把改文件添加的暂存区,归入的版本跟踪管理。

4、添加文件到暂存区

复制代码

代码如下:

$gitadd.
$gitstatus
#Onbranchmaster
#Changestobecommitted:
#(use"gitresetHEAD<file>..."tounstage)
#
#modified:h.txt
#newfile:test.txt

gitadd.把当前所有目录文件所有新文件和修改文件添加到暂存区,如果test.txt文件提示是Changesnotstagedforcommit,说明此跟踪文件已经发生修改,但是还未添加到暂存区,把修改的文件通过gitadd命令添加到暂存区后。提示Changestobecommitted.文件已经暂存,随时可以提交到仓库。h.txt新添加文件从未跟踪状态Untrackedfiles,通过gitadd命令添加到暂存区,已加入跟踪文件的范围。

5、版本提交

复制代码

代码如下:

$gitcommit-m"thisistestcommit"
[masterd4a498a]thisistestcommit
gitcommit--amend--reset-author</p><p>2fileschanged,3insertions(+)
createmode100644t.txt

通过gitcommit-m"xxx"将当前暂存区的内容提交到仓库,本次commit提交文件是在默认master分支,提交commit对象存放在.git/objects的d4/1498a...的文件中,该文件指向一个树tree对象。

6、查看当前提交日志记录

复制代码

代码如下:

$gitlog
commitd4a498a197c24421acee5c5ff96cfbc7e5c3be9e
Author:andy<<a href="mailto:andy@gmail.com">andy@gmail.com</a>>
Date:SatMar814:23:372014+0800</p><p>thisistestcommit</p><p>commit80071e48614361dc282473d6482e3faa9fec17d9
Author:andy<<a href="mailto:andy@gmail.com">andy@gmail.com</a>>
Date:SatMar813:35:132014+0800</p><p>1stcommit

gitlog命令查看当前版本

7、文件差异比较

工作区和暂存区文件比较用gitdiff命令,暂存区和最近一天提交版本之间的差异,可以用gitdiff--cached/staged.如下:
目前在test.txt文件只有1111111文件内容,我在文件test.txt中添加22222222等内容,比较当前暂存区和工作文件差异

复制代码

代码如下:

$notepadtest.txt
$gitdiff
diff--gita/test.txtb/test.txt
index0147537..f33d264100644
---a/test.txt
+++b/test.txt
@@-1,3+1,4@@
11111111111111
+22222222222222
$gitstatus
#Onbranchmaster
#Changesnotstagedforcommit:
#(use"gitadd<file>..."toupdatewhatwillbecommitted)
#(use"gitcheckout--<file>..."todiscardchangesinworkingd
#
#modified:test.txt
#
nochangesaddedtocommit(use"gitadd"and/or"gitcommit-a")
$gitdiff--staged
可以发现工作区比暂存区test.txt文件多增加了22222222222222内容。暂存区和数据仓库内容是完全相同的。同时看看当前工作区状态。现在我们吧刚刚修改的内容添加到暂存区,同时比较暂存区和数据仓库文件差异。
$gitaddtest.txt
$gitdiff
$gitstatus
#Onbranchmaster
#Changestobecommitted:
#(use"gitresetHEAD<file>..."tounstage)
#
#modified:test.txt
#

把工作区修改的内容更新到暂存区后,可以看出此时暂存区和工作区文件完全相同。状态是是已暂存,带提交状态。与此同时,我们可以比较暂存区和数据残酷之间的差异和比较。

复制代码

代码如下:

$gitdiff--staged
diff--gita/test.txtb/test.txt
index0147537..f33d264100644
---a/test.txt
+++b/test.txt
@@-1,3+1,4@@
11111111111111
+22222222222222

我们可以很清楚的看到当前暂存区和数据仓库版本比较。暂存区test.txt内容比最近一次提交内容多22222222222222一行数据。提交数据到数据仓库。我们现在可以把工作区目录和数据仓库比较,看看test.txt直接的文件内容差异。

复制代码

代码如下:

$gitdiffhead
diff--gita/test.txtb/test.txt
index0147537..f33d264100644
---a/test.txt
+++b/test.txt
@@-1,3+1,4@@
11111111111111
+22222222222222

可以很立即看出工作区文件内容比较仓库有新修改的内容。此时我们提交更新所有文件都没有差异了。看看文件差异。

复制代码

代码如下:

$gitcommit-m"testgitdiff"
[masterfc0166f]testgitdiff
Committer:andy<<a href="mailto:andy@gmail.com">andy@gmail.com</a>></p><p>gitcommit--amend--reset-author</p><p>1filechanged,1insertion(+)
$gitdiff
$gitdiff--staged
$gitdiffhead

8、文件删除和移动

所有的工作区rmxxx删除后,可以直接从数据仓库获取最近一次提交版本的内容gitrmxxx。直接从数据仓库删除此文件内容。

复制代码

代码如下:

$ls
h.txttest.txt</p><p>$rmh.txt</p><p>$ls
test.txt</p><p>$gitdiff
diff--gita/h.txtb/h.txt
deletedfilemode100644
index456f979..0000000
---a/h.txt
+++/dev/null
@@-1,3+0,0@@
-welcometohere
-verygood

可以通过文某比较当前的工作目录h.txt文件已经被删除了,工作区目录和暂存区比较文件差异也可以返现文件删除模式。接下来删除暂存区目录

复制代码

代码如下:

$gitdiff--staged</p><p>$gitrmh.txt
rm'h.txt'</p><p>$gitdiff--staged
diff--gita/h.txtb/h.txt
deletedfilemode100644
index456f979..0000000
---a/h.txt
+++/dev/null
@@-1,3+0,0@@
-welcometohere
-verygood
-
$gitstatus
#Onbranchmaster
#Changestobecommitted:
#(use"gitresetHEAD<file>..."tounstage)
#
#deleted:h.txt
#

通过删除暂存区文件前后可以比较出文件的差异。此时文件也不在跟踪状态。还有我们仅仅希望删除暂存区的内容,不删除工作区的内容

复制代码

代码如下:

gitrm--cached-fh.txt的方式来实现,特别是针对工作区有修改,要删除暂存区内容。
$gitreset--hard
HEADisnowatfc0166ftestgitdiff</p><p>$ls
h.txttest.txt
$gitrm--cachedh.txt
rm'h.txt'</p><p>$gitdiff</p><p>$gitdiffhead
diff--gita/h.txtb/h.txt
deletedfilemode100644
index456f979..0000000
---a/h.txt
+++/dev/null
@@-1,3+0,0@@
-welcometohere
-verygood
-
$gitdiff-cached
error:invalidoption:-cached</p><p>$gitdiff--cachedh.txt
diff--gita/h.txtb/h.txt
deletedfilemode100644
index456f979..0000000
---a/h.txt
+++/dev/null
@@-1,3+0,0@@
-welcometohere
-verygood

移动
git移动文件操作是是相对先移动复制一个新文件,删除原文件,添加新文件到跟踪范围。

复制代码

代码如下:

$ls
h.txttest.txt</p><p>$gitmvh.txtd.txt结果是等同于,相当于以下三条命令</p><p>$ls
d.txttest.txt</p><p>$mvd.txtto.txt</p><p>$gitrmd.txt
rm'd.txt'</p><p>$gitaddto.txt

9、查看提交历史

复制代码

代码如下:

$gitlog
commitfc0166f53a45cfc4c17079e5e3454fb7e3136cb6
Author:andy<<a href="mailto:andy@gmail.com">andy@gmail.com</a>>
Date:SatMar815:52:102014+0800</p><p>testgitdiff</p><p>commitd6eab3a38aee0b25ac395899c82edd48723a2ea9
Author:andy<<a href="mailto:andy@gmail.com">andy@gmail.com</a>>
Date:SatMar815:36:532014+0800</p><p>enforcecommit'</p><p>commit85ec024140442df6db8625a07c2ee7369cceb704
Author:andy<<a href="mailto:andy@gmail.com">andy@gmail.com</a>>
Date:SatMar815:35:442014+0800

com3
gitlog查看提交历史,gitlog-p-n最近n次提交的内能和差异。查看历史记录统计信息gitlog--stat,查看提交的历史记录格式可自由选择。

复制代码

代码如下:

$gitlog--pretty=format:"%h-%an,%ar:%s"
fc0166f-yyf,48minutesago:testgitdiff
d6eab3a-yyf,63minutesago:enforcecommit'
85ec024-yyf,65minutesago:com3
d4a498a-unknown,2hoursago:thisistestcommit
80071e4-unknown,3hoursago:1stcommit

列出了常用的格式占位符写法及其代表的意义。

选项说明
%H提交对象(commit)的完整哈希字串
%h提交对象的简短哈希字串
%T树对象(tree)的完整哈希字串
%t树对象的简短哈希字串
%P父对象(parent)的完整哈希字串
%p父对象的简短哈希字串
%an作者(author)的名字
%ae作者的电子邮件地址
%ad作者修订日期(可以用-date=选项定制格式)
%ar作者修订日期,按多久以前的方式显示
%cn提交者(committer)的名字
%ce提交者的电子邮件地址
%cd提交日期
%cr提交日期,按多久以前的方式显示
%s提交说明
$gitlog--pretty=format:"%h%s"--graph
*78d907adevbranchcommit
*fc0166ftestgitdiff
*d6eab3aenforcecommit'
*85ec024com3
*d4a498athisistestcommit
*80071e41stcommit

选项说明
-p按补丁格式显示每个更新之间的差异。
--stat显示每次更新的文件修改统计信息。
--shortstat只显示--stat中最后的行数修改添加移除统计。
--name-only仅在提交信息后显示已修改的文件清单。
--name-status显示新增、修改、删除的文件清单。
--abbrev-commit仅显示SHA-1的前几个字符,而非所有的40个字符。
--relative-date使用较短的相对时间显示(比如,“2weeksago”)。
--graph显示ASCII图形表示的分支合并历史。
--pretty使用其他格式显示历史提交信息。可用的选项包括oneline,short,full,fuller和format(后跟指定格式)

10、撤销操作

可以修改最后一次提交的内容,当你发现最近一次提交内容不正确时候,可以通过gitcommit--amend修改

复制代码

代码如下:

$gitcommit--amend-m"modifycommit"
[masterc660522]modifycommit
$gitlog--oneline
c660522modifycommit
fc0166ftestgitdiff
d6eab3aenforcecommit'
85ec024com3
d4a498athisistestcommit
80071e41stcommit

11、取消文件修改

复制代码

代码如下:

gitreset|gitresethead将head指向的目录树重置的暂存区
gitreset--softhead^工作区和暂存区不变,但是引用向前回退一次,当对最新提交不满意的时候,撤销最新提交以便更改
gitcommit-e-F.git/COMMIT_EDITMSG以上两个命令相当于gitcommit--amend
gitresethead^
gitreset--mixedhead^暂存区和引用回退到上一次提交之前
gitreset--hardhead^引用工作区暂存区彻底消除

(0)

相关推荐

  • 神雕侠侣手机版宠物养成教程分享

    操作方法 01 神雕侠侣手机版宠物的重要性不言而喻,侠客.宠物.装备是这游戏的三大玩法,宠物的养成一直是大家想知道的.下面是神雕侠侣手游宠物养成教程分享,手把手教大家如何培养宠物. 基础属性 1.基础 ...

  • SwitchHosts for Mac好不好?switchhosts mac版功能特色及使用教程分享

    SwitchHosts for Mac好不好?SwitchHosts for Mac如何使用?SwitchHosts是一款集管理.切换 N 个 Hosts 方案的开源软件,基于 wxPython 开发 ...

  • MusicBee好不好?音乐管理与收藏软件MusicBee优缺点评测及使用教程分享

    MusicBee怎么样?musicbee好用吗?如果你只是偶尔听听音乐,用酷我.酷狗.百度之类的音乐盒在线听听就够了:如果经常下载音乐但是音乐不多的话用 foobar2000.千千静听的也够用(小众之 ...

  • pdf eraser pro key是多少?PDF Eraser Pro注册码及安装破解教程分享

    PDF Eraser Pro就是一款小巧轻便的PDF橡皮擦,也可以说是PDF编辑工具.它能够直接.快速将PDF中的文字.图片等内容进行擦除,并且还支持切割DFP页面以及去除水印等操作.接下来小编将给大 ...

  • 五笔字根基础学习和使用教程

    相信很多小伙伴都有听说过五笔字根但却不知道怎么使用,下面小编就来为大家介绍的它的用法.具体如下:1. 要想记住五笔字根,我们就要先理解它的构成.键盘上的按键会被分成五个区域,分别代表点横撇折捺,而且都 ...

  • 王者荣耀哪个英雄适合新手?

    对于新手玩家来说选择英雄是一个很苦恼的问题,毕竟王者峡谷那么多英雄.你并不知道哪个强,也并不知道哪个容易玩,生怕一个不小心选了一个不会玩的英雄就很糟心了,毕竟每个英雄都要花很多金币去买.王者荣耀其实适 ...

  • 八门神器iOS安装图文教程分享

    被iPhone/iPad游戏玩家称为"金手指"的八门神器日前终于更新完美支持iOS7了[详细].不过,对于这样一款修改.破解游戏的万能法宝,不少新入门的朋友估计还不太了解八门神器怎 ...

  • 剑灵什么职业适合新手平民?剑灵哪个职业最好玩?

    剑灵什么职业适合新手平民?剑灵哪个职业最好玩?剑灵有很多的职业,攻击,辅助,防御,还有就是不同组合的职业,所以很多人玩剑灵都不知道选择什么职业比较好,也不知道剑灵什么职业特别好玩,比较适合新手平民! ...

  • 松下 P-01D 获得root权限,亲测教程分享

    松下 P-01D作为安卓入门手机,有红.蓝.绿.白四种色系,可更换其它颜色的后盖,手机小巧,深受女性欢迎.松下P-01D如何root?松下P-01D怎么ROOT?童鞋的松下P-01D一键获得root权 ...