logo

Git

王哲峰 / 2021-11-20


目录

Git Install

Ubuntu

Install

$ sudo apt-get install git

Config

$ git config --global user.name "wangzhefeng"
$ git config --global user.email "wangzhefengr@163.com"
$ ssh-keygen -t rsa -b 4096 -C "wangzhefengr@163.com"

macOS

Install

$ brew install git

Config

Git 自带一个 git config 的工具来帮助设置控制 Git 外观和行为的配置变量。 这些变量存储在三个不同的位置:

  1. /etc/gitconfig 文件
    • 包含系统上每一个用户及他们仓库的通用配置。 如果在执行 git config 时带上 --system 选项, 那么它就会读写该文件中的配置变量。由于它是系统配置文件, 因此你需要管理员或超级用户权限来修改它
  2. ~/.gitconfig 或 ~/.config/git/config 文件
    • 只针对当前用户。你可以传递 --global 选项让 Git 读写此文件, 这会对你系统上 所有 的仓库生效
  3. 当前使用仓库的 Git 目录中的 config 文件,即 .git/config
    • 针对该仓库你可以传递 --local 选项让 Git 强制读写此文件,虽然默认情况下用的就是它。 当然,你需要进入某个 Git 仓库中才能让该选项生效

每一个级别会覆盖上一级别的配置,所以 .git/config 的配置变量会覆盖 /etc/gitconfig 中的配置变量

Git Repository

ZIP Install

  1. 下载 repo.zip
  2. 解压 repo.zip
  3. 进入解压后的 repo
$ cd repo
  1. repo 关联到 GitHub remote
$ git init
$ git remote add origin <remote repository URL>
$ git remote -v
$ git pull origin master

HTTP/HTTPS Clone

Clone

$ git clone https://github.com/username/repos.git

SSH Clone

将使用 HTTP/HTTPS 克隆的仓库转换为 SSH 方式验证

  1. 查看现在的仓库远程地址配置
git remote -v
  1. 删除现在的远程地址配置
git remote rm origin
  1. 添加新的远程地址配置
git remote add origin git@github.com:example.git
git remote set-url origin git@github.com:example.git
  1. 现在可以使用 SSH 方式进行验证
git pull
...
# 第一次 git push 时需要执行以下操作
git push
git push --set-upstream origin master

SSH Clone

SSH Key

  1. 检查本地是否已有 SSH keys
$ ls -al /.ssh
  1. 生成一个新的 SSH key
$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
  1. 把生成的 SSH key 加入 ssh-agent

Start the ssh-agent in the background

$ eval "$(ssh-agent -s)"

Modify your /.ssh/config file to automatically load keys into the ssh-agent and store passphrases in your keychain

$ open /.ssh/config
$ touch /.ssh/config
$ vim /.ssh/config

Host alia_name
AddKeysTzoAgent yes
UseKeychain yes
IdentityFile /.ssh/id_rsa

Add your SSH private key to the ssh-agent and store your passphrase in the keychain

# mac
$ ssh-add -K /.ssh/id_rsa

# Linux
$ ssh-add /.ssh/id_rsa
  1. 将 SSH Public key 加入 GitHub 账号

Clone

$ git clone git@github.com:username/repos.git

GitHub CLI

安装

$ brew install gh

使用

Git flow

GitHub flow 是一个轻量级的、基于分支(branch)的工作流, 它支持定期进行部署的团队和项目.

Create a Branch

git

Add Commit

git

Open a Pull Request

git

Discuss and Review your code

git

Deploy

git

Merge

git

Git Branch

$ git checkout -b tinker
$ git branch tinker
$ git checkout tinker
$ git branch
git checkout master
$ git checkout master
$ git merge tinker
$ git branch -d tinker

Git Commit

commit message

为什么要写好 commit message

基本要求

autocmd Filetype gitcommit setlocal spell textwidth=72

Git Pull Request

pull request 是社会化编程的象征, 通过这个功能, 你可以参与到别人开发的项目中, 并作出自己的贡献. pull request 是自己修改源代码后, 请求对方仓库采纳的一种行为.

Fork

找到想要 pull request 的项目 test , 然后点击 fork 按钮, 此时自己的仓库中就会有一个别人的项目仓库, 名字为: you_github_name/test .

Clone

在把想要 pull request 的项目克隆到本地环境:

git clone https://github.com/wangzhefeng/test.git

Branch

确认分支

通过在终端运行命令查看当前项目所在的分支, 通常都是在查看分支后再进行代码的修改, 这是个好习惯.

git branch -a

创建特性(feature)分支

在应用 GitHub 修改代码时, 常常采用的策略是在主分支(master)下再创建一个特性分支(feature_a), 在该特性分支下进行代码的修改, 然后通过该分支执行 pull request 操作. 通过命令: git checkout -b feature_a master (其中 feature_a 为新建的特性分支, master 为当前所在的分支)创建新的特性分支并自动切换.

git checkout -b feature_a master

Change

修改项目代码

在创建的 feature_a 分支下对 fork 的项目内容进行修改.

提交修改

# 查看修改的内容是否正确
git diff

# 增加修改内容说明文档
git add README.md

# 提交修改
git commit -m "add README.md"

创建远程分支

要从 GitHub 发送 pull request , GitHub 端的仓库中必须有一个包含了修改后的代码的分支, 所以需要创建一个与刚刚创建的特性分支(修改所在的分支)相对应的远程分支, 执行命令:

