Git edit - не вижу изменений в исправленных совершенных изменениях в дочерней ветке - PullRequest
1 голос
/ 03 мая 2019

Я сделал следующее:

git checkout -b v1
<made some changes in the working directory, created commit c1 and push>
git checkout -b v2
<made some changes in the working directory, created commit c2 and push>
git checkout -b v3
<made some changes in the working directory, created commit c3 and push>
git checkout -b v4
<made some changes in the working directory, created commit c4 and push>

Так что теперь у меня есть следующая структура дерева мерзавцев:

M --- v1 --- v2 --- v3 --- v4
.
.

Я сделал еще несколько изменений в v1 и сделал следующее:

git checkout v1
<made some changes on working directory>
git add .
git commit --amend
git push origin v1 --force

Теперь, когда я проверяю на v4, я не вижу изменений в коммите c1, которые я нажал на v1 ... Где изменения и как я могу исправить этот беспорядок?

Ответы [ 2 ]

3 голосов
/ 03 мая 2019

Вот что произошло.

Вы сделали то, что сделали, и имели это:

M --- v1 --- v2 --- v3 --- v4

На самом деле, это не совсем правильно, у вас было это:

c1 --- c2 --- c3 --- c4 --- c5
^      ^      ^      ^      ^
M      v1     v2     v3     v4

У вас есть 5 коммитов и 5 веток, каждая из которых ссылается на свой соответствующий коммит.

Затем вы извлекли v1 и исправили этот коммит, который, в свою очередь, дал вам эту картинку:

c1 --- c2 --- c3 --- c4 --- c5
^  \          ^      ^      ^
M   \         v2     v3     v4
     c2'
     ^
     v1

Изменение коммита не меняет другие ветви или теги или коммиты, которые все еще ссылаются на старый коммит.Он просто создает новый коммит и указывает на него ветвь.

Что вам нужно сделать, это перебазировать v2 поверх нового v1, затем v3 поверх нового v2 и, наконец, v4 поверхновый v3.

Шаг за шагом это будет результатом перебазирования v2 поверх v3:

c1 --- c2 --- c3 --- c4 --- c5
^  \                 ^      ^
M   \                v3     v4
     c2' --- c3'
     ^       ^
     v1      v2

Как вы можете видеть здесь, c3 сохраняется, потому что c4все еще ссылается на него, и, таким образом, этот коммит все еще будет частью v3 и v4.

Наконец, после перебазирования v3 и v4 у вас останется:

c1 ( --- c2 --- c3 --- c4 --- c5 )
^  \                         
M   \                         
     c2' --- c3' --- c4' --- c5'
     ^       ^       ^       ^
     v1      v2      v3      v4

Обратите внимание, чтона диске c2-c5 все еще существуют, но поскольку в конце этой строки коммитов нет веток, тегов или других фиксаций, они теперь не видны в журнале и имеют право на сборку мусора, что происходит сейчаса потом.После выполнения GC у вас останется:

c1 
^  \                         
M   \                         
     c2' --- c3' --- c4' --- c5'
     ^       ^       ^       ^
     v1      v2      v3      v4

, что, конечно, так же, как это:

c1 --- c2' --- c3' --- c4' --- c5'
^      ^       ^       ^       ^
M      v1      v2      v3      v4
1 голос
/ 03 мая 2019

В ветке git содержится вся история, восходящая к началу репозитория, а не только история предыдущей ветки.Изменение или изменение ветки повлияет только на историю этой ветки.Попробуйте запустить gitk --all, чтобы увидеть, что происходит.

Вы можете использовать серию перебазировок для решения проблемы:

git rebase [sha of old v1] v2 --onto v1
git rebase [sha of old v2] v3 --onto v2
git rebase [sha of old v3] v4 --onto v3

Но в целом вам не нужно сохранятьv1 v2 и v3 разветвляются, так как все их данные находятся в v4.В будущем, если вы хотите изменить коммит с более ранней истории, используйте git rebase -i и измените его таким образом.

...