Rebase фиксирует коммит на мастере, когда коммиты уже объединены - PullRequest
2 голосов
/ 05 октября 2019

enter image description here

Теперь я хочу "Публичную перекомпиляцию". и "Требовать совместимых пакетов для package.json", чтобы они находились на одной временной шкале a, а НЕ на альтернативной. Все филиалы локальные или удаленные уже получили все коммиты. Как бы я это сделал

Ответы [ 4 ]

1 голос
/ 05 октября 2019

Поскольку мне нужна чистая история, чтобы я мог поделиться кодом.

Обратите внимание, что у вас есть "чистая" история Git. «Пузыри», как у вас, показывают, какие коммиты были сделаны вместе как группа. Это дополнительная полезная информация для выяснения, почему был сделан коммит. Я бы рекомендовал оставить ваш репозиторий без изменений.

Чего вы хотите избежать, так это слияния «update», получающего последние обновления от master. Это то, что я называю "бухгалтерским" слиянием. Они запутывают историю и бесполезны для археологии.

*   11067971 [master]
|\
| * d3adb3f merge master again
|/|
* | 1234567 another master commit
| * daf9f2d Require compatible...
| * abc1234 merge master
|/|
| * 3547419 Public recompile.
* | e0d2740 N/A
* | 6b2385f Apply Codestyles:
|/
* 08c6f59 Change vendor user...

Вместо этого используйте git rebase для обновлений, чтобы сохранить историю ветвей линейной.

git checkout feature
git rebase master

 * daf9f2d [feature] Require compatible...
 * 3547419 Public recompile.
 * 1234567 [master] another master commit
 * e0d2740 N/A
 * 6b2385f Apply Codestyles:
 * 08c6f59 Change vendor user...

Затем git merge --no-ff (нет-fast-forward) для сохранения всплывающей подсказки.

git checkout master
git merge --no-ff feature
git branch -d feature

* abcd1234 [master] merge feature
|\
| * daf9f2d Require compatible...
| * 3547419 Public recompile.
|/
* 1234567 another master commit
* e0d2740 N/A
* 6b2385f Apply Codestyles:
* 08c6f59 Change vendor user...

Поскольку слияние ничего не делает, когда вы проверяете ветвь перед слиянием, вы также проверяли код и после слияния. Теперь вам нужно только один раз проконтролировать ветку.

Если вы хотите улучшить свою историю, используйте git rebase -i, чтобы поместить что-то в эти N/A сообщения коммита.

Но если вы хотитестереть эту важную информацию ...


  • Восстановить мастер и ветку перед объединением.

Это эффективно отменяет объединение.

git branch -f master e0d2740
git branch -f feature daf9f2d

   * daf9f2d [feature] Require compatible...
   * 3547419 Public recompile.
 * | e0d2740 [master] N/A
 * | 6b2385f Apply Codestyles:
 |/
 * 08c6f59 Change vendor user...
  • Перебазировать объект поверх мастера.

Ветвь функции была сделана поверх 08c6f59, но теперь вы помещаете ее поверх e0d2740. Могут быть конфликты.

git checkout feature
git rebase master

 * daf9f2d [feature] Require compatible...
 * 3547419 Public recompile.
 * e0d2740 [master] N/A
 * 6b2385f Apply Codestyles:
 * 08c6f59 Change vendor user...
  • Быстрая перемотка мастера к функции.

Выполнение слияния с прямым предком приведет к "быстрой перемотке вперед". Коммит слияния не требуется, Git просто перемещает метку ветки вперед.

git checkout master
git merge feature

 * daf9f2d [feature][master]]Require compatible...
 * 3547419 Public recompile.
 * e0d2740 N/A
 * 6b2385f Apply Codestyles:
 * 08c6f59 Change vendor user...
  • Удалить функцию
git branch -d feature

 * daf9f2d [master]]Require compatible...
 * 3547419 Public recompile.
 * e0d2740 N/A
 * 6b2385f Apply Codestyles:
 * 08c6f59 Change vendor user...
1 голос
/ 05 октября 2019
git checkout daf9f2d
git rebase e0d2740
# if this is what you want
git branch -f master
# push as needed
0 голосов
/ 05 октября 2019

Самый простой способ - просто использовать команду rebase. По умолчанию Rebase удаляет коммиты слияния. Находитесь в основной ветке и используйте эту команду:

git rebase 08c6f59 #use the commit id of the latest commit you do not want to change.

Это создаст одну строку из всех затронутых коммитов. Вы также можете использовать git rebase --interactive, если вам нужен больший контроль, например, чтобы установить точный порядок коммитов.

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

0 голосов
/ 05 октября 2019

Отказ от ответственности: вы не сможете сделать это, не изменив историю master.

Если я правильно понял, вы хотите отменить слияние и применить две фиксации этой ветвинепосредственно к master.

Обратите внимание, что есть много способов сделать это. Вот что я хотел бы сделать:

Это отправная точка:

*   a86813e (HEAD -> master) Merge branch 'branch'<Philipe Fatio>
|\  
| * 0c96fc9 (branch) B2
| * ec8db76 B1
* | 791f2e2 M4
* | c8b2a58 M3
|/  
* fa16cb9 M2
* 20beb8a M1

Сначала отмените объединение на master:

git checkout master
git reset --hard HEAD^

Это дает намэтот график:

* 0c96fc9 (branch) B2
* ec8db76 B1
| * 791f2e2 (HEAD -> master) M4
| * c8b2a58 M3
|/  
* fa16cb9 M2
* 20beb8a M1

Теперь перебазируем вашу ветку поверх master. Поскольку кажется, что у вас больше нет ветви, указывающей на последний коммит перед слиянием, вам придется вместо этого извлечь этот SHA.

git checkout branch
git rebase master

Это дает нам следующий график:

* b79074d (HEAD -> branch) B2
* 829f920 B1
* 791f2e2 (master) M4
* c8b2a58 M3
* fa16cb9 M2
* 20beb8a M1

Теперь вы можете объединить ветку в master с ускоренной перемоткой вперед (--ff):

git checkout master
git merge --ff branch

По сути, это то же самое, что и сброс master в ветку:

git checkout master
git reset --hard branch

Наш окончательный график выглядит так:

* b79074d (HEAD -> master, branch) B2
* 829f920 B1
* 791f2e2 M4
* c8b2a58 M3
* fa16cb9 M2
* 20beb8a M1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...