Git 备忘录

FINCTIVE 2019-08

本文内容为方便查询的备忘录,如果你想从零开始学习使用 Git, 你可以学习以下内容:

如有错误,欢迎指正。

基础

  • 菜鸟教程 - Git 工作区、暂存区和版本库
  • git config --global user.name "姓名" 设置提交者姓名,注意双引号(英文)
  • git config --global user.email "邮箱"设置提交者邮箱
  • git init 目录名初始化仓库。创建.git文件夹。
  • git clone 远程仓库地址从指定地址克隆(下载)仓库内容
  • git add 目录名或者文件名 将文件或目录中已修改的代码添加到暂存区。
  • git commit -m "注释消息"提交暂存区内容。
  • git status查看仓库状态

常用示例:

git add . # 添加当前文件夹下所有修改到暂存区
git commit -m "修改了xxx部分内容" # 提交

历史信息

  • git log打印出已经提交的信息
  • git log --oneline打印为单行log
  • git log --all 打印所有记录
  • git log --graph打印示意图
  • git log --grep 筛选信息

以"–“开头的参数可以叠加组合(出现的顺序不重要),比如: git log --oneline --all --graph

分支

  • git branch列出所有分支信息
  • git branch 分支名称创建分支。注意这时候并没有在当前分支上。需要再执行 git checkout 新分支名称
  • git checkout 目标切换至目标,其中目标可以是branch、commit、tag。
  • checkout指令可以使用相对引用符号 ^~数字
  • git checkout -b 分支名称创建分支,同时移动到新的分支上
  • git branch -d 分支名称删除已经合并的分支,commit仍会保留。
  • git branch -D 分支名称强行删除分支
  • git merge 目标分支名称将目标分支合并到当前分支。常见操作的例子:切换到master分支,再用merge命令把目标分支合并过来。
  • git merge --abort用于合并分支有冲突时,取消合并操作
  • git tag打标签

远程

  • 远程分支命名格式: 仓库名/分支名,例如 origin/master
  • 一个远程仓库 = 一个储存着仓库链接的变量
  • git remote add 自定义仓库名 项目地址添加新的仓库
  • git remote set-url 仓库名称 项目地址修改已经存在的仓库的url
  • git remote get-url获取已经存在的仓库的url
  • git clone 远程仓库地址从指定地址克隆仓库
  • git pull 仓库名称 分支名称拉取远程仓库,并把远程仓库的修改合并到当前分支。示例: git pull origin master
  • git push 仓库名 分支名将修改推送至远程仓库。示例:git push origin master
  • push命令可以加上 -f 参数,强制把代码上传到远程仓库,但这是一个非常危险的操作!有丢失数据的风险,而使用git管理项目的最大意义之一,就是防止数据丢失。当修改无法推送到远程仓库的时候,你应该解决冲突问题。

比对

  • git diff 比较对象A 比较对象B

  • 可以使用 VS Code 的 git 工具,更直观。

撤销修改

这部分内容建议动手试一试。如果你已经提交了多个commit,突然想回到历史记录中的某个commit节点怎么办?

  • git revert 目标建议使用这种方式。该命令在当前提交记录的基础上,创建了一个新的提交记录来还原代码,原有的commit节点保持不变。
  • git reset 目标该命令有三种模式,详解:Git reset命令的使用 尽量避免这种方式。该命令删除目标节点之后的提交记录,还原代码到目标commit节点。

为什么我建议使用revert而不是reset

  • reset到旧的commit节点后,你可能需要使用git push -f 指令才能上传到远程代码仓库。
  • 并且,使用revert可以让你添加回滚的commit信息,提醒同事。

子模块

Git 子模块:git submodule

常用技巧

为log命令添加别名,方便查看log信息

git	config	--global	alias.lg	"log	--graph	--pretty=format:'%Cred%h%Creset	-%C(yellow)% d%Creset	%s	%Cgreen(%cr)	%C(bold	blue)<%an>%Creset'	--abbrev-commit	--date=relative"

使用方法: git lg

撤销当前修改,回到最后一次提交commit的状态

# reset只影响被track过的文件
# 这条命令把目前暂存区的所有修改(staged changes)移出暂存区(成为changes)。
# 相当于撤销add操作
git reset .
# 对所有不在暂存区的文件撤销修改
git checkout .   
# 以上两句可以合并为 git reset --hard
# clean命令用来从你的工作目录中删除所有没有tracked过的文件(untracked files)
git clean -df

Git HEAD detached from XXX (git HEAD 游离) 解决办法

参考资料: Git HEAD detached from XXX (git HEAD 游离) 解决办法 出现原因:使用 git checkout commit-id,切换到指定的某一次提交,HEAD 就会处于 detached 状态(游离状态)。在这种情况下提交会新建一个匿名分支(旧的master分支没有改变),如果切换到另一个分支,这个匿名分支就找不回来了!解决方法:新建一个分支。

git checkout -b 分支名称

把最近的多个commit节点并为一个

如图,目前有3个commit节点(1、2、3),这时候我想把2和3合并。整个过程中实际文件(工作区)都没有变化。

git reset 结点1 --soft #移动HEAD到节点1
git commit -m "新的注释"

这时候,所有修改都保存在暂存区中(staged changes)

使用这个方法有可能导致无法直接push到远程仓库,这种情况会在远程仓库的节点也被合并的时候发生。

拓展阅读