Git:如何拉取最新更改并解决冲突

6

我希望能够从Github仓库中拉取所有最新的更改。该仓库只有一个分支,只有一个人(开发者)会添加和修改代码。一旦添加了新功能,我就会将所有内容都拉进来。

通常,我所做的只是:

git pull

但是这一次我收到了一个错误信息,内容如下:

自动合并失败;请解决冲突然后提交结果。

我只想从仓库中拉取最新的更改,但不确定为什么只有一个人负责此仓库时会出现冲突。

注意:我不想向仓库提交任何内容。


这意味着你本地机器上的代码与你从 Github 拉取的不同。因此,要么进入每个文件,解决冲突并按照提示进行 git pull,然后再次拉取;要么(更长的方法)只需克隆该仓库。 - Andrey Deineko
我会尝试的,谢谢! - Boosted_d16
那个对你有用吗? - Andrey Deineko
有些奇怪的事情正在发生。 - Boosted_d16
如果你把“newb”拼成“n00b”,那你一定是个新手。 - Isaac Kleinman
显示剩余2条评论
4个回答

9

基本上,如果你只是观察代码库而不更改文件(或者不希望在更新后保留更改),请执行以下操作:

git reset --hard HEAD,然后执行git pull

这将使用github代码库中的代码覆盖本地机器上的代码。

另一个选项是执行git fetch --all,然后执行git reset --hard origin/master


之前不确定自己在做什么,但这个神奇的方法居然有效了!谢谢。 - Boosted_d16

3
  1. git pull = git fetch + git merge
  2. 第二个步骤出了问题,就是git merge
  3. 如果想要选择“快速向前”,而不是真正的合并,则需要有人(可能是开发人员,也可能是您)做了一些不寻常的事情。
  4. 只有真正的合并才会产生合并冲突。

因此,解决问题的方法在于找出“不寻常”的事情和/或相关人员。

请注意,如果您正在积极进行自己的更改,则合并冲突并不算不寻常。 我相信您没有自己进行过 git commit

无论如何,如果您不想重新克隆所有内容,请首先终止冲突的合并,这样您就回到了如果仅使用 git fetch 而不使用 git merge 时的状态。 (您使用了 git pull 并且合并失败了)。 为了结束合并尝试,由于您处于失败的状态下,可以使用:

git merge --abort

接下来,最好弄清楚为什么git首先想执行合并操作。最简单的方法是运行以下两个命令:

git fetch
git log --graph --oneline --decorate --all
log 将向您展示 您的 分支(通常命名为 master)的末端和“remote”(origin/master)的末端。 (执行 git fetch 步骤只是为了防止您使用旧版本的 git,其中 git pull 以一种跳过步骤的方式运行 git fetch,这会使 git log 输出不准确。)
如果您看到类似于此的内容:
* f96824d (HEAD, master) some commit message
* d1574b8 (origin/master) another commit message
* b9491ea a third commit message
...

这意味着您有一个提交,而他们没有。如果您看到以下内容:
* 676699a (origin/master) here a commit message
| * 9124325 (HEAD, master) there a commit message
|/
* a19ce3f everywhere a commit message
...

然而,你有一个提交它们没有。

如果这个(或这些)提交不是由创建的,那么他们必须撤销了一些提交。你之前抓取了它们,然后使用早期的git fetch将它们放到了你的master分支上,再使用早期的git merge合并了它们。但是他们已经撤销了这些提交,然后可能又做了更多新的提交。使用最新的git merge时,你正在让Git合并他们的旧提交和新提交,并且这些提交冲突了。

在这两种情况下,你可以简单地强制使你的master移动到与他们的origin/master相同的提交,方法是:

git reset --hard origin/master
reset 命令的意思是“采用当前分支”——在这种情况下,是 master ——“并将其指向我在此命名的确切提交: origin/master”。--hard 的意思是“还要放弃我的当前工作树,并使用附加到我现在移动的提交的工作树来替换它”。
通常情况——对于您的设置而言——是他们可能有您没有的提交,但您拥有的每个提交他们也都有。在这种情况下,您的 git merge 看到它可以简单地“滑动您的分支”,以匹配他们的分支,这是一项“快进”操作。在这种情况下,git log --all --decorate --graph --oneline(这些选项的顺序不重要)输出看起来更像:
* 7cf123a (origin/master) lots of twisty
* b9cce10 little commit messages,
* 009cda1 (HEAD, master) all somewhat alike
...

在这种情况下,可以想象标签(HEAD,master)沿着连接*的线条滑动。(实际的线太小了,无法在此绘制——行之间没有足够的空间——但是git log --graph --all --decorate会显示它们:这次我们省略--oneline,以便有更多的线;类似gitk的图形查看器也会如此。如上所示,在某些情况下,有一些用于线条的空间,git log使用|/字符进行绘制。)

1实际上,如果您看到这个消息,您只需从git merge获得一个everything up to date ,因此没有冲突。所以我期望得到类似第二个的结果。


感谢您的详细解释!我的“git log --graph --all --decorate”看起来像您的第二个设置,其中Head、master在origin/master下面。现在我该怎么办呢?因为我仍然遇到合并错误。 - Boosted_d16
已经有“要做什么”在上面了:如果你确定想要舍弃 master 指向的提交,使用 git reset 使 master 指向和 origin/master 相同的提交。(HEAD 名称通常指向另一个名称,在这种情况下是 master,所以不需要对 HEAD 本身进行任何操作。重新指定 masterHEAD 将自动跟随。)记得使用 --hard,如果你希望工作区也更新(你几乎肯定会这样做)。 - torek
非常感谢您详细的解释,现在我对某些事情的作用有了更好的理解! - Boosted_d16

0

你可以按照以下方法进行

git fetch origin // that will pull all the updates for all the branches
git checkout <branch>
// either of these two below
git pull origin <branch> 
// if the above command does not work and shows you conflicts
// to get rid off from conflicts try this
git reset --hard origin/<branch>

0

您出现冲突是因为在本地仓库上进行了一些提交,这些提交与推送到 origin 上的内容发生了冲突。

解决此问题的方法有多种。

  1. 重置本地仓库至 origin。 假设您的分支名称为 master。使用 git fetch 下载所有服务器更改,并使用 reset hard 将当前分支重新指向 origin 分支。

    git fetch --all
    git reset --hard origin/master

  2. 解决文件中的冲突,然后再次提交。 检查处于冲突状态的文件。解决冲突后将其添加到索引中,然后提交更改。

    git add

    git commit -m


Boosted_d16可能使用的是1.8.4之前(或者是1.8.5?)版本的git,因此git pull会阻止git fetch更新origin/master标签。在这种情况下,如果没有进行初始的git fetch来更新标签,那么步骤(1)将无法帮助解决问题。 - torek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接