5

所以。我向 git 存储库添加了一些新文件,这些文件我已经几个月没有碰过。出于某种原因,在合并、拉取和推送我的更改到 github 之后,我注意到所有新文件都插入了如下文本:

>>>>>>>>
HEAD
c0d3234k2jl423;lk4j232;l34jk32;l23j4

在新添加的文件中,这些是随机插入的,但可能不是完全随机插入的。幸运的是,没有太多新文件,我能够通过,相当容易地清理它们,然后重新添加/提交/推送,现在我相信问题已经过去了。

但是发生了什么事?我对 git 和 github 还是很陌生。我怎样才能避免将来发生这种情况?我在 Windows XP 上使用 git bash 控制台。

另外——因为这可能是相关的——当我之前尝试通过我的 PHPStorm CLI 界面提交文件时,我会点击“提交”并且提交永远不会完成。只是不断地尝试和尝试。所以我一直不得不中止该命令,然后进入并手动删除 index.lock 文件以及 COMMIT_EDITMSG.swp 文件。

另外,这最后一次(插入废话时),我收到一条错误消息,说

E138: can't write viminfo file u:_viminfo!
Press enter or type command to continue

也许这也有关系?就像我说的,这个问题现在似乎已经过去了,只是想知道出了什么问题以及将来如何避免它。

4

2 回答 2

3

评论太长了,所以:

如果你做了一些提交并且远程有不同的提交,你总是必须合并(或做某事) 。只有当它只会在远程已经拥有的内容之上添加新提交时,您才能推送。(这称为“快进”。)

只有你,所以遥控器不应该有不同的提交。但是,如果您一直在搞恶作剧rebase或强行推动而不了解自己在做什么,那么您可能已经创造了将分支合并到自身中的令人愉快的荒谬情况。

因此,这是一个速成课程,其中包含您将学会讨厌的提交图之一:

         H <- merge
        / \
you -> G   E <- github
       |   |
       F   D
        \ /
         C
         |
         B
         |
         A

这就是提交历史的样子,如果您确实使用 C,然后其他人(或您在另一台计算机上)添加 D 和 E 并推送它们,然后您再次开始从 C 开始工作并执行 F 和 G。您可以不要像这样推动,因为您当地的分支机构对历史D以及E它们与历史的关系一无所知;你只有A-B-C-F-G.

但是如果你先合并创建H,你现在有一个分支,上面有你和 github 的所有提交,并且 github 可以通过向上“移动”它的箭头来更新。您无法在远程执行此工作,因为它涉及更改文件以创建合并版本,并且远程计算机实际上没有文件的物理副本。(另外,你无法解决冲突。)

git log --graph --oneline --decorate是一个非常有用的视图,它应该向您展示您正在合并的内容。上图将如下所示:

* H (master)
|\
*| G
*| F
|* E (origin/master)
|* D
|/
* C
* B
* A

git 会告诉你合并后是否存在冲突,并且git status(你应该虔诚地运行)总是会以可怕的红色显示冲突的文件。发生这种情况时,git 几乎肯定会在这些文件中注入冲突标记,您需要解决问题并完成合并。(当它告诉你有冲突时,git 会告诉你如何完成合并。)

如果冲突标记之间的东西真的是垃圾,那么您的 IDE 可能会搞砸并损坏文件。git 非常可靠,永远不应该破坏数据(当然,除非你无意中要求它这样做)。

于 2013-01-24T22:43:00.723 回答
1

下次尝试使用解决冲突的工具,例如git mergetool -t kdiff3. 它相当快速和直观,在有大量小冲突时有很大帮助。

kdiff3 的视觉说明

于 2013-01-24T22:15:48.240 回答