关于gitlab代码回退
场景:当
branch_a
已经合并到master
需要回退使用写的有点乱,主要是为了理解 cherry pick 和 recert commit 2种方式的区别
一、关于回退
回退简单,直接看别人的操作,传送门
二、关于回退后
如果branch_a内容需要后期合并master,那么还需要干接下来的事
大前提,已经完成了“一”中的回退操作
1. 创建新分支 b_c
2. b_c内容填充
两种填充方式 git cherry pick 和 git revert commit (具体命令自行百度下)
三、2种填充方式相关知识
1. cherry pick效果
git cherry pick
操作(这里只恢复 b_a分支内容,左上角的当前分支为新建的 b_c
)
假设初始代码量为0,从下往上看,+1+1-1-1+1=1
,总结 0+1=1
,撤回到最原始再添加内容
新分支 b_c
就包含了b_a
在合入 master
前所有的代码
2. rever commit 效果
git revert commit
操作
假设初始代码量为0,从下往上看+1-1-(-1)=1
,总结1-1+1=1
,移除所有的撤回操作
2. 以下为gpt回答
问:git cherry-pick 和 git revert commit 用于代码回退备份
答:
在 Git 中,git cherry-pick
和 git revert
都是用于管理代码变更的工具,但它们的使用场景和工作方式有所不同。你提到的是 “用于代码回退备份”,在这方面这两个命令的作用也有一些区别。下面我将详细说明它们的区别以及适用于哪些情况。
1. git cherry-pick
git cherry-pick
是用来将特定的提交从一个分支“挑选”出来,并应用到当前分支的一个命令。它并不会撤销某个提交,而是将某个特定提交的修改复制到当前分支。
用法:
git cherry-pick <commit-hash>
将commit-hash
提交的更改复制到当前分支。- 适用于从其他分支或历史中挑选并应用某些特定的更改,而不需要合并整个分支。
适用场景:
- 不合并整个分支: 如果你在一个分支上有一部分修改很有用,但你不想合并整个分支的所有内容,可以用
cherry-pick
来选择性地将某个提交的修改应用到当前分支。 - 跨分支应用修复: 如果你在
feature-branch
上修复了一个 bug,想把这个修复应用到master
分支上,而不想合并feature-branch
的其它变更,git cherry-pick
可以做到这一点。
举例:
假设你有一个 feature-branch
,并且它包含多个提交,你只想将其中一个特定提交 abc123
应用到 master
分支上:
# 切换到 master 分支
git checkout master
# 从 feature-branch 中 cherry-pick 提交
git cherry-pick abc123
这个命令会将提交 abc123
中的更改应用到当前的 master
分支,生成一个新的提交。
2. git revert
git revert
是用来撤销(回退)某个 特定提交 的更改,并生成一个新的提交。它不会删除历史记录,而是通过创建一个新的“反向”提交来撤销先前的更改。
用法:
git revert <commit-hash>
创建一个新的提交,用于撤销<commit-hash>
提交中的所有更改。
适用场景:
- 撤销某个提交的影响: 如果某个提交带来了错误或不希望的更改,可以使用
git revert
来撤销这个提交的更改。 - 保留历史记录:
git revert
不会改变历史,而是通过新提交的方式回退某个更改,适用于公共分支上的撤销操作(特别是在多人协作的项目中)。 - 回退一个提交而不丢失其它提交: 它不会删除提交,只是生成一个新的提交来反转某个提交的效果。
举例:
假设你在 master
分支上做了一些提交,提交 abc123
引入了一个问题,你可以通过 git revert
来回退它:
# 在 master 分支上回退提交 abc123
git revert abc123
这个命令会生成一个新的提交,内容是撤销 abc123
提交中的所有更改。如果提交 abc123
修改了文件内容,git revert
会将这些修改反过来。
git cherry-pick
和 git revert
的比较:
命令 | 功能 | 适用场景 | 历史记录 |
---|---|---|---|
git cherry-pick | 将指定的提交(或者多个提交)从一个分支复制到当前分支。 | 用于挑选某个提交的更改,应用到当前分支,常用于选择性合并。 | 历史记录不会改变,原提交保留在原分支,复制的提交在目标分支上。 |
git revert | 撤销某个指定的提交的更改,并通过生成一个新的提交来反转它。 | 用于撤销某个错误提交,但保留历史记录,适合回滚公共分支的提交。 | 会保留历史记录,撤销操作会产生新的提交,原提交依然存在。 |
如何使用 git revert
和 git cherry-pick
来进行代码回退或备份:
-
回退(撤销某个提交): 如果你需要撤销某个提交的影响,而不改变历史记录,可以使用
git revert
。它会生成一个新的提交,用来撤销你指定的提交的更改。例如,如果提交
abc123
引入了问题,想要撤销它的更改,你可以执行:git revert abc123
这会创建一个新的提交,内容是反向修改(撤销)
abc123
提交的所有更改。它不会修改abc123
的历史记录,只是通过一个新提交来实现回退。 -
备份: 如果你想将某个提交的更改“备份”到另一个分支或当前分支,可以使用
git cherry-pick
。假设某个提交非常重要,你可以将它移植到其他地方,而不需要合并整个分支。例如,假设你在
feature-branch
上有一个非常重要的提交abc123
,你想将它应用到master
分支上,你可以执行:git checkout master git cherry-pick abc123
这会将
abc123
提交的更改复制到master
分支上,生成一个新的提交。
总结:
git cherry-pick
用于将一个特定的提交从一个分支复制到当前分支,适合用来“备份”或挑选重要的提交。git revert
用于撤销某个提交的修改并生成一个新的提交,适合回退错误的提交,且不会改变历史记录。
根据你的需求,如果你是需要回退某个错误的提交,使用 git revert
更为合适。如果你是想挑选并应用某个特定的提交,使用 git cherry-pick
。