2010-07-22 2 views
12

скажем, что мой коллега Джон создал филиал под названием «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' 

Однако теперь, что происходит, что это мой идентификатор против слиты фиксации. И позже люди спрашивают меня, почему я изменил определенную часть кода.

Как свернуть все comitts в ветке john в один коммит, чтобы Джон был автором. Я думаю, git совершить интерактивный может помочь, но не может понять.

ответ

6

Проблема заключается в том, что git merge --squash будет применять те же изменения, что и нормальное слияние, но без сохранения информации о слиянии. Затем, когда вы совершаете, это то же самое, что и любое сделанное вами совершение: оно приписано вам. Вы можете изменить информацию об авторе фиксации, используя git commit --author="Original Author <[email protected]>". См. git-commit(1) для получения дополнительной информации об переключателе --author.

Но у меня есть вопрос: почему вы раздавите слияние? Почему бы просто не сжать слияние? Если кто-либо делает git blame, он будет надлежащим образом приписан к фиксации оригинальным автором.

+1

, так что я мог бы легко откинуть назад, так как после раздавливания это одно единственное обязательство, которое нужно отбросить назад. Если я не раздачу, тогда будет 10 коммит для отката, если не будет лучшего способа. –

+2

Как отмечалось в ответе mfontani, если вы объедините --no-ff, будет записано слияние, и если вы откатите его, то он будет иметь тот же эффект, что и откат сжатого фиксации, но с добавленной выгодой записи полной истории фиксации. –

+0

Одной из причин, чтобы сделать слитное склеивание, является то, что иногда люди совершают кучу разбитых состояний на свою ветку, что делает сложнее bisect, но окончательная ветвь в порядке, а иногда ветка имеет только одного автора. – xenoterracide

8

Если вы выполните следующие действия:

git checkout -b john origin/john 
git rebase master 
git checkout master 
git merge --no-ff john # forces a merge commit to be recorded 

вы будете иметь возможность и как сохранить авторство Иоанна совершает и быть в состоянии восстановить слияние путем возврата к Ша слияния фиксации.

+0

Действительно, это потрясающе.Я предполагаю, что мне нужно самому провести тестирование, если я буду использовать git merge --no-ff john, тогда я получу, чтобы увидеть 10 коммитсов в моем главном журнале из john или я увижу одно сообщение, которое я увижу в случае раздачи. Я не возражаю против того, что 10 коммит линяют журнал. моя единственная забота заключалась в том, чтобы я мог легко вернуться. –

+0

Вы увидите все коммиты, которые вы переустановили, но вы сможете отменить слияние, просто вернув слияние. Кроме того, вы отслеживаете, какие коммиты принадлежали к какой ветке :) – mfontani

+0

Я с нетерпением ожидаю услышать, было ли это выработано для вас, и поэтому отвечает на ваш первоначальный вопрос. – mfontani

4

Как я только что сделал это, давя через перебазироваться:

git rebase --onto master -i master remote/branch 

Затем в редакторе, отметьте все совершает «сквош». Это дает единственную с прилагаемым оригиналом автора. Хотя вы действительно ничего не получаете, а не копируете оригинального автора в -author. Мне просто было неудобно это делать.

По какой-то причине, моя голова была отделена после этого, так что я снова прикреплен мастер к нему через:

git checkout -B master HEAD 
5

Вы также можете --amend авторство потом, если вы уже сделали слияние. например:

git checkout master 
git merge my_branch 
git commit --amend --author="My Nick <[email protected]>" 
git push origin master 

Это работает по желанию и добавляет указанного автора к фиксации слияния. Просто как тот.

Смежные вопросы