Git相关命令总结
相关概念
Git是一种可以记录某个文件夹下所有文件状态的版本管理工具,它可以将仓库恢复到任何状态时的仓库。
状态?对Git而言哪些东西可以标识仓库的状态?
commit对象的SAH-1- 分支
branch HEAD:指向当前分支的最新指针,保存在.git/HEAD文件中- 标签
tag
这里包含远程分支的状态
其实,状态本质上就是每次commit的对象。至于分支、HEAD、tag其实是一个特殊的指针,固定指向某个commit对象。
既然我们可以将仓库恢复到之前任何commit对象,就需要保证commit对象在提交之后无法改变它。否则,版本控制就没有任何意义。
git commit --amend说是可以修改上一个commit对象,但其实并不是。它是在上一个commit对象的基础上分叉新建一个commit对象。
5、GitHub得logo来源
octocat
其他知识
1、初始化配置的6个命令
git config --global user.name wangjie_fourthgit config --global user.email wangjie_fourth@163.comgit config --global core.editor "code --wait"git config --global push.default simplegit config --global core.quotepath falsegit config --global core.autocrlf inputgit config --global --list
2、Git的几个区域
- 未被管理的
- 工作区
- 暂存区
- 仓库区
在这几个区域转换的命令。
常用命令
这里分俩类介绍命令:
- 版本提交相关的命令
- 其他功能相关的命令
一、版本提交命令
git checkoutgit resetgit commitgit pushgit mergegit rebasegit revertgit cherry-pickgit pullgit fetch
git checkout
1、功能
切换分支或更新工作树文件。
2、相关参数
b|B:创建新分支
3、常用命令
git checkout [分支名称]git checkout -b [新分支名称] [状态]
以某个仓库状态作为基础创建新的分支。这个【状态】可以是远程分支,默认情况下是以当前状态做基础来新建分支。
git reset
1、介绍
将当前的HEAD重置为指定状态,也可以重置到远程仓库的状态。
2、相关参数
-- soft:将现在与目标状态按照之前的差异保存,该放在工作区的放在工作区,该放在暂存区的放在暂存区
-- mixed:将现在与目标状态的差异都放在【工作区】下。【默认】
-- hard:不保存这俩个状态的差异
3、使用场景
- 用来撤销工作区、暂存区的修改。
4、常用命令
-
git reset HEAD 文件名称
将暂存区的文件恢复到上个状态版本。 -
git reset HEAD --hard
将代码恢复到当前分支的HEAD状态,等价于丢弃当前工作区、暂存区的修改。注意这里未被管理的文件是不会发生改变的。
git commit
1、介绍
对Git仓库的修改
2、相关参数
-- amend:通过创建新的提交来替换当前分支的尖端
-- squash:将多个commit压缩成一个commit
3、常用命令
-
git commit --amend
该命令功能是通过创建新的提交来替换当前分支的最新commit对象。

这个时候,如果直接push的话是有可能无法推送到远程分支,原因就是远程分支的最新节点是不是本地分支的历史节点。- 如果
D没有被push到远程分支,此时就可以直接push; - 如果
D之前被push到远程分支,此时就不能push,需要先pull下来,再push;
- 如果
-
git commit --squash
将多个commit压缩成一个commit
优点:- 把所有变更合在一起,更容易阅读,对
bisect友好 - 想要回滚或者
revert非常方便
- 把所有变更合在一起,更容易阅读,对
缺点:
- 丢失了所有的历史记录【可以将这些
commit信息都写在新的压缩commit上】
git push
1、介绍
更新远程引用以及相关对象。每次push的要求是:
- 本地仓库得父节点要是远程仓库得最新节点
这也解释了为什么git commit --amend需要先pull一下
git merge和git rebase
这俩个命令都是合并多个分支代码,只不过是以不同方式来合并代码。即,git merge只是将多个分支的最新commit对象进行合并;而git rebase会将一个分支的所有commit对象都在另一个分支上进行合并。

git merge优点:
- 合并冲突解决简单,只需要解决一次冲突即可;
- 记录了完整的版本历史;
git merge缺点:
- 仓库的提交历史会比较杂乱
- 对
git bisect命令不太友好
git rebase优点
- 仓库历史的提交记录比较整洁;
- 对
git bisect命令友好;
git rebase缺点
- 合并冲突解决复杂;但其实这点可以优化;
但这里会有个问题?就是你无法将本地代码push到远程分支上,原因就是远程分支的最新节点不是本地分支的父节点。
所以,一般使用这个命令时,都是在自己分支rebase然后再push到远程分支。
使用squash将自己分支的提交压缩成新的commit,然后在rebase
git revert
1、功能
还原之前的提交。通过创建一个commit将代码还原到之前commit的状态。
通常用在:
- 撤销历史种某个更改。如bug或不恰当的功能
- 回滚某次发布
比如说:假设你不想bad-feature分支上的commit,然后在master分支上执行git revert commitID。
git cherry-pick
1、功能
将某个提交在另外的分支上重新提交。一般是用在:
- 希望把一个
bug fix同步到较老的产品中 - 在
master上进行的变更,希望进入release环节
2、使用举例
当master发布版本出现bug时,我们新建了fix-bug分支,并且在这个分支上解决了这个BUG。现在我们想把这个commit给应用到master分支和develop分支上。当然,我们可以通过merge来合并代码。
但是,如果你现在想把这个commit合并到之前版本上的代码,这时候通过merge自然就不行了。这时候,可以通过上面这个命令来操作。
切换到之前的版本上,在其执行git cherry-pick 改完bug的commit号即可。
git fetch
git fetch [repository] [remoteBranch:localBranch]
从指定远程仓库或分支下载代码,到指定分支。默认是下载到当前分支。并将其保存到.git/refs/remotes文件夹下
这个我只测试一个远程仓库。如果是多个远程仓库呢?会不会也放在这里?
git pull
git pull=git fetch + git mergegit pull --rebase=git fetch + git rebase
二、其他功能命令
git bisectgit stashgit loggit tag
git bisect
1、功能
如果出现bug时,可以使用二分查找,找出哪个commit引入这个bug。
其实在软件解决bug有俩个方式:
- 如果这个
bug比较简单,可以找到定位到代码,然后就可以解决了; - 如果这个
bug难以定位,但是在之前版本并没有出现这个错误,就可以通过这个命令找到;
2、查找的原理

git stash
1、作用
暂存更改的信息。恢复上次更改信息的命令是:git stash pop。
- 这个命令可以连续调用
git tag
1、作用
生成一个标签指针,指向指定的代码仓库状态。
git tag在设计上,被设计成是不变的。所以:git pull、git push、git fetch是不会更新tag的。只有加上git pull --tags才可以更新tag。git push --tags:将本地仓库的tag同步到远程仓库
2、常用命令
- 轻量级标签:
lightweight tag:2.0 - 标注的标签:
annotated tag:这个tag有一个信息

浙公网安备 33010602011771号