1

我的理解git add,您基本上是在对本地 git 存储库说“是的,我确定我想进行这些更改。”

我的理解git commit实际将更改保存到本地 HEAD 分支。此时它们实际上处于版本控制中,但仅对您的 git 实例是本地的。

我的理解git push将您保存的(提交的)更改传播到主存储库,以便其他开发人员(或者可能是 CI 构建)可以自己将它们拉下来。

如果到目前为止我所说的任何内容是错误的或具有误导性,请先纠正我。假设我的理解是正确的,我的 Java 项目中最初有一个包,如下所示:

com.myapp.server.servlets
    FizzServlet
    BuzzServlet

但后来我决定重构名称和一些东西,以及添加和删除一些新文件/包:

com.myapp.server.servlet
    FizzesServlet
    WidgetServlet
    com.myapp.server.servlet.impl
        FizzesServletImpl
        WidgetServletImpl

总的来说,我对这个目录进行了 5 处更改:

  1. 将名称从“ com.myapp.server.servlets”更改为“ com.myapp.server.servlet
  2. 将名称从“ FizzServlet”更改为“ FizzesServlet
  3. BuzzServlet彻底删了
  4. 添加了一个新的WidgetServlet
  5. 添加了一个com.myapp.server.servlet.impl包含两个子文件的新包

我是否必须在这里做任何特殊的命令魔术,因为我做了很多重构,或者我可以运行类似git push *将所有内容推送到 GitHub 的东西吗?在 SVN Eclipse 插件中,如果我重命名了一个包或源文件,然后尝试提交该更改,我通常会(本地)完全丢失该文件,并且必须从本地历史记录中恢复。即便如此,我还是被烧了太多次,数不清,失去了很多工作。我希望不会在 Git 上获得相同的体验。

4

1 回答 1

2

从你很小心推的方式来看,你的理解git push还不是很完整。push实际上只会将您的提交推送到您的遥控器——这意味着,它将复制您在上次推送后所做的提交中保存的确切状态。在 Git 中,每次提交都是存储库中所有文件的快照(它实际上记录了所有文件,而不仅仅是更改)。因此,您在提交后在本地看到的将正是推送时复制到远程的内容。

当您推动时,可能会发生以下两种情况之一:

  1. 推送成功,在这种情况下一切都很好,远程的状态反映了本地仓库的状态(为了强调这一点,请记住 git 提交由它们的 SHA 哈希标识——如果提交不同,哈希也会不同是)
  2. 推送被拒绝,因为它不是快进。当其他人在您上次拉/取后将提交推送到您的远程时,就会发生这种情况,这相当于尝试在 SVN 中提交时令人讨厌且经常担心的冲突。但是,您所在的州不受此影响。您将必须解决冲突(a)放弃您的提交并接受远程的状态(git reset用于此)或通过从远程获取和(b)合并您的本地更改,从而创建一个合并提交,这将表明您的历史的发散和重新收敛,或者(c)重新定位到远程,以产生线性历史。

解决冲突的案例需要更多的研究,但所需的操作在 Pro Git 书(章节分支、合并、变基)中有很好的描述。

只有当其他人可以推送到您的遥控器,或者您从另一台计算机推送到您的遥控器时,才会发生冲突。如果你在单用户单机场景下工作(至少目前是这样),推送的时候不会有冲突。

于 2013-02-05T18:02:25.570 回答