git权威指南阅读笔记

git权威指南第2章-爱上git的理由

每日工作备份

1
git add -u #新文件使用git add -i
git commit
git push

协同工作

1
git pull mirror master  #将mirror数据同步到本地,只是一个镜像,只能进行读操作
git push home #从家里面提交编写
git pull home master  #同步家里面的提交

现场版本控制

  • svn解决方案
    。。。
  • git解决方案

    1
    - 创建版本库
    git init
    - 添加文件并提交
    git add -A
    git commit -m "commit message"
    - 创建tag
    git tag v1
    - 开始在工作区工作,修改文件并提交
    git commit -a #修改文件并提交
    - 对修改满意并且想将工作成果带走,可以通过下面的命令逐个生成补丁
    git format-patch v1..HEAD #从tag v1到当前HEAD的所有提交逐个生成patch
    - 把工作成果带走
    git send-email *.patch
  • 重写提交说明

    1
    #修改最新提交的说明
    git commit -amend
    #git rebase -i <commit-id>^
  • 吃后悔药

    1
    #最新提交中包含了不该提交的文件
    git rm --cached windows10.iso
    git commit --amend
    git rebase -i <commit-id>^
  • 更好用的提交列表

  • git add

    1
    git add -u #将所有修改过的文件加入暂存区
    git add -A #将所有新建或删除的文件加入暂存区
    git add -p #对一个文件内的修改有选择性添加
  • 继续修改暂存区的文件

一个提交到暂存区的文件可以继续修改,继续修改的内容不会被提交,除非对此文件再执行一次git add.即一个文件可以有2个版本,提交暂存区一个,工作区一个。

  • git撤销操作

git支持撤销操作,而且可以撤销任意多次

工作进度保存

  • git stash
    场景:在工作区的修改尚未完成,忽然有一个紧急任务,需要从一个干净的工作区开始新的工作,或者要切换到别的分支进行工作,如何保存当前尚未完成的工作进度?
  • git解决方案

    1
    git stash
    git checkout <new_branch> #切换到新的分支开发
    # dev...
    git checkout <orignal_branch> #切换到之前的分支
    git stash pop
  • 代理svn提交实现移动式办公

    1
    git svn clone <svn_repos_url>
    # 断网状态依然可以使用git commit提交
    #网络恢复以后
    git svn fetch #获取svn最新提交
    git svn rebase #变基操作
    git svn dcommit #推送本地提交到svn服务器
  • 无处不在的分页器
    每个git都自动带一个分页器,默认使用less命令(less -FRSX),下面是分页器常用热键

  • 字母q:退出分页器
  • 字母h:显示分页器帮助
  • 空格 往下翻页,b 往上翻页
  • 字母du:往下翻半页,往上翻半页
  • 字母jk:往上翻一行,往下翻一行
  • 如果行太长被截断,使用左右箭头让窗口内容滚动
  • /pattern 向下寻找和pattern匹配的内容
  • ?pattern 向上寻找和pattern匹配的内容
  • 字母nN:代表向前或向后继续寻找
  • 字母gG:代表跳到第一行或最后一行,输入数字加字母g,跳转到数字对应的行
  • !< command> :可以执行shell命令

git权威指南第3章-git安装和使用和技巧

安装

  • 一些技巧
  • mysysGit 命令行补全和忽略文件大小写

    1
    ./etc/git-comletion.bash #补全
    set completion-ignore-case on #忽略大小写
  • mysysGit中文支持

  • shell中文录入问题

    1
    #/etc/inputrc
    set meta-flag on
    set input-meta on
    set output-meta on
    set convert-meta on
  • 分页器中文输出问题

    1
    $ export LESSCHARSET=utf-8
    #或者编辑/etc/profile,让shell启动就加载
    declare -x LESSCHARSET=utf-8
  • ls显示中文文件名

    1
    ls --show-control-chars *.txt
    alias ls = "ls --show-control-chars"
  • mysysGit提交乱码

    1
    git config --system i18n.logOutputEncoding gbk
    git config --system i18n.commitEncoding gbk
    git config --system core.quotepath false
    git status -s

