如何撤消git merge branch

时间:2013-09-10 13:15:56

标签: git

我在我的本地仓库中更改了两个文件,在一个新分支中(我称之为“new_branch”)。我已提交更改并推送到远程仓库。然后,我想将这些更改合并到master分支中。我已经完成了:

$ git checkout master
$ git merge new_branch

但是不仅将两个文件添加到master中,而且还添加了其他配置文件。我刚刚完成了:

$ git add file1
$ git add file2
$ git commit -m "changes file1 and file2"
$ git push -u origin --all

为什么还添加了其他文件?以及如何撤消此合并?

这是合并的输出:

Updating b57febc..5a967d5
Fast-forward
.gitignore                                       |    6 +-
app/config/parameters.yml                        |    2 +-
src/MSD/HomeBundle/Controller/HomeController.php |  421 +++++++++++-----------
src/MSD/HomeBundle/Entity/Imagen.php             |  298 +++++++++++++++
web/bundles/msdhome/js/acercade.js               |    2 +-
5 files changed, 506 insertions(+), 223 deletions(-)
create mode 100644 src/MSD/HomeBundle/Entity/Imagen.php

我只想改变:

src/MSD/HomeBundle/Controller/HomeController.php
src/MSD/HomeBundle/Entity/Imagen.php  

“git log --graph --decorate --pretty = oneline --abbrev-commit --all”输出:

* 5a967d5 (HEAD, origin/mejoras_contralador, mejoras_contralador, master) Controlador mo
* 081224a Cambios en controlador y clase Imagen
* a74e337 añadir directorio vendor a .gitignore
* 42d3217 Primer commit
* b57febc (origin/v1, origin/master, origin/HEAD) version 1 definitiva
* 1d1c5f7 solucionado error de js en botones social media
* 2f40866 primer commit

似乎也添加了.gitignore(但不是app / config / parameters.yml)

2 个答案:

答案 0 :(得分:0)

配置文件的更改最初是否已在new_branch中更改,但是在比上一次更早的提交中?因为合并应用了自分歧以来的每一个变化。

如果您只想应用1次提交的更改(例如最后一次提交),则需要

git cherry-pick new_branch

顺便说一句,出于这个原因,不鼓励版本控制配置文件。或者有一个版本化的版本,但也有一个本地的,无版本的版本,它将与代码中的版本化版本合并,这样你就可以拥有默认的配置值,并且能够使用本地的无版本配置覆盖它们。

答案 1 :(得分:0)

其他文件可能在之前的提交中添加了一个分支。

如果您没有推动主分支,您可以轻松地撤消与git reset --hard <sha of last commit on master>的合并。要查找该提交,如果您查看合并提交消息,您将看到:

合并:1234556 5423456

这显示了合并分支中的两个最新提交。一个来自master,另一个来自new_branch。将分支重置为master上的最后一次提交。

警告 这正在改变历史,只有在你没有推动你的分支时才应该这样做。

如果你已经推动了分支,那么你需要git revert HEAD~1 -m 1每个 http://gitready.com/intermediate/2009/03/16/rolling-back-changes-with-revert.html

如果你只想要来自new_branch的某些文件,你有几个选择:

1)您可以git cherry-pick提交。请记住,这将带来整个提交。因此,如果跨多个提交对文件进行了更改,则只会获得您正在挑选的提交中更改的内容。

2)您可以通过git checkout <branch-name> -- <files>签出来自其他分支的文件,然后在您的分支中提交它们。这基本上与cherry-pick正在做的事情相同,但是您可以只获取在提交中修改的一些文件,并且您对更改更有选择性。