使用git 一段时间了,做了不少零星的笔记,总结整理
概要:
- 安装(系统:archlinux)
- 初始化一个环境
- 对.git 目前系统介绍
- 基本代码管理使用
- 分值的创建与合并
- 解决冲突
- 其他学习
- 扩展
安装:
$ apt-get install git # ubuntu环境
$ sudo pacman -S git # archlinux
初始化一个环境
新建一个文件夹,进入该文件夹,运行:
$ git init #会在你的当前目录中创建一个 .git 的子目录
对.git 目录介绍
我们先看看此目录系统都有一些什么,运行tree命令得结果:
byronlee@byronlee:~/workspace/ruby/temp/tem/.git$ tree
.
├── branches # 新版的Git已经不再使用这个目录,所以大家看到它 一般会是空的
├── config # 项目的配置信息
├── COMMIT_EDITMSG # 保存着上一次提交时的注释信息
├── description # 项目的描述信息
├── HEAD # 项目当前在哪个分支的信息
├── hooks # 默认的“hooks” 脚本文件
│ ├── applypatch-msg.sample
│ ├── commit-msg.sample
│ ├── post-update.sample
│ ├── pre-applypatch.sample
│ ├── pre-commit.sample
│ ├── prepare-commit-msg.sample
│ ├── pre-rebase.sample
│ └── update.sample
├── index # 索引文件,git add 后把要添加的项暂存到这里
├── info / # 里面有一个exclude文件,指定本项目要忽略的文件 #,看一下这里
│ └── exclude
├── log #各个refs的历史信息
├── objects # 这个目录非常重要,里面存储都是Git的数据对象
│ # 包括:提交(commits), 树对象(trees),二进制对象 #(blobs),标签对象(tags)。
│ ├── info
│ └── pack
└── refs # 标识着你的每个分支指向哪个提交(commit)
├── heads
└── tags
9 directories, 12 files
对相应的主要文件的作用一一介绍:
- HEAD 文件 , 该文件的 内容:
ref: refs/heads/master
索引指向: 项目根目录/.git/refs/heads/master文件
=》HEAD 文件中的内容其实只是包含了一个索引信息,并且,这个索引将总是指向你的项目中的当前开发分支。
- config 文件
- 包含你为本git 项目配置的信息,如用户名,邮箱,分支名称,以及对应的url,等,如:
[user] //本项目git用户
email = lbyronlee@gmail.com
name = Byronlee
[alias] // 常用命令的别名
lg = log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --
ls = log --pretty=format:"%C(yellow)%h\\ %ad%Cred%d\\ %Creset%s%Cblue\\ [%cn]" --decorate --date=short
ll = log --pretty=format:"%C(yellow)%h%Cred%d\\ %Creset%s%Cblue\\ [%cn]" --decorate --numstat
rl = reflog ; 查看所有git操作日志
gl = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr,%an)%Creset' --abbrev-commit --date=relative ;查看日志
,包含路线图
l = shortlog -s -- ; 查看各成员所提交日志
st = status -s
cl = clone
ci = commit -a
ca = commit --amend
co = checkout
br = branch
mt = mergetool ; Run merge conflict resolution tools to resolve merge conflicts
merge = merge --no-ff ; 需要保持清晰的路线图需要使用这个合并
rsh = reset --hard ; 舍弃本地所有修改
[remote "origin"] //各种分支
url = git@github.com:Byronlee/yicheng-checkon.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
[remote "task"]
url = git@task.zhiyisoft.com:/yicheng/yicheng-checkon.git
fetch = +refs/heads/*:refs/remotes/task/*
[remote "yichen"]
url = git@github.com:zhiyisoft/yicheng-checkon.git
fetch = +refs/heads/*:refs/remotes/yichen/*
- objects 子目录
- 它包含了你的项目中的所有对象,我们不必直接地了解到这些对象内容,我们应该关心是存放在这些对象中的项目的数据。
- refs 子目录
- 它用来保存指向对象的索引。子目录 refs 包含着两个子目录叫 heads 和 tags,就像他们的名字所表达的意味一样:他们存放了不同的开发分支的头的索引, 或者是你用来标定版本的标签的索引。
- 请注意 :master 是默认的分支,这也是为什么 .git/HEAD 创建的时候就指向 master 的原因,尽管目前它其实并不存在。 git 将假设你会在 master 上开始并展开你以后的工作,除非你自己创建你自己的分支。
- 这只是一个约定俗成的习惯而已
- 实际上你可以将你的工作分支叫任何名字,而不必在版本库中一定要有一个叫 master 的分支,尽管很多 git 工具都认为 master 分支是存在的。
现在已经创建好了一个 git 版本库,但是它是空的,还不能做任何事情
基本代码管理使用
对一个文件进行一次完整的git 基本操作:
- 新建一个文件 byronlee.rb
- 用git 跟踪此文件
*
$git add byronlee.rb
// 也可以git add .
(表示跟踪但前文件夹下的全部文件) - 查看当前git 状态
$ git status
- 可以用编辑器,编辑 byronlee.rb 文件。再执行步揍3操作。可以看出,git 给你罗列出了那些已跟踪的文件发生了改变
- 将发生改变的文件进行一次提交
$ git commit -m "
//你提交时需要注释的内容”
以上就基本完成一次简单的git 跟踪一个文件操作
当然最好每发生一次改变就提交一次。当你提交过后,在用步凑3去查看状态,就会提示没有内容改变。
但是commit 提交只是提交到你的本地git仓库,如果你是远程开发,需要提交到远程仓库。需要在步凑5之后 在执行:
$ git push origin master
// origin 表示远程仓库的名称,master表示远程仓库的分支
拉远程仓库的代码
$ git pull origin master
注意:
- git add 实际上是个脚本命令,它是对 git 内核命令
git update index
的调用。因此上面的命令和下面的命令其实是等价的:$ git-update-index
(但是 我测试,不能用,需要探讨) - 应该建立一个清晰的概念就是,
git add
和git update index
只是刷新了 git 的跟踪信息,新添加的跟踪文件中的内容并没有提交到 git 的内容跟踪范畴之内。 - 我们可以随意使用
$ git status
来查看当前状态 - 每次我们修改我们的一追踪的文件后提交 都要先
git add “changeg file”
后才能 使用git commit
,其实,如果要提交的文件都是已经纳入 git 版本库的文件,我们不必那样做,下面的命令是等价:$ git commit -a -m “new day for git”
常用命令:
- 所有文件以及跟踪,且都发生了改变,这是可以用
$ git add -u
把所有的跟踪且改变的文件刷新内容。 - 提交内容到版本库:
$ git commit
// git commit -m “your description” - 比较两个文件或者分支的不同:
git diff
$ git diff file_name1 file_name2
// 查看他们的不同- 查看修改、提交记录 :
$ git log
- 创建分支:
$ git branch branch_name
- 查看当前分支状态:
$ git branch
- 切换分支:
$ git checkout branch_name
- 配置开发者自己的签名和email
$ git config --global user.name "roredu"
$ git config --global user.email "roredu@gmail.com"
注意:这个是全局变量,写在家目录下面的.gitconfig 文件里面的。会影响你本机上的每个一个Git项目,附带提交作者信息,如log。 可以为没有git 项目配置不同的信息,去掉 –global , 为每一个git项目配置的信息就在.git目录中的config 文件中!
$ git config user.name "roredu"
$ git config user.email "roredu@gmail.com"
注意: 以上这两条命令会写入项目根目录的 .git 目录中的config 文件中
Git的全局配置文件是存放在”~/.gitconfig”(用户目录下的.gitconfig)文件中
- 修改文件名:
$ git mv old_name new_name
- 删除文件:
$ git rm file_name
- 为你的git 定制编辑器( 每次用 :
$ git commi
t ,而不用$ git commit -m “msfg”
或者$ git gommit -a -m “msg”
提交项目时都会弹出编辑器,让你编辑此次提交的说明或者备注,默认是VIM,编辑器):$ git config --global core.editor emacs
// 会被写入"~/.gitconfig"
(用户目录下的.gitconfig)文件中 - 一个Git项目中文件的状态大概分成下面的两大类
- 未被跟踪的文件(untracked file)
- 已被跟踪的文件(tracked file),(而这类又分为三小类)
- 被修改但未被暂存的文件(changed but not updated或modified)
- 已暂存可以被提交的文件(changes to be committed 或staged)
- 自上次提交以来,未修改的文件(clean 或 unmodified)
分支创建和使用:
- 查看分支:
$ git branch
- 创建分支:
$ git branch branch_name
- 切换分支:
$ git checkout branch_name
- 查看分支之间的差异:
$ git diff branch_name
// 查看但前分支和 分支 branch_name 的差异- 注意:
- 当我们使用
$ git branch branch_name
创建一个名branch_name的分支后,在./git/refs/heads/
文件夹下 就会自定增加一个 名为 branch_name 的文件夹。文件夹里的内容是一条索引 - 当没有切换分支之前,默认为主分支master,
- 没有切换分支钱:
./git/HEAD
文件里 内容是:ref: refs/heads/master
// 指向主分支 - 当使用
$ git checkout branch_name
切换分支过后./git/HEAD
文件里的内容是:ref: refs/heads/branch_name
// 指向新建分支
- 对./git/refs/heads/master 内容详解
- 查看
./git/refs/heads/master
文件的内容为一SHA1哈希串值:8aab2d4318840b4f95cc15edcf48d8b3ce1cf2f5
也就是一个对象名 - 我们再看看这是一个什么类型的对象:
$cat refs/heads/master | xargs git cat-file -t
得到commit
- “master”文件里面存有主分支(master)最新提交的“对象名”;我们根据这个“对象名”就可以可找到对应的树对象(tree)和二进制对象(blob),简而言之就是我能够按“名”索引找到这个分支里所有的对象。
- 查看
分支的合并:
查看当前分支 是否已经全部没提交
$ git commit -a -m "msg"
// 或者 $ git diff
都通过
// 但是 $ git diff branch_name
与其他分支比较可能就不能通过
就可以分支合并了,分支合并必须在主分支上, 运行
$ git merge branch_name
然后在 $ git diff branch_name
都全部通过了。分支已经合并!
$git branch -d branch_name
再删除分支
注意: 如果你想要删除的分支还没有被合并到其它分支中去,那么就不能用git branch -d
来删除它,需要改用git branch -D
来强制删除。
git 的基本使用就到这了
但这就只是入门,更深入学习:
- http://github.com 全球最大的代码托管商。国内也有了一个,https://gitcafe.com/, 但是功能没有github 强大。
- 推荐教材:《git 权威指南》
- 推荐网上学习资料:Git Community Book 中文版:http://gitbook.liuhui998.com/index.html(很全!)
- git 大部分命令的思维导图。一看就明白:http://static.oschina.net/uploads/img/201210/15181332_I4p6.jpg(推荐!)