- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经把自己弄成了对我来说没有道理的情况。我会尽力描述它。
我有一个开发分支,并且已经通过git checkout develpment && git merge master
将master merge 到了其中。我在这里没有任何 merge 冲突。
我感兴趣的是一个特定的提交,假设它是abcd123
。当我运行git branch --contains abcd123
时,它报告development
和master
都包含abcd123
。当我执行git log
时,它将在abcd123
和development
上的提交列表中显示master
。git show abcd123
显示包含对两个文件的更改。但是我似乎找不到这些变化。当我查看文件时,无论是development
还是master
都没有看到这些更改。当我检查git log -- path/to/file1
时,没有看到abcd123
,与git log -- path/to/file2
相同。
这里发生了什么?如何提交,但更改显然不存在?abcd123
可能最初是在 merge 到development
的另一个分支(master
除外)中引入的。我不知道这是否可以有所作为。
顺便说一句,当我尝试git checkout master && git merge development
时(如上图所示将master
merge 到development
之后),我遇到很多 merge 冲突,包括file1和file2。因此,这似乎表明master
实际上并未 merge 到development
中-如果已经执行了git merge development
,那么git merge master
是否不应该成功?为了引起更多的困惑,git branch --merged development
表示master
已 merge 到development
中。我想这与git merge master
一致..
在这一点上的任何建议,我们将不胜感激。
编辑:在这一点上,问题似乎是由于 merge 失败或以某种方式弄乱了。如果仍然有人在阅读,我认为torek的答案所走的方向似乎是最富有成果的。
最佳答案
这个答案很长,因为这里有很多事情要做。但是,TL; DR摘要可能是您需要--full-history
。
这里有多个单独的问题需要解决:
git log -p
或git show
中看到的内容,通常会导致人们在解释Git存储的内容时走错了路。 git log
命令(尤其是在 merge 周围),纯粹是为了不让您浪费无用的信息。 git merge
的功能可能有些棘手。从原理上讲这很简单,但是大多数人不会马上得到它。 git add
进行第二次提交,第二次提交与第一次提交具有相同的文件,但
git add
覆盖的文件除外。
93aefc
或
badf00d
或
cafedad
),以及父(或上一个)提交的ID。父提交哈希让Git以反向方式将这些东西串在一起:
... <-E <-F <-G ...
...--E--F--G <-- master
master
仍应使用箭头,因为该箭头指向的提交将随时间变化。
G
这样的提交并在不使用
git log -p
或
git show
的情况下进行查看,则将看到完整的每个文件,与存储在提交中的文件完全相同。实际上,这就是我们使用
git checkout
进行 check out 时发生的情况:我们将所有文件全部提取到工作树中,以便我们可以查看和处理它们。但是,当我们使用
git log -p
或
git show
对其进行查看时,Git不会向我们显示所有内容。它只告诉我们发生了什么变化。
git diff
。父
F
和子
G
之间的区别是什么,那就是更改了,因此
git log -p
或
git show
向您显示了什么。
git merge
来获得这些代码,我们可能会这样绘制。我们从两个分支(从某个起点 fork )开始:
H--I <-- development (HEAD)
/
...--E--F--G <-- master
git merge master
.1 Git现在尝试 merge 两个分支。如果成功,它将提交一个新的提交,该提交具有两个父级:
H--I--J <-- development (HEAD)
/ /
...--E--F--G <-- master
development
指向新的 merge 提交
J
。括号中的
(HEAD)
表示这是我们当前的分支。这告诉我们移动了哪个名称:我们进行新的提交(包括任何新的 merge 提交),并且
development
是更改为指向新提交的分支名称。
git log
和
git show
采用不同的方法。当您使用
git log
查看提交时,默认情况下它什么也不显示。它不会选择
I
-vs-
J
,也不会选择
G
-vs-
J
!对于
git log -p
,它什么也没有显示。
git show
命令可以做一些不同的事情,并且效果更好。它运行两个
git diff
,一个用于
I
-vs-
J
,一个用于
G
-vs-
J
。然后,它尝试 merge 两个差异,仅向您显示两个差异。也就是说,在
J
与
I
不同但没有特别有趣的方式的情况下,Git抑制了这种差异。在
J
与
G
不同但没有特别有趣的方式的地方,Git也抑制了这种差异。这可能是最有用的模式,这就是
git show
显示的内容。它仍然是不完美的,但是您在这里无法做的所有事情都是完美的。
git log
添加到
--cc
选项来使
git log -p
做到这一点。或者,您可以通过使用
git log
更改
git show
或
-m
显示 merge 提交的方式(顺便说一下,对于
-m
,请注意一个破折号,对于
--cc
,请注意两个破折号)。
-m
选项告诉Git,出于查看目的,它应该拆分 merge 。现在,Git将
I
与
J
进行比较,以向您展示您通过 merge
G
带来的一切。然后,Git将
G
与拆分后的
J
额外版本进行比较,以向您展示通过 merge
I
带来的所有内容。产生的差异通常很大,但是(或因为)它可以显示所有内容。
git log -- path/to/file1
git log
跳过 merge 一样,它可能在这里跳过更多的事情(但是有一些方法可以阻止Git这样做)。
H--I <-- development (HEAD)
/
...--E--F--G <-- master
development
上有两个提交不在分支
master
上,并且在
master
上有两个提交不在
development
上。提交
E
(以及所有先前的提交)在两个分支上。但是,
E
的提交是很特殊的:这是两个分支上的最新提交。提交
E
是Git所谓的 merge 基础。
git diff
命令:
git diff E I
git diff E G
development
所做的操作”。实际上,如果将它们视为补丁,则为
H
和
I
的总和。第二个对不同文件产生了一组可能不同的更改集,“我们对
master
所做的事情”,并且像以前一样,它实际上是作为补丁的
F
和
G
的总和。
E
的内容,并将其用作结果。无论两个变更集在同一文件中的哪一行接触到同一行,Git都会尝试查看它是否只能获取该变更的一个副本。如果两者都修复了文件
README
的第33行上的单词的拼写,那么Git可以只获取一份拼写修复程序。但是,无论这两个变更集在同一文件的同一行上发生什么变化,但做出不同的变更,Git都会声明“merge 冲突”,将其隐喻性的举动悬而未决,并让您修复所产生的困惑。
git merge --no-commit master
使Git在 merge 所有内容后停止。此时,您可以在编辑器中打开工作树文件,进行更改,将其写回,
git add
更改后的文件,并
git commit
merge 以将并非来自三个输入(基本和两个分支提示)。
git merge-base --all master development
E
的哈希ID。一旦有了它,就可以手动运行
git diff
,以查看每个文件发生了什么。或者,您可以运行单个文件
git diff
:
git diff E development -- path/to/file1
git diff E master -- path/to/file1
master
之前的最新提交的哈希ID替换名称
development
和
git merge
,即使在 merge 后也可以使用。这将告诉您Git认为应该为
path/to/file1
组合什么。反过来,这将告诉您Git是否未看到更改,或者进行 merge 的人是否取代了Git,或是否错误地处理了冲突的 merge 。
H--I--J----K <-- development
/ /
...--E--F--G--L--M <-- master
J
之类的 merge 的两个分支,找到我们可以从两个分支技巧中进行的第一次提交。从
K
开始,我们回到
J
,然后回到
I
和
G
。从
M
开始,我们回到
L
,然后回到
G
。我们发现
G
在两个分支上,因此commit
G
是新的 merge 基础。 Git将运行:
git diff G K
git diff G M
G
。
git log -p
只是跳过 merge 提交。您根本看不到任何差异,好像 merge 完全是魔术。但是当您运行时:
git log -- path/to/file1
git log
documentation中标题为
History Simplification的部分下进行了描述,尽管相当不透明。
git log
从
K
向后走。它找到
J
,它是一个 merge 。然后,它会检查
I
和
G
,在排除了您正在查看的一个文件之外的所有文件之后,将它们与
J
进行了比较。也就是说,它只是在三个提交中比较
path/to/file1
。
path/to/file1
的任何更改,则意味着 merge 结果
J
与输入(
I
或
G
)没有什么不同。 Git将此称为“TREESAME”。如果 merge 的
J
在被简化为一个文件之后,匹配了类似地被剥离的
I
或
G
,则
J
是treetAME到
I
或
G
(或可能是两者)。在这种情况下,Git会选择TREESAME父级或其中的任何一个,并且仅查看该路径。假设它选择的是
I
(沿上排),而不是
G
(沿下排)。
J
传入
F
的更改,则
git log
永远不会显示该更改。
log
命令先查看
K
,然后查看
J
,然后查看但删除
G
,然后仅查看
I
,然后
H
,然后
E
以及任何更早的提交。它根本不会查看commit
F
!因此,我们看不到
path/to/file1
从
F
的更改。
git log
文档,但要强调一些重点:
[Default mode] Simplifies the history to the simplest history explaining the final state of the tree. Simplest because it prunes some side branches if the end result is the same ...
F
中的更改,因此Git宣布它们无关紧要。您不需要看他们!我们将完全忽略 merge 的那一面!
--full-history
完全击败它。这告诉Git不要修剪 merge 的任何方面:它应该查看两个历史记录。这将为您找到commit
F
。添加
-m -p
还应该找到所做更改的位置,因为它将找到所有与文件相关的提交:
git log -m -p --full-history -- path/to/file1
F
中提交)并且不再存在,则丢失的方式只有两种:
git revert
或手动进行了还原)。即使没有path/to/file1
,您也会将其视为触及历史记录中的-m
的提交; -p
将显示差异。 -m
,您也将看到 merge ,但不确定是否有人将 merge 放到了这里。但-m -p
将显示两个父差异,包括应该(但没有)进行更改的差异。 关于Git表示分支已 merge ,但显然不存在更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43927066/
我使用 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
我是一名优秀的程序员,十分优秀!