Git rebase ABCD: у родителя A есть ребенок B и ребенок C, и оба B & C являются родителями D - PullRequest
1 голос
/ 06 декабря 2011

У меня есть дерево, которое выглядит следующим образом

  B
 / \
A   D
 \ /
  C

B и C не конфликтуют. То, что я хочу, это показать в моей истории как A-B-C-D.

Как я могу сделать это в Git? Я искал, но не могу найти ответ. Я заинтересован в том, чтобы внести изменения, потому что я не хочу усложнять ситуацию и не знаю, как отменить это (есть ли способ отменить последнюю команду git в git?)

1 Ответ

2 голосов
/ 06 декабря 2011

Если вы хотите проверить что-то, просто клонируйте свой репозиторий и играйте в клон.

$ git clone your_repo test_repo
$ cd test_repo

В вашем случае D должен быть просто коммитом слияния, который не содержит многоесли B и C не конфликтуют.Таким образом, простой ребаз будет работать

$ git rebase branch_of_B branch_of_C

Попробуйте это в пустом хранилище:

echo A > file1
git add file1
git commit -m A
git checkout -b B
echo B > file2
git add file2
git commit -m B
git checkout master
git checkout -b C
echo C > file3
git add file3
git commit -m C
git checkout -b merge_branch
git merge B
echo D > file4
git add file4
git commit -m D

Теперь у вас есть это (запустить gitk --all):

   B
  / \
 A   M - D
  \ /
   C

и вы на D.Вы можете выдать

$ git rebase B
First, rewinding head to replay your work on top of it...
Applying: C
Applying: D

И у вас останется:

A - B - C' - D'
 \
  C

с C' и D', идентичным C и D с точки зрения "содержимого"».Если вы хотите очистить, вы можете удалить ветку C в этом примере, но вам придется ее принудительно использовать, так как это приведет к исходной фиксации C.

$ git branch -D C
...