使用 IntelliJ 中的 Commit 工具視窗,您可以進行部分 git 提交,這意味著您只能提交一些有更改的檔案,甚至可以提交更改檔案中的某些特定塊的更改。我熟悉 git 的互動式添加和修補功能,但這些命令會將更改添加到索引,之后發出提交將提交整個索引,而不僅僅是補丁的結果。然而,IntelliJ 似乎可以以某種方式完成補丁,但也只提交選定的更改,忽略 git 索引中可能存在的其他更改,我很想知道哪組 git CL 命令可以產生等效的行為. 也許像存盤索引,取消存盤選定的檔案,執行補丁,提交,然后取消存盤的其余部分?有沒有更簡單的方法來實作這一點?
uj5u.com熱心網友回復:
每個 Git 提交都是所有檔案(加上元資料)的完整快照。這意味著對于 IntelliJ 進行 Git 提交,它必須創建一個完整的快照——所以它必須做同樣的事情git add -p。
但是,除了 Git 分配給作業樹的標準索引之外,您還可以創建一個臨時索引。請注意,git worktree add實際上為該作業樹添加了一個作業樹和一個新索引。添加的作業樹還有一個私有的,以及一些用于二分等的每個作業樹的參考;細節有點復雜。但總的來說,每棵作業樹都有一個獨特的索引——“the”索引——這是默認使用的索引。HEADgit commit
要創建臨時索引,您將:
創建一個臨時索引檔案(好吧,在大多數情況下是檔案名,但你可以將作業樹的“the”索引復制到這個檔案中;你不能有一個空檔案,因為 Git 拒絕它,所以如果你使用
mktempfrom shell 腳本,您必須洗掉該檔案,或將常規索引復制到它)。根據需要填充該臨時索引:設定環境變數以在使用和/或和/或等
GIT_INDEX_FILE時保存該檔案的名稱,以調整此臨時索引的內容。(請注意,您不能在這里操之過急:如果您未在 14 天內完成所有操作,則在此臨時索引中所做的更改可能會被 a 破壞。對于所有棘手的 Git 黑客操作通常都是如此,例如使用and 。)git resetgit restoregit addgit gcgit write-treegit commit-tree使用
git commit相同GIT_INDEX_FILE的設定,從臨時索引而不是真實索引進行新的提交。對真正的索引做一些事情:它現在與當前的提交嚴重不同步。
這里真正困難的部分是第 4 步。您必須弄清楚要做什么,如何做,以及在發生災難(例如磁盤驅動器的磁盤空間不足)時如何回滾。
git commit命令本身具有在操作期間在內部執行步驟 1 到 4--only的選項。例如,您可以運行:--includegit commit
git add file1.ext file2.ext
# edit file3, realize you want to commit *just* the file3 changes
git commit --only file3
# go back to working with files 1, 2, adn 3
這有時只涉及兩個索引檔案——真實的一個和一個臨時的——有時,為了處理上面提到的第 4 步的復雜情況,需要制作三個索引檔案。一旦git commit操作完成(有或沒有錯誤),兩個或三個索引檔案之一將成為此作業樹的“真實”索引檔案。
IntelliJ 在內部做了什么,我不知道,但上面涵蓋了必須完成的 Git 可見部分。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/465623.html
