情景:
(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。这是一个小组,我更喜欢自己处理所有合并提交。
答案 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
并且您的所有工作都回到原处,并且您已准备好了解您所做的工作以使其停止工作。
这不是魔术,但一旦你使用它,它几乎就像是作弊。