HEAD отсоединен от источника/мастера при слиянии с pygit2

Я использую pygit2 для объединения некоторых ветвей проекта, однако всякий раз, когда я их объединяю, я получаю:

def avoid_walls(directions, board, snake):
<<<<<<< HEAD
return directions
=======
z = 1
moves = []
for direction in directions:
    new_x = snake[0][0] + dirs[direction][0]
    new_y = snake[0][1] + dirs[direction][1]
    if new_x >= 0 and new_x < len(board[0]) and new_y >= 0 and new_y < len(board):
        moves.append(direction)
return moves
>>>>>>> 357f58b6d1682760b2fa9bf7b2418da347ca353c

в моем коде. Когда я проверяю репо с помощью «git status», я нахожу это:

HEAD detached from origin/master
All conflicts fixed but you are still merging.
  (use "git commit" to conclude merge)

Насколько я могу судить, я все делаю правильно, поэтому не могу понять, почему HEAD отсоединен. Насколько я понимаю, HEAD отсоединяется, когда вы проверяете конкретную фиксацию, а не ветку, чего я не делаю:

# clone repo to local directory
repo = pygit2.clone_repository(my_repo, my_dir)

# checkout master branch (checked out by default, but just to be safe)
repo.checkout('refs/remotes/origin/master')

# merge with other branches
repo.merge(repo.branches['origin/branch1'].target)

# commit changes
index = repo.index
index.add_all()
index.write()
author = pygit2.Signature("ME", "[email protected]")
commiter = pygit2.Signature("ME", "[email protected]")
tree = index.write_tree()
oid = repo.create_commit('refs/heads/master', author, commiter, "init commit", tree, [repo.head.target, repo.branches['origin/branch1'].target])

#some tests i tried to fix the issue
repo.head.set_target(oid)
repo.apply(oid)

Я что-то упустил после слияния, которое завершит коммит и решит эту проблему?


person Pottsiex5    schedule 07.06.2019    source источник


Ответы (1)


refs/remotes/origin/master не является филиалом. Все ветки начинаются с refs/heads/:

if name.startswith('refs/heads/'):
    print('{} is a branch name'.format(name))
else
    print('{} is not a branch name'.format(name))

В данном случае, поскольку оно начинается с refs/remotes/, это имя удаленного отслеживания (в документации Git это обычно называется имя удаленного отслеживания, но я думаю, что это слишком вводит в заблуждение так как оно содержит слово ветка, хотя это не имя ветки).

Когда вы извлекаете имя удаленного отслеживания, или имя тега, или любое другое имя, не являющееся именем ветки, вы действительно извлекаете конкретную фиксацию и получаете отсоединенный HEAD.

person torek    schedule 07.06.2019
comment
Спасибо за объяснение, это имеет смысл. Ни одна из моих веток не отображается в /refs/heads/, даже когда я их проверяю (тот же метод, что и раньше). Как я могу локально клонировать все мои ветки в refs/heads? - person Pottsiex5; 10.06.2019
comment
Мне удалось получить клонирование в /refs/heads, используя код, найденный здесь: stackoverflow.com/questions/34711540/ Это не решило проблемы "вы все еще объединяете", но теперь, когда отсоединенная голова решена, мне хочется больше взглянуть на docs должны решить проблему невозможности фиксации. - person Pottsiex5; 10.06.2019
comment
Я не уверен, что делает pygit2 в каждом случае. В Git в целом git checkout X (для любого X) сначала проверяет, является ли X именем ветки (существует как refs/heads/X), и если да, то переключается на эту фиксацию + ветку. Если нет, то он проверяет, является ли X каким-то другим существующим именем, и если оно разрешается как ровно одно имя удаленного отслеживания, такое как origin/X, фактически запускается git checkout -b X origin/X, создавая X, указывающий на тот же идентификатор хэша коммита, что и origin/X, а затем проверка недавно созданного X. - person torek; 10.06.2019