【问题标题】:Git revert merge plus one commit on top to re-merge againGit revert merge 加上一个提交以再次重新合并
【发布时间】:2015-11-21 13:33:59
【问题描述】:

我从 ide (intellij idea) 进行了巨大的合并,所以当所有的冲突都解决了,som 代码被修改了,我确实提交了(合并的),然后注意到有两个文件正在重新提交。所以我再次承诺。

有两个问题:

  1. 为什么我有第二次提交。那是因为 IDE 不知何故错过了 added 提交合并(IDE 不够聪明,无法在一次合并的上下文中看到所有这些更改?)。如果我忘记将add 文件写入index 会发生什么情况,如果我在合并后使用命令行(?)

  2. 如何还原这两个提交,以便进行一次纯合并?

喜欢图片:

[commit1]

我尝试了git rebase -i rebase HEAD~2(只是合并两个提交的第一个想法),但这显示了所有这 121 个 commists - 一个 commit1 和 120 来自 merge-commit。

基本上我想将我的 'lost'/'detached' [commit1] 添加到 [merge-commit] 并进行一次合并。

更新: 我没有可以尝试的代码,但这有意义吗?

 // revert two commits to have one
 1. git reset --soft HEAD~ 
 2. git revert -m 1 merge-commit
 3. git commit

我希望再次看到更改,所有那些 1 + 120 提交。但是那我将如何合并

 // move my merged stuff into new branch 
 4. git push origin -u new_branch

 // move back on history in master branch
 5. git reset --hard before-commit
 6. git merge new_branch
 7. git push -f origin master 

然后这个 git merge new_branch 将没有任何冲突,因为它已经被合并了..所以这可能不会显示它是从哪里合并的真实(hi)故事..但至少最终结果应该是相同的。理论上。

?

【问题讨论】:

  • 还有这个孩子,这就是为什么使用 IDE 的 Git 集成始终需要您自担风险,以及为什么几乎总是首选使用 CLI。您可能能够通过交互式 rebase 将提交压缩在一起(如果您还没有推送您的提交)。但是,请确保它适用于合并提交,因为我不确定。
  • IDE 与合并配合得很好,所以我看到了很好的图片,更改了什么以及如何更改。
  • 我对任何 Git GUI 都遵循“看,不要碰”的规则。

标签: git intellij-idea merge git-revert


【解决方案1】:

您在一篇文章中有很多问题。

为什么你最终得到了第二次提交?很可能是因为 IntelliJ 的 git 插件的怪癖。暂存区和工作区之间没有很好的区别,如果您在解决后编辑合并文件,可能会导致像您这样的情况。那里没有什么危险,只是在将您的更改推送到上游之前要格外小心。解决与 IDE 的冲突仍然要方便得多,除非它们非常琐碎。

至于修复,您第一次尝试进行交互式 rebase 的方向是正确的。我不确定您在示例中所指的第二个 rebase 是什么,但 git rebase -i HEAD~2 应该向您显示最后两个提交,您可以将最后一个提交压缩到第一个。

另一个选项可能是git reset HEAD^ && git commit --amend,这基本上是相同的。

【讨论】:

  • 听起来不错,我只记得使用 git rebase -i HEAD~2 向我展示了来自该合并提交的许多提交。我会在实际项目中尝试一下。
【解决方案2】:

我检查了简单的演示。

所以是的,确实是 IDE/IntelliJ Idea 的工作方式 - 它确实合并,但是一旦您在该合并工具中完成编辑,然后在主代码编辑器中(尚未提交任何内容)继续更改代码,然后从 UI 提交/change-list - 它将进行第一次提交(合并本身),但一些文件将留在更改列表中。因此,您可以将它们作为单独的提交提交。 (我就是这么做的……)

所以从命令行解决问题。

可能有点笨拙

git reset --soft HEAD~1   // revert left-over commit 
git stash                 // safe left-over commit to stas
git reset --soft HEAD~1   (get back merged content from merge-commit)

 git stash pop           // get stased


then during conflct accept all from stashed (since we know that those changes were made on top. so noew we have comined content from merge commit and that extra commit)

git commt -m "merged stuff'   // left over of first commit

然后有一个提交.. 我可以将它合并到我想要的任何内容。

如果我做对了,我可以进行我应该拥有的“合并”:

git checkout newone -b master 
git reset --hard HEAD~1

git checkout master 
git reset --hard HEAD~1

git merge newone // accepting all changes

【讨论】:

    猜你喜欢
    • 2011-07-21
    • 2015-01-05
    • 2018-08-29
    • 2017-08-30
    • 1970-01-01
    • 2011-06-03
    • 2016-01-08
    • 2016-12-30
    • 1970-01-01
    相关资源
    最近更新 更多