是,這是可能的,並不難。簡短版本:git branch aBranch
創建新分支,git stash
以保存任何未提交的更改,git reset --hard 1
將master
重置爲您希望的提交,並且可選擇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 apply
或git stash pop
(apply
將使存儲記錄爲提交; 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
並開始再次處理它。
要牢記的一點是,您應該只在自己的私人存儲庫中編輯像這樣的分支歷史記錄,而不是其他人可以從中取得的公共記錄。如果你把它推到一個人們正在使用的公共倉庫中,那麼他們必須重新設定他們的所有變化,最好不要讓他們這樣做,除非絕對必要。
當我剛接觸git並進入類似的情況時,發現「gitk -all」對於查看提交和分支如何相關以及在GUI上執行一些操作都非常有幫助。 – ndim 2010-01-21 02:40:38
事實並非如此,我需要直觀地看到這些關係(愛gitk -all&tortoisegit以可視化的方式),但是我認爲第1,第2和第3個提交在分支上* aBranch *,I應該有*開始* *分支*做第一個提交(我希望我對某人有意義:)。現在我意識到這是多麼愚蠢。 – 2010-01-21 07:41:39