当前位置:  开发笔记 > 编程语言 > 正文

有没有git-merge --dry-run选项?

如何解决《有没有git-merge--dry-run选项?》经验,为你挑选了11个好方法。

我正在合并一个可能有很多冲突的远程分支.我怎么知道它是否会有冲突?

我没有看到像什么--dry-rungit-merge.



1> mipadi..:

如前所述,传入--no-commit标志,但为了避免快进提交,也传入--no-ff,如下所示:

$ git merge --no-commit --no-ff $BRANCH

要检查分阶段的变化:

$ git diff --cached

您可以撤消合并,即使它是快进合并:

$ git merge --abort


@ dave1010你永远不应该在实时网络服务器上处理合并!这就是您的开发盒所针对的!修复"prod"分支,然后将其推送到真正的网络服务器.
这很棒,但仍会修改您的工作副本.如果您的repo是实时网络服务器,那么您可能正在提供有冲突的文件.
是的,但是像`git merge --only-if-there-wont-be-any-conflicts`或`git diff --show-conflicts `这样的东西真的很方便.羞耻它还不可能,或者我错过了什么?
如果你在一个实时/生产服务器上工作,除了`git pull --ff-only`你永远不想做任何事情!
在不影响工作副本的情况下,您无法真正进行合并.
@donquixote意外地推动了局部变化并不像以前那样容易出错; 默认情况下,任何最近的(c.2010)版本的git都会拒绝"推送"到签出的分支/非裸仓库.http://stackoverflow.com/q/2816369/404960
akostajti下面的方法(http://stackoverflow.com/a/6283843/116596)要好得多,不需要弄乱你的工作副本.
如果可以合并,答案应该提到退出状态为"0".
NVM.弄清楚了.你叫`git merge --abort`

2> 小智..:

我只需要实现一个自动查找存储库与其远程存储库之间冲突的方法.此解决方案在内存中进行合并,因此它不会触及索引,也不会触及工作树.我认为这是解决这个问题最安全的方法.以下是它的工作原理:

    将远程数据库提取到存储库.例如: git fetch origin master

    运行git merge-base: git merge-base FETCH_HEAD master

    运行git合并树:git merge-tree mergebase master FETCH_HEAD(mergebase是mergebase在先前步骤中打印的十六进制ID)

现在假设您要将远程主服务器与本地主服务器合并,但您可以使用任何分支.git merge-tree将在内存中执行合并并将结果打印到标准输出.Grep的模式<<>>.或者您可以将输出打印到文件并检查.如果你找到一条以"两者都改变​​"开头的行,那么很可能会发生冲突.


这个答案被低估了,恕我直言,因为它是一个干净的解决方案,没有触及工作副本或索引.
顺便说一句,第2步和第3步可以合并为一步,使用Linux控制台的反引号操作符,它就地评估其内容:`git merge-tree \`git merge-base FETCH_HEAD master \`FETCH_HEAD master`
添加到.gitconfig中的[alias]:dry ="!f(){git merge-tree \`git merge-base $ 2 $ 1 \`$ 2 $ 1;}; f"#check如何将dev合并到master中: git干开发大师
我最喜欢的GIT系列:``git merge-tree`git merge-base clieop master` clieop master | grep -A3"两者都改变​​了"``简直太棒了!+100
在测试中,我发现在两个分支中的'更改'标记的合并,两个分支修改同一个文件,即使它们不会导致合并冲突.为了识别实际的冲突我发现有必要grep这样开始的冲突标记:`+ <<<<<<<
3> 小智..:

我对此的简单蛮力解决方案是:

    创建一个"预主"分支(当然是硕士)

    将您想要的所有内容合并到此预主程序中.
    然后你可以看到合并是如何发生而不触及主人.

    将pre-master合并为master OR

    将所有想要释放的分支合并为主人

无论如何,我会遵循@ orange80的建议.


我喜欢@akostajti解决方案,但这是另一个被低估的选择.事实上,我更喜欢防守并创建一个新的临时分支(当然只有当我预料到冲突时,否则它会是一种过度杀伤),如果出现问题,只需将其删除即可.
imo,这应该是公认的解决方案。它快速,简便,安全,可逆,直观,并且只要在开始之前没有任何未提交的更改,就不会有副作用。

4> Brian Philli..:

撤消与git的合并是如此简单,你甚至不应该担心干运行:

$ git pull $REMOTE $BRANCH
# uh oh, that wasn't right
$ git reset --hard ORIG_HEAD
# all is right with the world

编辑:如下面的评论所述,如果您的工作目录或临时区域有变化,您可能希望在执行上述操作之前隐藏它们(否则它们将在git reset上面的内容后消失)


@Tchalvak还有reflog.
简单地检查合并是否快进(FF)是检查`git branch --contains HEAD`列表甚至更直接的问题,只需使用`git merge --ff-only`
git reset --hard是git拥有的为数不多的无信息删除命令之一,因此应谨慎使用.因此,-1
`--dry-run`不会"简单地检查合并是否会快进".它将返回合并的确切输出:文件,冲突等.是否ff不是真的有趣,是吗?
怎么样`git stash; git reset --hard`?@BrianPhillips

5> Okonomiyaki3..:

我为这样做了一个别名并且像魅力一样,我这样做:

 git config --global alias.mergetest '!f(){ git merge --no-commit --no-ff "$1"; git merge --abort; echo "Merge aborted"; };f '

现在我打电话

git mergetest 

找出是否有任何冲突.



6> timh..:

只是将当前分支与远程分支区分开来,这将告诉您在执行拉/合并时会发生什么变化.

#see diff between current master and remote branch
git diff master origin/master


这只会告诉你两个分支之间的区别,它不会告诉你合并的结果是什么.这是一个重要的区别,因为合并在某些情况下会根据提交时间自动从不同的分支中进行更改.所以从本质上讲,做一个差异可能会让你认为你的一些变化会在现实中被还原,合并过程会自动对旧版本进行更新.希望有道理.
这不会告诉你是否会发生任何冲突......但它会让你大致了解如果你做了拉/合并会发生什么.
要构建@mirthlab的评论,如果有人先前使用"我们的"合并策略(或其他一些手动合并修正)进行合并,那么差异和合并之间会有显着差异; 差异还会显示已被计为"合并"的差异.

7> ArnaudR..:

我使用request-pull git命令来执行此操作.它允许您查看合并时可能发生的每个更改,但不在本地或远程存储库上执行任何操作.

例如,假设您要将名为"feature-x"的分支合并到主分支中

git request-pull master origin feature-x

将向您展示会发生什么(没有做任何事情):

The following changes since commit fc01dde318:
    Layout updates (2015-06-25 11:00:47 +0200)
are available in the git repository at:
    http://fakeurl.com/myrepo.git/ feature-x
for you to fetch changes up to 841d3b41ad:
----------------------------------------------------------------
john (2):
    Adding some layout
    Refactoring
ioserver.js            |   8 +++---
package.json           |   7 +++++-
server.js              |   4 +--
layout/ldkdsd.js       | 277 +++++++++++++++++++++++++++++++++++++
4 files changed, 289 insertions(+), 7 deletions(-)
create mode 100644 layout/ldkdsd.js

如果添加-p参数,您还将获得完整的补丁文本,就像您在每个更改的文件上执行git diff一样.


你可以通过在命令行选项中添加`master`和`origin`来做得更清楚一点,如果我在例如本地`branch1`上并想要做一个`request-pull`,那该怎么办呢?本地功能分支`branch2`?我还需要`origin`吗?当然,人们总是可以阅读文档.

8> 小智..:

我很惊讶没有人建议使用补丁.

假设你想从测试合并your_branchmaster(我假设你已经master签出):

$ git diff master your_branch > your_branch.patch
$ git apply --check your_branch.patch
$ rm your_branch.patch

这应该够了吧.

如果你得到错误

error: patch failed: test.txt:1
error: test.txt: patch does not apply

这意味着补丁不成功,合并会产生冲突.没有输出意味着补丁是干净的,你可以轻松合并分支


请注意,这实际上不会更改您的工作树(当然,除了创建补丁文件,但之后您可以安全地删除它).从git-apply文档:

--check
    Instead of applying the patch, see if the patch is applicable to the
    current working tree and/or the index file and detects errors. Turns
    off "apply".

对于那些比我更聪明/更有经验的人,请注意:如果我在这里错了,请告诉我这个方法确实表现出与常规合并不同的行为.看起来奇怪的是,在这个问题存在的8年多时间里,没有人会提出这个看似明显的解决方案.



9> 小智..:

这可能很有趣:来自文档:

如果您尝试合并导致复杂的冲突并想重新开始,则可以使用git merge -abort进行恢复.

但你也可以采用天真(但很慢)的方式:

rm -Rf /tmp/repository
cp -r repository /tmp/
cd /tmp/repository
git merge ...
...if successful, do the real merge. :)

(注意:只有克隆到/ tmp才会起作用,你需要一个副本,以确保未提交的更改不会发生冲突).


如果你需要的只是锤子...... :) +1

10> Jason McKind..:

我知道这是一个老问题,但它是第一个出现在Google搜索上的问题.

Git在合并时引入了--ff-only选项.

来自:http://git-scm.com/docs/git-merge


--ff只

拒绝以非零状态合并和退出,除非当前HEAD已经是最新的,或者合并可以解析为快进.

执行此操作将尝试合并和快进,如果它不能中止并提示您无法执行快进,但保持您的工作分支不受影响.如果它可以快进,那么它将在您的工作分支上执行合并.此选项也可用git pull.因此,您可以执行以下操作:

git pull --ff-only origin branchA #See if you can pull down and merge branchA

git merge --ff-only branchA branchB #See if you can merge branchA into branchB



11> nelsonenzo..:

我使用git log来查看master分支的功能分支上发生的变化

git log does_this_branch..contain_this_branch_changes

例如 - 查看已合并/未合并到master的功能分支中的提交:

git log master..feature_branch

推荐阅读
臭小子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有