Подтвердить что ты не робот

Сделайте команду git master HEAD на текущий HEAD ветки

Я должен признать, что я не играл с расширенными функциями gits, но в моем текущем проекте мне пришлось.

Ситуация: Кто-то попытался реализовать некоторые функции и передал их хозяину, теперь меня призвали делать то, что пытался сделать этот другой человек (но не удалось), поэтому первое, что я сделал, это

git checkout -b clean_start HASH

Hash - это правильный SHA1-хэш около 20 коммитов перед текущим мастером, и это сработало. Теперь я внес некоторые изменения в эту ветку, и теперь я в такой момент, когда хочу изменить текущую главную ветвь удаленного репозитория (с изменениями, внесенными другим человеком) в мою локальную ветвь.

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

Это именно то, что я должен сделать? С возвратом HEAD ~ 20 и т.д. Или есть команда, которая делает именно такое движение головы?

4b9b3361

Ответ 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