2015-02-17 31 views
2

我有一个名为shared的分支,与其他开发者共享。我工作了一个feature分支。虽然我feature分支,我跑git checkout -B shared,并得到了以下消息:git checkout -B执行重置吗?

Switched to and reset branch 'shared' 
Your branch and 'origin/shared' have diverged, 
and have 6 and 126 different commits each, respectively. 
    (use "git pull" to merge the remote branch into yours) 

我拉和解决冲突和突然意识到我shared分支有我所有的改变从我feature分支。我的问题是:

  1. 这是怎么发生的?

  2. 望着文档它说,该分支与-B标志运行时的校验复位:

    如果-B给出,<new_branch>是,如果不存在,则创建;否则,它被重置。

    我上次检查时,在共享分支上运行重置是非常危险的。或者在这种情况下,“重置”有不同的含义吗?

+1

你基本上强制更新'共享'指向'功能',进一步修改它。通过reflog恢复似乎是适当的。 – 2015-02-18 00:05:19

+2

如果你只想让你的'共享'分支符合'origin/shared',只要做'git checkout shared && git fetch && git reset --hard origin/master' – kdopen 2015-02-18 00:28:08

+1

@kdopen你上面的建议只是使我的本地''共享''分支匹配远程。然后我可以像正常一样在''feature'中合并?最后一个命令是''git reset --hard origin/shared'' – Jeff 2015-02-18 01:24:04

回答

1

简答

有时。如果branch_name已存在,则git checkout -B <branch_name>执行重置。

详细

为什么会这样,到底是什么?

正如你所指出的,git checkout -B <shared>复位sharedHEAD承诺,并签出shared。这到底是什么呢?你当前HEAD

  • shared提交。 (这回答你的第一个问题)。
  • 清空您最近添加的索引中的所有内容。
  • 结帐shared

换句话说,您将shared重置为匹配feature。下面是展示你是如何前checkout -B一个例子:

> git log --oneline --decorate --all --graph 

* d0d0d0d (HEAD, feature) Some commit message. 
* e0e0e0e Some commit message. 
* f0f0f0f Some commit message. 
* g0g0g0g Some commit message. 
* h0h0h0h Some commit message. 
* i0i0i0i Some commit message. 
|  * z0z0z0z (origin/shared) Some commit message. 
|  * y0y0y0y (origin/shared) Some commit message. 
|  * x0x0x0x (origin/shared) Some commit message. 
|  ---- 120 more commits ---- 
|  * w0w0w0w (origin/shared) Some commit message. 
|  * v0v0v0v (origin/shared) Some commit message. 
|  * u0u0u0u (origin/shared) Some commit message. 
| / 
|/ 
* a0a0a0a (shared) Some commit message. 
* b0b0b0b Some commit message. 
* c0c0c0c Some commit message. 

下面是你怎么样了checkout -B后:

> git checkout -B shared 
> git log --oneline --decorate --all --graph 

* d0d0d0d (HEAD, feature, shared) Some commit message. 
* e0e0e0e Some commit message. 
* f0f0f0f Some commit message. 
* g0g0g0g Some commit message. 
* h0h0h0h Some commit message. 
* i0i0i0i Some commit message. 
|  * z0z0z0z (origin/shared) Some commit message. 
|  * y0y0y0y (origin/shared) Some commit message. 
|  * x0x0x0x (origin/shared) Some commit message. 
|  ---- 120 more commits ---- 
|  * w0w0w0w (origin/shared) Some commit message. 
|  * v0v0v0v (origin/shared) Some commit message. 
|  * u0u0u0u (origin/shared) Some commit message. 
| / 
|/ 
* a0a0a0a Some commit message. 
* b0b0b0b Some commit message. 
* c0c0c0c Some commit message. 

shared现在都从feature的变化,你的shared will have 6 different commits that产地/共享`,同样它将有126个不同的提交比你的。

在这种情况下,'重置'具有不同的含义吗?

重置的含义与以往一样。你基本上做了以下内容:

git checkout shared 
git reset --mixed feature 

一个良好的修复

所有我想做的就是拉下共享和功能合并。有没有办法解决这个问题?

@ kdopen的评论暗示了一个很好的解决方法。尽管reset上的fetch--hard选项都是可选的(请参阅有关该问题的评论以获取详细信息)。这是我修改的修复程序。

git checkout shared 
git reset origin/shared 

这应该让你处于这个位置,你可以按照你的意愿合并你的feature分支。

* d0d0d0d (feature) Some commit message. 
* e0e0e0e Some commit message. 
* f0f0f0f Some commit message. 
* g0g0g0g Some commit message. 
* h0h0h0h Some commit message. 
* i0i0i0i Some commit message. 
|  * z0z0z0z (HEAD, shared, origin/shared) Some commit message. 
|  * y0y0y0y (origin/shared) Some commit message. 
|  * x0x0x0x (origin/shared) Some commit message. 
|  ---- 120 more commits ---- 
|  * w0w0w0w (origin/shared) Some commit message. 
|  * v0v0v0v (origin/shared) Some commit message. 
|  * u0u0u0u (origin/shared) Some commit message. 
| / 
|/ 
* a0a0a0a Some commit message. 
* b0b0b0b Some commit message. 
* c0c0c0c Some commit message. 
+0

我不确定那是我打算做的。我想要做的只是拉下''shared''并合并到''feature''中。有没有办法解决这个问题?也许Git恢复? – Jeff 2015-02-18 01:11:19

+0

由于您通过'reset'命令移动了'shared',因此您需要使用另一个'reset'命令将它放回原处。 – 2015-02-18 01:13:24

+0

如果我按原样推送''shared'',会不会影响那些也在这个分支上工作的人? – Jeff 2015-02-18 01:17:22

1

新分支(git checkout -b newbr)的默认起始位置是HEAD

对于“创建或重置”git checkout -B oldbr的重置动作也是如此。因此,由于您的登录号为feature,因此HEAD表示feature已解析为分支feature上的提示最多提交的ID,这使您的现有分支标签shared指向同一提交。

幸运[email protected]{1}将其先前的位置,所以你可以简单地git reset [email protected]{1}(如果你使用csh或tcsh,你必须报开括号,例如,[email protected]\{1}'[email protected]{1}';不知道其他的一些炮弹)。

1

git checkout -bgit checkout -B用于检出提交中的(新)分支。 -B用于通过重置或以其他方式创建现有分支来重新使用现有分支,并且使用-b创建新分支,而不用重新使用现有分支。

git checkout -B shared 

是一回事

git checkout -B shared HEAD 

,这意味着

如果命名shared一个分支存在,检查出来并将其重置为HEAD(在你的情况,HEAD是尖的feature)。如果不存在名为shared的分支,请根据HEAD创建一个分支。

发生了什么事:您重置sharedfeature,然后在origin/shared拉(和解决冲突)

相关问题