Git让我失去了所有进步?

时间:2015-03-16 02:56:54

标签: git

情景:

(master) git pull origin    //get most up to date remote
(master) git checkout -b mybranch
(mybranch) do some work without committing
(mybranch) git checkout master
(master) git pull origin    //to get updated remote to merge locally
    // pull aborted because I accidentally changed a line in (master)
    // before switching to (mybranch)
(master) git stash   //to disregard the accidental change
(master) git pull origin
    // pull successful
(master) git checkout mybranch
(mybranch) all my uncommited changes are gone???

mybranch现在正处于最后一次提交。 git add .添加了一些文件,但是文件系统上没有显示大约100行代码。

当你在没有提交的情况下结账不同的分支时,这真的会发生什么?或git stash存储所有未经修改的更改而不管分支?无论哪种方式,如果有人知道我的进展在哪里,我将永远感激。

更新

这是我的正常工作流程。我将解释我目前对每一步的理解。我没有正式教会如何在团队中使用git,所以我很高兴能够学习正确的工作流程。无论如何:

(master) git pull origin

我这样做是为了从github获取最新版本。

(master) git checkout -b mybranch

这将创建一个与master和在线仓库匹配的新分支。

(mybranch) git add .  //only if I added files
(mybranch) git commit -a

这是我做我所有的工作。当我得到正确的工作时,我承诺。我重复这个过程,直到我通过工作或到达一个主要的检查站

(mybranch) git checkout master

切换回主人

(master) git pull origin

如果自我第一次拉动以来没有人推送到在线仓库,我会收到一条消息,说明什么都没拉,否则它会将更新后的代码拉到掌握

(master) git merge mybranch

如果没有什么可以拉,这是一个FF合并,一切都很好。如果有更新,这里是我处理任何合并冲突的地方。

(master) git commit -a

如果存在合并冲突,我进行合并提交。只有在代码运行没有问题的所有冲突处理后才能执行此操作

(master) git push -u origin master

使用我的代码

更新存储库

就像我说我是git的新手,所以如果这个工作流程存在缺陷,请指出。此外,如果我的解释指出任何根本的误解,我也会感谢一些善意的教育。 Gracias给所有人。

P.S。这是一个小组,我更喜欢自己处理所有合并提交。

2 个答案:

答案 0 :(得分:5)

简短回答:您的更改存在于藏匿处。 git stash show -p,你会看到它们。 git stash pop将恢复它们。

答案很长:未提交的更改与分支无关。他们只是坐在磁盘上。或者,如果添加它们,则在暂存区域中也与分支无关。当您切换到主服务器时,磁盘上仍然存在未提交的更改。当您运行git stash时,这些更改被隐藏起来。

Git通常会保护您,而不是抨击未提交的更改。例如,如果它会影响您未提交更改的文件,它将不允许您签出另一个分支。

$ git st
On branch mybranch
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   blah

no changes added to commit (use "git add" and/or "git commit -a")
$ git checkout master
error: Your local changes to the following files would be overwritten by checkout:
    blah
Please, commit your changes or stash them before you can switch branches.
Aborting

答案 1 :(得分:2)

正如Schwern所说,git通常会试图保护您免于丢失数据。他还给出了关于如何恢复工作的正确答案。

根据您对问题的修改,以下是一些您可能会发现有助于从git中获取更多信息的内容。

将您的工作视为生活在3个地方。在工作目录中,在索引(staging)和存储库中。您运行的大多数git命令会在这三个位置之一(或之间)移动数据。 这并不是git在幕后所做的,它只是一个心理模型。

add命令不仅适用于新文件,它通常用于将您的工作从工作目录移动到索引(暂存区域)。当你commit时,git会获取当前暂存的内容,并从中创建一个提交。 -a你添加到提交命令只是告诉git&#34;不要担心索引,只需继续提交所有所有文件中的更改&#34; 。

暂存区域允许您选择进入提交的内容以及未获得的内容。您甚至不必分阶段整个文件,git add -p将允许您添加要提交的文件的一部分而不是整个文件。您的代码中是否包含调试语句以帮助您查找错误?不想成为提交的一部分?没问题,只需输入n即可。这允许您进行许多小的,频繁的提交。在他们自己的小提交上并不是很有趣,但是当你将它们与git bisect结合起来时,你可以很快缩小哪个提交导致了问题。如果提交很小(例如只更改了12行),您可能已经看到了问题!

stash并未与任何分支相关联,但是在git下面只创建一个提交来跟踪工作目录中的更改。因为藏匿物实际上是承诺,即使你不小心清除了藏匿物,你仍然没有丢失你的作品,you can recover it。 Stash可以帮助处理类似的情况,哦,不,我不小心开始在错误的分支上进行更改,我想将它们移动到正确的分支。&#34;没问题,藏匿,切换分支,解除挂起。您也可以使用藏匿作为快速&#34;我只是打破了它?&#34;测试。你一直在编辑东西,注意到有些东西被打破了。 git stash您的更改已消失。它还在破碎吗?如果是的话,可能不是你。如果不是,那么可能是你。 git stash pop并且您的所有工作都回到原处,并且您已准备好了解您所做的工作以使其停止工作。

这不是魔术,但一旦你使用它,它几乎就像是作弊。