git

基本慨念

  • 工作区 (写代码)
  • 暂存区 (临时存储)
  • 本地库 (历史版本)
git add ... #从工作区添加到暂存区
git commit ... #从暂存区添加到本地库
  • git和代码托管中心,
    • 代码托管中心:维护远程库
    • gitlab
    • github
    • 等等

git命令行操作

  • 本地库操作
  • 本地库初始化
git init;
ls -la;
ll .git;
  • 基本操作

    • 设置签名
    • 形式:用户名: liangze, email地址:350442340@qq.com
    • 作用:区分不同开发人员的身份
    • 辨析:这里设置的签名和登录远程库(代码拖管中心)的账号,密码没有任何关系。
    • 命令:
      • 项目级别/仓库级别
        仅在当前本地库范围内有效果
      • 系统用户级别: 登陆当前操作系统的用户范围内有效果。比项目级别范围广
      • 优先级:就近原则。
      # 项目级别/仓库级别 ,保存到当前项目目录下 .git/config 文件
      git config user.name laingze
      git config user.email 350442340@qq.com
      # 系统用户级别 全局 , 信息保存到 $HOME/.gitconfig
      git config --global user.name laingze
      git config --global user.email 350442340@qq.com
      # 查看
      git config --list
      
  • 分支管理

  • 远程库操作

基本操作

# 状态查看操作
git status; # 查看工作区,暂存区状态
# 添加操作 将工作区的 “新建/修改” 添加到暂存区
git add [filename] ;
git add . ; # 提交所有
git add -a;
git add --all;
# 提交操作 将暂存区的内容提交到本地库
git commit -m "info" [filename];
git commit -m "info"; # 提交所有
# 把暂存区的文件 untrack到工作区
git rm --cached filename;

查看历史记录

git log; #最完整的, 多屏显示控制方式 空格向上翻页 b向上翻页 q退出
git log --pertty=oneline;
git log --oneline;
git reflog; # 可以看到 HEAD指针位置  HEAD@{1}
# zsh git插件 缩写 路径: ~/.oh-my-zsh/plugins/git
glod; # git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ad) %C(bold blue)<%an>%Creset'

版本控制

git在管理版本时,他有一个HEAD指针,指针指向哪里就是用哪个版本

  • 前进后退
# 基于索引值操作[推荐]
# git reflog; 后前面有个hash值  copy下来
git reset --hard [局部索引];
# 使用^符号 一次退一步,只能后退
git reset --hard HEAD^
# 使用~符号 n表示第几步
git reset --hard HEAD~3
# 紧接着强制推送到远程分支:
git push -f

HEAD是本地库的指针
soft(软,仅仅在本地库移动下HEAD指针)
mixed(混合, 在本地库移动下HEAD指针, 重置暂存区)
hard(硬,在本地库移动下HEAD指针, 重置暂存区和工作区)

删除文件找回? git reset --hard HEAD 和 git checkout .

git reset --hard HEAD回退版本,放弃所有更改 包括暂存区
git checkout . 检出版本,也可用于放弃更改, 只能包括在工作区的

文件比较

# 不带文件名 比较多个文件
git diff [filename]; # 将工作区中的文件和暂存区进行比较
git diff [本地库中的历史版本的记录] [filename]; # 将工作区中的文件和本地仓库历史记录比较

分支操作

# 创建分支
git branch [branchname];
# 查看分支
git branch;
git branch -v;
# 切换分支
git checkout [branchname];
# 合并分支 先切换 再合并
git merge [有新内容的分支]

冲突
<<<<<< HEAD
冲突--子分支

冲突---master

master

git 基本原理

  • 哈希,git底层采用的是SHA-1算法
  • 哈希算法可以被用来验证文件。
  • 拿原始文件进行SHA-1摘要 和 目标文件 的哈希值进行比对,从根本上保证数据的完整性
  • git是基于快照的 每一个快照有一个 parent指向父节点
  • 分支管理的本质是创建和移动指针

