Git基础知识

Git基础知识

简介

Git是一个分布式版本管理系统,2005年由Linus大神在一周时间完成最初版,以代替BitKeeper用于linux的开发。

基本原理

  • git本质上是一个小型的kv存储文件系统;

  • 其文件系统原数据都存储在.git/目录下;

  • git的每个commit都会将当前变动的文件计算一个hash保存在kv中,hash值为k,文件为v;

  • 每一个的commit和上一个commit形成,所有的commit通过这种方式组成一条tree,形成提交记录树;

  • git的所有操作就是修改这个记录树的操作;

Config

可使用$ git config对git配置进行管理。

1
2
3
4
5
6
7
$ git config --list        #查看配置信息
$ git config --global -e    #修改配置信息
# git 配置用户信息 
$ git config --global user.name "user"  
$ git config --global user.email  "user@email.com"
# 文本编辑器
$ git config --global core.editor vim

日志

1
2
3
4
5
6
7
8
9
# 普通设置
$ git log -p -2         # 显示每次提交内容差异  
$ git log --pretty=format:"%h - %an, %ar : %s "

# 设置可视化日志 
$ git config --global alias.lg "log --graph \ 
    --pretty=format:'%Cred%h%Creset \ 
    -%C(yellow)%d%Creset %s \ 
%Cgreen(%cr)%C(bold blue)<%an>%Creset' --abbrev-commit"

commit增加签名

增加.git/hooks/prepare-commit-msg文件:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#!/bin/sh

NAME=$(git config user.name)
EMAIL=$(git config user.email)

if [ -z "$NAME" ]; then
    echo "empty git config user.name"
    exit 1
fi

if [ -z "$EMAIL" ]; then
    echo "empty git config user.email"
    exit 1
fi

操作

loading-ag-766

基本用法

1
2
3
4
5
6
$ cd <project_dir>           #进入工程目录
$ git init                   #初始化当前目录git
$ echo "*.log" >> .gitignore #设置git 忽略文件
$ git add ./                 #将当前目录文件加入到git 暂存区
$ git commit -a -m ""        #提交暂存区到本地仓库中
$ git push  origin master    #将git仓库推送到远程仓库中

撤销修改

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 回退
$ git reset HEAD^N   #回退N个提交

# 修改最后一次提交 
$ git commit --amend

# 撤销已暂存文件
$ git reset HEAD filename

# 取消工作区文件修改
$ git checkout -- filename

# 合并多个提交为一个提交
$ git rebase -i HEAD~n

patch

1
2
$ git format-path [commit-id] -n   #生成patch
$ git am [path/to/xxx.patch]       #应用patch

git remote

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 查看远程仓库
$ git remote [ -v ]
# 添加远程仓库
$ git remote add [ shortname ] [url]
# 查看远程仓库信息
$ git remote show [ remote-name ]
# 重命名远程仓库名称
$ git remote rename [ remote-old-name ] [ remote-new-name ]
# 获取远程仓库数据
$ git fetch [ remote-name ]
# 推送数据到远程仓库
$ git push [ remote-name ] [ branch-name ]
# 增加多个远程分支,push时能同时推送到多个remote仓库
$ git remote set-url --add <remote-name> <url>

Git lfs: Git的大文件管理

  • Git LFS 是 Github 开发的一个 Git 的扩展,用于实现 Git 对大文件的支持;

  • git每次提交都会完整保存发生变化文件的整个文件,fetch时下载当前revision的所有文件,这样在大文件发生变化时,每次fetch时需要下载很多的数据,并且需要很大的存储空间;

  • git lfs 使用指针文件来代替大文件,并将大文件存储于专门的大文件存储区;

  • git fetch时,只会fetch大文件的指针文件,不会下载正在的大文件,正在的大文件在checkout时才会从大文件存储区下载到local;

1
2
3
4
5
$ brew install git-lfs         # 安装git-lfs
$ git lfs install              # git增加lfs插件
$ git lfs track "*.png"        # 追踪所有后缀为png的文件
$ git lfs track                # 查看现有的文件追踪模式
$ git lfs ls-files             # 显示当前跟踪的文件列表

Git-svn

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 下载SVN库到本地目录 
$ git svn clone svn://192.168.0.2/_private/code  mycode
# 从本地库中检出最新版本为b1分支
$ git checkout -b b1
# 编辑代码,增加或删除文件
$ git add/remove file
# 提交到本地库master分支中
$ git commit -a -m ""
# 将本地master分支远程同步到svn库中
$ git svn dcommit  
# 将svn库中的文件重新同步到本地
$ git svn rebase
# 创建新的svn分支
$ git svn branch b2

Git 添加svn分支

1
2
3
4
5
6
7
$ svn mkdir -m "init" svn://192.168.0.2/repos/prj
$ cd git_root  
$ git svn init -s svn://192.168.0.2/repos/prj
$ git svn fetch
$ git svn rebase
$ git svn stash
$ git svn dcommit

Faq

  • fatal: The remote end hung up unexpectedly
1
$ git config --local http.postBuffer 524288000

参考

  1. Git简史

  2. ProGit

  3. https://zhuanlan.zhihu.com/p/25989135

  4. https://zhuanlan.zhihu.com/p/45510461

  5. https://learngitbranching.js.org/

updatedupdated2024-05-152024-05-15