用Git重新定基
我已经看过很多关于如何使用Git重新设置基址的文章,这是有意义的……或者至少我认为是有意义的。然而,我正在努力解决以下问题 对于此场景,我们有以下分支:用Git重新定基,git,rebase,git-rebase,git-pull,Git,Rebase,Git Rebase,Git Pull,我已经看过很多关于如何使用Git重新设置基址的文章,这是有意义的……或者至少我认为是有意义的。然而,我正在努力解决以下问题 对于此场景,我们有以下分支: 硕士(本地) 来源/主要 杰吉斯(当地) 起源/杰吉斯 好的,现在让我们假设origin/master领先1个commit。因此,我从文章中得知,我正在工作的开发团队将在杰吉斯分支上做以下工作: $ git add ... $ git commit ... $ git status (ensure everything is up-to-d
- 硕士(本地)
- 来源/主要
- 杰吉斯(当地)
- 起源/杰吉斯
$ git add ...
$ git commit ...
$ git status (ensure everything is up-to-date locally)
$ git pull (again, check and ensure that everything is ready to go)
$ git pull --rebase origin master
$ git push (defaulting to origin/jheigs)
$ git push --force origin jheigs (?)
git-pull
:这是为了方便,但结果是不方便。它只运行git fetch
,然后执行第二个git命令,该命令将影响您签出的任何分支。有时我不想或不需要取回;其他时候,我想在执行影响当前分支的任何第二个命令之前,先看看fetch运行时发生了什么
正如您可能已经读到的,git-rebase
实际上是关于复制(一些)提交的。您的存储库中有一些提交集合,而现在,无论出于何种原因,一些提交已失去光泽,您希望进行更新、更好、更漂亮、更闪亮的提交
使所有这些都有意义的方法是绘制提交图。请记住,不同的存储库中有多个克隆,它们大多包含相同的提交集,但所涉及的提交集并不完全相同
绘制您自己的存储库的提交
你可以让Git帮你做这件事:Git log--all--decoration--oneline--graph
,或者Git log(和狗一起)。不过,一开始用手做是很好的锻炼。另外,当你用手做的时候,你可以水平地画出来,这会更有意义
请记住,由其唯一哈希ID标识的每个提交都是只读的。每个提交都指向其父提交。分支名称(如master
或jheigs
)或远程跟踪名称(如origin/master
或origin/jheigs
)指向(记录)提示提交的哈希ID,Git从这些提示向后工作:
...--C--D--E <-- master
\
F--G <-- jheigs (HEAD)
将F
复制到F'
后,现在可以将G
复制到新的和改进的G'
:
F'-G' [new and improved!]
/
...--C--D--E <-- master
\
F--G <-- jheigs (HEAD)
F'-G' <-- jheigs (HEAD)
/
...--C--D--E <-- master
\
F--G [abandoned]
F'-G' <-- jheigs (HEAD), origin/jheigs
/
H <-- origin/master
/
...--C--D--E <-- master
昨天如此光鲜亮丽的陈旧、乏味的F
和G
提交现在都是垃圾,取而代之的是光鲜亮丽的新F'
和G'
。这是因为您的分支名称jheigs
现在指向新复制提交的最后一个
1此复制是通过git cherry pick进行的。根据您使用的rebase命令的不同,它实际上可能是通过
git cherry pick
完成的
还涉及到另一个存储库:
fetch
和push
上面的图表是针对您的存储库的,但这里还涉及第二个存储库。它们有自己的分支名称和提交。您拥有的提交以及它们也拥有的提交共享提交哈希ID。你可能有一些承诺,但他们没有;他们可能有一些承诺,而你没有
如果您认为他们可能有您没有的提交,那么应该运行git-fetch
或git-fetch-origin
。这让你的Git调用他们的Git,在名称origin
下列出的URL上。您的Git调用他们的Git,并让他们按照分支名称列出所有提交(通过哈希ID)
如果他们有你没有的提交,你的Git现在会下载这些提交。您的Git也会更改它们的分支名称,例如master
或jheigs
,以便它们读取origin/master
和origin/jheigs
。这些新名称不会干扰您的分支名称
现在您已经有了所有的提交,再加上以前的所有提交,您的存储库可能看起来是这样的,让我们假设您还没有完成git rebase:
H <-- origin/master
/
...--C--D--E <-- master
\
F--G <-- jheigs (HEAD), origin/jheigs
请注意,origin/*
名称均未移动,您自己的master
也未移动。但是,它们的jheigs
,您称之为origin/jheigs
仍然记得提交G
现在,您需要git push——强制jheigs
,告诉他们:抛弃提交F
和G
,以支持新的F'
和G'
。一旦他们同意这样做,你的Git就会记住他们的j指向G'
:
F'-G' [new and improved!]
/
...--C--D--E <-- master
\
F--G <-- jheigs (HEAD)
F'-G' <-- jheigs (HEAD)
/
...--C--D--E <-- master
\
F--G [abandoned]
F'-G' <-- jheigs (HEAD), origin/jheigs
/
H <-- origin/master
/
...--C--D--E <-- master
F'-G'首先,我会(并且会)完全避免git-pull
,或者主要避免:这是为了方便,但结果是不方便。它只运行git fetch
,然后执行第二个git命令,该命令将影响您签出的任何分支。有时候我不想