16 November 2013

创建SSH key

创建SSH key的方法很简单,执行如下命令就可以:

ssh-keygen

打开.ssh/id_rsa.pub,将内容粘帖到github帐号管理中的添加SSH key界面中。

ls  #列出目录文件
ls -a
clear  #清屏
vim <file>  用vim编辑器的方式打开文件
cat <file> 查看文件内容

git config

Git需要用户提供若干信息。通过git config命令,可以把用户信息提供给本地版本库。

git config --global user.name "userName"      #配置用户名
git config --global user.email "userName@w3cmm.com"  #配置邮箱
git config --global color.ui "auto" #配置颜色

在全局命令上加上--global参数可以设置全局变量值。“全局”的意思是,你在这台计算机上使用任何Git版本库时,这些全局变量的值都起作用。

“color.ui”默认的值为“false”,值为“auto”或“always”时,可以把命令行窗口配置成彩色。

用下列命令检查上述设置是否成功:

git config --global --list

git help

Git内置丰富的用户手册,可以从命令行访问,也可以在线访问。在命令行环境中键入:

git help <command>

用希望了解的具体命令名称替代<command>。Git将显示用户手册中该命令的描述。

git init 将一个目录初始化为 Git 仓库

在目录中执行 git init,就可以创建一个 Git 仓库了。

git init

命令git init会创建一个.git目录。这个目录用来存放版本库的全部元数据。

git clone 复制一个 Git 仓库

如果你需要与他人合作一个项目,或者想要复制一个项目,看看代码,你就可以克隆那个项目。 执行 git clone [url][url] 为你想要复制的项目,就可以了。

git clone git://github.com/schacon/simplegit.git

git add 添加文件到缓存

在 Git 中,在提交你修改的文件之前,你需要把它们添加到缓存。如果该文件是新创建的,你可以执行 git add 将该文件添加到缓存,但是,即使该文件已经被追踪了 —— 也就是说,曾经提交过了 —— 你仍然需要执行 git add 将新更改的文件添加到缓存去。

git add <file>      # 将工作文件修改提交到本地暂存区
git add .           # 将所有修改过的工作文件提交暂存区
git add -i          # 启动交互模式

新项目中,添加所有文件很普遍,可以在当前工作目录执行命令:git add .

git status 查看你的文件在工作目录与缓存的状态

正如你在 git add 小节中所看到的,你可以执行 git status 命令查看你的代码在缓存与当前工作目录的状态。我演示该命令的时候加了 -s 参数,以获得简短的结果输出。 若没有这个标记,命令 git status 将告诉你更多的提示与上下文信息。

git diff 显示已写入缓存与已修改但尚未写入缓存的改动的区别

git status显示你上次提交更新至后所更改或者写入缓存的改动, 而 git diff 一行一行地显示这些改动具体是啥。 通常执行完 git status 之后接着跑一下 git diff是个好习惯。

git diff –cached

git diff --cached 命令会告诉你有哪些内容已经写入缓存了。 也就是说,此命令显示的是接下来要写入快照的内容。

git diff HEAD 查看已缓存的与未缓存的所有改动

如果你想一并查看已缓存的与未缓存的改动,可以执行 git diff HEAD —— 也就是说你要看到的是工作目录与上一次提交的更新的区别,无视缓存。

git diff –stat 显示摘要而非整个 diff

如果我们不想要看整个 diff 输出,但是又想比 git status 详细点, 就可以用 --stat 选项。该选项使它显示摘要而非全文。

简而言之, 执行 git diff 来查看执行 git status 的结果的详细信息 —— 一行一行地显示这些文件是如何被修改或写入缓存的。

git commit 记录缓存内容的快照

git commit –m “提交留言”   #提交

现在你使用 git add 命令将想要快照的内容写入了缓存, 执行git commit 就将它实际存储快照了。 Git 为你的每一个提交都记录你的名字与电子邮箱地址,所以第一步是告诉 Git 这些都是啥。

git commit -a 自动将在提交前将已记录、修改的文件放入缓存区

如果你觉得 git add 提交缓存的流程太过繁琐,Git 也允许你用 -a 选项跳过这一步。 基本上这句话的意思就是,为任何已有记录的文件执行 git add —— 也就是说,任何在你最近的提交中已经存在,并且之后被修改的文件。

