和我一起走近 git

git 设置

1
2
3
4
5
6
7
8
9
# 配置用户名和邮箱
$ git config --global user.name "gethin"
$ git config --global user.email "gethin.yan@gmail.com"
# Unix/Mac 用户
$ git config --global core.autocrlf input
$ git config --global core.safecrlf true
# Windows 用户
$ git config --global core.autocrlf true
$ git config --global core.safecrlf true

关于 CRLFLF

Linux/Mac OSLF(\n) 结尾,而 WindowsCRLF(\r\n) 结尾

1
2
3
4
5
6
# 提交时转换为 LF,检出时转换为 CRLF
$ git config --global core.autocrlf true
# 提交时转换为 LF,检出时不转换
$ git config --global core.autocrlf input
# 提交检出均不转换
$ git config --global core.autocrlf false

safecrlf 选项是针对提交时的配置,当有混用的情况发生的时候 git 应该给出的一些表现

1
2
3
4
5
6
# 拒绝提交包含混合换行符的文件
git config --global core.safecrlf true
# 允许提交包含混合换行符的文件
git config --global core.safecrlf false
# 提交包含混合换行符的文件时给出警告
git config --global core.safecrlf warn

别名

添加下列内容到你的 $HOME 目录的 .gitconfig 文件中

1
2
3
4
5
6
7
8
[alias]
co = checkout
ci = commit
st = status
br = branch
hist = log --pretty=format:'%h %ad | %s%d [%an]' --graph --date=short
type = cat-file -t
dump = cat-file -p

GitHub SSH Keys

使用 SSH 协议,您可以连接和验证远程服务器和服务。 使用 SSH 密钥,您可以连接到 GitHub,而无需在每次访问时提供用户名或密码

ssh-keygen 生成秘钥

ssh-keygen 命令用于为 ssh 生成、管理和转换认证秘钥,它支持 RSADSA 两种认证秘钥,秘钥文件放在 ~/.ssh 文件夹中(~是用户根目录),运行下面命令生成秘钥,密码为空(只需要按回车)

1
2
# -t 指定类型,-C 添加注释
$ ssh-keygen -t rsa -C "gethin.yan@gmail.com"

公钥放到 GitHub

生成秘钥之后进入 ~/.ssh 文件夹下,复制 id_rsa.pub 文件的所有内容

1
打开 GitHub -> settings -> SSH and GPG keys -> New SSH key -> 将复制的内容添加进去

测试是否设置成功

1
2
3
4
$ ssh git@github.com
PTY allocation request failed on channel 0
Hi gethinyan! You've successfully authenticated, but GitHub does not provide shell access.
Connection to github.com closed.

git 基础概念

  • workspace (工作区)
  • stage (暂存区)
  • repository (本地仓库)
  • remote (远程仓库)

git 基本命令

因为习惯使用 git 图形化工具,所以很多时候使用 git 命令的时候需要去查,此处记录常用的基本命令方便随时查看

创建仓库

1
$ git init

检出仓库

1
$ git clone [local repository | remote]

添加文件到暂存区

1
$ git add [filename | . | -A | *]

查看工作目录状态

1
$ git stauts

比较差异

1
$ git diff [filename]

提交到仓库

1
2
# 这里 -am 不支持新建文件
$ git commit [-m | -am]

撤销修改

1
2
3
4
# 添加到暂存区的修改
$ git reset HEAD filename
# 未添加到暂存区的修改
$ git checkout -- filename

删除文件

1
$ git rm filename

移动文件

1
$ git mv filename path

分支

1
$ git branch [-a | -r | -d | -D ]

切换分支

1
$ git checkout [-b] branch

合并分支

1
2
$ git merge branch
$ git rebase branch

回滚

1
2
$ git reset [--soft | --mixed(default) | --hard] [HEAD~number | commit Id]
$ git revert [HEAD~number | commit Id]

提交历史

1
$ git log --pretty=format:'%h %ad | %s%d [%an]' --graph --date=short

储藏/弹出修改

1
2
$ git stash
$ git stash pop

标签

1
$ git tag

同步远端

1
$ git fetch

同步远端并合并

1
$ git pull remote branch [local branch]

同步到远端

1
$ git push remote branch

管理主机名

1
$ git remote [-v | add | rm | rename]

设置代理

1
2
$ git config --global https.proxy 'socks5://127.0.0.1:1086'
$ git config --global http.proxy 'socks5://127.0.0.1:8086'

取消代理

1
2
$ git config --global --unset https.proxy
$ git config --global --unset http.proxy

git 子模块

子模块初始化拉代码

1
$ git submodule update --init

子模块拉远程代码

1
2
# 也可以进入子模块的文件夹 git pull
$ git submodule update --remote

添加子模块

1
$ git submodule add remote

删除子模块

1
2
$ git submodule deinit submodule
$ git rm --cached submodule

修改子模块 url

1
2
# 先 vim .gitmodules 修改对应子模块的 url
$ git submodule sync
0%