Git 如何先用力拉后用力推

Git 如何先用力拉后用力推,git,git-push,git-pull,Git,Git Push,Git Pull,每次我想要推送我的提交(git commit-m“message”,git push origin),我都会进行一次拉送(git pull origin)。 有没有办法让git在执行推之前做一个拉?(在同一分支上)当且仅当command1成功(基本上返回0)时,如果希望运行command2,请使用夹在它们之间的双符号运行: command1 && command2 并且,要在command1成功后运行command2,或者即使失败了,也要使用分号运行: command1 ;

每次我想要推送我的提交(
git commit-m“message”
git push origin
),我都会进行一次拉送(
git pull origin
)。

有没有办法让git在执行推之前做一个拉?(在同一分支上)

当且仅当
command1
成功(基本上返回0)时,如果希望运行
command2
,请使用夹在它们之间的双符号运行:

command1 && command2 
并且,要在
command1
成功后运行
command2
,或者即使失败了,也要使用分号
运行

command1 ; command2 

前一个用于
git pull和&git push
,后一个用于
git pull;日期

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

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.

一般来说,您可以:

如果拉动失败,将不会执行推送


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

git-pullpush
(无扩展,可执行,存储在
$PATH
引用的文件夹中)

这将是一个常规的bash脚本(它甚至可以在Windows上工作,因为它将由msysbash解释)


您可以使用
git pullpush
(类似别名)

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

实现这一点的显式方法是首先获取和重基,最后推送

git fetch
git rebase origin/master
git push
第二种方法是调用git pull时传递
--rebase

git pull --rebase
最后,通过设置配置,可以使这成为
git pull
的默认行为

git config --global pull.rebase true

Git实现这一点的方法是使用

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

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


显然,这只是一个非常幼稚的例子,但我希望你能理解。此目录中已存在示例。如果仍不清楚,请进行注释。

您可以为此创建别名-在git配置文件中添加[alias]mypush=!git pull-r&&git push但是我不知道您是否应该这样做doesairexist&&dobreating这个问题的上下文是什么?您是想在脚本中运行此操作,还是只是在命令行中以交互方式保存键入内容?@merlin2011如果我在不执行pull的情况下提交更改,并且我的队友提交了一些更改,我的代码将自动合并到他的代码中。我不想这样。谢谢@saurav sahu。这是有帮助的,但我想知道如果我忘记了
而只是运行了
,是否有任何方法可以提醒我或自动运行
。目前它将其他人的最后一次提交与我的提交合并。好的..我知道..我会检查并让您知道…顺便说一句,据我所知,像
git push
这样的空格分隔别名不受支持。
git push
如果您没有使用最新的遥控器,它将被拒绝。推一下。推的动作询问是否可以推。如果有一个你不能推的原因,你就不能推。然后你就可以担心该怎么做了。是的,git push会拒绝代码,但当我在拒绝后退出时,我的队友commit将合并到我的commit中。谢谢VonC。这很好,但不是我想要的。必须有一个步骤来提交并为我的提交设置消息。@alivarhoudi这就是为什么我在脚本中提到“您可以添加任何您想要的命令”。这包括您需要的任何步骤。为什么这是一个“非常简单的示例”,即除了您的答案中的内容之外,这个钩子脚本还应该做什么?这是一个非常古老的答案,但我想我的意思是可以添加特定于案例的逻辑-条件、标志等。这个示例很简单,在现实世界中可能会更复杂(但不一定要这样)
git fetch
git rebase origin/master
git push
git pull --rebase
git config --global pull.rebase true
#!/bin/bash

echo "pulling ..."
git pull