IDEA (任意 JetBrains IDE)拆分先前 commit

最近在合并上游代码,遇到了一个问题:某个 commit 杂糅了几个不同的特性修改,这可能会导致 rebase 上游代码时需要再对该 commit 进行额外的代码冲突处理 解决方法:合并上游分支前,拆分杂糅的 commit,并将其中不同的特性修改合并(Squash)回相关的 commit。可以直接通过命令行进行操作,可以参考:Break a previous commit into multiple commits。也可以通过 JetBrains 家内置的 Git 进行操作,下面会介绍 IDEA 图形化操作的方法 非先前 commit 的拆分 对于刚提交的 commit,要拆分多个 commit 是非常容易的,因为我们只要 soft reset commit,将 commit 内容撤销回至 暂存区,就可以随意提交 commit 如果对于 soft reset 不太了解,可以参考我之前的博客:Git 中的回退操作:reset 和 revert 先前 commit 的拆分 先前 commit 指的是:在目标 commit 后已经有了若干个 commit。它无法直接通过 soft reset 进行拆分,因为这样会丢失后续的 commit,如下图,我们需要拆分 B commit,我们就无法直接使用 soft reset ,因为这样会丢失 C 和 D commit 的修改 所以我们需要使用 rebase,具体步骤: 在 交互式 (interactive) rebase 中将 B 标记为 edit,这时 B 后面的 commit 会被暂时隐藏起来 使用 soft reset 将 B 撤销回 暂存区 将 B 的修改内容分多个 commit 提交 B1 和 B2 使用 rebase 的 continue 将刚才隐藏的 C 和 D 恢复回来,需要注意的是:因为之前的 commit 记录已经改变了,所以这时的 C 和 D 已经与原来的 commit 记录不相同,故标记为 C' 和 D' ...

March 27, 2024

Git 中的回退操作:reset 和 revert

Git 中回退有 reset 和 revert,这两个的区别就是是否保留更改记录 假设当前的提交情况是:A <- B <- C <- D <- HEAD,如下图: 当前是 D,希望回退到 A,那我们可以使用 reset 命令,reset 后再看 git log 就会发现:B <- C <- D 宛如没有出现过,这适用于想完全舍弃 A 之后的修改 但是如果我们想保留 B <- C <- D 的修改记录,可能这三个 commit 的功能只是暂时用不到,以后可能还用到,或者可能当前分支是一个公共分支,B <- C <- D 可能已经被同步到了其他小伙伴电脑上,为了尽量避免代码冲突。这些情况就需要使用 revert 命令,这样会重新生成新的 commit,其中包含回退的记录(假设 D 这个 commit 是添加了一些代码,那么 revert D 的 commit 就是删除这些代码) reset 使用 git reset A ,reset 会修改 head 的指向,这样可以回滚到 A,默认使用的参数是 --mixed,这个参数决定了 reset 时 Git 该如何处理工作区和暂存区 ...

July 8, 2022

Git 笔记

学习建议 廖雪峰Git教程 比较详细,可操作性也比较强,在评论区可以找到勘误 Git官方推荐的《Pro Git》也很不错,推荐掌握了一定Git基础后再看 对于没有 Linux 基础,或者文字版学起来比较困难的朋友可以看系列视频教程 互联网人都该懂点 Git Linux 下最常用的编辑器就是 Vim,然而第一用可能会让你怀疑人生,建议先学习一下 :使用Vim创建和编辑文本文件 注意点 Git 2.23 (2019.8.16) git checkout 这个命令被拆分成了两个新命令:git switch 和 git restore 创建并切换到dev分支:git checkout -b dev 现在用git switch -c dev 效果相同 初始配置 安装Git Bash后需要做初始配置 用户名邮箱 # 任意文件夹右键 点击“ Git Bash Here ” # ""内替换为自己的用户名和邮箱 git config --global user.name "username" git config --global user.email "email" # 查看配置是否成功 git config user.name git config user.email SSH 免密登录 # ssh-keygen 用于生成,管理和转换身份验证密钥 # -t:密钥的类型 # -C:用于识别这个密钥的注释(不添加注释直接ssh-keygen -t rsa也不影响使用) ssh-keygen -t rsa -C "邮箱地址" # 连续按3次回车 # 将用户目录下.ssh文件夹内的id_rsa.pub的内容粘贴到GitHub的SSH Keys中 # 具体位置:GitHub Settings -> SSH and GPG keys -> SSH keys # 测试是否成功 Github # 码云测试命令为:ssh git@gitee.com 反馈的结果与 GitHub 类似 ssh git@github.com # Are you sure you want to continue connecting (yes/no)? # 这时需要输入:yes #成功会提示成功认证你的账户 # Hi aaronlinv! You've successfully authenticated, but GitHub does not provide shell access. # Connection to github.com closed. 场景0:Git 基本使用 # 新建文件夹,初始化为Git仓库 mkdir learn-git cd learn-git git init # 在当前目录添加并编辑文件(不熟悉 vim 编辑器可以用其他编辑器新建文件并编辑文件 ) vim test.txt # 查看文件状态 test.txt现在为Untracked状态 git status # 添加文件到暂存区 git add test.txt # 提交commit -m 代表添加一个“提交信息” git commit -m "add test.txt" # 推送到 GitHub(在 GitHub 上创建空白仓库,并复制仓库地址) # "git@github.com:aaronlinv/learn-git.git" 需要替换为自己新建的仓库地址 # 先添加远端仓库 # origin:远端仓库的别名(默认origin) git remote add origin git@github.com:aaronlinv/learn-git.git # 查看远端操作(会显示 fetch和push) git remote -v # 推送到远端仓库(使用SSH协议需要配置SSH免密登录) git push -u origin master # -u:指定默认远端仓库别名,下一次推送只需使用git push # origin:远端仓库的别名(默认origin) # master:分支名称 push 是可能会遇到报错:refusing to merge unrelated histories 原因是远程仓库和本地仓库做了不同的改变并commit,导致本地仓库和远程仓库变成了独立的两个仓库,所以不能直接合并,执行以下命令合并代码,再push即可 ...

September 3, 2020