2011-08-29 12 views
15

No creo que esto sea posible, pero pensé que alguien podría tener una idea ingeniosa de cómo lograr esto:Obtener git para nunca presionar una sola confirmación?

Tengo un proyecto que comprobé que existía mucho antes de que lo tomara. Tengo alrededor de una docena de cambios en varios archivos que nunca quiero registrar (son todos cambios de configuración).

¿Hay alguna manera de confirmar este conjunto de cambios y nunca presionar ese compromiso? Sé que suena extraño :)

aclaración:

Quiero que estos cambios se queden en mi directorio de trabajo, los necesito para la aplicación para funcionar localmente. Quiero ser capaz de mantener cometer otros cambios a su alrededor, incluso cambios en el mismo archivo, pero nunca empujar los cambios de configuración a ningún otro sitio ...

Es algo así como antes de cada empuje que me gustaría:

  • cereza recoger y esconder éste cometió
  • rebase el que se comprometan a cabo
  • empuje
  • volver a aplicar este alijo a mi base de código

Respuesta

18

Este es un patrón similar al de mantener un parche local configurado para un proyecto ascendente que usted no controla. La forma más fácil de manejar esto es tener una rama intermedia que todos los cambios quedan fusionadas a través, de esta manera:

___________________________ master 
\__________________________ config-changes 
    \_____________________ daily-work 

master contiene todo lo que se va a compartir. Las únicas cosas comprometidas en config-changes son cambios que desea revertir fácilmente cuando se comparten. daily-work es la rama que hace todo su trabajo en Para configurarlo, hacerlo:.

# (no local config changes should be in master at this point) 
git checkout -b config-changes master 
# Make your config-related changes that you don't want to share 
git commit -am "Made local config changes" 
git checkout -b daily-work 
# Work and commit like normal 

Cuando esté listo para compartir sus cambios, hacer:

git rebase --onto master config-changes daily-work 
git checkout master 
git merge daily-work 

que revertirá todos los cambios hecho en config-changes, pero por lo demás hacer que parezca que se ramificó directamente desde master. Tenga en cuenta que después de hacer esta rebase, si desea continuar trabajando en daily-work, necesita volver a establecer la base en config-changes, pero es mejor crear una nueva rama para cada cambio.

Cuando tenga que tirar hacia abajo los nuevos cambios de master, hacer:

git checkout master 
git pull 
git checkout config-changes 
git merge master 

La fusión vuelve a aplicar los cambios de configuración locales en el más nuevo maestro. Entonces puede crear una nueva rama daily-work, o combinar config-changes en la antigua, según corresponda. Básicamente, nunca se fusiona directamente desde master en daily-work. Siempre pasa por config-changes primero.

Al principio parece mucho trabajo, pero una vez que lo haga una o dos veces verá que es mucho más fácil que mantener los cambios manualmente.

+0

Impresionante, esto es exactamente lo que estaba buscando/esperando. ¡Gracias! –

+0

Esto fue muy útil. ¡Gracias! – Pat

+0

SmartGit tiene una función llamada "Rebase interactivo" que le permite mover los commits hacia arriba y hacia abajo fácilmente. En este caso, mover el cambio de "config-changes" a top-top es fácil en el diálogo. Luego, simplemente presione la confirmación justo antes de "config-changes". Como medida preventiva para evitar presionar accidentalmente mis commits de temperatura, agrego un prefijo "TMP:" en el mensaje de confirmación, y luego agregué un push-hook local para avisarme cuando presiono accidentalmente mis commits de temperatura. – Ryuu

0

Sí, basta con crear una rama separada y almacenar estos cambios no:

git checkout -b your-new-branch 
git commit -a 

Después de que haya terminado la comisión, sólo tiene que ir de nuevo a su sucursal original y olvidarse de estos cambios.

+0

Creo que él quiere los cambios en la rama en la que está trabajando ahora. Volver atrás eliminaría los cambios. – manojlds

+0

Quiero los cambios en mi código base local. es decir, los quiero a todos en mi directorio de trabajo, simplemente no quiero que los empujen a ningún lado. Si hago esto en una sucursal, no veo cómo alguna vez tendré acceso a estos cambios y a los que deseo. –

+0

Posiblemente ese sea el caso. Esperaré a que los lobos me aclaren. –

3

Utilice git update-index --assume-unchanged en estos archivos para hacer que git piense que los archivos no se han modificado.

Después de los comentarios, una alternativa es tener una rama separada de la que presiona. Los commits en esta rama son escogidos de la rama de trabajo. Por eso, cuando desee presionar, cambie a la rama "push", seleccione "cherry-pick" desde "trabajo" y presione.

+0

Si estoy leyendo los documentos correctamente, ¿esto es similar a un 'git ignore'? –

+0

@cwolves - Esto es para "ignorar" los cambios en los archivos que ya están rastreados. 'git ignore' es para ignorar archivos del repositorio. – manojlds

+0

ahh, gotcha. Gracias, pero no exactamente lo que necesito, necesito poder comprometerme más tarde con ese archivo, pero no con los cambios que hice previamente ... Estoy trabajando en un proyecto donde la "configuración" está dispersa entre una docena de archivos que también necesito modificar más tarde. Idealmente, consolidaría todo esto en archivos de configuración de uno o dos, pero está tan ligado a todo lo que tomaría medio día hacer ... –

Cuestiones relacionadas