2010-01-19 122 views
1

来自Sourcesafe,我主要使用git作为主要的撤销功能。我倾向于 工作在主分支,代码愉快地离开了一段时间,在这里和那里的承诺,继续前进。(滥用?)git工作流程

当我编写我的大脑时,我有时希望现在放弃我正在做的 ,并开始处理另一个功能。我知道我现在可以开始另一个分支,但让我们假设我想继续努力的主人。我应该分支 我开始工作以前的功能,但这将需要我提前计划(在这我很可怕btw)。

我非常相信,我需要的是可以使用Git,但我不能让我的头周围 。作为一个图片讲述了一千多字,schematicly这是我想要做的是什么:

0--1 master 

0--1--2 master 

0--1--2--3 master 

0--1--2--3 aBranch  
    \-4 master 

0--1--2--3 aBranch  
    \-4--5 master 

编辑:我应该清理每个数字是一个承诺。

+0

当我刚接触git并进入类似的情况时,发现“gitk -all”对于查看提交和分支如何相关以及在GUI上执行一些操作都非常有帮助。 – ndim 2010-01-21 02:40:38

+0

事实并非如此,我需要直观地看到这些关系(爱gitk -all&tortoisegit以可视化的方式),但是我认为第1,第2和第3个提交在分支上* aBranch *,I应该有*开始* *分支*做第一个提交(我希望我对某人有意义:)。现在我意识到这是多么愚蠢。 – 2010-01-21 07:41:39

回答

6

是,这是可能的,并不难。简短版本:git branch aBranch创建新分支,git stash以保存任何未提交的更改,git reset --hard 1master重置为您希望的提交,并且可选择git stash pop将这些未提交的更改应用于当前工作副本(如果这些更改是为了新的master分支。

下面是一个完整的解释和图表,所以你可以按照。在下面,我会用*来告诉当前分支(HEAD)。

 
0--1 *master 

0--1--2 *master 

0--1--2--3 *master 

在当前创建新的分支aBranch指向承诺:

$ git branch aBranch 
 
0--1--2--3 *master aBranch 

如果你在工作副本尚未提交的任何更改,保存这些藏匿(这很重要,因为git reset --hard会清除所有未提交的变更):

$ git stash 
 
0--1--2--3 *master aBranch 
     \- 4 stash 

现在重置master回到您想要的版本。我使用下面的1作为占位符;你可能想,如果你想将其重置为上游master分支是在你做你的提交改版前使用SHA-1,或类似origin/master:如果你有未提交

$ git reset --hard 1 
 
0--1--2--3 aBranch 
    \  \- 4 stash 
    \-  *master 

您将工作副本中的变更隐藏起来,并且您希望将它们应用于master,则可以使用git stash applygit stash popapply将使存储记录为提交; pop将清理存储)。

$ git stash pop 
 
0--1--2--3 aBranch 
    \-  *master (with stashed changes now back in your working copy) 

现在你master,并重新提交1,完全按照你想要的。新的提交将转到master分支。

 
0--1--2--3 aBranch  
    \-4 *master 

0--1--2--3 aBranch  
    \-4--5 *master 

需要注意的是,如果你的工作副本是干净的(没有通过git status报道),你不需要git stash命令。如果您想要将更改应用于aBranch而不是master,则在下一次切换回aBranch时,您只需使用git stash pop并开始再次处理它。

要牢记的一点是,您应该只在自己的私人存储库中编辑像这样的分支历史记录,而不是其他人可以从中取得的公共记录。如果你把它推到一个人们正在使用的公共仓库中,那么他们必须重新设定他们的所有变化,最好不要让他们这样做,除非绝对必要。

+0

几个很好的答案可供选择。我冒昧地选择出现的第一个好答案。谢谢大家。 – 2010-01-19 20:04:53

+0

Brian,我意外地点击了接受的答案图标。我似乎无法撤消这个(也许git reset会有帮助)。对于那个很抱歉。 – 2010-01-19 20:07:13

+0

我已经编辑过它,所以如果你愿意,你应该可以改变你的投票(不过,它看起来像我已经这样做了)。现在我做了 – 2010-01-19 20:17:58

1

结账git-stash

编辑:如果您需要返回比HEAD更远的位置,则可以始终执行git checkout指定起始点以获取从master中的任何给定提交开始的新分支。

+1

这只是帮助一组甚至还没有提交的变化... – 2010-01-19 19:28:16

0

我对git知之甚少,而且每次我都必须做任何远程不重要的工作。我使用的水银,你想要什么是很容易的:

http://stevelosh.com/blog/2009/08/a-guide-to-branching-in-mercurial/#branching-anonymously

+0

+1甜蜜,特别是如果你知道我已经尝试过mercurial。我仍然介于git和mercurial之间,但链接描述的正是我所需要的......在git中:) – 2010-01-19 19:38:08

+1

这在git中也相当简单。根据'git help',你只需要'reset'和'branch',它们都在常用命令列表中。我不相信你与git的比较,你所链接的指南特别准确。使用git,你可以在任何时候分离你的HEAD。您现在处于“匿名”分支。当然,找到一个命名分支会比较困难,但reflog和'git fsck'会让你找到旧的分离头。 – 2010-01-19 19:40:27

3

当然,在这一点上:

0--1--2--3 master 

运行以下命令:

git branch aBranch 
git reset --hard 1 

git branch命令创建当前HEAD的一个分支(所以“master”和“a branch”指的是同一点,但“master”仍然是当前分支),并且git reset命令风一切恢复对当前分支(“主”)提交1.然后,你会在这里:

0--1--2--3 aBranch  
    \  master 

犯下“4”在这一点将给:

0--1--2--3 aBranch  
    \-4 master 
3

是的,这在git中很容易实现。

当你在master上提交了commit 3并且你意识到它应该在另一个分支上时,你可以根据当前位置创建一个新分支。

git branch aBranch 

然后你可以掌握风回犯1

git reset --hard <sha1_of_1> 

,并继续工作,制定承诺4和5,你通常会。他们从承诺1中分离出一个单独的分支aBranch

0

每次开始使用新功能时,都需要养成分支的习惯。

这就是说,你可以这样做:

0 - 1 - 2 - 3主 - 4 - 5 aBranch

你不想惹分支的周围历史 - 这会让你头痛不已。

总是在分支上开发,然后合并回主,并从那里提交给SourceSafe。

+0

你是正确的过失,但你知道的旧习惯...... – 2010-01-19 19:40:58

+0

这是不正确的。您不应该将更改推送到与分支历史记录混淆的公共存储库;但Git比其他系统更大的好处之一就是您可以在自己的本地存储库中轻松编辑分支历史记录,这使得在发送代码审查之前可以使补丁系列变得非常干净和易于理解。 – 2010-01-19 19:44:59