首页 > 其他分享 >Git整理 git cherry-pick的使用

Git整理 git cherry-pick的使用

时间:2023-06-01 15:33:08浏览次数:32  
标签:git branch2 -- cherry pick commit

git cherry-pick可以理解为”挑拣”提交,它会获取某一个分支的单笔提交,并作为一个新的提交引入到你当前分支上。 当我们需要在本地合入其他分支的提交时,如果我们不想对整个分支进行合并,而是只想将某一次提交合入到本地当前分支上,那么就要使用git cherry-pick了。

用法
git cherry-pick [<options>] <commit-ish>...

常用options:
--quit 退出当前的chery-pick序列
--continue 继续当前的chery-pick序列
--abort 取消当前的chery-pick序列,恢复当前分支
-n, --no-commit 不自动提交
-e, --edit 编辑提交信息

git cherry-pick commitid
在本地仓库中,有两个分支:branch1和branch2,我们先来查看各个分支的提交:

# 切换到branch2分支
$ git checkout branch2
Switched to branch 'branch2'

# 查看最近三次提交
$ git log --oneline -3
23d9422 [Description]:branch2 commit 3
2555c6e [Description]:branch2 commit 2
b82ba0f [Description]:branch2 commit 1
# 切换到branch1分支
$ git checkout branch1
Switched to branch 'branch1'
# 查看最近三次提交
$ git log --oneline -3
20fe2f9 commit second
c51adbe commit first
ae2bd14 commit 3th

现在,我想要将branch2分支上的第一次提交内容合入到branch1分支上,则可以使用git cherry-pick命令:

$ git cherry-pick 2555c6e
error: could not apply 2555c6e... [Description]:branch2 commit 2
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'

当cherry-pick时,没有成功自动提交,这说明存在冲突,因此首先需要解决冲突,解决冲突后需要git commit手动进行提交:

$ git commit
[branch1 790f431] [Description]:branch2 commit 2
Date: Fri Jul 13 18:36:44 2018 +0800
1 file changed, 1 insertion(+)
create mode 100644 only-for-branch2.txt

或者git add .后直接使用git cherry-pick --continue继续。
现在查看提交信息:

$ git log --oneline -3
790f431 [Description]:branch2 commit 2
20fe2f9 commit second
c51adbe commit first

branch2分支上的第二次提交成功合入到了branch1分支上。

以上就是git cherry-pick的基本用法,如果没有出现冲突,该命令将自动提交。

git cherry-pick -n
如果不想git cherry-pick自动进行提交,则加参数-n即可。比如将branch2分支上的第三次提交内容合入到branch1分支上:

$ git cherry-pick 23d9422
[branch1 2c67715] [Description]:branch2 commit 3
Date: Fri Jul 13 18:37:05 2018 +0800
1 file changed, 1 insertion(+)
$

查看提交log,它自动合入了branch1分支:

$ git log --oneline -3
2c67715 [Description]:branch2 commit 3
f8bc5db [Description]:branch2 commit 2
20fe2f9 commit second

如果不想进行自动合入,则使用git cherry-pick -n:

# 回退上次提交,再此进行cherry-pick
$ git reset --hard HEAD~
HEAD is now at f8bc5db [Description]:branch2 commit 2
$ git cherry-pick -n 23d9422
$ git status
On branch branch1
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)

modified: only-for-branch2.txt

这时通过git status查看,发现已将branch2的提交获取但是没有合入。

git cherry-pick -e
如果想要在cherr-pick后重新编辑提交信息,则使用git cherry-pick -e命令,比如我们还是要将branch2分支上的第三次提交内容合入到branch1分支上,但是需要修改提交信息:

$ git cherry-pick -e 23d9422

1 [Description]:branch2 commit 3
2 #
3 # It looks like you may be committing a cherry-pick.
4 # If this is not correct, please remove the file
5 # .git/CHERRY_PICK_HEAD
6 # and try again.

git cherry-pick –continue, –abort,–quit
当使用git cherry-pick发生冲突后,将会出现如下信息:

$ git cherry-pick 23d9422
error: could not apply 23d9422... [Description]:branch2 commit 3

这时如果要继续cherry-pick,则首先需要解决冲突,通过git add .将文件标记为已解决,然后可以使用git cherry-pick --continue命令,继续进行cherry-pick操作。

如果要中断这次cherry-pick,则使用git cherry-pick --quit,这种情况下当前分支中未冲突的内容状态将为modified,

如果要取消这次cherry-pick,则使用git cherry-pick --abort,这种情况下当前分支恢复到cherry-pick前的状态,没有改变。

git cherry-pick < branchname >
如果在git cherry-pick后加一个分支名,则表示将该分支顶端提交进cherry-pick,如:

$ git cherry-pick master
1
git cherry-pick ..< branchname >
git cherry-pick ^HEAD < branchname >
以上两个命令作用相同,表示应用所有提交引入的更改,这些提交是branchname的祖先但不是HEAD的祖先,比如,现在我的仓库中有三个分支,其提交历史如下图:

C<---D<---E branch2
/
master A<---B
\
F<---G<---H branch3
|
HEAD

如果我使用git cherry-pick ..branch2或者git cherry-pick ^HEAD branch2,那么会将属于branch2的祖先但不属于branch3的祖先的所有提交引入到当前分支branch3上,并生成新的提交,执行命令如下:

$ git cherry-pick ..branch2
[branch3 c95d8b0] [Description]:branch2 add only-for-branch2
Date: Fri Jul 13 20:34:40 2018 +0800
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 only-for-branch2
[branch3 7199a67] [Description]:branch2 modify for only-for-branch2--1
Date: Fri Jul 13 20:38:35 2018 +0800
1 file changed, 1 insertion(+)
[branch3 eb8ab62] [Description]:branch2 modify for only-for-branch2--2
Date: Fri Jul 13 20:39:09 2018 +0800
1 file changed, 1 insertion(+)

