2017-03-05 78 views
2

我正在做的项目有很多分支,其中有两个分支我的关注点sprint1sprint2。我从分支sprint1创建了我的工作lexis的一个新分支,并将1分配给分支lexis。后来我的队友告诉我应该从sprint2分支,而不是sprint1。于是,他做了以下这些git命令是什么意思,以便让我的分支与某个远程分支相同?

On branch lexis he deleted my commit 
git fetch origin/sprint2 
git reset --hard origin/sprint2 
Then he cherry picked my commit from reflog 

然后他告诉我,推我的分支lexis提交使用push -f。 我的疑惑是

  1. 我知道正在重置,使我的分支lexis酷似sprint 2。但为什么他做了git fetch
  2. 为什么使用git psh -f

回答

4

但是他为什么要做git fetch?

为了确保使用最新更新的sprint2分支

为什么git push -f使用?

如果你已经没有推lexis,你需要迫使它考虑它的历史会改变(因为它的基础是不再sprint1sprint2

1

git fetch只是确保你有一个推最新的sprint2快照。

git push -f是必要的,因为您的本地副本lexis,在git reset之后,与远程副本不一致。 (你可以把它作为push版本的git reset --hard;不管是什么origin/lexis样子,使它看起来像本地lexis现在。)

3

我想看到的是发生在这里将你最有益的示意图。

首先,让我们假定这两个lexissprint2开始时一样:

sprint2: ... A -- B -- C 
lexis: ... A -- B -- C 

在这里,我用省略号表示在此之前这一切都来了。据推测,他们在某个时候都分支出一个共同的基地,但这与你的问题无关。你做了一个提交到lexis,同时,其他人向sprint2提交了一些号码(比如说2)。在这一点上,图中看起来是这样的:

sprint2: ... A -- B -- C -- D -- E 
lexis: ... A -- B -- C -- F 

在这一点上,你应该已经对sprint2顶部,但你承诺sprint1代替。然后,您的同事核爆您提交F,留给我们:

sprint2: ... A -- B -- C -- D -- E 
lexis: ... A -- B -- C 

然后,他从分支lexis以下两条命令:

git fetch origin/sprint2   # update local tracking branch for sprint2 
git reset --hard origin/sprint2 # reset local lexis to sprint2 

这左边的图看起来像这样:

sprint2: ... A -- B -- C -- D -- E 
lexis: ... A -- B -- C -- D -- E 

最后,他挑选你的承诺F到这个新的基地:

sprint2: ... A -- B -- C -- D -- E 
lexis: ... A -- B -- C -- D -- E -- F' 

现在,你就是你想成为的地方。您在当前基地sprint2之上有一个提交。

注意,最后一步看起来是这样的:

git push --force origin lexis 

这是必要的,因为你的分支的基地更改,并且需要强制覆盖。

相关问题