Git学习笔记

Git 与 Github对接:

  1. cd 到当前文档
  2. git init初始化git
  3. git add -A 将所有文件提交到暂存区
  4. git commit -m "xxx"将所有暂存区文件提交仓库
  5. git remote add origin git@github.com:xiucode/font-end-beginner.git对接远程库
  6. git clone git@github.com:xiuocde/gitskills.git直接把远程仓库克隆到本地
  7. git fetch origin从远程库拉取内容到本地,不合并
  8. git pull从远程库拉取内容到本地,并且合并
  9. git push origin master将本地仓库推送到远程仓库
  10. git pull根据远程仓库更新本地仓库

基本概念

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

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

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

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

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

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

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

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

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

  1. 在工作目录中修改某些文件。
  2. 对这些修改了的文件作快照,并保存到暂存区域。
  3. 提交更新,将保存在暂存区域的文件快照转储到 git 目录中。

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

初次运行 Git 前的配置

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

配置姓名、邮箱和编辑器
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
寻求帮助
git help

如果用了 —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使用

  1. cd 当前git目录首先定位到当前的目录
  2. 在Github上创建相应的respositoriies learngit
  3. git remote add origin git@github.com:xiucode/learngit.git
  4. git push -u origin master-u的意思是不近将本地的master推送到远程github上的master,并且进行分支的合并关联
  5. git push origin master之后,只要本地提交到仓库,直接用这段命令就可以实现同步
  6. git clone git@github.com:xiuocde/gitskills.git直接把远程仓库克隆到本地
  7. github上可以fork他人的仓库,fork后他人的仓库就放到了自己云端,然后git clone自己的仓库到本地,进行修改后commit,然后push,如果你想汇入他人的仓库,可以抛出一个pull request,如果对方很喜欢你添加的功能,就有可能接受,如果接受你的代码就会merge到源代码

Git 与 Github对接:

  1. cd 到当前文档
  2. git init 初始化git
  3. git add -A 将所有文件提交到暂存区
  4. git commit -m "xxx" 将所有暂存区文件提交仓库
  5. git remote add origin git@github.com:xiucode/font-end-beginner.git 对接远程库
  6. git fetch origin从远程库拉取内容到本地,不合并
  7. git pull从远程库拉取内容到本地,并且合并
  8. git push origin master将本地仓库推送到远程仓库
  9. 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 仅显示指定提交者相关的提交。