git add, commit y push comandos en uno?

220

¿Hay alguna forma de usar estos tres comandos en uno?

git add .
git commit -a -m "commit" (do not need commit message either)
git push

A veces solo cambio una letra, relleno CSS o algo así. Aún así, tengo que escribir los tres comandos para impulsar los cambios. Hay muchos proyectos donde solo soy un empujador, por lo que este comando sería increíble.

Gediminas
fuente
10
¿Has intentado escribir un script de shell?
Paul
Hay muchos cambios en mi código, cuando está cambiando solo un relleno en css, o una letra, etc. Confirmar mensajes y todas estas cosas de comandos agrega mucho trabajo. No probé un script de shell. ¿Cómo se puede hacer? ¡Gracias!
Gediminas
2
"(tampoco es necesario enviar un mensaje de confirmación)" images.wikia.com/dragonball/images/a/a7/Facepalm_227785.jpg
Ajedi32
2
Si está haciendo una confirmación para cada instancia de un cambio, lo está haciendo mal. haga los comandos cuando su función haya finalizado o se haya solucionado el error (esto podría ser un solo cambio)
Marque el

Respuestas:

234

Partiendo de la respuesta de @ Gavin:

Hacer que lazygit sea una función en lugar de un alias le permite pasarle un argumento. He agregado lo siguiente a mi .bashrc (o .bash_profile si Mac):

function lazygit() {
    git add .
    git commit -a -m "$1"
    git push
}

Esto le permite proporcionar un mensaje de confirmación, como

lazygit "My commit msg"

Por supuesto, podría reforzar esto aún más aceptando aún más argumentos, como qué lugar remoto para empujar o qué rama.

btse
fuente
10
No es necesario reiniciar, solo haz "source .bashrc"
Sambit Tripathy
25
podría usar en $*lugar de $1guardar escribiendo las citas:lazygit My commit msg
Kai Carver
16
@KaiCarver Buen pensamiento, pero personalmente no me gusta. Evita el uso de múltiples argumentos, y también va en contra de la convención normal de una sola cadena arg con espacios entre comillas. Esto es una segunda naturaleza para mí en este momento (y supongo que muchos desarrolladores). Dejar las citas se siente sucio.
btse
66
lazygit, el mejor nombre de todos!
user1447414
44
@btse que soy una persona diplomática + es viernes. Aquí está la función usando la sugerencia de @KaiCarver: function dirtygit() { git add . git commit -a -m "$*" git push }
OnklMaps
84

Terminé agregando un alias a mi .gitconfigarchivo:

[alias]
    cmp = "!f() { git add -A && git commit -m \"$@\" && git push; }; f"

Uso: git cmp "Long commit message goes here"

Agrega todos los archivos, luego usa el comentario para el mensaje de confirmación y lo empuja hacia el origen.

Creo que es una mejor solución porque tienes control sobre el mensaje de confirmación.

El alias también se puede definir desde la línea de comandos, esto lo agrega a su .gitconfig:

git config --global alias.cmp '!f() { git add -A && git commit -m "$@" && git push; }; f'
locura
fuente
66
¡Eso es exactamente lo que he estado buscando! Funciona perfectamente, gracias! No pude encontrar una referencia de sintaxis completa o una lista detallada de comandos. ¿Qué hace !f() { ... }; fexactamente? Una explicación más detallada de esa línea mejoraría aún más la respuesta.
Dmitriy Gamolin
1
@DmitriyDemir Define la función f, luego la llama.
Oliver
Funciona muy bien Agregué git pullal inicio para reducir las fusiones.
Burhan
1
@ Oliver ¿Por qué está entre comillas? ¿Por qué hay un signo de exclamación? ¿La f al final llama a la función? ¿Qué es "$ @"?
Philip Rego
@PhilipRego Oliver equivocado: p
Oliver
53

Si bien estoy de acuerdo con Wayne Werner en sus dudas, esta es técnicamente una opción:

git config alias.acp '! git commit -a -m "commit" && git push'

Que define un alias que se ejecuta commity push. Úselo como git acp. Tenga en cuenta que tales alias de "shell" siempre se ejecutan desde la raíz de su repositorio git.

Otra opción podría ser escribir un gancho posterior a la confirmación que haga el empuje.

