tag - tipos de etiquetas en git
Git: mover los cambios fuera de la rama maestra (6)
A partir de su descripción, asumo que aún no ha realizado ningún cambio, ¿es correcto?
Si es así, aquí están tus respuestas:
Cómo evitar ediciones directas a master
Necesitarías establecer eso en tu editor, pero eso probablemente será difícil. Mostrar su rama actual en su solicitud y su editor ayuda mucho.
Cómo mover los cambios a una nueva rama nueva rama new-working-branch
y luego descartar working-branch
git checkout -b new-working-branch
git add …
git commit -m "mycommit"
Como todavía no has comprometido nada para dominar, no necesitas cambiar nada en el maestro. Ahora puedes descartar tu rama de trabajo si lo deseas.
Cómo mover los cambios a working-branch
git checkout -b temp-branch
git add …
git commit -m "mycommit"
git rebase --onto working-branch master
git checkout working-branch
git reset --hard temp-branch
git branch -d temp-branch
Si sus cambios no entran en conflicto con los cambios que están en el maestro, pero no en la rama de trabajo, esto se puede hacer mucho más simple:
git stash
git checkout working-branch
git stash pop
Pregunta básica pero esto me pasa todo el tiempo:
- Hacer cambios en una
working-branch
- Cambiar a
master
-
git merge working-branch
-
git push
-
cap deploy
(a la puesta en escena) - hacer una nueva taza de té
luego vuelvo y pienso en otra cosa y empiezo a hacer algunos cambios ... mientras aún estoy en master.
¿Qué es una manera fácil de:
- evitar ediciones directas en el master (advertencia quizás)
- para mover todas las ediciones a
working-branch
y borrar elmaster
para que pueda continuar editando enworking-branch
- ¿Para girar las ediciones en una rama completamente nueva, nueva rama
new-working-branch
y luego descartarworking-branch
?
Tomó un riesgo y probó una recomendación en la última parte de la sección "Ramas" de esta página, ¡¡ pero eso acabó con TODAS mis ediciones!?! tal vez porque después de git branch dubious-experiment
y git checkout master
el git status
en ambas sucursales era idéntico (no "limpio" en master). Así que git reset --hard <SHA1sum>
eliminó todos los cambios en ambos!?!
git branch dubious-experiment
M---N-----O----P---Q ("master" and "dubious-experiment")
git checkout master
# Be careful with this next command: make sure "git status" is
# clean, you''re definitely on "master" and the
# "dubious-experiment" branch has the commits you were working
# on first...
git reset --hard <SHA1sum of commit N>
Adquiera el hábito de escribir $ git status
antes de ejecutar un comando git que modifique algo.
Dado esto, probablemente haya editado su archivo pero no lo haya registrado, porque ejecutaría el git status
antes de la confirmación. En este caso, git hace lo correcto si simplemente cambias las ramas y luego las confirmas.
Si ha disparado un commit a master, entonces simplemente mueva el archivo entre ramas con algo como esto:
$ git checkout --patch master <somefile>
Realmente no tiene que restablecer el maestro si solo va a combinar el mismo archivo con él, pero como es de suponer que todavía no ha introducido nada, solo debe restablecer las ramas de seguimiento remoto ...
$ git reset master origin/master
$ git reset stage origin/stage # whatever
Generalmente recomiendo la siguiente configuración de Git:
git config push.default nothing
Con esto, al menos tendrás que nombrar la rama cuando empujes. No impedirá que se comprometa a dominar localmente, pero cuando se da cuenta de que lo ha hecho, puede mover esos compromisos a una rama sin afectar a nadie.
Si ya ha realizado los cambios para master
pero no ha presionado a ningún lado ...
Crea una nueva rama para los últimos cambios.
git checkout -b newfeat master
vuelva a reproducir todos los cambios (mueva las confirmaciones) en la parte superior de su rama de trabajo
git rebase --onto working-branch origin/master newfeat
cambiar a la rama master
y restablecerla al estado del último impulso
git checkout master
git reset --hard origin/master
En este punto tienes:
-
master
apuntando a la última confirmación empujada (origin/master
) -
working-branch
nunca cambió - una nueva rama
newfeat
que contiene todos los nuevos compromisos y está por delante deworking-branch
deworking-branch
.
Utilicé para casos similares:
git branch -f <branch-name>
git checkout <branch-name>
o
git checkout -B <branch-name>
.
Ambas variantes mueven el branch-name
la rama a su compromiso actual sin reiniciar el árbol.
1. evitar ediciones directas en el master (advertencia quizás)
No eres el único que quiere esto. La mejor idea que he encontrado es poner la rama git directamente en el indicador de shell. Mi mensaje se ve así:
[user@host directory:git_branch]
También coloreé la entrada de git_branch, por lo que es bastante obvio en qué estoy trabajando en todo momento. These two enlaces en deberían ayudar con su solicitud.
2. para mover todas las ediciones a la rama de trabajo y borrar el maestro para que pueda continuar editando en la rama de trabajo
o
3. ¿Para girar las ediciones en una rama completamente nueva, nueva rama de trabajo y luego descartar la rama de trabajo?
Estas son realmente la misma pregunta: cómo mover los cambios del maestro a una rama, ya sea una rama antigua o una nueva. Y tu propia respuesta es correcta. Aunque a segunda vista, asumiendo que eres un maestro, podrías simplemente ejecutar:
git branch new_branch
git reset --hard origin/master
Prefiero simplemente restablecer master a origin / master en lugar de preocuparme por un SHA de confirmación específico. Pero tus pasos fueron esencialmente correctos. En cuanto a por qué perdiste los cambios, tendría que pensar que, por error, no había un puntero de bifurcación a Q cuando restableciste el maestro. Ninguna otra explicación tiene sentido. Una vez más, tener el indicador de shell de la rama ayudará a evitar estos errores. Además, soy un gran fan del uso de gitk o git log --graph para verificar dónde están mis sucursales antes de moverlas. Como no puedo usar gitk fácilmente en el trabajo, tengo un alias en mi .gitconfig llamado "gráfico", que es esencialmente una versión de la línea de comandos:
[alias]
graph = log --graph --all --date=short --pretty=format'':%C(yellow)%h%Cblue%d%Creset %s %Cgreen %aN, %ad%Creset''
Esto mostrará el gráfico en el extremo izquierdo, el SHA de confirmación en amarillo, las ramas en azul, el mensaje de confirmación en blanco y el autor y la fecha en verde. Por supuesto esto puede ser modificado a su gusto.
[editado para simplificar los comandos anteriores]
==============================
En respuesta al comentario a continuación:
Empezar con
A-B < origin/master
/
C-D < master
Ahora ejecuta git checkout -b new_branch
A-B < origin/master
/
C-D < master, new_branch
Ahora compruebe maestro, git checkout master
. Tenga en cuenta que git checkout -b new_branch && git checkout master
es el mismo que git branch new_branch
si ya estaba en master. Edité la respuesta anterior para reflejar esto.
Ahora reinicie master a origen / master, git reset --hard origin/master
A-B < master, origin/master
/
C-D < new_branch
Debido a que tenía una rama (new_branch) apuntando a D, no se pierden cambios. Si he cometido un error, por favor explique dónde.