被git diff搞糊涂了
我想生成分支和主分支之间差异的补丁文件。但是这个分支的使用时间很长,所以我只是从master那里合并了一个分支来更新它。如果我开始在Bitbucket中创建pull请求,我可以很好地看到这些差异。但是当我在我的分支上执行被git diff搞糊涂了,git,bitbucket,diff,patch,git-diff,Git,Bitbucket,Diff,Patch,Git Diff,我想生成分支和主分支之间差异的补丁文件。但是这个分支的使用时间很长,所以我只是从master那里合并了一个分支来更新它。如果我开始在Bitbucket中创建pull请求,我可以很好地看到这些差异。但是当我在我的分支上执行git diff master..时,我看到的差异并不存在。它们是合并的结果吗?我如何获得与Bitbucket相同的差异列表?仅是我的分支和主分支之间的差异?TL;博士 我不清楚您的困惑是从哪里开始的,但值得注意的是,使用git diff与生成pull请求是完全不同的。最终,它将
git diff master..
时,我看到的差异并不存在。它们是合并的结果吗?我如何获得与Bitbucket相同的差异列表?仅是我的分支和主分支之间的差异?TL;博士
我不清楚您的困惑是从哪里开始的,但值得注意的是,使用git diff
与生成pull请求是完全不同的。最终,它将归结为在正确的特定提交上运行git diff
。诀窍在于找到正确的答案
长的
存储库中有什么
首先,记住Git保留的是什么。在某种基本级别上,Git关心的是以提交形式保存的源快照。提交包含某个源树的完整快照。提交还包含一些元数据:提交人的姓名和电子邮件地址,有时两个人(作者和提交人:可能相同,也可能不同)以及提交时间戳;父提交ID,以便Git可以将提交序列显示为谁(作者)做了什么(见下文)以及何时(时间戳)的历史记录;还有一条日志信息,提供作者对他们为什么这么做的描述
由于每次提交都是一个完整的快照,为了查看谁实际做了什么,我们必须使用类似于gitdiff
的命令。假设我们在分支master
上连续完成了两次提交,如下所示:
(parent) (child)
df731ac <- 049a12b <-- master
添加一个新的提交只需编写提交D
,将C
作为其父级,并使master
指向D
:
A--B--C--D <-- master
比如说。但您必须找到这些提交,或者Git将转换为这些提交的名称
(不管你说git diff A B
还是git diff A..B
,它们的意思是完全相同的。这与git log
和大多数其他git命令不同:只有git diff
对两个点语法有这种特殊处理。
但是,如果名称丢失,这是git diff和其他git命令所共有的。)
1Git的
git diff
可以产生一种称为组合diff的东西,但这些东西相当复杂,在这里不相关
旁白:
git show
和git log-p
我在上面提到了git show
。git show
所做的是为您自动查找父提交,然后首先显示元数据、作者(姓名、电子邮件、时间戳)和日志消息,然后显示父级与子级之间的差异
当您运行git log-p
时,这类似于在每次提交时运行git show
,从最子级开始并向后运行(注意git log
默认从头开始)也就是说,首先,git log
显示当前分支的tip commit,就像通过git show HEAD
一样,然后它显示commit的父级,就像通过git show
一样,然后它显示父级,依此类推
有一个相当大的区别:git show
将在任何合并提交时调用特殊的组合diff机制,而git log
默认情况下只显示日志消息,跳过任何区分合并的尝试。(有一些标志可用于更改此行为。)
拉取请求
Pull请求更复杂,因为为了发出Pull请求,您必须向能够运行git Pull
2的其他人打开存储库——这就是术语的来源,也是Pull请求的原始含义,或者查找或创建共享存储库,将一些提交推送到该共享位置,然后然后让另一个人从共享位置获取您的提交。我将忽略“pull request”的原始含义——本质上只是一封电子邮件,要求其他人运行git fetch
——而是跳转到这些网站处理它的方式
对于像GitHub和Bitbucket这样的服务,现在至少还涉及到另外两个存储库。它们甚至运行了一个试用合并(虽然这并不重要,只是为了验证拉取请求是否合理)。我对GitHub比Bitbucket更熟悉(我自己使用GitHub),但至少从足够高的层次来看,两者的工作方式相同
在您考虑拉取请求之前,您必须“fork”存储库。fork是一个克隆,但是有一些额外的内存,关于它是从哪个存储库克隆来的。3在幕后,以一种你通常不必关心的方式,4提供商进行大量的存储共享,因此每个fork在提供商的服务器上占用很少的空间
不过,这种分叉正是涉及到两个额外存储库的原因。这为我们提供了三个必须跟踪的存储库:
- 您自己的Git存储库,在您的计算机上。这是您的,您可以随意使用。您也可以在这里运行
Git diff
- 原始存储库的分支。您的机器和Git将把它称为
源
远程
- 原始存储库。此存储库中不一定有任何名称。您可以也可能应该添加另一个远程存储库,在其他示例中称为
上游
。并不总是要求您添加此存储库,但假设您添加了。如果没有,请运行:
git remote add upstream <url>
而你git推原始主机,你让你的git调用他们的git并说“我想让你设置你的git diff 0123456 fedcba9
git remote add upstream <url>
...--H--I--J <-- master
...--H--K <-- master
K [abandoned]
/
...--H--I--J <-- master