Устранение избыточных расходящихся изменений в Git
Учитывая исходное состояние:
A - origin/branch-1
|
X A - origin/branch-2
| /
M - master
где оба A
коммиты вносят такие же изменения и не пересекаются с X
совершить, как лучше всего привести вещи в следующее состояние?:
A - origin/branch-1 - origin/branch-2
|
X
|
M - master
В частности, я хочу НЕ оказаться в следующем состоянии, поскольку (независимо от предпринятых физических действий) логические действия являются последовательными и не включают слияние (т.е. состояние, в котором A
не следил X
никогда не был действительным и должен быть удален из репозитория):
M - origin/branch-1 - origin/branch-2
| \
A |
| |
X A
| /
M - master
1 ответ
Имя для удаленного отслеживания, напримерorigin/branch-1
или origin/branch-2
представляет вашу память Git о некотором другом имени ветки Git. То есть ваш Git вызвал их Git; их Git сказал мойbranch-2 holds hash ID _____
(заполните пустое поле фактическим идентификатором хэша), и ваш Git при необходимости захватил этот коммит, чтобы он у вас был, и создал или обновил свойorigin/branch-2
указать на эту фиксацию.
При условии, что A
а также A
действительно A
а также A'
- т.е. два разных коммита с разными хэш-идентификаторами, но схожими эффектами), ваша задача - убедить другой репозиторий Git - тот, что закончилсяorigin
-В установить свое название филиалаbranch2
чтобы указать, какой из этих двух является желаемым хешем. У вас есть этот хэш-идентификатор в вашем Git под именемorigin/branch-1
, так:
git push --force origin origin/branch-1:branch-2
ваш Git вызовет Git по адресу origin
и скажи: мне все равно, что совершает твоеbranch2
идентифицирует прямо сейчас, укажет на хэш-идентификатор _____
сейчас!(здесь пусто заполнено хеш-идентификатором, который ваш Git сохранил под именемorigin/branch-1
).
Они могут подчиняться этой команде, а могут и нет. Если они этого не делают, вы не можете исправить это отсюда следующим образом: вам нужно будет найти кого-то, кто может выполнять такие команды, чтобы сделать это. Этим кем-то может быть вы, но вошедший на сервер напрямую, или кто-то с правами администратора.1
Предположим, они действительно подчиняются. Ихbranch-2
в настоящее время указывает на какой-то коммит - может быть, тот, который вы думаете, может быть, какой-то другой коммит, который был добавлен с тех пор. В любом случае, они подчиняются вашему решительному приказу, и теперь ихbranch-2
указывает на другой A
. Ваш Git видит, что они подчиняются, и обновляет вашorigin/branch-2
, и вы получите то, что хотели.
Будьте осторожны с операциями принудительного нажатия. Обратите внимание, что вы можете использовать--force-with-lease
но для этого вам нужно создать имя локальной ветки на вашем конце. В--force-with-lease
операция должна знать, какой хэш-идентификатор передать им, так как она меняет команду с меня все равно, установленной на___
чтобы я думаю, что ваш филиал в настоящее время___
; если да, установите его на___
; в любом случае, скажи мне, был ли я прав и подчинялся ли ты. Чтобы все это работало, ваш Git должен иметь собственное локальное имяbranch-2
что он может быть сопоставлен с вашим местным origin/branch-2
чтобы он мог получить идентификаторы хэшей для обоих пробелов.
1 В качестве уловки, иногда, если вы не можете убедить другой Git обновить имя ветки, вы можете просто сказать этому другому Git полностью удалить имя ветки. Удалив его, вы можете указать этому другому Git создать совершенно новое, совершенно другое имя ветки, которое просто имеет такое же написание. Много времен, Git, что не позволит вам принудительно обновить имя ветви, будет препятствовать вам удалить и заново создать его, как вам нравится.