假设我有两个分支,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
怎么做?
答案 0 :(得分:1)
您可以cherry-pick分支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
答案 1 :(得分:0)
考虑是否将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
man git-read-tree的更多信息。
与往常一样,请务必在进入龙之前进行备份。
答案 2 :(得分:0)
如果您想要使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
答案 3 :(得分:0)
您可以使用以下命令来实现您的需求:
git checkout A
git checkout B -- .
git commit -m 'content same as branch B'