Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git 如何将提交从一个分支复制到另一个分支?_Git_Branching And Merging - Fatal编程技术网

Git 如何将提交从一个分支复制到另一个分支?

Git 如何将提交从一个分支复制到另一个分支?,git,branching-and-merging,Git,Branching And Merging,我从我的主人那里得到了两个分支: v2.1:(第2版)我已经做了几个月了 wss:我昨天创建的,用于向我的主控设备添加一个特定功能(生产中) 有没有办法将昨天的提交从wss复制到v2.1?您可以从要复制的提交复制到目标分支。您应该有一个工作流,可以通过合并来完成这一切: - x - x - x (v2) - x - x - x (v2.1) \ x - x - x (wss) 因此,您所要做的就是git checkout v2.1和git me

我从我的主人那里得到了两个分支:

  • v2.1:(第2版)我已经做了几个月了
  • wss:我昨天创建的,用于向我的主控设备添加一个特定功能(生产中)

有没有办法将昨天的提交从wss复制到v2.1?

您可以从要复制的提交复制到目标分支。

您应该有一个工作流,可以通过合并来完成这一切:

- x - x - x (v2) - x - x - x (v2.1)
           \
            x - x - x (wss)
因此,您所要做的就是
git checkout v2.1
git merge wss
。如果由于某种原因,您确实无法执行此操作,并且无法使用将wss分支移动到正确的位置,那么从某个位置获取单个提交并将其应用到其他位置的命令是。只需签出要应用它的分支,然后运行
git cherry pick

重新设置基础可能会为您节省一些时间:

如果您的历史记录如下所示:

- x - x - x (v2) - x - x - x (v2.1)
           \
            x - x - x (v2-only) - x - x - x (wss)
您可以使用
git-rebase--on-v2-only wss
将wss直接移动到v2上:

- x - x - x (v2) - x - x - x (v2.1)
          |\
          |  x - x - x (v2-only)
           \
             x - x - x (wss)
然后你可以合并!如果您真的、真的、真的无法达到可以合并的程度,您仍然可以使用rebase一次有效地进行多个cherry Pick:

# wss-starting-point is the SHA1/branch immediately before the first commit to rebase
git branch wss-to-rebase wss
git rebase --onto v2.1 wss-starting-point wss-to-rebase
git checkout v2.1
git merge wss-to-rebase
注意:这样做需要额外工作的原因是它在存储库中创建了重复的提交。这并不是一件好事——简单的分支和合并的全部意义在于能够通过将提交放在一个地方并将它们合并到需要的任何地方来完成所有事情。重复提交意味着永远不会合并这两个分支(如果您决定以后再合并,则会出现冲突)。

使用

git cherry-pick <commit>
假设您使用
bash

for commit in $(git log --reverse --since=yesterday --pretty=%H);
do
    git cherry-pick $commit
done

如果这里出了什么问题(有很多潜在的问题),你就有麻烦了,因为这在现场结账时起作用,所以要么手工挑选樱桃,要么像Jefromi建议的那样使用rebase。

或者如果你不太支持福音传道者,你可以用我现在使用的一种丑陋的方式。在deploy_模板中,有一些提交我想作为分支deploy复制到我的主机上

git branch deploy deploy_template
git checkout deploy
git rebase master

这将在deploy_模板上创建新的分支deploy(我使用-f覆盖现有的deploy分支),然后将这个新分支重新设置到master上,使deploy_模板保持不变。

对于将分支wss的最后一次提交复制到v2.1的简单情况,您只需获取提交id(
git log--oneline | head-n1
)并且做:

git checkout v2.1
git合并

git cherry pick
:应用一些现有提交引入的更改

假设我们有分支A和(X,Y,Z)提交。我们需要将这些提交添加到分支B。我们将使用
cherry pick
操作

当我们使用
cherry pick
时,我们应该按照提交在分支A中出现的时间顺序在分支B上添加提交

cherry pick确实支持一系列提交,但如果在该范围内有合并提交,则会变得非常复杂

git checkout B
git cherry-pick SHA-COMMIT-X
git cherry-pick SHA-COMMIT-Y
git cherry-pick SHA-COMMIT-Z
工作流示例:

我们可以使用
cherry pick

-e或--edit:使用此选项,git cherry pick将允许您在提交之前编辑提交消息

-n或--no commit:通常该命令会自动创建一系列提交。此标志将必要的更改应用于工作树和索引的每个命名提交,而不进行任何提交。此外,使用此选项时,索引不必与头提交匹配。根据索引的开始状态进行樱桃选择


这里有一个有趣的关于cherry-pick的问题,cherry-pick命令可以从标准输入读取提交列表

以下命令选择由用户John编写的存在于“开发”分支中但不存在于“发布”分支中的提交,并按时间顺序执行

git log develop --not release --format=%H --reverse --author John | git cherry-pick --stdin

假设我已将更改提交到主分支。我将获得提交的提交id(xyz),现在我必须转到需要推动提交的分支

单提交id xyx

git checkout branch-name
git cherry-pick xyz
git push origin branch-name
多个提交id的xyz abc qwe

git checkout branch-name
git cherry-pick xyz abc qwe
git push origin branch-name

这是另一种方法

git checkout{SOURCE_BRANCH}#切换到SOURCE BRANCH。
git签出{COMMIT_HASH}返回到所需的提交。
git checkout-b{temp_branch}#从{COMMIT_HASH}快照创建一个新的临时分支。
git签出{TARGET_BRANCH}切换到目标分支。
git merge{temp_branch}将代码合并到目标分支。
git branch-d{temp_branch}#删除临时分支。

前面提到的答案涵盖了大部分内容,但似乎缺少的一点是
的无提交功能

假设您在功能分支上有多个提交,并且您希望将所有提交“合并”到一个提交中,并将它们放在主分支上。在这种情况下,您需要做的是:

git checkout <branch-on-which-to-add-features>
git cherry-pick --no-commit <commit-hash>
git cherry-pick --no-commit <commit-hash>
.
.
.

理想情况下,如前所述,您应该使用
merge
rebase
。但是如果您觉得没有其他选择,您可以使用
cherry pick
ing.

将提交从wss分支复制到v2.1分支

  • git checkout wss

  • git merge v2.1


  • 它对我很有用。

    即使出于某种原因,你真的想使用补丁而不是cherry pick(s)/rebase,最简单的方法是使用
    git-format-patch
    git-am*.patch
    。它需要
    签出到另一个分支。所有--pretty选项的占位符都在git-log手册页中。您可以获取所需的任何格式,这对于获取脚本中所需的字段尤其有用
    
    git checkout branch-name
    git cherry-pick xyz abc qwe
    git push origin branch-name
    
    git checkout <branch-on-which-to-add-features>
    git cherry-pick --no-commit <commit-hash>
    git cherry-pick --no-commit <commit-hash>
    .
    .
    .
    
    git commit -m "Some message for the merge commit"