我想合并两个分离了一段时间的分支,并想知道哪些文件被修改了。
找到了这个链接:http://linux.yyz.us/git-howto.html,这非常有用。
比较我遇到的分支的工具有:
- git diff master..branch
- git log master..branch
- git shortlog master..branch
想知道是否有类似于"git status master..branch"的东西来只查看两个分支之间不同的文件。
在不创建新工具的情况下,我认为这是您现在能够做到的最接近的方法(当然,如果一个文件被修改多次,它将显示重复):
- git diff master..branch | grep"^diff"
想知道我是否错过了什么…
- 还有多少人认为这个问题的标题有误导性?它实际上是关于查找两个分支之间的文件差异。我来这里寻找的是如何在同一个分支上看到两个修订版之间的文件差异。还是只有我一个人?
- @桑德帕纳特:和吉特没有区别。你总是指个人承诺。
- @Samuelo'Malley我是Git的新手,考虑到看似常见的分支策略,其中所有分支最终都合并到主分支,并最终推出主分支。现在,考虑到一个卷展的事件,生产已经在master,但是在tip后面(如果最后一个卷展发生在最后一个master合并之后,经过一次修订),我想看看这两个修订之间的区别,以找出将要推出的内容。我不想看上次合并的分支机构。如果我错了就纠正我。
- @sandepanath:您可以选择下面的答案,而不是使用分支名称,而是指定提交ID。如果您在转出时创建标记,甚至可以通过它们的标记名引用提交。
- @SandePNATH不能比较两个分支,必须指定修订。所以比较两个分支就是比较两个修订版。
将当前分支与master分支进行比较:
1
| $ git diff --name-status master |
要比较任意两个分支:
1
| $ git diff --name-status firstbranch..yourBranchName |
阅读官方文件中有关git diff的内容。
- 左边的每个指数是什么意思(我看到很多M和D)?
- @用户446936-您可以在git status man [email protected]/pub/software/scm/git/docs/git-status.html中看到字母的含义-特别是m==modified,d==deleted
- 同样的语法也适用于将一个分支与一个标记或一个标记与另一个标记进行比较。
- git diff --name-status your_branch...master输出自创建分支以来在master上发生的更改。
- 这里的双点运算符是多余的,因为diff是成对的。
- 我得到未知的修订或路径不在工作树中。
- 别忘了使用所有三(3)个催眠(又名破折号)!是的,Git喜欢连字符。
- afaik,如果您运行命令,然后没有任何事情发生,即没有创建任何行,这意味着没有区别。
- 如果git命令使用起来很模糊,而且大多数命令使用起来都很模糊,那么很明显,fatal: bad revision 'master..branchName'的投票结果是否定的,回答问题需要的不仅仅是发布随机代码片段。
- git diff --name-status master..staging致命:不明确的参数'master..staging':未知的修订或路径不在工作树中。使用"--"将路径与修订分开,如下所示:"git[…]--[…]"
- git diff --name-status staging..master致命:不明确的参数'staging..master':未知修订或路径不在工作树中。使用"--"将路径与修订分开,如下所示:"git[…]--[…]"
- 如果您的工作目录是比较分支,那么实际上可以做得更好:git diff --name-status master。
- 如果这两个分支中的任何一个在本地不存在,则会出现类似于fatal: ambiguous argument '1stBranch..2ndBranch': unknown revision or path not in the working tree.的错误。检查分支机构以解决此问题:git checkout 1stBranch&git checkout 2ndBranch
- 如何将输出限制为一个文件夹?
尝试
1
| $ git diff --stat --color master..branchName |
这将为您提供有关每次更改的更多信息,同时仍使用相同的行数。
如果您要以另一种方式合并,您还可以翻转分支以更清楚地了解差异:
1
| $ git diff --stat --color branchName..master |
- 如果(强烈推荐,imho)git color已打开(config --global color.ui true),则可以跳过--color。(我有LKS-懒惰键盘综合症。)
- 我同意你的看法!顺便说一句,我想说,git config --global color.ui true是完整的。
- 不工作,抛出错误:fatal: ambiguous argument 'master..branchName': unknown revision or path not in the working tree.。
- @汤姆和第225;?Zato很抱歉,但是您需要将"branch name"与分支的名称交换。
还要记住,Git具有廉价且容易分支的特性。如果我认为合并可能有问题,我会为合并创建一个分支。因此,如果master有我想要合并的更改,而ba是我的分支,需要master提供代码,我可以执行以下操作:
1 2 3 4 5 6 7 8 9
| git checkout ba
git checkout -b ba-merge
git merge master
.... review new code and fix conflicts....
git commit
git checkout ba
git merge ba-merge
git branch -d ba-merge
git merge master |
最终的结果是,我必须先在一个废弃的分支上尝试合并,然后再和我的分支拧在一起。如果我把自己搞得一团糟,我可以删除ba-merge分支,重新开始。
- 令人惊叹的。我从来没有想过要这样做。我认为这应该被视为合并时"最佳实践"的一部分。
- 当你把巴马奇合并回巴,有没有可能再次解决冲突?
- 不,你已经解决了。
- @埃里克安德森对,这是个图表。SVN像口香糖一样粘在书桌下面。谢谢。
- 如果BA合并已经有了master,为什么需要执行最后一步"git merge master"
- 你可以把它关掉。唯一有用的原因是,当您正在审查代码和修复冲突时,如果新的东西登录到master中,它将是有用的。
- @埃里克安德森:如果合并过程中出现故障,你为什么需要一个分支机构呢?仅仅取消合并更改就足够了吗?比如,git reset --hard; git clean -fd?
- 是的,你不需要删除它。很多年前,当我对Git了解较少时,我就发布了这个消息。取消或重置可能是您想要的。
- 我一直使用"git merge foo--no commit--no ff",然后git merge--abort;git add.;git stash;git drop;:)
如果有人试图从两个分支生成diff文件:
1
| git diff master..otherbranch > myDiffFile.diff |
- 这一点非常有用,尤其是对于包含很多差异的大型分支。
还有一种基于GUI的方法。
你可以使用Gitk。
运行:
右键单击分支的提交,然后在弹出菜单中选择标记此提交。
右键单击另一个分支的提交,然后选择diff this->marked commit或diff marked commit->this。
然后在右下面板中会有一个已更改的文件列表,在左下面板中会有差异详细信息。
- @我上传了一段视频来演示如何操作。希望对你有帮助。
- 哇,就我而言,我觉得很特别。我已经在delicious.com上做了书签,以备将来参考和额外的google foo。
还有一个选择,在这种情况下使用meld:
1
| git difftool -d master otherbranch |
这不仅允许查看文件之间的差异,还提供了指向和单击特定文件的简单方法。
- 可能希望将meld设置为默认difftool:git config--global diff.tool meld
- 这是我最喜欢的,因为它将使用您配置的任何difftool。
- OSX不支持。:
- @米凯什。请检查此答案stackoverflow.com/a/12815806/151918,其中包含OSX的说明。它至少对我有用,希望能有所帮助。
- 很好。但是,-d选项的作用是什么?
- @scotty.net将修改后的文件复制到临时位置,并对其执行目录差异。此模式在启动diff工具之前从不提示。git scm.com/docs/git difftool git difftool---dir diff
请注意,Git可以很容易地尝试合并,如果您不喜欢这个结果,就可以避免任何问题。这可能比预先寻找潜在的问题容易。
- 大卫,这是一个很好的观点,虽然很高兴知道眼前发生了什么…
如果只在某些文件中查找更改,则:
1
| git diff branch1 branch2 -- myfile1.js myfile2.js |
Branch1是可选的,如果未提供Branch1,则默认情况下将考虑当前分支(您所在的分支)。例如:
1
| git diff master -- controller/index.js |
当以协作方式工作或同时在多个功能上工作时,通常上游或甚至主控形状都包含分支中未包含的工作,并且这些工作将错误地出现在基本差异中。
如果你的上游可能已经移动,你应该这样做:
1 2
| git fetch
git diff origin/master... |
仅使用git diff master就可能包含或无法包含相关更改。
如果您使用的是Intellij思想,那么还可以将任何分支与当前工作分支进行比较。有关详细信息,请参阅http://www.jetbrains.com/idea/webhelp/merging deleting and comparising branches.html_d288093e3827。这也是免费版本。
这里有很多答案,但我想添加一些我常用的答案。如果你在其中一个分支,你想比较,我通常做以下之一。为了这个答案,我们将说我们在我们的第二分支。取决于你当时需要什么样的视图,这取决于你选择哪种视图,但大多数时候我使用的是这两种视图中的第二种。如果您试图还原到原始副本,第一个选项可能很方便——无论哪种方法,都可以完成任务!
这将把master与我们所在的分支(第二个分支)进行比较,原始代码将是添加的行,新代码将被视为删除的行。
或
这还将把master与我们所在的分支(第二个分支)进行比较,原始代码将是旧行,新代码将是新行。
我们可以说有两个分支
- A(您工作的分支机构)
- B(要与之比较的另一个分支)
在分支A中,您可以键入
那么这将给你一个输出
重要的是
分支A中存在绿色文本
分支B中存在红色文本
对于寻找GUI解决方案的人来说,Git-Cola有一个非常好的"分支差异查看器(diff->branches….)"。
如果您喜欢图形用户界面并且正在使用Windows,这里有一个简单的方法。
下载WinMerge
将这两个分支签入不同的文件夹
使用WinMerge逐文件夹比较。如果其中一个分支是您正在处理的分支,那么您也可以轻松地进行修改。
1
| git diff revision_n revision_m |
如果revision_n和revision_m是连续的提交,那么它的输出与git show revision_m
您还可以使用例如TortoisGit轻松比较更改文件的分支。只需单击浏览引用并选择要比较的分支。
例如,如果您将分支与master进行比较,您将得到一个结果列表,其中列出了如果您决定将分支合并到master中,将在master中更改的文件。
请记住,如果您将master与分支进行比较,将得到不同的结果,并将分支与master进行比较。