Git:如何在不添加合并提交的情况下从另一个存储库中提取
这是一个多个开发人员正在工作的项目。假设所有工作都在主分支上完成,并且存在一个远程回购,该回购具有以下历史记录:Git:如何在不添加合并提交的情况下从另一个存储库中提取,git,version-control,git-merge,git-pull,git-fetch,Git,Version Control,Git Merge,Git Pull,Git Fetch,这是一个多个开发人员正在工作的项目。假设所有工作都在主分支上完成,并且存在一个远程回购,该回购具有以下历史记录: A --- B --- C 今天,我将这个存储库克隆到我的一个沙盒中(我们称之为work\u sb01)。我做了一些工作,并在本地提交了我的更改(可能只有一个提交或多个提交)。此沙箱的Git历史记录如下所示: A --- B --- C --- X A --- B --- C --- D --- E --- X 两天后,我将同一个存储库克隆到另一个沙箱中(我们称之为work\u
A --- B --- C
今天,我将这个存储库克隆到我的一个沙盒中(我们称之为work\u sb01
)。我做了一些工作,并在本地提交了我的更改(可能只有一个提交或多个提交)。此沙箱的Git历史记录如下所示:
A --- B --- C --- X
A --- B --- C --- D --- E --- X
两天后,我将同一个存储库克隆到另一个沙箱中(我们称之为work\u sb02
)。正如预期的那样,回购头已经移动,因此历史现在可能看起来像这样:
A --- B --- C --- D --- E
我需要能够将我在work\u sb01
中所做的更改拉入work\u sb02
。我目前正在使用以下命令执行此操作:
cd <path_to_work_sb02>
git pull <path_to_work_sb01> master
如果在
path_to_work_sb02
apull--rebase path_to_work_sb01
中执行操作没有给出正确的顺序,您可以。。。考虑做相反的事情:
- pull--从
path\u到\u work\u sb01path重新设置基址path\u到\u work\u sb02
- 将
为path\u重命名为\u work\u sb01
path\u重命名为\u work\u sb02
- 更改其远程
URLorigin
- 从那里继续工作
- 以下是在工作中实现这一点的正确方法\u sb02:
cd <path_to_work_sb02>
git remote add sb01 <path_to_work_sb01>
git fetch sb01
git checkout master
git rebase --onto master master sb01/master
cd
git远程添加sb01
git获取sb01
git签出主机
git rebase——在主控sb01/master上
git pull
是一个方便的命令,意思是“运行git fetch
,然后运行第二个命令,通常是git merge
”。如果您不想运行git merge
,请不要运行它。在我看来,最好不要在这里运行git merge
也要避免git pull
,尽管您可以指示git pull
使用git rebase
作为第二个命令。请注意,rebase实际上不会将X
本身放在E
之后,而是将X
(仍然在D
之后)复制到E
之后的新的(改进的?)提交X'
。对,我还尝试了git pull--rebase master
。然而,在这种情况下,本地历史变成了A--B--C--X--D--E
。我希望有另一种方法可以做到这一点,这样我的历史记录就有了我所需要的顺序。如果您单独执行提取和重定基础步骤,您就有了更多的控制权,这样您就可以获得所需的顺序(最后使用X'
)。您将git签出您想要丢弃旧X
的分支,并将其替换为新的、改进的X'
,然后告诉git使用取回的origin/
重新设置该分支的基础。当你使用git pull
时,它会把所有的东西组合成一个方便的命令,唉,它不能做你想做的事情,所以不要把它们组合起来。不幸的是,我不能这样做。这是一个聪明的想法,但我需要能够从工作_sb02
开始做任何事情,而不需要对工作_sb01
@AndresM进行任何更改,只需复制工作_sb01,而保留原始工作。