git权威指南第4章-初始化

初始配置

1
git --version
#配置用户名和邮件地址
git config --global user.name "ChenYuanming"
git config --global user.email "git@chenyuanming.cn"
#设置一些别名,如果想让系统所有用户生效使用--system,如果只对本用户生效使用--global
sudo git config --system alias.st status
sudo git config --system alias.ci commit
sudo git config --system alias.co checkout
sudo git config --system alias.br branch
# 开启颜色显示
git config --global color.ui true

创建版本仓库并提交

1
cd ~/workspace
git init demo
cd demo
echo "hello world" >> welcome.txt #创建文件
git add welcome.txt #添加到版本库
git ci -m "initialized." #提交,ci使用了alias,相当于commit
  • 搜索工作区文件内容
    1
    git grep "工作区文件内容" #从当前目录依次往上查找.git,在第一个找到的.git中检索

strace 跟踪命令对磁盘的访问

1
cd ~/workspace
mkdir -p a/b/c
cd ~/workspace/a/b/c
#显示版本库.git所在位置
git rev-parse --git-dir
#显示工作区根目录
git rev-parse --show-toplevel
#相对于工作区根目录的相对目录
git rev-parse --show-prefix
显示当前目录回退到工作的根的深度
git rev-parse --show-cdup
  • git config命令参数
    1
    cd ~/workspace/demo
    git config -e #编辑demo/.git/config
    git config -e --global #修改当前用户 ~/gitconfig
    git config -e --system #修改所有用户 /etc/gitconfig

查看谁完成的提交

1
#删除配置user,email
git config --unset --global user.name
git config --unset --global user.email
#使用--allow-empty允许空白提交
git commit --allow-empty -m "who does this commit"#如果没有配置user.name和user.email.git会使用系统中的用户名和邮箱
#如果想修正上面没有配置信息的提交
git config --global user.name "ChenYuanming"
git config --global user.email "git@chenyuaming.cn"
git commit --amend --allow-empty --reset-author
git log --pretty=fuller #验证提交

备份工作成果

1
git clone demo demo-step-1

git权威指南第5章-暂存区

修改能不能直接提交(不能)

1
echo "Nice to meet you." >> welcome.txt
git diff #比较差异
git commit -m "append a nice line."
git log --pretty=online #木有上次的提交记录,因为没有git add
$ git staus -s
M welcome.txt#git add 之前M位于第二个位置,第一个位置是空格
$ git add
$ git commit
$ git status -s
M  welcome.txt#git add 以后,M位于第一个位置,$正下方
$ echo "Bye bye.">>welcome.txt
$ git status -s
MM welcom.txt

关于git staus -s 出现的两个M,第一列的M:版本库中的文件与处于中间状态(提交任务:提交暂存区)中的文件状态不一致。
第二列的M:工作区(本地)中的文件与处于中间状态(提交任务:提交暂存区)中的文件状态不一致。

  • git diff
  • git diff 直接对比工作区和暂存区改动(相当于commit和没commit的对比?)
  • git diff HEAD 将工作区和HEAD(当前工作分支)对比,(相当于push和没push的对比?)
  • git diff –cached,提交暂存区(提交任务,stage)和版本库中文件差异
  • git diff –staged

  • 不要使用git commit -a
    git commit -a表示对本地所有变更的文件执行提交操作,包括对本地修改的文件和删除的文件,但不包括未被版本库跟踪的文件。

这个命令确实可以简化一些操作,减少用git add命令标识变更文件的步骤,但是如果习惯了这个命令,就会丢掉git暂存区给用户的最大好处:对提交内容进行控制的能力。

搁置问题,暂存状态

