Git 常用操作 - git配置邮箱 - git仓库迁移

293 阅读6分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

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 会使用它找到的每一个变量的最后一个配置。

  1. 查看某一项配置信息
# git config <key> 指令可以查看某一项配置

$ git config user.name
# dec-seven
  1. 查询最后设置该值是哪个配置文件
# git config --show-origin <key> 指令可以查询是哪个配置文件最后设置了该值,可以查询 Git 中该变量的原始值

$ git config --show-origin user.name
# file:/Users/dec-seven/.gitconfig  dec-seven

获取 Git 仓库

通常有两种获取 Git 项目仓库的方式:

  1. 将尚未进行版本控制的本地目录转换为 Git 仓库,使用git init进行初始化
# 创建一个空文件夹 my-pro
mkdir my-pro

# 进入到my-pro目录下
cd my-pro

# 执行git初始化
git init
  1. 从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/za/b/za/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