我如何在我的 Git 存储库中解决合并冲突?


当前回答

你可以以一些方式解决合并冲突,因为其他人已经详细说明了。

我认为真正的关键是知道如何在本地和远程存储库中流动的变化。 关键是理解跟踪分支. 我发现我认为跟踪分支是我之间的“中间失落的片段”我的本地,实际的文件目录和远程定义为起源。

而不是:

git add .
git commit -m"some msg"

相反,我做:

git add file,file2,file3...
git commit # Then type the files in the editor and save-quit.

因此,你更有意识到哪些文件被添加,你也可以查看列表,并在使用编辑器为消息时思考更多。

[更新 - 随着时间的流逝,我已经更换到:

git status # Make sure I know whats going on
git add .
git commit # Then use the editor

)

此外(更重要的是你的情况),我试图避免:

git pull

git pull origin master.

git checkout master
git fetch   
git rebase --hard origin/master # or whatever branch I want.

你也可能會發現這有用:

git 分支, fork, fetch, merge, rebase 和 clone,什么是差异?

其他回答

请遵循以下步骤来解决 Git 中的合并冲突:

查看 Git 状态: git 状态 获取 patchset: git fetch (从您的 Git commit 查看正确的 patch) Checkout 一个本地分支(temp1 在我的例子中在这里): git checkout -b temp1 Pull 最近的内容从主: git pull -rebase 起源主 启动 mergetool 并检查冲突并纠正它们......并检查与您当前分支的远程分支中的变化: git mergetool Chec

试试:

git mergetool

它打开一个GUI,你通过每个冲突,你得到选择如何合并。有时它需要一些手编辑后,但通常它是足够的本身。


根据Josh Glover的评论:

[此命令] 不必打开 GUI 除非你安装一个. 运行 git mergetool 为我导致 vimdiff 被使用. 您可以安装下列工具之一来使用它: meld, opendiff, kdiff3, tkdiff, xxdiff, tortoisemerge, gvimdiff, diffuse, ecmerge, p4merge, araxis, vimdiff, emerge。


下面是使用vimdiff解决合并冲突的样本程序,基于此链接。

如果你经常做小承诺,然后开始看看承诺评论与 git log --merge. 然后 git diff 会向你展示冲突。

我喜欢opendiff - Git 也支持 vimdiff, gvimdiff, kdiff3, tkdiff, meld, xxdiff,从盒子中出现,你可以安装其他: git config merge.tool “your.tool” 将设置您所选择的工具,然后 git mergetool 失败的合并后将向您展示背景中的 diffs。

每当您编辑文件以解决冲突时, git 添加文件名将更新索引,而您的 diff 将不再显示。

我喜欢使用WinMerge(免费工具),它既是整个目录树的比较/混合,而且是整个目录树的个别文件(s)比较/混合。

解决的步骤可以是:

也就是说,没有魔法的方式来解决 Git 合并的冲突,除了手动观察每个人对相同的源文件(s)做了什么。

这就是我所想的。

注意: WinMerge 创建.bak 文件.. 并且您不希望它们复制到源控制 AzOps, TFS 等,所以如果您确信您已经完成了正确的编辑,删除.bak 文件。

下面是可能的使用案例,从顶部:

你会拖一些变化,但哦,你没有到目前为止:

git fetch origin
git pull origin master

From ssh://gitosis@example.com:22/projectname
 * branch            master     -> FETCH_HEAD
Updating a030c3a..ee25213
error: Entry 'filename.c' not uptodate. Cannot merge.

所以你更新并尝试一次,但有冲突:

git add filename.c
git commit -m "made some wild and crazy changes"
git pull origin master

From ssh://gitosis@example.com:22/projectname
 * branch            master     -> FETCH_HEAD
Auto-merging filename.c
CONFLICT (content): Merge conflict in filename.c
Automatic merge failed; fix conflicts and then commit the result.

所以你决定看看这些变化:

git mergetool

哦,我的,哦,我的,上流改变了一些事情,但只是用我的变化......不......他们的变化......

git checkout --ours filename.c
git checkout --theirs filename.c
git add filename.c
git commit -m "using theirs"

然后,我们试着最后一次。

git pull origin master

From ssh://gitosis@example.com:22/projectname
 * branch            master     -> FETCH_HEAD
Already up-to-date.

是的!