Git进阶之代码回滚、合并代码、从A分支选择N次提交,合并到B分支【revert、merge、rebase、cherry-pick】

这篇具有很好参考价值的文章主要介绍了Git进阶之代码回滚、合并代码、从A分支选择N次提交,合并到B分支【revert、merge、rebase、cherry-pick】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  • B站视频地址: https://www.bilibili.com/video/BV1KX4y1a7N9

  • Git学习文档:https://d9bp4nr5ye.feishu.cn/wiki/PeDPw3mm3iFA36k9td9cVeignsZ


在很长一段时间里,我对Git的操作只限于:提交代码,拉取代码,合并代码。

虽然上面这些操作在日常工作中也足够了,但不会点高级知识不利于装X,今天我们来学习几个高级点的操作。


一、前提


在正式操作之前,我们先来共知几个命令和概念。


SHA标识


每一次提交Git都会生成一个唯一SHA标识(简单来说就是为这次提交生成一个唯一字符串),代码合并、回滚、检出都和这个标识相关。

注:SHA标识是指Git中的SHA-1哈希标识符,它是一个40个字符的字符串,用于唯一标识Git中的每个提交、对象和分支。SHA-1是一个加密哈希函数,它接受输入(例如文件内容或提交信息)并生成一个唯一的40字符长的哈希值。


git log


Git 的每次提交都会携带很多信息,提交者、提交时间、唯一SHA标识等,想要查看这些信息,可以使用 git log 命令。


git log

完整的查看 log信息,展示效果如下:

git revert多个提交,# Git/GitHub,git,github,revert回滚,rebase,cherry-


git log --oneline

精简提交信息,以一行的方式展示
git revert多个提交,# Git/GitHub,git,github,revert回滚,rebase,cherry-

git log --graph --oneline

以时间线的方式查看精简的日志信息

git revert多个提交,# Git/GitHub,git,github,revert回滚,rebase,cherry-


二、回滚代码


代码回滚,提交了错误的代码、代码错合并到非目标分支

  1. commit 回滚
  2. merge 回滚

回滚


使用 git log --graph --oneline 查看日志线,并找到我们要撤回提交的hash

git revert多个提交,# Git/GitHub,git,github,revert回滚,rebase,cherry-

1、找到我们要回滚commit的 hash
git log --graph --oneline

2、执行回滚命令   回滚之后可能是有冲突的,是需要手动解决冲突
git revert 1b17801
git push


3、回滚 mergn
git revert f259bf5
git push

冲突


如果回滚的时候有冲突,会这样提示

git revert多个提交,# Git/GitHub,git,github,revert回滚,rebase,cherry-


方式一

可以选择放弃这次的回滚 git revert --abort


方式二

-- 1、手动解决冲突

-- 2、提交修改
git add .

-- 3、继续revert, 会弹出一个文件,可以修改commit的描述,也可以直接关闭
git revert --continue

-- 4、push代码
git push

git revert多个提交,# Git/GitHub,git,github,revert回滚,rebase,cherry-

三、合并代码


合并代码就是把branchA的代码移植到branchB,有两个命令可以来完成此操作:merge、rebase。

假如branchA是我们的开发分支,branchB是正式分支,在branchA上面我们提交了三次。现在我们来看看使用 merge 和 rebase 合并会有什么不同。


Merge

merge会把branchA所有的提交打包成一个最终状态,去和branchB的最终状态来一次合并。如果有冲突,我们只需要解决一次冲突就好了。

# branchA 当前log
A---B---C (branchA)

# branchB 当前log
D---E---F---G (branchB)


# 在branchB 上执行 git merge branchA  

      A---B---C (branchA)
     /         \
D---E---F---G---H (branchB, merge commit)

其实就是把 branchA 当前的状态当作一次提交合并到branchB上去,所以会形成一次新的提交 H。对branchA没什么改变,对branchB 多了一次提交。(Merge remote-tracking branch ‘origin/branchA’ into branchB)


Rebase

rebase 会把branchA 上的每一次提交,都依次合并到 branchB 上去。 如果在branchA上的三次提交都和branchB有冲突,那你就要解决三次冲突。(因为它是依次提交的)

# branchA 当前log
A---B---C (branchA)

# branchB 当前log
D---E---F---G (branchB)


