Как объединить филиал и сохранить авторство
скажем, что мой коллега Джон создал филиал под названием "john". У Джона есть 10 коммиттов. Когда дело доходит до слияния с мастером, они просят меня слить.
Это то, что я делаю
git checkout -b john origin/john
git rebase master
git checkout master
git merge john --squashed
git add .
git commit -m 'merged branch john'
Однако теперь случается, что это мой id против объединенной фиксации. И позже люди спрашивают меня, почему я изменил определенную часть кода.
Как свернуть все comitts в ветке john в одно коммит, чтобы Джон был автором. Я предполагаю, что git commit интерактивный может помочь, но не может понять.
Ответы
Ответ 1
Если вы выполните следующее:
git checkout -b john origin/john
git rebase master
git checkout master
git merge --no-ff john # forces a merge commit to be recorded
вы сможете оба сохранить авторство Джона коммитов и иметь возможность вернуть слияние, вернув SHA коммита слияния.
Ответ 2
Проблема здесь в том, что git merge --squash
будет применять те же изменения, что и нормальное слияние, но не сохраняя информацию о слиянии. Затем, когда вы совершаете, это то же самое, что и любое сделанное вами совершение: оно приписано вам. Вы можете изменить информацию об авторских правах, используя git commit --author="Original Author <[email protected]>"
. Подробнее о переключателе --author
см. git -commit (1).
Но у меня есть вопрос: почему вы раздавите слияние? Почему бы просто не сжать слияние? Если кто-то делает git blame
, он будет соответствующим образом приписан к фиксации оригинальным автором.
Ответ 3
Вы также можете --amend
создать авторство, если вы уже сделали слияние. например:
git checkout master
git merge my_branch
git commit --amend --author="My Nick <[email protected]>"
git push origin master
Это работает по желанию и добавляет указанный автор к фиксации слияния. Просто как это.
Ответ 4
То, как я только что это сделал, - раздавить через rebase:
git rebase --onto master -i master remote/branch
Затем в редакторе отметьте все фиксации "squash". Это дает единственную с прилагаемым оригиналом автора. Хотя вы действительно ничего не получаете, а не копируете оригинального автора в -author. Мне просто было неудобно это делать.
По какой-то причине мой начальник был отсоединен после этого, поэтому я снова привязал к нему мастера:
git checkout -B master HEAD