git push origin work1

其中: origin 为当时 fork 的远程主分支的名称, 一般默认为 origin, feature_a 为本地工作的特性分支.

然后进行查看是否创建成功:

$ git branch -a

Pull Request

进入到自己的 GitHub 账户下, 并切换到创建的特性分支(feature_a)下, 点击 create pull request , 确定没问题, 并填写相关修改内容, 点击 send pull request.

Git Discuss and Review

Git Deploy

Git Merge

Git Merge 本仓库的分支

使用场景

仓库 repos 的分支 master 需要合并到其 dev 分支上

操作步骤

  1. 获取 master 分支最新代码
$ cd repos
$ git checkout master
$ git pull
  1. 获取 dev 分支最新代码
$ git checkout dev
$ git pull
  1. Merge
$ git merge master
  1. 提交 Merge 后的修改
$ git add .
$ git commit -m "merge master"
$ git push

Git Merge 其他仓库的分支

使用场景

仓库 A_repos 的分支 branch_A 分支 需要合并到本地仓库 B_repos 的 branch_B 分支

远程仓库 A_repos: A_repos:branch_A 本地仓库 B_repos: B_repos:branch_B

操作步骤

  1. 将远程仓库 A_repos 的地址添加到本地仓库 B_repos 的远程仓库中
$ cd path/to/B_repos
$ git checkout branch_B

$ git remote add A_respoBranch_A git@github.com:username/A_repos.git
// git remote add 仓库B_repos的另一个远程仓库名称 仓库A_repos远程地址

现在可以看到本地仓库 B_repos 有两个远程仓库:

$ git remote
A_respoBranch_A
origin
  1. 抓取远程仓库 A_respo 数据到本地仓库 A_respoBranch_A 中
$ git fetch A_respoBranch_A
// git fetch 本地仓库A名称
  1. 为仓库 A_repos 创建一个新的分支 branch_A_B

这一步是将远程仓库 A_repos 的代码在本地新建一个分支 branch_A_B, 稍后会将这个 A_respo/branch_A_B 分支的代码和本地 B_repos/branch_B 代码 merge, 这样也就是将仓库 A_repos 代码合并到 B_repos 代码仓库

git checkout -b branch_A_B A_respoBranch_A/branch_A
// git checkout -b 远程仓库A_repos本地新分支名称 远程仓库A_repos本地名称/远程仓库A_repos远程分支名称
  1. 切换到本地分支

现在本地有两个分支: 一个是之前的 branch_B,这个分支就是 B_repos 仓库的代码; 一个新增的分支 branch_A_B,这个是远程仓库 A_repos 的代码

$ git checkout branch_B
  1. 合并两个分支
$ git merge branch_A_B
// git merge 分支名称

如果在 merge 的过程中报错: fatal: refusing to merge unrelated histories, 则需要使用如下命令及参数

$ git merge branch_A_B --allow-unrelated-histories

Git Merge 其他使用场景

Git .gitignore

设置 .gitignore

更新 .gitignore

Git 更新 ignore 文件直接修改 .gitignore 是不不会生效的, 需要先去掉已经托管的文件, 修改完成之后再重新添加并提交.

  1. 删除已经托管的文件
$ git rm -r --cached path_to_file
  1. 修改 .gitignore 文件的内容
  2. 提交修改
$ git add .
$ git commit -m "clear cached"
$ git push

Git Fetch and Pull

从远程分支拉取最新的版本到本地

git fetch

# 从远程的origin的master主分支下载最新的版本到origin/master分支上
$ git fetch origin master

# 比较本地的master分支和origin/master分支的差别
$ git log -p master..origin/master

# 合并
$ git merge origin/master

or

$ git fetch origin master:tmp
$ git diff tmp
$ git merge tmp

git pull

从远程获取最新版本到本地, 自动merge

$ git pull origin master

Git Status

查看当前文件状态

$ git status
$ git status -s
$ git status --short

Git Diff

$ git diff 
$ git diff --cached
$ git diff --staged
$ git diff HEAD --file.txt

Git rm

移除文件(从暂存区域移除)

$ git rm
$ git commit -m "message"

or

$ git add .

Git Checkout

误删工作区文件, 将版本库中的文件替换工作取得文件

$ git checkout -- test.txt

Git Reset

$ git log --pretty=oneline
$ git reflog

回退到上一个版本(HEAD: 当前版本)

$ git log
$ git reset --hard HEAD^
$ git reset --hard HEAD10
$ git reset --hard commit_id

前进到某个版本

$ git reflog
$ git reset --hard commit_id
$ git checkout -- file.txt
$ git reset HEAD file.txt
$ git checkout --file.txt

Git blame

查看某个文件的某行代码的修改历史

简单使用

$ git blame <filename>
$ git blame -L 100,100 <filename>
$ git blame -L 100,+10 <filename>

高阶使用

git log -L start,end:file
git log -L 155,155:git-web-browse.sh

Git Large File Storage

安装

$ brew install git-lfs

为账户设置 Git LFS

每个账户只需设置一次

git lfs install

为仓库设置 Git LFS

在每个要使用 Git LFS 的 Git repository 中选择要让 Git LFS 管理的文件格式. 可以随时进行设置

$ git lfs track "*.psd"

现在要确保 .gitattributes 是被跟踪的

$ git add .gitattributes

下一步

$ git add file.psd
$ git commit -m "add file.psd"
$ git push origin main