Question

J'ai deux branches qui sont assez différentes que rebasage semble pas fonctionner - ou je ne sais pas comment le faire

.

J'ai une branche « public » avec un tas de fichiers supprimés (avec filtre branche). Même si la plupart des commits correspondent en termes de deltas, la validation ids sont toutes différentes. J'ai essayé pas mal de méthodes pour tirer des changements de ma branche dev ma branche publique ... Je trouve qu'il est difficile de croire qu'il peut faire ce que je veux faire - mais je pense que je ne sais pas comment fais le. Dans tous les cas, cela fonctionne très bien, mais semble mal.

git checkout dev
git format-patch --stdout last_sync_tag > catchup.mbox
git checkout public
git am catchup.mbox
git --skip # talks about a missing file
git --skip # talks about a missing file
git --skip # talks about a missing file

Des conseils ou des suggestions, ce qui inclut probablement pas le filtre-ramifient les fichiers que vous ne voulez pas sur la branche publique (bien que, comment voulez-vous alors se débarrasser d'eux?), Sont les bienvenus.

Mon arbre (s) plus ou moins regarder comme ceci:

dev: a-b-c-d-e-f-g-h-i-j-k
pub: t-u-v-w-x

t ≅ a, u ≅ c, v ≅ d, w ≅ e, x ≅ g. i, j, k sont nouveaux patches que je voudrais passer plus.

checkout pub
rebase --onto pub i  # I really expected this to work
Était-ce utile?

La solution

cherry-pick peut être utile. Je ne l'ai pas utilisé dans votre situation, mais je pense que cela devrait fonctionner. La douleur est seulement que ce n'est pas conçu pour fonctionner sur une plage de commits donc si vous voulez script / automatiser vous auriez à utiliser quelque chose comme git rev-list.

Encore une fois, je ne l'ai pas essayé, mais un script bash comme cela peut vous donner un bon point de départ

git checkout public
for rev in $(git rev-list --reverse last_sync_tag..dev) ; do
   git cherry-pick $rev && git tag -f last_sync_tag $rev || exit 1
done

Autres conseils

Avez-vous Entretenez régulièrement les fichiers sur votre branche dev qui ne sont pas sur des partenariats public? Ou sont-ils simplement suspendus autour?

Si vous n'avez pas tendance à apporter des modifications à eux, et vous êtes OK avec la réécriture de l'histoire un peu, ce que vous pouvez faire est d'organiser leur création comme un engagement en fonction de votre branche publique; et que la fusion de nouveau dans public, mais avec « -s nous » pour les arrêter d'obtenir réellement. ( réponse déjà nôtre de fusion git)

Quelque chose comme:

git checkout -b dev public
git am create-dev-only-files.patch
git checkout public
git merge -s ours dev
git checkout dev
# write more dev patches...
git checkout public
git merge dev
# and this should merge in the patches without bringing in the
#  dev-only files

Donc, si vous ensuite apporté des modifications ultérieures sur votre branche dev et les Fusionné en public si vous ne changez pas les fichiers qui ne sont pas en public tout le reste simplement appliquer. Mais si l'ensemble des fichiers que vous souhaitez supprimer sur les changements publics, cela pourrait être difficile. Vous pouvez essayer de l'empêcher en ajoutant un crochet pre-commit à désindexer fichiers particuliers avant de commencer toute commettras sur la branche publique, par exemple.

Parce que vous avez utilisé « filtre-branche » vous allez devoir aider git trouver le bon commettras pour effectuer le rebasage sur.

Je vais deviner ici, mais on peut supposer que vous avez un « presque » de commettre commun qui a deux versions, la tête de votre branche publique et la place sur votre branche dev que ce commit correspond à (non filtré). Appelez la tête du public engager <PH> et le dev engager que cela correspond à (avant filtration) <DevPH>.

avec la branche dev vérifié, vous voulez faire quelque chose comme ceci:

git rebase --onto <PH> <DevPH>

Ceci indique rebasage de prendre les correctifs introduits par chaque commit depuis <DevPH> sur la branche actuelle et d'appliquer ces commits à <PH>. Je pense que c'est ce que vous avez besoin.

Edit:

Votre mise à jour à la question montre que h est équivalent à la tête du flux du public sur la branche dev et que vous voulez transplanter tout à partir d'ici sur la branche dev sur la branche publique. Dans ce cas la commande est

git rebase --onto pub h

Eh bien, si je ne veux pas atterrit dans fileit .gitignore. Il est probablement la configuration du code pas réel donc il n'a pas besoin de suivi du tout.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top