Skip to content

Latest commit

 

History

History
324 lines (255 loc) · 11.4 KB

File metadata and controls

324 lines (255 loc) · 11.4 KB

Git 学习笔记

Git 起步

配置

  1. 三个配置文件

    • git config --system etc/gitconfig 系统上每个用户及其仓库的通用配置
    • git config --global ~/gitconfig 当前用户及其所有仓库的通用配置
    • git config --local .git/gitconfig 当前仓库的配置,生效条件:在某个仓库中
  2. 查看配置信息

    • 查看所有配置:可能会看到重复变量,此时会使用最后一个配置
      git config --list
    • 查看所有配置及其所在文件
      git config --list --show-origin
    • 查看某一项配置
      git config <key>

帮助

  1. 查看 Git 命令的综合手册
    git help <verb>
    git <verb> --help
  2. 查看 Git 命令的简明参考
    git <verb> -h

Git 基础

获取 Git 仓库

  1. 方式一:将尚未进行版本控制的本地目录转换为 Git 仓库

    • 进入项目目录
    • git init 它会创建 .git 子目录,其中的文件是 Git 仓库的骨干
    • git add <file-name> 指定需要进行追踪的文件
    • git commit 进行初始提交
  2. 方式二:从其他服务器克隆一个已存在的 Git 仓库

    • 克隆远程仓库
      git clone <url>
    • 克隆远程仓库,并定义本地仓库名
      git clone <url> <local-repository-name>

记录每次更新到仓库

  1. 检查当前文件状态
    • 详细 git status
    • 简洁 git status --short
    • 简洁 git status -s
  2. 跟踪新文件
    git add <files>
    • 命令参数:文件或目录路径
    • 目录的路径作为参数时,将递归地跟踪该目录下的所有文件
  3. 暂存已修改的文件
    git add <files>
    git add 命令的功能
    • 开始跟踪新文件
    • 把已跟踪的文件放到暂存区
    • 合并分支时,把有冲突的文件标记为已解决状态
  4. 忽略文件
    • 用途:使无需纳入 Git 管理的文件不再出现在未跟踪文件列表
    • 文件名: .gitignore
    • 常见的需要忽略的文件:日志文件,编译过程中创建的临时文件
  5. 查看已暂存和未暂存的修改
    • 查看未暂存文件的更新
      git diff
    • 查看已暂存文件的更新
      git diff --staged
      git diff --cached
  6. 提交更新
    • git commit
    • git commit -m <commit-message>
  7. 跳过使用暂存区
    git commit -a
  8. 移除文件
    • 从 Git 仓库和当前目录中删除指定文件
      git rm <file-name>
    • 从 Git 仓库和当前目录中删除指定文件,该文件修改后尚未提交
      git rm -f <file-name>
    • 从 Git 仓库中删除,但保留在当前工作目录中
      git rm --cached <file-name>
  9. 移动文件
    git mv <file-from> <file-to>

查看提交历史

  1. git log
    • 按时间先后顺序列出所有的提交,最近的更新排在最上面
    • 每个提交包含 SHA-1 校验和、作者的名字、电子邮件地址、提交时间和提交说明
  2. git log --patch
    • 简写:git log -p
    • 按补丁的格式输出每次提交所引入的差异
    • 使用场景:代码审查,浏览某个搭档的提交带来的变化
  3. git log --stat
    • 显示提交的简略统计信息
    • 在每次提交下列出所有被修改过的文件、有多少文件被修改了、被修改过的文件的哪些行被移除后添加了,在每次提交的最后还有一个总结
  4. git log --pretty=<pretty-vlaue>
    • 使用不同于默认格式的方式展示提交历史
    • one-line 每个提交的信息显示在一行,在浏览大量提交时非常有用
    • format 定制记录的显示格式,这样的输出对后期提取分析格外有用
  5. git log --graph
    • 添加一些 ASCII 字符串来形象地展示分支合并历史

