2013-01-31 89 views
9

我的臨時區域發生了變化,還有一些還沒有暫存(某些文件在暫存區域內外都有變化)。 我想反轉暫存區域的內容以及未暫存的更改。爲了做到這一點,是否存在一個快捷方式,而不需要執行更復雜的操作,如本地側枝提交,差異或存儲[等]?謝謝。Git反轉臨時區域

+8

的可能重複[?什麼是交換的最短途徑演出和Git中不分階段的變化(http://stackoverflow.com/questions/3573410/what-is-最短路到交換分階段和非分段更改在git) –

+0

哇,感謝您的鏈接。不一樣的搜索條件,但同樣的問題,的確如此。 – moala

回答

0

這是我用來解決這個問題。

第一個git reset它將刪除所有文件從'staging'到''文件沒有提交'提交'。這是兩個「分期」和文件「沒有上演提交的文件」,則會保留最近當前在更改「文件沒有上演犯」

然後

git add /path/to/file你所需要的特定文件要添加到分期

不完全是一條捷徑,但它能夠完成

反向地工作,你git reset後,你可以git checkout /path/to/file對於目前「沒有上演承諾」你不要的文件」你想添加到分期。這將從「不上演犯」

然後運行git add .這將增加在「未上演承諾」到「升級」的所有文件刪除特定的文件 - 無論是你的情況更容易

+0

實際上,我最好不要手動做,因爲上演和非上演之間的界限是相當複雜的:即使在一些文件裏面,一些行是上演的,其他的非上演的。 – moala

+0

你看起來我最近編輯關於文件既上演也不上演? –

+0

你是什麼意思「你可以結賬你不想要的文件[...]」?這對我來說是相當隱晦的...... – moala

3

很可能有不止一個辦法做到這一點,但我想我會採取這種方式 - 我們目前無法預建的快捷方式,但你可以很容易地編寫自己的腳本來遵循這個過程:

  1. 生成爲您目前正在使用的東西打補丁rking目錄,但不是在你的指數,但(東西你沒有爲做git add

    git diff-files -p > /tmp/unstaged.patch 
    
  2. 生成了你已經添加到索引與目前HEAD

    git diff-index --cached -p HEAD > /tmp/staged.patch 
    
  3. 補丁

    重置您的索引和工作目錄到你HEAD

    git reset --hard HEAD 
    
  4. 一pply你不分階段的補丁都工作目錄和索引,導致這些變化正在上演

    git apply --index /tmp/unstaged.patch 
    
  5. 應用您上演補丁只針對你的工作目錄

    git apply /tmp/staged.patch 
    

根據具體更改的性質,步驟4和/或5可能會導致您需要手動解決的一些合併衝突,但我不確定是否有完全避免這種可能性的乾淨方法。

你也許可以使用git stash完成步驟1和4,而不是上面的命令,但我不知道,真的會得到你任何東西

此外,您還可以查看該手冊頁git diff-*git apply首先查看是否有其他選項可能對您有用。

4

這裏是我如何做到這一點:

  1. 提交索引到一個臨時提交
  2. 提交,其餘爲二次臨時提交
  3. 開關的提交的順序與互動變基
  4. 混合復位
  5. 軟復位

它可以被輸入了手動蠻快的,特別是如果你使用Vim的提交信息:

git commit -m tmp1 
git add . # optionally with `git add -u` if there are deletions 
git commit -m tmp2 
git rebase -i HEAD~2 # swap the order of the commits; `ddp:wq` in vi 
git reset HEAD~1 
git reset HEAD~1 --soft 
+0

我喜歡這個,除了手動編輯交換提交。 http://stackoverflow.com/questions/16203562/programmatically-swap-last-two-commits –

+0

好點。但對我個人而言,這個問題並不足以寫出一個快捷方式腳本,並記住它的名稱和工作原理。互動式重新裝訂我幾乎每天都會這樣做,它對我來說非常直觀和高效。 – gtd

3

基於GTD的答案和腳本的能力反轉提交,這是我現在使用什麼:

[alias]                                                    
    swaplast = !git tag _invert && git reset --hard HEAD~2 && git cherry-pick _invert _invert~1 && git tag -d _invert                        
    invertindex = !git commit -m tmp1 && git add -A && git commit -m tmp2 && git swaplast && git reset HEAD~1 && git reset HEAD~1 --soft 

發佈在我的博客在這裏:http://blog.ericwoodruff.me/2013/12/inverting-git-index.html

+2

我已經做了一些調查和測試,這是我的未經授權的文檔:'swaplast'交換最後一次和最後一次提交。注意:它會在不通知的情況下丟棄未經改動的更改。 'invertindex'交換暫存和未暫存的更改,包括未跟蹤的文件。 – Melebius

+0

如果由於某種原因失敗了,你可能需要運行'git cherry-pick --abort',然後才能再次運行'git invertindex'。 – u01jmg3