Ah, por cierto, de hecho se puede pasar argumentos a Shell alias. Si desea pasar un mensaje de confirmación personalizado, utilice:

git config alias.acp '! acp() { git commit -a -m "$1" && git push ; } ; acp'

(Por supuesto, ahora, tendrá que dar un mensaje de registro: git acp "My message goes here!")

Tilman Vogel
fuente
@wlz Acabo de probarlo y funciona bien. Tenga en cuenta que toda la cadena está entre comillas simples. gitagrega automáticamente los escapes (marcado con git config -e).
Tilman Vogel
Lo siento, tienes razón :). Edito directamente el archivo .gitconfig. El "ya ha escapado con \".
wlz
2
¿Por qué no es esta la respuesta aceptada? Hace lo que se le pidió. +1.
lucid_dreamer
1
En Windows, necesitaba escapar de las comillas dobles alrededor de $ 1 para que funcione desde PowerShell (usando ... \ "$ 1 \" ...)
DReimer
35

Creo que podría malinterpretar el flujo de trabajo para el que se diseñó git. (Para aclarar / corregir lo que quise decir en el comentario, no necesita el git add ., ya quecommit -a generalmente tiene el mismo propósito: agregar cualquier cambio que aún no se haya organizado, si los archivos ya se han agregado)

Por lo general, harás algo como esto:

# make some changes
$ git commit -a -m "Changed something"
# make some more changes
$ git commit -a -m "Changed something else"

lavar, enjuagar, repetir, hasta que haya terminado la función X, o esté en un punto de parada, o simplemente quiera que otras personas vean lo que ha hecho. Entonces lo haces

$ git push

Git no es SVN, pero parece que estás tratando de usarlo como tal. Puede encontrar algunos de los recursos al final del artículo aquí para ser de alguna utilidad.

Wayne Werner
fuente
66
+1 para la explicación sobre el flujo de trabajo. Sin embargo git add .y git commit -a no son lo mismo
Gabriele Petronella
55
Gracias por la explicación, pero GIT no colapsará si habrá un comando como este para aquellos que saben lo que están haciendo ...
Gediminas
44
@Lucas: los programadores experimentados le dirán que las personas que solicitan un comando de confirmación automática no saben lo que están haciendo. Hay una razón para el registro de código de 3 etapas (si está utilizando ramas de características, 4 etapas).
slebetman
1
@Slebetman: No lo expliqué correctamente. Con las aplicaciones de Facebook, cada cambio debe implementarse en el servidor en vivo, incluso para el desarrollo. Por lo tanto, hemos configurado ganchos de confirmación para hacer eso. Haces un cambio, lo comprometes y ves el cambio en tu aplicación. Con git, necesito agregar, etapa y luego presionarlo para ver un solo cambio. ¿No parece una exageración?
SenG
1
Sí, pero tampoco necesita comprometerse a probar su código. Debería escribir un código, probarlo, y luego confirmar y presionar. El uso legendario de los compromisos locales de git para proporcionar algún tipo de funcionalidad de "deshacer" de varios archivos se usa mucho más en la leyenda que en la realidad, en mi experiencia.
Joe Strout
35

Lo uso en mi .bash_profile

gitpush() {
    git add .
    git commit -m "$*"
    git push
}
alias gp=gitpush

Se ejecuta como

gp A really long commit message

No olvide ejecutar source ~/.bash_profiledespués de guardar el alias.

Rajender Joshi
fuente
1
Realmente me gusta esto. ... y por lo tanto lo he adoptado en mi propio ~ / .bash_profile;) gracias .. +1
AO_
28

Puede usar el script bash, establecer un alias para iniciar cualquier comando o grupo de comandos

git commit -am "your message" && git push 
vuhung3990
fuente
2
Si desea responder a esto, agregue más comentarios sobre cómo funciona. Las respuestas que son simplemente un volcado de código generalmente no son bien recibidas. Ver cómo responder .
Heretic Monkey
Creo que esta debería ser la respuesta correcta. Como responde a la pregunta de la manera más sucinta posible. ¡Simplemente escríbelo en la terminal y funciona! Si no desea agregar un alias, una alternativa sería simplemente crear un expansor textExpander y activarlo mediante un combo de teclas.
eonista
19

