我希望能够从Github仓库中拉取所有最新的更改。该仓库只有一个分支,只有一个人(开发者)会添加和修改代码。一旦添加了新功能,我就会将所有内容都拉进来。
通常,我所做的只是:
git pull
但是这一次我收到了一个错误信息,内容如下:
自动合并失败;请解决冲突然后提交结果。
我只想从仓库中拉取最新的更改,但不确定为什么只有一个人负责此仓库时会出现冲突。
注意:我不想向仓库提交任何内容。
基本上,如果你只是观察代码库而不更改文件(或者不希望在更新后保留更改),请执行以下操作:
git reset --hard HEAD
,然后执行git pull
。
这将使用github代码库中的代码覆盖本地机器上的代码。
另一个选项是执行git fetch --all
,然后执行git reset --hard origin/master
。
git pull
= git fetch
+ git merge
。 git merge
。因此,解决问题的方法在于找出“不寻常”的事情和/或相关人员。
请注意,如果您正在积极进行自己的更改,则合并冲突并不算不寻常。 我相信您没有自己进行过 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
,因此没有冲突。所以我期望得到类似第二个的结果。
master
指向的提交,使用 git reset
使 master
指向和 origin/master
相同的提交。(HEAD
名称通常指向另一个名称,在这种情况下是 master
,所以不需要对 HEAD
本身进行任何操作。重新指定 master
,HEAD
将自动跟随。)记得使用 --hard
,如果你希望工作区也更新(你几乎肯定会这样做)。 - torek你可以按照以下方法进行
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>
您出现冲突是因为在本地仓库上进行了一些提交,这些提交与推送到 origin 上的内容发生了冲突。
解决此问题的方法有多种。
重置本地仓库至 origin。 假设您的分支名称为 master。使用 git fetch 下载所有服务器更改,并使用 reset hard 将当前分支重新指向 origin 分支。
git fetch --all
git reset --hard origin/master
解决文件中的冲突,然后再次提交。 检查处于冲突状态的文件。解决冲突后将其添加到索引中,然后提交更改。
git add
git commit -m
git pull
会阻止git fetch
更新origin/master
标签。在这种情况下,如果没有进行初始的git fetch
来更新标签,那么步骤(1)将无法帮助解决问题。 - torek
git pull
,然后再次拉取;要么(更长的方法)只需克隆该仓库。 - Andrey Deineko