我有两个分支,电子邮件和分期。分期是最新的一个,我不再需要旧的更改在电子邮件分支,但我不想删除他们。

我只想将所有staging的内容转储到电子邮件中,以便它们都指向同一个提交。这可能吗?


当前回答

其他答案似乎不完整。 我已经尝试了下面的全部,它工作得很好。

注意: 1. 为了安全起见,在尝试下面的操作之前,请先复制您的存储库。

细节: 1. 所有的开发都在开发分支中进行 2. Qa部门只是开发部门的翻版 3.有时,开发代码需要被移动/覆盖到qa部门

所以我们需要覆盖qa分支,从开发分支

第1部分: 使用以下命令,旧的qa已经更新到新的开发:

git checkout dev
git merge -s ours qa
git checkout qa
git merge dev
git push

最后一次推送的自动评论如下:

// Output:
//  *<MYNAME> Merge branch 'qa' into dev,*  

这个注释看起来是相反的,因为上面的序列看起来也是相反的

第2部分:

下面是意想不到的,新的本地提交在开发中,不必要的 所以,我们需要抛弃这些内容,保持开发者的原封不动。

git checkout dev

// Output:
//  Switched to branch 'dev'  
//  Your branch is ahead of 'origin/dev' by 15 commits.  
//  (use "git push" to publish your local commits)


git reset --hard origin/dev  

//  Now we threw away the unexpected commits

第3部分: 验证一切如预期:

git status  

// Output:
//  *On branch dev  
//  Your branch is up-to-date with 'origin/dev'.  
//  nothing to commit, working tree clean*  

这是所有。 1. 旧的qa现在被新的开发分支代码覆盖 2. 本地是干净的(远程源/dev是不受影响的)

其他回答

其他答案似乎不完整。 我已经尝试了下面的全部,它工作得很好。

注意: 1. 为了安全起见,在尝试下面的操作之前,请先复制您的存储库。

细节: 1. 所有的开发都在开发分支中进行 2. Qa部门只是开发部门的翻版 3.有时,开发代码需要被移动/覆盖到qa部门

所以我们需要覆盖qa分支,从开发分支

第1部分: 使用以下命令,旧的qa已经更新到新的开发:

git checkout dev
git merge -s ours qa
git checkout qa
git merge dev
git push

最后一次推送的自动评论如下:

// Output:
//  *<MYNAME> Merge branch 'qa' into dev,*  

这个注释看起来是相反的,因为上面的序列看起来也是相反的

第2部分:

下面是意想不到的,新的本地提交在开发中,不必要的 所以,我们需要抛弃这些内容,保持开发者的原封不动。

git checkout dev

// Output:
//  Switched to branch 'dev'  
//  Your branch is ahead of 'origin/dev' by 15 commits.  
//  (use "git push" to publish your local commits)


git reset --hard origin/dev  

//  Now we threw away the unexpected commits

第3部分: 验证一切如预期:

git status  

// Output:
//  *On branch dev  
//  Your branch is up-to-date with 'origin/dev'.  
//  nothing to commit, working tree clean*  

这是所有。 1. 旧的qa现在被新的开发分支代码覆盖 2. 本地是干净的(远程源/dev是不受影响的)

我已经看到了几个答案,这是唯一的程序,让我解决没有任何冲突。

如果你想要在branch_old中对branch_new的所有更改,那么:

git checkout branch_new
git merge -s ours branch_old
git checkout branch_old
git merge branch_new

一旦应用了这四个命令,您就可以毫无问题地推送branch_old了

这将合并新旧两个分支,并在每次合并冲突时选择新版本:

git checkout old
git merge new
git checkout --theirs .
git add .
git commit

你想要的是这个(实际上与目前接受的答案完全相反):

git checkout email
git merge --strategy-option=theirs staging  

它的作用是:

电子邮件分支文件现在将完全相同的分期分支 电子邮件分支的历史将被保留 分期分支的历史将被添加到电子邮件历史


作为附加价值,如果您不想要所有登台分支的历史记录,您可以使用squash将其总结为一条提交消息。

git checkout email
git merge --squash --strategy-option=theirs staging  
git commit -m "Single commit message for squash branch's history here'

总之,第二个版本所做的是:

电子邮件分支文件现在将完全相同的分期分支 电子邮件分支的历史将被保留 单个提交将被添加到电子邮件分支的历史记录之上。这个提交将表示在暂存分支中发生的所有更改

如何:

git branch -D email
git checkout staging
git checkout -b email
git push origin email --force-with-lease