Establecer como un alias en bash:

$ alias lazygit="git add .; git commit -a -m '...'; git push;";

Llámalo:

$ lazygit

(Para que este alias sea permanente, deberá incluirlo en su .bashrc o .bash_profile)

Gavin
fuente
Necesitaría agregar ese alias a .bashrc o .bash_profile para hacerlo permanente
Gavin
Creo que esta página puede ayudar a explicar: serverfault.com/questions/3743/…
Gavin
17

La solución más simple sería:

git commit -a -m "commit" && git push

git add ya está contenido en un parámetro de commit, pero si lo desea, puede conectarlos a todos:

git add . && git commit -a -m "commit" && git push
michal.jakubeczy
fuente
10

En Linux / Mac, esta opción práctica también debería funcionar

git commit -am "IssueNumberIAmWorkingOn --hit Enter key
> A detail here --Enter
> Another detail here --Enter
> Third line here" && git push --last Enter and it will be there

Si está trabajando en una nueva sucursal creada localmente, cambie la git pushpieza congit push -u origin branch_name

Si desea editar su mensaje de confirmación en el editor del sistema, entonces

git commit -a && git push 

abrirá el editor y una vez que guarde el mensaje, también lo empujará.

mcvkr
fuente
8

Puedes probar gitu .

Por primera vez (el nodo js debe estar instalado):

npm install -g git-upload

Después de esto:

gitu COMMIT_MSG

Para emitir esos tres comandos a la vez.

Lo bueno es que no tiene que preocuparse cuando reinstala su sistema o cuando desea hacer esto en diferentes computadoras y no es necesario modificar ningún archivo. Esto también funciona en diferentes plataformas (no solo Linux y Mac, sino también Windows bajo el símbolo del sistema como cmdy powershell) solo que tiene que instalar npmy nodejs( gitpor supuesto).

Papas fritas
fuente
6

Si el archivo ya está siendo rastreado, entonces no necesita ejecutarlo git add, simplemente puede escribirgit commit -am 'your message'

Si no desea escribir un mensaje de confirmación, puede considerar hacer algo como

git commit --allow-empty-message -am ''

Peter Foti
fuente
4

Este resultado : intente esto: comando simple de script uno para git add, git commit y git push

Abra su CMD en Windows y pegue esta respuesta

git commit -m "your message" . && git push origin master

Este ejemplo, la captura de pantalla de mi foto: https://i.stack.imgur.com/2IZDe.jpg

Anang Hanafi
fuente
3

Como se menciona en esta respuesta, puede crear un alias git y asignarle un conjunto de comandos. En este caso, sería:

git config --global alias.add-com-push '!git add . && git commit -a -m "commit" && git push'

y úsalo con

git add-com-push
cristianzamar
fuente
1
Esto no agrega nada a ninguna de las respuestas anteriores.
BanksySan
Lo siento, tienes razón. Creo que no me di cuenta de que la respuesta de Tilman Vogel era la misma que la mía. ¿Debería eliminarla?
cristianzamar
3

Escriba un pequeño script llamado gitpush.sh con las siguientes líneas y agréguelo a su directorio ~.

echo $1
git add .
git commit -m "$1"
git push

Ahora agregue un alias en ~ / .bashrc como a continuación:

alias gitpush='~/gitpush'

Ahora desde cualquier repositorio de git simplemente escriba "mensaje" de gitpush.

Vaneet Kataria
fuente
2

Yo uso un archivo por lotes:

@ECHO OFF
SET /p comment=Comment:
git add *
git commit -a -m "%comment%"
git push
Márcio Souza Júnior
fuente
los problemas serían más fáciles si aceptaras en argumentos desde la línea de comandos. simplemente voy "MENSAJE lezygit", etc. ¡es genial!
John Hon
1

Hay algunos problemas con los scripts anteriores:

shift "elimina" el parámetro $ 1, de lo contrario, "push" lo leerá y "lo entenderá mal".

Mi consejo:

git config --global alias.acpp '! git add -A && branchatu = "$ (git symbolic-ref HEAD 2> / dev / null)" && branchatu = $ {branchatu ## refs / heads /} && git commit - m "$ 1" && shift && git pull -u origin $ branchatu && git push -u origin $ branchatu '

