繁体   English   中英

git:如何进行提交,以使当前分支与另一个分支相同?

[英]git: how to do a commit so that the current branch is the same as another branch?

假设我有两个分支AB ,它们都与master分支不同

master --> commit1 --> commit2 --> A
   |
   |-----> commit3 --> commit4 --> B

现在我想执行提交( commit5上下图中) A ,使得在码A相同的一个B

master --> commit1 --> commit2 --> A --> commit5 --> A`(same as B)
   |
   |-----> commit3 --> commit4 --> B

怎么做?

您可以在分支A 选择提交:

$ git checkout A
$ git cherry-pick commit3Id
$ git cherry-pick commit4Id

要从分支A删除commit1commit2 ,必须运行git-revert命令,如下所示:

$ git checkout A
$ git revert commit1Id
$ git revert commit2Id

考虑是否需要将B合并为A 默认情况下,合并将合并更改,而不是使A的树匹配B

git checkout A
git merge B

很难说这是一个XY问题,您在哪里询问您认为是所需的中间步骤,还是实际上是您需要的。 如果您要使一个分支与另一个分支保持最新,则合并或重新设置(如果可以更改历史记录)可能是解决此问题的明智方法。


如果您确实希望这样做而不创建合并提交且无需重新定级,则有多种解决方法。

要记录分支A上的提交,该提交将添加必要的更改,使其类似于分支B的项目状态,而没有B的提交历史,这是一种方法:

git checkout A
git read-tree B
git commit -m 'Reflect the state of B'

请注意,此后工作目录仍将具有旧状态。 您可以使用git reset --hard然后手动删除所有未跟踪的文件。 git clean是删除未跟踪文件的另一种选择。

有关git read-tree更多信息,请git read-tree man git-read-tree

和往常一样,在进入龙之地之前一定要有一个备份

如果要使A与B完全相同(摆脱对A的提交并添加对B的提交),有两种选择。 两者都是破坏性的,因为无论您如何操作,都必须摆脱这两个提交。 我建议在A上创建另一个分支,以便至少拥有一些具有该历史记录的东西。

选项A:重置提交

git checkout A          # in case you aren't on A already
git reset --hard master # delete all commits and changes on A
git rebase -i B         # rebase on B, inheriting its two commits

选项B:删除分支

git checkout B     # Move to branch B so you can inherit B's commits
git branch -D A    # Delete branch A
git checkout -b A  # Create branch A while on B's commits

您可以使用以下命令来实现所需的功能:

git checkout A
git checkout B -- .
git commit -m 'content same as branch B'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM