Git:将自动合并的文件变成冲突的文件

时间:2019-07-19 15:43:50

标签: java git github

我有一个包含一些代码的github存储库。另一个人分叉了该存储库并将其克隆。他们更改了一些代码。我想用他们的代码替换我的所有代码(接受他们的所有更改)。我跑了

git pull -X theirs https://github.com/epicmanmoo/JavaStudyBuddies.git master

对于冲突的文件效果很好,它删除了我的代码,保留了它们的代码。 问题是,只有包含===== >>>>> <<<<的文件(冲突文件)才如此。

问题是像Column.java这样的文件没有被标记为冲突。

Column.java

package javastudybuddies.discordbots.entities;

public enum Column {
    NAME("name", "name", "projects"),
    DESCRIPTION("description", "description",  "projects"),
    STATUS("status", "status", "projects"),
    COMPLETED("completed", "completed", "projects"),
    DIFFICULTY("difficulty", "difficulty", "projects"),
    TYPE("type", "type", "projects"),

    USERNAME("username", "username", "users"), LEVEL("level", "level", "users"),
    COUNTRY("country", "country", "users"), TIMEZONE("timezone", "timezone", "users"),
    AGE("age", "age", "users"), IDSTRING("id_string", "id", "users"), TAGSTRING("tag_string", "tag", "users"),
    GOAL("goal", "goal", "users"), TECH("tech", "tech", "users");

    public final String databaseLabel;
    public final String userLabel;
    public final String table;
...

然后 https://github.com/epicmanmoo/JavaStudyBuddies/blob/master/src/main/java/javastudybuddies/discordbots/entities/Column.java

public enum Column {
    NAME("name", "name", "projects"),
    DESCRIPTION("description", "description",  "projects"),
    STATUS("status", "status", "projects"),
    TYPE("type", "type", "projects"),
    COMPLETED("completed", "completed", "projects"),
    DIFFICULTY("difficulty", "difficulty", "projects"),

    USERNAME("username", "username", "users"), LEVEL("level", "level", "users"),
    COUNTRY("country", "country", "users"), TIMEZONE("timezone", "timezone", "users"),
    AGE("age", "age", "users"), IDSTRING("id_string", "id", "users"), TAGSTRING("tag_string", "tag", "users"),
    GOAL("goal", "goal", "users"), TECH("tech", "tech", "users");

    public final String databaseLabel;
    public final String userLabel;
    public final String table;
    ...

看到区别了吗?在我的版本中,TYPE是最后一个版本,在他的版本中,TYPE是中间版本,因此甚至不会注册为合并冲突。

为进行调试,我运行了常规版本的git pull(无-X theirs):

git pull https://github.com/epicmanmoo/JavaStudyBuddies.git master

该版本也这样做:

public enum Column {
    NAME("name", "name", "projects"),
    DESCRIPTION("description", "description",  "projects"),
    STATUS("status", "status", "projects"),
    TYPE("type", "type", "projects"),
    COMPLETED("completed", "completed", "projects"),
    DIFFICULTY("difficulty", "difficulty", "projects"),
    TYPE("type", "type", "projects"),

    USERNAME("username", "username", "users"), LEVEL("level", "level", "users"),
    COUNTRY("country", "country", "users"), TIMEZONE("timezone", "timezone", "users"),
    AGE("age", "age", "users"), IDSTRING("id_string", "id", "users"), TAGSTRING("tag_string", "tag", "users"),
    GOAL("goal", "goal", "users"), TECH("tech", "tech", "users");

    public final String databaseLabel;
    public final String userLabel;
    public final String table;

并且不包含文件

git diff --name-only --diff-filter=U (冲突文件列表)

而另一个文件(例如ProjectsBot.java)被标记为冲突 当我打开它时,我看到了

<<<<<<< HEAD
public class ProjectsBot extends ListenerAdapter  {
    private enum Command  {
=======
public class ProjectsBot extends ListenerAdapter {
    private enum Command {
>>>>>>> b858d8ab9c06ee2645a0dda716d9b5e14a6db11d
        CREATE_PROJECT("create project \"name\", \"description\", \"difficulty\""),
        JOIN_PROJECT("join project 'name\"");

        public final String syntax;

<<<<<<< HEAD
        Command(String syntax)  {
=======
        Command(String syntax) {
>>>>>>> b858d8ab9c06ee2645a0dda716d9b5e14a6db11d
            this.syntax = syntax;
        }
    }

所以,我的问题是,如果不是Column.java之类的文件,

git pull -X theirs https://github.com/epicmanmoo/JavaStudyBuddies.git master

将是理想的解决方案-它会自动接受他们的更改,我可以立即将其推送。有没有办法使它适用于Column.java之类的文件?使它们看起来像这样向内:

>>>>HEAD
    NAME("name", "name", "projects"),
    DESCRIPTION("description", "description",  "projects"),
    STATUS("status", "status", "projects"),
    COMPLETED("completed", "completed", "projects"),
    DIFFICULTY("difficulty", "difficulty", "projects"),
    TYPE("type", "type", "projects"),
=====
   NAME("name", "name", "projects"),
    DESCRIPTION("description", "description",  "projects"),
    STATUS("status", "status", "projects"),
    TYPE("type", "type", "projects"),
    COMPLETED("completed", "completed", "projects"),
    DIFFICULTY("difficulty", "difficulty", "projects"),
>>>>theircommit

以便-X theirs选项可以用其下方的所有内容替换=====之上的所有内容?

1 个答案:

答案 0 :(得分:0)

简短的回答是不,你不能那样做。

长的答案是您可以做到这一点,但是您必须编写自己的合并策略:不只是合并驱动程序,也不是像{{ 1}},但是像-X theirs这样的 strategy ,它将使Git调用-s my-new-strategy,这意味着您必须在git-merge-my-new-strategy中使用这样的命令进行拼写。编写策略非常困难(一种方法是克隆Git的副本,然后将现有的递归策略复制到一个新的策略中,并在您的新策略中编写一堆新的C代码,并将递归策略用作起点)。

如果涉及的文件太多,我建议改用:

$PATH

然后使用您发现最佳的技术手动解析每个文件。 git checkout <branch> git merge --no-commit <options> <commit-specifier> 意味着无论Git认为合并成功与否(与--no-commit一起通常都会认为合并成功),合并将停止,就像 ,它使您可以编辑和-X theirs个文件。

当您完成所有操作后,现在使用git addgit diff HEAD来比较工作树(第一个命令)或索引(第二个命令)中的内容很有用, git diff --cached HEAD提交,以查看最终合并结果中的不同之处,请运行:

HEAD

提交合并,或:

git merge --continue

如果您的Git太旧而无法支持git commit 。 (git merge --continue命令仅运行git merge --continue,但在运行git commit之前,存在 要提交的合并,因此它是检查以确保没有其他问题,例如,如果您在解决问题时不小心执行了git commit,则可能已删除了合并状态。在这种情况下,最后的git reset只会使普通的-merge commit,而不是进行合并提交。这也是可恢复的,但是更正于解决它比一开始就不犯错误更令人讨厌-因此git commit是一件好事。)