Cómo forzar la atracción antes de empujar

Cada vez que deseo enviar mis commits ( git commit -m "message" , git push origin <branch> ), hago un pull ( git pull origin <branch> ).
¿Hay alguna manera de hacer que Git tire un poco antes de realizar mi impulso? (en la misma twig)

La forma de Git de hacer esto es personalizar los ganchos de Git .

En su caso, tendrá que ir al directory .git/hooks en su repository, y agregar un file llamado pre-push , que es un script de su elección, por ejemplo (bash en este ejemplo)

 #!/bin/bash echo "pulling ..." git pull 

Se llamará a este script cuando hagas git push y antes del push real.

Obviamente, esta es solo una muestra muy ingenua, pero espero que entiendas la idea. Ya hay muestras en este directory. Comente si algo aún no está claro.

Cuando desee que command2 ejecute si y solo si command1 tiene éxito ( básicamente devuelve 0 ), ejecútelo usando el símbolo de signo doble && , intercalado entre ellos:

 command1 && command2 

Y, para ejecutar command2 después de que command1 tenga éxito o incluso si falla , ejecútelo con punto ; coma ; :

 command1 ; command2 

He usado el anterior para git pull && git push y luego uno para git pull ; date git pull ; date

En realidad, no necesita tirar antes de presionar: si hay confirmaciones en el lado remoto que no tiene localmente, la inserción de git fallará con el post de post:

 Pushing to git@yourserver:<user>/<repo>.git To git@yourserver:<user>/<repo>.git ! [rejected] master -> master (fetch first) error: failed to push some refs to 'https://github.com/BigMeanCat/CMDA' hint: Updates were rejected because the remote contains work that you do hint: not have locally. This is usually caused by another repository pushing hint: to the same ref. You may want to first integrate the remote changes hint: (eg, 'git pull ...') before pushing again. hint: See the 'Note about fast-forwards' in 'git push --help' for details. 

Si tiene control sobre el server remoto, puede establecerlo allí:

 git config --system receive.denyNonFastForwards true 

De forma más general, puede definir fácilmente un alias que combine ambos commands :

 git config alias.pullpush '!git pull && git push' 

Si la extracción falla, el empuje no se ejecutará.


Finalmente, puedes combinar cualquier secuencia de command en un script bash, llamado

 git-pullpush 

(sin extensión, ejecutable, almacenado en una carpeta referenceda por $PATH )

Sería un script bash regular (que funciona incluso en Windows, ya que será interpretado por msys bash)

 #!/bin/bash # you can add any command you want git pull && git push 

Y lo llamarías con git pullpush (como un alias)

En function de los comentarios de OP, parecen estar intentando evitar un compromiso de fusión entre sus confirmaciones recientes y las confirmaciones en el control remoto, que normalmente se genera mediante un git pull cuando los historiales locales y remotos han divergido.

La forma explícita de hacerlo es search primero y la rebase, y finalmente presionar.

 git fetch git rebase origin/master git push 

Una segunda forma de hacer esto es pasar --rebase al invocar git pull .

 git pull --rebase 

Finalmente, uno puede hacer que este sea el comportamiento pnetworkingeterminado de git pull configurando la configuration.

 git config --global pull.rebase true