- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我分了master
个分支。有时,我将master
合并到我的分支中以进行更新。
/--B--D--G--H--J--L--M--> dev (HEAD)
/ / /
-----A--C--E--F--I--K---> master
B
,
D
,
H
,
L
,
M
时显示差异。
git diff A
不起作用,因为它包含来自
master
的合并更改。
A
而无需继续向下滚动日志的方法,我将不胜感激。
最佳答案
我不清楚您正在寻找什么。但请注意:
提交存储快照。这意味着提交K
具有完整的源树,该树独立于提交A
,B
,C
等中的内容。同样,提交J
具有完整的快照,与A
或K
或任何其他提交中的内容无关。
(这里的“独立”一词意味着,如果您要求Git检索提交J
,则在创建K
之后是否设法以某种方式更改提交J
并不重要。实际上,不可能更改任何提交,曾经; git commit --amend
似乎更改了提交,但实际上并没有。)
在两个特定的提交上使用git diff
,Git提取两个快照中的每个快照,并进行比较。
简单差异
因此,git diff K M
将向您显示master
的当前提示(提交K
)和dev
的当前提示(提交M
)之间的区别。
您也可以仅拼写此git diff master dev
。
那可能就是您想要看到的内容(再次,对我来说还不是很清楚)。因此,答案1:git diff master dev
。
多个独立差异
另一方面,也许您想要显示的是对提交B
的一个差异,对提交D
的一个差异,对提交H
的一个差异,对提交L
的一个差异和对commit <的一个差异。 cc>。也就是说,您希望一次查看每个非合并的提交,与其(单个)父提交相比。
您可以M
和git diff A B
,依此类推。但是您也可以只git diff B D
和git show B
,依此类推。这会将提交显示为更改,而不是快照。
您可能想知道,如果提交存储快照而不是更改快照,怎么可能呢? (因为大多数其他版本控制系统实际上都存储更改,所以这使很多人感到不安。)对此明显矛盾的答案是git show D
查找所绘制的相同图形。
再次查看提交git show
。之前有什么提交?也就是说,哪个提交在它的左边,向左跟随?提交B
的可能祖先只有一个,即提交B
的单亲。所以A
:
提取提交git show B
的快照,然后
提取提交A
的快照,然后
对比这两个快照。
同样,提交B
只有一个直接祖先(父),即提交M
。所以L
:
提取git show M
的快照,然后
提取L
的快照,然后
对比这两个快照。
如果这是您想要的,那么有趣的问题就变成了:如何以M
,B
,D
,H
和L
顺序找到每个提交的ID?答案很复杂,但是关键命令是M
,它基本上与git rev-list
相同。这些命令(git log
和git log
两者)的作用是遍历提交图。也就是说,您选择一些起点(在本例中为git rev-list
的提示,为M
的提示),并告诉Git向后浏览所有提交,并查看每个提交的父母。
问题在于,当您遇到合并提交(例如提交dev
)时,Git会返回其所有父级。您希望限制Git在进行合并提交时仅查找作为分支J
尖端的父级。 Git对此有一个标记,拼写为dev
。这告诉--first-parent
仅跟随每个合并提交的第一个父项。
我们还希望跳过合并,因此我们可以添加git rev-list
(这不会影响后退过程,它只限制打印的修订版ID以排除合并)。
这将导致答案2a:--no-merges
(稍后将进入“ not A”部分)。
现在,实际上将它与git rev-list --first-parent --no-merges ^A dev
一起使用有点麻烦,因为现在我们必须获取每个提交ID,然后在其上运行git rev-list
。但是,有一种更简单的方法,因为git show
和git rev-list
本质上是相同的命令,并且git log
将每个提交显示为补丁,其作用与git log -p
相同。
这导致答案2b:git show
。我们在这里也不一定需要git log -p --first-parent --no-merges ^A dev
。见下文。
合并提交和合并的差异--no-merges
做的一件特别事情,而git show
没有,是处理显示合并提交的情况,例如提交git diff
。提交J
有两个父级,即提交J
和H
(顺便说一句,这意味着您在进行提交K
之前先进行了提交K
:))。如果运行J
,则Git将提取git diff H J
和H
的快照并进行比较。如果运行J
,则Git将提取git diff K J
和K
的快照并进行比较。但是,如果您运行J
,Git将:
提取git show J
的快照,然后
提取H
的快照,然后
提取K
的快照(合并),最后
产生Git所谓的组合差异。
来自步骤4的组合差异试图以紧凑的方式显示从J
和H
到K
的变化。在压缩更改时,Git会丢弃任何J
或H
中的版本与K
中的版本相匹配的文件。
也就是说,假设文件J
从README.txt
更改为H
。但是,假设J
在README.txt
和K
中相同。换句话说,当您执行J
时,您正在从git merge
进行更改以生成K
,并且在合并的另一端对J
进行了更改。这意味着README.txt
与一个“传入侧”完全匹配,因此组合的diff会完全忽略该文件。
这意味着合并的差异通常根本不显示任何内容,即使合并在新快照中产生了一些变化。要查看这些更改,您必须进行两个比较,而不仅仅是一个。您必须使一个从README.txt
到H
的差异,另一个从J
到K
的差异,而不是依靠组合的差异。
使用J
时,还可以通过将git log -p
或-c
添加到选项中来查看合并的合并差异。但是,如果您不要求这样做,那么Git所做的实际上是可笑的简单:它根本不用理会差异。
因此,这将导致答案2c:--cc
。我们所做的只是删除git log -p --first-parent ^A dev
:现在,我们将看到每个合并的日志消息,但没有差异。--no-merges
这是什么?
这也与您的其他问题有关:
顺便说一句,如果有人知道一种快速查找A而又不用继续滚动日志的方法,我将不胜感激。
答案是为commit ^A
创建一个符号名称。一次找到其ID,然后选择一个名称,例如A
或dev
(但由于正在使用中,请勿使用任何一个!)。
这就是master
和dev
的全部:它们只是提交的符号名,外加额外的属性,作为分支名称,您可以master
符号名并在分支上“结束”。您也可以给git checkout
一个分支名称。您将需要确保不对该分支进行A
并对其进行提交,因为如果这样做,您将成长一个新的分支,而不是仅仅将分支名称保留为指向提交git checkout
。
或者,您可以使标记名称指向提交A
。这几乎与分支名称完全相同。两者的区别是:
这是一个标签名称:您不能将其作为分支签出,因此不能意外更改它。
这是一个标签名称:如果您A
您将其作为标签发送到上游,那么其他所有人也将拥有它。
在这种情况下,第1点对您有利,而第2点可能对您不利,因此,由优势(不能无意更改它)是否值得风险(可能无意间发布)取决于您。
如果您的ID为git push --tags
,则可以:
$ git tag A <id-of-commit-A>
A
。 (您以后可以
A
删除它,尽管如果您不小心发布了它,则可能会继续从上游取回它。)
git tag -d A
命令中的
^A
字符串问题,所有
git log
所做的就是告诉
^A
(因此是
git rev-list
)在到达提交
git log
时停止遍历提交图。提交也未显示(对于
A
,未打印;对于
git rev-list
,未显示在日志输出中)。前缀
git log
符号是“ not”的缩写,即“让我可以从
^
访问所有提交,但不能从
dev
访问所有提交”。添加
A
使Git仅遍历每次合并的第一个父对象,这样我们就不会进入从
--first-parent
合并的提交。
master
语法也可以拼写为
^A dev
。请注意,这对
A..dev
和
git log
均适用,但是对于
git rev-list
而言则有很大不同。)
关于git - 从master merge 后,如何找出分支上的变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39837542/
我使用 Git 有一段时间了,但尽管在博客和教程上花了很多时间,但我仍然无法理解某些功能...:) 我正在与其他人合作一个项目,我的老板为此在 bitBucket 上创建了一个存储库。 我在本地克隆了
有时我会遇到以下问题: 在功能分支中添加一些提交。 从上游更新 master。 想要查看功能分支和 master 之间的差异,但是 git diff master 显示了在 master 中添加/删除
我使用的是 Gerrit 2.4.2 版。我有一个分支 master,我创建了一个名为 newbranch 的新分支。然后我将一些更改推送到远程(Gerrit 的)newbranch。在 Gerrit
假设我们有一个远程存储库并在本地克隆它。 我们 checkout master 分支,所以现在我们有本地 master 和一个 Remote remotes/origin/master . 然后我必须
我有一个项目,其中开发分支使用 CocoaPods,但其中一位开发人员决定删除它并改用 Carthage。 feature 分支使用的是 CocoaPods,因为它是在 develop 分支转换之前一
我有一个有问题的 master 分支需要调试。为此,我想插入一堆调试程序(例如,打印变量),查明错误并应用修复程序。稍后,我想将修复 merge 到 master 分支中,但我不想跳过调试更改。 #
我有一个 master 分支,我正在其中 push 我的最新开发。 现在在某个时候,我确实从 master 分支发布并创建了名为 release1 的新分支。 现在我在master分支上做新的开发 与
我正在尝试使我的一些标准工作流程自动化,我发现自己经常做的一件事是将对远程 master 分支的更改 merge 到我自己的本地分支并推送结果。 所以步骤如下: 转为大师 从远程 pull 更改 切换
使用 Gerrit 很容易意外地将开发分支中的不稳定代码 merge 到稳定分支中: $ git checkout develop $ commit $ git push origin HEAD:re
我有一个正在进行的项目,我正在雇用承包商来帮助我处理代码的某些部分。问题是我不想让任何一个承包商看到所有这些。 我可以在 GitHub 上为他们分配私有(private)存储库下的分支吗?这需要命令行
SVN 分支 Branch 选项会给开发者创建出另外一条线路。当有人希望开发进程分开成两条不同的线路时,这个选项会非常有用。我们先假设你已经发布了一个产品的 1.0 版本,你可能想创建一个新的分支,
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 提供事实和引用来回答它. 2年前关闭。 Improve this
有没有办法从特定的修订版中创建(svn)分支, 因为我想跳过提交历史中的一些修订(在新分支中)。 例如,我有从 1 到 1590 的修订,我想创建一个新分支并跳过提交(从 1504 到 1574 )和
到目前为止我看到的所有 svn 分支的例子都是这样的 svn cp -m 'Making test branch' svn://svnrepo/hellosite svn://svnrepo/hell
当我尝试使用 Sonar 扫描仪分析我的项目时,扫描失败并显示以下错误消息: Caused by: Branch does not exist on server: develop 显然,这只发生在它
在我的 Mercurial 存储库中,不知何故,有人输入了空白分支名称: 如果我hg id -r 2004,我确实得到空白文本。现在的问题是,这会导致我们的Redmine安装出现问题,因为它无法同步存
我有以下代码片段: srcaddr >= inet_ntoa . fromJust dstaddr >= inet_ntoa . fromJust -- I want to perform actio
在我的项目中,我有用于工作的本地分支和网络驱动器上的分支我在本地一号和网络一号之间做了“绑定(bind)分支”我的想法是使用绑定(bind)选项自动备份每个本地提交。 我在本地分支提交文件后,我在网络
我想创建一个脚本,根据变量的状态使用不同的表和命令执行不同的操作。在 T-SQL 中,我会这样做: DECLARE @whatToDo INT = 1; IF @whatToDo = 1 BEGIN
Write a program that reads input up to # and reports the number of times that the sequence ei occurs
我是一名优秀的程序员,十分优秀!