git commit -am 'changes to hello file'

git reset

git reset HEAD -- hello.rb 

假设你修改了两个文件,想要将它们记录到两个不同的提交中去。 你应该缓存并提交一个,再缓存并提交另外一个。如果你不小心两个都缓存了,那要如何才能取消缓存呢? 你可以用 git reset HEAD -- file。 技术上说,在这里你不需要使用 -- —— 它用来告诉 Git 这时你已经不再列选项,剩下的是文件路径了。 不过养成使用它分隔选项与路径的习惯很重要,即使在你可能并不需要的时候。

如果你好奇,它实际的操作是将该文件在“索引”中的校验和重置为最近一次提交中的值。 git add 会计算一个文件的校验和,将它添加到“索引”中, 而 git reset HEAD 将它改写回原先的,从而取消缓存操作。

git reset --hard <commit-id>:回滚到commit-id,将commit-id之后提交的commit都去除,可以选择的参数包括默认的 "--mixed" 和 "--hard",前者不会取消工作目录的修改,而后者则放弃全部的修改
git reset --hard HEAD~3:将最近3次的提交回滚

git rm 将文件从缓存区移除

git rm 会将条目从缓存区中移除。这与 git reset HEAD 将条目取消缓存是有区别的。 “取消缓存”的意思就是将缓存区恢复为我们做出修改之前的样子。 在另一方面,git rm 则将该文件彻底从缓存区踢出,因此它不再下一个提交快照之内,进而有效地删除它。

默认情况下,git rm file 会将文件从缓存区和你的硬盘中(工作目录)删除。 如果要在工作目录中留着该文件,可以使用 git rm --cached

git rm <file>       # 从版本库中删除文件
git rm <file> --cached  # 从版本库中删除文件,但不删除文件

安装git-extras

git obliterate <file> #完全从资源库中删除一个文件,包括过去的提交和标签。

git mv

不像绝大多数其他版本控制系统,Git 并不记录记录文件重命名。它反而只记录快照,并对比快照以找到有啥文件可能被重命名了。 如果一个文件从更新中删除了,而在下次快照中新添加的另一个文件的内容与它很相似,Git 就知道这极有可能是个重命名。 因此,虽然有 git mv 命令,但它有点多余 —— 它做得所有事情就是 git rm --cached, 重命名磁盘上的文件,然后再执行 git add 把新文件添加到缓存区。 你并不需要用它,不过如果觉得这样容易些,尽管用吧。

git mv <原文件名称> <新文件名称>

我自己并不使用此命令的普通形式 —— 删除文件。通常直接从硬盘删除文件,然后执行 git commit -a 会简单些。 它会自动将删除的文件从索引中移除。

简而言之, 执行 git rm 来删除 Git 追踪的文件。它还会删除你的工作目录中的相应文件。

git branch 列出、创建与管理工作上下文

git branch 命令是 Git 中的通用分支管理工具,可以通过它完成多项任务。 我们先说你会用到的最多的命令 —— 列出分支、创建分支和删除分支。

git branch 列出可用的分支

###git branch (branchname) 创建新分支

git branch daily #创建一个叫daily的分支
git branch -m contact contacts  #把contact分支重命名为contacts
git branch -r  #只列出远程分支
git branch -a  #加上-a参数可以查看远程分支,远程分支会用红色表示出来
git branch -d <branchName> #删除分支
git push origin --delete <branchName> #删除远程分支
git push origin :<branchName> #删除远程分支

git checkout 切换到新的分支上下文

git checkout daily #切换到daily分支
git checkout -b (branchname) 创建新分支,并立即切换到它
git checkout 1.1.x -- src/lib/mega-1.1.0.js  #用1.1.x分支中mega-1.1.0.js替换暂存区和工作区中相应的文件
$ git checkout -- . 或写作 git checkout .

注意git checkout 命令后的参数为一个点(“.”)。这条命令最危险!会取消所有本地的 修改(相对于暂存区)。相当于用暂存区的所有文件直接覆盖本地文件,不给用户任何确认的机会!

git merge 将分支合并到你的当前分支

