git:如何提取最新的更改并解决冲突

时间:2014-08-12 09:35:03

标签: git github conflict pull

我想从github repo中提取所有最新的更改。只有一个分支,只有一个人(开发人员)添加和修改代码。添加新功能后,我只需将所有内容都拉进去。

通常,我所做的只是:

git pull

但是这次我收到一条错误信息:

  

自动合并失败;修复冲突,然后提交结果。

我只是想从回购中提取最新的更改。我不确定为什么只有一个人负责这个回购时会发生冲突。

注意:我不想对回购提交任何内容。

4 个答案:

答案 0 :(得分:4)

基本上,如果您只是观看回购并且不更改文件(或者不希望更新后保留更改),请执行以下操作:

git reset --hard HEAD后跟git pull

这必须使用github repo。

中的代码覆盖本地计算机上的代码

另一种选择是 git fetch --all后跟git reset --hard origin/master

答案 1 :(得分:1)

  1. git pull = git fetch + git merge
  2. 下半场出现问题,git merge
  3. git merge选择不进行"快进"而不是真正的合并,某人(也许是开发人员,也许是你)必须做一些与众不同的事情。
  4. 只有真正的合并可能会发生合并冲突,
  5. 因此,问题的解决方案在于弄清楚"不寻常的事情"和/或涉及的人。

    请注意,如果您正在积极进行您自己的更改,那么合并冲突并不罕见。我告诉你你还没有完成自己的git commit s。

    无论如何,要做的第一件事(如果你不想从头开始重新克隆一切)就是终止冲突的合并,这样你就可以回到原来的位置。如果您使用了git fetch而未使用git merge。 (您确实通过git pull同时使用了这两者,而merge失败了。)要结束合并尝试,因为您处于失败的状态,您可以使用:

    git merge --abort
    

    接下来,可能值得弄清楚为什么git想要首先进行合并。最简单的方法是运行以下两个命令:

    git fetch
    git log --graph --oneline --decorate --all
    

    log会显示您的分支 - 可能名为master - 的结尾,以及"远程" (origin/master)结束。 (git fetch步骤是为了防止您使用较旧的git,其中git pullgit fetch运行git log,以便跳过一个步骤,这将使* f96824d (HEAD, master) some commit message * d1574b8 (origin/master) another commit message * b9491ea a third commit message ... 1}}输出误导。)

    如果你看到这样的话:

    * 676699a (origin/master) here a commit message
    | * 9124325 (HEAD, master) there a commit message
    |/
    * a19ce3f everywhere a commit message
    ...
    

    这意味着你有一个他们没有的承诺。 1 如果你看到:

    git fetch
    然后,再次,你有一个他们不承诺的承诺。

    如果没有进行此(或这些)提交,他们必须撤回某些提交。你拥有它们是因为你曾经使用较早的master抓住它们,然后将它们放在git merge分支上,并使用较早的git merge。但是他们已经撤回了这些提交,然后可能会制作更多新提交。使用您最新的master,您要求git将旧提交与新提交相结合,并且这些提交存在冲突。

    在这两种情况下,您只需强制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这样的图形查看器。如上所示,在某些情况下,行有一些空间,|使用/everything up to date字符等绘制。)


    1 实际上,如果你看到这个,你应该从你的git merge获得{{1}},因此没有冲突。所以我期待像第二个一样。

答案 2 :(得分:0)

你遇到了冲突,因为你在本地仓库上做了一些提交,这与在原点上推送的内容有冲突。

有多种方法可以解决这个问题。

  1. 重置原产地的本地仓库。 假设您的分支名称是master。首先使用git fetch下载所有服务器更改,然后使用reset hard将当前分支重新分配到origin分支。

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

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

    git add

    git commit -m

答案 3 :(得分: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>