2015-02-17 2 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

Вы в основном принудительно обновляете 'shared', чтобы указать на' feature', а затем изменить его. Восстановление через reflog кажется подходящим. –

+2

Если вы хотите, чтобы ваша ветка 'shared 'вернулась в соответствие с' origin/shared', просто выполните git checkout shared && git fetch && git reset --hard origin/master' – kdopen

+1

@kdopen Ваше предложение выше будет просто сделайте мою локальную ветку '' shared'' соответствующей удаленной. И тогда я могу просто слиться в '' feature'', как обычно? Будет ли последняя команда '' git reset --hard origin/shared'' – Jeff

ответ

1

Короткий ответ

Иногда. git checkout -B <branch_name> выполняет сброс, если branch_name уже существует.

Подробности

Почему это произошло именно?

Как указано, git checkout -B <shared> перезагружается shared к HEAD фиксации и проверки из shared. Что именно это делает?

  • Точка 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 

Хороший Fix

Все, что я хотел сделать, было тянуть вниз совместно и сливаются в особенности. Есть ли способ отменить это?

Комментарий @ kdopen предлагает хорошее исправление. Хотя оба варианта fetch и --hard на reset являются необязательными (подробности см. В комментариях к вопросу). Вот мое измененное исправление.

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''. Есть ли способ отменить это? Может быть, Гит может вернуться? – Jeff

+0

Поскольку вы перешли 'shared' с помощью команды' reset', вы захотите вернуть ее туда, откуда она появилась, с помощью другой команды 'reset'. –

+0

Если я нажимаю '' shared'' как есть, будет ли это испортить тех, кто также работает с этой веткой? – Jeff

1

исходное положение по умолчанию для новой отрасли (git checkout -b newbr) является HEAD.

Это также относится к действию сброса «create-or-reset» git checkout -B oldbr. Итак, так как вы были на feature, HEAD сказал feature, который решил установить ID самого последнего фиксатора на ветке feature, что сделало вашу существующую метку ветки shared указателем на ту же фиксацию.

К счастью [email protected]{1} будет иметь свое прежнее положение, так что вы можете просто git reset [email protected]{1} (если вы используете CSH или Tcsh, вы должны указать открытую скобку, например, [email protected]\{1} или '[email protected]{1}', не уверен, о некоторых других оболочках).

1

git checkout -b и git checkout -B используются для проверки (новой) ветви от фиксации. -B используется, чтобы, возможно, повторно использовать существующую ветку, сбросив ее или иным образом создавая ее, и -b используется для создания нового без возможности повторного использования существующего.

git checkout -B shared 

это то же самое, как

git checkout -B shared HEAD 

и это означает

Если ветвь с именем shared существует, проверить его и сбросить его HEAD (в вашем случае, HEAD был наконечник от feature). Если не существует ветви с именем shared, создайте ее на основе HEAD.

Что произошло: Вы сбрасываете shared к feature, а затем тянут в origin/shared (и решить конфликты)

Смежные вопросы