Rubens
fuente
1

Cuando desee un comportamiento similar a svn de git commit, use esto en sus alias git en su .gitconfig

commit = "!f() { git commit \"$@\" && git push; };f"

Rik van der Heijden
fuente
1

Si está utilizando concha de pescado (a partir de la respuesta de btse):

Guarde este archivo dentro de '~ / .config / fish / functions' como 'quickgit.fish'. Cree el directorio si no existe. '--git-dir = $ PWD / .git' Asegura que ejecutamos los comandos git contra el proyecto git donde llamamos a la función

function quickgit # This is the function name and command we call
    git --git-dir=$PWD/.git add . # Stage all unstaged files
    git --git-dir=$PWD/.git commit -a -m $argv # Commit files with the given argument as the commit message
    git --git-dir=$PWD/.git push # Push to remote
end

Reinicie el terminal, navegue hasta el proyecto, realice cambios, y ahora puede llamar a 'quickgit "mensaje de ejemplo"'. Los cambios se agregarán, confirmarán y enviarán :).

También se puede encontrar como un Gist aquí: https://gist.github.com/Abushawish/3440a6087c212bd67ce1e93f8d283a69

Abushawish
fuente
1

Ya hay muchas buenas soluciones, pero aquí hay una solución que me parece más elegante por la forma en que quiero trabajar:

Puse un script en mi camino llamado "git-put" que contiene:

#!/bin/bash
git commit "$@" && git push -u

Eso me permite correr:

git put -am "mi mensaje de confirmación"

..para agregar todos los archivos, confirmarlos y enviarlos.

(También agregué el "-u" porque me gusta hacer esto de todos modos, aunque no esté relacionado con este problema. Asegura que la rama ascendente siempre esté configurada para extraer).

Me gusta este enfoque porque también permite usar "git put" sin agregar todos los archivos (omita el "-a"), o con cualquier otra opción que quiera pasar para confirmar. Además, "poner" es un breve resumen de "push" y "commit"

skiggety
fuente
1

Si usa VSCode, puede descargar esta extensión que le permitirá hacerlo en un atajo de teclado simple.

Alfredo
fuente
1

Si estás usando una Mac:

  1. Inicie Terminal Type "cd ~ /" para ir a su carpeta de inicio

  2. Escriba "touch .bash_profile" para crear su nuevo archivo.

  3. Edite .bash_profile con su editor favorito (o simplemente escriba "open -e .bash_profile" para abrirlo en TextEdit).

  4. Copie y pegue lo siguiente en el archivo:

function lazygit() {
    git add .
    git commit -a -m "$1"
    git push
}

Después de esto, reinicie su terminal y simplemente agregue, confirme y presione un comando fácil, por ejemplo:

lazygit "This is my commit message"
AdilOoze
fuente
1

Para los usuarios de MAC VSC, la mejor configuración es:

1) presione 'shift + cmd + P' y escriba:

Shell Command: install 'code' command in PATH

Presione ENTRAR (esto instalará el comando de código para acceder fácilmente al bash_profile)

2) ahora puede ejecutar: code ~/.bash_profilepara abrir el bash_profile vacío

3) ingrese una nueva función allí:

function lazygit() {
    git add .
    git commit -m "$*"
    git push
}

4) ahora reinicie VSC

5) realice un cambio, guárdelo y escriba lazygit messagepara ejecutar los tres comandos simultáneamente

Agrush
fuente
1

Para los usuarios de macOS:

  1. Abra su Terminal o iTerm2 u otra terminal que use.

  2. Mover a su carpeta de perfil de usuario con el comando ~/. Es una carpeta predeterminada para el .bash_profilearchivo:

Ejemplo de carpeta de usuario

  1. Escriba nano .bash_profileEste comando abrirá el .bash_profiledocumento (o lo creará si aún no existe) en el editor de texto más fácil de usar para terminal - nano.

  2. Ahora puede hacer un simple cambio en el archivo. Pegue estas líneas de código para cambiar su indicador de Terminal:

function lazygit() {
    git add .
    git commit -a -m "$1"
    git push
}