执行后的提交历史如下:


C<---D<---E branch2
/
master A<---B
\
F<---G<---H<---C'<---D'<---E' branch3
|
HEAD

常见问题
1.The previous cherry-pick is now empty, possibly due to conflict resolution.
原因:
在cherry-pick时出现冲突,解决冲突后本地分支中内容和cherry-pick之前相比没有改变,因此当在以后的步骤中继续git cherry-pick或执行其他命令时,由于此时还处于上次cherry-pick,都会提示该信息,表示可能是由于解决冲突造成上一次cherry-pick内容是空的。

解决方案:
1.执行git cherry-pick --abort取消上次操作。

2.执行git commit --allow-empty,表示允许空提交。

2.fatal: You are in the middle of a cherry-pick – cannot amend.
原因:
在cherry-pick时出现冲突,没有解决冲突就执行git commit --amend命令,从而会提示该信息。

解决方案:
首先在git commit --amend之前解决冲突,并完成这次cherry-pick:

$ git add .
$ git cherry-pick --continue

1.在 release/prod 分支 更新到最新的代码!!! 切记
2. 从release/prod切出自己的分支 lvhy.
3. git cherry-pick 27de33f9a3fa656eb8e0961e5264f61af0c372e7
(从最早的开始 cherry-pick)

 

4. 完毕之后, git rebase release/prod
5. git push origin lvhy(自己分支)
别忘了在git上合并分支,再次检查最终的代码,是否有遗漏

 

冲突1:
6. 若中间出现冲突: 搜 <<< 删掉不要的代码


7. 再 git add .
8.git cherry-pick --continue
切记: 是 --continue

9.接下来 继续执行执行 第4步 第5步 结束
——————————————————————————————————————————————

冲突2:
10. 若忘记cherry-pick第一次的代码,然后无论怎么解决冲突都不可以。那么 删掉git远程分支。从头开始合并即可。

标签:git,branch2,--,cherry,pick,commit
From: https://www.cnblogs.com/kn-zheng/p/17449178.html

相关文章

  • digital envelope routines::unsupported
    解决nodejs报digitalenveloperoutines::unsupported错误的方法INFOStartingdevelopmentserver...10%building2/3modules1active...\@vue\cli-plugin-eslint\node_modules\eslint-loader\index.js??ref--13-0!D:\2023project\traffic-ui\src\main.js Error:er......
  • 基于GIT的管理
    gitinit:初始化仓库gitadd文件名:把文件添加到暂存区gitcommit-m"操作记录":提交到仓库,设置相关操作的记录gitstatus:查看git状态,用于查看做了哪些的操作gitdiff文件名:在提交之前查看文件到底修改了什么,方便我们确认修改内容是否使我们想要的gitlog:查看历......
  • Git分支教程:详解分支创建、合并、删除等操作
    Git是一种强大的分布式版本控制系统,它的分支功能使得团队协作和代码管理变得更加灵活和高效。分支可以让开发人员在不影响主线开发的情况下进行并行开发和实验性工作。本篇博客将详解Git分支的创建、合并、删除等操作,帮助你更好地理解和使用Git的分支功能。分支的基本概念在开......
  • 解决fatal: unable to access ‘https://github.com……‘: Failed to connect to
    问题:gitclone时会报如下错误 解决办法:1.在cmd下执行 ipconfig/flushdns,清理DNS缓存 2.重新执行gitclonehttps://github.com/.../.git即可成功......
  • Git 之常用的六个命令
    一、基本命令1、第一次初始化gitinit gitadd.  添加当前目录到缓存区gitcommit-m‘注释’  提交到本地仓库  [email protected]:帐号名/仓库名.gitgitpulloriginmaster(分支名称)gitpushoriginmaster#-f强推gitclonegit@github......
  • git 信息配置
    修改环境变量,定制git的环境linux用户的概念linux,多用户,多任务gitconfig控制git的行为,来定义环境变量它提供三个环境参数当使用如下命令,配置git的环境变量时,不同的参数,会写入信息到不同的文件中gitconfig--globalxxxx.xxx--system针对任意登录该linux系统的用户都生效,gi......
  • git安装
    win安装git去git官网,找到下载选项,点击你自己对应的系统版本,64位,32位,的下载后,点点点安装即可mac上安装gitbrew工具,类似于linux的yum工具brewinstallgitlinux上安装git#centos/redhat yuminstallgit #ubuntuapt-getinstallgit......
  • 图灵丛书——GitHub入门
    这是一篇关于我个人学习GitHub的笔记,主要是记录一些我认为比较重要的知识点,以及一些我认为比较好的学习资料。学习书籍:GitHub入门与实践(图灵程序设计丛书)这本书的目录是这样的第1章到第3章的内容主要提了Github和git、git的配置、创建仓库等等。因为我本人平时有用......
  • git命令与常见错误解析
    最好在根目录下一级一级的探索添加尽量避免gitadd. gitrm-r--cache.等全部上传和移除操作git命令创建本地代码库(只执行一次)若有多个.git则会出现ERROR:500gitinit查看工作区状态gitstatus (分支:开发版、测试版、发布版)添加文件到缓存区gitadd<修改的文件> ......
  • git 使用ssh连接Github:017
    1.首先打开GitBash终端,生成私钥和公钥:ssh-kengen第一步提示:生成的密钥你要放在哪里?这里有给出默认地址,当然你也可以自己设置一个地址,如果不设置,直接回车就行 第二步提示:你要不要给你当前的密钥去设置一个密码?其实这一步没必要去设置,回车就行 第三步提示:提示你输入确认......