git pull 和 git reset --hard origin/<branch> 有什么区别?

What is the difference between git pull and git reset --hard origin/<branch>?

我发现后者比第一个快,所以我通常在 git fetch 之后每当我需要将我的本地分支与远程同步时这样做。如果有的话,有什么区别?

$ git pull                        
# takes the latest changes of origin/branch (exists both local & remote changes)

$ git reset --hard origin/branch  
# replace your local with origin's branch history (discard local changes)

示例: 比如说,我们在本地有两个提交 AB 并且远程有两个提交 AC.现在,如果您拉动,则您的本地包含 ABC,这与如果 reset 不同,则您的本地将包含 AC 不是 B

以下命令:

git fetch
git reset --hard origin/<branch>

将放弃所有本地更改。

其中:

git pull

与以下内容完全相同:

git fetch
git merge origin/<branch>

将尝试保留本地更改。

他们做的事情完全不同:

git pull: 将远程存储库中的更改合并到当前分支中。在其默认模式下,git pull 是 shorthand for git fetch 其次是 git merge FETCH_HEAD.

git reset --hard origin/branch Git 将:

  • 使您当前的分支(通常是 master)回到指向 <SOME-COMMIT>
  • 然后使工作树中的文件和索引 ("staging area") 与 <SOME-COMMIT> 中提交的版本相同。

注意: 始终值得注意的是 git reset --hard 是一个具有潜在危险的命令,因为它会丢弃所有未提交的更改。为了安全起见,在使用之前,您应该始终检查 git 状态的输出是否干净(即为空)。

您获取源代码更新的方式比您对性能的关注更重要。您需要将它们用于特定情况。我可以为您提供两个示例:

  • git reset --hard ... 可用于在生产中更新代码,如果 你经常发现自己修改生产代码 调试。这通常发生在项目的早期阶段 带着懒惰的想法部署。
  • git pull 是获得新提交最被接受的方式,它 通常是有道理的,你不会有巨大的本地变化。如果您的承诺期更长且有更多人参与 同一个分支,你最终可能会有直觉去做 git pull --rebase 或 先抓取再比较。

Git 可以明确说明您的开发风格的非常具体的需求,您可以在路上发现它们。一旦您对您的工作安全感到满意,性能就根本不应该受到关注。

这两个命令主要用于不同的情况。

git pull 拉取(获取并合并)从远程到本地的更改,尤其是其他推送到远程的提交,并且您希望这些提交应用到您的本地分支。

git reset --hard origin/branch 强制使您的本地分支指向 origin/branch 指向的提交。一般是针对你想放弃本地所做的修改,让本地分支保持远程状态的情况。