使用 git 做代码的管理工具,操作路径可以简单描述如下:
新增代码,添加到工作区。
代码添加后可能需要撤销,分几种情况:
- 撤销的可能是最近一次代码
- 撤销比最近一次更久远的代码
- 撤销已经推送到远程分支的代码。
以上是个人开发所需要的操作。在多人开发场景中,就需要处理多分支操作、与远程仓库交互。
如果好奇以上操作的具体实现,就可以继续看下去啦。
新建/获取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 | 添加远程仓库地址 |