Как сделать точку ветвления при конкретном коммите? - PullRequest
154 голосов
/ 05 сентября 2011

В Git я понимаю, что ветвь является указателем на коммит.

Как сделать конкретную точку ветвления для определенного коммита?Скажем, я хочу указать master на 1258f0d0aae..., как мне это сделать?

Ответы [ 4 ]

200 голосов
/ 05 сентября 2011

Вы можете сделать master точку на 1258f0d0aae таким образом:

git checkout master
git reset --hard 1258f0d0aae

Но вы должны быть осторожны с этим. Это вполне может переписать историю этой ветви. Это создало бы проблемы, если бы вы опубликовали его, и другие люди работают над веткой.

Кроме того, команда git reset --hard отбрасывает любые незафиксированные изменения (т. Е. Те, которые находятся только в вашем рабочем дереве или индексе).

Вы также можете принудительно обновить ветку с помощью:

git branch -f master 1258f0d0aae

... но git не позволит вам сделать это, если вы в данный момент используете master.

33 голосов
/ 05 сентября 2011
git reset --hard 1258f0d0aae

Но будьте осторожны, если потомок фиксирует между 1258f0d0aae и HEAD, на которые нет ссылок в других ветвях, восстановить их будет утомительно (но не невозможно), поэтому лучше создать «резервную копию» ветвь в текущем HEAD, извлечение master и сброс к коммиту, который вы хотите.

Кроме того, убедитесь, что у вас нет незафиксированных изменений до reset --hard, они действительно будут потеряны (восстановление невозможно).

27 голосов
/ 01 сентября 2017

Если вы в настоящее время не на главном филиале, это очень просто:

git branch -f master 1258f0d0aae

Это делает именно то, что вы хотите: он указывает master на данный коммит и делаетбольше ничего.

Если вы в данный момент находитесь на мастере, вам нужно сначала перейти в состояние отсоединенной головы.Я бы порекомендовал следующую последовательность двух команд:

git checkout 1258f0d0aae    #detach from master
git branch -f master HEAD   #exactly as above

#optionally reattach to master
git checkout master

Имейте в виду, что любые явные манипуляции с точками ветвления могут оставить коммиты, которые более недоступны для каких-либо ветвей, итаким образом стать объектом для сборки мусора.Итак, подумайте, прежде чем набирать git branch -f!


Этот метод лучше, чем подход git reset --hard, так как он ничего не разрушает в индексе или рабочем каталоге.

15 голосов
/ 01 сентября 2017

git branch -f

Я согласен с решением и комментариями Марка Лонгаира и рекомендую всем прочитать их перед тем, как действовать, но я бы посоветовал сделать акцент на

git branch -f <branchname> <commit>

Вот сценарий, где мне нужно было сделать это.

Сценарий

Разработка в неправильной ветви и, следовательно, необходимо сбросить его.

Старт в порядке

Чистая разработка и выпуск некоторого программного обеспечения.

So far so good

Разработка на неправильной ветке

Ошибка: случайно останьтесь в ветке релиза при дальнейшей разработке.

After a mistake

Осознай ошибку

"О, нет! Я случайно разработал ветку релиза." Рабочая область может быть перегружена наполовину измененными файлами, которые представляют незавершенную работу, и мы действительно не хотим трогать и портить. Мы просто хотели бы, чтобы git перевернул несколько указателей, чтобы отследить текущее состояние, и вернул эту ветку релиза так, как должно быть.

Создайте ветку для разработки, которая является актуальной, в которой хранится выполненная на данный момент работа, и переключитесь на нее.

git branch development
git checkout development 

Changed to another branch

исправить ветку

Сейчас мы находимся в проблемной ситуации и нуждаемся в ее решении! Исправьте ошибку (переместив ветку релиза вместе с разработкой) и верните ветку релиза так, как должно быть.

Исправьте ветку выпуска, чтобы она указала на последний реальный выпуск.

git branch -f release release2

Ветка релиза снова верна, вот так ...

Corrected

Что если я перенесу ошибку на пульт?

git push -f <remote> <branch> хорошо описано в другой теме, хотя слово «перезаписать» в заголовке вводит в заблуждение. Принудительно «git push» перезаписывать удаленные файлы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...