如何用另一个分支的提交覆盖旧的提交?

时间:2019-05-05 08:41:34

标签: git

我在master branch上有3次提交:

master- 3st commit

master- 2st commit

master- 1st commit

现在我需要对master- 2st commit进行一些更改。因此,我从dev中签出了一个名为master- 2st commit的新分支。

在分支dev上进行了一些更改之后,我进行了dev- 1st commit的提交。

我想用master- 2st commit覆盖dev- 1st commit。 有什么建议吗?谢谢前进

3 个答案:

答案 0 :(得分:0)

如果您不想向a添加新的提交,则需要重写mastermaster- 2nd commit

master-3rd commit

历史记录如下:

git checkout master

# rewrite <master- 2nd commit>
git reset <dev- 1st commit> --hard
git reset <master- 2nd commit> --soft
git commit --amend

# rewrite <master- 3rd commit>
git cherry-pick <master- 3rd commit>

答案 1 :(得分:0)

警告:只要未创建git push,就可以重写git历史记录。之后,您仍然可以做任何您想做的事情,但这需要您避免使用力推。

最好的方法是在以下过程中使用cherry-pick

git checkout master~2
git cherry-pick master~1
[make your edits]
git add --all
git commit --amend
git cherry-pick master
git checkout master
git reset --hard HEAD@{1}

说明:

  1. HEAD放置在master之前2次提交的提交上。
  2. master之前的1次提交中复制一份提交副本,并将其追加到HEAD之后。
  3. 您将从“第二次提交”的角度进行编辑。
  4. 添加要提交的修改。
  5. 提交它们,但是您无需编辑新的提交,而是编辑上一个。
  6. master位置之后复制HEAD提交。
  7. 检出到旧的master位置。
  8. 将分支的位置更改为HEAD的先前位置(即,上次结帐之前的位置:新的“第三次提交”提交)。

Interactive demo (不知道git reset --hard HEAD@{1},因此它使用临时分支)。

答案 2 :(得分:0)

Git是一个工具箱,其中有多个工具可以完成相同的工作。我将以这种方式解决这个问题-

在主服务器上的master- 3rd commit的帮助下,注意提交git log -1 --oneline的提交ID。

步骤:

git Checkout master
git reset --hard HEAD~2
git cherry-pick <dev- 1st commit>
git cherry-pick <master- 3rd commit>

说明:

假设master上有3个提交,git reset --hard HEAD~2将从第1个提交中分离出前两个提交[3rd和2nd],分支master现在指向第1个提交。

git cherry-pick <dev- 1st commit>将向dev添加与dev-1st提交相同的新提交,分支master现在指向新的dev提交。

git cherry-pick <master- 3rd commit>将再次在dev commit的基础上添加一个新的commit,现在,历史记录类似于-

master- new 3rd commit
dev - new 1st commit
master- old 1st commit