git status状态输出中,Git很体贴的告诉了用户如何将加入暂存区的文件从暂存区撤出以便让暂存区和HEAD一致(git reset HEAD 这样提交就不会发生),还告诉用户,对于暂存区更新后在工作区所做的再一次修改有两种选择:再次git add添加到暂存区;git checkout 检出暂存区文件,取消本地修改。但是现在涉及的命令有些难度,一个是git reset,一个是git checkout。需要先理解什么是HEAD,什么是master分支,以及Git对象存储的实现机制等问题,这样才可以更好地操作暂存区。

这个时候,我们不妨先把当前的工作进度保存起来,先去研究下HEAD和master分支的机制后,继续对暂存区的探索。命令git stash就是用于保存当前工作进度的。

1
# 本地工作即使有没commit的,也可以使用下面的命令,perfect
git stash
git status# nothing to commit

Git权威指南视频观看后笔记

  • git add
  • git commit 待提交的功能代码
  • 本地编写代码测试暂存区中代码,测试ok以后,测试代码不需要保存,执行git checkout清空测试代码

  • git add,git commit以后想要回滚,git reset head操作以后commit 到暂存区的代码会变成为提交的状态

  • 如果想要修改这部分代码,直接修改,然后再提交
  • 如果这段代码还是不需要git checkout,清除这部分代码
  • git diff –cached 跟git diff head一样的效果
  • git修改文件后不add,文件会处在游离状态,不隶属于任何分支。有时候切换分支的时候不想把改动带到其他分支,也不想commit到当前分支。这个时候可以用git stash(暂时存档),以后可以git stash pop

  • 只要git commit了,记录都可以找回

git权威指南第6章-对象

1
$ git log -l --pretty=raw
commit 1a0b7703689afae7d014e2408d3ea3702f8b41de
tree 3d191457c701665828ff2b8e8f037215d770d6dd
parent 9ac01d2d017f73a0af4b3a4899541a57a38ea6f1
Author: chenyuanming <git@chenyuanming.cn>
...
  • commit 1a0b7703689afae7d014e2408d3ea3702f8b41de:本次提交的唯一标识
  • tree 3d191457c701665828ff2b8e8f037215d770d6dd:本次提交对应的目录树
  • parent 9ac01d2d017f73a0af4b3a4899541a57a38ea6f1:本地提交的父提交
    研究Git对象ID的重量级武器就是git cat-file命令,用以下命令可以查看一下这三个ID的类型。

    1
    $ git cat-file -t 1a0b77
    commit
    $ git cat-file -t 3d19
    tree
    $ git cat-file -t 9ac0
    commit
  • git cat-file -p 可以查看几个对象的内容

  • SHA1生成
    1
    printf Git |sha1sum

git权威指南第7章-重置

git重置

  • 修改了一个文件(多次修改commit到暂存区,当前次没有add,提交过),撤销
  • git checkout file
  • 修改了一个文件(在暂存区),撤销
  • git reset file
  • 想回到某个版本,当前暂存区,工作区也保存
  • git reset –soft commitId
  • 直接撤销到某次提交,当前记录不要了
  • git reset –hard commitId,如果这个时候想再恢复需要用到git reflog

    使用重置命令很危险,会彻底地丢掉历史。恢复需要使用git reflog

git reflog

1
$ git config core.logallrefupdates
true
$ tail -5 .git/logs/refs/heads/master
# 或者使用下面的命令
$ git reflog show master |  head -5

git reset --hard master@{1}
git log -online#提交记录就回来了

深入了解git reset命令

用法1:git reset [-q] [< commit>] [–] paths…

用法2:git reset [–soft|–mixed|–hard|–merge|–keep] [-q] [< commit>]

上面列出的两个用法,其中都是可选项,可以使用引用或者提交id,如果省略则相当于使用了HEAD的指向作为提交id。

上面列出的两种用法的区别在于,第一种用法在命令中包含路径。为了避免路径和引用(或者提交id)同名而发生冲突,可以在前用两个连续的短线(减号)作为分隔。