你可以使用 git merge 命令将任何分支合并到当前分支中去。

git merge daily #合并daily分支
git merge origin/master #合并远程分支
git cherry-pick <commit name>   #拣选合并,并且提交
git cherry-pick -n <commit name>   #拣选合并,但不提交
git merge --squash <some branch>  #把一条分支上的内容压合到另一条分之上
git merge --no-ff develop

使用 git merge 将另一个分支并入当前的分支中去。 Git 会自动以最佳方式将两个不同快照中独特的工作合并到一个新快照中去。使用–no-ff参数后,会执行正常合并,在Master分支上生成一个新节点。为了保证版本演进的清晰,我们希望采用这种做法。

--no-ff默认情况下,Git执行”快进式合并”(fast-farward merge),会直接将Master分支指向Develop分支。

Git 在产生合并冲突的地方插入了标准的与 Subversion 很像的合并冲突标记。 轮到我们去解决这些冲突了。在这里我们就手动把它解决。

在 Git 中,处理合并冲突的时候有个很酷的提示。 如果你执行 git diff,就像我演示的这样,它会告诉你冲突的两方,和你是如何解决的。 现在是时候把它标记为已解决了。在 Git 中,我们可以用 git add —— 要告诉 Git 文件冲突已经解决,你必须把它写入缓存区。

git log 显示一个分支中提交的更改记录

要理解日志(log)命令,你需要了解当执行 git commit以存储一个快照的时候,都有啥信息被保存了。 除了文件详单、提交消息和提交者的信息,Git 还保存了你的此次提交所基于的快照。 也就是,假如你克隆了一个项目,你是在什么快照的基础上做的修改而得到新保存的快照的? 这有益于为项目进程提供上下文,使 Git 能够弄明白谁做了什么改动。 如果 Git 有你的快照所基于的快照的话,它就能自动判断你都改变了什么。而新提交所基于的提交,被称作新提交的“父亲”。

git log -5   #输出1个提交
git log -5 -p  #并显示文件内容的变化
git log -20 --since="6 hours"  #显示最近6小时的提交
git log -5 -p --before="2 days"  #显示至少2天前的提交

我们可以用 –oneline 选项来查看历史记录的紧凑简洁的版本。

git log –oneline

我们还可以用它的十分有帮助的 --graph选项,查看历史中什么时候出现了分支、合并。以下为相同的命令,开启了拓扑图选项:

git log –oneline –graph

现在我们可以更清楚明了地看到何时工作分叉、又何时归并。 这对查看发生了什么、应用了什么改变很有帮助,并且极大地帮助你管理你的分支。

如果我们想要合并“erlang”分支,我们需要看当合并的时候,都有啥提交会作用到我们的快照上去。 我们告诉 Git 的方式是,在不想要看到的分支前放一个 ^。 例如,如果我们想要看“erlang”分支中但不在主分支中的提交,我们可以用 erlang ^master,或者反之。

git log --oneline erlang ^master

这为我们提供了一个良好的、简易的分支管理工具。它使我们能够非常容易地查看对某个分支唯一的提交,从而知道我们缺少什么,以及当我们要合并时,会有什么被合并进去。

git tag

git tag 1.0

现在要准备发布1.0版本了,要给它打个标签。给Git中的代码打个标签,意味着在版本库的历史中标记出特定的点,这样将来就容易找到相应版本的代码。

git tag -d <tagname>
git tag -l 查看所有tag
git push origin --delete tag <tagname>  #删除远程tag

git fetch 从远端仓库下载新分支与数据

git fetch  # 更新远程代码到本地仓库
git fetch origin master # 从远程的origin仓库的master分支下载代码到本地的origin master

git pull 从远端仓库提取数据并尝试合并到当前分支

git fetch 会使你与另一仓库同步,提取你本地所没有的数据,为你在同步时的该远端的每一分支提供书签。 这些分支被叫做“远端分支”,除了 Git 不允许你检出(切换到该分支)之外,跟本地分支没区别 —— 你可以将它们合并到当前分支,与其他分支作比较差异,查看那些分支的历史日志,等等。同步之后你就可以在本地操作这些。

