web-dev-qa-db-fra.com

Combiner les deux premiers commits d'un dépôt Git?

Supposons que vous ayez une histoire contenant les trois commits UN B et C:

A-B-C

Je voudrais combiner les deux commits UNE et B à un commit UN B:

AB-C

J'ai essayé

git rebase -i A

qui ouvre mon éditeur avec le contenu suivant:

pick e97a17b B
pick asd314f C

Je change cela en

squash e97a17b B
pick asd314f C

Puis Git 1.6.0.4 dit:

Cannot 'squash' without a previous commit

Y a-t-il un moyen ou est-ce simplement impossible?

186
Christian

Utilisez git rebase -i --rootas de Git version 1.7.12 .

Dans le fichier de rebase interactif, changez la deuxième ligne de commit B en squash et laissez les autres lignes en pick:

pick f4202da A
squash bea708e B
pick a8c6abc C

Cela associera les deux commits A et B en un commit AB.

Trouvé dans cette réponse .

147
kostmo

Tu as essayé:

git rebase -i A

Il est possible de commencer comme ça si vous continuez avec edit plutôt que squash:

edit e97a17b B
pick asd314f C

puis courir

git reset --soft HEAD^
git commit --amend
git rebase --continue

Terminé.

125
David Lichteblau

A était la validation initiale, mais vous souhaitez maintenant que B soit la validation initiale. Les commits git sont des arbres entiers, pas de diffs même s'ils sont normalement décrits et vus en fonction du diff qu'ils introduisent.

Cette recette fonctionne même s'il y a plusieurs commits entre A et B et entre B et C.

# Go back to the last commit that we want
# to form the initial commit (detach HEAD)
git checkout <sha1_for_B>

# reset the branch pointer to the initial commit,
# but leaving the index and working tree intact.
git reset --soft <sha1_for_A>

# amend the initial tree using the tree from 'B'
git commit --amend

# temporarily tag this new initial commit
# (or you could remember the new commit sha1 manually)
git tag tmp

# go back to the original branch (assume master for this example)
git checkout master

# Replay all the commits after B onto the new initial commit
git rebase --onto tmp <sha1_for_B>

# remove the temporary tag
git tag -d tmp
63
CB Bailey

Dans le cas de rebase interactive, vous devez le faire avant A pour que la liste soit:

pick A
pick B
pick C

devenir:

pick A
squash B
pick C

Si A est le commit initial, vous devez avoir un commit initial différent avant que A. Git pense les différences, cela fonctionnera sur la différence entre (A et B) et (B et C). Par conséquent, la courge ne fonctionne pas dans votre exemple.

10
Loki

Si vous avez des centaines ou des milliers de commits, utilisez la réponse de kostmo de

git rebase -i --root

peut être peu pratique et lent, à cause du grand nombre de commits que le script de rebase doit traiter deux fois, une fois pour générer la liste interactive de l'éditeur de rebase (où vous sélectionnez l'action à exécuter pour chaque commit), et une fois pour réellement exécuter la nouvelle application des commits.

Voici une solution alternative qui évitera le temps nécessaire à la génération de la liste des éditeurs de bases interactives en n'utilisant pas de base interactive en premier lieu. De cette façon, il est similaire à solution de Charles Bailey . Vous créez simplement une branche Orphan à partir du second commit, puis vous rebasez tous les commits descendants:

git checkout --Orphan orphan <second-commit-sha>
git commit -m "Enter a commit message for the new root commit"
git rebase --onto Orphan <second-commit-sha> master

Documentation

8
user456814

Dans une question connexe, j’ai réussi à proposer une approche différente en ce qui concerne la nécessité d’écraser le premier commit, c’est-à-dire en faire le deuxième.

Si cela vous intéresse: git: comment insérer un commit en premier, en décalant tous les autres?

1
kch

Commande Git pour le groupe: Git rebase -i HEAD ~ [nombre de commits]

Disons que vous avez ci-dessous l'historique de git commit:


pick 5152061 feat: Ajout du support pour l'enregistrement des images. (UNE)
pick 39c5a04 Fix: corrections de bugs. (B)
choisir le correctif 839c6b3: résolution du conflit. (C)

Maintenant, vous voulez écraser A et B en AB, procédez comme suit:


pick 5152061 feat: Ajout du support pour l'enregistrement des images. (UNE)
s 39c5a04 Correction: corrections de bugs. (B)
choisir le correctif 839c6b3: résolution du conflit. (C)

Remarque: pour les commandes squash, nous pouvons utiliser squash ou s . Le résultat final sera:
pick 5152061 feat: Ajout du support pour l'enregistrement des images. (UN B)
choisir le correctif 839c6b3: résolution du conflit. (C)

0
Sumit