限制输出长度

  1. git log -<n>

    • <n> 可以是任意整数,表示只显示最近的 n 条提交
  2. git log -- <file-name>

    • 显示指定文件或目录的历史提交。
    • 注意:-- 和文件名之间需要一个空格。和其他选项共同使用时,此选项应该放在最后。

撤销操作

  1. 撤销对文件的修改(未暂存)
    git checkout -- <file>

  2. 取消暂存的文件(已暂存,未提交)
    git reset HEAD <file>

  3. 撤销最后一个提交(已提交,未推送)
    git reset --soft HEAD~

  4. 撤销已经推送到远程仓库的提交

    • git revert <commit-hash> 创建一个提交,抵消目标提交的改动。
    • git revert --no-commit <commit-hash> 仅还原目标提交的改动,适用于希望自定义提交信息的场景。

远程仓库的使用

  1. 查看远程仓库概要信息
    git remote
    git remote -v
  2. 查看某个远程仓库的详细信息
    git remote show <remote>
  3. 添加一个远程仓库,并指定简写名称
    git remote add <shortname> <url>
    提示:git clone 命令会自动添加远程仓库
  4. 重命名某个远程仓库
    git remote rename <name-current> <name-new>
  5. 从某个远程仓库中抓取与拉取
    git fetch <remote>
    • git fetch 命令只会将数据下载到本地仓库,而不会自动合并
    • 如果当前分支设置了跟踪远程分支,可以用 git pull 命令抓取后自动合并该远程分支到当前分支
  6. 推送到某个远程仓库
    git push <remote> <branch>
  7. 移除某个远程仓库
    git remote remove <remote>
    git remote rm <remote>

打标签

  1. 可以给仓库历史中的某一个提交打上标签,以示重要,例如标记发布节点(v1.0、 v2.0 等)。
  2. 列出已有的标签
    git tag
  3. 按照特定的模式查找标签, 例如 git tag -l "v1.8.5*"
    git tag --list <tag-name>
    git tag -l <tag-name>
  4. 创建标签
    git tag -a <tag-name> -m <tag-message>
  5. 查看标签和与之对应的提交信息
    git show <tag-name>
  6. 共享标签
    单个:git push <remote> <tag-name>
    全部:git push <remote> --tags
  7. 删除标签
    本地:git tag -d <tag-name>
    远程:git push <remote> --delete <tag-name>

Git 分支

分支基础

  1. 分支创建
    git branch <branch-name-new>
  2. 分支切换:切换到一个已经存在的分支
    git checkout <branch-name>
  3. 分支创建切换:先创建分支,再切换到该分支
    git checkout -b <branch-name-new>
  4. 分支删除
    git branch -d <branch-name>

分支查看

  1. 查看所有分支 git branch
  2. 查看每个分支及其最后一次提交 git branch -v
  3. 查看已经合并到当前分支的分支 git branch --merged
  4. 查看包含未合并工作的分支 git branch --no-merged

分支进阶

分支合并

  1. 命令:将命令参数 <branch-name> 指定的分支合并到当前分支
    git merge <branch-name>
  2. 当目标分支所指向的提交是当前分支提交的直接后继时,快进(当前分支指针前移)
  3. 当目标分支所指向的提交不是当前分支提交的直接后继时
    • 不冲突:使用两个分支的末端快照和它们的公共祖先进行三方合并,对合并结果创建提交,此提交被称为合并提交,它有两个父提交
    • 冲突:进行三方合并,手动解决冲突后标记为冲突已解决 git add <file-name>,手动创建合并提交

变基

  1. 定义:将提交到某个分支上的修改移到另一个分支上
  2. 用处:使提交历史更加整洁
  3. 使用变基需要遵守的规则:只对尚未分享给别人的修改执行变基操作
  4. 命令:将当前分支变基到目标基底分支
    git rebase <target-branch>

