本文地址:https://blog.csdn.net/hancoder/article/details/120748968

本文是视频笔记:UP主 麦兜搞IT

git原理

命令预览

# 查看类型
$ git cat-file -t ce0136
blob
# 查看内容 # 不存储文件名
$ git cat-file -p ce0136
hello
# 查看大小
$ git cat-file -s ce0136
6git ls-files -s# 查看压缩包
git verify-pack -v .git/objects/pack/...idx# 压缩
git gc
# 删除垃圾
git prune# 查看远程分支和本地以为的远程分支差异
git branch -vv

0、目录结构

进入空目录,执行git init将会出现.git目录

.git目录

./.git
./.git/objects
./.git/objects/info
./.git/objects/pack
./.git/hooks
./.git/info
./.git/info/exclude
./.git/HEAD
./.git/branches
./.git/description
./.git/refs
./.git/refs/heads
./.git/refs/tags./.git/config # 配置
$ cat .git/config
[core]repositoryformatversion = 0filemode = truebare = falselogallrefupdates = true$ git config user.name "demo"
$ git config user.email "demo@demo.com"
$ cat .git/config
[core]repositoryformatversion = 0filemode = truebare = falselogallrefupdates = true
[user]  # 新增内容name = demoemail = demo@demo.com$ git config -l
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
user.name=demo
user.email=demo@demo.com

一、三区

工作区演示(新建文件)

如下案例演示更改内容时,git不保存东西,当前修改仅在工作区

$ echo "hello">hello.txt
$ cat hello.txt
hello======================================
.
./hello.txt
./.git
./.git/objects
./.git/objects/info
./.git/objects/pack
./.git/hooks
./.git/info
./.git/info/exclude
./.git/HEAD
./.git/branches
./.git/description
./.git/refs
./.git/refs/heads
./.git/refs/tags
./.git/config

查看当前状态

$ git status
On branch masterNo commits yetUntracked files:(use "git add <file>..." to include in what will be committed)hello.txt  # 未被跟踪的文件nothing added to commit but untracked files present (use "git add" to track)

暂存区演示(git add)

暂存区==索引区

$ git add hello.txt
=====================
.
./hello.txt
./.git
./.git/objects
./.git/objects/info
./.git/objects/ce
./.git/objects/ce/013625030ba8dba906f756967f9e9ca394464a
./.git/objects/pack
./.git/hooks
./.git/info
./.git/info/exclude
./.git/HEAD
./.git/index
./.git/branches
./.git/description
./.git/refs
./.git/refs/heads
./.git/refs/tags
./.git/config

$ tree .git/
.git/
├── branches
├── config
├── description
├── HEAD
├── hooks
├── index
├── info
│   └── exclude
├── objects
│   ├── ce
│   │   └── 013625030ba8dba906f756967f9e9ca394464a
│   ├── info
│   └── pack
└── refs├── heads└── tags

1)blob对象

# 查看类型
$ git cat-file -t ce0136
blob
# 查看内容 # 不存储文件名
$ git cat-file -p ce0136
hello
# 查看大小
$ git cat-file -s ce0136
6

关于不存文件名的验证就是新建另外一个文件,文件内容跟hello.txt一样,git add后发现.git/objects目录下没有变化

查看当前状态。

$ git status
On branch masterNo commits yetChanges to be committed:(use "git rm --cached <file>..." to unstage)new file:   hello.txt

habash算法简述:

特征:

  • 输出长度一致
  • 输入不同,输出就不同
  • git的哈希是blob 文件内容的字节长度\0 文件内容
blob 6\0 hello | bashasum
t$ cat .git/objects/ce/013625030ba8dba906f756967f9e9ca394464a
# 输出原始内容的压缩 大小<原始大小B+附加压缩信息的内容B
xK⚌⚌OR0c⚌H⚌⚌⚌⚌⚌

文件名字在哪.git/index

