2010-01-19 144 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