我在我的测试项目中尝试了Git rebase,以便了解它是如何工作的。可能是我错过了一些微不足道的事情,但我无法弄清楚提交计数如何得到它在日志中显示的值。
我有2个分支机构。大师和开发。任何分支中都没有挂起的提交,这些提交将被推送到远程分支。
这就是它在变形之前的样子:
现在我使用下面的一组命令来执行rebase:
C:\GitRepositories\boney_git_fun>git checkout dev
C:\GitRepositories\boney_git_fun>git rebase master
First, rewinding head to replay your work on top of it...
Applying: dev commit 2
Applying: dev commit 3
C:\GitRepositories\boney_git_fun>git status
On branch dev
Your branch and 'origin/dev' have diverged,
and have 6 and 2 different commits each, respectively.
(use "git pull" to merge the remote branch into yours)
nothing to commit, working directory clean
C:\GitRepositories\boney_git_fun>git push --force
现在我的问题。在下面的日志中,
C:\ GitRepositories \ boney_git_fun> git status 在分支开发 您的分支机构和' origin / dev' 有分歧, 并且分别具有 6和2个不同的提交。
本地开发分支如何在rebase之后进行6次提交?我只能想到本地dev分支中的4个提交,它们是:
有谁能告诉我有关失踪的2次提交?如果需要更多信息,请告诉我。
答案 0 :(得分:2)
诀窍是要意识到一些提交在许多分支上。当您执行rebase时,您更改了标签dev
。现在,master
和 master
现在只有dev
上有 的四个现有提交。 dev
上的另外两个提交已不再在dev
上;相反, new 提交 - 替换两个旧的; 副本 - 现在位于dev
。
以下是提交的两个链(前后,从您的图像转录)及其哈希ID。 1 我还添加了分支标签。请注意,提交的哈希ID是其真正的名称":这是提交的真实身份。它的短日志,例如master commit 4
,只是一个可以复制到新的不同提交的文本字符串。换句话说,那些十六进制字符c4ef678
等的gobbledygook字符串是您应该注意的实际名称。
1 此图形不以git log --graph --oneline
绘制它的方式绘制,它是图像的文字转录。 --graph
选项在git log
中启用拓扑排序,这会更改提交在每行输出中的聚类方式,并尝试以特定方式绘制合并的第一个和第二个父项,这两种情况都不是这样。
<强>之前:强>
* c4ef678 dev commit 3 (dev)
| * 6d98d13 master commit 5 (master)
| * 531ae4f master commit 4
* | 1d1165d dev commit 2
| * 264c713 Merged dev into master
|/|
| * d3145f2 master commit 3
* | e855864 dev commit 1
|/
* e90a213 master commit 2
* abe2416 master branch commit
* 6685b20 README.md created online with Bitbucket
请注意,c4ef678
上的提交1d1165d
和dev
仅为 ;在6d98d13
上提交531ae4f
和264c713
以及d3145f2
和master
仅 ;并且e855864
及以下是两个分支。要查看此内容,请从带有分支名称标签的提交开始 - c4ef678
为dev
,6d98d13
为master
- 并按照点到点的连接线(文本中的星号和星号复制在这里)。您只能在大致向下的方向上移动,但在264c713
之类的合并时,请向下按两个行。
<强>后:强>
* e09e49b dev commit 3 (dev)
* 6a8c956 dev commit 2
* 6d98d13 master commit 5 (master)
* 531ae4f master commit 4
* 264c713 Merged dev into master
|\
* | d3145f2 master commit 3
| * e855864 dev commit 1
|/
* e90a213 master commit 2
* abe2416 master branch commit
* 6685b20 README.md created online with Bitbucket
此图表更易于遵循:提交e09e49b
是dev
的提示,它及其前身6a8c956
仅 < / em> on dev
。好之后,之前的,真的......在那之前,我们有6d98d13
,这是master
的提示并且同时位于master
{1}} 和 dev
。然后我们有531ae4f
,同样在master
和dev
上,依此类推。
我们现在可以看到,git rebase
所做的是复制原始提交c4ef678
和1d1165d
到新提交分别为e09e49b
和6a8c956
。 6a8c956
的父级是6d98d13
,这是master
的提示。 c4ef678
的父亲当然是1d1165d
- 这意味着复制是以相反的顺序发生的,即旧的提交首先被复制,然后是较新的提交:&#34;转发&#34; Git中的顺序实际上是向后的,因为Git以分支标签所标识的 tip-most 提交开始,然后通过查看每个提交的父级来回溯之前的提交。对于合并提交,通过有两个父母来区分, 2 Git查看两个父母。
由于提交一次可以在多个分支上,因此复制两个dev
的行为 - 仅提交两个新提交,这些提交位于 的现有提交的顶部,之前,仅在master
上,现在已更改了内容,以便dev
上的{em>六个提交之前没有dev
:复制的两个,以及只有master
的四个。这些是这里报告的六个:
Your branch and 'origin/dev' have diverged, and have 6 and 2 different commits each, respectively
仅在origin/dev
上的两个 - 这也是您自己的标签,位于您的存储库中;它是您的存储库对origin
上的内容的记忆 - 是复制之前的原始内容。也就是说,如果我们将它们吸引进去,我们就会有一个稍微复杂的图表:
* c4ef678 dev commit 3 (origin/dev)
* 1d1165d dev commit 2
| * e09e49b dev commit 3 (dev)
| * 6a8c956 dev commit 2
| * 6d98d13 master commit 5 (master)
| * 531ae4f master commit 4
| * 264c713 Merged dev into master
| |\
| | * d3145f2 master commit 3
|/ |
* | e855864 dev commit 1
| /
| /
|/
* e90a213 master commit 2
* abe2416 master branch commit
* 6685b20 README.md created online with Bitbucket
如果您在此处扫描连接线,则可以看到哪些提交是dev
上未列入origin/dev
的六个提交,以及origin/dev
上哪两个提交是dev
不在{{1}}。
2 合并提交实际上是对两个或更多父项的任何提交,但是&#34;或更多&#34;案件有点奇怪。这些提交称为章鱼合并,而章鱼合并实际上从未需要,因此它们主要用于炫耀。 : - )