marko-36
Estoy empezando a aprender Git. He estado jugando con GitKraken y espero que usar una GUI sea un camino viable para guardar y compartir cosas. Prefiero las GUI a la línea de comandos.
Ahora entiendo, en la GUI, necesito stage
archivos, entonces commit
ellos y luego push
, para subirlos. Pero por qué son push
y commit
dos cosas diferentes? ¿Por qué querría simplemente commit
localmente, sin la siguiente carga para mantener los archivos sincronizados?
Matt Messersmith
Un par de razones (concretas). TLDR en negrita.
La primera razón es que es posible que no pueda presionar el control remotoporque no estás conectado a Internet.
La segunda razón es que a veces las confirmaciones no están listas para enviarse.. Por ejemplo, practico TDD. Después de confirmar una prueba fallida (lo cual hago), no quiero enviarla al control remoto, porque entonces mi equipo puede generar un conjunto de pruebas fallidas. Otra práctica común es aplastar estas confirmaciones antes de eliminarlas para que parezca que la característica fue una única confirmación.
La tercera razón es que es un proyecto personal que no quieres compartir con nadie., por lo que no hay ningún control remoto al que presionar. No es necesario tener un control remoto con un repositorio git.
La cuarta razón es que puede tener múltiples controles remotos (en general, la semántica distribuida se interpone en el camino). Entonces, después de comprometerse, ¿cómo sabría Git a qué control remoto desea presionar? ¿Todos ellos? ¿Uno en particular? ¿Un cierto dos de los siete? La inserción debe ser explícita desde la perspectiva de git debido a que la semántica de git es un VCS distribuido. Vea la respuesta de poke para más detalles.
PD Esto está fuera del tema de la pregunta, pero los shells de línea de comando (incluido bash) son interfaces extremadamente poderosas una vez que aprende a usarlos. Una vez que domines estas herramientas, usarlas es mucho más rápido que cualquier GUI que puedas encontrar. Esto tiene que ver con el hecho de que puede realizar acciones poderosas con pulsaciones de teclas en lugar del mouse, y que es infinitamente personalizable para satisfacer sus necesidades.
-
Por lo tanto, realizar cambios sin presionar permite que el comportamiento de guardar y cargar se realice localmente durante el desarrollo. Una vez que estés satisfecho con tu trabajo, te comprometes Y presionas. ¿Es eso correcto? ¿Qué es “aplastar confirmaciones” busqué en Google y entiendo que significa fusionar confirmaciones? Gracias.
– marko-36
12/08/2018 a las 13:00
-
Tenga en cuenta que esta respuesta se centra principalmente en los posibles casos de uso que obtiene de esta separación, por ejemplo, preparar las confirmaciones antes de compartirlas. Pero también existen requisitos técnicos debido a la naturaleza distribuida de Git.
– dar un toque
12 de agosto de 2018 a las 13:01
-
@ Marko36 Sí, básicamente lo tienes. Una vez que esté satisfecho con el “nuevo” estado que todos verán, puede impulsar su trabajo. Esto puede o no ser después de una sola confirmación. Aplastar confirmaciones solo significa convertir una pila de confirmaciones en una única confirmación. Entonces, si tengo 10 confirmaciones, es posible que no quiera que todos vean las 10 confirmaciones que hice. Tal vez estaba jurando en el registro de confirmación, o no tendría sentido volver a algunas de las confirmaciones (como una confirmación de prueba fallida). Entonces, en su lugar, aplasta las confirmaciones en 1 confirmación (localmente) y luego presiona esa confirmación única (el mismo contenido que las 10 confirmaciones).
–Matt Messersmith
12 de agosto de 2018 a las 13:04
-
@poke Buena observación, actualicé con otro ejemplo concreto (caso de uso), pero traté de aludir a una razón más abstracta sobre la semántica distribuida… con suerte eso te quita el picor.
–Matt Messersmith
12 de agosto de 2018 a las 13:09
-
@MattMessersmith Sí, eso funciona para mí. Por cierto. mi comentario no pretendía ser una crítica, sino solo señalar el enfoque de su respuesta. Creo que nuestras dos respuestas hacen un buen par ya que me enfoqué completamente en el aspecto técnico mientras cubría los casos de uso 🙂
– dar un toque
12 de agosto de 2018 a las 13:12
Git es un sistema de control de versiones distribuido. Como tal, no hay único repositorio central, como con Subversion o incluso CVS. Entonces, si hubiera un solo comando para confirmar y enviar, ¿a dónde iría esa confirmación? ¿Cuál sería el repositorio remoto?
En Git, no hay un repositorio central. Ni siquiera hay ninguna jerarquía en los repositorios. Para un repositorio local, alguna otro repositorio es un repositorio remoto con el que puede interactuar. Y el repositorio local es solo un posible repositorio remoto para cualquier otro repositorio.
Entonces, local y remoto son solo puntos de vista relativos a su ubicación actual: el repositorio local es siempre el repositorio actual, y todos los demás repositorios son remotos con los que puede interactuar.
Cuando trabajas con Git, tu repositorio local es con lo que interactúas: envías todos tus cambios localmente. Esto tiene muchos beneficios y casos de uso que no detallaré aquí, pero esencialmente es lo que hace que el control de versiones se distribuya, ya que el repositorio local tiene toda la información, el historial completo.
Entonces, cuando tiene ese repositorio local, que tiene el historial completo y todos los cambios, necesita una forma de interactuar con otros repositorios para permitirle compartir el historial. Las dos formas de hacerlo son empujar y tirar (o buscar). Dado que con los repositorios distribuidos, todos los repositorios son iguales, cada repositorio puede empujar o extraer de otro (suponiendo que tengan acceso).
Al final, se requiere que confirmar y enviar sean pasos separados porque uno interactúa con el repositorio (local) mientras que el otro es un paso deliberado para compartir cambios con un repositorio remoto.
Otra respuesta: no hay una buena razón
En los viejos tiempos (como hace cinco años, historia antigua según los estándares actuales de memoria) la gente a veces no conectado a internet! ¡Y querían seguir trabajando! Así que simplemente se comprometieron mientras trabajaban. Cuando se lograba la conexión, continuaban y empujaban todas sus confirmaciones. Git fue diseñado con esto como paradigma principal.
Flash-forward todas esas épocas hasta el presente y he aquí, la mecánica de las versiones de nuestro software no ha cambiado (mucho).
Algunas personas han argumentado que mantiene todos sus compromisos locales hasta que esté satisfecho de que su código es sólido. Admiro sus instintos: proteger el código del repositorio principal; mantenerlo lo más impecable posible. ¡Sí, por supuesto, por favor hazlo!
Pero Git proporciona un mecanismo que funciona mucho mejor para el código no tan perfecto, se llama ramas. Cree una rama, trabaje en ella (empujando confirmaciones todo el tiempo) hasta que esté satisfecho, luego fusione esa rama con la principal. De esta manera, si algo le sucede a su computadora (caída del disco duro, derrame de café, robo, etc.), todo su trabajo aún estará respaldado. Ese es uno de los puntos del control de versiones, ¿verdad?
Sin embargo, otros han argumentado que en un sistema de desarrollo altamente distribuido, es necesario especificar dónde y cómo impulsar las confirmaciones. Esta es ciertamente una opción, pero todavía tengo que ver esto en la práctica. No me puedo imaginar una empresa diciéndoles a sus desarrolladores: “Salgan y cada uno de ustedes se quede con su propia copia del código. Dejaremos que se empujen y tiren unos de otros según sientan y esperen que nada salga mal o se complique”. confuso.” Sí. Es mucho más fácil configurar una cuenta de bitbucket o github y decirles a todos: “¡Usen esto como su origen!”
Así que para ser franco: solo presiona con cada compromiso. No hay inconveniente en hacer esto, y existe una pequeña posibilidad de perder el trabajo si no lo hace.
Sirven para diferentes propósitos. Cada confirmación debe cambiar un aspecto aislado del código; por ejemplo, cambie el nombre de una variable, reemplace las llamadas a una función con llamadas a otra, o simplemente corrija un error tipográfico en un comentario. Piense en ellos como puntos de reversión; Si cambio de opinión sobre el enfoque que tomé aquí, ¿puedo descartar un pequeño conjunto de confirmaciones y aún mantener estos otros cambios no relacionados?
Un impulso solo debe ocurrir cuando su serie de compromisos alcanza un nuevo punto estable en el desarrollo que se ha probado lo suficiente como para compartirlo con sus colegas o colaboradores.
No es imposible o inusual hacer un impulso para cada confirmación si está trabajando, por ejemplo, en la corrección de errores menores. Pero la mayor parte del tiempo, tiene sentido realizar cambios individuales a medida que avanza hacia un objetivo más amplio, y solo empujar cuando cree que ha alcanzado ese objetivo.
Como no usaría algo tan antiguo como una CLI, es posible que no pueda imaginar esto: trabajo fuera de línea
– Fredrik
12 de agosto de 2018 a las 12:41
Jaja, estoy bastante familiarizado con el trabajo fuera de línea. Incluso puedo manejar cosas como un hacha o un martillo. 🙂 Pero en serio, los servicios y las aplicaciones que descartan una posible GUI o al menos la plutón, y obligan a los mortales a escribir mal en una CLI están a cargo de nerds que solo quieren sentirse duros, de la vieja escuela y especiales por no utilizar la memoria visual. Esta es mi opinión personal, ya que tengo cosas que hacer, vida que vivir. 🙂
– marko-36
12 de agosto de 2018 a las 12:50
¿Por qué aprender git cuando hay aplicaciones GUI para Git?
– dar un toque
12 de agosto de 2018 a las 12:56
No descarte las interfaces de línea de comandos sin más. Hay buenas razones por las que muchos desarrolladores fuertes, incluso los jóvenes, eligen usarlos en 2018. Por lo general, es mejor abordar cosas desconocidas con una mente abierta; desafortunadamente, parece que estás haciendo exactamente lo contrario. (Como nota al margen, Git se creó en 2005. Es una herramienta bastante moderna, a pesar de su interfaz). (Como otro nota al margen, Vim y editores relacionados no necesito que presiones
i
incluso para que ellos respondan. Su otro modo, el modo de comando, es donde ocurre gran parte de la magia. Es solo que no estás escribiendo en un búfer).– Chris
12 de agosto de 2018 a las 16:01
@kostix La pregunta está bien, creo, menos la llama CLI (que se eliminó). También pensé en votar para cerrar al principio, pero compañeros de trabajo que son nuevos en git me han hecho esta pregunta muchas veces. Sería bueno para mí simplemente señalarles esto en el futuro, ya que aquí hay 3 buenas respuestas.
–Matt Messersmith
13 de agosto de 2018 a las 14:57