git commit
用于存储您所做的更改。那么
git push
用于什么呢?git commit
用于存储您所做的更改。git push
用于什么呢?基本上,git commit
“记录仓库中的更改”,而git push
“更新远程引用及其关联对象”。因此,第一个命令用于操作本地仓库,而后者用于与远程仓库交互。
以下是来自Oliver Steele的精美图片,它解释了Git模型和相应的命令:
阅读更多关于git push
和git pull
的信息,请参考我首先提到的文章:推送和拉取。
git push
工作的一个解决方案。实际上,git push
的目标可以是任何 Git 存储库。它可以位于本地硬盘驱动器中的另一个目录(例如git remote add clone ~/proj/clone.git; git push clone master
或git push ~/proj/clone.git master
),也可以是您自己托管的 Git 存储库。 - Santacommit(提交):将更改添加到本地仓库
push(推送):将最近的提交(commit)传输到远程服务器
简而言之,Git commit 将您的更改放入本地存储库,而 git push 将您的更改发送到远程位置。
git push
会上传实际更新的文件还是一些特殊的“差异”文件? - multigoodversegit push
用于将您在本地仓库中完成的提交添加到远程仓库中。与git pull
一起使用,它使人们可以进行协作。
提交(Commit):对一个代码库进行的快照、变更集、版本记录、历史记录或“另存为”。Git 代码库是一系列提交(Commits)的组合。
本地(Local)代码库:存储在您计算机上的代码库。
远程(Remote)代码库:存储在服务器 (GitHub) 上的代码库。
git commit
: 将新的提交(最后一次提交 + 暂存修改)添加到本地代码库中。(提交存储在文件夹 /.git
中。)
git push
,git pull
:将本地代码库与其关联的远程代码库同步。 push
- 应用来自本地代码库的更改到远程代码库中,pull
- 应用来自远程代码库的更改到本地代码库中。
git commit
命令将您的更改记录到本地代码库。
git push
命令将您的本地更改上传到远程代码库。
需要注意三件事:
工作目录 — 存放我们的代码文件的文件夹。
本地仓库 — 在我们的系统内。当我们第一次执行 commit 命令时, 会在与我们的 工作目录 相同的位置创建此 本地仓库。 检查 (.git) 文件是否创建。 之后每当我们提交变更,都会将这些变更存储到工作目录中的文件, 以便将其保存到本地仓库 (.git)。
远程仓库 — 位于我们的系统外,如 GitHub 等服务器,可以位于世界上的任何地方。 当我们执行 push 命令时,来自本地仓库的代码将被存储在此远程仓库中。
我想补充以下几点:
在我们使用 git push
命令将本地分支上的提交推送到远程存储库之前,你不能进行推送。
git push
命令需要两个参数:
一个是远程名称,例如,origin
;
另一个是分支名称,例如,master
。
例如:
git push <REMOTENAME> <BRANCHNAME>
git push origin master
我使用Git已经多年了,但是奇怪的是,无论在这里还是在线上,似乎没有人能够简单地解释Git的push
、pull
、commit
或pull requests
是如何工作的。因此,下面是一个简单的解释,希望能更清楚地解释事情。这对我很有帮助!
Git工作原理的简单总结
在Git中,你总是先在本地计算机上创建代码,然后将代码保存到本地计算机上的Git的“本地存储库”(repo)中。当你完成时,你可以将你的修改上传到Git的共享“远程存储库”,以便他人可以访问你的代码更改。你还可以从“远程存储库”下载更改到你的“本地存储库”,以便你的代码与其他开发者的更改保持最新。然后你再次开始这个过程。
通过这种方式,Git允许你与他人远程共享本地项目代码,并在出现问题需要重做错误代码时保存这些代码更改的版本。这就是Git工作的简单解释和它的使用周期。
更多Git细节
第一步总是在本地计算机上编写代码,忽略Git,Git不会以任何方式参与保存或测试代码。 当你在电脑上保存本地代码时,默认情况下不会将代码保存到Git中,你需要进行第二步,称为“提交(commit)”。(尚未提交的已保存代码称为“staged”代码,顺便说一句)。
commit
是在“Git世界”中保存本地代码更改的操作,这让人们感到困惑。但是当我看到“commit”这个词时,我认为它是一个“Git Save”。这是额外的一步,因为你已经保存了一次代码更改,现在必须将其作为提交再次保存到Git系统中,否则它们将不成为你的本地Git存储库系统的一部分。“提交”可能是一些人认为Git设计不好的原因之一。它只是不直观。
push
操作。该操作会将你的本地仓库变更(仅限于提交)上传到远程仓库以便更新。此时,它会完全覆盖远程仓库中的所有内容,使得两者处于同步状态,也就是说两者之间的代码完全相同。可以将其视为“远程Git保存”。它会将本地计算机上的代码覆盖远程仓库上的代码。一开始我对此感到困惑。难道这不会删除其他开发人员在远程上所做的更改吗?如果远程与你的更改存在冲突,或者在本地仓库中需要首先拥有远程没有的更改怎么办?一开始我很困惑,因为没有人能够在线解释它是否与“合并”,“提交”,“拉取请求”等相同。事实证明,只有在一个条件下,该命令才能正常工作。否则,会阻止你的推送并失败!push
视为与本地库相同副本的“私有远程写入”操作。不过我们知道,很多开发人员会提交更改到远程副本,就像你一样使用push
,对吗?因此,在这种设计下,推送将失败,并且每个人的本地库与远程库始终不同步。pull
或“rebase”(更新本地仓库以匹配远程仓库)。如果你的推送被阻止并且随后执行pull
,它将复制远程代码并将其代码更改合并到你的本地副本中。一旦同步,你仍然可以使用push
将提交推送上去,因为在执行拉取或合并后,它们应该仍然存在。pull request
(请参见下文)比push
更有用的原因,因为前者强制要求代码所有者或管理员首先手动解决远程复制品上的重大代码更改一旦通过“pull”将本地副本同步到远程副本,您现在可以执行“push”,将您的提交或更改发送回远程副本,并安全地覆盖它们,因为您已经将您的更改与其他开发人员所做的更改合并在一起。
在“push”使用本地副本的提交或更改覆盖远程副本之后,远程副本与本地副本完全匹配。由于它们都匹配,只要没有其他开发人员像您一样更改了远程内容,你就可以再次将本地的任何额外提交或保存推送到远程,而无需进行拉取操作,Git在推送时始终会向您发出警告,如果有这种情况发生的话。您无法弄糟它。您可以执行“强制”推送、“变基”和其他技巧,但那不重要。但是,只要其他开发人员推送了他们的更改,您就会再次失去同步并且必须先进行一次拉取操作然后才能再次推送。
这种提交-拉取-推送的流程是Git开发中真正的节奏,没有人告诉您这一点,并假定您已经理解了它。大多数人都不知道它。它只是不直观或逻辑。
当然,你可以“强制”推送并覆盖所有东西。但在你尝试之前,该系统会向你发出警报。当一个新人添加或更改远程内容时,使用这种拉取和推送的系统就会失败。这就是导致推送和拉取警告以及故障的原因,直到每个人再次与远程同步为止。完成后,开发人员便有权将更改推送到远程,因为他们的代码再次与远程匹配。但是,在有很多更改或分支和代码合并要去远程存储库时,最好使用Git的“pull request”命令。
最后,值得注意的是,使用Git进行开发的人几乎总是被鼓励在对软件进行更改之前先创建一个新的本地和远程存储库分支。在这种情况下,“push”和“pull”就有了完美的意义,因为几乎总是由单个开发人员在软件的隔离分支上进行代码更改,从不与其他开发人员的更改冲突。这就解释了为什么一个开发人员通常会在自己的分支上工作,在这种情况下,“push”和“pull”可以完美地工作,可以快速推送/拉取更改,永远不会引起代码冲突,并允许一个开发人员将其最终本地更改副本存储在远程存储库分支中,稍后使用下面描述的“pull request”系统合并到主分支中。
奇怪的Pull请求
Git谜题的最后一部分。从远程存储库的角度来看,pull request是一个“pull”,将本地仓库代码拉取到它里面。但它是一个“请求”,最初并不会实际拉取或更改任何内容,也不会推送或合并任何代码。它只是您从本地仓库发送给远程仓库的请求,要求审查代码,如果他们批准,则将您的代码拉取到他们的远程副本中。pull requests
比推送更有效。 Push
和在仅有一个或两个开发人员正在处理和共享的孤立小分支方面的效果更好。在本地和远程存储库之间拉取和推送代码比将复杂的远程存储库更改的大量分支合并到远程存储库的主分支中要容易得多。使用“push”更新您在本地和远程都控制的小分支。
使用“pull request”让远程存储库人员将您的较小的分支合并到远程服务器上的较大分支中。
我喜欢把pull requests
看作是一个主推送(Master Push),而将push
视为本地推送(Local Push)。我希望Git的开发者们能够为这些过程取一个更合乎逻辑、更易于理解的名称。现在这样的命名方式完全不直观!pull request
也是一种添加代码安全层的方式,它在将大量代码堆栈合并到关键顶级远程分支或项目分支时首先要求管理员或团队成员的许可。因此,它会要求团队成员先批准本地Repo代码的大量更改和提交,然后再将它们拉入重要的远程Repo分支。