Git自学笔记

Git:分布式版本控制系统—存储commit的完整内容
(subversion(SVN):增量控制系统——存储commit间的差异)

一.Git对象:

类型包括:blob,tree,commit,tag,每种类型的内容都不同。

  1. blob(元对象):存储文件内容
    实质:一块二进制数据。
  2. tree:一些指向其他blob或tree的指针。
    实质:指明层次目录结构
  3. commit:指向一个tree对象,带有相关信息。
    实质内容:tree对象及其SHAI,parent(s)(前一个提交,一般是当前分支),author(修改者),committer(提交者)
    parent与tree的比较可以得到此次修改的变化。
 $ git ls-tree SHA //可以得到tree的具体内容和结构
$ git commit
//即可创建一个提交

(可以用命令git show SHA 码 来查看对象的内容)

二.GIT目录与工作目录

Git目录:一个项目有一个Git目录,为”.git”目录,存储历史信
息,与整个项目挂钩。
工作目录:当前编辑的文件,临时checkout文件,直至下次commit

三.Git索引(暂存区stage)

commit的就是当前索引中的内容,而不是工作目录中的。

 $ git status 
 //可以查看暂存了的文件,修改了但未暂存的文件,未被跟踪的文件
 //status 以文件为元,diff是以代码为元

四.Git安装

1.git config –global user.name “yang”
git config –global user.email “wangchunyang**@163.com”
//设置全局用户和邮箱
2.建立Git仓库,可以通过下面两种发放建立一个Git仓库

$ git clone http://www.kernel.org/pub/scm/git/git.git
//git clone 是获取已有项目的拷贝,需要知道该项目仓库的git url
//上述是得到了git的源码
$ git init
//该命令要在希望建立仓库的目录下使用,建立仓库的目录会被视作根目录。初始为空,即使是根目录下有很多内容,但不会自动加入到仓库中,即为untracked

3.添加文件
可以添加之前不在仓库里的文件,也可以添加修改了的文件

$ git add file1 file2 file3
//添加文件到暂存,相对目录为根目录,如果添加的是目录,则添加目录下的所有文件
$ git diff (-cached)
//不加cached会得到所有修改了的但是没有添加的文件,加了之后就会得到所有添加了的具体内容
$ git status 
//得到整个仓库的总体情况

4.提交文件

$ git commit 
// 注意git bash默认使用的是vi编辑器(linux,unix基础编辑器),在commit之后会要求输入注释,注释不能为空,输入注释之后要点ese退出输入,再输入冒号:,再输入q退出,w写入。注:注释可以分为标题和正文形式,第一行作为标题,剩下的作为正文,这样可以很方便变为email通知。
$ git commit -a 
//直接将仓库中所有修改了的文件都添加到索引中,并提交,一步完成
$git revert <commit>
git reset --hard <commit>/HEAD~3
//根据--soft --mixed --hard,会对working tree和index和HEAD进行重置。head~3是退回到三个版本之前,只有HEAD没有意义,相当于什么都没做
//撤销提交,前者会用心提交的方式撤销之前的修改,后者通过回退分支至指定commit
$git rm -r --cached 
git rm --cached filename 
//取消对所有(某个)文件的追踪

这里写图片描述
这里写图片描述
5.撤销修改

$git checkout --filename(.)
//撤销工作区的修改,但是不会改变暂存区
$git reset
//可以撤销add

五.Git开发控制

1.分支与合并
在不同分支间的改变不会互相影响,切换分支后,本地文件也会修改。

$git branch firstbranch
//新建分支
$git branch 
//得到所有分支,前面带星号的为当前分支,初始分支为master
$git checkout firstbranch
//切换分支
$git checkout -b B2 [master]
//在当前【指定分支】上创建子分支,该子分支的意思只是说创建一个拷贝的意思,而不是由父子关系。
$git merge firstbranch
//合并分支firstbranch至当前分支,如果没有冲突(同一个文件被以不同方式修改)
   //合并之后当前分支修改,另一个分支仍不变
 // 如果有冲突,可以通过git diff查看,或者打开有conflict的文件,里面的内容已经被修改成了有详细矛盾信息的形式。之后需要修改该文件,选择需要的版本保留之后,提交就可以完成矛盾消除,否则期间会处于merging状态,无法进行其他commit。
$gitk 
//可以看到可视化的commit历史
$ git branch -d firstbranch
//删除分支,只能删除已经被合并了的,且必须在合并了它的分支里
$git branch -D firstbranch
//强制删除
$git reset --hard HEAD
//撤销合并,但要保证之前的分支还在,HEAD指向最新一次commit