第一种用法(包含)不会重置引用,更不会改变工作区,而是用指定commit状态下的文件替换掉暂存区中的文件。例如:git reset HEAD 相当于取消执行执行的git add 命令改变的暂存区。

第二种用法则会重置引用,根据不同的选项,可以对暂存区或工作区进行重置。

  • 使用–hard
  • 替换引用的指向,HEAD指向新的提交id
  • 替换暂存区,替换后,暂存区的内容和引用指向的目录树结构一致
  • 替换工作区,替换后,工作区的内容和暂存区一致,也和新的HEAD指向的目录树内容相同
  • 使用–soft
  • 替换引用的指向,HEAD指向新的提交id,不改变暂存区和工作区
  • 使用–mixed或者不使用(默认–mixed,如git reset ),不改变工作区
  • 替换引用的指向,HEAD指向新的提交id
  • 替换暂存区,替换后,暂存区的内容和引用指向的目录树结构一致

  • git reset – filename = git reset HEAD filename,仅将文件改动撤出暂存区,相当于git add filename的反向操作

  • git reset –soft HEAD^
    工作区和暂存区不改变,但是引用向前回退一次,当对最新的说明或者提交的更改不满意时,撤销最新的提交以便重新提交。

和之前的git commit -amend对比,相当于:

1
git reset --soft HEAD^
git commit -e -F .git/COMMIT_EDITMSG

  • git reset HEAD^ = git reset –mixed HEAD^
    工作区不改变,但是暂存区会退到上一次提交前,引用也回退一次

  • git reset –hard HEAD^
    彻底撤销最近的提交,引用回退到前一次,而且工作区和暂存区都会回到上一次提交的状态,自上一次以来的提交全部丢失。

git权威指南第8章-检出

游离头指针

1
$ cat .git/HEAD
ref: refs/heads/master
$ git branch -v
* master 4902cd3 commit message.
$ git checkout 4902cd3#直接checkout <commit id>,头指针分离了
$ git rev-parse HEAD master #头指针分离了
3d191457c701665828ff2b8e8f037215d770d6dd
9ac01d2d017f73a0af4b3a4899541a57a38ea6f1
#测试在游离分支上提交
$ touch detach-commit.txt
$ git add detach-commit.txt
$ git commit -m "commit in detached HEAD mode"
[detached HEAD acc2f69]...#游离HEAD ID:acc2f69
$ git checou master
$ ls #看不到游离文件detach-commit.txt

拯救游离头指针

1
git merge acc2f69#acc2f69是刚刚游离指针的HEAD
ls #master 下面可以看到游离文件detach-commit.txt了

深入理解git checkout命令

用法1:git checkout [-q] [] [–]

用法2:git checkout []

用法3:git checkout [-m] [[-b|–orphan] ] [start_point]

第一种用法commit是可选项,如果省略则相当于从暂存区(index,不是工作区HEAD)进行检出,会覆盖工作区中不相同的内容。不会改变头指针。

第二种用法则会改变头指针,指向新的branch

第三种用法主要是创建和切换到新的分支,新的分支从指定的提交开始创建。

1
git checkout branch
git checkout =git checkout HEAD#汇总显示工作区,暂存区,HEAD的差异
git checkout -- filename #暂存区替换工作区文件,相当于git add filename 反操作,**这个命令会直接替换掉本地文件,很危险**
git checkout branch -- filename #维持HEAD不变,用branch指向提交中的filename**直接覆盖**暂存区和工作区中响应的文件。
git checkout -- . = git checkout . #暂存区文件**直接覆盖**工作区本地文件

git权威指南第9章-恢复进度

git stash

1
$ git stash list
stash@{0} ...
stash@{1} ...
$ git stash pop
git stash drop <stash id>
git stash clear
####  基于进度建分支
git stash branch <branch-name> <branch>


git clean -nd #测试要删除的目录和文件
git clean -fd #执行真正的删除

git权威指南第10章

删除文件