远程分支

  1. 远程引用

    • 远程引用是对远程仓库的引用,包括分支、标签等
    • 获得远程引用的完整列表
      git ls-remote <remote>
  2. 远程跟踪分支

    • 是远程分支状态的引用,是无法移动的本地引用
    • <remote>/<branch> 的形式命名
    • 当抓取到新的远程跟踪分支时,本地不会自动生成一份可编辑的副本,只有一个不可修改的指针
    • 根据远程跟踪分支,创建本地分支
      git checkout <branch-name> <remote>/<branch-name>
  3. 跟踪分支

    • 从一个远程跟踪分支检出一个本地分支,会自动创建跟踪分支,它跟踪的分支称为“上游分支”
    • 跟踪分支是与远程分支有直接关系的本地分支
    • 如果尝试检出的分支不存在且恰好只有一个名字于之匹配的远程分支,Git 会自动创建一个跟踪分支
  4. git branch --set-upstream-to <remote>/<branch>

    • 简写:git branch -u <remote>/<branch>
    • 设置已有的本地分支跟踪一个刚刚拉取下来的远程分支,或者修改正在跟踪的上游分支
  5. 查看设置的所有跟踪分支
    git branch -vv

  6. 删除远程分支
    git push <remote> --delete <branch>

Git 工具

贮藏

使用场景:希望切换到其他分支处理问题,又不想为当前的工作状态创建一次提交。

  1. 贮藏当前状态
    • 基本用法 git stash push
    • 贮藏并命名 git stash push -m <stash-name>
    • 贮藏包含未跟踪文件 git stash push -u
  2. 应用最近的贮藏
    git stash apply
  3. 移除贮藏
    git stash drop
  4. 应用并移除贮藏
    git statsh pop
  5. 查看所有贮藏
    git stash list

重写历史

修改最后一次提交

  1. 修改最后一次提交的提交信息
    git commit --amend
  2. 仅修改最后一次提交的内容,不修改提交信息
    git commit --amend --no-edit

修改多个提交信息

  1. 交互式变基 git rebase -i HEAD~<n>
  2. 常用的命令
    • pick 不用改动
    • edit 修改提交内容、拆分提交
    • reword 修改提交信息
    • squash 将指定提交合并到上一个提交
    • drop 删除提交
  3. 拆分提交
    • 执行 git rebase -i HEAD~<n> 命令,将目标提交的 pick 改为 edit
    • 撤销提交 git reset --soft HEAD~
    • 根据需求,提交若干次
    • 执行 git rebase --continue 标记为完成状态

注意事项

确保修改涉及的提交没有推送到共享仓库中。因为重写历史会改动提交的 SHA-1 校验和。

二分查找

  1. 使用场景:当前提交的代码可以复现问题,和已知的最后一个没有问题的提交中间有大量提交,需要找到哪一个提交引入了问题。

  2. 步骤

    • 执行命令 git bisect start 启动查找
    • 执行命令 git bisect bad 标记当前提交异常
    • 执行命令 git bisect good <commit-sha1> 标记最后一个已知的正常提交
    • Git 检出中间的一个提交,测试提交是否正常,标记提交状态。重复这一步直到找到第一个异常提交
    • 执行命令 git bisect reset 结束查找

其他

拣选

使用场景:将其他分支的提交应用到当前分支
git cherry-pick <commit-sha1>

查看某次历史提交的代码

  1. 找到目标提交

  2. 以该次提交为基础创建分支 git checkout -b <branch-name> <commit-sha1>

分支合并错误 : 拒绝合并不相关的历史

  1. 背景:创建本地仓库,并为其添加远程仓库,合并远程仓库的分支。
  2. 提示信息:fatal : refusing to merge unrelated histories
  3. 问题原因:Git 认为当前分支和远程仓库的分支属于两个不同的仓库,拒绝合并。
  4. 解决方案:告诉 Git 允许合并不相关的历史。
    • git merge <remote/branch> --allow-unrelated-histories