【Git】 理解Git之命令篇 终于把这篇文章发表出来了...

一直以来要写一篇关于git命令使用的文章,最近终于挤出来时间把常用的命令汇总一下方便自己和同学们查考,阅读本文需要同学们有点git使用基础。网上入门教程很多可以稍做了解,楼主很不赞成开发者开始就使用可视化界面去操作平时的代码管理。因为如果开发团队人数少的话还可以,人数几十上百个的话,如果开发对于git的原理不熟悉就很容易导致项目管理的混乱。

概念

git 最让人迷惑的就是一些概念名称,我把这些不太容易理解或者混淆的单独拎出来做下回顾。

工作区 暂存区 仓库

git 本地三个区块
在初始化git版本库之后会生成一个隐藏的文件 .git ,可以将该文件理解为git的版本库 repository,而我们自己建立的项目文件夹即工作区 working directory ,在.git 文件夹里面还有很多文件,其中有一个index 文件 就是暂存区也可以叫做 stage ,git还为我们自动生成了一个分支master以及指向该分支的指针head ,可以看到版本库里维护了暂存区和分支两大部分。当然分支可以有很多个

工作区: 一般是我们项目的目录
暂存区: 本地项目如果有内容修改后 通过git add 命令就把工作区的修改记录同步到了暂存区(使用git checkout 命令把暂存区域的修改撤销,会在撤销相关进行详细描述)
分支: 当我们在某个分支上进行commit 操作就把当前暂存区的 (通过git reset 把提交到分支的commit 记录撤销到暂存区。会在撤销相关进行详细描述)
下面的内容我们就会围绕这几个区域进行详细的说明

HEAD ,HEAD^ , HEAD~

https://blog.csdn.net/fly_zxy/article/details/82593842
参考-选择修订版本

HEAD: 可以理解为我们每次提交的commit都为一个指针,HEAD即为指向当前分支最后一次提交的一个指针
HEAD^ : 在HEAD的基础上的父提交,如果^n n为数字(查看当前comitid的第n次父提交的内容)
HEAD~:当前HEAD基础上的上一次提交内容(区别于^), ~n 为往上数第n次提交记录

合并使用HEAD~3^2 :当前分支最新提交的前三次提交的第二个父提交的指针。

容易引起迷惑的一些点

分支合并(git rebase,git merge)

git 分支合并原则 尽可能保留分支的操作过程,也就是分支信息和commit提交信息
参考

git rebase:使用原则: 对于不再有子分支的branch,并且因为rebase而会被重写的commits都还没有push分享过,可以比较安全地做rebase,如果满足上面的条件则非常建议使用git rebase

git cherry-pick <commit id> git rebase 针对的是分支,此命令针对的是特定的commit id 使用场景可按照rebase的原则来

git merge : 按照合并的原则是尽可能保存commit的分支以及提交记录,–no-ff比较常用
--no-ff 指的是强行关闭fast-forward方式,不使用fast-forward方式合并,保留分支的commit历史
--squash 是用来把一些不必要commit进行压缩,比如说,你的feature在开发的时候写的commit很乱,那么我们合并的时候不希望把这些历史commit带过来,于是使用–squash进行合并
--no-commit 直接不产生新的commit直接合并

在这里插入图片描述

错误案例:

下面展示了已经在中央库存在的feature分支,两个开发人员Bob和Anna做了对feature分支针对master做rebase操作后,再次push并且同步工作带来的灾难:历史混乱,并且merge后存在多个完全相同的changeset。
git rebase分支到共享分支的时候会造成重复
也就是说,Master 这个分支是一个共享分支,多个开发人员都在其上有提交的commit,如果对rebase Master到自己的分支然后再次提交的自己的feture就会造成如上的一些混乱的历史。

正确范例:

假如有两个分支并行开发 一个叫Feture 一个叫 John/Feture
两个分支共同开发

git 合并一个独立的分支到自己的私有分支上。
git 合并一个独立的分支
如上图展示了 git rebase Feature 到 John/Feature ,虽然 rebase和merge 都能达到效果,但是如上的rebase 更清爽一些。

可以总结为:git rebase 后面的分支名一定不要是多人共享的分支,可以是本地的私有分支,可以是仓库里独立开发的分支

撤销 (git reset ,git revert, git reflog)

常用的两个撤销相关的命令git resetgit checkout

git resest --hard commitid 比较危险直接把选中的commitid作为当前分支的HEAD,并且清空暂存区。合理使用

git reset --soft commitid 把commitid之前的恢复到暂存区。注意这个commit是需要回退的commit的前一个commit

git revert commitid 把commitid 回退到当前的版本库,和git reset --hard的区别是HEAD 指针继续向前,而不是直接退回到某个commit并且删除记录。revert 后会在原有提交记录的基础上新增一条记录但是内容会返回到commitid对应的提交内容。

git reflog 分支被删除或者git reset --hard 删除了一些提交记录后 也可以通过此命令查看一些提交的记录。

工作区 暂存区
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值