场景:文件已经被添加到暂存区

1
rm *.txt #将文件从本地删除
git ls-files #暂存区还有
#使用git rm
git rm *.txt
git commit -m "delete *.txt"
git ls-files -with-tree=HEAD^,#文件再版本库删除了,但是可以通过历史版本查看

或者通过下面的方式删除

1
#先回滚之前的操作
git reset --hard HEAD^
git stash apply -q#恢复保的进度
rm *.txt #本地删除
git status -s
git add -u#将本地文件变更全部记录到暂存区中

恢复删除的文件

1
git cat-file -p HEAD~1:welcome.txt > welcome.txt
#或者使用
git show HEAD~1:welcome.txt >welcome.txt
#最简单的是git checkout
git checkout HEAD~1 -- welcome.txt

####  重新提交文件
git add -A
git commit -m "restore file."

移动文件

1
git mv welcome.txt README
git commit -m "rename test"
#撤销之前的提交
git reset --hard HEAD^
git ls-files#文件变成改名前的welcome.txt

文件归档

1
git archive -o latest.zip HEAD#基于最新HEAD
git archive -o partial.tar HEAD src doc#基于最新HEAD 中部分目录
git archive --format=tar --prefix=1.0/ v1.0 |gzip foo-1.0.tar.gz#基于里程碑

git权威指南第11章

查看总的提交次数

1
git rev-list HEAD |wc -l
  • git rev-parse

    1
    ####  显示分支
    git rev-parse --symbolic --branches
    #显示里程碑
    git rev-parse --symbolic --tags
    #显示定义的所有引用
    git rev-parse --symbolic --glob=refs/*
    #显示HEAD对应的SHA1
    git rev-parse HEAD
  • git log

  • git diff

    1
    #比较里程碑B和A
    git diff B A
    #比较工作区和里程碑A
    git diff A
    #比较暂存区和里程碑A
    git diff --cached A
    #比较工作区和暂存区
    git diff
    #比较暂存区和HEAD
    git diff --cached
    #比较工作区和HEAD
    git diff HEAD

git blame

软件发生bug需要定位具体代码的时候使用

git bisect

在已知坏版本和之前好版本之间查找并标记好提交或者坏提交

1
git bisect start

git bisect bad
git bisect good

git checkout bisect/bad
git bisect reset
文章目录
  1. 1. git权威指南第2章-爱上git的理由
    1. 1.1. 每日工作备份
    2. 1.2. 协同工作
    3. 1.3. 现场版本控制
    4. 1.4. 工作进度保存
  2. 2. git权威指南第3章-git安装和使用和技巧
    1. 2.0.1. 安装
  • 3. git权威指南第4章-初始化
    1. 3.0.1. 初始配置
    2. 3.0.2. 创建版本仓库并提交
    3. 3.0.3. 查看谁完成的提交
    4. 3.0.4. 备份工作成果
  • 4. git权威指南第5章-暂存区
    1. 4.0.1. 修改能不能直接提交(不能)
    2. 4.0.2. 搁置问题,暂存状态
    3. 4.0.3. Git权威指南视频观看后笔记
  • 5. git权威指南第6章-对象
  • 6. git权威指南第7章-重置
    1. 6.0.1. git重置
    2. 6.0.2. git reflog
    3. 6.0.3. 深入了解git reset命令
  • 7. git权威指南第8章-检出
    1. 7.0.1. 游离头指针
    2. 7.0.2. 拯救游离头指针
    3. 7.0.3. 深入理解git checkout命令
  • 8. git权威指南第9章-恢复进度
    1. 8.0.1. git stash
  • 9. git权威指南第10章
    1. 9.0.1. 删除文件
    2. 9.0.2. 恢复删除的文件
    3. 9.0.3. 移动文件
    4. 9.0.4. 文件归档
  • 10. git权威指南第11章
    1. 10.0.1. 查看总的提交次数
    2. 10.0.2. git blame
    3. 10.0.3. git bisect