特殊情况:快速向前合并,如果当前分支的所有commit都已经在要合并的另一个分支中了,就会直接将当前分支指向另一个分支,而不是重新创建一个合并提交。

2.git 日志
有很多详细的日志命令的参数,这里不一一细说

$git log 
//得到所有commit的时间,名字
$git log --stat
//会显示哪些文件被修改,增删了多少行内容
$git log  --graph --oneline --all
//显示一个branch树,有--oneline是简化版,--all就是展示所有的
$git log --reverse、
//反序时间查询commit
$git show d71a85001b0562ed05925e0c5635c3c0a1d52068 --pretty=format:" id:%h%n  parent:%p%n  authorname:%an%n  authoremail: %ae%n  commitername:%cn%n  commiteremial:%ce%n  commitdate:%cd%n" --name-only
//显示一个commit的信息,格式自定
$git log --committer=m.goleb@gmail.com --pretty=format:"SHA:%h commitdate:%cd meesage:%s" --reverse
//查询指定提交者的commit信息
%H 提交对象(commit)的完整哈希字串
%h 提交对象的简短哈希字串
%T 树对象(tree)的完整哈希字串
%t 树对象的简短哈希字串
%P 父对象(parent)的完整哈希字串
%p 父对象的简短哈希字串
%an 作者(author)的名字
%ae 作者的电子邮件地址
%ad 作者修订日期(可以用 -date= 选项定制格式)
%ar 作者修订日期,按多久以前的方式显示
%cn 提交者(committer)的名字
%ce 提交者的电子邮件地址
%cd 提交日期
%cr 提交日期,按多久以前的方式显示
%s 提交说明

$git blame head~2 --progress -- LICENSE.txt
//查询一个commit中一个文件的每行代码的owner

3.提交比较——Git diff
这里写图片描述

$git diff master..secbranch
//查看两个分支间的差异
$git diff master...secbranch
//查看master与secbranch的共有父分支与ecbranch的差异,即查看secondbranch自身的改动,而忽视master自己的改动
$ git diff (-cached//查看修改了未暂存的内容(暂存了的,即要下次提交的差异)
$git diff HEAD 
//查看当前工作目录与上次提交head间的差异,即git commit -a要提交的内容
$git diff secbranch (--文件路径)
//当前head与secbranch的差异(比较特定的文件)
$ git diff --stat
//查看当前改动了多少行代码,而不是具体代码

4.分布式工作

$git clone lab1 lab1_clone
//前面是源仓库,后者是将要克隆得到的新仓库,二者完全一样,包括历史记录、
$git pull /d/eclipse/workspace/lab1_clone master
//从另一个仓库里得到对方的合并到master分支
$git remote  add myclone /d/eclipse/workspace/lab1_clone
//定义了操作远程分支的缩写为myclone,之后可以用下一步简单操作
$git fetch myclone 
//得到远程分支myclone中所有的追踪的远程分支
$git fetch secorigin master
//得到远程分支secorigin中的master,即使未追踪
$git merge secorigin/1150540111 --allow-unrelated-histories
//无关项目合并,要加--allow-unrelated-histories的可选参数
$git log -p master..myclone/master
//比较master 与myclone/master的不同,注意不是diff
$git merge myclone/master
$git pull .remotes/myclone/master
//可以把myclone/master当作一个只读的分支使用,可以用来合并
$git pull
//而对于myclone来说,要想从lab1得到修改,不需要地址,因为是克隆得到的,地址信息已存
$git branch -r
//运行该命令可以看到,在克隆的仓库里会保存一个源仓库的主分支origin/master
$git remote add origin https://github.com/WangCYang/lab1.git
//定义远程分支
$git remote (-v//查看所有的远程仓库(的url及权限)
$git remote show origin
//显示指定远程仓库的详细信息
$git remote show origin
//查看某个远程仓库的详细信息
$git push -u origin master
//git push <远程主机名> <本地分支名>  <远程分支名>
//git push origin master:refs/for/master 如果省略远程分支,就直接将新建一个;千万别省略本地分支,否则将是一个空分支传送过去(除非已经有追踪关系)
//加了-u,就是指定当前主机为默认主机,以后直接就可以将git push就好,即使有多个主机的远程分支与当前分支有追踪关系。
$git branch -vv
//查看分支的追踪关系
$git remote rm
//删除远程仓库

六.Eclipse的Git开发——eGit

在eclipse中可以下载EGit的插件 [http://download.eclipse.org/egit/updates/]
这样可以直接在eclipse中可视化得管理项目,并链接到github上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值