2015-02-17 74 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拉(和解決衝突)

相關問題