假设我通过git存储库与某人合作,并且有一个特定的文件,我永远不想接受任何外部更改.
有没有办法让我设置我的本地仓库,以便每当我拉动时不抱怨冲突的合并?我想在合并此文件时始终选择我的本地版本.
我试图将本地分支合并到主分支而不让Git进行自动注册.我想"亲自挑选"我想要合并为主人的东西.
当我使用Git的difftool命令时,我能够区分并选择我想要添加到主分支中的内容.但是当我合并时,我会失去我之前选择的东西,因为Git会做一个automerge.我可以在合并之前将更改提交到master中,但这样做似乎不自然.
Git的mergetool仅在合并发生冲突时才可用.但是如果Git做了automerge,那么通常没有冲突,所以我无法运行mergetool命令.
更新:
我开始认为我想要完成的是不好的做法,或者这是不可能的.也就是说,合并一个主题分支,只让它合并我需要的差异.此外,还有这一点反映在历史上.无论如何,我在试验Git时发布的问题浮出水面.
我有一个包含两个分支的存储库:live和stage.存储库包含基于Web的应用程序的代码.我想为舞台和现场分支维护两个不同的.htaccess文件,但仍然保持它们的版本控制,因为服务舞台网站的性质有点不同(例如,现在,我希望缓存定时不同).
我是git的新手,所以可能有一个简单的解释,但我想有一个工作流程,当我在现场和我拉变化(简单git merge stage)时,我没有覆盖现有的.htaccess在现场科.有没有办法配置这个?我在git中错过了一些重要的概念吗?
同样地,还有一大块(但可能很多).html文件,我想跟踪变化但不将它们合并回实时.为了清楚起见,我希望live和stage能够跟踪这些文件中的更改,但知道在进行合并时不要合并这些特定的更改.
我想在具有公共合并基础的两个git分支之间执行三向差异,并使用kdiff3查看它.
我发现很多指导对SO(和一些非常相似的问题(1,2,3)),但我还没有找到一个直接的答案.值得注意的是,对这个答案的评论意味着我想要的是可能的,但它对我不起作用.希望用户可以在这里ch :) :)
对于背景,当我执行合并时,我使用"diff3"冲突样式:
git config --global merge.conflictstyle diff3
我已git mergetool配置为使用kdiff3.
解决合并冲突时,这会显示四个文件:
但是,git difftool只会拉起两个分支提示.我也希望看到基本文件. 为了清楚起见,我希望能够在合并之前执行此差异,包括没有合并冲突的文件.(git mergetool如果存在冲突,则仅显示三向差异).
部分解决方案#1:
使用单个文件,我可以导出三个版本并手动调用diff:
git show local_branch:filename > localfile
git show remote_branch:filename > remotefile
git show `git merge-base local_branch remote_branch`:filename > basefile
{kdiff3_path}/kdiff3.exe --L1 "Base" --L2 "Local" --L3 "Remote" -o "outputfile" basefile localfile remotefile &
Run Code Online (Sandbox Code Playgroud)
这有两个问题:
我正在创建一个合并驱动程序.我已经定义了一个.gitattributes文件,如下所示:
filename merge=mergeStrategy
我在$ PROJECT/.git/config中创建了合并驱动程序,如下所示:
[merge "mergeStrategy"]
name = My merge strategy
driver = scripts/mergeScript.sh
Run Code Online (Sandbox Code Playgroud)
这在本地工作正常,但我想将此合并驱动程序提交到git存储库,以便合并策略对每个人都有效.
有没有办法可以将此(或其他Git配置选项)添加到存储库本身?
我已经有了以下内容
[attr]POFILE merge=merge-po-files
locale/*.po POFILE
Run Code Online (Sandbox Code Playgroud)
在.gitattributes同一个本地化文件(例如locale/en.po)已经在并行分支中修改时,我希望合并分支以正常工作.我目前正在使用以下合并驱动程序:
#!/bin/bash
# git merge driver for .PO files (gettext localizations)
# Install:
# git config merge.merge-po-files.driver "./bin/merge-po-files %A %O %B"
LOCAL="${1}._LOCAL_"
BASE="${2}._BASE_"
REMOTE="${3}._REMOTE_"
# rename to bit more meaningful filenames to get better conflict results
cp "${1}" "$LOCAL"
cp "${2}" "$BASE"
cp "${3}" "$REMOTE"
# merge files and overwrite local file with the result
msgcat "$LOCAL" "$BASE" "$REMOTE" -o "${1}" || exit 1
# cleanup
rm -f "$LOCAL" "$BASE" "$REMOTE" …Run Code Online (Sandbox Code Playgroud) 我们正在尝试在两个分支之间进行合并:稳定代码和新功能.
合并功能对我们不起作用:它有时会显示冲突,但通常只是覆盖文件而不告诉我们任何冲突,可能与它认为正确的版本有关.
是否可以阻止此覆盖,以便向我们显示所有冲突的行?我们尝试使用git diff来了解它有多广泛,但有几千行,因为我们在我们的稳定分支上进行了相当广泛的调试...所以我们真的需要让合并功能工作,如果可能的话.
所以我们处于一个混乱的状态,将非常感谢所有的帮助.
我使用专有的脚本语言开发了非常恢复的代码,其中大多数配置都包含在代码本身中.
显而易见的问题是测试和生产环境之间代码本身的差异,而这正是我试图用GIT管理的.
由于我的测试环境非常不稳定,我想我可以在GIT中创建一个分支,同时进行更改(并在其中保留代码和测试配置),并且在代码被接受之后我将其合并到生产中.
好吧,当我要求git合并我的分支时,它可以很好地处理代码..但是配置也会被迁移,而且我必须逐个文件地打开,将其更改回原来的状态.
无论如何我可以禁用GIT的自动合并并威胁一切,因为代码冲突要手动与WinMerge合并或稍后?代码很简短,真的.因为无论如何我都要编辑它以应用配置......
ps:请注意,我不是问如何在git上配置WinMerge.我有这些工具.我的问题是如何始终在分支之间执行手动合并.
谢谢!
F.
这是一个多年来被问过很多次的问题。我找到了很多答案,尤其是这个:
Git - 如何在所选文件上强制合并冲突和手动合并(@Dan Moulding)
此页面包含如何设置始终返回失败的合并驱动程序的详细指南,从而使手动合并成为可能。我试图为 Windows 调整该解决方案:
我将以下内容添加到我的%homepath%\.gitconfig:
[merge "verify"]
name = merge and verify driver
driver = %homepath%\\merge-and-verify-driver.bat %A %O %B
我把驱动改成了
cmd /K "echo Working > merge.log & git merge-file %1% %2% %3% & exit 1"
(echo Working > merge.log添加来检查驱动程序是否被调用)。
并且,在 repo 的根目录下,创建了一个.gitattributes包含以下行的文件:
*.txt merge=verify
不幸的是,它不起作用。我试图合并一个文件feature.txt,唉,合并成功完成。似乎根本没有调用驱动程序,因为没有创建 merge.log 文件。
我做错了什么吗?任何强制手动合并问题的解决方案都是最受欢迎的。
有一些关于如何做的答案(这个和那个)建议使用自定义驱动程序,这似乎很好.
但是,在合并分支中未更改给定文件时会出现这种情况,因此git甚至不会调用合并驱动程序,而只是覆盖该文件.
有没有办法有效地防止发生?
[编辑]
为了澄清,每个实现的合并都包含一个具有本地环境配置的Excel,即每个开发人员的本地设置.很少编辑这样的文件,这通常会导致它在我从主分支的每次拉动时被覆盖.
请注意,此文件中还有一些其他详细信息可能已经过编辑,我想在我自己的版本中进行更新,因此更新它仍然很重要.我只是希望它总是导致冲突被手动排序,所以我可以保持我的本地配置并更新其余的(即使我必须手动完成).
同样值得注意的是,这个文件不能拆分,让我的生活更轻松.