2016-04-19 168 views
4

我在一個功能分支提交一個單一的提交(作爲一個交互式基地的結果壓扁了我所有的提交)。從Git提交一些更改到一個單獨的提交

我已經決定,在推送到原點並創建一個拉取請求之前,我希望在該提交中採取一部分更改(在文件級別),並進行第二次提交,因爲它們'在邏輯上分開的問題。我怎樣才能做到這一點?

我想突破的改變從來沒有出現在它自己的提交中,它只是被捆綁到作爲我的特性分支上的工作的一部分的第一次提交中。

回答

4

移動從Git的一些變化提交到一個單獨提交

一言以蔽之:重置最後一次提交,使2個新提交

如果我理解正確的,你要保持最原始提交中的更改,並在第二次提交中放置更小的更改子集。 如果是這樣的話,那麼首先要軟復位的最後一次提交(感謝@hvd的提示):

git reset --soft HEAD^ 

這將刪除最後一次提交,但不改變,就好像從來沒有承諾發生了變化,並且所有變化都已上演。 此時,您想要在第一次提交時取消不想要的文件。 您可以通過目錄中的文件或目錄unstage文件,像這樣:

git reset -- path/to/file-or-dir 

現在你可以做的大多數變化的承諾(已經上演),再進行第二次提交的休息。

如果你有,你想要一些在第一次提交,並在第二其它變化承諾, 那麼你可以重新設置整個文件的修改,首先, 和舞臺選擇性地使用git add -p,這樣的更改文件:

git reset -- path/to/file 
git add -p path/to/file 

git add-p選項會讓你選擇帥哥上演。請注意,您可以分割大塊人物,並對舞臺上的線條進行精細控制。

第一次提交後,您可以繼續添加尚未處理的(未暫存的)更改。

+1

這是對的,但它缺少一個步驟:由於OP已經創建了一個提交,所以OP需要先刪除該提交。使用'git reset --soft @ ^'保持所有可用的階段性變化,或者像larsks的答案已經直接停止一樣。 – hvd

+0

感謝@ hvd,其實我首先誤解了主要意圖。在您評論(並重新閱讀)後,我更正了我的答案 – janos

3

首先,確保您的工作目錄沒有任何掛起的更改。如果您想要保留更改,請使用git stash

使用git reset移動存儲庫「倒退」到上一次提交:

$ git reset HEAD^ 

這不會對你的工作文件進行任何更改,但它的作用回庫狀態,以便任何部分是該提交現在將顯示爲已修改。

現在,使用git add添加您希望成爲單獨提交的一部分的更改。一旦進行了更改,請使用git commit進行更改。

現在,添加所有其他更改,然後提交這些更改。

現在,您已將先前的單個提交分爲兩個單獨的提交。