2016-07-27 56 views
4

有沒有辦法來默默創造新的commit是創建晃來晃去承諾,而檢查出

  • 沒有連接到當前分支
  • 沒有簽出事後

A-B-C-D-E-F-G # master 
     \ \ 
     X Y 

其中XY創建時沒有t他的用戶注意到了。

的理由:

我寫了很多的探索性實驗代碼,並希望自動提交當前狀態運行實驗時。這些中間狀態不應該在我的Git歷史中結束,我不希望在所有時間運行之前(或者偶爾會忘記它)在整個運行過程中承擔精神開銷。

這個想法是有很多懸而未決的提交,不會推送到我的遠程,並可能被垃圾回收刪除。每個單獨的提交SHA1將被註釋到我的實驗結果中,使我能夠追溯哪些更改對結果有什麼影響。

+0

'git commit-tree'看起來像你想要的。您可以使用它創建與任何分支無關的提交,並且不會檢出。 –

+0

@RaymondChen這正是我想要回答的一個補充:首先完成所有變更。你想發佈它作爲答案嗎? – hvd

+0

@ hvd好吧,我寫了它。 –

回答

2

如果你

$ git commit -m 'Foo' 
[my_branch b54ed59] Foo 
$ git reset --hard HEAD^ 

你會發現,提交您重置並沒有消失,但依然存在,所以,你可以做

git checkout b54ed59 

,並取回該承諾,晃來晃去關閉你的分支。

標記提交將允許您永遠保留它。

+0

但硬重置將刪除所有更改。我希望工作空間保持不變。 –

+0

然後做一個軟重置? – jwg

0

保持你的歷史:

我去給你一個答案來完成自己的目標,但在不同的心態比你所要求的。雖然你可以通過在reflog中浮動提交,但我們在這裏沒有這樣做。

您將對一個分支進行一系列提交。您關心每個提交,因爲您需要從測試中引用它們。在你有一個工作分支後,你想和遠程分享你的工作,我們將改變我們的歷史。

假設:

你有一個origin/mastermasterdev分支

如何:

我們需要兩套代碼。如果你不想一次又一次地做這個,我們可以把它們作爲函數存儲在.bashrc中。每次運行代碼時,都會調用自動提交併運行代碼的函數。

1)提交每次運行時代碼:

git add --all 
git commit --allow-empty-message -m '' 
<command for running code> 

現在你將有SHA1每次運行,你將有你的開發(本地)的歷史。爲了顯示每個提交做了什麼,您可以執行git log --patch來顯示每個提交的行更改。

接下來,我們將在與遠程分享之前更改歷史記錄。我們會將所有更改壓縮到一個提交中。

2)遠程共享您的工作:

git checkout master 
git merge --squash dev 
git commit -m "<commit message for dev history>" 
#fetch & push to origin/master after dealing with any remote issues. 

這需要所有從每一個微小的補丁提交,並且它們都合併到一個補丁,有一個SHA1和一個消息。

此時,您可以用新的歷史記錄git branch -f dev強制更新您的開發分支,然後垃圾收集可以接受您已經壓扁的提交。

結論(你與他們做後)

這實現你處理許多提交不會推到遠程,並且可以通過垃圾回收被刪除目標。每個單獨的提交SHA1都可以註釋到實驗結果中,使您可以追溯哪些更改會對您每次運行代碼時的結果產生什麼影響。它還允許您對本地更改進行版本控制。

2

您可以使用git commit-tree命令創建一個懸掛提交。

首先,階段您要提交的文件,例如通過執行git add file

接下來,從索引創建一棵樹。

git write-tree 

這將打印一個散列到標準輸出。這是你想要提交的樹的散列。假設散列是12345678

現在您已經爲索引創建了一棵樹,您可以取消這些更改,以免錯誤地將它們提交爲「真實」。 (git reset HEAD file。)

最後,從該樹創建一個提交。

git commit-tree 12345678 -p HEAD -m "Description" 

這會創建一個新的提交併將其散列輸出到標準輸出。提交的父項爲HEAD,評論爲Description

作爲提醒,這是一個懸而未決的提交,因此將受到GC。

+1

請注意,懸掛提交通常在大約14天內是安全的,因爲這是默認的'gc.pruneExpire'時間(請參閱git config文檔)。 – torek

1

比我在另一個答案中建議的git commit-tree更簡單的方法是創建一個分離的頭並進行處理。

git checkout HEAD^{commit} 

這使您保持相同的提交,但您現在從分支中分離,因此任何未來的提交都不會更新分支。提交您的更改,然後再檢查原始分支,讓您的提交懸而未決。

+0

你也可以使用'git checkout --detach ',儘管這需要知道當前的分支名稱。 (你可以用'git symbolic-ref --short HEAD'找到它。) – torek