wangjie-fourth 的个人博客

may be just need work hard

目录
Git相关命令总结
/  

Git相关命令总结

相关概念

Git是一种可以记录某个文件夹下所有文件状态的版本管理工具,它可以将仓库恢复到任何状态时的仓库。

状态?对Git而言哪些东西可以标识仓库的状态?

  • commit对象的SAH-1
  • 分支branch
  • HEAD:指向当前分支的最新指针,保存在.git/HEAD文件中
  • 标签tag

这里包含远程分支的状态

其实,状态本质上就是每次commit的对象。至于分支、HEADtag其实是一个特殊的指针,固定指向某个commit对象。

既然我们可以将仓库恢复到之前任何commit对象,就需要保证commit对象在提交之后无法改变它。否则,版本控制就没有任何意义。

git commit --amend说是可以修改上一个commit对象,但其实并不是。它是在上一个commit对象的基础上分叉新建一个commit对象。

5、GitHublogo来源
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对象。
    image.png
    这个时候,如果直接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 mergegit rebase

这俩个命令都是合并多个分支代码,只不过是以不同方式来合并代码。即,git merge只是将多个分支的最新commit对象进行合并;而git rebase会将一个分支的所有commit对象都在另一个分支上进行合并。
image.png
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、查找的原理
image.png

git stash

1、作用
暂存更改的信息。恢复上次更改信息的命令是:git stash pop

  • 这个命令可以连续调用

git tag

1、作用
生成一个标签指针,指向指定的代码仓库状态。

  • git tag在设计上,被设计成是不变的。所以:git pullgit pushgit fetch是不会更新tag的。只有加上git pull --tags才可以更新tag
  • git push --tags:将本地仓库的tag同步到远程仓库

2、常用命令

  • 轻量级标签:lightweight tag:2.0
  • 标注的标签:annotated tag:这个tag有一个信息

git log

评论