git 速查手册

48 阅读6分钟

使用 git 做代码的管理工具,操作路径可以简单描述如下:

新增代码,添加到工作区。

代码添加后可能需要撤销,分几种情况:

  1. 撤销的可能是最近一次代码
  2. 撤销比最近一次更久远的代码
  3. 撤销已经推送到远程分支的代码。

以上是个人开发所需要的操作。在多人开发场景中,就需要处理多分支操作、与远程仓库交互。

如果好奇以上操作的具体实现,就可以继续看下去啦。

新建/获取git 仓库

本地新建 git 仓库

git init

当前目录下多了一个 .git 的目录,这个目录是 Git 来跟踪管理版本库的,这个文件改乱了会破坏 Git 目录。

如果你没有看到.git目录,那是因为这个目录默认是隐藏的,用ls -ah命令就可以看见。

或者克隆远程仓库

git clone

添加与撤销

查看修改

查看历史记录

命令作用
git log查看历史记录
git log -p查看详细历史
git log --stat查看简要统计

查看具体 commit

命令作用
git show查看具体commit
git show 5e68b0d8在 show 后面加上这个 commit 的引用(branch 或 HEAD 标记)或它的 SHA-1 码:查看任意一个commit
git show 5e68b0d8 shopping\ list.txt查看 commit 中的指定文件

看未提交的内容

命令作用
git diff比对工作目录和暂存区
git diff --staged比对暂存区和上一条提交
git diff HEAD对比工作目录和上一条提交

添加

git add . // 添加
git add filename // 添加具体文件
git commit -m "描述语" // 

git add 操作是把信息提交到暂存区,git commit 提交更改,实际上就是把暂存区所有内容提交到了当前分支。

工作区是能够直接看到的目录,工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。

Git 的版本库里存了很多东西,其中最重要的就是称为 stage(或者叫index)的暂存区,还有 Git 为我们自动创建的第一个分支 master,以及指向 master 的一个指针叫 HEAD。

暂存

git stash // 添加暂存
git stash pop // 取出暂存代码

修改提交

修改最近一次提交

当场再写一个修复这几个错别字的 commit?可以是可以,不过还有一个更加优雅和简单的解决方法:

git commit -—amend。

在提交时,如果加上 --amend 参数,Git 不会在当前 commit 上增加 commit,而是会把当前 commit 里的内容和暂存区(stageing area)里的内容合并起来后创建一个新的 commit,用这个新的 commit 把当前 commit 替换掉。所以 commit --amend 做的事就是它的字面意思:对最新一条 commit 进行修正。

需要注意的有一点:commit --amend 并不是直接修改原 commit 的内容,而是生成一条新的 commit。

修改倒数第二次提交

rebase -i 是 rebase --interactive 的缩写形式,意为「交互式 rebase」。

git rebase -i HEAD^^

HEAD~5 表示 HEAD 指向的 commit往前数 5 个 commit。

修改完成之后,和上节里的方法一样,用 commit --amend 来把修正应用到当前最新的 commit:

git add 笑声
git commit --amend

在修复完成之后,就可以用 rebase --continue 来继续 rebase 过程,把后面的 commit 直接应用上去。

git rebase --continue

修改已经推送到远程的提交

git push origin branch1 -f

如果出错的内容已经合并到 master,在这种时候,你可以:增加一个新的提交,把之前提交的内容抹掉。

例如之前你增加了一行代码,你希望撤销它,那么你就做一个删掉这行代码的提交;如果你删掉了一行代码,你希望撤销它,那么你就做一个把这行代码还原回来的提交。

这种事做起来也不算麻烦,因为 Git 有一个对应的指令:revert。

它的用法很简单,你希望撤销哪个 commit,就把它填在后面:

git revert HEAD^

上面这行代码就会增加一条新的 commit,它的内容和倒数第二个 commit 是相反的,从而和倒数第二个 commit 相互抵消,达到撤销的效果。

在 revert 完成之后,把新的 commit 再 push 上去,这个 commit 的内容就被撤销了。它和前面所介绍的撤销方式相比,最主要的区别是,这次改动只是被「反转」了,并没有在历史中消失掉,你的历史中会存在两条 commit :一个原始 commit ,一个对它的反转 commit。

撤销

git reset 撤销提交

命令描述
git reset --hard丢弃最新的提交
git reset --hard HEAD^HEAD 表示 HEAD^ 往回数一个位置的 commit
git reset --hard 目标commit撤销目标 commit

撤销不是最新的提交

你想撤销倒数第二条 commit,那么可以使用 rebase -i:

git rebase -i HEAD^^

也用 rebase --onto 来更简便地撤销提交。

选取当前 commit 和目标 commit 在历史上的交叉点作为起点,--onto 参数后面有三个附加参数:目标 commit、起点 commit(注意:rebase 的时候会把起点排除在外)、终点 commit。

git rebase --onto HEAD^^ HEAD^ branch1

以倒数第二个 commit 为起点(起点不包含在 rebase 序列里哟),branch1 为终点,rebase 到倒数第三个 commit 上。

这两种撤销过往提交的理念是一样的:在 rebase 的过程中去掉想撤销的 commit,让他它消失在历史中。

分支管理

合并分支

git merge 方案

如果要将 branch1 合并到 master

在 master 分支上:

git merge branch1

git rebase 方案

git checkout branch1
git rebase master

另外,在 rebase 之后,记得切回 master 再 merge 一下,把 master 移到最新的 commit:

git checkout master
git merge branch1

其他分支操作

命令描述
git branch查看分支
git branch 创建分支
git checkout 或者git switch 切换分支
git checkout -b 或者git switch -c 创建+切换分支
git branch -d 删除分支

与远程仓库交互

命令描述
git remote -v显示所有远程仓库
git fetch origin 分支名称(比如说主分支origin master)获取远程仓库变动
git pull拉去远程代码, git fetch 与 git merge 的合并体
git push提交代码到远程分支
git push --force有冲突也提交代码到远程分支
git remote -v查看远程仓库地址
git remote set-url origin 仓库url修改远程仓库地址
git remote rm origin删除远程仓库地址
git remote add origin 仓库url添加远程仓库地址