0%

git命令学习

前言

1. 下载安装包慢

一、分支使用

1. 基本操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# 查看本地和远程所有分支
git branch -a

# 1. 本地创建并切换分支
git checkout -b 'branch'

# 2. 将远程分支check到本地同名分支并跟踪
git checkout -b 'branch' --track 'origin/branch'

# 3. 将本地分支推送到远程另一个分支上
git push (origin_name) 'branch':'branch'

# 4. 将本地分支推送到远程不存在的分支上(新建远程分支)
# 不跟踪
git push (origin_name) (branch_name)
# 添加跟踪
git push --set-upstream (origin_name) (branch_name)

# 5. 强制使用远程分支内容
git reset --hard (origin_name)/(branch)

# 6. 强制更新远端仓库
# 全部更新
git push -f (origin_name)
# 只更新一个分支
git push -f (origin_name) (branch)

# 7. 删除分支
# 删除本地分支
git branch -d (branch) # 删除本地和远端已同步的分支
git branch -D (branch) # 强制删除本地分支不关心是否同步
# 删除远程分支
git push (origin_name) --delete (branch) # 删除远程origin_name的branch分支

# 8. 只拉去远端一个分支的代码,节省空间
git clone -b xxx --depth 1 https://github.com/xxx/xxxxxxx.git
# 新拉取一个分支
git remote set-branches origin 'remote_branch_name'
git fetch --depth 1 origin remote_branch_name
git checkout remote_branch_name

二、代码回退

未保存暂存区

撤销一个文件

1
git checkout -- (test.py)

保存到暂存区

撤销一个文件的暂存区保存操作(未撤销文件改动)

1
2
git checkout HEAD (test.py)  # 回到提交点,保留本地改动
git checkout --hard HEAD # 强制回到提交点,丢弃所有改动

单个文件回退到一个版本

  • 将commitid对应的改动放到暂存区,文件当前样子为当前modify
1
2
3
git reset (commitid) (filePath)
# 使用远端的,以暂存区为准
git checkout -- (filePath)

三、储藏区

只会保存修改的文件,添加删除不会保存

1. 保存当前代码到储藏区

想切换分支但没有完成需要提交一次的代码,临时存到储藏区

1
2
3
git stash
# 只stash暂存区的文件
git stash -S

2. 查看储藏区内容

1
2
3
4
5
6
# 查看有几条stash
git stash list
# 查看最近一次stash的内容
git stash show
# 按序号查看stash的内容
git stash show 1

3. 恢复储藏区内容

1
git stash pop

4. 删除某一个储藏区内容

1
git stash drop 1

四、查看改动记录

查看某一个文件内容的改动人和时间

1
2
git blame (fileName)
git blame -L n,m (fileName)
  • -L参数为查看n到m行的改动记录,不加为文件所有改动

五、标签

1. 基础操作

1
2
3
4
5
6
7
8
9
10
11
12
# 拉取所有tag
git fetch --tags
# 显示所有tag
git tag
# 查看对应tag信息
git show <tag>
# 删除tag
git tag -d <tag>
# 本地标签推送到远端,本地打标签默认不会同步到远端
git push [origin] <tag>
# 推送所有本地标签到远端
git push [origin] --tags

2. 用特定的搜索模式列出符合条件的标签

1
git tag -l 'condition'

3. 新建标签

Git 使用的标签有两种类型:轻量级的(lightweight)和含附注的(annotated)。

轻量级标签就像是个不会变化的分支,实际上它就是个指向特定提交对象的引用。而含附注标签,实际上是存储在仓库中的一个独立对象,它有自身的校验和信息,包含着标签的名字,电子邮件地址和日期,以及标签说明,标签本身也允许使用 GNU Privacy Guard (GPG) 来签署或验证。一般我们都建议使用含附注型的标签,以便保留相关信息;当然,如果只是临时性加注标签,或者不需要旁注额外信息,用轻量级标签也没问题。

3.1. 含附注的标签

创建一个含附注类型的标签非常简单,用 -a (译注:取 annotated 的首字母)指定标签名字即可:

1
git tag -a (version) -m 'comment'

而 -m 选项则指定了对应的标签说明,Git 会将此说明一同保存在标签对象中。如果没有给出该选项,Git 会启动文本编辑软件供你输入标签说明。

3.2. 签署标签

如果你有自己的私钥,还可以用 GPG 来签署标签,只需要把之前的 -a 改为 -s (译注: 取 signed 的首字母)即可:

1
git tag -s (version) -m 'comment'

3.3. 轻量级标签

轻量级标签实际上就是一个保存着对应提交对象的校验和信息的文件。要创建这样的标签,一个 -a,-s 或 -m 选项都不用,直接给出标签名字即可:

1
git tag (version)

4. 验证标签

可以使用 git tag -v [tag-name] (译注:取 verify 的首字母)的方式验证已经签署的标签。此命令会调用 GPG 来验证签名,所以你需要有签署者的公钥,存放在 keyring 中,才能验证:

1
git tag -v (version)

若是没有签署者的公钥,会报告类似下面这样的错误:

1
2
3
gpg: Signature made Wed Sep 13 02:08:25 2006 PDT using DSA key ID F3119B9A
gpg: Can't check signature: public key not found
error: could not verify the tag 'v1.4.2.1'

后期加注标签

你甚至可以在后期对早先的某次提交加注标签。

1
git tag -a (version) (commitNumber)

六、配置

一些基本用法

