Сделайте так, чтобы git master HEAD указывал на текущую HEAD ветви - PullRequest
32 голосов
/ 25 ноября 2010

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

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

git checkout -b clean_start HASH

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

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

Это именно то, что я должен сделать?С revert HEAD ~ 20 и т. Д., Или есть команда, которая делает именно такую ​​голову?

Ответы [ 3 ]

29 голосов
/ 25 ноября 2010

Вы можете сделать это, если удаленный репозиторий принимает принудительные нажатия:

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

Thisсоздаст коммит слияния с обеими ветвями (ваш master и master источника) в качестве его родителя, но дерево будет идентично вашей текущей ветке tip.Другими словами, это создаст символическое слияние, когда фактическое слияние кода не произошло.

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

26 голосов
/ 25 ноября 2010
  1. Вы можете указать мастеру, где вы хотите, чтобы он был:

    git update-ref refs/heads/master clean_start
    

    (если вы отслеживаете новые изменения в clean_start и хотите, чтобы мастер указал на них)

    Остерегайтесь того, на что бы мастер ни указывал (около 20 коммитов), он будет "потерян".

    Вам нужно будет заставить толчок мастера из-за этого:

    git push origin master -f
    
  2. Если вы хотите оставить локальный мастер там, где он есть, и передать место clean_start удаленному мастеру, просто сделайте это:

    git push origin clean_start: master -f

    надеюсь, это поможет.

    PS. Сначала запустите gitk --all &, чтобы вы могли видеть, что происходит визуально, при этом.

17 голосов
/ 25 ноября 2010

Существует команда 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
...