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_fourth
git config --global user.email wangjie_fourth@163.com
git config --global core.editor "code --wait"
git config --global push.default simple
git config --global core.quotepath false
git config --global core.autocrlf input
git config --global --list
2、Git的几个区域
- 未被管理的
- 工作区
- 暂存区
- 仓库区
在这几个区域转换的命令。
常用命令
这里分俩类介绍命令:
- 版本提交相关的命令
- 其他功能相关的命令
一、版本提交命令
git checkout
git reset
git commit
git push
git merge
git rebase
git revert
git cherry-pick
git pull
git 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 merge
git pull --rebase
=git fetch + git rebase
二、其他功能命令
git bisect
git stash
git log
git 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
有一个信息