使用git 一段时间了,做了不少零星的笔记,总结整理
概要:
- 安装(系统:archlinux)
- 初始化一个环境
- 对.git 目前系统介绍
- 基本代码管理使用
- 分值的创建与合并
- 解决冲突
- 其他学习
- 扩展
安装:
初始化一个环境
新建一个文件夹,进入该文件夹,运行:
对.git 目录介绍
我们先看看此目录系统都有一些什么,运行tree命令得结果:
对相应的主要文件的作用一一介绍:
- HEAD 文件 , 该文件的 内容:
- config 文件
- 包含你为本git 项目配置的信息,如用户名,邮箱,分支名称,以及对应的url,等,如:
- 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 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 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 diff
都通过
// 但是 $ git diff 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(推荐!)