$ cat .git/index
DIRCafd⚌⚌@afd⚌⚌(!>⚌⚌⚌⚌⚌6%⚌۩⚌V⚌⚌⚌⚌FJ     hello.txtIђ⚌⚌⚌⚌W⚌vLt, # 乱码但不是可以看到文件名$ git ls-files # 查看当前索区文件
hello.txt
$ git ls-files -s # 附带文件内容
# 文件权限 blob文件内容 0 文件名
100644 ce013625030ba8dba906f756967f9e9ca394464a 0       hello.txt

从这里可以看出我们就能在git commit时知道文件名和文件内容了

commit

$ git commit -m "first111"
[master (root-commit) 3afed10] first1111 file changed, 1 insertion(+)create mode 100644 hello.txt
.git/
├── branches
├── COMMIT_EDITMSG
├── config
├── description
├── HEAD
├── hooks
├── index
├── info
│   └── exclude
├── logs # 新
│   ├── HEAD
│   └── refs
│       └── heads
│           └── master
├── objects
│   ├── 3a # 新
│   │   └── fed103e52db5eb0e0f8ffaacf8cf914c26fb80
│   ├── aa # 新
│   │   └── a96ced2d9a1c8e72c56b253a0e2fe78393feb7
│   ├── ce
│   │   └── 013625030ba8dba906f756967f9e9ca394464a
│   ├── info
│   └── pack
└── refs├── heads│   └── master # 新└── tags

commit和tree对象

查看新增的两个object是什么

$ git cat-file -t 3afe
commit# 看提交的内容
$ git cat-file -p 3afe
# 这个下面看
tree aaa96ced2d9a1c8e72c56b253a0e2fe78393feb7
# 作者 时间 时区
author demo <demo@demo.com> 1634104255 +0800
committer demo <demo@demo.com> 1634104255 +0800
# 自己输入的
first111
==========================================
# 当前内容tree
$ git cat-file -t aaa9
tree$ git cat-file -p aaa9
100644 blob ce013625030ba8dba906f756967f9e9ca394464a    hello.txt

结构:

    commit|tree|blob1  blob2

logs

还生成了logs

heads

还生成了heads

$ cat .git/refs/heads/master
# 输出commit对象
3afed103e52db5eb0e0f8ffaacf8cf914c26fb80# 查看当前指针,也就是当前在哪个分支
$ cat .git/HEAD
ref: refs/heads/master

修改文件

修改下文件

$ echo " hi">> hello.txt
$ cat hello.txt
hellohi

.git目录无变化

$ git add hello.txt
$ tree .git/
.git/
├── branches
├── COMMIT_EDITMSG
├── config
├── description
├── HEAD
├── hooks
├── index
├── info
│   └── exclude
├── logs
│   ├── HEAD
│   └── refs
│       └── heads
│           └── master
├── objects
│   ├── 3a
│   │   └── fed103e52db5eb0e0f8ffaacf8cf914c26fb80
│   ├── aa
│   │   └── a96ced2d9a1c8e72c56b253a0e2fe78393feb7
│   ├── ce
│   │   └── 013625030ba8dba906f756967f9e9ca394464a
│   ├── dc # 新增blob对象
│   │   └── 0b2eb8c8ef67436d8209ddab5793e84ae5125c
│   ├── info
│   └── pack
└── refs├── heads│   └── master└── tags
# 查看文件指向,是我们新生成的blob对象
$ git ls-files -s
100644 dc0b2eb8c8ef67436d8209ddab5793e84ae5125c 0       hello.txt
$ git cat-file -t 100b
commit
================
$ git cat-file -p 100b
tree 48f49d9582feffae9f1c2bc5c6fdc5008cee1c66
# 标注了parent上个版本commit
parent 3afed103e52db5eb0e0f8ffaacf8cf914c26fb80
author demo <demo@demo.com> 1634106985 +0800
committer demo <demo@demo.com> 1634106985 +08002nd
=================
$ git cat-file -t 48f4
tree$ git cat-file -p 48f4
100644 blob dc0b2eb8c8ef67436d8209ddab5793e84ae5125c    hello.txt

$ tree .git/
.git/
├── branches
├── COMMIT_EDITMSG
├── config
├── description
├── HEAD
├── hooks
├── index
├── info
│   └── exclude
├── logs
│   ├── HEAD
│   └── refs
│       └── heads
│           └── master
├── objects
│   ├── 10
│   │   └── 0b7ac61f2ae0fbf0c26200c5d3cdd4c3c9a377
│   ├── 3a
│   │   └── fed103e52db5eb0e0f8ffaacf8cf914c26fb80
│   ├── 48
│   │   └── f49d9582feffae9f1c2bc5c6fdc5008cee1c66
│   ├── aa
│   │   └── a96ced2d9a1c8e72c56b253a0e2fe78393feb7
│   ├── ce
│   │   └── 013625030ba8dba906f756967f9e9ca394464a
│   ├── dc
│   │   └── 0b2eb8c8ef67436d8209ddab5793e84ae5125c
│   ├── info
│   └── pack
└── refs├── heads│   └── master└── tags

文件夹

创建空文件夹

$ mkdir folder1
$ git status
On branch master
nothing to commit, working tree clean
# 说明空文件夹不算任何改变
$ cd folder1/
$ echo "file3v1">file3.txt$ cd ..
$ git status
On branch master
Untracked files:(use "git add <file>..." to include in what will be committed)folder1/nothing added to commit but untracked files present (use "git add" to track)
$ git add .
$ tree .git/
.git/
├── branches
├── COMMIT_EDITMSG
├── config
├── description
├── HEAD
├── hooks
├── index
├── info
│   └── exclude
├── logs
│   ├── HEAD
│   └── refs
│       └── heads
│           └── master
├── objects
│   ├── 10
│   │   └── 0b7ac61f2ae0fbf0c26200c5d3cdd4c3c9a377
│   ├── 3a
│   │   └── fed103e52db5eb0e0f8ffaacf8cf914c26fb80
│   ├── 48
│   │   └── f49d9582feffae9f1c2bc5c6fdc5008cee1c66
│   ├── 9e # 新增  # 文件夹没有对应的对象
│   │   └── b2346b92a4411971092afb38de6fe0df1b8717
│   ├── aa
│   │   └── a96ced2d9a1c8e72c56b253a0e2fe78393feb7
│   ├── ce
│   │   └── 013625030ba8dba906f756967f9e9ca394464a
│   ├── dc
│   │   └── 0b2eb8c8ef67436d8209ddab5793e84ae5125c
│   ├── info
│   └── pack
└── refs├── heads│   └── master└── tags
$ git cat-file -p 9eb2
file3v1$ git ls-files -s
100644 9eb2346b92a4411971092afb38de6fe0df1b8717 0       folder1/file3.txt
100644 dc0b2eb8c8ef67436d8209ddab5793e84ae5125c 0       hello.txt
$ git commit -m "3d"
[master 9865570] 3d1 file changed, 1 insertion(+)create mode 100644 folder1/file3.txt├── objects
│   ├── 10
│   │   └── 0b7ac61f2ae0fbf0c26200c5d3cdd4c3c9a377
│   ├── 13
│   │   └── 300f3a735cb3e605fee5fd6f14459238ce2423
│   ├── 3a
│   │   └── fed103e52db5eb0e0f8ffaacf8cf914c26fb80
│   ├── 48
│   │   └── f49d9582feffae9f1c2bc5c6fdc5008cee1c66
│   ├── 6b # 新增
│   │   └── d9bece9288dc1eb31805f0acf0a7ca2af03f8b
│   ├── 98 # 新增
│   │   └── 65570f017280ca316972dd135d18023b9ba59f
│   ├── 9e
│   │   └── b2346b92a4411971092afb38de6fe0df1b8717
│   ├── aa
│   │   └── a96ced2d9a1c8e72c56b253a0e2fe78393feb7
│   ├── ce
│   │   └── 013625030ba8dba906f756967f9e9ca394464a
│   ├── dc
│   │   └── 0b2eb8c8ef67436d8209ddab5793e84ae5125c
│   ├── info
│   └── pack
$ git cat-file -t 9865
commit
$ git cat-file -p 9865
tree 13300f3a735cb3e605fee5fd6f14459238ce2423
parent 100b7ac61f2ae0fbf0c26200c5d3cdd4c3c9a377
author demo <demo@demo.com> 1634109138 +0800
committer demo <demo@demo.com> 1634109138 +08003d
$ git cat-file -p 1330
040000 tree 6bd9bece9288dc1eb31805f0acf0a7ca2af03f8b    folder1
100644 blob dc0b2eb8c8ef67436d8209ddab5793e84ae5125c    hello.txt
# 上面可以看出文件夹是个tree$ git cat-file -t 6bd9
tree
$ git cat-file -p 6bd9
100644 blob 9eb2346b92a4411971092afb38de6fe0df1b8717    file3.txt

commit时只生成tree和commit对象。add时生成blob对象

也就是说每个tree是个文件夹

git的文件状态

二、branch和HEAD

branches are named pointers to commits

分支指向commit

HEAD文件指向当前分支最新的commit

$ cat .git/HEAD
ref: refs/heads/master$ cat .git/refs/heads/master
9865570f017280ca316972dd135d18023b9ba59f
$ git cat-file -t 9865
commit$ cat .git/logs/HEAD
0000000000000000000000000000000000000000 3afed103e52db5eb0e0f8ffaacf8cf914c26fb80 demo <demo@demo.com> 1634104255 +0800  commit (initial): first111
3afed103e52db5eb0e0f8ffaacf8cf914c26fb80 100b7ac61f2ae0fbf0c26200c5d3cdd4c3c9a377 demo <demo@demo.com> 1634106985 +0800  commit: 2nd
100b7ac61f2ae0fbf0c26200c5d3cdd4c3c9a377 9865570f017280ca316972dd135d18023b9ba59f demo <demo@demo.com> 1634109138 +0800  commit: 3d

切换分支就是切换HEAD指向

$ git branch
* master
$ git branch dev
$ git branchdev
* master$ git branch -d dev
Deleted branch dev (was 9865570).
$ git branch
* master
$ git branch dev

切换

$ git branch dev
$ git checkout dev
Switched to branch 'dev'
$ git branch
* devmaster$ cat .git/refs/heads/
dev     master$ git log
commit 9865570f017280ca316972dd135d18023b9ba59f (HEAD -> dev, master)
Author: demo <demo@demo.com>
Date:   Wed Oct 13 15:12:18 2021 +08003dcommit 100b7ac61f2ae0fbf0c26200c5d3cdd4c3c9a377
Author: demo <demo@demo.com>
Date:   Wed Oct 13 14:36:25 2021 +08002ndcommit 3afed103e52db5eb0e0f8ffaacf8cf914c26fb80
Author: demo <demo@demo.com>
Date:   Wed Oct 13 13:50:55 2021 +0800first111
$ git branch
* devmaster
$ echo "dev">dev.txt
$ ls
dev.txt  folder1  hello.txt$ git add .
$ git commit -m "dev 1st"
[dev 4c807f2] dev 1st1 file changed, 1 insertion(+)create mode 100644 dev.txt$ git log
commit 4c807f2a27eb709abef22491166c30a6d71166de (HEAD -> dev)
Author: demo <demo@demo.com>
Date:   Wed Oct 13 15:50:13 2021 +0800dev 1stcommit 9865570f017280ca316972dd135d18023b9ba59f (master)
Author: demo <demo@demo.com>
Date:   Wed Oct 13 15:12:18 2021 +08003d
t$ tree .git --sort=ctime
.git
├── branches
├── description
├── info
│   └── exclude
├── refs
│   ├── tags
│   └── heads
│       ├── master
│       └── dev
├── hooks
├── logs
│   ├── refs
│   │   └── heads
│   │       ├── master
│   │       └── dev
│   └── HEAD
├── config
├── HEAD
├── COMMIT_EDITMSG
├── index
└── objects├── info├── pack├── ce│   └── 013625030ba8dba906f756967f9e9ca394464a├── 3a│   └── fed103e52db5eb0e0f8ffaacf8cf914c26fb80├── aa│   └── a96ced2d9a1c8e72c56b253a0e2fe78393feb7├── dc│   └── 0b2eb8c8ef67436d8209ddab5793e84ae5125c├── 10│   └── 0b7ac61f2ae0fbf0c26200c5d3cdd4c3c9a377├── 48│   └── f49d9582feffae9f1c2bc5c6fdc5008cee1c66├── 9e│   └── b2346b92a4411971092afb38de6fe0df1b8717├── 13│   └── 300f3a735cb3e605fee5fd6f14459238ce2423├── 6b│   └── d9bece9288dc1eb31805f0acf0a7ca2af03f8b├── 98│   └── 65570f017280ca316972dd135d18023b9ba59f├── 38 # blob│   └── f8e886e1a6d733aa9bfa7282568f83c133ecd6├── 4c # commit│   └── 807f2a27eb709abef22491166c30a6d71166de└── a1 # tree└── 396e6bd4f6d8082630af880d795a4c28b67deb25 directories, 24 files$ git cat-file -t 38f8
blob
$ git cat-file -t 4c80
commit
$ git cat-file -t a139
tree

删除分支后特有的对象不会删除

checkout commit与分支恢复

会指向commit,没有分支名字

要保存的话需要保存到分支

git switch -c <new-branch>
# 这个命令更好用
git checkout -b <分支名>
# 或者取消操作
git switch -

也就是说如果没merge前合并了分支,我们可以先checkout到commit上,

# 查看所有分支的log
git reflog
git checkout commit号
git checkout -b 新分支名
# 就可以合并了

三、git diff

git diff比较工作区和暂存区的区别;或是当前索引区和代码仓库的区别

当前工作区和索引区的差别

index 索引区的blob...当前工作区虚拟的blob
a是索引区,b是工作区

四、push

本地已经有仓库时如何提交到远程仓库

# 指定远程仓库
git remote add origin git@github.com:han/git-demo.gitgit push -u origin master
$tree .git
25 directories, 24 files
$ git remote add origin https://gitee.com/HanFerm/git-demo.git
$tree .git
25 directories, 24 files$ cat .git/config
[core]repositoryformatversion = 0filemode = truebare = falselogallrefupdates = true
[user]name = demoemail = demo@demo.com
[remote "origin"]url = https://gitee.com/HanFerm/git-demo.gitfetch = +refs/heads/*:refs/remotes/origin/*
$ git push -u origin master
Username for 'https://gitee.com': hanferm
Password for 'https://hanferm@gitee.com':
Enumerating objects: 10, done.
Counting objects: 100% (10/10), done.
Delta compression using up to 40 threads
Compressing objects: 100% (4/4), done.
Writing objects: 100% (10/10), 685 bytes | 685.00 KiB/s, done.
Total 10 (delta 0), reused 0 (delta 0)
remote: Powered by GITEE.COM [GNK-6.1]
To https://gitee.com/HanFerm/git-demo.git* [new branch]      master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.$tree .git
25+4 directories, 24+2 files

$ cat .git/refs/remotes/origin/master
9865570f017280ca316972dd135d18023b9ba59f
$ cat .git/refs/heads/master
9865570f017280ca316972dd135d18023b9ba59f # 说明本地master分支和远程master分支是同步的
$ git cat-file -t 9865
commit
$ git cat-file -p 9865
tree 13300f3a735cb3e605fee5fd6f14459238ce2423
parent 100b7ac61f2ae0fbf0c26200c5d3cdd4c3c9a377
author demo <demo@demo.com> 1634109138 +0800
committer demo <demo@demo.com> 1634109138 +08003d$ git log
commit 9865570f017280ca316972dd135d18023b9ba59f (HEAD -> , master, origin/master)
Author: demo <demo@demo.com>
Date:   Wed Oct 13 15:12:18 2021 +08003d

远程仓库的样子

gitlab中心有了如gitTest.git文件夹,和本地的.git文件一致

五、GC

gc对象的压缩

du -h /git gc
再使用du -h .git/objects查看时会发现减小很多内存,是压缩到了.git/objects/pack中

有规则的文件压缩才显著

git pack

如果两个文件的SHA1值相等,是不同的blob,因为是blob size\0这样的形式进行hash的

git gc时输出delta=3,因为压缩了3个blob对象

看内容:git verify-pack -v .git/objects/pack/...idx

git clone拉过来的都是压缩后的对象

解压缩:git unpack-objects

git help unpack-objects

在仓库里的文件不会解压缩,要想解压缩需要将.pack文件移除,然后git unpack-objects < AAA.pack文件

prune

比如两次git add一次commit就会产生垃圾对象

git gc只是压缩了需要的文件,而垃圾对象blob并没有删除,我们可以使用git prune命令删除垃圾对象

git gc只在大多数情况下删除垃圾对象,有时候不删除

可以使用git prune -n查看此次要删除的垃圾对象

git fsck可以看到悬空对象

但是把分支删除了之后对象也还在时,prune就不起作用了,git gc也会把删除掉分支的对象压缩了,上面的命令查出来均不认为是垃圾对象。此时可以使用更复杂的命令

六、merge

fast forward

这种场景是没有冲突的场景,仅仅是领先于master而已,拼接在master前部即可

git merge branch2
Updating 8d44旧指针...bd57新指针
Fast-forward
# merge后多了个ORIG_HEAD目录,记录HEAD的之前状态# HEAD往前移动一步,此时工作区就有未add内容了
git reset ORIG_HEAD

3 way merge不带冲突

看指定的对象,会发现有2个parent

3 way merge带冲突

# 下面命令会发生冲突
(master)git merge bugfix
$ git status
both modified
$ cat test.txt
<<<<<< HEAD
add from master
========
add from bugfix
>>>>>>>> bugfix$ git ls-files -s

git merge发生冲突时显示的内容就是根据这3个index结合而成的

修改完后git commit即可,无需加-m "",因为已经有信息了

git log后跟正常合并没差别

七、rebase

此时要求dev有master最新的commit

执行rebase后会同步master最新的commit

(dev) $ git rebase master

因为同步后原来dev的新提交由于跟时间等有原因,SAH1值会变,

有冲突时先解决冲突。

但是有问题的情况是如果原来的已经push到远程,这样就都了一些SHA1,push就会出错

还有问题是如果dev push到远程后别人已经基于它修改了,此时你rebase后强制push到远程仓库,别人就push不上去,所以别人也在使用的dev不要rebase。此外不要在master上rebase。

八、tag

git tag <tagname>
git tag -a <tag name> -m <tag msg>

九、fetch本地/远程仓库

# 查看本地仓库分支
git branch
# 查看远程仓库分支
git branch -r
# 远程信息被压缩到packed-refs文件中# 检查本地以为的远程仓库和真正的远程仓库分支情况与同步
git fetch
# 查看远程仓库和本地关联情况
git remote show origin

下面要说明的是压缩的packed-refs不是实时的,也就不是最新的SHA1

最新的远程信息在remotes下

此时再git log会发现没有origin的指针信息了,因为远程已经超前于log了

下面观察远程新建分支后本地的变化

但是远程分支删除时使用git fetch是无效果的,下面的两种命令可以解决该问题

git remote show origin输出的tracked代表本地有对应的分支,

使用git branch -vv可以查看远程分支和本地分支是否自己各自创建的同名分支

十、pull=fetch+merge

pull=fetch+merge

fetch完后本地知道了origin/master的指向,然后master merge origin/master后两个master才同步,此时就是一个fast forward merge

如果本地master和远程master冲突:

此时本地以为的origin和远程又不同步了,所以需要push,push后就又一致了

建议:明知道有冲突建议先fetch,然后git diff origin/master看看有没有冲突

FEACH_HEAD


执行完fetch后master和dev的顺序发生了变化。切换分支后只要不运行fetch,该FEACH_HEAD就不会变

这个排名有什么用呢?

十一、push

# 直接敲git push若分支没有和远程分支关联,会不成功,此时可以
git push

git push --set-upstream origin feature-1意思是要在远程创建名为feature-1的分支git push  origin feature-1也可以推送,--set-upstream的意思是进行关联,如果不带的话我们-vv还是看不到关联,下次还是不能输入git push
--set-upstream的简写是-u
# 删除远程分支
git push origin -d feature-1

十二、hook

什么是hook:在某些操作前后触发

红色无法避免跳过

黄色可跳过

pre-commit钩子

.sample是不生效的

比如下面的pre,他是验证如果内容是如果使用了非ASCII码的名字,就会exit 1代表检查未通过。exit 0才执行通过

$ cat pre-commit.sample
#!/bin/sh
#
# An example hook script to verify what is about to be committed.
# Called by "git commit" with no arguments.  The hook should
# exit with non-zero status after issuing an appropriate message if
# it wants to stop the commit.
#
# To enable this hook, rename this file to "pre-commit".if git rev-parse --verify HEAD >/dev/null 2>&1
thenagainst=HEAD
else# Initial commit: diff against an empty tree objectagainst=$(git hash-object -t tree /dev/null)
fi# If you want to allow non-ASCII filenames set this variable to true.
allownonascii=$(git config --bool hooks.allownonascii)# Redirect output to stderr.
exec 1>&2# Cross platform projects tend to avoid non-ASCII filenames; prevent
# them from being added to the repository. We exploit the fact that the
# printable range starts at the space character and ends with tilde.
if [ "$allownonascii" != "true" ] &&# Note that the use of brackets around a tr range is ok here, (it's# even required, for portability to Solaris 10's /usr/bin/tr), since# the square bracket bytes happen to fall in the designated range.test $(git diff --cached --name-only --diff-filter=A -z $against |LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0
thencat <<\EOF
Error: Attempt to add a non-ASCII file name.This can cause problems if you want to work with people on other platforms.To be portable it is advisable to rename the file.If you know what you are doing you can disable this check using:git config hooks.allownonascii true
EOFexit 1
fi# If there are whitespace errors, print the offending file names and fail.
exec git diff-index --check --cached $against --

【git】原理与.git文件夹解读相关推荐

  1. git使用学习四、git add忽略指定文件夹与文件

    git使用学习四.git add忽略指定文件夹与文件 前言 .gitignore 解决提前git commit导致.gitignore失效的问题 解决错误添加数据集导致.git文件夹太大的问题 前言 ...

  2. linux git 推送空文件夹

    /********************************************************************************** linux git 推送空文件夹 ...

  3. git删除远程服务的文件夹

    首先查看当前分支:git branch -a 删除缓存的idea:git rm --cached -r .idea 提交gitiginore文件,将.idea从源代码仓库中删除(-m 表示注解):   ...

  4. git 怎么提交忽略文件夹_git 设置忽略文件提交的几种方式

    在使用git进行项目管理的时候,有时候一些安装包之类,或者自己本地项目使用的一些编译文件,在不需要提交到远程仓库时,可以通过以下几种方式设置忽略提交,包括文件夹和单个文件.之前自己项目里面采用了第二种 ...

  5. git 如何忽略掉文件夹_#PY小贴士# 我的git仓库为什么每次提交都有很多改动?

    git 是如今最流行的代码版本管理工具,没有之一. 今天说一个 git 使用时的细节:.gitignore 我们在使用 git 管理代码时,如果默认把项目里的所有文件都 add 进去,加入到仓库中,会 ...

  6. git 如何忽略掉文件夹_如何使git忽略某些文件或文件夹

    为什么要忽略某些文件或文件夹的变化? git作为一款项目文件变更版本管理软件,其主要功能之一就是追踪项目文件夹内各种文件及文件夹的变更情况.但是,在日常使用中,并非项目文件夹下的所有文件及文件夹变更都 ...

  7. Git提交后,文件夹任然有红色叹号提示

    最近用TortoiseGit操作出现一个问题,明明全部提交并同步了,nand文件夹上还是有红色叹号,表示该文件下内有未提交内容或错误. 查看Git仓库发现有yaffsMount.c和yaffsmoun ...

  8. git 提交代码某个文件夹一直提交不上去

    问题描述: 这个文件夹是直接拷贝过去的,在提交到远程仓库是出现了问题. 问题分析: 直接拷贝过去的文件夹里面有个 .git 的文件,所以在执行 git status 的时候出现 modified: t ...

  9. git clone 只有.git文件夹 git status后发现文件夹全都被删除了

    近期在拉代码的时候,发现了个问题,拉下来的代码一致都报错,然后只有一个.git文件夹,使用git status发现,所有的文件都被删除了,根据系统提示的 **git restore --source= ...

最新文章

  1. 物联网时代更要注意信息安全
  2. windows10访问ubuntu samba共享文件夹报错:不允许一个用户使用一个以上用户与服务器多重连接(没解决)
  3. gcnew 与 new 的区别
  4. linux系统下springboot jar方式启动后允许后台运行
  5. 【大会】延迟还能再低点吗?不能,但也能
  6. qt中QHostAddress与QString相互转换
  7. 计算机三四级网络技术,全国计算机等级考试四级网络技术论述题真题3
  8. Docker 构建 redis 集群
  9. 学画画软件app推荐_【画画必备】让你成为大触的6款APP
  10. Java Annotation 刷课笔记(二)
  11. xampp安装教程及使用
  12. 数学建模国赛论文latex代码汇总
  13. Cisco ❀ 双向地址转换(源地址转换+地址映射)
  14. 笔记本电脑需要计算机管理员提供的,笔记本电脑设置了管理员权限钉钉软件安装不了咋办呢...
  15. 【千锋Python2205班9.29笔记-day09-字符串(一阶段)】
  16. 洛谷P1618 三连击(升级版)C语言 暴力枚举 详解
  17. Android:logo
  18. jQuery练习_QQ音乐播放器
  19. 静态数码管显示数字及字母
  20. iframe视频代码_在Excel中创建IFRAME代码

热门文章

  1. Word文档修复实战
  2. 为让儿子从轮椅上站起来,工程师父亲打造外骨骼装置
  3. 销量不敌理想、小鹏,蔚来掉队了?
  4. windows字体转移至linux,由 Windows 向 Linux 迁移字体 和 Linux 等宽字体
  5. centos7.6 服务器搭建Java环境(若依--srs)
  6. Visio View:打开VSd时,IE弹出已停止工作。
  7. 160个CrackMe 029 Cosh.3
  8. 串口---串口通信数据位长度对传输数据的影响
  9. 三星s8怎么分屏操作_领跑折叠屏手机 三星Galaxy Z Fold2 5G魅力何在
  10. 有一堆棋子,两枚两枚的数,最后余1枚,3枚3枚的数,最后余2枚,5枚5枚的数,最后余4枚,6枚6枚的数,最后余5枚,只有7枚7枚的数,正好可以数完。编程求出这堆棋子最少有多少枚棋子?