Edición de nano texto

  1. Ahora guarde sus cambios escribiendo ctrl + oy presione regresar para guardar. Luego salga nanoescribiendo ctrl + x.

  2. Ahora necesitamos activar sus cambios. Escriba source .bash_profile(o . ~/.bash_profile) y observe su cambio rápido.

  3. En iTerm2 Preferences/Profiles/General/Commandestablecido en Login Shelly Send text at startpara source ~/.bash_profile. Por lo tanto, no necesita hacerlo manualmente después de cada reinicio de macOS. Preferencias de iTerm 2

Credenciales: https://natelandau.com/my-mac-osx-bash_profile

rusakovic
fuente
0

Hice este script .sh para comando

#!/bin/sh
cd LOCALDIRECTORYNAME/  
git config --global user.email "YOURMAILADDRESS"
git config --global user.name "YOURUSERNAME"
git init
git status
git add -A && git commit -m "MASSAGEFORCOMMITS"
git push origin master
acs
fuente
0

Como la pregunta no especifica qué shell, aquí está la versión de eshell basada en las respuestas anteriores. Esto va en el archivo alias de eshell, que podría estar en ~ / .emacs.d / eshell / alias. Agregué la primera parte z https://github.com/rupa/z/ que te permite cd rápidamente a un directorio , para que esto se pueda ejecutar sin importar cuál sea su directorio actual.

alias census z cens; git add .; git commit -m "fast"; git push
בנימן הגלילי
fuente
0

Agregue ~/.bash_profilepara agregar, confirmar y presionar con un comando puesto:

function g() { git commit -a -m "$*"; git push; }

Uso:

g your commit message
g your commit message 'message'

No se necesitan comillas, aunque no puede utilizar punto y coma o paréntesis en los mensajes de confirmación (se permiten comillas simples). Si desea alguno de estos, simplemente ponga comillas dobles en su mensaje, por ejemplo:

g "your commit message; (message)"

Para crear un comentario en su mensaje, haga lo siguiente:

g "your commit message:
> your note"

También hay una función para agregar y confirmar de manera similar:

function c() { git add --all; git commit -m "$*"; }

Funciona exactamente de la misma manera que gfunciona y tiene las mismas restricciones. Solo ponlo en su clugar. P.ej

c your commit message

También puede agregar un alias para empujar al control remoto:

alias p='git push'

Uso:

p

Eso equivale a 2 letras, cy las pusas mientras trabajas con tu repositorio git. O puedes usarg en lugar para hacerlo todo con una sola letra.

Lista completa de alias y funciones: https://gist.github.com/matt360/0c5765d6f0579a5aa74641bc47ae50ac

Pastel de zanahoria
fuente
0

A partir de la lazygitrespuesta, la siguiente solución agrega una verificación de usuario para verificar los cambios antes de presionar. Revertirá los comandos si se cancela. Y todo eso sucederá si y solo si hay cambios en el repositorio local.

### SAFER LAZY GIT
function lazygit() {
  git add .
  if git commit -a -m "$1"; then
    read -r -p "Are you sure you want to push these changes? [y/N]} " response
    case "$response" in
      [yY][eE][sS]|[yY])
        git push
        ;;
      *)
        git reset HEAD~1 --soft
        echo "Reverted changes."
        ;;
    esac
  fi
}
Matthew Cordaro
fuente
0

Esto es perfecto para la agrupación de comandos.

Comandos de agrupamiento

{lista; } Colocar una lista de comandos entre llaves hace que la lista se ejecute en el contexto actual del shell. No se crea ninguna subshell. Se requiere la siguiente lista de punto y coma (o nueva línea).

legit(){ git add --all; git commit -m "$1"; git push origin master; }
legit 'your commit message here'
Gothburz
fuente
1
Esto no funcionará si el mensaje de confirmación tiene espacios intermedios
Rohit
0

Me gusta ejecutar lo siguiente:

git commit -am "message";git push
etoxina
fuente
Creo que ;debería reemplazarse con &&en su comando, ya que el último ejecutará el git pushcomando solo si no hay ningún error en los comandos anteriores.
Tom
0

Encontré que este yolo alias es increíble incluso enviar un comentario aleatorio al commit mientras soy flojo. Funciona muy bien fuera de la caja, así que lo hago git yoloy todos mis cambios se envían automáticamente.

jamescampbell
fuente