2013-04-21 220 views
23

Stack Overflow存在多個問題,解決了從文件中暫存和僅提交部分的問題。但是,我無法讓它工作。Git:提交部分更改

比方說,我們要實現一個虛擬的數學課在PHP(語言無所謂)與像一些基本的方法:addsubtractmultiplydivide.

讓我們從類定義開始:

<?php 
    class Math { 
    } 
?> 

現在:

$ git add math.php 
$ git commit -m "Create Math class." 

在下一步中,我們同時實現addsubtract四種方法:

<?php 
    class Math { 
     public function add($a, $b) { 
      return $a + $b; 
     } 

     public function subtract($a, $b) { 
      return $a - $b; 
     } 
    } 
?> 

但現在我們要提交add的執行情況,並在不同的提交的subtract方法。

這可能嗎?

我試過

$ git add -p

下出現:

enter image description here

我很想拆分大塊成更小帥哥,讓我按s,下面出現:

enter image description here

看來,git並沒有把它分成小塊。

讓我們現在嘗試手動編輯當前的大塊。所以我按:e

我的默認文本編輯器(崇高文本)打開了,在這裏我可以編輯大塊:

enter image description here

我嘗試只是刪除線8,9,10,11 - 因爲我想階段只有add功能。 我保存,關閉編輯器,但混帳說:

Your edited hunk does not apply. Edit again (saying "no" discards!) [y/n]?

我真正的新git add -p和互動升級,所以也許這件事情我做錯了,或者根本就不可能我想要什麼,真的希望一些更有經驗的git用戶有一些說明也許對我來說也是一個解決方案。

謝謝!

+1

您是否在嘗試學習這種做法的「git方式」?就我個人而言,我不打擾這些細節。我只是刪除一個函數,提交它,將其添加回來,並提交。 – TheBuzzSaw 2013-04-21 18:26:17

+0

是的,這正是我在上一個項目中所做的。也許這是更簡單的方法。不過,我很想用git來做,然後決定選擇哪種方式。 – 2013-04-21 18:27:34

+0

[只提交Git中文件的一部分]的可能的重複(http://stackoverflow.com/questions/1085162/commit-only-part-of-a-file-in-git) – 7ochem 2015-04-03 08:31:21

回答

15

您正在做我以前所做的工作,我甚至在UNIX計算機上重新創建了整個實驗,並且其工作方式與預期一致。

我懷疑你的編輯器在保存時會改變diff hunk中的行尾。

+1

我回來了。我將所有編輯器設置爲使用unix行結束符,並且所有內容都按預期工作。 – 2013-04-22 20:25:59

12

這並不覺得自己是絕對的「混帳的方式」做這個,因爲混帳喜歡命令行,但這裏是我做的:

Git自帶了git gui捆綁 - 你可以只運行啓動該命令。在那裏你可以選擇未分類的文件,標記你要提交的行並點擊「提交階段行」。如果您希望它更像是一個命令行工具,那麼可以運行git gui citool,這會導致在您提交時ui會關閉。

Partial staging with git gui

注意,該工具正確使用Git集成。你不需要在這個UI中做出承諾。您可以將相關行放在上面,關閉它,也可以再做一些git add,然後通過命令行進行提交。

一般來說,我喜歡git comand界面,即使我不一定是shell粉絲,我只是在一段時間後才喜歡它。我嘗試了多個GUI,並將它們全部扔掉,因爲它們無法與git命令行界面競爭。但對於git add -p我肯定會說這是GUI的一項任務。通過git gui進行部分提交更容易。複雜的歷史瀏覽也一樣。 gitk(也隨git一起發佈)比git log --graph -p做得更好(只要你確實需要了解樹並且不太瞭解歷史的狀態)。

注意:但你似乎仍在做一切正確 - 我嘗試了你所做的並且必須同意本傑克遜。這應該肯定有效。你的編輯必須搞砸了。

最後說明:您似乎在使用git命令行與標準窗口cmd終端。我強烈建議切換到mintty。下載msys版本,將其放入您的Program Files\Git\bin目錄並使用mintty -運行它(創建快捷方式)。這會讓你獲得相同的外殼,但更好的一切(尤其是更好的調整大小和複製&粘貼)。

+0

'git add -p'是一種傳統的git方式。我一直使用它,並從來沒有任何問題。它可能只是編輯器,似乎並沒有添加git所期望的正確的行結尾。順便說一句,在Windows上使用'git gui'你應該使用cygwin或者msys。 – Tuxdude 2013-04-21 23:49:20

+0

我知道'git add -p'可以工作,並且應該爲OP正在努力實現的目標而工作。我的觀點是,如果能夠正確地滾動文件並在無需切換到編輯器的情況下播放單行文件,則可以輕鬆放置文件的某些部分。如果你在Windows上使用git,它總是使用cygwin或msys - 由於其shell腳本,git不能在windows上本地運行。 – Chronial 2013-04-22 00:52:54

+0

感謝您的詳細評論。我也試過git gui,但同樣的錯誤出現了。 Ben Jackson和你指出的結局是解決問題的關鍵。現在,git gui也能按預期工作。 – 2013-04-22 20:28:19