本地和远程库相关命令

https://github.com/LZRight123/gitHowUser.git

# 查看远程分支
git remote -v;
# 删别名
git remote rm origin;
# 给远程库起别名  下面的 origin = [远程分支别名]
git remote add origin https://github.com/LZRight123/gitHowUser.git
# 推送
# 第一次使用 
git pull origin master --allow-unrelated-histories
git push -u origin master;
git push --set-upstream origin master;
# 以后可以用git push 
git push origin master;
# 从 remote clone 拉分支 ;不需要进行 git init
git clone https://github.com/LZRight123/gitHowUser.git

# 抓取远程库代码
1. git fetch origin master; # 只把远程内容下载到本地,不会改本地工作区内容
2. git merge origin/master;
pull = fetch + merge;
git pull 

使用SSH登陆 git仓库

$HOME/.ssh 文件夹下存放ssh相关资料

ssh-keygen -t rsa -C 350442340@qq.com;
cat id_rsa.pub;
# 复制到git -> setting -> SSH -> new ssh_key
# 为ssh方式添别名 就不用每次输密码了
git remote add origin_ssh git@github.com:LZRight123/gitHowUser.git

过大

在使用git更新或提交项目时候出现 "fatal: The remote end hung up unexpectedly " 原因是推送的文件太大。

那就简单了,要么是缓存不够,要么是网络不行,要么墙的原因

特别是资源库在国外的情况下。此问题可能由网络原因引起。

方法一:

修改提交缓存大小为500M,或者更大的数字

git config --global http.postBuffer 524288000

some comments below report having to double the value:

git config --global http.postBuffer 1048576000

或者在克隆/创建版本库生成的 .git目录下面修改生成的config文件增加如下:

[http]
postBuffer = 524288000

git plugin

The git plugin provides many aliases and a few useful functions.

To use it, add git to the plugins array in your zshrc file:

plugins=(... git)

Aliases

