git reset
est tout au sujet de se déplacer HEAD
.
Question: quel est le travail de l'arbre et de l'index?
Lorsqu'ils travaillent avec des --soft
, se déplace HEAD
, et seulement l' HEAD
.
Cette diffèrent commit --amend
comme:
- il n'est pas de créer un nouveau commit.
- il permet en fait de déplacer la TÊTE de tout commit (
commit --amend
n'est sur de ne pas bouger la TÊTE, tout en permettant de refaire le commit courant)
Je viens de trouver ce exemple de combinaison:
- un classique de fusion
- un sous-arbre de fusion
tous en un seul (le poulpe, car il n'y a plus de deux branches fusionné) commit de fusion.
Tomas "wereHamster" Carnecky explique dans son "sous-arbre Pieuvre fusion" article:
- Le sous-arbre de fusion stratégie peut être utilisée si vous souhaitez fusionner un projet dans un sous-répertoire d'un autre projet, et par la suite de garder le sous-projet jusqu'à ce jour. C'est une alternative à submodules.
- Le poulpe de fusion de la stratégie peut être utilisée pour fusionner trois ou plus de branches. La stratégie normale peut fusionner les deux seules branches et si vous essayez de fusionner, de plus, git automatiquement revient à la pieuvre de la stratégie.
Le problème, c'est que vous pouvez choisir seulement une stratégie. Mais j'ai voulu combiner les deux afin d'obtenir un propre histoire dans laquelle le dépôt est automatiquement mis à jour vers une nouvelle version.
J'ai un superproject, appelons - projectA
, et un sous-projet, projectB
, que j'ai regroupées dans un sous-répertoire de projectA
.
(c'est le sous-arbre de fusion de la partie)
Je suis également le maintien de quelques modifications locales.
ProjectA
est régulièrement mis à jour, projectB
a une nouvelle version tous les deux jours ou semaines, et en général dépend d'une version particulière d' projectA
.
Quand je décide de mettre à jour les deux projets, je ne pas simplement tirer à partir d' projectA
et projectB
car cela permettrait de créer deux s'engage pour ce qui devrait être un atomiques mise à jour de l'ensemble du projet.
Au lieu de cela, j'ai créer un seul commit de fusion qui combine projectA
, projectB
et de ma région s'engage.
La partie délicate est que c'est un poulpe de fusion (trois têtes), mais projectB
doit être fusionné avec le sous-arbre de la stratégie. C'est donc ce que je fais:
# Merge projectA with the default strategy:
git merge projectA/master
# Merge projectB with the subtree strategy:
git merge -s subtree projectB/master
Ici, l'auteur a utilisé un reset --hard
, puis read-tree
de restaurer ce que les deux premiers fusionne l'avait fait à l'arbre de travail et de l'index, mais c'est là que reset --soft
peut vous aider:
Comment puis-je refaire ces deux fusions, qui ont travaillé, c'est à dire mon arbre de travail et les index sont bien, mais sans avoir à enregistrer ces deux commits?
# Move the HEAD, and just the HEAD, two commits back!
git reset --soft HEAD@{2}
Maintenant, nous pouvons reprendre la Tomas de la solution:
# Pretend that we just did an octopus merge with three heads:
echo $(git rev-parse projectA/master) > .git/MERGE_HEAD
echo $(git rev-parse projectB/master) >> .git/MERGE_HEAD
# And finally do the commit:
git commit
Donc, à chaque fois:
- vous êtes satisfait de ce que vous vous retrouvez avec (en terme de travail de l'arbre et de l'index)
- vous êtes pas satisfait avec tous les changements que vous avez pris pour y arriver:
git reset --soft
est la réponse.