Comment squash s'engage sur Bitbucket après qu'ils ont été poussés?
Je suis actuellement en train de travailler sur un projet avec plusieurs autres. Le problème est que nous avons créé un fork d'un projet existait et besoin de squash tous nos commits après la bifurcation processus à une seule de s'engager pour une pull-request sur Bitbucket.
Est-il de toute façon (en utilisant de préférence SourceTree, sinon terminal) pour écraser déjà poussé s'engage à un seul commit, tels que l'histoire à l'intérieur de Bitbucket de tous les commits sont aussi seul qu'un commit plus les commits qui étaient déjà là avant nous forké le projet?
Prendre comme exemple un simple projet avec quelques fichiers seulement un master
branche.
Vous aurez besoin de réécrire l'histoire à distance, ce qui peut avoir des implications. Êtes-vous OK avec cela?
Biegeleisen que c'était ce Que je cherchais, une idée de comment faire cela?
Les deux réponses ci-dessous semblent corrects. Utilisation
Biegeleisen que c'était ce Que je cherchais, une idée de comment faire cela?
Les deux réponses ci-dessous semblent corrects. Utilisation
git rebase -i
la courge et l'engage.OriginalL'auteur Joshua | 2016-01-08
Vous devez vous connecter pour publier un commentaire.
Trouvé un bon résumé de la publication des réponses. Celui-ci est un peu plus clair:
squash poussé s'engage.
Il faudra créer une deuxième branche lors de la création de la fourche. Cette deuxième branche peut avoir autant de pousse vers le serveur distant en tant que de besoin.
Créer une nouvelle branche personnelle qui sera écrasé.
# Start avec le personnel existant de la branche qui contient tous vos commits.
$git checkout {ExistingBranchName}
# Créer une nouvelle branche personnelle qui sera écrasé.
$git checkout -b {BranchName}
Identifier le premier commit où votre branche personnelle ont divergé à partir d'un CEF de la branche.
# Remplacer {BranchName} avec votre nouveau nom de la branche.
# Remplacer "master" avec un autre CEF branche approprié (par exemple, "2272", "2171", etc).
$git merge-base {BranchName} maître
Commencer un rebase interactif à l'aide de la validation de hachage retourné à partir de l'étape 2.
$git rebase --interactive {hash}
Cela permettra de lancer un éditeur de texte avec une liste de tous les commits dans votre branche personnelle. Il devrait ressembler à quelque chose comme ceci:
choisissez 59d2a23 Initiale de mise en œuvre
choisissez 752ae4c Ajouter plus de fonctionnalités
choisissez cd302a3 Réparer quelque chose
choisissez 5410de3 Réparer quelque chose d'autre
Changement de tous, mais la première ligne pour dire "squash" au lieu de "choisir". Le contenu devrait maintenant ressembler à ceci:
choisissez 59d2a23 Initiale de mise en œuvre
squash 752ae4c Ajouter plus de fonctionnalités
squash cd302a3 Réparer quelque chose
squash 5410de3 Réparer quelque chose d'autre
Enregistrer les modifications et fermez le fichier (qui Peut être fait en appuyant sur
esc
et type::wq
.Un nouveau fichier va s'ouvrir contenant les messages de validation de tous les commits. Reformuler le message de validation puis enregistrez les modifications et fermez le fichier.
Pousser les modifications à votre dépôt distant.
# Si la direction a déjà été poussé vers le dépôt distant, vous devez ajouter le
--force
argument.git push origin {BranchName} ou git push origin {BranchName} --force
OriginalL'auteur Joshua
Il y a un moyen plus simple.
Si vous êtes absolument certain que vous ne serez jamais utiliser cette branche spécifique, vous pouvez effectuer les opérations suivantes:
git reset --soft <hash>
git rebase -i
pour déplacer votre succursale locale de la pointe de maître.OriginalL'auteur Alwyn Schoeman
Notez que vous n'avez pas besoin de s'engager pour une pull request. Un ensemble de commits peut constituer une pull request.
Oui, vous pouvez utiliser un rebase interactif
git rebase -i
.Vous pouvez marquer les commits que vous voulez de squash (suivez les instructions à l'écran qui apparaissent dans votre éditeur de texte), puis d'écrire un nouveau message de validation lorsque vous avez terminé (utiliser
git rebase --continue
après chaque commit, vous avez travaillé sur).Si vous avez poussé déjà, vous aurez besoin de la force de poussée avec le
-f
option. Notez que c'est mal vu, que quelqu'un d'autre qui a tiré vers le bas de ces changements doit sauter à travers des cerceaux, potentiellement, de se resynchroniser avec le nouveau histoire.Il y a peut être un moyen de le faire dans SourceTree.
Lectures complémentaires.
Il ne sera pas si vous le squash.
Utilisation
fixup
au lieu depick
les écraser à un commit. Voir mon post ci-dessus.cette méthode fonctionne pour les espaces de stockage locaux. Mais le Bitbucket est un dépôt distant. En utilisant cette méthode, il sera toujours garder tout le passé s'engage dans son histoire. Dans la lecture que vous avez donné il a aussi affirmé que vous avez besoin pour éviter de changer l'histoire de dépôts distants, mais j'ai demandé à nouveau et la société veut vraiment everythin dans un seul commit, ce qui je pense n'est pas possible après coup. Avant de pousser, c'est facile et faisable en SourceTree ainsi
N'oubliez pas au-dessus ne fonctionne pas avec un Débordement de Pile du tri des commandes.
OriginalL'auteur alex
Utilisation
git rebase
!Commandes
Utiliser ces commandes dans le terminal, l'invite de commande ou dans votre cmd:
git rebase -i yourbranchname
pick
" à "fixup
" mais un commit doit avoir "pick
"!git push -f origin yourbranchname
Ressources utiles
OriginalL'auteur Suriyaa
Changement d'année de base est facile à faire avec SourceTree, dans sourcetree sélectionnez l'engager à vous en fonction de votre travail sur, puis appuyez sur le bouton droit de la souris.
Ensuite, un menu pop-up, sélectionnez "interactive" rebase " enfants de "
Cela va ouvrir une fenêtre où on peut choisir quoi faire avec chaque livraison. Puisque nous voulons squash chaque engager ensemble, nous, cliquez en haut à commettre et sélectionnez le bouton "Courge précédent" au bas de l'écran. Sourcetree sera mise à jour en haut de l'écran en réponse aux actions que vous avez de sorte que vous pouvez le voir faire ce que vous voulez.
Avant:
Après:
Habituellement, vous aussi vous voulez changer le message du commit lorsque vous écraser ensemble, double-cliquez sur le message pour le modifier. Si vous avez terminé les modifications, appuyez sur "ok" dans le coin en bas à droite. Source de l'Arbre va maintenant rebase l'histoire pour vous.
Terminé résultat:
Vous pouvez maintenant la force de pousser votre branche à votre fourchette de l'autre projet et d'essayer de faire une autre demande d'extraction.
OriginalL'auteur Ferrybig
Vous pouvez utiliser ce script pour le squash tous l'engagement de la branche courante et au final le message de validation.
#!/bin/sh
# bref: Ce script doit être exécuté à partir de votre repo git. Vous devez avoir votre branche
# vérifié. Cela va écraser tous les commits sur votre branche (en supposant que vous
# ramifiée à partir de maître). Ensuite, vous pouvez simplement utiliser le github PR de l'INTERFACE utilisateur de fusionner le PR. Vous avez besoin d'avoir
# branche extrait lorsque vous exécutez ce script (git checkout branche).
# usage: git-helper-squash-tous-les commits
# exemple: git-helper-squash-tous-les commits "la réorganisation de la structure de répertoire"
set-ex
FINAL_COMMIT_MESSAGE=$1
BRANCH_YOU_BRANCHED_FROM=maître
CURRENT_BRANCH=
git rev-parse --abbrev-ref HEAD
COMMIT_HASH=
git merge-base HEAD $BRANCH_YOU_BRANCHED_FROM
git reset --soft $COMMIT_HASH
git commit -am "$FINAL_COMMIT_MESSAGE"
git push origin $CURRENT_BRANCH --force
OriginalL'auteur Ravi Prajapati