Git:当存在大量更改时,添加,提交或推送的特殊操作?

时间:2013-02-05 17:50:19

标签: java git github

git add理解是你基本上对你当地的git repo说“是的,我确定我想做出这些改变。”

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

git push理解是将您保存的(已提交的)更改传播到主存储库,因此其他开发人员(或者可能是CI版本)可以自行解决这些问题。< / p>

如果我到目前为止所说的任何内容都是错误的或有误导性的,请先纠正我。假设我的理解是正确的,我最初在我的Java项目中有一个看起来像这样的包:

com.myapp.server.servlets
    FizzServlet
    BuzzServlet

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

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
  6. 我是否必须在这里做任何特殊的命令魔法,因为我做了很多重构,或者我可以运行像git push *这样的东西将所有东西都推送到GitHub?在SVN Eclipse插件中,如果我重命名了一个包或源文件,然后尝试提交该更改,我会经常丢失该文件(本地)并且必须从本地历史记录中恢复。即使在那时,我也被烧得太多次,无法计算并失去了很多工作。我希望不要与Git获得相同的经验。

1 个答案:

答案 0 :(得分:2)

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

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

  1. 推送成功,在这种情况下一切都很顺利,远程状态反映了本地仓库的状态(为了强调这一点,请记住git提交由其SHA哈希标识 - 如果提交不同,那么将散列为))
  2. 推送被拒绝,因为不是快进。这种情况发生在其他人将您的上次提取/提取后的提交推送到您的遥控器上时,这相当于尝试在SVN中提交时令人讨厌且常见的冲突。但是,您当地的州不受此影响。您必须解决冲突(a)删除提交并接受远程状态(git reset用于此)或从远程获取和(b)合并您的本地更改,从而创建合并提交将指示您的历史的分歧和重新收敛,或者(c)重新定位到遥控器上,以产生线性历史。
  3. 冲突解决案例需要进一步研究,但所需的操作在Pro Git书中有详细描述(章节分支,合并,重新定位)。

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