Разложите избыточные расходящиеся изменения в Git - PullRequest
0 голосов
/ 24 марта 2020

Учитывая начальное состояние:

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

0 голосов
/ 24 марта 2020

A имя удаленного слежения подобно origin/branch-1 или origin/branch-2 представляет вашу Git память другого Git имени ветви. То есть ваш Git вызвал их Git; их Git сказали my branch-2 holds hash ID _____ (заполните бланк с фактическим га sh ID) и ваш Git затем захватили этот коммит при необходимости, чтобы вы получите его и создайте или обновите origin/branch-2, чтобы он указывал на этот коммит.

Предполагая, что A и A действительно A и A', то есть два разных коммита с разным ха sh идентификаторов, но с аналогичными эффектами) ваша задача - убедить другой Git репозиторий - тот, что на origin - установить его имя ветви branch2 в указать, какой из этих двух является желаемым га sh. У вас есть этот га sh ID в вашем Git под именем origin/branch-1, поэтому:

git push --force origin origin/branch-1:branch-2

будет иметь ваш Git вызов Git в origin и скажите: Мне все равно, какой коммит ваш branch2 идентифицирует прямо сейчас, укажите прямо сейчас на ha sh ID _____! (с заполненным здесь пробелом с идентификатором ha sh, который ваш Git сохранил под именем origin/branch-1).

Они могут подчиняться этой команде, а могут и нет. Если этого не произойдет, вы не сможете исправить это следующим образом: для этого вам понадобится человек, который может выдавать такие команды. Кто-то может быть самим собой, но вошел на сервер напрямую, или это может быть кто-то с правами администратора. 1

Предположим, что они делают подчиняются. Их branch-2 в настоящее время указывает на какой-то коммит - может быть, тот, который вы думаете, может быть, другой коммит, который был добавлен с тех пор. В любом случае, они подчиняются вашей строгой команде, и теперь их branch-2 указывает на другой A. Ваш Git видит, что они повиновались, и обновляет ваш origin/branch-2, и вы получаете то, что хотели.

Будьте осторожны с операциями force-pu sh. Обратите внимание, что вы можете использовать --force-with-lease, но для этого вам нужно создать локальное имя ветки на вашем конце. Операция --force-with-lease должна знать, какой га sh ID передать им, поскольку она меняет команду с Мне все равно, установите ___ на Я думаю, что ваша ветвь в настоящее время ___; если это так, установите его на ___; В любом случае, скажите мне, был ли я прав, и если вы подчинились. Чтобы все это работало, у вас Git у вас должно быть ваше собственное локальное имя branch-2, которое можно сопоставить с вашим местным origin/branch-2, чтобы он может получить идентификаторы ha sh для обоих пробелов.


1 В качестве отговорки иногда, если вы не можете убедить другую Git обновить имя ветви, Вы можете просто сказать, что другие Git до полностью удаляют имя ветви. Удалив его, вы можете затем сказать этому другому Git создать совершенно новое, совершенно другое имя ветви, которое, как оказалось, имеет точно такое же правописание . Много раз, Git, который не позволит вам принудительно обновить имя ветви, будет , что позволит вам удалить и заново создать его так, как вам нравится.

...