AliasCommand
ggit
gclgit clone --recurse-submodules clone时 递归把子模块也clone下来
gcfgit config --list 查看git config的信息
gagit add
gaagit add --all
gapagit add --patch
gaugit add --update
gavgit add --verbose
gapgit apply
gbgit branch
gbagit branch -a
gbdgit branch -d
gbdagit branch --no-color --merged | command grep -vE "^(+
gbDgit branch -D
gblgit blame -b -w
gbnmgit branch --no-merged
gbrgit branch --remote
gbsgit bisect
gbsbgit bisect bad
gbsggit bisect good
gbsrgit bisect reset
gbssgit bisect start
gcgit commit -v
gc!git commit -v --amend
gcn!git commit -v --no-edit --amend
gcagit commit -v -a
gca!git commit -v -a --amend
gcan!git commit -v -a --no-edit --amend
gcans!git commit -v -a -s --no-edit --amend
gcamgit commit -a -m
gcsmgit commit -s -m
gcbgit checkout -b
gcleangit clean -id
gpristinegit reset --hard && git clean -dfx
gcmgit checkout master
gcdgit checkout develop
gcmsggit commit -m
gcogit checkout
gcountgit shortlog -sn
gcpgit cherry-pick
gcpagit cherry-pick --abort
gcpcgit cherry-pick --continue
gcsgit commit -S
gdgit diff
gdcagit diff --cached
gdcwgit diff --cached --word-diff
gdctgit describe --tags $(git rev-list --tags --max-count=1)
gdsgit diff --staged
gdtgit diff-tree --no-commit-id --name-only -r
gdvgit diff -w $@ | view -
gdwgit diff --word-diff
gfgit fetch
gfagit fetch --all --prune
gfggit ls-files | grep
gfogit fetch origin
gggit gui citool
ggagit gui citool --amend
ggfgit push --force origin $(current_branch)
ggflgit push --force-with-lease origin $(current_branch)
gglgit pull origin $(current_branch)
ggpgit push origin $(current_branch)
ggpnpggl && ggp
ggpullgit pull origin "$(git_current_branch)"
ggpurggu
ggpushgit push origin "$(git_current_branch)"
ggsupgit branch --set-upstream-to=origin/$(git_current_branch)
ggugit pull --rebase origin $(current_branch)
gpsupgit push --set-upstream origin $(git_current_branch)
ghhgit help
gignoregit update-index --assume-unchanged
gignoredgit ls-files -v | grep "^[[:lower:]]"
git-svn-dcommit-pushgit svn dcommit && git push github master:svntrunk
gkgitk --all --branches
gkegitk --all $(git log -g --pretty=%h)
glgit pull
glggit log --stat
glgpgit log --stat -p
glgggit log --graph
glggagit log --graph --decorate --all
glgmgit log --graph --max-count=10
glogit log --oneline --decorate
glolgit log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset'
glolsgit log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --stat
glodgit log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ad) %C(bold blue)<%an>%Creset'
glodsgit log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ad) %C(bold blue)<%an>%Creset' --date=short
glolagit log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --all
gloggit log --oneline --decorate --graph
glogagit log --oneline --decorate --graph --all
glp_git_log_prettily
gmgit merge
gmomgit merge origin/master
gmtgit mergetool --no-prompt
gmtvimgit mergetool --no-prompt --tool=vimdiff
gmumgit merge upstream/master
gmagit merge --abort
gpgit push
gpdgit push --dry-run
gpfgit push --force-with-lease
gpf!git push --force
gpoatgit push origin --all && git push origin --tags
gpugit push upstream
gpvgit push -v
grgit remote
gragit remote add
grbgit rebase
grbagit rebase --abort
grbcgit rebase --continue
grbdgit rebase develop
grbigit rebase -i
grbmgit rebase master
grbsgit rebase --skip
grevgit revert
grhgit reset
grhhgit reset --hard
grohgit reset origin/$(git_current_branch) --hard
grmgit rm
grmcgit rm --cached
grmvgit remote rename
grrmgit remote remove
grsgit restore
grsetgit remote set-url
grssgit restore --source
grtcd "$(git rev-parse --show-toplevel || echo .)"
grugit reset --
grupgit remote update
grvgit remote -v
gsbgit status -sb
gsdgit svn dcommit
gshgit show
gsigit submodule init
gspsgit show --pretty=short --show-signature
gsrgit svn rebase
gssgit status -s
gstgit status
gstagit stash push
gstagit stash save
gstaagit stash apply
gstcgit stash clear
gstdgit stash drop
gstlgit stash list
gstpgit stash pop
gstsgit stash show --text
gstallgit stash --all
gsugit submodule update
gswgit switch
gswcgit switch -c
gtsgit tag -s
gtvgit tag | sort -V
gtlgtl(){ git tag --sort=-v:refname -n -l ${1}* }; noglob gtl
gunignoregit update-index --no-assume-unchanged
gunwipgit log -n 1 | grep -q -c "--wip--" && git reset HEAD~1
gupgit pull --rebase
gupvgit pull --rebase -v
gupagit pull --rebase --autostash
gupavgit pull --rebase --autostash -v
glumgit pull upstream master
gwchgit whatchanged -p --abbrev-commit --pretty=medium
gwipgit add -A; git rm $(git ls-files --deleted) 2> /dev/null; git commit --no-verify --no-gpg-sign -m "--wip-- [skip ci]"

Deprecated

Functions

Current

CommandDescription
current_branchReturn the name of the current branch
git_current_user_nameReturns the user.name config value
git_current_user_emailReturns the user.email config value

Work in Progress (WIP)

These features allow to pause a branch development and switch to another one ("Work in Progress", or wip). When you want to go back to work, just unwip it.

CommandDescription
work_in_progressEchoes a warning if the current branch is a wip
gwipCommit wip branch
gunwipUncommit wip branch

Deprecated

CommandDescriptionReason
current_repositoryReturn the names of the current remotesDidn't work properly. Use git remote -v instead (grv alias)