我有一个包含一些代码的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;
...
是
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
选项可以用其下方的所有内容替换=====
之上的所有内容?
答案 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 add
或git 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
是一件好事。)