开发者社区> 良许Linux> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

十分钟了解 git 那些“不常用”命令(上)

简介: 本文主要是介绍 git 不常用 初期不太会用的命令,希望你看了能理解这些命令的使用,并在平时使用过程中一点点地刻意进行练习,逐步熟练并知道何时需要用到这些命令去解决你的问题。( 我也在不断熟练中)
+关注继续查看

基础命令


如果你还是刚刚接触 git 命令,还不清楚仓库 、工作流、分支、提交的童鞋可以先看下 git 使用简易指南,这个应该是我初学 git 看的第一份且收藏至今的指南了~ 图解很清晰易懂,真 10 分钟入门的资料


git 使用简易指南:https://www.bootcss.com/p/git-guide/


然后你会发现如下基础命令将会成为你之后几乎每天都要用到的 80% 的命令:


•  git clone git@github.com:nohosts/nohost.git 克隆远程仓库的内容到本地

•  git pull origin master 获取远程分支 master 并 merge 到当前分支

•  git branch -a 查看全部分支(远程+本地)

•  git checkout -b bugFix 新建 bugFix,并切换到到此分支。(如果分支已存在则去掉-b即可)

•  git status 查看当前~~~~版本状态(是否修改)

•  git add . 增加当前子目录~~~~下所有文件更改至暂存区

•  git commit -m 'xxx' 提交暂存区的修改至本地的版本库, 修改备注为xxx

•  git push 将本地版本推送到远程分支

•  git tag v1.0 dfb02e6e4f2f7b573337763e5c0013802e392818 增加 v1.0 的 tag 到某个提交上

