Git备忘

前言

一直以来,咱们都是使用 svn 做为版本管理工具,对于它的分支管理用得不是很顺,不得不手动管理。
最近发现一本神书 -- 《Pro.Git》,介绍的是 git 版本管理工具,忍不住拜读了前半部分能看懂的。故记录一下。git

git 安装

因为我用的是 windows ,故接下来一切的前提都是在 windows 环境下github

  • 直接上官网下载: http://git-scm.com/downloads
  • msysGit 项目主页下载: http://msysgit.github.com/

安装后通常会有一个 Git BashGit GUI ,我通常用命令行的 Git Bash ,我的感受命令行能让我更清楚地知道本身的操做,对全局有把控的感受。shell

Git文件状态

在 git 工做目录下的文件,只有两种状态: 已跟踪未跟踪 。已跟踪 的文件就是已经被归入版本管理,反之未跟踪就是还没有归入版本管理的文件。初次使用 git clone 克隆下来的文件都属性已跟踪状态,初次使用 git init 初始化的目录下全部文件都属于未跟踪状态。
已跟踪 后的文件若是有修改则状态更新为 已修改,git add 已修改的文件将把文件放入 暂存区域 ,此时的状态更新为 已暂存。提交后文件的状态将回归 已跟踪未修改 状态。
以下图,更清晰:
[此处输入图片的描述][http://images.cnblogs.com/cnblogs_com/littledu/619156/o_4.jpg]windows

git 配置

初次运行 git 须要先配置一下,就跟无论装什么软件同样,刚装完的时候按咱们本身的行为习惯设置一下,如字体,颜色等。git 的配置主要保存咱们用户的信息和设置一些默认调用的编辑器等。app

git 提供了 git config 命令来完成此操做。编辑器

$ git config --global user.name "littledu"
$ git config --global user.email 410491325@qq.com

可输入 git config --list 查看全部的配置,更多配置相关点击以下连接了解:
初次运行 Git 前的配置svn

Git基础命令

当配置完后,咱们就要开始使用 Git 来工做了。常规的操做有 初始化新仓库、克隆仓库、添加文件归入版本控制和提交等。工具

  • git init : 初始化新仓库
  • git add : 添加新文件归入版本控制并放入暂存区域(选择所有为 git add . 或 git add --all)
  • git commit -m [说明] : 提交已暂存的更新
  • git commit -a -m [说明] : 提交所有更新
  • git commit --amend : 修正最后一次提交
  • git reset HEAD <file> : 取消已经暂存的文件
  • git checkout -- <file> : 撤消文件的修改
  • git status : 检查当前文件状态
  • git diff : 比较当前文件和暂存区域快照之间的差别
  • git diff --cached : 暂存起来的文件和上一次提交时快照之间的差别
  • git diff --staged : 暂存起来的文件和上一次提交时快照之间的差别(Git 1.6.1以上)
  • git log : 查看提交历史(查看了后按 q 退出)
  • gitk : 使用图形化工具查阅提交历史
  • git rm : 从暂存区移除文件,工做目录下的文件也会被删除
  • git rm --cached : 从暂存区移除文件,保留工做目录下的文件

git 远程仓库相关命令

目前基于 git 的远程仓库遍地开花,最有名的如 github,在上面存放咱们的开源代码,能必定程度上提升 逼格字体

  • git clone [url] : 克隆现有的仓库
  • git fetch [remote-name] : 从远程仓库抓取数据到本地,不会自动合并
  • git pull [remote-name] : 从远程仓库抓取数据到本地,自动合并
  • git push [remote-name] [branch-name] : 推送数据到远程仓库(加上最后的分支名branch-name能够推送到远程相应分支)
  • git remote : 查看当前远程仓库的名字
  • git remote -v : 查看当前远程仓库的详细信息
  • git remote add [shortname] [url] : 添加远程仓库
  • git remote rename [oldname] [newname] : 远程仓库重命名
  • git remote rm [remote-name] : 删除远程仓库(仅移除本地对应的仓库)

git 分支相关命令

git 做为版本管理系统,必不可少的要支持 分支
为了理解 git 分支的实现方式,咱们回顾一下 git 是如何存储数据的。。。。此处省略 1000 字,总之,git 分支是版本控制工具里面最好的。fetch

  • git branch [branch-name] : 建立分支(不加参数则为列出全部分支名单)
  • git checkout [branch-name] : 切换分支
  • git checkout -b [branch-name] : 建立并切换分支
  • git merge [branch-name] : 合并分支
  • git mergetool : 调用可视化合并工具帮忙解决冲突(在遇到冲突时,能够输入此命令,在后续中将本身电脑上装有的 diff 工具如 BC 路径填上,会自动调用其为咱们解决冲突)
  • git branch -d [branch-name] : 删除分支
  • git checkout --track origin/branch-name : 获取远程分支(默认状况下咱们 git clone 都是获取远程 master 分支,若是要获取远程 其余分支,则可使用这个命令,需 git 1.6.2 以上版本)
  • git checkout -b [new branch-name] origin/[branch-name] : 一样是获取远程分支,但能够改分支名
  • git push origin :[branch-name] : 删除远程分支(不能删除 master 分支)

git 版本回退

时不时的,咱们想回到较早前的提交内容(commit),咱们可使用 git reset --hard [commit id] 来回退。
commit id 能够经过 git log 来查看,以下图那一长串的 SHA 字符:
Alt text

但这样回退,是不会有历史记录的,也就是回退了后再执行 git log 将看到在此记录前的记录全没了,若有以下记录:

$ git log --pretty=oneline
ab1afef80fac8e34258ff41fc1b867c702daa24b modified repo a bit
484a59275031909e19aadb7c92262719cfcdf19a added repo.rb
1a410efbd13591db07496601ebc7a059dd55cfe9 third commit
cac0cab538b970a37ea1e769cbbde608743bc96d second commit
fdf4fc3344e67ab068f836878b6c4951e3b15f3d first commit

我将回退到中间的 third commit

$ git reset --hard 1a410efbd13591db07496601ebc7a059dd55cfe9
HEAD is now at 1a410ef third commit
$ git log --pretty=oneline
1a410efbd13591db07496601ebc7a059dd55cfe9 third commit
cac0cab538b970a37ea1e769cbbde608743bc96d second commit
fdf4fc3344e67ab068f836878b6c4951e3b15f3d first commit

会是如上的结果,丢失了两次被跨越的 commit。
因此,不要轻易的跨版本回退(若是能不回退那世界将很美好),但作了想找回也有办法,git 提供了一个 git reflog 命令,能够看到历史上全部的 commit ,也就是能够找回丢失的 commit id 了。

git reset --hard 1a410e.... 不须要输入那么长的 id,只须要前几个便可。另外,强烈推荐详细阅读 《Pro.Git》第三章开头介绍的 git 数据存储原理,将对你理解 git 的分支和版本回退有很是大的帮助。

git 忽略文件

在开发的过程当中,总会遇到有一些文件咱们不想归入版本管理,如相关说明文档或日志等。
能够建立一个 .gitignore 文件,列出要忽略的文件或模式,以下例子:

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

注:如何在 windows 下建立一个没有名字的文件请参考:Windows下建立没有名字的文件(.htaccess)最简单的方法

fetch 和 pull 的区别

git fetch [remote-name]
git pull [remote-name]

fetchpull 都是从远程仓库抓取数据到本地,他们的区别就是 fetch 不会自动合并,而 pull 会自动与本地数据进行合并。

当你使用了 git fetch 后,想查看一下它在哪里时,可使用:

git branch --all

当你使用了 git fetch 后,想合并它时,可使用:

git log -p master..origin/master
git merge origin/master

事实上,我我的倾向于直接使用 git pull ,直接了当。


尾声

git 经常使用的命令基本就这些了,这里忽略了 git taggit rebase 命令。1 是由于比较少用,或许是我我的比较少用;2 是由于有另外一种方式能够实现相同功能,如 git rebase 能够婉转的用 git merge 代替。

最后,感谢 toobug 大大忍受住了我时不时的骚扰,为我解惑各类 git 疑难杂症。有空给个面子让我请你去喝星巴克最贵的咖啡吧。

参考文档

相关文章
相关标签/搜索