本文已参与「新人创作礼」活动,一起开启掘金创作之路。
Git安装
- Mac:
# 可以通过Homebrew进行安装(需先安装brew)
$ brew install git
Homebrew安装及使用可参考《Mac 安装使用 Homebrew 》
- Windows:直接在官网下载即可
Git配置
Git 自带一个
git config的工具来帮助配置Git的变量,这些变量存储在三个不同的位置。
1.「系统级」- 配置用户名和邮件地址
系统级配置文件
/etc/gitconfig:包含系统上每一个用户及他们仓库的通用配置。
# 配置用户名
$ git config --system user.name "dec-seven"
# 配置邮件地址
$ git config --system user.email 123456@qq.com
2.「用户级」- 配置用户名和邮件地址 (使用频率最高)
用户级配置文件
~/.gitconfig或~/.config/git/config:只针对当前用户生效。
# 配置用户名
$ git config --global user.name "dec-seven"
# 配置邮件地址
$ git config --global user.email 123456@qq.com
3.「项目级」- 配置用户名和邮件地址
项目级配置文件
.git/config:只针对当前项目仓库生效。
# 配置用户名
$ git config --local user.name "dec-seven"
# 配置邮件地址
$ git config --local user.email 123456@qq.com
Tips:
- 每一个级别会覆盖上一级别的配置,所以
.git/config的配置变量会覆盖/etc/gitconfig中的配置变量。 - 优先级顺序:项目级配置文件 > 用户级配置文件 > 系统级配置文件
- 可以使用
git config --list --show-origin命令查看所有的配置以及它们所在的文件
4.查看配置信息
# 列出所有Git配置信息
$ git config --list
Tips:使用当前指令可能会看到重复的变量名,因为 Git 会从不同的文件中读取同一个配置(例如:/etc/gitconfig(系统级) 与 ~/.gitconfig(用户级))。 这种情况下,Git 会使用它找到的每一个变量的最后一个配置。
- 查看某一项配置信息
# git config <key> 指令可以查看某一项配置
$ git config user.name
# dec-seven
- 查询最后设置该值是哪个配置文件
# git config --show-origin <key> 指令可以查询是哪个配置文件最后设置了该值,可以查询 Git 中该变量的原始值
$ git config --show-origin user.name
# file:/Users/dec-seven/.gitconfig dec-seven
获取 Git 仓库
通常有两种获取 Git 项目仓库的方式:
- 将尚未进行版本控制的本地目录转换为 Git 仓库,使用
git init进行初始化
# 创建一个空文件夹 my-pro
mkdir my-pro
# 进入到my-pro目录下
cd my-pro
# 执行git初始化
git init
- 从gitlab或github 克隆 一个已存在的 Git 仓库,使用
git clone <url>进行克隆
Git常用场景
1.添加文件并提交代码
# 添加文件
$ git add <filename>
# 添加全部文件
$ git add .
# 强制提交文件,可提交.gitinore中配置的文件
$ git add -f <filename>
# 提交代码
$ git commit -m "commit message"
2.查看当前仓库状态
-
可以用
git status命令查看哪些文件处于什么状态。如果在克隆仓库后立即使用此命令,会看到类似这样的输出:
$ git status
# On branch master
# Your branch is up-to-date with 'origin/master'.
# nothing to commit, working directory clean
-
状态简览,因
git status命令的输出十分详细,但其用语有些繁琐。可以使用
git status -s命令或git status --short命令,可以得到一种格式更为紧凑的输出。
$ git status -s
# M README
# MM Rakefile
# A lib/git.rb
# M lib/simplegit.rb
# ??LICENSE.txt
输出中有两栏,左栏指明了暂存区的状态,右栏指明了工作区的状态。
- `??` : 新添加的未跟踪文件
- `A` : 新添加到暂存区中的文件
- `M` : 修改过的文件
3.撤消操作
撤消对文件的修改 / 取消暂存的文件git restore -- <file>...
# 修改main.js文件代码
# 执行git status,查看当前仓库状态
$ git status
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git restore <file>..." to discard changes in working directory)
# modified: src/main.js
# no changes added to commit (use "git add" and/or "git commit -a")
# 撤销对main.js文件的修改
$ git restore src/main.js
4.忽略文件.gitignore
文件 .gitignore 的格式规范如下:
- 所有空行或者以
#开头的行都会被 Git 忽略。 - 可以使用标准的
glob模式匹配,它会递归地应用在整个工作区中。 - 匹配模式可以以(
/)开头防止递归。 - 匹配模式可以以(
/)结尾指定目录。 - 要忽略指定模式以外的文件或目录,可以在模式前加上叹号(
!)取反。
glob模式是指shell所使用的简化了的正则表达式
*:匹配零个或多个任意字符[abc]:匹配任何一个列在方括号中的字符 (当前例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c)?:只匹配一个任意字符[0-9]:在方括号中使用短划线分隔两个字符, 表示所有在这两个字符范围内的都可以匹配(当前例子表示匹配所有 0 到 9 的数字)**:表示匹配任意中间目录,比如a/**/z可以匹配a/z、a/b/z或a/b/c/z等。
5.查看已暂存和未暂存的修改
git diff:此命令比较的是工作目录中当前文件和暂存区域快照的差异,也就是修改之后还没有暂存起来的变化内容。git diff --staged:此条命令比较的是已暂存文件与最后一次提交的文件的差异,也就是已暂存的将要添加到下次提交里的内容。
6.查看git日志
$ git log
# git log 会按时间先后顺序列出所有的提交,最近的更新排在最上面。
# 这个命令会列出每个提交的 SHA-1 校验和、作者的名字和电子邮件地址、提交时间以及提交说明。
-p或--patch选项:显示每次提交所引入的差异(按 补丁 的格式输出)-<数字>选项: 限制显示的日志条目数量。--stat选项:每次提交的简略统计信息。
Git 常用命令
# 查看关联仓库链接信息
$ git remote -v
# 关联远程仓库
git remote add origin <url>
# 推送到远程库
git push
# 第一次推送
git push -u origin <branch name>
# 推送到其他分支
git push origin <branch name>
# 克隆代码
git clone <url>
# 克隆指定分支代码
git clone -b <branch name> <url>
# 创建分支
git branch <branch name>
# 切换分支
git checkout <branch name>
# 创建并切换分支
git checkout -b <branch name>
# 查看分支
git branch
# 查看远程分支
git branch -r
# 查看所有分支
git branch -a
# 合并分支
# 合并某分支到当前分支,若存在冲突会提示手动修改后在提交,git merge 默认为fast forward模式
# fast forward模式
git merge <other branch name>
# 禁用fast forward模式
git merge --no-ff -m "commit message" <other branch name>
# 查看分支合并图
git log --graph --oneline --abbrev-commit
# 删除分支
git branch -d <branch name>
# 强制删除
git branch -D <branch name>
# 保存工作空间
git stash
# 查看保存的工作空间
git stash list
# 从保存的工作空间恢复
git stash apply
# 若存在多个保存的工作空间 (n为序号,从0开始)
git stash apply stash@{n}
# 从保存的工作空间恢复并删除保存空间
git stash pop
# 若存在多个保存的工作空间 (n为序号,从0开始)
git stash pop stash@{n}
# 删除保存的工作空间
git stash drop
# 若存在多个保存的工作空间 (n为序号,从0开始)
git stash drop stash@{n}
# 将其他分支的提交应用到当前分支
git cherry-pick <commit id>
# 抓取代码
git pull
# 将本地分支与远程分支关联
git branch --set-upstream-to <local branch name> origin/<remote branch name>
# 建立标签
# 给当前分支建立标签
git tag <tag name>
# 给某个提交建立标签
git tag <tag name> <commit id>
# 给某个提交建立标签并添加注释
git tag <tag name> -m "description" <commit id>
# 查看标签
git tag
# 查看标签信息
git show <tag name>
# 删除本地标签
git tag -d <tag name>
# 删除远程标签
git push origin :<tag name>
# 推送标签至远程仓库
# 推送所有本地标签
git push --tag
# 推送指定标签
git push origin <tag name>
Git文件差异对比
$ git diff
# 此命令比较的是工作目录中当前文件和暂存区域快照的差异,也就是修改之后还没有暂存起来的变化内容。
$ git diff --staged
# 此命令比较的是已暂存文件与最后一次提交的文件的差异,也就是已暂存的将要添加到下次提交里的内容。
$ git diff <分支名1> <分支名2>
# 比较两个分支上最后 commit 的内容的差别。
$ git diff <分支名1> <分支名2> --stat
# 比较两个分支上最后 commit 有哪些文件发生了变化。
将Beyond Compare设置为默认的difftool 和 mergetool
//需要先安装Beyond Compare软件
// ~/.gitconfig
[diff]
tool = bc4
[difftool]
prompt = false
[difftool "bc4"]
cmd = "/usr/local/bin/bcomp" "$LOCAL" "$REMOTE"
[merge]
tool = bc4
[mergetool]
prompt = false
[mergetool "bc4"]
cmd = "/usr/local/bin/bcomp" "$LOCAL" "$REMOTE" "$BASE" "$MERGED"
trustexitcode = true
Git迁移子目录到新的git仓库
场景:有一个pro-child的文件夹,原来在pro-father的大仓库中,因某些情况,pro-child需要独立成一个单独的仓库。
# 克隆pro-father项目到本地
$ git clone git@github.com:tom/pro-father.git
$ cd pro-father
# 把所有 `pro-child` 目录下的相关文件提交整理为一个新的分支 split
$ git subtree split -P pro-child -b split
# 另建一个新目录并初始化为 git 仓库
$ mkdir ../pro-child
$ cd ../pro-child
$ git init
# 拉取旧仓库的 split 分支到当前的 main 分支
$ git pull ../pro-father split
# 清理无用日志
$ git gc --aggressive --prune=now
# 添加到远程仓库
$ git remote add origin {url}
# 提交
$ git push origin main
Git代码回退
# 查看所有历史版本
$ git log
# 回退本地代码库到指定版本
$ git reset --hard <commit id>
# 推送到远程服务器
$ git push -f -u origin <分支名>
# 或直接执行
$ git push -f
# 重新拉取代码
$ git pull