•  git merge testBranch 合并 testBranch 分支至当前分支`

•  git stash 暂存本地的当前修改,将本地代码重置为 HEAD 状态。

(如果需要取出修改,命令后加一个pop即可)

•  git log 显示提交日志(如果想每个提交信息显示在一行,可以加上--pretty=oneline)

•  git show dfb02e6e4f2f7b573337763e5c0013802e392818 显示某个提交的详细内容

•  git reset --hard HEAD 将当前版本重置为 HEAD注意这两个命令的区别:


git pull = fetch + merge


git pull --rebase = fetch + rebase

"不常用"命令


一、git rebase 变基


在 Git 中整合来自不同分支的修改主要有两种方法:merge 以及 rebase。在本节中我们将学习什么是“变基”,怎样使用“变基”,并将展示该操作的惊艳之处,以及指出在何种情况下你应避免使用它。——git-scm 变基

​​

说明:后面的举例每个分支都有不同的颜色,*前缀表示现在所处的分支,而 commitid 都由 C0、C1、C2 代替每一个提交的哈希值,箭头表示分支的继承。


我们之前整合分支用的最多的就是 merge 了,那 merge 和 rebase 有什么区别呢?


1. merge


merge 合并两个分支时会产生一个特殊的提交记录,它有两个父节点。简单说就是:“我要把这两个父节点本身及它们所有的祖先都包含进来。”


git checkout master; git merge bugFix


下图中左、右两张图分别是执行如下代码前后的样子:

微信图片_20220414170534.jpg


可以看出来,红色圈圈是最主要的改变—— merge 合并分支后,会在 master 分支上 新增一个 C4 提交 ,而 C4 提交里面有 master 和 bugFix 代码库所有的修改。


此时的 bugFix 代码还没和 master 同步(颜色不同),我们还需要执行如下代码:

git checkout bugFix; git merge master

微信图片_20220414170648.png


2. rebase


rebase 实际上就是取出一系列的提交记录,“复制”它们,然后在另外一个地方逐个的放下去。它的优势就是可以创造更线性的提交历史。


git checkout bugFix; git rebase master

微信图片_20220414170807.png


bugFix 分支里的内容通过 rebase 直接 复制 到 master 分支上。现在 bugFix 分支上的工作在 master 的最顶端,同时我们也得到了一个更 线性 的提交序列。


注意:提交记录 C3 依然存在(树上那个半透明的节点),而 C3' 是我们 rebase 到 master 分支上的 C3 的 副本(内容是一样的,只是 commitid 更新了)但是,此时 master 还没有和 bugFix 同步(颜色不同),我们还需要执行如下代码:

git checkout master; git rebase bugFix

微信图片_20220414170925.jpg


由于 bugFix 继承自 master,所以 Git 只是简单的把 master 分支的引用向前移动了一下而已。


3. rebase 的延伸用法


3.1 省去切换分支即可 rebase


git rebase targetBranch originBranch


表示切换到 originBranch,然后执行 git rebase targetBranch

3.2 修改某几次提交


git rebase -i commitid

微信图片_20220414171227.jpg

如上图标注的,传的 commitid 为你想修改的提交的 前一个 commitid。执行命令后进入 vi 模式,会提示你一些操作命令(p、r、e...)你只需要在最上方修改默认的 pick 为你想要的操作,然后退出并 wq 保存即可生效。


具体操作:•  pick 使用(啥也没变)•  reword 使用并修改 commit msg, 改后 commit id 也会更新•  edit 使用并编辑 commit 时的文件
•  编辑后 
git add . 然后 git commit —amend 还可以更新最新的 commit msggit rebase —continue 把后面的内容加进来并解决冲突, 最后提交。最新的 commit id 也更新•  squash 合并 commit

选择最新的 commit 去合并,然后 continue 发现这一次和上一次的 commit msg 都有,你可以删除只留下想要的也可以进行修改 然后 continue 和 push。如果你不删的话会发现全部文本行都组成了一个多行的 commit msg如果 commit 再往前已经没有了 就不能再 squash,否则会报错( error: cannot 'squash' without a previous commit )。然后 git rebase --edit-todo 可以继续 vi 编辑
•  fixup 合并 commit 到前面而且 commit,commit msg 也没了•  drop 删除某个 commit

注意:


如果想要恢复这一次 rebase 操作,则可以执行 git rebase —abort

如果想完全恢复本地分支到远程的状态,可以执行 git reset --hard origin/bugFix ,或者你可以 git reflog 找到对应提交记录回滚,但是有点麻烦。


4. rebase 需要谨慎使用


当你要改写的 commit history 还没有被提交到远仓库的时候,也就是说,还没有与他人共享之前,commit history 是你私人所有的,那么想怎么改写都可以。


而一旦被提交到远程后,这时如果再改写 history,那么势必和他人的 history 长的就不一样了。git push 的时候,git 会比较 commit history,如果不一致,commit 动作会被拒绝,唯一的办法就是带上 -f 参数,强制要求 commit,这时 git 会以 committer 的 history 覆写远程分支,从而完成代码的提交。虽然代码提交上去了,但是这样可能会造成别人工作成果的丢失,所以使用 -f 参数要慎重。所以,在不用 -f 的前提下,想维持树的整洁,方法就是:在 git push 之前,先 git fetch,再 git rebase


5. 总结


•  无论是通过变基,还是通过三方合并,整合的最终结果所指向的快照始终是一样的,只不过提交历史不同罢了。 变基是将一系列提交按照原有次序依次应用到另一分支上,而合并是把最终结果合在一起。•  在你自己的分支(非他人共享)的分支进行 rebase 是可以的,但是如果在公共分支 rebase 修改提交需要谨慎——最好是先 fetch、再 rebase、最后 push。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
十分钟了解 git 那些“不常用”命令(下)
本文主要是介绍 git 不常用 初期不太会用的命令,希望你看了能理解这些命令的使用,并在平时使用过程中一点点地刻意进行练习,逐步熟练并知道何时需要用到这些命令去解决你的问题。( 我也在不断熟练中)
47 0
Git常用命令
Git常用命令
42 0
Git常用命令
Git常用命令 转自:http://blog.csdn.net/stven_king/article/details/44856045 查看、添加、提交、删除、找回,重置修改文件 git help # 显示command的help git show # 显示某次提交的内容 git show $id git co – # 抛弃工作区修改 git co .
2018 0
Git常用命令
这篇文章主要是为了自己能快速翻找Git命令,不做具体介绍,想学习Git怎么用,请移步廖雪峰的《Git教程》。这篇教程浅显易懂,花个几小时就能懂,上手非常快的。
883 0
git常用命令
1、清除暂存区和工作区记录 git reset --hard HEAD git clean -df 然后运行git status显示clean字样说明清除成功 2、当a分支修改的内容迁移到b分支 回到a分支修改之前(假定是当前) ...
846 0
Git 常用命令
查看帮助命令: git config --help git help config man git-config 查询配置 git config user.name // 或者 git config --get user.
827 0
Git常用命令
git checkout -b feature-announcement origin/feature-announcement 检出远程分支到本地 git branch --set-upstream-to=origin/feature/evaluate4 feature/evaluate4    ...
674 0
git常用命令
git常用命令 本文为学习git时摘录的笔记,原文见:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/ 创建版本库 git init 把文件添加到版...
1140 0
Git常用命令
<span style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:28px">1. Git概念 </span><br style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:28px; padding:
1116 0
+关注
良许Linux
机械硕士,自学转行进世界500强外企。
文章
问答
文章排行榜
最热
最新
相关电子书
更多
AGit-Flow:新一代高效Git协同模型
立即下载
AGit-flow:新一代高效Git协同模型
立即下载
华为Git实践:工作模式创新,及多中心分布式架构
立即下载