GIT

Git学习笔记


Git 与 Github对接:

cd 到当前文档

git init初始化git

git add -A 将所有文件提交到暂存区

git commit -m "xxx"将所有暂存区文件提交仓库

git remote add origin git@github.com:xiucode/font-end-beginner.git对接远程库

git clone git@github.com:xiuocde/gitskills.git直接把远程仓库克隆到本地

git fetch origin从远程库拉取内容到本地,不合并

git pull从远程库拉取内容到本地,并且合并

git push origin master将本地仓库推送到远程仓库

git pull根据远程仓库更新本地仓库

基本概念

对于任何一个文件,在 Git 内都只有三种状态:已提交 (committed),已修改(modified)和已暂存(staged)。

已提交表示该文件已经被安全地保存在本地数据库中了;

已修改表示修改了某个文件,但还没有提交保存;

已暂存表示把已修改的文件放在下次提交时要保存的清单中。

由此我们看到 Git 管理项目时,文件流转的三个工作区域:Git 的本地数据目录,工作目录以及暂存区域。

请记住,工作目录下面的所有文件都不外乎这两种状态:已跟踪或未跟踪。

已跟踪的文件是指本来就被纳入版本控制管理的文件,在上次快照中有它们的记录,工作一段时间后,它们的状态可能是未更新,已修改或者已放入暂存区。而所有其他文件都属于未跟踪文件。它们既没有上次更新时的快照,也不在当前的暂存区域。

初次克隆某个仓库时,工作目录中的所有文件都属于已跟踪文件,且状态为未修改。在编辑过某些文件之后,Git 将这些文件标为已修改。我们逐步把这些修改过的文件放到暂存区域,然后等 最后一次性提交暂存区域的所有文件更新,如此重复。

基本的 Git 工作流程如下所示:


在工作目录中修改某些文件。

对这些修改了的文件作快照,并保存到暂存区域。

提交更新,将保存在暂存区域的文件快照转储到 git 目录中。

add负责将单个文件一次加入暂存区,commit负责将暂存区的文件“一股脑”全都存进仓库之中。


初次运行 Git 前的配置

Git 提供了一个叫做 git config 的工具(译注:实际是 git-config 命令,只不过可以通过 git 加一个 名字来呼叫此命令。),专门用来配置或读取相应的工作环境变量。而正是由这些环境变量,决定了 Git 在 各个环节的具体工作方式和行为。这些变量可以存放在以下三个不同的地方:

/etc/gitconfig文件:系统中对所有用户都普遍适用的配置。若使用 git config 时用 —system 选项,读写 的就是这个文件。

~/.gitconfig文件:用户目录下的配置文件只适用于该用户。若使用 git config 时用 —global 选项,读写 的就是这个文件。

当前项目的 git 目录中的配置文件(也就是工作目录中的 .git/config 文件):这里的配置仅仅针对当前 项目有效。每一个级别的配置都会覆盖上层的相同配置,所以 .git/config 里的配置会覆盖 /etc/gitconfig 中的同名变量。

配置姓名、邮箱和编辑器

git config --global user.name"Xiu Yuliang"

git config --global user.email yuliangxiu@gmail.com

git config --global core.editor sublime

解决合并冲突时使用哪种差异分析工具

Git 可以理解 kdiff3,tkdiff,meld,xxdiff,emerge,vimdiff,gvimdiff,ecme,rge,和opendiff等合并工具的输出信息

git config --global merge.tool vimdiff

查看已有的配置信息

git config --list

寻求帮助

githelp

如果用了 —global 选项,那么更改的配置文件就是位于你用户主目录下的那个,以后你所有的项目都会默 认使用这里配置的用户信息。如果要在某个特定的项目中使用其他名字或者电邮,只要去掉 —global 选项重 新配置即可,新的设定保存在当前项目的 .git/config 文件里。

具体 Git 操作

建立版本库的基础操作

git init:要对现有的某个项目开始用 Git 管理,只需到此项目所在的目录

git add *.c:开始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时 把有冲突的文件标记为已解决状态等

git clone git://github.com/schacon/grit.git mygrit克隆仓库,并命名为mygrit

git status:查看文件状态

git cat readme.txt抓取当前的文件,打开查看内容

cat .gitignore:忽略某些文件

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

所有空行或者以注释符号# 开头的行都会被 Git 忽略。

可以使用标准的 glob 模式匹配。

匹配模式最后跟􏰄斜杠(/)说明要忽略的是目录。

要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取􏰄。

所谓的 glob 模式是指 shell 所使用的简化了的正则表达式。星号(*)匹配零个或多个任意字符;[abc] 匹配 任何一个列在方括号中的字符(这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c);问号(?) 只匹配一个任意字符;如果在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配 (比如 [0-9] 表示匹配所有 0 到 9 的数字)。

我们再看一个 .gitignore 文件的例子:

# 此为注释 – 将被 Git 忽略

*.a# 忽略所有 .a 结尾的文件

!lib.a# 但 lib.a 除外

