[英]git: how to do a commit so that the current branch is the same as another branch?
假设我有两个分支A
和B
,它们都与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删除commit1
和commit2
,必须运行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上创建另一个分支,以便至少拥有一些具有该历史记录的东西。
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
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.