Git权威指南-笔记
- Git 忽略已跟踪文件的改动
$git update-index --assume-unchanged /path/to/file
git update-index --assume-unchanged *.properties
- 恢复跟踪
$ git update-index --no-assume-unchanged /path/to/file
git update-index --no-assume-unchanged *.properties
- path 可以使用正则表达式
? 代表任意的一个字符
* 代表任意数目的字符
{!ab} 必须不是此类型
{ab,bb,cx} 代表ab,bb,cx中任一类型即可
[abc] 代表a,b,c中任一字符即可
[ ^abc] 代表必须不是a,b,c中任一字符
由于git不会加入空目录,所以下面做法会导致tmp不会存在 tmp/* //忽略tmp文件夹所有文件
git push命令
$ git push <远程主机名> <本地分支名>:<远程分支名>
$ git push origin master
上面命令表示,将本地的master分支推送到origin主机的master分支。如果后者不存在,则会被新建。
如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支。
$ git push origin :master
# 等同于
$ git push origin --delete master
如果当前分支与远程分支之间存在追踪关系,则本地分支和远程分支都可以省略。
$ git push origin
上面命令表示,将当前分支推送到origin主机的对应分支。
如果当前分支只有一个追踪分支,那么主机名都可以省略。
$ git push
- 如果当前分支与多个主机存在追踪关系,则可以使用-u选项指定一个默认主机,这样后面就可以不加任何参数使用git push。
$ git push -u origin master
- 生成SSH KEY
$ ssh-keygen -t rsa -C "mys163"
- 将Public Key 添加到GitHub
测试
输入命名后,输入yes才能回车
$ ssh git@github.com
- git下中文文件名不识别,路径不存在问题
$ git config --global core.quotepath false
第4章 Git初始化
4.1 创建版本库及第一次提交
- 全局文件 设置
$git config --global user.name "Jiang Xin"
$git config --global user.email jiangxin@ossxp.com
- 设置别名(所有用户)全局配置
$sudo git config --system alias.st status
- 设置别名(当前用户)全局配置
$git config --global alias.st status
- 设置Git别名
$sudo git config --system alias.st status
- 在Git命令输出中开启颜色显示。
$git config --global color.ui true
- 显示版本库.git目录所在的位置dsa
git rev-parse --git-dir
- 显示工作区根目录。
$git rev-parse --show-toplevel
- 相对于工作区根目录的相对目录。
$git rev-parse --show-prefix
- 显示从当前目录(cd)后退(up)到工作区的根的深度。
$git rev-parse --show-cdup
4.3
执行下面的命令,将打开/path/to/my/workspace/demo/.git/config文件进行编辑。
$cd/path/to/my/workspace/demo/
$git config -e
$git config -e --global #全局配置文件
$git config -e --system #系统级配置文件
4.4
执行下面的命令,删除Git全局配置文件中关于user.name和user.email的设置:
$git config --unset--global user.name
$git config --unset--global user.email
$git log --pretty=fuller
$git commit --amend --allow-empty --reset-author
说明:
-
参数--amend是对刚刚的提交进行修补,这样就可以改正前面的提交中错误的用户名和邮件地址,而不会产生另外的新提交。
-
参数--allow-empty使得空白提交被允许。之所以这里必须使用此参数是因为要进行的修补提交实际上是一个空白提交。
-
参数--reset-author的含义是将Author(提交者)的ID同步修改,否则只会影响提交者(Commit)的ID。使用此参数也会重置AuthorDate信息。
-
备份:
$cd/path/to/my/workspace
$git clone demo demo-step-1
第5章 Git暂存区
git log查看提交日志(附加的--stat参数可以看到每次提交的文件变更统计)。
$git log --stat
$git log --pretty=oneline
$git status -s #显示精简格式的状态输出
$git diff #工作区与提交任务(提交暂存区,stage)中相比的差异
$git diff HEAD #将工作区和HEAD(当前工作分支)相比
$git diff --cached
#通过参数--cached或--staged调用git diff命令,看到的是提交暂存区(提交任务,stage)和版本库中文件的差异。
5.2 理解Git暂存区(stage)
工作区add -->暂存区
工作区<-- git checkout--<file>暂存区
git rm--cached<file> -->暂存区
暂存区commit -->版本库
暂存区<--git reset HEAD版本库
工作区、暂存区<--git checkout HEAD<file> 版本库
图 5-1 工作区、版本库、暂存区原理图
当对工作区修改(或新增)的文件执行git add命令时,暂存区的目录树将被更新,同时工作区修改(或新增)的文件内容会被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。
当执行提交操作(git commit)时,暂存区的目录树会写到版本库(对象库)中,master分支会做相应的更新,即master最新指向的目录树就是提交时原暂存区的目录树。
当执行git reset HEAD命令时,暂存区的目录树会被重写,会被master分支指向的目录树所替换,但是工作区不受影响。
当执行git rm--cached<file>命令时,会直接从暂存区删除文件,工作区则不做出改变。
当执行git checkout.或git checkout--<file>命令时,会用暂存区全部的文件或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区的改动。
当执行git checkout HEAD.或git checkout HEAD<file>命令时,会用HEAD指向的master分支中的全部或部分文件替换暂存区和工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。
5.3 Git Diff
对于HEAD(版本库中当前提交)指向的目录树,可以使用Git底层命令ls-tree来查看。
$git ls-tree -l HEAD
$git clean -fd # 清除当前工作区中没有加入版本库的文件和目录(非跟踪文件和目录)
$git checkout. # 用暂存区内容刷新工作区。
$git ls-files -s #显示暂存区的目录树
- Git Diff魔法
git diff HEAD # 显示工作区和版本库的差别
git diff master # 显示工作区和版本库的差别
git diff # 显示工作区和暂存区的差别
git diff --cached # 显示暂存区和版本库的差别
git diff --cached HEAD # 显示暂存区和版本库的差别
5.3 不要使用git commit -a
Git的提交命令(git commit)可以带上-a参数,对本地所有变更的文件执行提交操作,包括对本地修改的文件和删除的文件,但不包括未被版本库跟踪的文件
5.5 搁置问题,暂存状态
$git stash #命令git stash就是用于保存当前工作进度的。
第6章 Git对象
6.1 Git对象库探秘
$git status -s -b
#-s参数以显示精简输出外,-b参数,能够同时显示出当前工作分支的名称
现在连续执行下面的三个命令会看到相同的输出:
$git log -l HEAD
$git log -l master
$git log -l refs/heads/master
也就是说,在当前版本库中,HEAD、master和refs/heads/master具有相同的指向。
第7章 Git重置
7.1 分支游标master探秘
$git log --graph --oneline
$git reset --hard HEAD^ #将master重置到上一个老的提交上
$git reset --hard 9e8a761 #重置到某个提交点上,会彻底地丢弃历史
7.2 用reflog挽救错误的重置
$git reflog show master|head-5
$git reset --hard master@{2} #将引用master切换到两次变更之前的值
7.3 深入了解git reset命令
用法一:git reset[-q][<commit>][--]<paths>...
用法二:git reset[--soft|--mixed|--hard|--merge|--keep][-q][<commit>]
工作区<--1 暂存区 <--2 master <--3 commit
第一种用法(包含了路径<paths>的用法)不会重置引用,更不会改变工作区,而是用指定提交状态(
)下的文件( )替换掉暂存区中的文件。例如命令git reset HEAD 相当于取消之前执行的git add 命令时改变的暂存区。
第二种用法 (不使用路径<paths>的用法)则会重置引用,根据不同的选项,可以对暂存区域或者工作区进行重置。
- 使用参数 --hard ,如:git reset --hard
会执行上图中全部动作的1,2,3。替换引用的指向,替换暂存区,替换工作区。 - 使用参数 --soft ,如:git reset --soft
会执行上图中的操作1,只改变引用的指向,不改变暂存区和工作区。 - 使用参数--mixed或者不使用参数(默认为--mixed),如:git reset
会执行上图的1,和2。即改变引用的指向和重置暂存区,不改变工作区 - 命令: git reset 重置暂存区,工作区不受影响。相当于git add 命令撤销
- 命令: git reset HEAD 同上
- 命令: git reset --filename 仅将文件filename的改动撤出暂存区,暂存区中其他文件不改变。相当于对命令git add filename的反向操作。
- 命令:git reset HEAD filename 同上
- 命令:git reset--soft HEAD^ 工作区和暂存区不改变,但是引用向前回退一次。当对最新提交的提交说明或提交的更改不满意时,撤销最新的提交以便重新提交。
- 命令:git reset HEAD^ 工作区不改变,但是暂存区会回退到上一次提交之前,引用也会回退一次。
- 命令:git reset --mixed HEAD^ 同上。
- 命令:git reset --hard HEAD^ 彻底撤销最近的提交。引用回退到前一次,而且工作区和暂存区都会回退到上一次提交的状态。自上一次以来的提交全部丢失。
第8章 Git检出
8.1 HEAD的重置即检出
8.3 深入了解git checkout命令

浙公网安备 33010602011771号