git 命令cherry-pick 完美实践

本文介绍如何使用git的cherry-pick命令来快速将已修复的Bug从一个分支移植到另一个分支,有效避免重复工作并提高开发效率。

1.git 命令cherry-pick 完美实践

2.应用背景:发版时有个release-5.5-tvsdk 分支,但是在封板测试的过程中,修复了一些主要Bug,这些Bug在以后版本分支develop上也同样需要,手工移植一遍,很是麻烦,

所以cherry-pick 闪亮出场了,完美解决问题

注意:当执行完 cherry-pick 以后,将会 生成一个新的提交;这个新的提交的哈希值和原来的不同,但标识名 一样;

3.log cat

krisZhangdeMacBook-Pro:SohuNews_android kriszhang$ gitcherry-pick 1acc73d37b95ee8f96c519b4128f9bc049661715

[develop b40dd6b] 临时提交

 Date: Wed Mar 23 20:33:55 2016 +0800

 7 files changed, 124 insertions(+), 12 deletions(-)

 create mode 100644 channel/aliyun/assets/channel.txt

 create mode 100644 channel/vivo/AndroidManifest.xml

 create mode 100644 src/com/sohu/newsclient/core/broadcast/ScreenSlideReceiver.java

krisZhangdeMacBook-Pro:SohuNews_android kriszhang$

4.哈哈好使,git无敌

risZhangdeMacBook-Pro:~ kriszhang$ cd /Users/kriszhang/Documents/workspace/codespace/maincode/SohuNews\_android

krisZhangdeMacBook-Pro:SohuNews_android kriszhang$ git cherry-pick 1fcef6014270df98f322fae60b216c41a94200b0

[develop 74318bf] 解决老板的Bug:杀死进程后分享到搜狐我的,无法打开落地页的问题

 Date: Wed Apr 6 15:23:00 2016 +0800

 1 file changed, 4 insertions(+), 4 deletions(-)

krisZhangdeMacBook-Pro:SohuNews_android kriszhang$ 


<think>我们被要求回答关于gitcherry-pick操作多个提交的问题。根据提供的引用,我们可以总结如下:引用[3]中提到:gitcherry-pick多个commit,并给出了语法:gitcherry-pick[选项]<commit>…​引用[4]中也有类似的语法描述:gitcherry-pick[--edit][-n][-m<parent-number>][-s][-x][--ff][-S[<keyid>]]<commit>…​因此,要一次性挑选多个提交,可以在命令后面列出多个提交的哈希值,用空格分隔。步骤:1.首先,确定要挑选的提交的哈希值。可以使用`gitlog`查看提交历史。2.然后,切换到目标分支:`gitcheckouttarget-branch`3.执行cherry-pick命令,同时指定多个提交哈希:`gitcherry-pick<commit1><commit2><commit3>`4.如果遇到冲突,解决冲突后使用`gitcherry-pick--continue`继续,或者使用`gitcherry-pick--abort`放弃整个操作。注意:多个提交的cherry-pick会按照提交的顺序依次应用。如果提交之间有依赖关系,必须按照正确的顺序挑选。示例教程:假设我们有两个提交:a498a7a和1b2c3d4,我们想将它们挑选到当前分支。1.查看提交历史,获取提交哈希:```gitlog--oneline```2.切换到目标分支(如果当前不在目标分支):```gitcheckoutmain```3.执行cherry-pick命令:```gitcherry-picka498a7a1b2c3d4```4.如果过程中没有冲突,则两个提交的更改会依次应用到当前分支,并生成两个新的提交。5.如果有冲突,解决冲突后,使用`gitadd`将文件标记为已解决,然后使用`gitcherry-pick--continue`继续。如果中途想跳过当前提交,可以使用`gitcherry-pick--skip`,或者放弃整个操作使用`gitcherry-pick--abort`。另外,还可以使用提交范围,但是cherry-pick命令本身不支持直接指定范围(如commitA..commitB),但我们可以通过其他方式实现,比如使用`gitrev-list`生成提交列表,然后传递给cherry-pick。例如:```gitcherry-pick$(gitrev-list--reversecommitA..commitB)```注意:使用`--reverse`是为了将提交列表反转,因为`gitrev-list`默认是时间倒序(最新提交在前),而cherry-pick需要从旧到新应用提交,否则可能导致冲突。或者,也可以使用分支名来挑选从某个分支分叉点到最新提交的所有提交(不包括分叉点本身):```gitcherry-pickcommitA^..commitB```这里`commitA^..commitB`表示从commitA的父提交(即分叉点)之后到commitB的所有提交。但是,请注意,挑选多个提交可能会增加冲突的可能性,需要仔细处理。相关问题:根据用户的问题,我们还可以生成相关问题:1.如何解决gitcherry-pick过程中的冲突?2.如何撤销一个cherry-pick操作?3.使用gitcherry-pick时如何避免生成新的提交记录?4.如何挑选一个分支上的所有提交到另一个分支?现在,我们按照要求编写回答。</think>### 如何使用 `git cherry-pick` 操作多个提交 `git cherry-pick` 支持一次性挑选多个提交到当前分支,具体方法如下: #### 方法 1:直接指定多个提交哈希 ```bash git checkout target-branch # 切换到目标分支 git cherry-pick commit1 commit2 # 挑选多个提交(空格分隔) ``` - **执行顺序**:提交按从左到右顺序依次应用(`commit1` → `commit2`) - **冲突处理**: - 若中途出现冲突,解决后执行: ```bash git add . # 标记冲突已解决 git cherry-pick --continue # 继续后续提交 ``` - 放弃整个操作:`git cherry-pick --abort` [^2] #### 方法 2:使用提交范围(需注意顺序) ```bash git cherry-pick oldest-commit^..newest-commit ``` - **关键符号**:`^` 表示包含起始提交的父提交(避免遗漏) - **顺序要求**:范围必须按时间顺序(旧→新),否则易冲突 - **示例**:将 `a498a7a` 到 `1b2c3d4` 的提交(含两端)挑选到当前分支: ```bash git cherry-pick a498a7a^..1b2c3d4 ``` #### 方法 3:通过分支对比挑选 ```bash git cherry-pick $(git merge-base branch-A main)..branch-A ``` - **作用**:挑选 `branch-A` 分支上独有(未合并到 `main`)的所有提交 - **注意**:需先切换到目标分支再执行 #### 最佳实践 1. **提前检查提交依赖**: ```bash git log --graph --oneline branch-A # 可视化提交历史 ``` 2. **使用 `-n` 参数预演**(不自动提交): ```bash git cherry-pick -n commit1 commit2 # 更改应用到工作区但未提交 git diff # 人工确认无误后再手动提交 ``` 3. **跨仓库操作**:添加远程仓库后指定完整引用: ```bash git remote add repo2 https://url git fetch repo2 git cherry-pick repo2/commit-id # [^3] ``` > **注意事项**: > - 合并提交(Merge commit)需用 `-m` 指定主分支(如 `-m1`)[^1] > - 若提交间有依赖关系,必须按时间顺序操作 > - 冲突概率随提交数量增加,建议分批操作 #### 操作流程示例 ```bash # 步骤1:切换到目标分支 git checkout main # 步骤2:挑选两个特定提交 git cherry-pick a498a7a 1b2c3d4 # 步骤3(若冲突): # 手动编辑冲突文件 → 标记已解决 → 继续操作 git add resolved-file.txt git cherry-pick --continue # 步骤4(成功):生成两个新提交 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值