第二个会从远端服务器提取新数据的命令是 git pull。 基本上,该命令就是在 git fetch 之后紧接着 git merge 远端分支到你所在的任意分支。 我个人不太喜欢这命令 —— 我更喜欢 fetchmerge 分开来做。少点魔法,少点问题。 不过,如果你喜欢这主意,你可以看一下 git pull官方文档

假设你配置好了一个远端,并且你想要提取更新,你可以首先执行 git fetch [alias] 告诉 Git 去获取它有你没有的数据,然后你可以执行 git merge [alias]/[branch] 以将服务器上的任何更新(假设有人这时候推送到服务器了)合并到你的当前分支。

如果你有多个远端仓库,你可以执行 git fetch [alias] 提取特定的远端仓库, 或者执行 git fetch --all 告诉 Git 同步所有的远端仓库。

git push 推送你的新分支与数据到某个远端仓库

执行 git push [alias] [branch],就会将你的 [branch] 分支推送成为 [alias] 远端上的 [branch] 分支。

简而言之 执行 git push [alias] [branch] 将你的本地改动推送到远端仓库。 如果可以的话,它会依据你的 [branch] 的样子,推送到远端的 [branch] 去。 如果在你上次提取、合并之后,另有人推送了,Git 服务器会拒绝你的推送,直到你是最新的为止。

cd moz
git remote add origin https://github.com/stormtea123/moz.git
git push -u origin master

git push origin --delete <branchName> #删除远端分支
git push origin --delete tag <tagname>  #删除tag这么用
git push -f  #强覆盖方式用你本地的代码替代git仓库内的内容

git push.default

你可能会在执行 git push 时看到如下消息:

warning: push.default is unset; its implicit value is changing in 
Git 2.0 from 'matching' to 'simple'. To squelch this message 
and maintain the current behavior after the default changes, use: 
  git config --global push.default matching
To squelch this message and adopt the new behavior now, use: 
  git config --global push.default simple

Matching

‘matching’ 参数是 Git 1.x 的默认行为,其意是如果你执行 git push 但没有指定分支,它将 push 所有你本地的分支到远程仓库中对应匹配的分支。

git config --global push.default matching

simple

而 Git 2.x 默认的是 simple,意味着执行 git push 没有指定分支时,只有当前分支会被 push 到你使用 git pull 获取的代码。

git config --global push.default simple

git remote 罗列、添加和删除远端仓库别名

git remote 列出远端别名

如果没有任何参数,Git 会列出它存储的远端仓库别名了事。默认情况下,如果你的项目是克隆的(与本地创建一个新的相反), Git 会自动将你的项目克隆自的仓库添加到列表中,并取名“origin”。 如果你执行时加上 -v 参数,你还可以看到每个别名的实际链接地址。

$ git remote origin
$ git remote -v 查看远程仓库
origin  git@github.com:github/git-reference.git (fetch)
origin  git@github.com:github/git-reference.git (push)

在此你看到了该链接两次,是因为 Git 允许你为每个远端仓库添加不同的推送与获取的链接,以备你读写时希望使用不同的协议。

git remote add 为你的项目添加一个新的远端仓库

如果你希望分享一个本地创建的仓库,或者你想要获取别人的仓库中的贡献 —— 如果你想要以任何方式与一个新仓库沟通,最简单的方式通常就是把它添加为一个远端仓库。 执行 git remote add [alias] [url] 就可以。 此命令将 [url][alias]的别名添加为本地的远端仓库。

git remote rm 删除现存的某个别名

如果你需要删除一个远端 —— 不再需要它了、项目已经没了,等等 —— 你可以使用 git remote rm [alias] 把它删掉。

git remote rm origin

简而言之 你可以用 git remote 列出你的远端仓库和那些仓库的链接。 你可以使用 git remote add 添加新的远端仓库,用 git remote rm 删掉已存在的那些。

恢复远程仓库到某个版本

本地仓库回复到某个版本使用git reset命令

git reset的三个参数 –hard –soft –mixed

将远程仓库回复到某个版本步骤如下

1.更新本地版本到远程库的最新版本

git pull ###2.将本地版本回复到需要回复到的版本

git reset --hard [需要回复的版本号]

3.提交本地的回复到远程仓库

git push origin master -f

一定要加-f参数,否则更新不成功