请问有人可以帮我解释一下git push和git push -f之间的区别吗?我不知道哪个是推送文件到Github上所推荐的方式。
git push -f
简写于 git push --force
。当你在推送代码时改变了当前仓库的历史记录,使得普通的 git push
被 Git 拒绝时,可以使用它强制推送。(编辑: 不过这也只是故事的一半。强制推送也可以让你覆盖别人在你上一次拉取之后推送的提交)。使用场景:
git push
将不起作用。你可以通过 git push --force
删除远程仓库中的提交 B 并推送 B'。如果只有你在使用该远程仓库(或者在提交 B' 之间没有其他人进行过拉取),那么这样做是可以的。但是,在 GitHub 上,这不是个好主意。
希望这能帮到你。
git help [command]
来获取每个Git命令的帮助。以下是有关推送以及特别是选项-f的摘录:
我制作了这个插图,以便更好地解释它:-f, --force
通常,该命令会拒绝更新不是用于覆盖它的本地引用的祖先的远程引用。另外,当使用--force-with-lease选项时,该命令会拒绝更新当前值与预期值不匹配的远程引用。
此标志禁用这些检查,并可能导致远程存储库丢失提交;请小心使用。
git push
将其推送(步骤2)。这是有效的,因为提交C具有提交B作为祖先。git push
将其推送(步骤3)。git push -f
来替换origin的历史记录为A-B-D。这很糟糕,因为它会搞乱Alice的历史记录,其中B的后继仍然是C。fetch
),然后在本地解决冲突(使用git merge
或git rebase
),然后推送结果(使用git push
)。-f
进行 常规 推送,但完全忽略了 -f
实际上是一个功能的原因。 - Mark Adelsbergergit push -f
命令会强制推送。具体来说:A -- B -- C <--(origin/master)
\
D -- E <--(master)
D
和E
被添加到master
”(或多或少)。A -- B -- C <--(origin/master)
\
BC -- D <--(master)
B
和C
合并成一个提交,然后添加了提交D
。默认情况下,git将拒绝尝试这样的推送;选项-f
(或--force
)告诉它尝试。请注意,服务器可能配置为拒绝强制推送。B
和C
),并且任何其他人拥有一个克隆版本,其中相应引用的历史记录包括已删除的提交,则他们将处于错误状态(如果他们采取“错误的操作”来恢复,则会撤销你的工作)。因此,重要的是与其他受影响的用户协调任何历史编辑。有关更多信息,请参见git rebase
文档中的“从上游rebase恢复”。
所以回答你的问题:以上是它们的不同之处,推荐的做法是通常只使用git push
,仅在(a)有特定原因需要时使用git push -f
,并且(b)得到受影响人员的同意。
git help push
命令会提示:"通常,该命令会拒绝更新一个不是本地引用的祖先的远程引用,以覆盖它。[...] 此标志禁用这些检查。" - Arnaud Denoyellegit push -f
命令会撤回你同事的提交并用你的提交替换整个历史记录。这种方式不应该被使用。 - Arnaud Denoyelle-f
选项,就会有一只小猫死去。不要使用它。没有例外。 - Andrejs Cainikovs-f
选项完全有其目的,与“撤回同事的提交”无关,是否使用它(即是否值得成本)是团队政策问题。 - Mark Adelsberger