/TODO# 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO build/ # 忽略 build/ 目录下的所有文件

doc/*.txt# 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt

查看版本差异

git diff: 比较的是工作目录中当前文件和暂存区域快照之间的差异

git diff --cached: 已经暂存起来的文件和上次提交时的快照之间的差异

git diff HEAD -- readme.txt: 工作目录中文件与仓库中文件的比对

commit提交

$ git commit:提交命令

$ git commit -m "Story 182: Fix benchmarks for speed"也可以使用 -m 参数后跟提交说明的方式

git commit -a -m 'added new benchmarks'给 git commit 加上 -a 选项,Git 就会自动把所有已经跟踪过的文件暂 存起来一并提交,从而跳过 git add

git reset --hard HEAD^回溯到上一个版本,上上个版本用HEAD^^

git reset --hard id回溯到id号指示的那一个版本

git reflog展示你对仓库的所有操作轨迹,这样即使你删除了某一个版本(git log无法显示此删除版本的id号码),也可以荣国reflog重新找到你的那次操作,从而查到id号码

samusakaisuketekiMacBook-Pro:learngit Personals$ git reflog

869f440 HEAD@{0}: reset: moving to 869f44020

1818601 HEAD@{1}: reset: moving to HEAD^

869f440 HEAD@{2}: commit: git commit -m "append the GPL"

1818601 HEAD@{3}: commit: second commit

a8e553a HEAD@{4}: commit (initial): wrote a readme file

移除和重命名

rm test:简单的移除工作文件操作

git rm test git commit -m "remove the test":移除该文件的版本库中的文件

git checkout -- test如果只是删除了工作区中的文件,可以从版本库中还原删除的文件

git rm -f test:当文件已经存在于暂存区的时候,删除工作文件

git rm --cached test:当文件已经存在于暂存区的时候,删除暂存文件

git mv README.txt README:文件重命名,并同时自动设定跟踪新文件

git checkout -- benchmarks.rb取消文件修改(工作区的文件),回退到上一次add或者commit之后的状态,用版本库/暂存区里面的版本替换工作区的版本,如果文件在暂存区和版本库都有,则用暂存区的版本来替换掉

git reset HEAD readme.txt取消文件修改(提交到暂存区文件),将文件放回工作区,HEAD表示最新版本

查看操作历史

git log -p -2 --stat查看操作历史,我们常用 -p 选项展开显示每次提交的内容差异,用 -2 则仅显示最近的两次更新,—stat仅仅显示简要的增改行数变化

git log --pretty=oneline单行显示

$ git log --pretty=format:"%h - %an, %ar : %s"定制要显示的记录格式,这样的输出便于后期编程提取分析

$ git log --pretty="%h:%s" --author=gitster --since="2008-10-01" \ --before="2008-11-01" --no-merges -- t/加上时间段和确定作者的输出

$ git commit --amend重新提交(比如刚才提交后发现修改有错误或者忘记add一些文件)

gitk图形界面

git lg自己编辑的五彩斑斓log

远程push和pull

$ git remote -v查看远程库(包含远程库的地址),显示抓取和推送的origin地址

git remote -v

origin git@github.com:xiucode/learngit.git (fetch)

origin git@github.com:xiucode/learngit.git (push)

$ git remote add pb git://github.com/paulboone/ticgit.git要添加一个新的远程仓库,可以指定一个简单的名字,以便将来引用

$ git fetch pd此命令会到远程仓库中拉取所有你本地仓库中还没有的数据,fetch 命令只是将远端的数据拉到本地仓库,并不自动合并到当前工作分支,只有当你确实准备好 了,才能手工合并

git pull从原始克隆的远 端仓库中抓取数据后,合并到工作目录中当前分支

$ git push origin master将本地仓库中的数据推送到远程仓库,如果

在你推数据前,已经有其他人推送了若干更新,那你的推送操作就会被驳回。你必须先把他们的更新抓取到本

地,并到自己的项目中,然后才可以再次推送。

$ git push origin dev推送其他的分支

git checkout -b dev origin/dev创建本地分支并且对接云端已有的dev分支,方便push


不同的推送需求


git remote show origin查案远程仓库详细信息

git remote origin

git remote add pb git://github.com/paulboone/ticgit.git

$ git remote -v

origin git://github.com/schacon/ticgit.git

pb git://github.com/paulboone/ticgit.git

实际情况比较复杂:

git remote show origin * remote origin

URL: git@github.com:defunkt/github.git

Remote branch merged with 'git pull' while on branch issues

issues

Remote branch merged with 'git pull' while on branch master

master

New remote branches (next fetch will store in remotes/origin)

caching

Stale tracking branches (use 'git remote prune')

libwalker

walker2

Tracked remote branches

acl

apiv2 dashboard2 issues master postgres

Local branch pushed with 'git push' master:master

运行 git push 时缺省推送的分支是什么(译注:最后两行)。

它还显示了有哪些远端分支还 没有同步到本地(译注:第六行的 caching 分支),哪些已同步到本地的远端分支在远端服务器上已被删除(译注:Stale tracking branches 下面的两个分支)

以及运行 git pull 时将自动合并哪些分支(译注:前四行中列出的 issues 和 master 分支)。

$ git remote rename pb paul远程仓库的重命名

$ git remote rm paul移除远端的某一个仓库

Github使用

cd 当前git目录首先定位到当前的目录

在Github上创建相应的respositoriies learngit

git remote add origin git@github.com:xiucode/learngit.git

git push -u origin master-u的意思是不近将本地的master推送到远程github上的master,并且进行分支的合并关联

git push origin master之后,只要本地提交到仓库,直接用这段命令就可以实现同步

git clone git@github.com:xiuocde/gitskills.git直接把远程仓库克隆到本地

github上可以fork他人的仓库,fork后他人的仓库就放到了自己云端,然后git clone自己的仓库到本地,进行修改后commit,然后push,如果你想汇入他人的仓库,可以抛出一个pull request,如果对方很喜欢你添加的功能,就有可能接受,如果接受你的代码就会merge到源代码

Git 与 Github对接:

cd 到当前文档

git init 初始化git

git add -A 将所有文件提交到暂存区

git commit -m "xxx" 将所有暂存区文件提交仓库

git remote add origin git@github.com:xiucode/font-end-beginner.git 对接远程库

git fetch origin从远程库拉取内容到本地,不合并

git pull从远程库拉取内容到本地,并且合并

git push origin master将本地仓库推送到远程仓库

git pull根据远程仓库更新本地仓库

标签

$ git tag列出现有的标签

$ git tag -l 'v1.4.2.*'列出v.1.4.2的系列版本

$ git tag v1.4给对象加一个轻量级标签(无说明文字)

$ git tag -a v1.4 -m 'my version 1.4'给对象加一个重量级标签(带说明文字)

$ git tag v1.4 fa89asf9给非当前commit的旧分支打标签只需要制定他的id

$ git tag -d v1.4删除某一个标签

$ git show v1.4查看该标签对应对象的版本信息(和直接show + name用法一样,都是show)

在后期对早先的某次提交加注标签(只需要提供校验的前几位字符即可)

$ git log --pretty=oneline

9fceb02d0ae598e95dc970b74767f19372d61af8 updated rakefile

$ git tag -a v1.2 9fceb02

$ git push origin v1.5把标签传到服务器上

$ git push origin --tags一次把所有标签一起传到服务器上

$ git push origin:refs/tags/v1.4把推送的标签从云端删除

创建分支

git branch查看当前的分支

git checkout -b branch1创建并且切换到分支branch1

git branch branch1创建分支,但不切换到该分支

git checkout master切换分支

git merge合并分支

git branch -d branch1删除branch1分支

git branch -D branch1强行删除没有合并过的分支

当出现merge conflict冲突的时候,conflict出现的部分会相应的显示到当前分支文件中,我们只需要修改当前分支文件,使其符合自己原本期望的更改状态,然后重新提交,再删除合并分支即可


Fast-Forward模式与—No-ff模式的区别

git merge --no-ff -m "merge with no ff" dev

git stash可以暂存当前的编辑状态,比如你突然接到一个调bug的任务,但又不想提交现在的dev,就可以用stash暂存当前的编辑状态,等bug调完再回来搞dev分支

git stash pop恢复现场并且删除刚才保存的stash

git stash apply stash@{0}恢复一种一个现场但不删除刚才的stash

输出格式参数

选项说明

%H提交对象(commit)的完整哈希字串 %h 提交对象的简短哈希字串

%T树对象(tree)的完整哈希字串

%t树对象的简短哈希字串

%P父对象(parent)的完整哈希字串 %p 父对象的简短哈希字串

%an作者(author)的名字

%ae作者的电子邮件地址

%ad作者修订日期(可以用 -date= 选项定制格式) %ar 作者修订日期,按多久以前的方式显示

%cn提交者(committer)的名字

%ce提交者的电子邮件地址

%cd提交日期

%cr提交日期,按多久以前的方式显示 %s 提交说明

选项说明

-p按补丁格式显示每个更新之间的差异。

—stat显示每次更新的文件修改统计信息。

—shortstat只显示 —stat 中最后的行数修改添加移除统计。

—name-only仅在提交信息后显示已修改的文件清单。

—name-status显示新增、修改、删除的文件清单。

—abbrev-commit仅显示 SHA-1 的前几个字符,而非所有的 40 个字符。

—relative-date使用较短的相对时间显示(比如,“2 weeks ago”)。

—graph显示 ASCII 图形表示的分支合并历史。

—pretty使用其他格式显示历史提交信息。可用的选项包括 oneline,short,full,fuller 和 format(后跟指定格式)。

选项说明

-(n)仅显示最近的 n 条提交

—since, —after仅显示指定时间之后的提交。 —until, —before 仅显示指定时间之前的提交。

—author仅显示指定作者相关的提交。 —committer 仅显示指定提交者相关的提交。

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

推荐阅读更多精彩内容