Git

原理

svn等CVCS(集中版本控制系统)的保存方式,基于变化比对


image

git(DVCS,分布式版本控制系统)的保存方式


git快照方式

所有保存在 Git 数据库中的东西都是用此哈希值来作索引的,而不是靠文件名
对于任何一个文件,在 Git 内都只有三种状态:已提交(committed),已修改(modified)和已暂存(staged)。已提交表示该文件已经被安全地保存在本地数据库中了;已修改表示修改了某个文件,但还没有提交保存;已暂存表示把已修改的文件放在下次提交时要保存的清单中。

image

基础配置

配置文件位置

  • /etc/gitconfig 文件:系统中对所有用户都普遍适用的配置。若使用 git config 时用 --system 选项,读写的就是这个文件。
  • ~/.gitconfig 文件:用户目录下的配置文件只适用于该用户。若使用 git config 时用 --global 选项,读写的就是这个文件。
  • 当前项目的 Git 目录中的配置文件(也就是工作目录中的 .git/config 文件):这里的配置仅仅针对当前项目有效。每一个级别的配置都会覆盖上层的相同配置,所以 .git/config 里的配置会覆盖 /etc/gitconfig 中的同名变量。
  • 在 Windows 系统上,Git 会找寻用户主目录下的 .gitconfig 文件。主目录即HOME 变量指定的目录,一般都是 C:\Documents and Settings$USER。此外,Git 还会尝试找寻 /etc/gitconfig 文件,只不过看当初 Git 装在什么目录,就以此作为根目录来定位。

用户基础信息配置

查看已有配置信息(如果配置有重复,实际采用的是最后一个)

git config --list

查看单个配置信息

git config property

用户信息配置:

$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com

默认编辑器设置(输入额外消息是git会自动调用)

$ git config --global core.editor emacs

基本使用

仓库使用

初始化仓库

git init

添加新文件到修改列表

git add fileName 

commit到本地

git commit -m 'info'

克隆一个仓库

git clone (git|http(s))://[url]

克隆一个仓库并设置项目目录名称

git clone [url] directoryName

更新操作

image

追踪新文件/保存更改,并更新到stage状态

git add filename

commit所有已修改文件

git commit -a

附加本次修改到上次commit

git commit --amend

ignore

文件 .gitignore 的格式规范如下:

  • 所有空行或者以注释符号 # 开头的行都会被 Git 忽略。
  • 可以使用标准的 glob 模式匹配。
  • 匹配模式最后跟反斜杠(/)说明要忽略的是目录。
  • 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。

example:

# 此为注释 – 将被 Git 忽略
# 忽略所有 .a 结尾的文件
*.a
# 但 lib.a 除外
!lib.a
# 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO
/TODO
# 忽略 build/ 目录下的所有文件
build/
# 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt
doc/*.txt
# 忽略 doc/ 目录下所有扩展名为 txt 的文件
doc/**/*.txt

将文件从vcs中移除

git rm filename

重置修改的文件

git reset HEAD <file>
git checkout -- <file>

远程仓库

显示远程仓库信息

git remote -v

添加远程仓库

git remote add [shortname] [url]

拉取远程仓库,不会对当前分支进行任何处理

git fetch [remote-name]

将远端分支自动合并到本地仓库中当前分支

 git pull

推送本地分支到远程分支

git push [remote-name] [branch-name]

显示所有远程和本地分支

git remote show [remote-name]

远程仓库重命名

git remote rename [remote-name] [new-remote-name]

移除远程仓库

git remote rm [remote-name]

标签

显示所有标签

git tag

寻找特定标签,支持模糊匹配

git tag -l 'v1.2.*'

创建包含附注的标签

git tag -a v1.4 -m 'information'

创建轻量级标签

git tag [tag-name]

显示标签详细信息

git show [tag-name]

分支

一次提交包含的信息


image

多次提交之间的关联


分支逻辑

Git 中的分支,其实本质上仅仅是个指向 commit 对象的可变指针。Git 会使用 master 作为分支的默认名字。在若干次提交后,你其实已经有了一个指向最后一次提交对象的 master 分支,它在每次提交的时候都会自动向前移动。

