如何解决与远程git回购的冲突?

如何解决与远程git回购的冲突?,git,merge,conflict,Git,Merge,Conflict,所以,首先,我是git的新手 我们的工作流程是克隆远程回购、执行工作、提交等,直到我们满意为止,然后推送到源/分支。然后执行拉取请求。(这可能很疯狂,对我来说似乎容易出问题,但我对这件事一无所知,只是盲目地遵循程序:-)我这样做。。。还有一个文件与其他人在他们自己的分支中编辑的文件冲突,在我克隆master之后,该文件被合并。我的提交使该文件变得多余,所以我想要的快速答案是,如何让git直接删除该文件?但从更长远的角度来看,无论何时发生冲突,这显然不是正确的答案:-)但我在谷歌发现的一切似乎都是

所以,首先,我是git的新手


我们的工作流程是克隆远程回购、执行工作、提交等,直到我们满意为止,然后推送到源/分支。然后执行拉取请求。(这可能很疯狂,对我来说似乎容易出问题,但我对这件事一无所知,只是盲目地遵循程序:-)我这样做。。。还有一个文件与其他人在他们自己的分支中编辑的文件冲突,在我克隆master之后,该文件被合并。我的提交使该文件变得多余,所以我想要的快速答案是,如何让git直接删除该文件?但从更长远的角度来看,无论何时发生冲突,这显然不是正确的答案:-)但我在谷歌发现的一切似乎都是假设我直接在回购协议之外工作。像“git status”这样的东西告诉他们一切都很好,因为它正在查看我的repo克隆。我找不到如何处理这是一个远程存储库。

在其他任何事情之前,让我先说一下(这有点简化,但就目前而言足够准确):
git-pull
只是一个方便的脚本,它执行两个底层git命令,
git-fetch
,然后是
git-merge
。如果从
fetch
而不是
pull
(fetch+merge)的角度来考虑,事情会变得更有意义

你没有——事实上,不能使用git在“远程存储库”上工作。所有东西都是本地的。当你获取或推送时,你的本地git会联系一个远程用户,将其视为在互联网电话上呼叫其他人,你的git和他们的git交换信息,然后你要么给他们东西(
git push
)或者他们给你东西(
git fetch

当他们给你东西时,你的git会记下他们有哪些分支,并更新你关于“远程情况”的想法。这些信息会进入你的(本地!)“远程分支”,例如
origin/master
origin/develope
,或者他们使用的任何分支名称:您的git将
origin/
粘贴在前面,因为您正在执行
git fetch origin
。1此分支重命名技巧非常重要。这特别意味着,无论您在处理什么本地分支,运行
git fetch
总是安全的,因为这只会更新您的“远程分支”。(它们也是本地的,它们位于您的
.git
目录中,而不是远程目录中。您只要随时与它们同步,只要git在Internet电话上呼叫git,就可以添加、更改和删除副本。)

但是,当你给他们东西的时候,就不会有更名了。当你做
git推送origin master
时,你的git会对你呼叫的
origin
的人说:“嘿,我建议你们把
master
改成我给你的这个新承诺。”这取决于他们是否接受。一般来说,他们(无论是谁)接受“快进”,但不接受“非快进”。有关这方面的(更多)信息,请参阅

使用pull请求(并将它们与用户发起的push组合)时,您通常会将提交推送到每个用户的位置:例如,您可以将提交推送到每个人/从Johnoiver/master推送到每个人,而不是从遥控器上的
master
推送到
master
。或者,您可以推送到一个只有您推送到的存储库,但其他人都可以看到。这里的想法是,您在这里所做的推送不会与其他任何人的推送冲突,它只是使您的提交可见,然后发出“拉请求”,告诉某人去查看这些提交。如果他们(无论是谁)喜欢它们,他们会将它们添加到遥控器上的
master
。如果没有,他们会让你重写

请注意,如果重写提交,则会得到一个新的、不同的提交。每个提交都有一个大而丑陋的SHA-1 ID作为其完整的“真实名称”。该ID是提交的全部内容的加密校验和:所有涉及的文件、您的姓名和电子邮件、日期/时间戳以及提交的父提交。如果您更改了任何内容,您将得到一个新的、不同的提交。(您的新提交和不同提交可以使用与旧提交相同的父ID,以及相同的用户名和电子邮件。如果您足够快[一秒钟可以提交多少次?:-)],或者操纵时间,您甚至可以获得相同的时间戳。但是如果文件不同,您将获得不同的提交ID。这很好:这就是我们想要的。如果您获得相同的提交ID,则所有文件都是相同的,您的姓名和时间也是相同的,因此它毕竟是相同的旧提交。)


现在,回到你的问题

我做[拉]。。。还有一个文件与其他人在他们自己的分支中编辑的文件冲突,在我克隆master之后,该文件被合并。我的提交使该文件变得多余,所以我想要的快速答案是,如何让git直接删除该文件

当您执行
pull
操作时,您正在执行
fetch
操作,然后执行
merge
fetch
带来了其他人的提交,现在可以在
origin/master
上找到这些提交(或任何分支;我在这里假设
master

如果您已经提交了您的工作,那么您有自己的提交,请在您的
主机上查找able
。(如果您还没有提交,那么执行
git merge
可能不是一个好主意。但是您上面的工作流程表明您已经提交了。因此,让我们假设您确实有自己的提交。)让我们绘制生成的“提交图”,这只是一种奇特的方式(在白板上或作为ASCII艺术或其他方式)写下一些提交,显示谁做了什么:

             A   <-- master <-- HEAD
           /
...* <-- *
           \
             B   <-- origin/master
这里唯一的问题是与合并结果
M
关联的文件是错误的:正如您所说,它们的更改(或整个文件本身)应该消失,但git认为与您的更改没有冲突,所以git保留了这两个更改

让我在这里重复一句话:

我所做的一切
             A
           /   \
...* <-- *       M   <-- master <-- HEAD
           \   /
             B   <-- origin/master
git rm file.dat # no longer needed at all