在Mercurial中,可以为外部差异和合并工具定义模式(以便仅为匹配指定模式的文件调用它们):
[diff-patterns]
**.ext = difftool
[merge-patterns]
**.ext = mergetool
Run Code Online (Sandbox Code Playgroud)
如何在Git中定义这样的模式?
git-config(1)中的[mergetool]部分未提及任何模式,掩码或任何类似的模式.
编辑:
这是我的.git/config的相关部分:
[diff]
tool = difftool
[difftool "difftool"]
cmd = difftool.git.sh "$LOCAL" "$REMOTE" "$BASE"
[merge]
tool = mergetool
[mergetool "mergetool"]
cmd = mergetool.git.sh "$LOCAL" "$REMOTE" "$BASE" "$MERGED"
Run Code Online (Sandbox Code Playgroud)
现在它适用于所有文件.
我希望只为名称以.结尾的文件调用difftool和mergetool.ext
编辑:
我添加了一个文件.git/info/attributes,其中包含以下内容:
*.ext diff=difftool
*.ext merge=mergetool
Run Code Online (Sandbox Code Playgroud)
我还补充道
[diff "difftool"]
name = my custom diff driver
driver = difftool.git.sh %A %B %O
[merge "mergetool"]
name = my custom merge driver
driver = mergetool.git.sh %A %B %O …Run Code Online (Sandbox Code Playgroud) 我需要经常在dev和master之间进行合并.
我还有一个提交,我只需要应用于dev,以便在本地工作.
之前我只从dev合并到master,所以我有一个分支production_changes,其中包含dev特殊提交的"undo commit".从大师那里我合并了这个.习惯工作正常.
现在,每次我从dev合并到master,反之亦然,我必须一次又一次地挑选并应用相同的提交:(.这是UGLY.
我可以调整什么策略,以便可以在两个分支之间无缝合并,但仅在其中一个分支上保留一些更改?
我正在尝试进行合并,并且存在一堆冲突.它是所有生成的文件所以我想要做的基本上是说"忽略所有合并冲突,并从我自己的仓库检查所有内容".
我试过了
git checkout . --ours
git add -A
git com -a
Run Code Online (Sandbox Code Playgroud)
它给了我一个错误,因为"unmerged paths"存储桶中仍有文件.我该如何处理?
谢谢!
今天我使用Git,发生了一些我不知道如何处理的事情.
我在分支机构development,我做git fetch了新的origin/master.我想合并origin/master到master,并最终与更新的master签出.通常,我会这样做:
git checkout master
git pull
Run Code Online (Sandbox Code Playgroud)
但是有一个问题; 当前签出的分支development有一个.gitignore包含很多旧文件的文件master.旧的master这些文件受版本控制.所以Git不会让我结账master,因为这些文件会被覆盖.
我不知道该怎么做,所以我只是简单地检查了一下origin/master.
如果有一种方法可以origin/master在master没有退房的情况下合并master,我认为这样可以拯救我.(这是一个快速合并,所以Merge-Fail不是一个选择.)
我该怎么办?
我正在开始一个新的Zend Framework项目,我将与设计师合作.我将使用git维护这个项目代码,通常设计师不会说git(或任何编程语言),所以我想让他的事情变得简单,否则我恐怕他根本不会使用git.我的计划是给他一些Git gui,并且他应该只使用基本的git功能,例如commit,diff,fetch,merge,push和pull.
我正在使用gitolite来维护我们的git存储库的共享副本,因为它有一个精细的权限系统,我将只为设计者提供RW访问权限(设计)和对其他分支的读访问权限.
为了简单起见,我想与他分享主项目中的一些文件夹(遵循ZF推荐的结构),他确实需要访问它才能完成工作.与此同时,我希望我们两个人仍然能够相互融合.
他的分支的结构减少应该是这样的:
<project name>/
application/
layouts/
scripts/
views/
scripts/
public/
css/
images/
js/
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用子模块完成这项任务,但维护起来会很麻烦,因为我应该将项目拆分到(至少)4子库中,他应该只能访问子库,并且他有3个存储库可以使用.因此,如果这是唯一的解决方案,我会放弃这个想法.
我已经读过的一些链接让我觉得我所要求的是可能的:
这是我的问题:
design(git checkout -b design和git mv/rm?)git merge design从主分支,反之亦然)我找到了另外两种可能解决这两个问题的方法
我尝试git rm all-unneeded-stuff在设计分支中实现第一个后,我在主分支中进行提交,其中涉及白名单路径中的文件和黑名单路径中的另一个文件,但是git merge失败并显示以下消息
CONFLICT (delete/modify): application/Bootstrap.php deleted in HEAD and modified in master. Version master of application/Bootstrap.php left in tree.
Run Code Online (Sandbox Code Playgroud)
然后我在master分支中添加了一个新目录,当从设计中合并时,添加了新目录.我在驱动程序中添加了一些调试回声,我发现在两种情况下都没有调用它,可能是因为它不是真正的合并.
我还没有尝试过第二种方法(.gitignore),但是如果我已经理解这种方法不符合我的需求,因为它只会忽略设计分支中列入黑名单的文件,但是它们会在设计分公司,打破了我的要求.
我把我的实验推到了GitHub上
我认为目前没有解决方案.使用当前的git实现,这根本无法实现.
我想要反驳,但我担心它不会发生.
我正在从zip快照构建一个回顾性项目历史.我已经从快照中构建了一个长分支提交序列.我现在已经在最后添加了一些"发现"快照,这些快照应该位于提交序列中间的不同位置.
我正在尝试使用它git rebase -i <startCommit>来重新排序git快照.我只需交换选择列表顺序.这应该只是重写提交对象的情况,但保持底层树相同(因为快照没有改变).
在这种情况下,看起来像rebase仍在尝试创建补丁并且有很多冲突,而不是进行简单的重新安排.对于这种特殊情况,是否有更合适的命令?我没有合并,只有一个分支.整个回购仍然非常本地和私人.
在另一个问题中,建议使用.gitattributes以保持文件被跟踪但不合并到不同的分支,但我下面的用例似乎不起作用..
mkdir git
cd git
git init
echo "B" > b.txt
git add b.txt
git commit -m 'Initial commit'
echo "b.txt merge=keepMine" > .gitattributes
git add .gitattributes
git config merge.keepMine.name "always keep mine during merge"
git config merge.keepMine.driver "keepMine.sh %O %A %B"
git commit -m 'Ignore b.txt'
git checkout -b test # Create a branch
git checkout master # Back to master and make change
echo "Only in master" > b.txt
git commit -a -m 'In …Run Code Online (Sandbox Code Playgroud) 这个问题不是特定于iOS的,但为了清楚起见,我在此处包含了实际用例
我运行一个名为iOS的项目Foobar,显然是在版本控制之下.在iOS项目环境中的项目文件中,有一个名为Foobar-Info.plistXML文件,它存储有关项目的有趣信息,例如版本和我所构建的构建数量.
每次我构建项目时,我都会将存储在此文件中的构建计数递增,如下所示:
...
<key>BuildCount</key>
<string>2203</string>
<key>CFBundleShortVersionString</key>
<string>0.0.4</string>
<key>CFBundleVersion</key>
<string>0.0.4-release/0.0.4.2203</string>
...
Run Code Online (Sandbox Code Playgroud)
其中'0.0.4-release'是git-flow分支名称,2203是内部版本号.这是在CFBundleVersion现场使用的,所以对我来说,构建来自哪里是非常明显的.
想象一下,在另一个分支中,自发布以来我已经取得了很多进展,并且相同的字段看起来像:
...
<key>BuildCount</key>
<string>2754</string>
<key>CFBundleShortVersionString</key>
<string>0.0.4</string>
<key>CFBundleVersion</key>
<string>0.0.4-feature/add-quux-and-baz.2754</string>
...
Run Code Online (Sandbox Code Playgroud)
假设我完成了发布,它已合并到主线develop分支中.
问题
为了获得发布分支中的最新更改,我想将功能分支重新绑定到develop.
当发生这种情况时,Foobar-Info.plist将在rebase进程中的每次提交时引发冲突.这是因为每次提交都会增加构建号; 我必须通过选择手动指定具有最新版本的行来手动合并.请注意,3向差异的基本版本也会有所不同.
<string>2000</string> // Base
<string>2754</string> // Local ** always pick this one; it's the latest
<string>2203</string> // Remote
Run Code Online (Sandbox Code Playgroud)
我怎么能告诉git对于一个特定的文件,Foobar-Info.plist我希望它通过最新的更改来解决我的冲突?
编辑:该文件必须保持在源代码管理下.我想保留BuildCount它,因为它是我项目中努力的一个很好的指示,我想保留它!我知道这个数字只表示完成的MINIMUM数量,但这对我来说已经足够了.
我有一个为pom.xml(Maven)文件配置的自定义git合并驱动程序.
配置:
该.gitattributes文件:
pom.xml merge=pommerge
Run Code Online (Sandbox Code Playgroud)
和.gitconfig文件:
[merge "pommerge"]
name = A custom merge driver for Maven's pom.xml
driver = mergepom.py %O %A %B
Run Code Online (Sandbox Code Playgroud)
这非常适合解决此类文件中的冲突.不幸的是,这并没有解决pom.xml文件的所有问题.只有在主分支中更改pom.xml时才会在合并时调用此驱动程序(因此,我们称之为'git merge的分支) otherbranch')和我们想要合并的分支('otherbranch').
我们总是将我们的合并驱动程序用于pom文件,即使pom文件只在1个分支中更改,并且可以合并而不会发生冲突.
有没有办法在这种情况下强制我们的定制'pommerge'司机?
更新 我几乎尝试过任何事情,但没有运气.我甚至检查了git源代码并添加了更多的日志记录到代码并安装/ MAKE它以检查我是否能找出是否有一个特定的扩展点我可以以某种方式使用.但代码很难理解在哪种情况下遵循代码中的哪条路径,因此这种努力比解决方案产生更多的挫败感;)..
我可以使它工作的唯一方法,这不是解决方案,是在合并之前在两端(分支)更改文件..但这不是非常用户友好
我仍然希望有人提出天才解决方案或线索,这有助于我进一步应对这一挑战.
谢谢大家的时间!
git ×9
merge ×6
git-merge ×2
branch ×1
difftool ×1
git-branch ×1
git-rebase ×1
git-subtree ×1
maven ×1
mercurial ×1
mergetool ×1
pom.xml ×1
svn ×1