创建分支,实质如下图

git branch [brance-name]
image

Git 是如何知道你当前在哪个分支上工作的呢?其实答案也很简单,它保存着一个名为 HEAD 的特别指针。请注意它和你熟知的许多其他版本控制系统(比如 Subversion 或 CVS)里的 HEAD 概念大不相同。在 Git 中,它是一个指向你正在工作中的本地分支的指针(译注:将 HEAD 想象为当前分支的别名。)。运行 git branch 命令,仅仅是建立了一个新的分支,但不会自动切换到这个分支中去,所以在这个例子中,我们依然还在 master 分支里工作


image

切换到分支

git checkout [brance-name]

创建分支并切换

git checkout -b [branch-name]

如果顺着一个分支走下去可以到达另一个分支的话,那么 Git 在合并两者时,只会简单地把指针右移,因为这种单线的历史分支不存在任何需要解决的分歧,所以这种合并过程可以称为快进(Fast forward)

删除分支,由于这些分支中还包含着尚未合并进来的工作成果,所以简单地用 git branch -d 删除该分支会提示错误,因为那样做会丢失数据

git branch -d [branch-name]

强制删除

git branch -d [branch-name]

将[branch-name]上的修改合并到当前分支

git merge [branch-name]
image

分支管理

列出本地分支

git branch

列出本地分支最后一次提交

git branch -v 

哪些分支是当前分支的直接上游

git branch --merged

尚未合并的

git branch --no-merged

推送本地分支到远程,如果远程与本地命名相同,可以省略远程分支名

git push [remote-name] [local-brance-name]:[remote-branch-name]

将远程分支合并到本地当前分支

git merge [remote-name]/[remote-branch-name]

根据远程分支创建本地分支

git checkout -b [local-branch-name] [remote-name]/[remote-branch-name]

根据远程分支创建本地分支

git checkout --trace [remote-name]/[branch-name]

删除远程分支

git push [remote-name]:[remote-branch-name]

实际上是在这里提取空白然后把它变成[远程分支]

git push [远程名] [本地分支]:[远程分支]

变基

在experiment分支执行

git rebase master
image
把 C3 里产生的改变到 C4 上重演一遍

另类变基

image
image

不用切换分支的rebase方式

git rebase [target-branch] [feature-branch]

一旦分支中的提交对象发布到公共仓库,就千万不要对该分支进行变基操作

在进行变基的时候,实际上抛弃了一些现存的提交对象而创造了一些类似但不同的新的提交对象。如果你把原来分支中的提交对象发布出去,并且其他人更新下载后在其基础上开展工作,而稍后你又用 git rebase 抛弃这些提交对象,把新的重演后的提交对象发布出去的话,你的合作者就不得不重新合并他们的工作,这样当你再次从他们那里获取内容时,提交历史就会变得一团糟。

stash

储藏”“可以获取你工作目录的中间状态——也就是你修改过的被追踪的文件和暂存的变更——并将它保存到一个未完结变更的堆栈中,随时可以重新应用

git stash

查看储藏列表

git stash list

应用最近的储藏

git stash apply

置顶储藏并应用

git stash apply stash@{2}

丢弃储藏

git stash drop stash@{0}

保存具名储藏

git stash save "content"

正则应用储藏

git stash apply stash^{/content}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容

  • Git常用语法 [TOC] Git简介 描述 ​ Git(读音为/gɪt/。)是一个开源的分布式版本控制系统,...
    君惜丶阅读 3,497评论 0 13
  • Git是目前最流行的版本管理系统,也是最先进的分布式版本控制系统(distributed version cont...
    pro648阅读 5,676评论 1 17
  • 1. 安装 Github 查看是否安装git: $ git config --global user.name "...
    Albert_Sun阅读 13,631评论 9 163
  • 编程并不像大家想象的那么可怕 实际上编程并不像大家想象中的那样有多深奥,有多难懂。似乎只有站在业界最前沿的一小撮人...
    vardump阅读 130评论 0 0
  • 接续上个系列C语言基础及指针 引言 在学习了C语言基础之后 ,我们简单的了解了C语言编程的一些范式 , 了解了指针...
    逝我阅读 17,090评论 11 35