在Git中重新定位时,人们有什么策略来解决Gemfile.lock冲突?
我不得不在最近的一个项目中做很多事情,而且不仅乏味,而且并不总是清楚如何进行合并.
我的存储库中有一些文件是底层增长的:大多数更改都涉及在文件底部添加新行.这主要是语言和其他属性文件.
作为一个恼人的副作用,每当两个人同时添加时,我就会遇到合并冲突,并且解决方案总是涉及手动复制粘贴,以便包含来自两个版本的行.
是否有一个提示,技巧或方法可以减轻这个过程中的一些痛苦?
例如,一个简单的解决方案是告诉开发人员在文件中间的随机位置添加新行.这可能会奏效,但它涉及到有意识的努力,以及一个奇怪的历史.
我在这里读了几个git问题,但找不到这个问题的答案:
我有一个公共和私人分支机构,我想允许某些文件发散.
这些是包含密码和本地自定义的配置文件.
我确实希望能够以两种方式合并分支:从私有到公共和返回,但我不希望自动合并这些特定文件.
有没有办法以这种方式设置git?我很想找到一个自动化解决方案:) - 这样可以像往常一样进行合并.
编辑:这是适合我的解决方案(感谢VonC对gitattribute的建议)
对我来说唯一意想不到的事情是"合并保护"只有在两个分支中的文件分歧后才开始工作,而不是在应用以下配置后立即开始工作
.gitattributes(如果你想分享这个,可以用git跟踪)或.git/info/attributes:
file1 merge=keepmine
path/file2 merge=keepmine
Run Code Online (Sandbox Code Playgroud)
keepmine是一个命名的自定义合并管理器,它只是一个do-nothing命令而不是所选文件的内部合并驱动程序,它在下面设置
从私人分支到公共分支合并时,我通常会这样做git merge --squash private.这样私有编辑就不会进入公共分支的git历史.
的.git /配置:
#public repository
[remote "origin"]
fetch = +refs/heads/*:refs/remotes/origin/*
url = <public repo git url>
#private repository
#has to set up with git init and populated with the initial commit to branch mybranch
[remote "private"]
push = +:
url = /path/to/local/private/repo
[merge "keepmine"]
name = dont_merge_selected_files
driver = echo %O %A %B
[branch "master"]
remote = origin
merge …Run Code Online (Sandbox Code Playgroud) 我有以下目录结构:
/.git
/.git/info/attributes
/MyProject
/MyProject/pom.xml
/MyProject/MyCode.java
Run Code Online (Sandbox Code Playgroud)
我有分支主和bugfix.在两个分支上都修改了pom.xml和MyCode.java.我想将仅来自bugfix的更改合并到MyCode.java的master,并保留pom.xml文件的主版本.
所以我添加了"/.git/info/attributes"因为我不想在项目中提交.gitattributes
$cat .git/info/attributes
pom.xml merge=ours
$git status
# On branch master
nothing to commit (working directory clean)
$git check-attr -a pom.xml
pom.xml: merge: ours
Run Code Online (Sandbox Code Playgroud)
最后到了问题:
当我做:
$git merge bugfix
Auto-merging MyProject/pom.xml
CONFLICT (content): Merge conflict in MyProject/pom.xml
Automatic merge failed; fix conflicts and then commit the result.
Run Code Online (Sandbox Code Playgroud)
Git忽略了属性设置.我在这里失踪了什么?
我不想在这篇文章中定义"keepMine.sh"
这篇文章是我需要的,但是如果我有一个简单的模式,我宁愿不逐个文件
谢谢!
我们的项目在代码相当近的范围内工作(在代码的相当小的地理区域中并行发生了很多变化),而我们的基于特征分支的git工作流对我们的java代码非常有用.
但是xml/html的东西效果不好.简单的无关更改(设计者添加了一个周围的div,一个开发人员更改了一个元素的id)给出了非常糟糕的合并.
我意识到如何处理这个问题可能有几种选择.一个好的git xml合并将是最佳的,或者限制重新格式化xml/html代码.不在如此紧密的地方工作将是另一个(不可接受的)选择.
你如何有效地解决这个问题?
我有一个特殊的分支(发布分支),它是master分支的精确副本,删除了一些文件和目录.此分支上没有发生任何开发,但它必须与master同步,因此master上的更新必须不断推送到该分支.
通过正常的merge(git merge master)我不断得到像(例如一个示例README文件)的冲突:
CONFLICT (delete/modify): README deleted in HEAD and modified in master
这是预期的:我尝试合并文件中的更改,我已删除.所以,要解决它们,我会使用它git rm README.
为了使其自动化,我可以通过指定-X our来使用自动冲突解决方案.手册页建议对我来说是对的:
This option forces conflicting hunks to be auto-resolved cleanly by favoring our version. Changes from the other tree that do not conflict with our side are reflected to the
merge result.
但是,当我这样做时git merge -s recursive -X ours master,仍然会得到相同的未解决的删除/修改冲突.我究竟做错了什么?还有另一种自动解决冲突的方法吗?
我有一个主人和我的(网络)应用程序的测试分支.这些项目几乎相同,只有一个设置应用程序的文件,比如说"setup".
每当我将一个分支合并到另一个分支时,我希望该分支保持其版本的设置.也就是说,git不应该尝试将更改合并到该文件.
我按照Pro Git书中的指导创建了一个.gitattributes文件,其中包含"setup merge = ours"行.但是,这不起作用 - 如果我引入冲突,也不能快速合并.
(确切地说:
$: mkdir gitest
$: cd gittest
$: git init
$: echo "setup merge=ours" >> .gitattributes
$: echo "master" >> setup
$: git add setup .gitattributes
$: git commit -a -m ...
$: git branch test
$: git checkout test
$: echo "test" >> setup
$: git commit -a -m ...
$: git checkout master
$: git merge test
Run Code Online (Sandbox Code Playgroud)
预期结果:setup包含单词"master",而git执行ff merge并且setup是"test".)
有很多相关的问题涉及涂抹/清洁过滤器 - 我花了几个小时阅读它们,并尝试各种选项,但仍然失败.我希望我能以某种方式询问我得到的答案对我有用.
具体来说,我已经阅读了大部分这些答案链接回来的页面:
这是一个详细的问题,但摘要是:
DEBUG = false文件存储在一个分支上,DEBUG = true在另一个分支中,使用涂抹/清除过滤器来管理该文件吗?如何?我在bitbucket有各种远程回购.我在Win8上使用SourceTree,将远程存储库克隆到我的笔记本电脑上.我为开发,功能,发布等创建了不同的分支(遵循一个成功的Git分支模型,无论好坏).
我有一个名为的Android java类Dbug.java,它包含一个布尔值,可以在我的代码中打开/关闭各种调试日志记录,模拟等功能.
public static final boolean DEBUG = false;
Run Code Online (Sandbox Code Playgroud)
我希望这个值false在我的"生产"(主)分支上,并且true在我的功能分支上.
在本地工作,我检查了生产分支.我创建了一个debug_flag.txt使用以下内容调用的测试文件:
// false on production branch
// true on other branches
DEBUG = false;
Run Code Online (Sandbox Code Playgroud)
我在我的本地仓库的根目录中创建了一个文件.gitattributes并添加了过滤器引用:
debug_flag.txt filter=debug_on_off
Run Code Online (Sandbox Code Playgroud)
我.git/config用过滤器定义更新了文件:
[filter "debug_on_off"]
clean = sed -e 's/DEBUG = true/DEBUG = false/'
smudge = sed -s …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配置选项)添加到存储库本身?
我的应用程序托管在Heroku上,我也有一个公共github repo.
我的应用程序有一个包含我的amazon S3凭据的配置文件.确保文件被推送到heroku而不是github是很重要的.
所以我想我可以将我的主分支推送到heroku并创建一个单独的github分支,并确保它的.gitignore文件引用我的s3.yml文件.然后我可以做"git push origin github:master"将github分支推送到github.com
这适用于第一次提交.
但后来我切换到我的主分支,写了一些很棒的代码,然后将它全部推送到heroku.然后我切换回我的github分支并执行"git merge master",以便将新代码添加到其中.但这会导致master分支中的s3.yml和gitignore文件被复制到github分支中.提示从头到桌敲打会议.
是否有任何关于如何保持分支同步,同时确保未跟踪文件保持未跟踪的建议.我可以告诉git不要合并不需要的S3.yml文件和不同的.gitignore文件吗?
我在这里鞭打一匹死马吗?我无法证明支付私人github账户的合理性,但我想这个答案将涉及做到这一点....或者转换为projectlocker
我希望这个问题仅仅取决于我的垃圾技巧,并且有一种方法......提前感谢
编辑:::接受的答案是一个很好的解决方案,但我刚刚发现了一个我更喜欢的新解决方案.在这里阅读它:http://docs.heroku.com/config-vars- Heroku的那些聪明的人有一个答案的一切......真是太棒了