关于git:如何在推动之前强制拉动

How to force pull before push

每次我想要推动我的承诺(git commit -m"message"git push origin 时,我都会拉动(git pull origin )。在我推之前有没有办法让吉特拉?(在同一个分支上)


要做到这一点,Git的方法是使用定制的Git钩子。

在您的情况下,您需要转到存储库中的.git/hooks目录,并添加一个名为pre-push的文件,这是您选择的脚本,例如(本例中的bash)。

1
2
3
4
#!/bin/bash

echo"pulling ..."
git pull

当您执行git push时,在实际推送之前将调用此脚本。

显然,这只是一个非常幼稚的样本,但我希望你能理解这个想法。此目录中已存在示例。如果有任何不清楚的地方,请发表评论。


根据OP的评论,他们似乎试图避免最近的提交和远程提交之间的合并提交,这通常是在本地和远程历史发生分歧时由git pull生成的。

要做到这一点,显式的方法是首先获取和重新平衡,然后最后推送。

1
2
3
git fetch
git rebase origin/master
git push

第二种方法是在调用git pull时传递--rebase

1
git pull --rebase

最后,通过设置配置,可以将其设置为git pull的默认行为。

1
git config --global pull.rebase true


推送之前实际上不需要拉:如果远程端没有提交,则git推送将失败,并显示消息:

1
2
3
4
5
6
7
8
9
10
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: (e.g., 'git pull ...') before pushing again.

hint: See the 'Note about fast-forwards' in 'git push --help' for details.

如果您可以控制远程服务器,则可以在其中设置:

1
git config --system receive.denyNonFastForwards true

更一般地说,您可以结合两个命令轻松定义别名:

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

如果拉不动,推不动。

最后,可以在bash脚本中组合任何命令序列,命名为

1
git-pullpush

(没有扩展名,可执行,存储在$PATH引用的文件夹中)

它将是一个常规的bash脚本(即使在Windows上也可以工作,因为它将由msys bash解释)

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

你可以用git pullpush来称呼它(就像别名一样)


当您希望command2运行时,如果且仅当command1成功(基本上返回0),则使用双号和符号&&运行,中间夹着:

1
command1 && command2

command1成功后运行command2,或者即使失败,也使用分号;运行:

1
command1 ; command2

我以前用过一个用于git pull && git push,后来用过一个用于git pull ; date