# 在branchB 上执行 git rebase branchA  

             A--B--C (branchA, rebased)
            /
D---E---F---G (branchB)

从结果来看相对于 merge, rebase有两个特殊点(代码没有冲突的情况下)

  1. 它不会生成新的 SHA标识。
  2. 目标分支成了一条直线,且更长了。(具体看branchA提交的次数)

结论

合并代码的时候使用 merge,可以更好的看到提交的变更,并保留每个分支的独立性和历史记录,只需要解决一次冲突,所以在正常情况下,更推荐使用 merge 来合并代码。

当然如果你是把别的分支 rebase到自己的分支,那没什么关系,最起码不会影响到别人。


Rebase 合并 commit


rebase 除了上面的合并代码,它还有一个很大的用处就是合并commit,开发的过程中我们可能提交了很多乱七八糟的commit,但是为了更美观,我们可以把多个commit合并成一个新的commit。

合并commit有两个方式

  1. 以头为标准,往下合并N个commit git rebase -i HEAD~N
  2. 以某个节点向上做commit合并 git rebase xxx xxx 就是commit的hash值

假设我们有三次提交,现在我们要把 two 和 three 合并成一个新的提交 two and three

git revert多个提交,# Git/GitHub,git,github,revert回滚,rebase,cherry-


git rebase -i 49412a4

执行命令后,会弹出一个文本窗口,让我们来确定要对这次rebase的操作,可以对每个commit进行很多。

git revert多个提交,# Git/GitHub,git,github,revert回滚,rebase,cherry-

pick 687575f three commit 改为 squash 687575f three commit 然后保存退出。

保存后,又会弹出一个窗口,告知我们修改 commit的提交信息

修改前

# This is a combination of 2 commits.
# This is the 1st commit message:

two commit

# This is the commit message #2:

three commit

修改后

# This is a combination of 2 commits.
# This is the 1st commit message:

two three commit

# This is the commit message #2:

three commit

保存后就成功

git revert多个提交,# Git/GitHub,git,github,revert回滚,rebase,cherry-


再次查看日志

git revert多个提交,# Git/GitHub,git,github,revert回滚,rebase,cherry-


rebase修改commit的操作有很多,上面我们用了一个squash,下面是全部的命令,可以根据需要选择

命令 解释 简写
pick 使用提交,即应用该提交的更改。 p
reword 使用提交,但可以编辑提交消息。 r
edit 使用提交,但停下来以进行修改。 e
squash 使用提交,将其融入到前一个提交中。 s
exec 使用shell运行命令(行中的其余部分)。 x
break 在此处停止(稍后使用 git rebase --continue 继续进行rebase)。 b
drop 删除提交。 d
label 为当前HEAD标记一个名称。 l
reset 将HEAD重置为一个标签。 t
merge 将标签合并到HEAD上,并且可以选择编辑合并提交的消息。 m
fixup 类似于"squash",但仅保留前一个提交的日志消息,除非使用了-C,这种情况下仅保留当前提交的消息;-c-C 相同,但会打开编辑器。 f

四、从A分支选择N次提交,合并到B分支


如标题所示,目的是从A分支拣取某几次提交到B分支,可使用命令 git cherry-pick

假设在A分支上提交了三次,三次的hash分别是 A1、A2、A3, 现在我们要把 A2、A3 提交合并到B分支上,需要执行的命令如下:

-- 1、切换到B分支
git checkout B

-- 2、把A2、A3 提交合并过来
git cherry-pick A2 A3

-- 3、提交代码
git push

正常流程就是上面这样,但合并代码总面临着冲突,如果冲突了就会显示下面的异常

git revert多个提交,# Git/GitHub,git,github,revert回滚,rebase,cherry-


冲突了的解决办法有两个


方式一

取消这次的操作 git cherry-pick --abort


方式二

解决冲突

-- 1、先手动解决冲突

-- 2、添加修改
git add .

-- 3、在解决冲突后继续执行git cherry-pick命令 、 会弹出一个文件,可以修改commit的描述,也可以直接关闭
git cherry-pick --continue

-- 4、push代码
git push

git revert多个提交,# Git/GitHub,git,github,revert回滚,rebase,cherry-文章来源地址https://www.toymoban.com/news/detail-718220.html

