Сделайте команду git master HEAD на текущий HEAD ветки
Я должен признать, что я не играл с расширенными функциями gits, но в моем текущем проекте мне пришлось.
Ситуация:
Кто-то попытался реализовать некоторые функции и передал их хозяину, теперь меня призвали делать то, что пытался сделать этот другой человек (но не удалось), поэтому первое, что я сделал, это
git checkout -b clean_start HASH
Hash - это правильный SHA1-хэш около 20 коммитов перед текущим мастером, и это сработало. Теперь я внес некоторые изменения в эту ветку, и теперь я в такой момент, когда хочу изменить текущую главную ветвь удаленного репозитория (с изменениями, внесенными другим человеком) в мою локальную ветвь.
Другими словами, я хотел бы переместить голову мастера 20, а затем объединить в нее новую чистую ветку.
Это именно то, что я должен сделать? С возвратом HEAD ~ 20 и т.д. Или есть команда, которая делает именно такое движение головы?
Ответы
Ответ 1
Вы можете сделать это, если удаленный репозиторий принимает принудительные нажатия:
git push --force origin clean_start:master
Обратите внимание, что если кто-то еще имеет клонированный репозиторий, нажатие на них может потенциально отменить это. Если вы хотите объединить локальную главную ветвь и ветвь удаленного мастера, но сохраните дерево файлов из своей ветки (отбрасывая дерево файлов исходного мастера), вы можете сделать это следующим образом:
git merge -s ours --no-commit origin/master
git commit # Separate step so that you can use your own commit message.
git checkout master
git merge clean_start # Fast-forward
git push origin master
Это приведет к объединению с двумя ветвями (хозяином и оригиналом) в качестве родителя, но дерево будет идентично вашему текущему кончику ветки. Другими словами, он создаст символическое слияние, где не произойдет реального слияния кода.
Если вы не возражаете, что другие люди, работающие в репо, будут прерваны, вы можете использовать первый подход. Но если вы работаете с другими людьми, у которых уже есть эти коммиты, второй подход будет более безупречным и сохранит историю.
Ответ 2
-
Вы можете указать мастер в том месте, где вы хотите:
git update-ref refs/heads/master clean_start
(если вы отслеживаете новые изменения в clean_start
и хотите, чтобы мастер указал там)
Остерегайтесь того, что все, что указывал мастер (около 20 коммитов), будет "потеряно".
Вам нужно будет заставить толчок мастера из-за этого:
git push origin master -f
-
Если вы хотите оставить свой локальный мастер там, где он есть, и нажмите на место clean_start на удаленный мастер, просто выполните следующее:
git push origin clean_start: master -f
надеюсь, что это поможет.
PS. Сначала запустите gitk --all &
, чтобы вы могли видеть, что происходит визуально, когда вы это делаете.
Ответ 3
Команда git reset существует для изменения того, на что указывает HEAD.
В вашем случае вы можете сделать это:
git checkout master # switch to the master branch
git reset --hard clean_start # point HEAD to the clean_start branch
git push -f origin master:master # force push the new HEAD to server