2016-01-01 2 views
0

Название ветви указывает на конец/конец фиксации ветви.Изменить фиксацию, на которую указывает имя филиала?

Есть ли команда, которая непосредственно изменяет имя ветки, чтобы указать на другую существующую фиксацию (например, некоторый предок/потомок исходного коммита)?

Под «непосредственно» я подразумеваю, что команда берет фиксацию для перехода (или что-то похожее на это) и имя ветви в качестве аргументов.

Под «косвенно» подразумевается, например, что совершение, слияние, перезагрузка, толкание и вытягивание/выборка, переместите имя ветви, но не принимайте фиксацию, чтобы перейти (или что-то подобное к этому) в качестве аргумента.

+0

Вы имеете в виду, что как только ветка будет объединена (которая будет текущей веткой, в которой вы находитесь), вы хотите перейти к ветке, откуда произошел текущий хеш-хеш-код? –

+0

№. Я упомянул «ветку», не обязательно текущую ветку. «merge» не учитывается, потому что в качестве аргумента не требуется фиксация для перехода (или чего-то подобного). – Tim

ответ

2
$ git checkout the-branch 
$ git reset <commit-hash> 

Если вы хотите иметь свой рабочий каталог отражает состояние этой фиксации, добавьте --hard флаг.


Я бы упущением, если бы я не предлагал эти 2 предупреждения:

  1. Вы переписываете историю. Будьте осторожны с этим, если вы уже нажали.
  2. Если вы используете флаг --hard, вы потеряете весь прогресс, достигнутый с момента совершения. Если у вас нет других ссылок на подсказку вашего текущего филиала, у вас не будет способа (но reflog), чтобы вернуться к текущему состоянию дел.
+0

Checkout не перемещает имя ветки, а перемещает «HEAD». Я еще не знаком с перезагрузкой, поэтому я не комментирую это. – Tim

+0

@Tim конечно нет. 'reset' делает. –

+0

Спасибо. можете ли вы объяснить, почему это происходит? – Tim

1
git branch -f $BRANCH $COMMIT 

Обратите внимание, что ветвь вы пытаетесь двигаться не может быть текущей ветви. См. man page для получения дополнительной информации.

1

Название филиала указывает на конец/конец фиксации ветви.

Исправить (по определению, действительно).

Есть ли команда, которая непосредственно изменяет имя ветки, чтобы указать на другую существующую фиксацию (например, некоторый предок/потомок первоначальной команды фиксации)?

Команда низкого уровня, которая создает или изменяет целевой идентификатор SHA-1 ссылки, является git update-ref. Используя это немного сложно, поскольку это требует, чтобы вы изложить полное имя ссылки:

$ git update-ref refs/heads/foo newvalue [ oldvalue ] 

(добавляя oldvalue часть делает ошибки, если ссылка не иметь ожидаемого значения, см the documentation для деталей). Он способен нарушить символическую ссылку.

git branch command позволит вам переместить ветку в новую целевую фиксацию, как Corubba already noted. Он более подходит для случайного использования (не как с ошибкой, как git update-ref), но меньше для сценариев (где вам нужен жесткий, но полный контроль).

git reset command позволяет переместить ветвь, к которой HEAD является символической ссылкой, или для изменения значения, хранящегося в HEAD когда HEAD не является символической ссылкой (то есть, когда вы находитесь в режиме «отделенной HEAD»). Он не может перемещать другой ветви; и он также работает с индексом (ничем иным, кроме --soft), который ни git branch, ни git update-ref do.

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