1
2
3
4
5
6
7
8
9
10
11
12
########## 查 ##########
# 查看系统的config
git config --system --list
# 查看用户的config
git config --global --list
# 查看仓库的config
git config --local --list

########## 删 ##########
git config --global --unset xxx
# 出现multiple values无法删除,先执行下面操作,再删除
git config --global --replace-all xxx 1

仓库

修改远程仓库地址

1
git remote set-url (origin_name) (url)

删除现有远程仓库

1
git remote rm (origin_name)

添加新的远程仓库

1
git remote add (origin_name) (url)

查看远程仓库地址

1
git remote -v

记住密码

设置记住密码(默认15分钟):

1
git config --global credential.helper cache

如果想自己设置时间,可以这样做:

1
git config credential.helper 'cache --timeout=3600'

这样就设置一个小时之后失效

长期存储密码:

1
git config --global credential.helper store

格式配置

不自动改换行符LF/CRLF

  • git在clone和commit的时候,会自动判断平台,如果是windows就会改成crlf,linux就是lf
  • 提交的时候,windows会自动转成lf的格式提交,不用关心格式
1
git config --global core.autocrlf false

允许长路径

1
git config --system core.longpaths true

七、合并和冲突

1. 冲突解决

1.1. 使用vim解决冲突

配置

1
2
3
4
# 使用vimdiff作为冲突解决工具
git config --global merge.tool vimdiff
# mergetool不产生备份文件,不然会产生*.orig的备份文件
git config --global mergetool.keepBackup false

解决冲突

1
2
# 使用配置的mergetool进行冲突解决
git mergetool
  • 打开后是vimdiff界面,使用] + c 进行跳转
  • 修改完成后,:xa下一个文件
  • :diffg LO: 使用左上改动
  • :diffg BA: 使用中间改动
  • :diffg RE: 使用右上改动

1.2. 单个文件全部使用本地或远端

1
2
git checkout --theirs path/to/file
git checkout --ours path/to/file

2. diff查看改动

2.1. 查看缓冲区改动

1
2
3
git diff
# 忽略空格改动
git diff -w

八、子模块

1. 一些基本操作

1
2
3
4
5
6
7
8
9
10
# 首次clone仓库拉取子模块
git clone --recursive 仓库地址
# 在母仓库初始化子模块
git submodule init
# 拉取了母仓库,首次拉取子模块
git submodule update --init --recursive
# 更新子模块
git submodule update --recursive --remote
# 添加一个子模块
git submodule add https://github.com/path/to.git path/to/dir

九、git lfs

1. 一些基本操作

1
2
3
4
# 拉取单个文件,不带前导/
git lfs pull --include="a/b/c.zip" --exclude=""
# 拉取全部文件
git lfs pull --include="*" --exclude=""

十、git difftool

  • 使用vimdiff查看git改动
1
2
3
git config --global diff.tool vimdiff
# 不展示选择是否编辑的界面,直接进入vimdiff
git config --global difftool.prompt false
  • 在目录下执行就可以查看git改动了
1
2
3
4
5
6
7
8
9
# 查看未stage的改动
git difftool
# 查看全部未提交的改动
git difftool HEAD
# 查看stage的改动
git difftool --staged
git difftool --cached
# 查看当前分支和某次提交的差异
git difftool [commit_id]

十一、git log 查看历史提交记录

1. 选项解释

  • --all: 显示所有提交,默认仅当前及以前
  • --author="xxx": 显示某人的提交

小技巧与踩坑记

1. 远端分支和本地不同步

  • 当出现仓库上已经没有某分支,但是本地还是显示远端有此分支
  • 使用下面命令,将本地的origin相关分支和远程同步
1
git remote prune origin

2. 生效其他分支的一次提交

参数说明

  • -n: 不提交,不加将会使用要使用的提交的message创建一次提交
  • -m 1: 使用合并到分支的改动,设置成2将使用被合并的分支的改动
1
2
3
4
# 非合并类型提交
git cherry-pick -n xxx
# 合并类型的提交
git cherry-pick -m 1 -n xxx

3. 仅拉取一个分支的代码

  • git整个仓库太大,想要只拉取一个分支树的所有代码或者拉取一个分支的最近一次commit的代码可以用下面的命令
1
2
3
4
# 只拉取一个分支的分支历史
git clone xxx -b [branch_name] --single-branch
# 拉取一个分支的一次提交
git clone xxx -b [branch_name] --depth=1
  • 想要拉取其他分支代码
1
2
3
4
5
# 先添加远程分支
git remote set-branches origin master
# 再进行获取,只会获取最近一次提交,需要多次需要指定
git fetch --depth 1 origin [branch_name]
git checkout [branch_name]
  • 临时切到一个提交,不需要创建本地分支可以使用下面的命令
  • 可以理解为git将某个提交获取到本地,并没有获取到其他的id
1
2
3
# 虽然指定了分支名,但是只拉取了commitid,分支没有在本地
git fetch --depth 1 origin [branch_name|tag_name]
git checkout FETCH_HEAD

4. git log显示中文为Author: <E6><9D><8E><E5><8F><91><E6><98><8E>58134 <58134@163.com>

  • git log使用分页器显示日志,但是分页器不设置编码无法解析中文
  • 下面命令可以加到.zshrc/etc/environment里面
1
2
# 设置分页器的编码为utf-8
export LESSCHARSET=utf-8

5. git仓库损坏,调用命令提示文件缺失

  • 安装git-repair,调用下面命令修复
1
git-repair --force