十分钟了解 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 获取远程分支 mastermerge 到当前分支

•  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 提交里面有 masterbugFix 代码库所有的修改。


此时的 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 都有,你可以删除只留下想要的也可以进行修改 然后 continuepush。如果你不删的话会发现全部文本行都组成了一个多行的 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。

目录
相关文章
|
3月前
|
存储 开发工具 git
|
6天前
|
缓存 Java Shell
[Git]入门及其常用命令
本文介绍了 Git 的基本概念和常用命令,包括配置、分支管理、日志查看、版本回退等。特别讲解了如何部分拉取代码、暂存代码、删除日志等特殊需求的操作。通过实例和图解,帮助读者更好地理解和使用 Git。文章强调了 Git 的细节和注意事项,适合初学者和有一定基础的开发者参考。
21 1
[Git]入门及其常用命令
|
3月前
|
开发工具 git
【GIT 第二篇章】GIT常用命令
Git常用命令涵盖初始化、状态管理、提交、分支处理、远程操作等关键流程。`git init`启动本地仓库,`git clone`下载远程仓库。通过`git status`和`git diff`检查工作状态与差异。利用`git add`暂存文件,`git commit`保存更改。借助`git branch`、`git checkout`、`git merge`和`git rebase`管理分支。使用`git fetch`、`git pull`和`git push`同步远程仓库。通过`git reset`、`git revert`和`git checkout`实现版本回退。
65 0
|
29天前
|
开发工具 git
git学习四:常用命令总结,包括创建基本命令,分支操作,合并命令,压缩命令,回溯历史命令,拉取命令
这篇文章是关于Git常用命令的总结,包括初始化配置、基本提交、分支操作、合并、压缩历史、推送和拉取远程仓库等操作的详细说明。
98 1
git学习四:常用命令总结,包括创建基本命令,分支操作,合并命令,压缩命令,回溯历史命令,拉取命令
|
10天前
|
开发工具 git 开发者
|
10天前
|
开发工具 git 开发者
提升Git效率:掌握这5个高级命令
【10月更文挑战第17天】
30 0
|
2月前
|
存储 Linux 开发工具
掌握 Git 命令:每个开发者的必备技能
无论团队项目还是个人开发,掌握 Git 命令都是必备技能。本文介绍 Git 的基本概念与命令,如初始化仓库 (`git init`)、添加文件 (`git add`)、提交更改 (`git commit`)、检出分支 (`git checkout`)、合并分支 (`git merge`) 等,还分享了高级技巧如查看差异 (`git diff`)、撤销提交 (`git revert`)、修复合并冲突 (`git mergetool`) 和使用别名简化命令 (`git config --global alias.ci commit`)。
|
2月前
|
机器学习/深度学习 Shell 开发工具
Python使用管道执行git命令报错|4-7
Python使用管道执行git命令报错|4-7
|
2月前
|
存储 Linux 开发工具
Git基础命令,分支,标签的使用【快速入门Git】
本文详细介绍了Git版本控制系统的基础概念和常用命令,包括工作区、暂存区和版本库的区别,文件状态的变化,以及如何进行文件的添加、提交、查看状态、重命名、删除、查看提交历史、远程仓库操作和分支管理,还涉及了Git标签的创建和删除,旨在帮助读者快速入门Git。
Git基础命令,分支,标签的使用【快速入门Git】
|
2月前
|
存储 Linux 开发工具
掌握 Git 命令:每个开发者的必备技能
本文介绍 Git 的核心概念,如仓库、提交、分支与合并,并提供了常用命令,如初始化仓库 (`git init`)、提交更改 (`git commit -m "Commit message"`)、拉取 (`git pull`) 和推送 (`git push`) 等。此外,还分享了高级技巧,如撤销提交 (`git revert <commit>`)、交互式暂存 (`git add -i`) 和使用别名简化命令 (`git config --global alias.ci commit`) 等,帮助开发者提升效率。无论是初学者还是资深开发者,都能从中受益。