Si ha publicado, tiene razón en que no desea volver a escribir el historial de master
. Lo que desea es publicar una confirmación de dominio que la devuelva al estado en que se encontraba al D
, conservando su historial actual para que otros usuarios puedan fusionar o modificar su trabajo fácilmente.
Si está pensando en algún momento en el futuro para fusionar topic
en master
entonces lo que probablemente también quiere hacer es realizar una nueva base común entre master
y topic
, de modo que cuando usted posteriormente combinar topic
, usted don' t pierde las confirmaciones que se revertieron en master
. La forma más fácil de hacerlo es haciendo una confirmación 'rehacer' encima de la confirmación 'deshacer' que restablece master
a su estado original y basando la nueva rama topic
encima de eso.
# checkout master branch (currently at G)
git checkout master
# Reset the index to how we want master to look like
git reset D
# Move the branch pointer back to where it should be, leaving the index
# looking like D
git reset --soft [email protected]{1}
# Make a commit (D') for the head of the master branch
git commit -m "Temporarily revert E, F and G"
# Create the new topic branch based on master.
# We're going to make it on top of master and the 'undo'
# commit to ensure that subsequent merges of master->topic
# or topic->master don't merge in the undo.
git checkout -b topic
# Revert the undo commit, making a redo commit (G').
git revert HEAD
Como una alternativa que podría haber hecho, comete E 'F' y G 'rehacer cada parte por separado, sino como E, F y G están ya en su historial publicada es probablemente más comprensible si sólo referencia a la' deshacer 'cometer y decir que ese compromiso se está deshaciendo. Esto es lo que hace git revert
, de todos modos.
Esencialmente, lo que sabes es esto.
D -- E -- F -- G -- D' <-- master
\
\
G' <-- topic
Lo importante es que usted no ha reescrito la historia y el tema principal se basa en lo que se funde no querer aplicar cualquier 'deshacer' comete. Ahora puede presionar con seguridad master
y topic
en su repositorio remoto.
Gracias, esto es exactamente lo que hice ahora (también lo que sugerí en algunos de los comentarios a Jefromi). La historia es un poco fea ahora debido a este deshacer-commit, pero no puedo hacer nada al respecto. – Albert
2 semanas git usuario aquí. ¿No sería más fácil primero ramificar G a G ', y luego 'git revertir' G a D, dando como resultado D '? De esa forma no tienes que deshacer/rehacer nada, lo cual me parece mucho más seguro. (Ya he perdido ediciones irrecuperables debido a jugar con 'git reset'.) – bart
@bart, eche un vistazo a' git reflog'. Las cosas que se han cometido y posteriormente se han estropeado siempre deben poder recuperarse a través del reflog, al menos durante algunos días. Sin embargo, puede perder irrevocablemente los cambios que nunca cometió. – dubiousjim