到了这里,关于Git进阶之代码回滚、合并代码、从A分支选择N次提交,合并到B分支【revert、merge、rebase、cherry-pick】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • git代码回滚是使用reset还是revert

    git代码回滚是使用reset还是revert

    时光不能回退,Git却允许我们改变历史。 想要让Git回退历史,有以下步骤: 快捷命令: 【注:HEAD是指向当前版本的指针,HEAD^表示上个版本,HEAD^^表示上上个版本】 如果修改到的文件比较少,我们可以不通过命令回滚的方式,手动删除之前的修改,再进行提交。 reset和reve

    2024年02月07日
    浏览(39)
  • git分支回滚之后,无法合并的问题及解决方式

    当git上出现bug时候,回滚到某个历史版本后,发现与master分支合并不了了 出现原因:git记录到有合并记录,所以就不让合并 解决方式:将最后一次正常提交的代码以后的提交/合并记录清空,然后重新合并即可 比如:

    2024年02月11日
    浏览(9)
  • Idea下面git的使用:变基、合并、优选、还原提交、重置、回滚、补丁

    Idea下面git的使用:变基、合并、优选、还原提交、重置、回滚、补丁

    变基是把本项目的所有提交都列出来按顺序一个个提交到目标分支上去 而合并是把两个分支合并起来,但是旧的分支还是可以启动其他分支,在旧的分支上继续开发 :::success 主动变基和被动变基的区别 ::: 没有什么区别变基,只是把合并的一种策略,把两个分支的有差异的提

    2024年02月08日
    浏览(11)
  • git主干master分支回滚到历史版本(不会有错误的提交记录)

    git主干master分支回滚到历史版本(不会有错误的提交记录)

    master版本,“合并错了”的回滚步骤: (这样做不会有“合并错了”的提交记录)

    2024年01月21日
    浏览(10)
  • Git 分支操作详解:创建、提交、合并主分支

            Git 是一款强大的分布式版本控制系统,分支是其核心特性之一,为团队协作和项目管理提供了灵活性。本文将介绍 Git 分支的基本用法,包括创建分支、提交更改、合并主分支等操作。 1、 创建分支         在 Git 中,分支是项目开发的不同线路,它们允许团

    2024年02月05日
    浏览(37)
  • git 分支合并某一个提交

    有的时候会需要合并某个分支的一个提交信息,而不是全部的提交,那就不能单纯的进行merge。比如你在分支:branch1。需要合并master的最新的那个提交,但是不需要倒数第二及以前的提交数据。 首先,确保你当前在 branch1 分支上,可以使用以下命令来切换到 branch1 分支: 然

    2024年02月10日
    浏览(39)
  • Git 提交分支合并请求(Gitea)

    Git 提交分支合并请求(Gitea)

    在 feature分支 (特性分支)完成开发后,需要提交申请,将 feature分支 合并到 develop分支 (开发分支)。 当项目负责人通过请求后,本次开发结束;如项目负责人拒绝请求,则需要按要求修改代后重新提交。 注:本示例使用的 Git服务器 为 Gitea。 创建 合并请求 选择合并的

    2024年02月12日
    浏览(8)
  • git——合并分支commit记录 squash提交

         在公司和别人协同合作时,作为开发需要向架构或者负责人提交mr以合并代码,为了提高review效率,有些负责人会要求一个mr仅保留一条commit记录方便代码比对review的观看,但是开发常常是很多需求和bug混合着写,不可能每个分支都暂存一下去其他分支查看吧,因此总会

    2024年02月14日
    浏览(39)
  • Git合并某个分支上的某个提交

    1. 首先,确保你当前所在的分支是你要合并分支的父分支。你可以使用以下命令切换到父分支: 2. 确保你要合并的分支是可用的。你可以使用以下命令查看所有可用的分支: 这将显示所有本地和远程分支的列表。确保你要合并的分支名称包含在列表中。 3. 使用 `git log` 命令

    2024年02月04日
    浏览(37)
  • IntelliJ IDEA 上 使用git 合并其他分支,合并某一个提交

    IntelliJ IDEA 上 使用git 合并其他分支,合并某一个提交

    找到git——merge… 选择需要合并的分支,不能选和当前分支一样噢 合并,推送即可 点击左下角git——右键切换分支——选择需要合并的分支——选择需要合并的代码——ch 推送即可

    2024年02月04日
    浏览(99)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包